pax_global_header00006660000000000000000000000064136146270130014515gustar00rootroot0000000000000052 comment=15ceddc2029a8c2c91a295711dba7e50efb95c74 rainloop-webmail-1.14.0/000077500000000000000000000000001361462701300150415ustar00rootroot00000000000000rainloop-webmail-1.14.0/.browserslistrc000066400000000000000000000000501361462701300201240ustar00rootroot00000000000000last 3 version > 1% ie >= 11 firefox esrrainloop-webmail-1.14.0/.cmds000066400000000000000000000005061361462701300157710ustar00rootroot00000000000000 # yarn yarn install yarn upgrade xxx@1.2.3 # transifex tx pull -a # dependencies yarn outdated yarn upgrade-interactive --exact --latest # webpack webpack --color --watch # gpg --import x gpg --detach-sign --armor --openpgp -u 87DA4591 x for ff in `ls *.zip`; do gpg --detach-sign --armor --openpgp -u 87DA4591 $ff; done rainloop-webmail-1.14.0/.docker/000077500000000000000000000000001361462701300163665ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/mail/000077500000000000000000000000001361462701300173105ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/mail/setup.sh000077500000000000000000000102671361462701300210150ustar00rootroot00000000000000#! /bin/sh ## # Wrapper for various setup scripts included in the docker-mailserver # INFO=$(docker ps \ --no-trunc \ --format="{{.Image}}\t{{.Names}}\t{{.Command}}" | \ grep "/bin/sh -c 'supervisord -c /etc/supervisor/supervisord.conf'") IMAGE_NAME=$(echo $INFO | awk '{print $1}') CONTAINER_NAME=$(echo $INFO | awk '{print $2}') CONFIG_PATH="$(pwd)/config" if [ -z "$IMAGE_NAME" ]; then IMAGE_NAME=tvial/docker-mailserver:latest fi _inspect() { if _docker_image_exists "$IMAGE_NAME"; then echo "Image: $IMAGE_NAME" else echo "Image: '$IMAGE_NAME' can’t be found." fi if [ -n "$CONTAINER_NAME" ]; then echo "Container: $CONTAINER_NAME" else echo "Container: Not running, please start docker-mailserver." fi } _usage() { echo "Usage: $0 [-i IMAGE_NAME] [-c CONTAINER_NAME] [args] OPTIONS: -i IMAGE_NAME The name of the docker-mailserver image, by default 'tvial/docker-mailserver:latest'. -c CONTAINER_NAME The name of the running container. -p PATH config folder path (default: $(pwd)/config) SUBCOMMANDS: email: $0 email add [] $0 email update [] $0 email del $0 email restrict [] $0 email list alias: $0 alias add $0 alias del $0 alias list config: $0 config dkim $0 config ssl debug: $0 debug fetchmail $0 debug fail2ban [ ] $0 debug show-mail-logs $0 debug inspect $0 debug login " exit 1 } _docker_image_exists() { if docker history -q "$1" >/dev/null 2>&1; then return 0 else return 1 fi } _docker_image() { if ! _docker_image_exists "$IMAGE_NAME"; then echo "Image '$IMAGE_NAME' not found. Pulling ..." docker pull "$IMAGE_NAME" fi docker run \ --rm \ -v "$CONFIG_PATH":/tmp/docker-mailserver \ -ti "$IMAGE_NAME" $@ } _docker_container() { if [ -n "$CONTAINER_NAME" ]; then docker exec -ti "$CONTAINER_NAME" $@ else echo "The docker-mailserver is not running!" exit 1 fi } while getopts ":c:i:p:" OPT; do case $OPT in c) CONTAINER_NAME="$OPTARG" ;; i) IMAGE_NAME="$OPTARG" ;; p) case "$OPTARG" in /*) CONFIG_PATH="$OPTARG" ;; *) CONFIG_PATH="$(pwd)/$OPTARG" ;; esac if [ ! -d "$CONFIG_PATH" ]; then echo "Directory doesn't exist" _usage exit 1 fi ;; \?) echo "Invalid option: -$OPTARG" >&2 ;; esac done shift $((OPTIND-1)) case $1 in email) shift case $1 in add) shift _docker_image addmailuser $@ ;; update) shift _docker_image updatemailuser $@ ;; del) shift _docker_image delmailuser $@ ;; restrict) shift _docker_container restrict-access $@ ;; list) _docker_image listmailuser ;; *) _usage ;; esac ;; alias) shift case $1 in add) shift _docker_image addalias $@ ;; del) shift _docker_image delalias $@ ;; list) shift _docker_image listalias $@ ;; *) _usage ;; esac ;; config) shift case $1 in dkim) _docker_image generate-dkim-config ;; ssl) _docker_image generate-ssl-certificate ;; *) _usage ;; esac ;; debug) shift case $1 in fetchmail) _docker_image debug-fetchmail ;; fail2ban) shift _docker_container fail2ban $@ ;; show-mail-logs) _docker_container cat /var/log/mail/mail.log ;; inspect) _inspect ;; login) shift if [ -z "$1" ]; then _docker_container /bin/bash else _docker_container /bin/bash -c "$@" fi ;; *) _usage ;; esac ;; *) _usage ;; esac rainloop-webmail-1.14.0/.docker/nginx/000077500000000000000000000000001361462701300175115ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/nginx/default.conf000066400000000000000000000031731361462701300220100ustar00rootroot00000000000000 server { listen 80 default; listen 443 ssl; server_name localhost _; root /var/www; index index.php index.html; autoindex on; charset utf-8; client_max_body_size 500m; ssl_certificate /etc/nginx/ssl/localhost.cert; ssl_certificate_key /etc/nginx/ssl/localhost.key; gzip on; gzip_disable "msie6"; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; gzip_vary on; access_log /var/log/nginx/default.access.log; error_log /var/log/nginx/default.error.log; location = /favicon.ico { access_log off; log_not_found off; } location ~* favicon\.(ico|png)$ { access_log off; log_not_found off; } location = /browserconfig.xml { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } location = /humans.txt { access_log off; log_not_found off; } location = /apple-touch-icon.png { access_log off; log_not_found off; } location = /apple-touch-icon-precomposed.png { access_log off; log_not_found off; } location ~ /\.ht { deny all; return 404; } location ~ /\.git { deny all; return 404; } location ~ /\.svn { deny all; return 404; } location ~* ^.+\.(?:jpe?g|gif|bmp|ico|png|css|js|swf)$ { expires 30d; access_log off; add_header Pragma public; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; } location ~ \.php(/|$) { include fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; fastcgi_pass php:9000; } } rainloop-webmail-1.14.0/.docker/nginx/ssl.sh000066400000000000000000000027621361462701300206550ustar00rootroot00000000000000#!/usr/bin/env bash SERVER_NAME=localhost SUBJECT="/C=RU/ST=RND/L=Taganrog/O=Umbrella Web/CN=${SERVER_NAME}" mkdir -p ./ssl if [ -f ./ssl/${SERVER_NAME}.cert ]; then rm -rf ./ssl/${SERVER_NAME}.cert fi if [ -f ./ssl/${SERVER_NAME}.key ]; then rm -rf ./ssl/${SERVER_NAME}.key fi # Generating ROOT pem files openssl req -x509 -new -nodes -newkey rsa:2048 -keyout ./ssl/server_rootCA.key -sha256 -days 1024 -out ./ssl/server_rootCA.pem -subj "${SUBJECT}" 2> /dev/null # Generating v3.ext file cat < ./ssl/v3.ext authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = ${SERVER_NAME} DNS.2 = www.${SERVER_NAME} EOF echo " - Generating SSL key file" openssl req -new -newkey rsa:2048 -sha256 -nodes -newkey rsa:2048 -keyout ./ssl/${SERVER_NAME}.key -subj "${SUBJECT}" -out ./ssl/server_rootCA.csr 2> /dev/null echo " - Generating SSL certificate file" openssl x509 -req -in ./ssl/server_rootCA.csr -CA ./ssl/server_rootCA.pem -CAkey ./ssl/server_rootCA.key -CAcreateserial -out ./ssl/${SERVER_NAME}.cert -days 3650 -sha256 -extfile ./ssl/v3.ext 2> /dev/null # echo " - Adding certificate into local keychain" # sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" ./ssl/server_rootCA.pem 2> /dev/null echo " - Runing garbage collector" rm -rf ./ssl/server_rootCA.csr ./ssl/server_rootCA.key ./ssl/server_rootCA.pem ./ssl/v3.ext ./.srl rainloop-webmail-1.14.0/.docker/nginx/ssl/000077500000000000000000000000001361462701300203125ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/nginx/ssl/.gitempty000066400000000000000000000000001361462701300221430ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/node/000077500000000000000000000000001361462701300173135ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/node/Dockerfile000066400000000000000000000001511361462701300213020ustar00rootroot00000000000000FROM node:10.16.0-alpine RUN apk add --no-cache git RUN yarn global add gulp CMD ["node", "--version"] rainloop-webmail-1.14.0/.docker/php/000077500000000000000000000000001361462701300171555ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/php/Dockerfile000066400000000000000000000017211361462701300211500ustar00rootroot00000000000000FROM php:7.3-fpm RUN apt-get update RUN apt-get install -y \ git unzip wget zip curl mlocate \ libmcrypt-dev libicu-dev libpcre3-dev libicu-dev \ build-essential chrpath libssl-dev \ libxft-dev libfreetype6 libfreetype6-dev \ libpng-dev libjpeg62-turbo-dev \ libfontconfig1 libfontconfig1-dev libzip-dev RUN pecl install mcrypt-1.0.2 && \ docker-php-ext-enable mcrypt RUN docker-php-ext-configure intl && \ docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \ docker-php-ext-install opcache pdo_mysql zip intl gd RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN curl --location --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar && chmod +x /usr/local/bin/phpunit RUN apt-get -y autoremove && apt-get clean RUN sed -i '/^;catch_workers_output/ccatch_workers_output = yes' '/usr/local/etc/php-fpm.d/www.conf' EXPOSE 9000 CMD ["php-fpm"] rainloop-webmail-1.14.0/.docker/php/rainloop.ini000066400000000000000000000002351361462701300215010ustar00rootroot00000000000000date.timezone = UTC upload_max_filesize = 1G post_max_size = 1G # log_errors = On # display_errors = On # error_reporting = E_ALL # error_log = /dev/stderr rainloop-webmail-1.14.0/.docker/tx/000077500000000000000000000000001361462701300170215ustar00rootroot00000000000000rainloop-webmail-1.14.0/.docker/tx/Dockerfile000066400000000000000000000001221361462701300210060ustar00rootroot00000000000000FROM python:3.6-alpine RUN pip install transifex-client CMD ["tx", "--version"] rainloop-webmail-1.14.0/.eslintignore000066400000000000000000000000531361462701300175420ustar00rootroot00000000000000*.* !/dev/**/*.js !/tasks/**/*.js !/*.jsrainloop-webmail-1.14.0/.eslintrc.js000066400000000000000000000012261361462701300173010ustar00rootroot00000000000000module.exports = { parser: 'babel-eslint', extends: ['eslint:recommended', 'plugin:prettier/recommended'], plugins: ['prettier'], parserOptions: { ecmaVersion: 6, sourceType: 'module' }, env: { node: true, commonjs: true, es6: true }, globals: { 'RL_COMMUNITY': true, 'RL_ES6': true }, // http://eslint.org/docs/rules/ rules: { // plugins 'prettier/prettier': 'error', 'no-console': 'error', 'max-len': [ 'error', 120, 2, { ignoreComments: true, ignoreUrls: true, ignoreTrailingComments: true, ignorePattern: '(^\\s*(const|let|var)\\s.+=\\s*require\\s*\\(|^import\\s.+\\sfrom\\s.+;$)' } ] } }; rainloop-webmail-1.14.0/.github/000077500000000000000000000000001361462701300164015ustar00rootroot00000000000000rainloop-webmail-1.14.0/.github/ISSUE_TEMPLATE.md000066400000000000000000000002171361462701300211060ustar00rootroot00000000000000 **RainLoop version, browser, OS:** **Expected behavior and actual behavior:** **Steps to reproduce the problem:** **Logs or screenshots:** rainloop-webmail-1.14.0/.gitignore000066400000000000000000000007211361462701300170310ustar00rootroot00000000000000/.idea /.vscode /api.php /error.log /nbproject /npm-debug.log /yarn-error.log /rainloop.sublime-project /rainloop.sublime-workspace /rainloop/v/0.0.0/static/* /rainloop/v/0.0.0/app/localization/moment/* !/rainloop/v/0.0.0/app/localization/moment/.gitempty /vendors/.* /node_modules /build/local /build/dist /build/tmp /build/docker /.docker/.cache /.docker/mail/config /.docker/nginx/ssl/* !/.docker/nginx/ssl/.gitempty /dist /data .DS_Store /MULTIPLY /include.php rainloop-webmail-1.14.0/.prettierignore000066400000000000000000000000511361462701300201000ustar00rootroot00000000000000*.* !/dev/**/*.js !/tasks/**/*.js !/*.js rainloop-webmail-1.14.0/.prettierrc000066400000000000000000000005621361462701300172300ustar00rootroot00000000000000{ "printWidth": 120, "semi": true, "singleQuote": true, "useTabs": true, "bracketSpacing": true, "trailingComma": "none", "arrowParens": "always", "endOfLine": "lf", "quoteProps": "preserve", "overrides": [ { "files": "*.js", "options": { "parser": "babel" } }, { "files": "*.jsx", "options": { "parser": "babel" } } ] } rainloop-webmail-1.14.0/.tx/000077500000000000000000000000001361462701300155525ustar00rootroot00000000000000rainloop-webmail-1.14.0/.tx/config000066400000000000000000000007011361462701300167400ustar00rootroot00000000000000[main] host = https://www.transifex.com minimum_perc = 60 type = YAML [rainloop-webmail.rainloop-webmail] file_filter = rainloop/v/0.0.0/app/localization/webmail/.yml source_file = rainloop/v/0.0.0/app/localization/webmail/_source.en.yml source_lang = en [rainloop-webmail.rainloop-admin] file_filter = rainloop/v/0.0.0/app/localization/admin/.yml source_file = rainloop/v/0.0.0/app/localization/admin/_source.en.yml source_lang = en rainloop-webmail-1.14.0/CODE_OF_CONDUCT.md000066400000000000000000000062341361462701300176450ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at support@rainloop.net. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ rainloop-webmail-1.14.0/CONTRIBUTING.md000066400000000000000000000017151361462701300172760ustar00rootroot00000000000000**Thanks for contributing to RainLoop Webmail!** 1. Fork the repo, do work in a feature branch. 2. Issue a pull request. --- **Getting started** 1. Install node.js - `https://nodejs.org/download/` 2. Install yarn - `https://yarnpkg.com/en/docs/install` 3. Install gulp - `npm install gulp -g` 4. Fork rainloop - `https://github.com/RainLoop/rainloop-webmail/issues/new#fork-destination-box` 5. Clone rainloop - `git clone git@github.com:USERNAME/rainloop-webmail.git rainloop` 6. `cd rainloop` 7. Install install all dependencies - `yarn install` 8. Run gulp - `gulp` --- **Debugging JavaScript** 1. Edit data/\_data_/\_default_/configs/application.ini 2. Set 'use_app_debug_js' (and optionally 'use_app_debug_css') to 'On' --- **Editing HTML Template Files** 1. Edit data/\_data_/\_default_/configs/application.ini 2. Set 'cache_system_data' to Off --- If you have any questions, open an issue or email support@rainloop.net. rainloop-webmail-1.14.0/LICENSE000066400000000000000000001033271361462701300160540ustar00rootroot00000000000000 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 .rainloop-webmail-1.14.0/Makefile000066400000000000000000000033531361462701300165050ustar00rootroot00000000000000#!make rebuild: _down docker-compose build --no-cache up: _up status _up: docker-compose up -d stop: _stop status _stop: docker-compose stop down: _down status _down: docker-compose down restart: _stop _up status status: @docker-compose ps tx: @docker-compose run --no-deps --rm tx tx pull -a -s -f -d console-node: @docker-compose run --no-deps --rm node sh console-tx: @docker-compose run --no-deps --rm tx sh console-php: @docker-compose exec php sh console: console-node logs: @docker-compose logs --tail=100 -f logs-db: @docker-compose logs --tail=100 -f db logs-php: @docker-compose logs --tail=100 -f php logs-node: @docker-compose logs --tail=100 -f node logs-nginx: @docker-compose logs --tail=100 -f nginx logs-mail: @docker-compose logs --tail=100 -f mail logs-tx: @docker-compose logs --tail=100 -f tx rl-lint: @docker-compose run --no-deps --rm node gulp lint rl-dev: @docker-compose run --no-deps --rm node npm run watch-js rl-compile: @docker-compose run --no-deps --rm node gulp build rl-compile-with-source: @docker-compose run --no-deps --rm node gulp build --source rl-watch-css: @docker-compose run --no-deps --rm node npm run watch-css rl-watch-js: @docker-compose run --no-deps --rm node npm run watch-js rl-build: @docker-compose run --no-deps --rm node gulp all rl-build-pro: @docker-compose run --no-deps --rm node gulp all --pro yarn-install: @docker-compose run --no-deps --rm node yarn install yarn-outdated: @docker-compose run --no-deps --rm node yarn outdated yarn-upgrade: @docker-compose run --no-deps --rm node yarn upgrade-interactive --exact --latest gpg: docker run -it --rm -w=/var/www \ -v $(shell pwd)/.docker/.cache/.gnupg:/root/.gnupg \ -v $(shell pwd):/var/www \ ubuntu:16.04 bash rainloop-webmail-1.14.0/README.md000066400000000000000000000017001361462701300163160ustar00rootroot00000000000000

RainLoop Webmail


Simple, modern & fast web-based email client.

Modest system requirements, decent performance, simple installation and upgrade, no database required - all these make RainLoop Webmail a perfect choice for your email solution.


For more information about the product, check [rainloop.net](http://www.rainloop.net/). Information about installing the product, check the [documentation page](http://www.rainloop.net/docs/installation/). ## License **RainLoop Webmail (Community edition)** is released under **GNU AFFERO GENERAL PUBLIC LICENSE Version 3 (AGPL)**. http://www.gnu.org/licenses/agpl-3.0.html Copyright (c) 2019 Rainloop Team rainloop-webmail-1.14.0/_MULTIPLY000066400000000000000000000001041361462701300163750ustar00rootroot00000000000000Name this file as "MULTIPLY" to enable multiple domain installation.rainloop-webmail-1.14.0/_include.php000066400000000000000000000006651361462701300173430ustar00rootroot00000000000000a@cÎżËLH)×`ĘçŘŁř! E+"B[–sźI#‹ĚR¬Y¤ó3‡YNŰÜö)¶MD„ö“KŚĄZsÉ~"ţ±R±™ßkúşlc¶Ai¶Á`Č6dło%sV±!0ąžĺ·ľÇh4 4ŹŤ™`ŕúJŃܶ–uCŻV4†XŔH¶2÷żh6Ć .ľ,´VÇ8Š&˝ő-ף }O\áËÎ’+W´J˙­ń©Ś|o5f¦rţ3qŤßEsł=€ňýÄ~ĺ`/Ńs˛€ýŽâőŞr?–)ŮWř|Ł8ěw´žŇŠ“ţ(‹¤ńŐ )#ÚX­Őú˙á*† `P,‰Ůzľ˝¸°ž8$XÇ ˝ë,Nß41f(–fBFľĎx˝Ť8-ÓYŔNť8˙/ś,Č6(óš×l|ŻOč Îë]Ä ™f˝‹¸yŘeT,pNż˛“¸Ä»Z €ëţG€‚XÚE\­ ŢUĘěk© Ŕâ®R&¶Ś5hă]ĹmO„P0‹ş‰[lŃ*ö ¶ŚPp ş‹[Ś›5hbËŰÎV @¸Ç¸Y%Ç–w@P@PćUĄ € TP”* €RpŽ…ěb‰\ŕ±t˘őđ3i-ŞáGóŮC¶Ůň|N»[ZŹľD5 7Űş+~T¤1¬d/§I¦a´ˇ[̶Íâťń§1-xśÍDä3ńĄĺć1‚eěgËŘŔ2zR9Ź ˛aCŘÂHzÓ T§7ąi×)ĺM†R…^ř˘É‰6 `4±´'ú8ÓŚ'Ež ŐnÍźĹF@5|ěŔ“ô˘ťé@U‚ŔFާ/ĎpĂ.Íť· §.řĐ{ .T˘1hI2‰á,ç%;DÍk ˘Ş) -źk,`ĂFĐ›z4¦5ŻĐ c#;y†˛ěĘü©,!ž$ćR‹˛Łxδg*Ýq§ËŃł„ÎôeSiĹ26Y˙ŰŠf˛•®t`qôf±č‰±‚AhŔ čy•<ˆ°™ÇiĹU;p•oÁŹţĽÇ>˘Ç`/nĎŮ,4ő¤Ä1—x>e,ĺélŽč ůžÝt˘)q$™v@aúDĎů€á Ţ&śh›dI:x“! çŐśiC»Đĺ.·ĽË!ţäx 6 ţ&‰śâ>eëŘ”kÖÖ.üMO'<™—g8óHâ #™I"ß٨#Je(+9Ĺ|Ë,ăÝ<Ďi üA{zóÖçůTĎŰl`23ŘÎIsĚ&G˝ y’#üČyKâßť3-mÓ č‰˘óďút:Ţtd8ĮٜóI`»9Ďq¶1‚ů,M´Ry™ů·ŢIJ€$6°‹kdŘ€řŚ9Bz2¸”ž9öŔŔŻlÎ÷ě"Ž|ÄnnX°.p˙śO"ëŮÍľ&…żî‘$¤1Ń>ü»{úd~ä2éüÍ÷üeć×s€÷ŘÉAâyšxNcnĆ׎0p–ź¸A:W9Á5 j#Š»÷_'ťßx±´¤6 Í– d3ÉŢë‚~ć7ôčąI ;ŮZ‚Iio‘Ä.âYŔÖłÍÂE»/Ěú…+Üä7–Q—ŽYP¤R8˘TŽŚ"šqL·úÜ®ĘÓőLćE’HbÍ`Q1ż—AS"©Is:±Ň‚bŻ~€ž=ěbÝéĎF“TŚłDŃňŇŠú„óPžIóŔ_…D°ŽAŚc tcŠÉĄ2‹iL!„ÖxŕŔ€bB]‚"ą^HK™Ďff3YŚĎw*Żč í´ žą”Ąµ]lĂż]î\Č!•žőt%Š´˘;óH´r5x ¨P™6ş}Đňp!óůL^¤6^tesčÉŰVtD©Lĺ)Ę"hŃ!Dď>‹ßĐ0¤ĐoÁn'’Í̤˝`Ą˛Ţ4Ö0hŞ›V´†Ęůä$Ű:GÓOQČif=óyšUĚĄ2ýčËÄBĆ”Ľs>3‰¦ íÂ- éűr”Su­P7SaÖöB.§'}đŁ mÁ¨":˘Tޤeq  c(GŻBÇ–Ż8ÎER,@P‚Â)‡´ şÚ.€XFÓ¦4fC‘çI‡™2*G|yś¶`š.•·Me4Ôa63™Ď˛"gS Ŕˇ.lŔbže4٧E\,o‹ AK5ÚâÇs|ÂYÎZřd°šćS Ź0. &Ȭă0§ p@ -lŮ­f:í‰b»ŠúŁA(ËXfM$ѬĺG2,J!SM+BčOZ|ńĆ‹účČwE‡PŤşDš­ť(Aź3•NŚbBčlr>.D˛–ă`«8Ď ŇĚ"ř“•ôĄ Őđ >á„ńň§-Čd3^Č '*§Üˇ*żc g@<«ů’ł\b˙żĚ]cĂ&ŠňÂ+č1pHFŇŹů̧9Źs´Î1ŚľLă.ŰúŠŘ{L+” Ň3$Ďé@­r ­çGř‰źřŚcĽĂň|¶űťŁa g«‰ „©ą–‰ú҆ŤěgĎÓ‘¸B"řŚiěă°Ů­†6°$™ÄˇB8źîyĚ˙đýü"8A IŕK~ĺF.g’ĆAęĐę0”ń´şc*ä=čĎ^%Á‘y…tD_s”Íćb6 ‹łîý˝rŚ$TÎÇÓţĆIöĚb¶p ˛¸Á%~a=hI<Ѣ!€~lĽËH×eĎăŠŕEortrŃ‚dŘí»Óů4ű—™÷Ď™ÎZVđŰ9Çoc3‰,Ąî„ŕ‹ Ą›ţ%@GŃ aôˇ=™[čéí@˝ň?ô 1gŘÄ"éČ\>#‰xúS-´ ‚ű=Â*#ńĄ>O˛ŽC,bu1ÇŰ]YJ÷;śĎ˝łŚ˙Ł5Lć°ítÍ9!K'ÇďŮöwúЉ†ÄqŚ­l*Ҹŕ)ĚĘë|[pśÁďLĄ/ň:ĎŃŻś¶ť9eAaÖŁhiĆ6v°“ŠeŹŽČ ęó[¶ śÉ2:đ(ž9-«Y<ßy•:„°…÷y›ËÜ,†Âx» §ÓÎçj‚á!z㎽9\ ~'†]¬!±Ę 퀞Ńw„ŢËń=ßršßąÂuR­ŚíŔ.üó$ž÷÷dą,ţŕz®’Â%R­ęě@6“‡w.çó÷}5˙-żĺD˘˙cJ=K(ź+{ ă÷űnţĽÝá:{ůK €8şP×t¶–вDʵĚ&=Ůśă ×­t˘W řĂ‚Ç;Ë`â™O34h¨Wâ§ŠţĘU˛Há,?qÉ*縔 €Îf+xβžáŚaŹăIm.•°ůoŀ뤑‰žLň­=¨Čł÷ĚČ?b1‘ĽÄ fN”Íś©ű«é\S=—ř‰Źóý?żŘ€PúŇň_†÷Ůl˘¸ŃŠš´¦·Mi|Ŕ/üĚ3Dç3ŞŽáípă|č—ď}4Ă/ú3ŤĽp‡]qFgH!™iĽ–_Ű:w†1śľl¸«mg ^čč@ OŰóąszăkÎq‰oŮBŇ]„@‹ćOKôţ€AĽĚf¶ńIžĎC/ś¨ĆHĆ3ĹfĎSżÎ‡ĽĆw\ ™©|§Ý>´ď„-xšAR]ęôŃYŇ1fŚŮ( ˙>Ń•ÉqŢH”úRýˇ@ńgŃZ €“¸‰Źu©- ŢÚrś‹č1ŚŁÁ`Č.ĺj0 FŃ`䟲j«„Jm˙ęâ#nâdŤśă„ÄSĘűI= ťóŃéăüČ_db ´‹‘,nđ _đŢ™I%TęůIyń´žúçxH*–­ă"ˇŇtÚ”Ť‰źßůxć‰ěŻôĄXłŹg%_ŢqţŤ˝/N•fęR¶ŽT”‡¬Ů˙oż:)+ľRIä*ˇŇHÂĂ;ö=ň©1ĄYÇ<5zdÇ>Žá&Ť$Ô/T$•ÄWʊΚýß4ń_©$5ť}z5’†ŇH”J#ičŐČ·‘s°Ô”Jâ+âbť@^Z ŞRKę8‡x5ô «Đ¸B“R¬Ť}ÂĽBťC¤ŽÔ’Ş >&ók­ ŕ6ť¸‹·řI T‘jRSjIP)×ZRSŞI ?ńwŃŹůo#pgq•˛â->â'$@KąHńń–˛â*ÎâP\ćĎý8‹‹¸‰»x§x‰—x‰w)Ô[żÜS<Ä]ÜÄEś‹ŻďçEpëMp'qťčÄĄ«Ntâ,NâhęůĹnţÜ´˘Ą&KÜ7ăߍ˘´«%J”(Q˘D‰%J”(Q˘D‰˝Č˙†ć‚I¸˙·IEND®B`‚rainloop-webmail-1.14.0/assets/apple-touch-icon.png000066400000000000000000000015001361462701300222140ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢtEXtSoftwareAdobe ImageReadyqÉe<âIDATxÚěšŃGALJ帧¸§#"zŠ8úzŠč5"zŠ8Ž#Ž#Žč©§#"""""â¸~ŁÖŢof·;ŰÎîΗß˵ýnľźŮŰýÍo†1''''''§"k˘ Ń'Ä%D9$źŃÖä8…(…ä(‰ëT9 ľĘbĽŞ·óüÂW˘ůsÂŔąůŽ&G[\fţ\“ă€hţŠŕ‰O<É|‡8đ¤g­NČ1qCôő˘ĐĚŮĎ\ugľčî€fÎÍŁNs3¬P¦ó3ż 1€ĺ‚Ę<Ă#˛ AgŔ˙áEaćąĆ!>üä;ü %óRłź~‚ŞĚmF¨Ćl5/5ń8Ě—Ř !Šy˙ó€eBó‘e „TĚŰ!UóiCđµKlóĄ A0nž6@HÄ<ó­=‹!4? ±@íú¤ÁôĚówb! Ż(…Ó„Äm/C_˘4 вě7ď_ >%€ë.&Ěü…ˇ±‘"qÔPôßZ1ĚËŘJ@Ó € ůî0ó]ĂpĐPô ęlpŔSdĬ§ř<ŞĆ Ţ‚$ůŠaóL_ľżW!®5&MCŕwÁ{°!âE¬ĂĚKm3|kę!đŮÄq Ľé^X»l ⛩7cxRrBő?Íűo?l7úF”©Q–Â&Ţ˙bŢo˘&ž ű+Yn†¤Ő%¶˘–v‹Ü„rFÍpE€`űćH,ňěO)Łć‡…0±Š5D°ÖX÷§E-˛ÖÉűîpO¶ĆŠ|>ŕPč"…?#TřSbîś &ž‰ “5±¦Çrđµ˙8!ǦfĽá:JȱĂ'E)g…•Ö™ţ\î!Ç–&ďŤrě'•Ăd‹ěďät?ÁY»%ÎÚ®&ĄdÇ^á:sĚÉÉÉÉÉÉÉ©¨ú`®ŇY.čüłIEND®B`‚rainloop-webmail-1.14.0/assets/browsers/000077500000000000000000000000001361462701300202115ustar00rootroot00000000000000rainloop-webmail-1.14.0/assets/browsers/chrome.gif000066400000000000000000000073331361462701300221630ustar00rootroot00000000000000GIF89aFC÷˙±˛±j’=›ĚődŤ=¨ÓöÁ9${§wČŚ’nĹßőÇpPMt9ÍĐŞ•0&poX¬S:ÇÇÉýřăV¨‡˘g÷č–˙űÁg§äůĺyI–ŰehhŽ’®ćµ™ĂD)Š˘w¸Űř‹†X®ĹeŢŁ&Ł·ŠůčŚđÎĘg¸ňŐ9uHşhJ´ČŻóÜfu–Uܢ|µęosŚ^‰>&‡ÔfŚX˙űĽŘyŻ."GGHđŃ!⪌ňŰr™˛hýýűóÝxݤUî̵ČV5éą°“äJPt\vCЍIËWJZ†?˛ĂŤU@’¨uĎßětš;÷čŁfŽHŰâŇôŰXă«—şěś˛˙ô¤by¸Gf±IUŹgNBŃĘq4G‰•«„ň×GS>¤ş{0Z4¨“oĄZ~E4ÇłHŇnc…×I›—ť„†€ĐěŇi%xĆ778yŤĹłĹ’‘¬g݉ůě˛\]\üď–yž<˝ĚŽ{šk6Ť×îÍ%(UĄűôÔR›Ţm‘WŇzQđĎîŰ‚r”bîóéęČ&ńÓ-W„@äÔ|¸¸ľ"=ŹťŻv˛¦aËe>?ĂłŁ]‡JČ×óņĎĐŃ>Ů‘ÄńéĆ&Ďsż/?c:a‰T¸–…ďĐ%\`•ďĎ! uN?úđĂôÜÚa:đ×osŹNÖáżPRRÂŔŔiŽ]°Ľ‡ŐÖŘyŠpëĎb´M¬Ŕ–°Żś<{Ĺś’ZŘ‘p°§rµ°bH×áĆ/¸Żq~€†Ź—‡ ·wŽŹ·Č‹µČ}Ő‚^U‚GëÍ#ńŇ%Ŕ/ ż/ đŃ%˙˙˙!ů˙,FC˙˙ H° A˛H<ѵI ‘‡Ÿyňc›Ž3jÜXp›.1ř(Ŕˇ¤I“# ŮôCÇ—0 ÖŇEd$E%qŢTÄӇϟ:‰ił(ĆZ›B˘,ŔŹ_?§M›¦ĽůÓ'N"ş\5Š”iJ¨O›Fă-¬Ó~Om*ŞŞČ­[_YŃŻž˘E{v/_żhGöTÄŹ‰¸˙4 Yŕ׏7 č »¬^˛gĎF Ő \Ä•µ@˛‚=XäŤJŮr_¨MŁ-ŰŹH-Đ5Ŕħ=ŮĂT6ßדŁffÝŹ¶˘Ăo-b2Ŕ5Ô";- 6¶÷Ë~cď˙ĺ čFĄCđ"š –6ř€ť9|Î’’1Gţ·_ô0ý1¬0€j¤ °fY>ě1Ă 7ˇŔqQî˙‡e„ŽzĂ„‘˘ł0,†“—4ę F jŔ!O.ąLáěk¸AŞXşÁý]ŰSOdt 6zč±…0‘Špâ•BŠŰ@"Éj°HPB˝řRm"`4`-¶‰Ž%đ^´b$‚~$sD‹  7' Ń-eř‚ĚťzÂ+ĎwŘ[B„ň˝Pˇ'ý®ňÄ5d_=4 ź+HEĽđÂĐHĺ «Ľ«†Tńń;Ľ`ĂÓ0ś1˛wä’Aµ=6H¦ýěAYřŃJ2[ܬ3Ď=űŔ< Ó€j¸Đ±:@Í`x×˙!ő˝UĂŃď„Ó@CeŰ>ĹA(5ŃŠŘe›˝3ĎřÜČ „ăĹ1AA†:-4cŢđbş»äŃ !SťKŞfŮ€á‡SÖ\x„J+­č‘Í’O^y_Đ@8ľČS¬8ă4»đ…3Ô—Ň‚ĬŢ:.ZĂź‰XaEěł×Î" L+źĐ‘ĎŔç ‚©0ŽqťcÂľ Ň‹O<îwń;[ OŔ#Č ŕ+Đ4^”† H#Đ‚]ř @ CÔĐ)T`|ŕĂ,HÁ caZe G=N±'ü#~6¦‘ řIm•…!/Lę /ňĐ‚z Ť HBn@ Ľp”@!Žá€8T ţ° ňč>fŽ©‡e|B˝HF#ł8żĘ}a’rč€5Č L. ž e¦9J8Łi¨ôa!jĐĘWúcţ§?ř`Y\˘G0ń†~" ůć#SxĚq$s™%P‰˙M¤qš˘¬ć5ť–Ęmv36§Bg/JЍřÄ'z‘ yĘ’ÄC&–y€1¶€“Ѩ(=@fS•dž+GĐo*4śł ĂŕˇlH´Ă$¦đ IŽÂ…C ޡ7^8ź Ą (ěâp| Ô°;^€ŕ|©Kc)K'´"­ŔFE7Ď´q‘ mCEŔşyň†8´ćGëPĐ9Ćc2pÂ5´şŐo‚S ż k#yŃ6b…\PB*Ş  ŕ u † Ô˛q€ă˝ qŞAČ@&°Á>ŔIÚ­Vă€đ‡ Ä1 :ŕ‹(¤_Ś`„!˙ ¨< š!Yh"Îhc` T aŞ*­€ŃRľîĂ€€® >VŠn°ZěŮĎzĘ9Ł dÂtË[¶Ŕn-ŕfýv€Ífđx˝jVťk;ěĂŞhĹ4ŢO˛â¬–ŁmM1„Tđo Ž…AôFŚ]삪‹Z{U9ÇŚ 2ĐBKçëŇŃÚˇßTĹ"ĹOŘĘo§ŤhDOkk0J ‡c8‚›Aă:h!w˝ČG ˘0 7Ł8Řr.¸0{´»™ęÁÄëÔŔŔGđúJlĎ7ČZĹ7ŻĄ@Yh… ›¶kZ”¸)Ü=‡{ŚÉS>€€v\!RŔëgGŔÜŃö5ŃA˙†î>l@ \äڤCˇSL?âÂ#r _„Ă=Ř÷$†ţY ÇÁ ˛Dy¶ ŠjŘŔŻxĂ@ÄšŚ(ŘŚápF7ÄqÁőF¤—§Š‡1\ ObNز­m….ÚEî’‚Šb×eÍúÍ) JxĚ ·'0q8~PL@KҶ}ĚYÝ·mŕ„WŚ V‡ŚA6Ş®‡…eWďJŘz2!4¨đ¸†,E»ú¤ŹYém÷0 l …Wŕ@©{6dţß7[îá¸ŕF& @%®#Ź×¶ňüďpâ&ŘÁ`‹‚¬ďwYXÄtvîĐËaĺ`F˙ľr"šůdŽőëż WÄ=R7H 4O.&6ërhÄ,%Ťcb퉆h&·~'—rڦŻ °€y  y+Âŕ{Ť Ü óŕ @‡|x~Ź7fvP ű€€Ň‡{&âŇ0ľ§ ©x5Ŕćw~ZyKGZ!8‚Ż }.§’°z ‹ŕ&”Ó[Đp` ˙'ZÍW4¸~’'‚ ;đ !”Á°/°P„ŇĐ5  kÇaŽG€'çWÉW €P @‚%řĐ0'°p¶]` Çp …lg €ŕ~8°Ň/˙1 xŘ…0 @)] jđ؆˛€m]®@{W(};° Č8yx¬¨‚đ‡5đžř×W&÷ וGŠ;ĐéŞ8_0 'Ŕ‚Űa[•~(dC¶rřµĽHŐ`.ŞŘĂř}dčćgJçWŐP_€‡˛d*€8 V ¦:€ĐôHŹ_ŕ‡5đ®GĎ…M§z 0 *p…8Đ íř§Ž€őŘ9BЧŕú°‰5]N—P& éČ;`Ż s‡ńčPŹůݍKMŘz.i ‰W ęŘŽh¸°ŐH’á\ŕ)é Ň` pŔZ`H9 Hą‘Nŕ¤Đ °€Ň Ý`˝8’ ľ “§™Łś˝cy~öööabS[Nf´¤}@>ŚĐÚ3=ŠPŻÇűÜ…ßs˙˙˙!ů˙,FC˙˙ H° ÁäIÚ§!*š w°˘Ĺ‹+Ň%IXŠL 1;Ŕd¦Ř„9ę˘ ŁË—é": €qŔ¤§€UŔ4 S2Ä>h]`*Ĺ8ÎŃ>›t€­Úŕ˘j’«IŇ Ş:H0˘™BčŇj©Y‚N3ŃˇĂŤŞ‹Ap™`MÂD+\®'Š€Ł)éYˇ4©Ĺé®á/sŻ21ŚĆ]ZDÂ-Ş´ĆĄÄÇ<Ę<đ€2Ěđ 9ä⋸Đig ¶€dNFÚ˙yÎd(4łŃ=ŐpĎ%Rlyk¬ˇŠ±®,`Á˛ĚşŇI .±Éj ´0@¬Ű‰HHĐj € Gđ1‚Ôb Eąâ„ŠháŠřć«…/ĽŃÉ żPĹ'Ýv Á&x Á B¸”ˇ`C3^D€®Śŕ‹R©A>¤b„?@ëZDáţĽáň,Ôč /\°Á5/,pÂ^6á Á €Řˇ\8ă‰ČŔ2@€€ nčĎ?¶ hEaŘă^]'6l! a°…%Ş€‹OO@™0°  H(>aĽ€ ‘xD-ÄńąjŘ1`‘@Ř…ô1uo¤ë°&W¸B ĎÂ&‚IQL ĽÎ2zĐutŽuŔeě°rĽ€o(Đ0 Čmč–Zl! 0ŕA\Ć–ąNďxm/¶ŰŚs@BŔ.&š[.tľÍ) ֻމ-!XXFÁ‡| „ř1Bdá©o…j÷+ a»˝đž!8˘Žp„1€‚ÇúĚgěµD ÔúQŔŽŃ)~`·Ŕ”ĐŰ$¤Ń=Á ö XŰřĆ\PAŽo|Öőb˝6@A v,ęĂ 0A&N%ţĄ×‹"Á .C` K```ž€OoLf€˝@FJâP‹Gŕ˙Í÷1Z00!†ZĚ€Ev <ţ…× Ö2đZD#i ł˘1„FËŕË*@pÓl"Í=X·P`¨;ž@ě ‹»Xj×E‡Ę0hŔ€č„Ô€ŤG—Ń3đĹ< …;Ě At{%f0qD ărZ¸ÁLG˘@§Ú˛ÚŐ00‚ŔPÝVD öÄ ~ŕZ¨âZX@?Äđ‰»ŘřŢG ě'"Z0ČĐ1 ‰˙Â7JP5Źŕ·¸É¸VXĽkh…u9°=-ôŁ,Ŕ÷˝m°Ť}ěC ˙›—w" Ü`łXŘď@A hŕ “Čfŕxp†p‹o|Nŕ‹ɲbíŕMŔ·ŇĽ*pâGx(PŤĺµµ°¸3APSťxĂ€7Ă.đ˘Ş4Ş[]műăć¬ČÇ6ćľt࣠ű°LPŽ”KŐ¨Ćçz0…,Ť É(F*…°ĐĹ 4;Ś€?XAČĽD! "ĽŁ tŻ;ľuá 5čb­ćZ”˘@T1$ züÇ!ŕâśOUp<ŕ€ ÁŔű5ŕ¶XöĂ YŃ |ßmĐĹ1Ŕ ŚŔ\Đ&€q„#$ %&1.€Ž ŕ`ŕ˙÷ÖŔűK­ÁµÁgEňqwăߺ؇ÄqĽ-n D?Ę®#°#•ˇ‹` %€RĄ5Şő=©U,k kĐČČPlşĐm@r˘· pĐŃ€ ÄŔnC4#€ ýp P€đŻ7:q P˙ßÇ:Üć2ł=‚Ŕ´@ Č€f¨ Ěđ~Ě ´@ †Ă s0ð +őU^0ŮWô°¤pŕčvVô=ÜĂÔ ,€p€†T°†T  (° J—@ ţŔż€ ^‡^@‚1d|PŚŕÖQ—@ 0XDpť:Ť°=Z˙s6¸2Ô gŘşp‰ş†Ĺ† ,P„|ĹfŔ OđL¶Gb^s‘ XČ}ţ@ ‚Đ B@Z#PXqÔ Äp Ěŕp |Ä Ô`]ÓzpŚ•@SĎd.Śpx±}¤@  ”U/ Ą5ÜłŤ:G†ÔĐ  Ą` Đ Ş@Ś‚3 •P k P}FO02‡C…Y€”bĐ"ł°.“=µ8UP]EH ,5öĺJtĺ Ł‚č4P ÓčjÓČab č°5“€Mµ`ŤŔvŢł2Ň€j+łN°{…p#ŕŕ Pć9˙pÓhY`&”@ 0H/P[@ł mĐŇMQĐ”M)‚#2d•bE4O€ˇő p%@ Y`AI ©ŕOAÉ}OµWg Ť m+ÉM rY‡Ty/ůF“d 0 jŕŇŁÉŹ`i_™… Ö@ ¤čP="€©p9¸ Ů=. Ŕ9yJÁ@:°g1„™0p¤` @€/‹5¦ ‰¸…lW]7•đKČ—‰^0 :đ7i4@”Đ“ŚÉđpĐŹÍi Šŕ҉Š č°–š×هéđ6Á0 f˙śÂ‚Ĺ™ś¨ů•Ěąžě ĐYť®FDy€P Üů^0Jř ÂÉ‚f! ÉÉ%PěŮžj ÖđjóYźö™ů9^0‰9ś´ńôXž ş ëé đYˇ˛‰ôiźř9ŠfŔ:0PŔ4:ÉC` †8˘$Z˘' ˇʢőąťfŔĄP T7ZB@ úŁ@ę )О9ˇß§Ą€ŞÔ¤ˇ4ĄŻŔś”@Ą z˘)újFpyP ‰0_J*¦‘ 4` Ŕ Ż ĄÖśhj˘)j ‚E ś@§P` ăGp§x:¦ô°§nđ@Ŕ ~ú Š©– tę940Źz   4P9¬šĆ` …PB@Ž:ޤĘ%¸j«;rainloop-webmail-1.14.0/assets/browsers/opera.gif000066400000000000000000000066641361462701300220220ustar00rootroot00000000000000GIF89a?C÷˙ůú˙ôăëé˝ÁËôLLţ~€óýz}ó<;ęčňĐLM‚ţ˙˙ę33ůJL¶''ńóýôÜă}ţ€übdúNPĺÓÜěâě‰ó34ŇęÜĺŰŰĹÎýlmňô˙ćÄʬ» ý”›¬ ýruľhküý˙“פ¨űZ]űBBő++Ř´»ő¶»řĄŞ›úRUł ęňđúŞ'(áýmqůÂÇôö˙ôŐÚô##ý^bąő\^ůŽ’ÂďîřČ&&ëËÓýUZë@>ÂuyűťˇöSUˇť(*ąFJÇ79ë,,łÜţ†‡×­´ýu{ęIHöcc»đčđĘ⸾ďËeiő>=şLRřĚÓâ%%öEEÇ{µUYÖbeöGIó¦34Ř”šŢ öa_Ą • ú52ţfj· #ř.0虚ÄosŢ88éce§Ë Ǥ᧬óFGvŞ › ĘŚ“ŞňA@ühgŐ‚‡óéń˙‰‹÷ř˙Óswă+,ţyvś"č ôuyňí÷‹!ő68ďąţ=<Ďť¦öjlúFHű*,ÖDE·24ÍY^÷@AŔőíőősuÇ‡Śš řelôIHÄ>EÜăďđű˘ĺNSí/0ÖúrońS\ť©“»\c«|x÷ŠFż"ĐŹĆ«wžť`ŔŔ ÇŹ AČń.S/^ńăK—#ŽĽpAńŐ‡!sęČŕYE8ě­„Bt‚ŃH čÓ§Tź´/tŕ;łţCřáä( ;hѤ¨-Á¶Ý†}č¨5ç3ýşü(p iز‚…Ő×ě¶=üů#ĺH€Şu?2”©Ë‹Rú†UZö€J͵ŇŚ’C‡=ܸˇ‚ki]2 ™g×P#=°”éÍ``P¦L—6V(ě0A#ĺ/^lŘüá…Ć•ýćÖţŤF(†¤˙2´ôT ńRH%ńĺ Φ( R1ˇĂ.RΩ¸ŢĎă×/:ĐMdĐ|`™š$R‚yibH0\ÓÂ9ä0Č…˛ÓĘ(LÁ<ř ˘ $ţ‚Ę 8(2`V ĽŇĹ«•Č)Ş©vC S ŕJ,¬XĐH  *¨€Ë/>ŕBH á8¸D0jô¨‰t†bŃČË3!A3ôŔ1 ń 1ÄP,PŻĐRWWţÉ)Ľx9Ň™SĆ8ĺtU ÄADuŇ é¤žŔ˘zt #¸‰~ĽPÁhúË.Q9ĺ+­č1)vN˙Z'~P Qé‚PŃ <˘ÁĆ!O™†tÂeÄူB +,°zÂH;™¨jPA"!©B’L"‰¶Y=cË9x80†'ĎB +´ţřá¦}Í+GTP˘’Dŕrä/11E%`U±TR‹$_ŕáÉĽ<[1#‘D€ë@W âB›ł gśHĐ9­Đ¬N€ŃŔ ’HLŔÄcČ+É [ˇ2AĐĽóq¶)kťT0†|hŮ łĹ,ąH ŻĽđŽQK"·Ň@żäiŃńşűĚE‘ęv $Ŕ#—řďzŻ'o[3‹ ; ”4—H˙ňěcHńłŕĽB-€hm9,QŠ5~DM·Ô’D}‰ë‚ᄐ38áłĚrÉč[ °B5Xŕcd,ČOżŤGÄłçâĎnřŔÎŕŕ1+ŚNúĄ#` Ź„’úâ¬sĘ$°ű“ËÓçR¸~”R‹ Št”Ă:Ös‰ńÖ”Ď#Ä0’1klSĂĚkE娓N-ŘąĹ#AúčG>ZÔ˘é;_¸@Z¸a x_üXD%¸ĂdĐްç”Ĺ/Ń“@<‚µČ€H ş, ęPDˇŤ®pF# p í! b ˙Kq‹Dŕ[s12Đ²ŕ‰éH‡1ڑޏنś1‘ âÚ; Đ„&  .€ÇڱBqŠ;ŁwঢK+Ý)ł D4ˇĄh@YĆ{„‚o¨P;Č@)˛QŽŚ$  `b¸cVöULĚ`Üčă=ĘHĘ{xÁ Ŕŕ€âFî@ę`ä$g9ËFTaVĐäN8YĂŔĆNIL/śá ŰŕŔ2ZNr‡Ť¦4 `K\ęR'ĽäŔ18Ŕ<á gç1‘™ SÄA!Ö0@¤)ÍuJsÁ-sąťžŐ  ŕL˙Šmř™ŰH†@50€B(„Ťp';ŁůÉŁň´f=ßń€*˘ś†6:ĐŤŕ ‚Bn‘Pv6ô¤Ŕř¤$Z›žUtŁĆfJÓŹ^Ő@†Bę1,śô“ÇjPąáĐy^3'.­@‡+8ő uj€@U äT! čé/…úKxŐ† n€Ł–‰]jT«ŐŞRUpA32x_ő*7ą V°’Ő¬ ŮWZ«AUÂZµqŤ« P!9pÜĐç^ąi SěÓ˛UA°ťĽ˘˘V‚1ÚŃ:B¨•A6d@AäŕgĹd/kŠŤ˙ÖV¦Ŕ„f9[›Mµˇ Ą]mjQ @NŘ…¨â‚B€˘¶•˝-L : čVĽ]š"Úŕ„Ň7Ĺ5®qű,TeqítaęÔ™Öá ĹÁ˛[—gô»© ŻxW± ;¬" Iŕ ¬ ŤÚÔ©ď•jŞA‡běŘÎ3¬€_ăţ—żvȰFÁa,YWA‚ÜV·28ľ  ŻV\ '`Î0‡SAăTěA pŔ× ŢpgLµŞ"¨†ă LôŔĽő´Â'ś0ŠTl©ŕD`e!Á@¶ŕí3@Ŕ„*±`&­ ⚍s ąĄřD8ˇ‹)ëb˙¬€ P€ ŕPh †l®Žt4ň‹\3V2iî+|1g]ÔŮŔ€/!0ŕK 0Cľ;hăĘ « Ž<´] 8Ëđ…/ěŚ`€Ć9ö ú>cźč´~Ij^ŰaÔ)G=‡Đ,ăŐ‘Žt7ş,@‹°ó¨Ź]Č@ÔƵ ~­;$Á»5$|‡${ŮÎ^9śMŽnHŔ—°0‡$l;ĂIHC~ť„~§ĂŘ‘Šf?[pvŘ-r´@ĹÜQ„ÔďÓS–s*¸Ú0@ÉË@řÁ»±€n,˙ČĂ<¬EÜaoŢ tˇ :[ŮÎŘ€8"óŚáŮíF8ĘŐ}đˇ 0Ô~Oh}/DNxľ–¸Ŕ ˛č 4C@—@˙ł%ߍ}¨"e¨— ,ŕ °ëýővÇ@4Îq‡|€*ÉŘA dĂî®wpĚŕnĘŕ AEŠ0ű${ű°Đ ů€NPfb€°pbpĐĚ`y“‡|)c˛[4`Ş@} ÷lw‡0ŕu0Č m0ĹĐÂqw$'y®ç a@H'?' Ţ nä l '~Vćs†Ëv…‘¦n‘¦ )đ ‡6%pFPƦv©¦jŞ&iľ° ¬° Ěđ†h¨jް T&«Ł‚óAĐaĐúĆ j {P{@sH76P¶v‘J  |zx° \Đ»ŔküĄoű¦Ć•ˇ† Ř !°˛€˘pz•řwT" Đf` •Đ=pZ§ ŮpŠ=đźĐ ›Đ €‡é÷ŠÁб°Đ)`€€Z pŔQ` €)ÇŚ’Á ńÝ( A˘úÂß;rainloop-webmail-1.14.0/assets/browsers/safari.gif000066400000000000000000000114141361462701300221460ustar00rootroot00000000000000GIF89aBJ÷˙B«äG¦ŮZą3•îëëë´×íÓÓÓVĹôóóó/T¤´ĚĚĚĚo–Ĺo°ŐE˛ęf‰Ľ´´´(eމ¤Á666ĂĂĂĚě»»»S·çăěôÄĚÚK‘¨¸ĎŁŁŁ;ˇé«««UjŹ2…Ç+xşe´śśś“““Vx¨ĘŇŢČŐávšJ»ńććć×kM:–ŘŠŠ‹„›˝Őçóaaa€‚šĆřřům¸ŢÚâęüR;”É|||čŤZúi5(rĆoę+++9ąrrr[[[ěň÷KKK„ ˝›°ÉŢÝÝgx–ýýý#c˘$mł­g\@śŐe­Á€uG~·D™ĘK‹çRRRt‹­A@@,YŁlmm´ŔÔćW(áááR}ą^«ŘG§)p ŹĄĂ*E{§«ł•©|ť»¶“|FiŁÓ]2âáŢ™­Ĺť­ÉÚŮŮo”µěęć*{ÓoŤ˝“«Ĺ3‹Óa˝$h·˝Ĺ1{´Ě:îíě.€Á“ąŮr’ĽÎŮć>˘Ý>‰6ya}¨ĽŔĹŻ»Ň„ńo›»6u¦”¤ą‰¬Đ’ś¨›˘®şÄÖŠµŐOK`ţ`dŻŮŘ×AV„ZšĘęçăNr­Q±ÝĘÉÇ6ažWŚĹÎÎÎ{•ÂÇĆĹ0eµöůü˛µąŃŘݲ[7óöř.†ŢßßŢÄÉĎçäá­˛·Xźë°ÎăŮÖÓ¶ąĽĹÝîĐĐĐľĐá8~ĹöööÁěđđđśÁŰDj˛żÉŰăääZ—ˇ°ĘÜÜÚ€’ł´ŢôççčŻĂŘv—·ÖÖÖŔŔŔüúůTżďľ˝˝zę‘€Ť¤~¤Ăٍ˛Ş:úűűŔÄÉM®ß•›?Şň’ĄÉwxyßăč¶ÇÜiii‰ĺâßŮÜߩǙ·ůüţ   Bt·,“ŃD?RŤŤŤŻŻ°···¸¸¸ ‘iâ ^ß‹uŕJ………c§đ˘Ą©§§§PoĄ•––CźŃ###ŽśĽ|cd|ly™‘©µś™ťŻŐ?ŹŔ?‘Óű}6eeehgg• •ɧ#JśHa(cţqú4ěaĹŹ ?‹SđSź(S„‘ ‚P*c¦ ŐrŕK™8?–"ůŹŮ)fź`摡O,E±,ѧŞÇÁ‚= Đ!Ŕµ§#P‰:;g€Ň.J§ ”Ťä+“6™>©‹’Ŕ©> L,ÖĘÓ.ŐâĢ;1Z& *x–é…Śc#-Ŕ D śóŚ·ř‚ĂI)Qň ˙Ń ŮL0:’‰Śxa;5Xa ůŕa© †( ĹlB -#`8@€…8X€’.8ńŹ‹”ü˙ĐC=–bl b l .¸‹°k‚ ~đÁć Ä Ä9ĺüPŤ.Üü` HX,ŁËŔíD$č lÎr,,D ‚Íŕ҆¤†Ä+ݰVH±Ç 8‚N-xŕ §hó%q˛Ě.Ť©Ŕ xpĘ­^ÔRlĽH€J1l€ËłXa…ěȆśÁé0Žh8Ô“ ?č50ĺ pD,ŢNˇ %Ű4šÉ°!›1ÁÉ a(3ň~ôÚ«ľ2ý€Á¨±ŤËŐ<ë :1`"Q1Är»T16 lăņ<˛fäŇąÔ0Ă]řŞŔŢ Ě˙â÷°Ä3ËÝx‚ÔÎľ#X Î!đ%ŨI SpŔóÚ;í´läK.w4Ćł ~Ćę«KsĆÇŇ4Ź zT-01ńá(tÎ9tĐ :Bŕ@ eú1 ßĚĎ2Ä"(Đş4ŘKŁĚöŰŻ°BĘTâ;t CśÎ@PM ĹRĎ3,ŕ=0, §ÖłNÄţDdßĹahF`†6° L ر‚+Č@ě†"ô`#qścQxĆ.pp t(‚6ž!nčă›…¤QŔ¶‚PFĚ€tˇ 8D $ŕ‚ľC6čF-˙X #EÄů–Á% Ä 7±B$ZtÔŁUľp”4aA$đ‹]ء ş„ě‡CŔ}D%HˇpŚ#Ŕ †j€ĹŁÄ2:8A6€@‰}  ]` ‘Ć3:RŚB$0„!LC•F%Đ ’l¸FɆi<€ §XD6<ŔDlŁ)FúŕTᏥđ‚1?´Á• ¦0‡ `ŕ¸C*Aş;0  :ĐÁŔńR˛ˇšl`€$¤  #F1 ĹZb{  $ ltČi¸ÓîŚç4”IOeÔ¨A.Bé˙L6@SšJŕĂJP<€Y ‚.NAmŘ# şA)ňŚ´"CĆQÁP‚iä⣠)HĂ\3Ŕ ú4Ň$:PŘÔ¦-•„ ÔP†ÁXÁ…Ş@nŕŕ8¸Ĺ"1>˙Řö¶‚Uěb-…Řŕ›u čA\Ë’áfÝlhÍ1IĽÂ2€5’°h$iBź68ĐŚ 9$ CĽ`Ž÷ĽąŐ­D€L0\`ŹDŘ7s""` 'ř7 Ö ‚22€[`€ 8& ‰YÔŕ’… LÁ“K1RC ü >G pľű˝ďó¸vq¨Ó"–ŔŁ=Š Đ @@G9ŠBŕ{’pP ÜÁ‡˝FoеˇČľ¸Ţźp¸âO}ěű΂€€đ;đ¸@řjČG@¨Â®  &ő‚đ€ >ś@`’@}ęŹB ”ĐĆ.2ńŐ߀GŔ@˙nŽt,áüKx :±5ţ P,Ś),#@6fPýsă‘€ sŠ05p’€WqrOđh  ľ ]&éđ4đđ@ĺ÷čçkŕ~kđ ž@ó PŐđ ˙€Π Ú`% [°2€ 2€IŔ€/đž }ÚĐeupZP/ŕ@ 0…y°"8‚k† hP60F0đô±°‚ŕo[đ$ ?rPç ˙p ŕ „€C0 ` o U8„8yŕť°©°© ˙ŔgäQ0  ·0­` SP `ž —€’L H‡tŘú˛ŔO /@ ` é ¶x ¸ąX…ë× ‰¸2 ·HSĺ0Ű2–@sb–p – H@} t¸t(eľ ^¶,p ¬ĐvŔy¶ Ç€Ž¸뇿 tĐ,80ö 1 ˙đ@Ŕ Ü ¤ ÓqÖxŤ PpF€wč·€O¶p…yŽ ‰‹ÇŔŔ ŕ‹“ @ Ŕ08Peřş03  ™¸ čf đ h  ˙˙Pd%€w™>Y˙0‘> P”EéŕŔ ˘Đ ©°@*`$â0(B*U`ŕ”`IÖ¸tnp/°p >9”y¶Đ—Đ FY”ĐăŔ‘ťĐj@ž` Î0"$Şp•ĺ° hpR°×čn „ŕe7—y9š` ¶@š{É—| 0ó0n 𨠲  =€Pҡwá!€–Zŕ`ŕeéPޤ™—ŕ¬p—ŕDy˝Pť˝ Đó0ťp‚·PŢr@˙° |4ĎPE0Źč0± fP©ŕnŔ'0  CIšÍé)Đ<ßŕ ŔźÔIťJ™ť0·p X`Wôh*°Ŕ ńP!‘Đrŕ×`ÂŔ“ů ǰź)Ţŕ P0:p0zÉŮ9K  ňWĺ«%ŃB` 1ĐU° ‘ ş` ÂPŤ Ç 40šűÉź)ťŕ Đ ż ŢŔĐ 1š ÉđŔ& ±žßęŕ ˇ Sp>ß"@yâ" óŕ>ĐpRÚśUš𠿀¦0żŔŢ `˙Jťb:ŤphZ +đŃë 3± ę ŮP†v X .m 0—Ń ¨UÚ )đ0ř€ /¨É˝@2ĘZ€ŁijCj(° ä010Ŕ° =0ç` ”€h°Đ,O0Ąz)p«0ř@¨·Š« Mâ  ËZęąq3đ1`ËZ# @ E`pO0—Íy ş­Ú «¬0ŔÉ )ŔšZŕÁŁ *í:ëĐ5!±`(üŘ=€ľ°şŕ ‹p q@Ť@Ąŕ0ZĄÝú­·š—Z°±˙Đ tp ࡬†2Zž±ę0ő #ëPhcEPű`źpZ ť)UŞ­®š` Ép 4€ *€Zˇ*ŕ @°đQ«° «˛Q0C Ó1˛ Ŕ´Ŕ®Ŕ Đ Ű·` ¦0 š@ú  ZBč0=o›¶*A ŠË!S°ë0*‘  E ·@Ž Đ°šp'€ ć Ž@¸úP †Ű N˘%ç łľ ±0«p¶p;+ĺ@ E€·<`«ÂË ĽpĆ[ ĽŕŞ 0öş%Qö ¸şŞ€«°¸đ‘»BĐ&¤tĐ éđ30ĽP ĹŔ˛$ ËúĽ0p’ęPššĐę`Ů»÷8P Żš{ « P1đ¶‹ Uđâ ě[ ńš­° «Ŕ¶đÁ!Š«żí*nűë±BP˰ 1€#ë`sÁ‹đ«pżâ¶Ě!ďÁÁĎë ?@ÂŮP pßbá Wɶč˝Î° Ľ 8 -@<ěLń8ÄBlŕ fcÄ0° â „r#@Ë@Sŕ ÜĐ WL€@ü4ĚÁ0đŔ  ş Ć9;rainloop-webmail-1.14.0/assets/css/000077500000000000000000000000001361462701300171335ustar00rootroot00000000000000rainloop-webmail-1.14.0/assets/css/default-skin.png000066400000000000000000000021001361462701300222200ustar00rootroot00000000000000‰PNG  IHDRX iĽtEXtSoftwareAdobe ImageReadyqÉe<âIDATxÚěÝ=‹Wŕ;ëFÝVW¬~{EB(J>€µXřRX$]ŔÄT…¬V¶na#„@AS;Ic$Y¶‘xóv6¬—ąŢ·™;çě>üđm/öžó›sćlŃď÷{u (@A P€‚  (@A(@A hŃ”ŻëפŤ×´aŇń¦ŕhd5ňGäuőëjő÷)ĘmĽ4Ľ¨{QŃÂkÚ*IĆ[třţ,FnE.DţŽüyYŽśŚěŹÜŽ\ŽĽI`>ĺ6^ĆxCg*)żÖąfĹhö5Műľ·ńĐѵja >Wđuoă#Ă.n˘n‡ń˘ ¦ţżSx’ňČÍŢ»O&®UgýÍ'»,°ÜÇKË‘Ű9·‚ŘT>Tt±·ńŃ`y÷˝:Ă—Űô§ß[ăEAě°‚ô=)Ś—. ‚t]aĽ(@A P€‚    (@A P€‚    (@A PĚ(‡ź+ág_(:Zx˙żŹĆ‚ §¨˘rP( ĺ  HzáOôľ/©Ä$w©ÝŃV bÄ$ŰÉ\¶ž9–#Iď FMś&M?łÉí&%­Yl˘d¶Lş«o.“ewäpf;‰Tż·Łć™XhpBÔMÚĘáPänd=ňKCgjWéás‚vÄgAĄ8Ëõȥ1vR)?©čQk˛)ş’Hqr|ů1ňÉ”WDPŰ´ ĘcŐČçĘF/–¶Ź©ť?Ď+˙˘î¦Yj7Ň–#/"űŞ?żŤ<Žüyů'ň«r€ ‹-–ĂćďSú¸ëň–rXŤ|ůÍÎÚŰAäň ÔŢČZdWäläţ{ĆŞ ĸ ?…ťÄ©Čż‘Ď"ĎÜs€Ńf˝IYL°¨ŠŽŕÉČéĺ4|ÄČĹńČ#o9(@A P€‚  ((@A P@ţ` #ĐÂ2 sIEND®B`‚rainloop-webmail-1.14.0/assets/css/default-skin.svg000066400000000000000000000107761361462701300222550ustar00rootroot00000000000000 default-skin 2 Created with Sketch. rainloop-webmail-1.14.0/assets/css/flags.png000066400000000000000000002317601361462701300207460ustar00rootroot00000000000000‰PNG  IHDR°ŕϰ§ IDATxś¬ťwśUŮÇż3÷îÝ^’Í&»I–tJ¤wéR^@ä…P¤ŠÔHPÁPđ"  ‚JiU @Ф„$¤n¶ß™Sß?Ιą÷în@_ßů|ć3sçŢ3§=Ďsžň;Ď ¬µü'Çą?Z`ŁČ` D"䏷o…1e#PĘýVU”? 0ĽĎű ůqź /úßoµh+:;;ÓňBVŻ[‡)+ĂH_ż˙njüęt ňĺ=î·ţţźrîó<Ű•ac&ä±h6ĺ8&ÜĂżQĹ5«Ţd· 6 PÄzX×O*o#k€Đ˝/«@IČúf&_%ÝN†Äřď0ÚŰ‹Đ`„Ŕ(B€ÖéďMŃ'g®ŁŁ_źŚŐ—ţţË/ÝŐ’săá‡SÔ|bk±ľLBY*°Ö¦m×€ňt÷Çß- ;™ Ŕ`ŚňÓ¬ Ę"eĆť‘2eČ…PńÆ’î a"Đş¸§…·Ă#Lᾉ&ěÓ·ď|ţŞół)×óZĹx®úk·¶?EÖ.6sĹđĺ°ófö›őĐÓN2{‡}÷›ĚĽĐĆüę—t C6—%ŠĆ”2Ł Ç<Ę®Âß Ů¶ß "UÚ`U4€_S>Űoö˙ÍŁ»W1ůč´µ(Ó M&#°V’ËIŚd.X)0B`ă ?ě^rőŐXcŚáňĂ5Ęh´Q(«PFˇŚDj5 ©%3îA[[?ýéO]ýFc´) ”&#VJrRb„ŕ1ąEB bóđ˝ó`ţŐWłqhj*5‡MRXŁxúĹš6I>ŻPR"•˘NJFĎÁăQŔęë¶ćą¨–CV•ć#mŮžĺRĎŕšonD‹4­qkkŃÖrďä»Č-·Mwý×c Y­ąocÇW†„Zs˙únΫΠ•"P#%FJ>˝ű!hk#Ľá†tü°–ŚÖdŚ›h«56ąjíž)ZÓyë­ÔŐŐąňE‹ýÁ% ýo•Â66býo’sŐŞU`Ë3Îkťä0Ć•1´Ćz!„R齤äoďżO§‚łÇ$´k±6ŔXĎ`Ƣm€64!ÚX˙ĚťÍî¦v=Üwź6ÖX´Đ´v´(eHNuń ŢgL¸AŐ°?P6aŹżü"\~M?úCk¬Ň Rd”"”ŇŤcѵ{Ć nWĹWŤĺÔS÷%úp3l”ç[ŁĆŇĐÔŔK‹#®h^…V†Ľś|ä6dł§ł3g-âá_L§-RÜ6©…ĂŢ|’żě{"Ś5nřŚq}5Ćń°6ţŢ"µĺ¶{fC·âęÜ ĆŹŤň啵(_^j'LĄ/?ăžŮ˙ąČ†Nöoě’he‘2ÄÚUX+zÁhA®˛ k#ě’EŘ(‚– rËbW¬ÄĎK»$Zk¤•H-‘Ć]…#ZŇZÓ ˛Y×…5kע¤D%“$6XcăÇl,·,lî$–ÍU- `[`–»V¬$Ňk4×~O2o‘¦ĄVb´dÇ1’•śšóńűńĎyó¤?+ezMO!±R8ş’’ µüôĄˇöźFvýZĘ;;1qLYM5]&`›ĽŕůŠ˝iW"<ôç9ÄÄ1&aEL âTݲƖ ţc>ÖŹŕ"Ŕe–qŔ µNWfé'ČćŚÓ±Za_~ űÎl¤´äe!c„Š!rŞőHcŮWkžÓ†ĐJţňŠćÔ#šÖJöĘî|T`ŤDHĹŃB0QJ–·ćöŕŠŃŰňŤ!_ ?ž‡­‚ěČtv f·Cݶ ӎڜʸ ‚îl%ß|a éęl•b§ŚĺŞŐťDqŚ•‚*Ą¸˝+FŠ *3!˝Š/··§ăgý’0{ńŠĄ’•Ëq‰•˛0ţ}™ˇ+U ü>ăźĚ˝ż)e~) \PöĎ0ó«(űţJôë#ťŕ/¸¦u=[ mDo2X',nµ·Öb±Xc1ľnc-e4}c=—2kóK cĚvĎ˝NKĹ2•Tmż-e\ĺőĚűëý|ń‡ß˛řăĺlwÜńŚŰý0řdv«‰Đ4 ¬Iµ#[<†Ĺ÷J!„ 7lfćLţľő·řďolGĹşD —d˛TMC÷Ęő,î-'Zm9j˙ üić<|ľŽç­âŞďíĹ«ď,zéŠç&ĎAŹÝĆ}G]„”Ę1˝g~]ÄôŇ ĺO„âőKwfěí·#VŻÁ7÷Ć·ÓřÓJéî˝ćh•"×ÜĚQOŢóź ĄśÚ¬´A©dŇb†´o¤ńÓ.zOč&S‰11FDŘĽ»±@ŕT˝ X5•ęk™ż…(ĄR"…@&«˙™g"^ţ¶˝ĚáGbg˝ŠŚ-±Ś‰TD¬ôz;¸ˇš#ňu,Ý÷2b›a—Ażcúň“Pź'm9ô›w±d«ďÄ1g=y!٦ đ`GżŃČď÷˛¶†śUĚ˝/§|ůŹŻ’JĆëxâů”Ť¸šŞŐ÷ŁĚî€$^H‰ŐŠ÷»óŚ0ŠůR"bÁF!±`¨UĽŢ±CučÍ(I ©ú ?U;łZőbü(ePJ#Ąéw/ĄAJÍpYÍ˝ÄPW^yË—wąßJA@Ż>Ź+®Řc,?ţń{ű>CwwŚ ) ŁFŐ2kÖ4ŢÚŇşy‹ăÔ\@Jʦ, >mÖćÉ]ް==nŽăŘÍOa€-j Ťą"áă™ßć_Fw?±Š°ú0lĹÁ}ص”0T™.ŽČľČňy”’ŠŃŁ(?đB‚ˇ›Ąż˙ěĺGřň“7ÉEUć3Ęébm{޵Ď>KSSS˙ú 9!Dz-«®F~÷»´?:yzM–-jz•ćĺÁ»˛ď /čXĐĆ›Ź˘uX-—śą;W˙ňeN<|"eŮ€öĂDĄčÎć¸÷ŘK‰¤F{5]ëhĎó–Đ-Ŕ=·ÎŽC/xť–‡Tč(ĎĐ“N˘lř:^}Ť˛Q­tĽţ:˝sçbĄÂ('ÔCřĎ@$Ľš˘ RY¤˛X• zOč¦úćµÄĂ“Ď;u<Š â‚€ŇéJő/ Ż‚F˝˝(żň !‰ă+¦˛µë®Ź*rŘ(BE†ĽĘÉŘk0ĘIţĂż‘{ĽŚß¬?)¤Ýŕ+ËÜ/żOVtqÉc? ¨qUGµŔÍŻÎŚEÝÔ[MFkî|ěm^ŐŔ¤¦^f ŤĐN`e‡MA,ąS»Ú ďN»I •f<šµRryuŔ5ť1B¦Öfx˛]°…ŐZ˛ŢÁ)„siĺ\+ěÇôÚŤgţäYâfTĘ"ĄMŔ/nÝ /z“kŻyĎ ?»~G.ľř „0é{A9#&±ů“ŐSĚ‚ r7.E\ßő€"ýÝĘ>šGŞ}X‹Ť^ÂϱFb{gbső›c 'öĽŔŢťK0ĺ«(Űb•˙AUuÉo{VÜČŘ}/ačÎ; ňŤ¬›?‡ ,Ł©qЦë˙şÓ˙nýKŻđ§š™˝R˛Î”c”ćďĎĚaÎđ&f4O>˙ §żĎ˝öRj^~{)a&ŕ…×űům,yˇťÚďM©ťÉăV}[0’{ďĐ3Z;ÓI¬r«ůq”ŤĂÓ¦Ń|öŮ„Ő5TnÓA×śŹ˝V 1Ć9e˙€rö†2HéŔ˛yő¬+i™ľŽŽËËůňťJÂ16ŢŽÜ ĆqâwjşRNuü@ŕ'«'ŠR"„ Žcâ8Ćţ|1á°Lu jţ‚Ţ^¤„HE%śđ °Ć9÷FUišu/oy1ĘHeQ”i3ěúĐ/ŮŞ¦!5YŻBĎx·ŤťŽŢ‚-G•ń´Ţ e [7Yun˛ňš ćîKy¶e®¦#Ň(µpďHźÖ’‰ftąĺɶ^˛R D̋톳ĘĘ•Ĺx•)] D$ŻŇSĘSKéUIiü3ë˝äĘ™PJ!¤FIĂyç˝Â·ŽšŔ´`´áůż®ŕűß )-BčT‹€sM@ëoEƬµ\qEžŹ? ٳܰÍÍëůÉ-^Ź"§ľ‡!¶¬ŚŠŤŮ %g3~¶›Ű˘ő€ŔV8ŕücx€˝ŘĄ}'Fo|“Í?ú„Ţ·~Hvx {ďOŮ6;c€ĘáSm/ë™CPŁŘ‘Ívţ6Kßű¸”á‹ë˙şČ×çßÚrXHFä™­m¨‹zůČŰ5w<ô.B)Ŕrř~ăą˙‰2¨ ÄĘxóĚŻť˝îT˙ľŔiŇ „[BÄ«ŻŇÄźÎ#^ü9-çśCۢzŻ˝čyű]‚Ř95é~oţż@˘Z iEŔÍ—±ä“ÍycŇä;%c·]‚±Ŕx[0 Ą‰]¬˙‚úoý`-RJ˘(J…€‰"ě__$Ú„•ŠÜ§ó!ŽQ˘`H#Ař°ŹRX©‘J˛§^Î^˝ŻPâ—ÔŮöűß#âů%1Ňy @,PÖ©hÚ«iˇ V;›uÁGËňŤV´ řâýeŚR83鄟–‚J%řÉš~X“aćş(Ž9µ1Ç÷W¶sďŕ2ç Ł˝@÷íg“ÝëlĎJ¬uQ «eéŐ8g¦5Ś{VŹäGŃňë Ô××÷_ý&MÂ>č|[ Á%}T2ţA°hŃVüń©Iľ_° ŕČ#%JÁýż ¸ŕ\ĹkŻ…©€pˇ.…”’y†‰µˇ-Ö{±ťť¶ę›ëĚJÓS c —µĽą^ٍBŞćŃ…GLJĐ*çóÍ•/2îÓű Őt*¶ßŽŠĂŹ"»ŮAôlśI°ę&&N”g_CĘj|0ö’K°ëÖ•úN”Â*]Xś´&ëźgµĆÓ¦§×şŽÝoFćş;^s6şŃHé";V[âXń‹űf–Áuĺ€Bžş?AăT¬ZVb­tZOńµä™+ ˛Ł¸áÚYt$híŹD“4ˇeŐ}żÁ ‰ŃŠöąź:ű?ůŤQdŚ˘ű˙Eô&ę¦FJKµ{ó.˙|wJFlľëB´Ž1˝Îh¤"2Ť gŠĽÓVJ&Mš„đö|ző6ľRĄ4ăÇŹgÎś9€‹ý !˘8ޱQ„ť7źĘ?rŽÇ(BÇ12†HçÚ…ŕ&[`¤k‡~ö)˘­&’Űf¬µDóćňĺĎNC}Eę`±F;'ś”>úĺT6m¬[‘µĹx“H‹ĚKV}¸Ě9K{zP‰`´Äřđ(B0­.CFI&e,]ˇˇFIî\†NśÚ9wLĺ™ß}W`~é™ß?3ĘýÖ(Ś5-8ňú €¤®äÚG;ąŮ_[3Ćđä“!O<‘Mź=öDŔńÇÂö«ďü…ą"kňI誠»pVŃçô Í•póŤYâŘÇeĚŤ·áxkdÔĂNęďĽây6{áűd+sTí˝ eßžŚĚf(ĎjÂp)fÎ2łgc—,Ié/1UJúźÜ+éTÂńăý(„ŇXkŮműÔT–qĚÁ[ňđÓsĽÖĄ‘Ę ÉČć:Ž;xKn¸űďhmEŮíĎqý±Yѧö˝ôdâLź{Ű_èú žřŃľđă«9g/Í’.ŤÔ i4B+„H!h¤QW`J+”ŃŚŻ7ĚYö˙ :{#¤˛ÔÖd‘Ň+Äl±«Ŕ…1# CA0ĘToď'@(´´8! 4#•DJw&+…R ĄśşšśÉÇ1±ł™‰@‚8&’Pę†ÁÚF¤’(Ł ×k”&:,m—UŠu÷ßĎđiÓ°aČş;ď˘iű­°Ę`µŁ1Ę× „2 «ÍĄ@âŔŃÖ«mƸP¸źTÓPŤJ!1`Ą"3d(ˇ÷Ň"ť0úACŁóŕjçs•©1žŃ `:Á ™!$`“ P=5őŃŁ1(¦ťtU.fJZ[ ¤Lťzx» wcČĺré» 3ž±”—÷"ˇ1„4•ÂÚâ®&@[Źkń0‡ °ľĆĎ?l51 Ž ňg×°^ĆoŁC±q‡gŢ`ű_§ţăéäFŚDíw Ćä¤?”•÷?qpEZŚĆ×Wň‹Ůnó&f˝ł”Öć:âXŁ­ó±ä#ÁĄgěĆÄqC‰…ćO/¸(PţÜ#Č6_ę´•` ÂśDŁCyMŔ8 çsąé¶×÷H©hÉ ń8ÇäŇ(d™ű,ŤFiŤ˛ž¬FÇÚ (™ô˙ñýáŻŮµk#ş#Ao·BwÂ˛ŹŽK}Bŧ١€L€ŰÓ]Őřµ–QŠ8LÎC5[ŕ|_ ¨‚ą (»â¶%ĎřŠk8zđÍ}Đ}y@]#Ł‹˘{IÂüoń.ôiorźDI˘˘ľ%ĎńĎ'ߊ‹fţJŻ TŃ=É3_ńýo¸ýË~č>c jܸtŽ`ţńL‚qžéä8á„Ňűľ‚¤¶ú2~r »çź´‰ş/R†H9KŠ\ó#‡†ńT˘€0e8Ę)ĆIö}–ŚňßÉp?ÁˇPO <č7ă8ŇבŔK‹OŐďŮ„ýŻdá«?-Ľĺâ— 3rýôv|z/ŠP|é˝?ŤŞ,ztPU_䬢?ˇ×@ďŮ ‡4đÇ_Žä¦źLćˇsž¤»×ůđ^ŁŹ9Ôţ×3…7e>-ťQmĐ^çîŰ|ą*§ŞVNşŘ=,nÝĎ”–/ćľľťŠúÜK<:6BŤçcŔ4¸•Ň ë?‘ű”5|ţŞł˘§§_ý‰š›0Sń} “Ă úú’˛µ3gbN:‰"/ÝW’÷ŕąsAT±`÷ńX“6,Ť˙"śżEY[Řúą·0ŮNR*a’Š=µŔ{žŔ˘^ÁKáh®ľ{×4}L6„ŻÉ­Ýś´ĎpÚ˙paź¶«BőOÜ|†EM(Ⲅö(®Wx`䉙ұWşDr¦¨ÂMśŤßí;yĐO ĚËnÜĆS§B.çTʤŃ)ţ˝(B’ 2ĎčaH~řwČŞ>t熂lÎńމĽpLLĚŻˇűÉB±Í¬Ąę¤ŹéţýÖ,Ídh}ş,Ŕ ‡Ő±®Mń?żyŚWfĎä ŢŔ"Eŕ!2UMŽ»h"RYfÜý®ľý0ßo‹Q!ÁȬÔ0HXE&Łł’ÉSŹö^g͸íWţ˘«}y±mŠ Ŕ:9=XA/šáĘ_]TŢ*Ş4Ô9U)°Š аVb'÷‡rú˙7((@UU•+_˛â|uhiőęŐÔÖÖĘÁľ+ŕ·xt_ˇ A>߯ţ­?ţźž¸„-#Eď;ďĐýŇKdšš@kTW—#´Š ¬ÖČĺË©>äPŞú&ÖZ*§UB\}?ëĆ?$LŐEřů ýü۵»{ç?ŰËłmË)N´`>¶»›ď F]s›ł=ë2„Ę™6 %i˙ě3¨ÚÜŤŹîú=¨ułŚĆZăĚ ńwx“ĆJŚW“Űć>ćšyÓí~ţ,Ń`ŚCDjM`\h6T˛Č©§±ZŇ=í6®;ů:ÖsôŁ­FÍ^{ɢxöĂe”ŁKU żÇü8<÷Wwěż?¦˛#Ąó]ĐŠ Đc ŇZ¤µĚ=›¬‚ěćžţ0`ŤëżŰ1ÍŤĹ EVĚĹ Ť$ ;SŇý¤ŁżA?ľ:Ą±_ś>ś hĽôg®¦M‰•îšřş?=Ăű¬ĺŃç;»(ć„CćŹ/¶qÂ®Ď bśăĂMĽŔÁ??ŹhmÉQă–k{ŃÚ˘E€KÁęBą@bcÉÂĺí-‘RÓÚ\MA™µ¬Ř¸mÜŔOZ!9b±fD»Ä*ÉňrÉc­’gš…snHIkckAôaY±beęp›tÁjĄsŠ-ěĺLĘ˙_ˇ †M÷UaLÇîWţ“Oá7÷`7´A±JJLOOżúׯ^Ę­sÎcŽe‹]wĄrëůňÚ©X­i:ďBl°vú/P ź~¶6ǧůň«Ź~ó€]ýřő¬L ż,(Ă ±¶Łt ­đ§$Z1î3OÁü‰Tľő ™öl>OvPy0©·›xÉbÇôB˘G§”äúŚ_Xs˛»FŻĹtüЏ{-˘ł“ĘAn˙ÄX‰5‚ l¤Ó \ó±ë׺ůKö"¤Ś® (HŹ€´J m. !±¬ęüť0ąQ"’„Ŕü}X×Kç¨BťÚ8‡ŮaŰôđíáš©Soç#ÓŚT–qŃjž™v<Ź|!ąkVĆiˇJ¦ë—1ýĹrÔý÷sÁ>«Ůs{Ť5˘™1~üŇ{I`6Ł#z)@%Ěo46'°ťĐžë‚L%eF`†Lgă]Ç0´A`Ë%&amťĆŠ÷ťV ·â'´#…Äîú(\H=ÔJ[ޙӋ†SŽ:™fÄśľ÷ă„Hnµ@HŹDB9›?a~eP*ŔZ’’§^–h-QRřrˇu©P ­NUýÝW(BŃĺ …ŕ€%’ÇšÜf bġ•R(©(]µ6-pôßЬ\ř,±»–ßč7Éţĺ·»o;®üć•,ďZîw-*' Ň L©˝ćb$Bąë¨ÚQĚş}íĎíeě'źŔĎmß8°öѧţÄ!7¬¦…yëçrŢęsąq÷éÔŮrĚşŤJ`7ŁŰ NyőŰ&Ăč†1ŘŔ¦+Ćy•÷"â©„éű €Uś€¨¨áwËęŮ"J(,s{7ç€-†°áťĄh! ¤Ű”őŁUĺ(c™6,ĆzśrŐUlظ‘uëÖqćąç2lčPƶ¶˘óyjžĽ%őÔµX˛ÖbŐ2äş«°DÝgBí-{°V9ÍÓ› Ö$ćBr/S& Ëjiżx§Ţ‡=Ü{´"c}p˙}~3çVÄücqž[Ę7\ÎÍ×_ÇwĆ vą»ĚáH’ńKčoőjřł"@˛Ű¶Eń{SÄ?Fxż§_MĘĹ*l(éí é’ĂÉtĽLWůÁ|ţÜÝ4íwMg^Źýőiŕé¤ÖA 2Ąť oxňéŻŐ@·ěět@Š2R% o~ĐCkÎ<ötîy*ćĚ}ˇ¬¬ É„Đ(•M5ŁÔľ‡%cš8´şť 2vř­yó‚Ă9űäÉ#ŹD{(u2ťťťübÚ4”TÜĽç–d2Y:?‰ńŤčüĂ5¬1Í—ţ ¶’ú0AR·O;¬á…•g żŠšb0ŤQ’XbŚ"4*u´ ŻŹřéŢ·bú ˛˘Ç˛ÓŘ2vŮÜrýŮ–7ßÝ.„ď|݇ëßÄ =ýéoMŻâĆßJ~uą u¤ź;#úih•:7Iµ-çó°‘dEőAäÉ”Y˛Ë6Gž„ÔŢ*¶R‚tóź;ác¦w«7J‡“P–ËáMĐ IDAT\YH“ް™H)÷|ř 2î˝đ='´¶(ék ŚôďďőŹ5çžpw?sÁ7 ť$*ŃÜjŹ3EŔ~{^˙PŇ›ş·cB!  Ő ©ú%”ŕÓĹŽ]ÉŠW$„ŕýÁ…´TPĘ*Eע÷^…ŢĺÇpń!ŠĄ] a„ʎJä|Áý»¸rÇ˝/çű\şëŘ:É»+€t¨PˇBX 2H"ţ2tÂ@Z‰ eŠÂ(A8ľ˙Üňsl[Ű€cĐ·ý«+ĆşĽ˝§ťĽÉ3®v;–ţînj÷Ůrlxę Ćśw:+X×ľŽšŞ´ŃP“(q~ü}˙MčâÍv〤ţW˙Ň•ëزkÍj)zµĂ/-%ćSÁżsŃJÉ]_ŢÍA7íÄbý ÓW.äŻt͇ ˇŚE ł\uS/J*.|iwî;Ž)gťE•Ü|Čvl<ö<Ö.YÂÖŁGS 6 ¬wPcÜŐiéĘźh^ X´sÔ XÚrÎsŠ_.Ŕ*vô.źwĚś%–—ćd™úmËvµo§ŕ›ż—Ř. ő@G)ýŐ„ŠłŹ—´¶řą+aţÂçŔČ4D›"8ņAWbňĂríčHŇ–Ż¤V®E=¶]`«%vă/ß¶@CX.˙Ý*~~jËW®ţÖZÂ0ä'Gďă€ô°UĺU{! BZ^}»‡(Ň\xŇyÜúHÄe‡ß‹µ% ZY’€Ž+Żýf“Ŕu2#h¨‘D‘Ä–%[i5ŇşÍ(Z{@ŕTeĺďĺ&Á¶_HÂDĺöD§”dĆpżz*…Ö A &›‚Ô¬,Y=­R¬|ýR8ő] §¶Áw^v‚Fá´ˇEşRjíWĐ7`ÔV’˛ ®ýJ ±đ¨E-‘ĘÝK-Pľý#‡(ŢťE x€wÂŢvöŠË±‹—ô׊Úď<Ͷlă2&6NäÖ]nĹZKí©ßKß[wŢeXkyé€WůáSxyĹË iiL5i]ß’ţ[kť·|Ě_\=éł%6¦…Ä%Fśü$Ďýî”QrÜăرc= *rš-67üůá,q—ĺË冎ő ąßîQ7W<3ź<öťşÓ;đÝłĎf—]vái{kIŹŠ1žŮŤ‘čäŢú{˙Ě…¶ŠšLÄ=˘”˘­3äŘ?d9sR/çOľ‘9S&ńˇ¨Djˬ?wsËÔźđôRÁÔż”!5Ś\}诶–ł]Ăľ»Hg›b  ‰&꾊\¸Ď‰ÍňUDzJí„YPYщܸ‚†‡/ˇv·SX;éDzľ‰š…r…Őnü—d2 ąč|Ô’ĎixzŇ›ö™ä¶Ž'Ŕ2ŻÉ9‡ ";n,sßű€,°ün‰[É…ßLň·ŮÝä#Í%§ý€i ~xä]~“L’řI9Hi_×a)8˙xßy!±Y'Ü>gżźžđścĺąfIĽ•ŕ;óŁzŃ-Ş”Ü7NňÇ‘ S9‡aÁP)rPĘmV[&KˇśÚCynŐď›x$±Ů˝*źŘňĘH”wX" ž ™V…YR€2˙+PŇ`Ľć'0©x÷]ě­·bW­‹Ú@¬ę^ÉŮ[źÇnő;aŤeĹ9gC0ř’`mŔşi?CllcÔ˙Ě´íodÖ¨ŮL˙đX éßc­÷cő;&.Úkž0˙‚ŕăs&‚Ҥý†‚“NJĘr’Öń‚¦&ý¬U\˝+q‘HˇŕoĚžÍęµk|&\,{X*:Ýâ`ŠL0+KćPĺL5ŁKovş5HY•ú•îx5Ă-•=ĽrŰ~X9Âő»ü3¶˝#‹4Y”–_I1ý Š<ýt®mŤč.ń†±ĄW[Řę;Ţ–3';›.ń=Č(lŮV´ulKĹšNš»śUSž¤ă™ßROŚýčn†Ľz;ŤŔńăďéßठ\[jżß"N=ˇ7wČR·ĂÍ;Ý6Ţ–¦2o›‡~ôŰ{•2,Y!yč/\pţąçŃAŚß¬m ĘĐ2¤ÚmŤ˛‘nĂ‚vpF˛˛Š±#k]¨I'€q€R´Ô·8Ű^k>ŢVňŹořŐW«ş;ÖA‹€”Š––o‡i‚ŔŮîîŞg31Vő‡r FŃRÝâWwí±˛„ ”VĄPJŁ]hš˙ JZ Ű;í7Ţ×^ ]]%ď’dwĹíŻ‚źí8 k-˝o˝ÍĆG~OŮČ‘ 5mżľ#%Ůćf2C†đĹi'2ř´3ŮďĐŮďŔżP÷TťÓ€úô?f0J´Ö|mű•'Ŕ2ߣ´Ź5’O¤Wż©¦Â'ÜTŕ ÓŚ±‘ó= ¨¨—„9·yiž’ľ_GÜiX±J±âKĹÔ›Ü- ÍŮfďQhŁÔ§ˇüŞ/­ ói«ŃčÜ#•˘ą¦%ťwĄš8ů ÉÉ“şÉd wţi F ň!Bí"%F8rłQ´u$˛¶Ǩś őIŹEx€$Ĺ—¶y« kŔ† űÖZO‡rŤ3’şĎžĄ,'šGA(ˇ.±üř›B®G«a‹Sű›ęś]™ŮJ¨]ĚűĎ(ĺ_p/ŘR|Ö¦î0”«nËŤS>VůîęäHľkĂ3bzqXs¦Ć!—ZOŮç:m'ő€µ,ű—Đ}˙αp1,inÄÁ`Ú`őv)Í'ŹŻFo#‹‡Â!ô,ěŹ.ţĎú @Íš5TUUwÝ…ąęŞߡ(żâóYŚlĘ;lE§ďW_ [qůä7ű<ú$ó†ŻĺĽgĎë%U@/¬™ůőí_0ŔĐ|Uý©ăĎ·ă¬÷HѦ)tŮĎ[uXÓë^VŞp÷FÁ’Źáȉ}^ţď4ŕJéoSČSE‚Ţ.=FŚ€Űns©ą:; ‚2Aü A? ¸k.G×Đ)p.L“㞍~T»FoÜČ mßfĂG»2ݱ±r´oׂ ďXŰ^ôD—¸2aŰľ8ěâĎ€ýVÎ?ß­XcĆ”Bż˘ÉY3Ŕ&ó”ŕ,r›x@ĹÇaÚŰ ł!ŃÚTż÷^ż÷%+¬‚UŤŤä(Ěé6íŇď·ĹŰV“«Ö.Î_|ŐZ3zč2vßţAŢţč´B¬u©Ř8Ť@)1ɬ-GQľyL şÝ2őřóŹ[8úş/!t1Ý ąĽy 㿀2ă´ aÜ ŕĹgnS:ŁÉ ϶üđa%\ba”ĹÜgö/Ú÷srVXôÜŰ›N”gĚÎ ;€ţ0čao+eÄţöĘŐ<Ű>„_}Ľš›»ß'‹á25‘ďdŰ8j×!śüäóŔHĆÚ řŢSĐ«Ň÷¨ ѿ۳¤îO ńˇAĄPč,,»ĚŐŘ·˙¦§@ţ zí Â÷ šąá Xű·Ňň}¦#ýĽăL÷®âOޟޫMśŔ?úYOç:ěčÂ$ű®p†ězÓĆâS9[¬ \BFpr lmĂt{¦ô[5ův7Tr۱~ö3ěUWýŰPÚňQ‹ąéšÁľďŁ!.Ż Ľ§—ę 4ŠŤťetg* Ú:\roš<đóOظ|•S. ÓŐFUUUęü2 uXc(Ë–ŃtţůdËk0Zóůí·:Lţ6{Fßz¦UX«˝‡YXgJdlňY"ßXŔĚmţĘ\Ď‹[ećĘĂÜ~9V{oş«-§·>ĹNUÓáÄQôNyyá2ő ,xäiFŚř1_ěřŹż}Ú€ŤˇjÖEXĄ¸eŻ&dĆm3ÖĆm1ÖÖpó÷‚«Çx(/Jm5 ŤÖŠĹäFE¶Ň‡ą(ďó’î™@ˇ“˛”Eéü©{ďeŔŁ8¨¨Ľ5Ô××2zňV“QV"­łĹgĚžÁŹ>Ęńç_Lâű CĐ öĆÄ‚C†gČ^ZŇ˶ޙLY•3Mµö&Şó[=8ý2—÷¤1ś¶k#ż{Ż -5u•’]‹AÉdðź'Ľ»»şű@ˇCCĂŐzúĐoĄÄ–ő‡B ůš«©=şţh(c(ßEÓ°RÓő´QČÍhúĐ˙Ľ30o× śĐ`‚ 0ĘѡĎíÔżäŮPUÁťż9ÄC™ńţgn“äô F´Ďe\ČţWWŢI6Ś…µŇ˘ý–Ke­ß†i˝íb˝-cÓl$ĂʧttŔ‹/b/ľ.ľř߇Ňi&ŞĘ±ŞÍďŁ7*Řoźu iÍ«{úttÔ§iÇF6…ŔćPSá†nýtŰÚtr•±tßu7&ŇTO˝śŚĎM/.ÄT6oFmż\ÍĐQ ­NŹw0ҤÂ#¬$TV“y§‡đł<r9°‘ł“ÍÓůĂç§zԙÞ_2î>ö¬ąöÔôľ˘±ÔNI0ţúá™üWĺőüĎ3çc‹‘`´Ĺ~ţ9VJVn‘Äs}Fe6(pĚçIg…,@yĄ•hż¸Y˛}E÷ÎŃÇ$Ác›€B?ôPiŹ>ÚőµĄĄźf ”µgĄëŚ×¦/>ć¦8ÖňV0pߊ_~ÜD}űâ¶Ť8¦|P=‘´ěś<ŃŮL¶Ľ%ťŁůÉ_źÍˇ§ŢÁć’śngí>©-§î<ëž]Á šL*|ľŠíŰźBˇŤúBBWú­*ŠăAˇ P{Ş%3t%µ§j6LŐ^IngMŮ’îż”ŇͶ¶)n+ű@­îź$IPŢŠQŻş” $›OŇÄŞ}S¸§‘¦˘ţ_yÚíd—lŰYşĺ_Ŕ±»Ŕy¬‡úo`»»á˘‹†ŇA7 ĹĹL 9ńԷض| 2ů&¤ŚŘ®µ—QßźĹ?ÝŤž(“ çÂu?\¶[b‰?ťOl™ĄËADôĽ÷>Y­)ßuČçŃA6( ţâ&z¶ŤK‰:f„ ŃăďĘé|­ óQ%ůíO ’_ŃÎ)ü~ńdźCsɸ߰GÍ5°»&z'DPŤßS\9ěźm0|x­ŻeęɉCĐbźr„sËy™˘±1ĆMŕ1;ô˛—uš“¶.2ˇ<ó++ř^“bRUź¨ČS{“„‘›€BĎż'Üâąęw_ŢxâőřŚhF$@(ďťGÁ_‡îĹÉă·"۱†î…ź!ąÍDzqĹzćŻ3Č ]ŘPńřťgń­3ďäĐSď@*Í}7Oć‘;Îŕ‘ŹÚ8vë^ü¬#Măöuô ΉÉÇä DŚÚo[KcEńĆ"wJm) ŕR$\uŚü¸ţ ź]™ţŮľ;ę Ś’śŇú,G: v×wB4!•.bß­„űňĚn?ťCűKVlëĆ!“ń·8+­ß¸ŃźxwuuA•‡Rý‰Š6’s†J®-^űŚÄţT`ă>Ph(¬üĹő?óŚ{vć™›®Ľ7™’ŚC›`:Q„„”Ö €ĄŰ@ś«äńőě’L¨53şG˛˙VnXŹmPsÄwúPłBJÍI˙ĐPŃ@‡*ăşW6˘,¨ň T‚eř)Ú(TŕŐô@bŻő«ďá ŕ@ˇL»fÝĄ ¬˘rEvĽ$˙†$˙ş,Äß‹č? —*O˙$;˙g«[|ýÉ"řůCb)ŞßŔęÓNŁáĘ+ŃË—űK˙ýëO®™QŁX4k–S€úBiĄ*0zÂôIJ®äy Ĺmj‚žě™gúJ}€ňeE™˘4Z0rĚjl3ąš!D+¶k5Í»ŤšÇ-Dľ<Ţ!Ba<|×xfaÜ(ě`Ëjş#ÂŽUd¶ŘŇŮDqž0[‰.©fíEŤ°yW?¶P”“­Ĺ•€9BEÇ›ehŹ|~FIâ8ŕńm[`…~;DRž0ţYpož—7^Ŕ/gGKeÔçśóú9\<ébÚăöT…סAĹd?V÷-Ľe4Fč”Ů•âňç/‡c)@‘}Čëś&É!µ}€P•Řk6ę3ţŢ<Ú”ö—0ú€‡"]ů]¶¤M(íwmŻĚćщ#YĽľ“î^0ĘňÉŠOYĐXĂř8BHĹ3žĂÁ§ŢáhSje–†×_ť˝´°ł’LG„Ń–ĐD]%6źďŻ®Âł~=%Ph«PřU˙;Ô3âT˝ˇT“"P© `bťÚřůwTJşž.Đ‚… áTŤ§żĹ7ŤfŮ‘Âv 7ąŇ!gEňYiĆ4—ó÷ŰßásÎ ÉŞm<”˝/˙•0˛H%í ĄuŚďŇl÷ËÍW$X·űÔSŘŰďŔžqšOp™¬ú˛ßĘßĘŠp鲒짫W4еm;ŐŃ`:Ë›ŘĐUÁúÎ Äő=´­¬E ›:Á ˘(•x&v™gkÎ<“ Ë–“ýb ÖHzeđ”)Xk‘QD.+Đ™ť·ŻgPnh?şUŢż·hĺ/úÔJę?éĹü^qüđ™ěUy"ě‘Áľ" É:Űěě řMžWÚ/ä—=Ţ;ťc+y~ćóL3ĄÝKKˇČZp˛ż»Ţ»+E!&˙Ś4¶~,ÝOwĂ1 mĘ{ćĹauEBË ěKű#í`üÁĺP´v“YqééůJä´F¸Ýw˙ŠŕM€G—µ1.0()™d‘>ÝűňX$Ůň:ž|;Rk„T(©QĘĹă÷Ţ{o™ŰţběŇĄ¤YĄĄÄţćkčoěXĚ»ďÂ5} ĐÇ-\#°7űń»\b«K5€ŔĘT$‰C‘Ý«č|Ş@˙ ĂŰ>W“Ś”D-Âgtžľ…´©0Ň%N-Îí Ćçt@źRţë»ň› Čnذ‰¬°_Ł>AŔgź}†9üě+3é9÷ N9Wą /5çÖÁj„]’Đcl˝bö4 Ó3ż_Őßź;’ť{eŮ{‡qmXĽq]uëőĘ$„Ňţ#C7ÝÝžůÝßc ˘‚úkŻ%˙Ň‹ĺ Ţm7‚Š ‹ct™Ű“®€ę o_ŕMVNSäńMńäVą?«@±áo9ě~eđť-ŕń24!taKĎřŻu^Ä/^pŚOÂüÖ€ńNTŐŠ+Śűlý®Č”ůµ@f% …Î(5…ň“‡(Ž®ď€|Ib(°Ý˛DűJ Ľ˘{ä‘îůsĎćz·ÝJ¶FAŕw‰ş­·›Vżt^ĚqęŻ@kżŞ+“®đ.ɬBř„ł/?ň}ö<öçiÚ'î:‹Ú‡/qí÷Ś•f•.fřż¸˙ýĆ?đżŤö‚˘ňąbőßCy}(.UíűÔź‚ˇú2żÇ(/b yá˘Ĺ>c7B‘¦ŮŞđÜąş„ý ąńgTě ¦»+µď“«)˛ů“Ť2ĆbŤ&¬«cä·“m|·†¶€‘K\Đ×Űź\•qYLÜ=lV OĽ4ř٧±7\Oôë˙ˇëď'"ýtLŕŻÖm‰QC›ő„ÚpäÂŰR»ö¨Ű~ą‡˙uĺQ Ú řăőű±jC(*˘µ W© +Ó 3Eąé\ě˛3a®ĘË}˘‰ň\L¨čţź6š*› Ěź®ň~Ĺ÷^˙ôąňűµkÁ§˝Ľ÷ß°#« чńżî¸üL8iś˘GáآÍKÓ÷÷xv-<ľ]SS¦ąůBĄ@iĹ·KľÝĐÇćźí™ż«ű@y }˛23­WżĘ hdüž{HďW塸Ę&BW8ĆW%ÝŰú‰0ŘăŘ[PRóöÓW˛Ýa?㨳î¸ý}LÍŻ2—@Á­DňĺS IPAÎŚUtU;ŐR!!ÓD%óí ]p!rÉç$˙ř”¬Ô.™G"< ™|ŚVäĆŤăCŢ%wiLÉSřÓ 0ë"APµĂŽdQcC†ć’°i&VY”•5ÍÖ곲&ö»ÖÝť„?şś–ŁZ†Ň&[M‹ˇ´V;ĆÚµ˝Ť´Vú˙wS‘Éňń#¨ŻďFkXł>GµÔ×u»şµEu[`‰[ĹbI0¸Pç Ľ= P>xŰ5„aH”ŤK¦a¨ó•çŐÓ»łËËWń–am®`C‰Ea­u™u7ĽP“ó„†ěמ2ţŁožŔżŻŢ¬ ÝĘoC¬-´ń ŘfÂÚ–”¸’ziu«Ő-I»6!!Ŕˇ{ĂÎ+áŕ:ĹQő-EÄ)áSIp—„a ™>PćÓNw!Ą8"hmu«ĺW €BŁ ş% ź&G‚)Hޱc ~ës÷!J3lH­Sí˝Š/µO7ď5—ŽËpÜą÷2zä% ý˙nVßb(´‘(4áp 5}Ę×(—˘ŚÂřă] R‘ńő‡@ˇ“Řżńő'+łÂ­¶ ńQQŔ $ÎíDŔ)ĺţH+¬Ž¨*˧ňłßž„öě’}6Z;ˇŞŤv©čŤĎHí3V[kůĂŤW0łÇ™R´ź˘€úK`%@“b9{&×ĐŰ2ŚĄ_ĽÇ.SwŮtVR(Ŕ+‹¨iÝ'ýአܟ^řű Rô»ä¨)*× Ô~ú)‘·iô˙ÜŔíÚZľ˙ţ‰ć Ŕ!ŻM|V4ĄéwM4‹äsňÎîÉy˛g´sn`ĆG‡¦b“ŻŃNŠbJ:đ÷}Ž" ˇ˛ĘˡşÎýÔĐă|çĄŮ®Ňkr\W ŹôVĐ}~0Ěţ}Pl}ÎähŢÄw•9°÷ĘŔšNŹL‹ÜŮ~Ëb”R)0ąßîŻŰ*H¨Ę śm3ą„ż-=˙Fűę˙¸+(@ˇ=ťľó ڍܞ$ÇÚqĄčľľ÷ިĽęóľ,°ĄěŃ÷·}ËôíĂ!cŮ‹™n ,»čóÖ`!Ř ű? ąÜ˙y㥥)JOl †‰Pî?ť#á2ˇžty錤b1©żHFÉ=Đp÷"Ţ›ŰLí`Ĺ­°ˇ–ÝMY`uÇěKÇ÷ýÂMĐWgäMÎ1×¶ńóc†pţÁCŠĘ—–ŰÔ;”1\pŢé ó®ŇLÖď¤tńŰŻđť§Ç żţ_ż«Ű "çÚ-(ąß •¤ÍI maČeaÁJj1@Öµki÷žÎ„č&ÜÜwđHçOź™ îĘX> š4óńĂ%ĹuQ*ď óN§NµłdPă& űīޤ=JMĄ„@GÝdrU,ţÉźČeĘ€L;ůg!c ›™oé,™|ăsŁĆ‚`LÖ1U`âa7ĽÚż˙ ˝Şbú7ŽîS0 8Łßř÷˝ö÷âď¶â˙~üŘŻŁŁßscŔôvóÁ`ű… ˇ®n@ÎŽ:÷šĎ¶<šöęÁ.oť·ůuAëŐ0ď4NÍxŕ—¸i˛«X[‹őf6ÜŁM€2” Kţ˙LiËS»á˝ă7ꇹî®Wąí˘[aâ.Í”¤ĹţŠc|6›ýʞň2Ýäj[ůçjÍöcjţíňRćąě˛)~ŕ}VY­üŽG•FX\Őď*ô8‹§žz‚˝¶„íGĂÜ/ŕ‹ •÷+Ťő&WmB´¶¤˙@¤í˙˛öŢqRTŮű˙»Ş{r`2Ă CE0GĸĆEW]ł‹şć°¦5€k\ł®˘kZsZý¨¬˛*FĚY@’ÓŔŔŔ zşë¦ď÷Vu÷Ě€îĎ_ńŞWŐ4]]U÷žsďąç<ç9ś˙PČwPŢpzň<ż¤„˘K/Aw&˛LČČ‚&Çj|Ă~7ŘţCa´A‰ÖŞr¸ä’ Äb1ΙpŽ[ŇY'®Ô’ç|€)“wLCQU(?šÂ\đâ…T˙ůĎY¦l‰]4m͉Vn™pľ…˘‡ŚĐŽbKÇcT÷ëgC©˝¬i—/_z±š]Ż)0ß( qË5cBh·txŤ1’Öźn`ŇůĂŇÍg D¤ ˝(íüT™•{ ÓÎ˙ g@© ťpeĹş·»qËŠF×ţ×\sM$?™VhXK)¦w!z-%7vuQňę«”––ö]Ç–_Ś–’Šş:ČÍí!żŤŤŤÄ;€b-9îÝű(=őO]ö°‚Ż Ć„ŕwéNđ<Źkʍeŕd{ĂĆ6[ŐĹ®¢š6t=tŢţ@ęűx.qŁtÓӾ«řzć2 Ěŕ}~Éň · 8j˙lĺß”ŇęčťB(¨ďűÉ‹ßvĐ‘Tě±ŐŻ‹d^đĹ—ßYwÜA`Ëz§‚TT´4•JŮňeÉ$żź°OôĽĹů°ÓPCi!|µÚ“Ć6 áŃércˇň—{¶¨c… ˝ľĆ`”B-Yf˝ĂΉ˛´řÝ<ű«Ťhťť8/@| ąLx7źÁţ ¦l­¬oG ę‹ëŁ$c`í†d4@IÇ©Ś!®bѢPؕ֏c04µm°ŠŻ\+°ĹĆY7ÝŻ:''Zzc˘śkë2”]§}&=đôŁ%^N_›yç¶•ŽRKEeąŇŐx…L“ć®ČjCĄ­íg[ß 2Ú!Ň%ߣH@úýqí/Ł»V­jĚć¶tś@X’™0ô®€G úőďO†ÝÓCţŤÖ$—.u5[r7ů•R׀ІňńéN IDAT!hŕAŠ;;a˙1^¨díľ;zäşô'ĺęµI ;×Í'ŹžĘ#3'Pđî˘íŁ0_zÇšUŰô˙rÄą0`OŚy–#.}™Wîś c¶˛¦Öć7żçËkHü‰—cÖ<Źéw&XŤYý¬í”A“0Ć>¸ť±íóŞŻÎłVÎ^#Ë6«ü8Fk€2­ipĘ/K*R)„+U&’I‚”­[(ş’¤‚µRd<łý˝uPUbřô'XÔd&¬‰§Ň»V®şo`ăŔŽ–9şđ7uL÷¸°', mg~ÖapĘż]k7çă1 úbn~ŁŤłgůÜ1J§<µôŚc…V®ŞmX.^‡n¤=Üáä°hű=Ë )JŇĐžŕ…ë(R$ÄtŠ<ĚÎb±¬>°ĹaíKlNůĂŚCŃ2rg…2 3’g‚ >˝@…@;„őú@’»ăŽř[Ť„ęšôě"%í™Ŕ?ÇĆčĄ-ďf¤Ä«®&wút–,YBEEE¬ëMÖ´óđ!č8äÂXţ&”?Ý˙nŕńĽ¬č@¦üÚTŇRb'’óŻŃöŔĂĚxö¦ď| vÄ ÚŐ™Wéc]y>Ď\ô:ś4Ůf jŘ­˙Lţ¸őkÜüń)śđŇ .[ĆŐăîCĘŻ˙ĽKVĽ_8NP:Ű`‹]ˇ,‡Ç¦Ďć­o~„š Čýĺ5tćfŚŽ/1MĎb‚fLjfĂüLéLĹqăG f•ig^©Sç(¤Ňě˝őćđúcEŠí•bűîńćT “Jˇ“) P «wĄĐA’!‰»NđŔ&Tí±•E…2Ć0{©á›ů†D`đµÁWvŹ)Q/:ÜzRĄ«ÚFĺŐ}ÓŢĄ„Šbŕn H^yČ<ډ‘ČŻ;yě €‰ŰŔ{ůçđì{řÇţÇrő[ďR„1^,ź¶żBżłě1R~™âžÁř1«ô±đL,|ŇQÁni Řéz ×lUĂŤăŁăż/Stę9Yýlڱ3XI^,&™eę§÷´Ň‡łż1/ž żx‰1&­üÝ ô^|‘ň!CV¬ ]ů'›žmĂK/Ą1 .Ô7hŤ`ůć›řmmŢKJĽW2Šwv;ľš¨Á„3¤Ł®­ĘúÓ‹Q8iŢ€bG“Ý Ü…ăĆQ4v,ą˘µĺúÓÎŘřúëh!(Ůoż´ŕ&łśŞ*ĘfĚpK€ĆFäí·“’’’?ťĚGĂ„_0=ĎăŽcúRÚ˙ÚlđÍs˝_“óWCü˛ěëËš›Ń˙*EßÔÖÖvQ·ŃWł"ŃÁ7k›X:źykçQYTŐăůĂŁrÉH!‡ú^ł_eŻYŻf™Ş‘Ů쎙ÔNb7`¸ÁÄlęĄ-Ttn¤qGPÂ`Ů« fŹäÇn ŕyl}Ĺĺ©ĺ<°ö>ŘřE¦e*HŁ%Ę—Đkc1JÎ9µdI$)|űmĚĆŤtv8ş˝­Çŕe¤$>d+g͢a\rČ%,k_ć[‚ÓM’C¦'yl߀?Ý!¨?Pqö’L-ZĚő/m‹T’ÁĄůčćŹX@ k¤ĚĘz3©$AnQ¤tiÎIĺ€<’ ;ó AJZůżűć3±nýägÄŠ'¨řă)ÖŞr×ĐäVJA2äĽ×Ý|ú\Eç_﬙ć¤\µj}űöíÝzůů˙öŰo;v,]tëÖ­Ërâ ˇ8ýĹ#ąĺŮ>Hy…u˛J †ëŰ·/7Ýt‹ZŤhLF5©m† ·d-„®ft®Á|ů.-ŁvĄ,ĘŢř~!ý ú§ˇÔ®ŇP”ëß J«#+¬QŤ8b1ü†čč°É2Šęwc…%°É0µµYĺÁ^Ú]přv\pćţ}Űxî­ß3P÷ΊŢßs÷×Ňš¨žĂ÷<úŐFLĐR™Čç’mRPU\F „łA^Šĺ}sŃ»ď†1á‚0ł¨ŞÖšA@~g+”ą| );qĂĽqźéXĎ(ŇKČîňޫ疖źđ9şłRË 'b-Ő:l ÂHú˙JVj­8ňAĹ«·öd•Î|~Číß-žÁ÷&˙Ţ×`v¬~(ŤöKZ°D61„ebČ$ŕø[şˇű´Crf ţlb˝‚1·l!‘ú‹1żn[XłîÍż ÍFçI´Ü dş`Ě9K9éóSů-=ž®;Ś“nç>Đt×hňčL R]N)JÁO‚VÄ@ö<ÇŐz'mçťĚ%?\b‰’ýŚ&oô ´ş«.ď ?­Yżą|9ÍcĆô@ŢAöóďz>›dCnşúއU«VQT}ŻbđýŹ=Ń}áqř÷sh-¬aËÁ“éů”îi™k[¬Ě$H;ěűÍx÷c* ,cU¦Ď"ěĂÚťwŢ$\ö×ô_˙%KҰe š4Ę0q:ýşËĐřńăůMŰąî}7ÇJÝŐ«|xk.l»zuŻňlŘŔ;îHěýţűPQáŢŃ"XĂÍű¸óČ(xi'č`ři±3đýćÉě÷énĎ÷Ö1™{ĺqˇ#Ęé –:°!¬đž™¤°áy>ü~÷‡đ°‰6†·/Ó¦¸±h6#Ôś+Đ$7ý$8ďOÓđŞŞ*LËÔ·łńGo‡W^1Ür F ú¸˘¦Ąůţ{x;îýęX¸pá˙/í÷› ŔI ŤßÔČZÉs{ĺH´ f”Ľ7"`CŽËé—®:Ż45dí&Í*›I :^şAQłH&’ą ăxÔ<&˙ďűá|ö±–tWąĺĺtIŘU>Ů~;(ICzC$dm‘棥S0óĘ)ýđ-hk‡D¦¬©c‘Hňß¶1´¦c’Qą°Ú>EPť6MíĚďŕłĆpď…_qÎťŰqöŁ‘"ŕ_“~äÔ8˙‡e5Ć6śP. DZE2¦çě‡Ńŕ€w ·câ[QŘŇH—4xŐäo1 KVó}{ÂŚ.yí"rşÚ©:V˛ćqýqp Ď×íÁaĂFR\śŹZ¸ SYC¬-mŤ-ĚÉ- k˝!HJT^1çŽËAj¸őÍDĘŮÄnEa‡Ň!MxáłhmăËB„[ŤKł2Kx6áEKekKü‚'<\7Ö,°Nbß÷#łŐ÷ý´É$Ń©#SxA`ß|ȉrcVůĄ'đ=…í|#Ŕí~xr}UŚYµş…kš·ĺ´~…Ôßp-W^}­ýŹ®vKˇÜľä8ţćtŚç˘źgĚ® $S)Ëب ×+njRŚ/ÖGQ0ž“_Đś x¦Yđ|s@'‚±dăröÜ›˛’b⣷O+aH*ëÚ,>n*ňr‰ď´›Sn :÷·µ_/ĘE‚®ÍC5s $xKŕ•Kü-%‰;%ů—µŠü…‚Ý7vť-Y—#™U§řd°`őv\ö°çXM;:ćnÖĹéĽ|r«^#7§—€4«ŞzóŮ0w=B(mřęçőVĐ´  ¤˙ţzkËתĆ‹ĘpŔeë/ť]rˇAĄa`mśď]Č…˙čYÖʱÉHľď»g†ŔĄě쥀ş<ϱâ†ŮzYtě˝ČʱuŰv€¶Ä(† ®HăĆĆ_›žS6 Ŕ”űÝfĽq,ĆŔńG CŹĽ­“H&/’Ľ¶^ňńFÁ„rÁAĎů <^=6ŕ‰¦€ĺ].,›ă8 Âë'#'üł± |±p‘ŤuuY®E!ú'&7ĎFŽb>ÁěďđËJ)ľf2ňâ·Sűm \;.˛kóP` W!(ňţh'Ôz‰éP+?Zž:T@źÎ$Ż 8đkÁňź‹xńðĄ-‹MěŰ“I6=…wŢuä,ZHĘóČéŰ˝ó˛YU3Ż7.úĐä˛WĂ‹,mŚÔŠ}>ËŰ‹ŹěőzĄ-čƆ׬đçCäÜě€1Ú:‘hŁ9cß×8ë‡#˘Ń$%Ô¤D¨ü:*Ŕ!e:Ě–OłÁlR$©ąŻ­)áS8É~őxZ1cqŚeĂF˛íŽŃb“w¸ánrJ kţxŐ˙~Ćúpt+ąożÁSUGňńÁ†Ľ8"ĽőÝwĚܢ»çhT*HyäĹ}v2uóľ ć÷GŇ é5˝Pš=GXĚC2Ąřvé”ŇěąU5;-ÇĂ'?¬Ť’o$ó7ŁşéäĘĄ6T&$Z žXzlF\=ä· ˘óś`0sů”7‚™ÖúP6gDIC,s0Wű µg— ©T”çÉ VânýżÉňî˝ô˙ÜďfřŘ"łĐ‚´B°V`kň™T ą÷ŢY](E|D=o}ÓÁ@ٍGpűlźó¶¬N ę_u\;F ę^€e;Ř8|¸‘Ú>ňއđ+ŞP+W8ß–Mő5Za mď˙ľŠIve $±čXŃDČßÔ~ݡŔCoí°3żH‚ě‚ A˙Ý Á7ç×÷„!‰ŹqŔ-ČýŁ„ęŞQ⥒了k‰ňYíÎ̮ܕ–Q{Á×;ƶăŰŁ}¦řÚ«‰=pńD.ƤzéÄ4«Ş5W\↠ŞăůI¦/>Š-Ë?§®xŻ-8ž>ůk˛ ĽŢč´wgÎ=ôĘ´‹»kĄśÂk~ç gú„«'CDc­íz+ds²JÚ­źµŁU˛ë_Í ţÜŢ•e†. şŞÁ°FV C¬ĐR†ć«Ż˘`Í÷¨öVO8–m÷‚ŕlnž î#S]Lď,F ŤP)ćÎid¦„‘LQ([Xţůű¬mZC(¦UX BVöfĚ[‹1šď—·FI:ďĎkbCGŇQDٶPZ”lű‘ +jXš’6u[ž\~G÷}–@¸™_¦gţđ8¤&ÎWĚĺ4g5„ąňRöôť„őMBąś ßÍ`˝őoň˛)ůŮfň_0™@ć¶×^č” çËĎťuhý1°ßüfŘşˇ%.–,ÜĘć#y‚ ő/ŹźNi§tMŔęŔˇ1=‹Ô@ü„ŁńwŘ †łřţTĘY äW_Ú Ŕ˝Ć['ś–Ä<•Lá—W;ým;±ü†öë^=- nŘ÷qI–ĽqRd”Ň ,ÔtMÎrĄÄŻ đűč'bß ÚÉç窱̪ډ9;˛Ş°ž.“ð|üŚÖŕy¶c>_ô[ď¬7|5çĆnßIn/ťš{R‚ŽwŁŔ¬r¬®2ŕ‚ÔůÜpÄ|›Ú ˇw$ż˝…ÉSNŔÜšÁęÚ ‘/‚>DX`… Ó`5ł–đŔĹßpć-Ű`ąŰŹNZÄź®ëF[ןfÁ;1 ‰ó#ŔÉ·,Š Ą/_342ÁşŻź<ĎăóçŔ·5ĘxQeŁ÷ Á`čsÍŤT÷1¬>â j¦ľA˛ÍŹši—RG寡 ڱŢnˇ¸ŕhRđ^b dî ¶m›AîŘľ|ő– é)“vđÍ^ŇB ­?¤o[Ć}ůş>ţaÖ}ˇ#«©ii®Ą¤$íuŢ˙’µ h>žRŐăÝ3ßńy¸mjÂůL_ôNˇ¦µv›˛đji(¶ĎżąűĽ1¬^ź@Ę0ÚB†Ó 4ˇŇK©4őU…ň¦ł+ ŘÂиďľüüÇK9îúUě±5/ý÷] Ą`É>ĹÇ” ęsĚŶĎńAŔů‚‡šţ˝ÎzŚ…âvÜv7E}űâCňwÉ·oÔNâ‹Ď1R‘wńeŃgOLSŤ»áx~¬Ý%#~…/Ů×w…€…áúŃ*µŃš3nĹvĂ7rö‹ą÷Ĺz&ŢĐ€1ÚVŻ1bÚěÇ51Ďĺy¤ńä2DXő¶ăîmK“IłĘž9dxý “>4<İŻ<1Ç0ł G¨! ©®CÜ@(ËŽ+AJqë˙iNŮł‘Ń,Gť*ŕő™ĺÎ ręIg±  I!9yŻac¸ęąďđ<ëě´a@k1¤-ˇ`Âňâ—ˇ°RJ’I™†ů:Ľ˙&X©T”­ćI Ąfmí]y´vĺ „Ë.•íŹîáGŠ ň:’IIßĘ\ž}č@:®ż†ŤĹśW~&OăÖĚZ1ě>ţ߼˙Á úüë1ľÝ˙#Ţńb^zŐ*±@RßGpJ±`§|a«ď¨ŔE,%x˙\ÁőĹűÖnhVÍi$@rÚË´|ń)ĄÍëČ?âŰVˇÜ»vkż˙nÖń1jmĄ—ý ­őonżÍA ›‡çq‘"Y1€Ĺ-őĚ/ÝšďŮ–x„öKEĄŃ*‰,ĆŇS)ßyÎí:ä·°˛nęz_¶kměu`]D­ÔýzcÉΊű”Ú@8Íe”áç5}¸č:´Ňő±d J+´ÔÉvëÔŮPĘľĺ9Îűe(¨íyŤŔ§ĽÄ‘J(l‰*…ĄCSű# Ě\_^đ.şÉAˇµičWSě˛ĺ”[¸TVagÄ÷aT`qő&îqÉ@"µˇ´('Ë“\¬bĽňu#ĆjĘň1‡o°C­íň§;”´®*F,Ůź†ęŘŻz˙D`i˝ b( Rú‘÷:şÂłkŘXß~h)ńŤ¸,}ZMY )ý(/#ťŇk˘„­p€SĘâ ɉ' ă„CFĽĺJľw•WTÍ IDAT/}ĐHE±u|z[Őăi«€ [Vpâ)/qęź÷ä€SOŕěÓŹ¦iâŃw=DU»äşŞ~řą–őeg~Ď\ö–Ey’qŠ=ű+ţ˛Pq×~ycw˘Os3y;í–~ďľµ¤˘v,ţýŃÄ»şČ9čp+§Z“äojżÍA¸sW´ zn3PŕWÁ<Ăx^âDLÉ.Ě·’dc{ۡ“{ůô—€áöż°Ňövý©LŠÎĂ;=[٢ăPÚRť2Çž{ú†,tßč­ŢĹNÍ>ÓßßâB‹¬Cj$™#2´utpÜ›;Ex*µkşŚĎt·s©Ó/12éםÍ5„Źu‹WY\~x“͵˝ó`®![g67u—Ih˝ü>ČĘ•onŕÎ֩ĵćB}—Ő-gźpĐĂÍĐŮ=ÄA§íÇôG§aé0x´eh@ČdlYM{y‰ĚÝŐü-P^(+łÂ— H€p6˙ŻűľtéR (cK &™„Š LNÎ&ŻollD3XqŁ2HŇĄäş,¸0ł/łXĂgÓ6e.TÖJ@ây’XLR’/8ńžPÔ 8Ʊ;qo‹ĺxQ(4Ú¸ .cÓw•+>)±źßľń~|úóŹńM43ĺ‡Â>dźźĘ9r$ĆöŰńG0†—nAé´'Ćyżť“ČŔŇĺŤäŤüóU9\őË^›­-¬ŰzK*FĺŞçVrîą[*rPÚŁ-á5mÚů¨¸ůDŰŚJ„ôč[UNĚĎî˙Ra8ë‚4ÔúGžşŇŇ?đxLIËÚŁq€,lq ç\ ĎŻľ˘ ×ţ+Ą0ůŘ‚(´}\óĆ4ţ|Ž˝ŚâýÎcĐá#YźĽ˛ř-;W˘d2ę+izi˙¦!Iłw—?Łd6"¶›ţ¬6Ť(äń+‡pňÉăH΀IvqčŔ!”U—ńî˘$—Ő6˘¤¦+śpŘ6Äă'MĂôňô˙€ ×ݶgxűĆ®\HŃŇłe,©˘´lĂ w>í€ßĺŤ>CůµFuuáÝs+râYÄŞkz(o”4ĽľŁž|óő×ĐŐ…©¨Ŕśpf—]z˝>MËdV®J×?éŞ*ij$ÇvńŕÜn¬¬Yﯲ+ôcKs-híE `qă7Ú®Űŕg˘ˇÇżŚç?ë§qěBś˘X)ß¶®´Ń m+ý*eŹ! 6‚Âşüđ†’HŔ÷O7ĐĐĐÝóŐ;¶Âçł[Іl‘géż ň}>~»S«ţëQňěÓ”%’¨Ž€śĎ hLţž×ÂQK÷¤-eA€P I*•¤ˇÁ•Ss´zŁő$Ą˝G¬Ű -µaŃZ{oˇ őĺ®6˘ŰšÖ;EWDü‚Glx–ßđxü8ĺĄů$Ąˇ¶ŇűźúŻ;ŽŔóĐFjí>˝}&ŹŹ3ţč:.Ţvky¬ěLpďÜÇXŐľ !şĽ âgűßw÷×Nţ2Y‹wŰSTHŰK/ĄÉYťţř \˙îdäř›7Ż%Ż­ ťJ‘S\D»öئ+ŕŤü=i•A2ŕ©˙Ěá€ÝóŹÇ>gPC9`-»@hV6Ą E7YNm›¦¦ˇ_tŚ@ŽU6KůĂEÝXe#N2±iVRąşsŰu$7l çĘ áúŰńjëzx’3™P1žxóŃGéű·µanü;ćÖ[0[mŐăz­5#Vݦ˛ş:ZÓ‡3žý^湎ČL´SŔÔĽďa×]{ľ?Ę J6”9Pi‚ˇP¸ÝĚŤ×Ck#´I[ă]Ф3‚Ę ]ʼnW[Oţ}Ż o>Ź<ö©|ŚcG…‘ űĚ~âCŚŃ¨‚qdRš‡Čúť×;*üžĎ· ş"^ű4So6T”Ĺąćľy,îÇ­‡IIŰB:fĚÄQIÉŁX3}&Su%ÉíAŔÁŹćÔSwˇ¨(źläµ×ć0}:ÖdŹxôm$ó93÷@¦kNH…]€e9vĘo)ĐaŹÄŤ,_Ćöµ1ń®;ąŻö’tŮlG*Éź6–§1ě?Ó{˙e‡˘EčÁ׆=ĄbŃ›ŻÎű‘'Ěc쨪óňŕžYÝéńÜ‚é|Ú4‡•m‹"@ä‹´MďîN@ľď[Y;íTĚěŮäWVŇŐ´Ć…ńŇ”^řdÔˇ·őhň×­$ą`1^,Ná°Át¬jfQ"ŹäĂáă‡ńŇôřiÉ:f˙ĐČ•gîÁű_.Ü|÷v4ľ–DŇb”6eĐŚŇJ”0Ö*u‘ ˘‚8˛c/âZőĹěč<˙oKĐpüńEůÝĐĐFĎYÜ@ÇĆŤŤů°´ŠÝ›Wkoُoż^8Ú­ň‹ Ą -ŹçžĂ\}Ż×Źş¶†ëŹöX»Ńw3YĹGB˛O!ý F"Cß2Ź{®„<ĄA:VÝž3‡ÖÝm™ ţo‡|Ôăm°^şĺCšüĂŕČ@#­–éúěֱ豼Í#Ä)ÎM[˙ś;—@\°ë>ü,KÂĂ#ßĎgĐ1 9`çöhćßçśyhmxăî‘éÁ/´§Q—Ť>‡ ä8Vtx<6˙yVv4[?¸B ÖÁęy“'cZZ0K–bň M™BŃęŐtžs«f˛2·u*TVňJSś-‹;ńĄâ˝ŠťWľ‚Ť?m`ßáič[ÂE§î¤»ŢăŘG’÷Ř·ÁÜK’?M¨Łoßt6g˘KóĚk+9ýý ó@0†<˝ŚÓެŁ(ߏ&Ňó†„\O(ć«S¦˝*H%ž 8íÔޡ™qČP1 źţ˘e=űŻ]ŤoŇ%g_±TŐá÷Ü řŇKᨣ,ýńGŘu” ¦ŮwĚçϥ„ňrĘ®Ľ’¦íšiŮÍBŕ ŃlŃgśË°¶zĘun’é"Śé '5Óyńéo—8¦Äŕž‹~ žHĎţ‘ ˘®q‚Ćůĺ”-ňŔ׆KwO·ĺ6ŢöHzĎĘ ŰOŮ "8ož3÷qŁľŰťT\çŰŹqwés\ľn‹—IŢ,ďÂHÉ7ÝÁQ·çĘ‘9d!bôé“Ďóź~ÂơźňÚëGýÁńH«ŔĘ­Ď…Üt‘i€^ä)UĘ­ńµUl©41O˛WżĂ0Úŕë·]ŚÜĎ •÷" ŕA©h‚ۤäźBňŇA"ß’ą*-PÚR©i ­ZyžäĘ Ö˝™Ů˙ůBr|ômŔĂ .şDó:0f29~Ŕŕ’ľ\żýŁtĘ"^üřEx[Č…şµPůó1űě™ö_LA…żó:‘ „ýßüî ^*>€ĎV Öé<´T|ôß9Ě©+fdLńňs9ů¨1ĽţÁ϶LúKńco}ĽĚ-lăĽ\8b_Ëqřň»kÂpô5śxp-ą^ů±K€^ Çţ!ŕóOÉdŔ)'ü”7=Ó` qô‰tLľź:†!ÉąůďTd(ż1iVTţő/‹™ÖóŹ» 7óńý÷1\,ň† A·´PPĹņÎřÎéŮ^Ę4(G:ÇHźR1mMč.JvĐ˝CP# ŔĄ©"Aűŕ-ę‚~fI¨”mK!˛Íag~»ÄrÖÝĺž}â®ióyĺš5äÇ‹TŠe«ičWŰkű­úďVTU•"ß˝o$áň';ęf—1éű>‹çłÝvkąpď¤lfFcRřáÓ9oçĎŇZßĹşć6v©YKťFui 6Ą€¬TçŢ­íŔ„Km·´[¤űĘŕí†;î­dÄŔř]‡AäałDÚg+É…Rrëżg~´ć–eŘůl"n=×CJ-Ź9ůÍč!$7ÁČCö;VólĄčËT%Ťťqűé,íX ź„€ťýCVäŤ÷ßO X¶g­1…´OťŠhoOűÜŕźďlŕň|bAź©2ˇË?-Lđ­Đ`ŕާľ"0Ľ÷P}q6Uĺ…@áBýKšG^^ÁeqäľißŰcݬâś?Ö“źçGň#Ą$ű+ś3A°dcŕJy;A×bĽ]ëŽýov#J-٢ŹdćuĐôAĄw–P8|Kü‡źeÄű'S¶çc¨ĽĽ SĐ}Okë•Ë%·l|ň)f·Ý˛…GĚSOe)h®Kŕ‡Ű–Sß·ž4Ć{»¶Ś«áŰ÷}ŽÚć'ô8w˙ŔA‘îŠď–&űý•¶ńtżx7‰YŮFŘYÍš!G Bă) Ň uÉĄ¤&Ď÷(+Ő”ŁĐšluÄjݦ˛ŇZ:]^ű>AGŻÍUě˛MŚDJG&ľUt˘?ý9Ńya~ŚOŢî¬G?éH`ËQYĹ×! ÁC~Äy玧~Psç6ňź—żv€FĎYXÖDßś`ډĚýH¦­m§ł3EÝŔ8lׇřěó] J­0´”2Q8-WîĎč?©©ŚĄZĄzf˙ĹIË_°XJ¦ü~’`Ż]|ŚĐiěŚńÔü7xŐ,´ţ :آbHş0K„rµ¬Čąeem·Ĺ´µc>ýsä‘ä¬_Yˇě Ů ©9rďa TÁu÷~€T´Ejmm©”äŽG>Ă÷ Ą¶4ŮcSWrđľEt&$!ŮËŽŁJůŕëőňS+Ă6Ă ůhf aŢHQaś›§üL‰eŮQiň…ČÔŐ"ă(*•V[RʲmŔ5·`Ö¬ŠÓëę"żłÔ ňéÄt1&ŹL_´‚Úzjî ĤĤRpĎ=VČ·ß‹Y®ü)S0ź}ÖJě0ŢolYUŰ÷ę-OłźhŮPćü}©đţ" EîmÍ.şżëüO)ßbçôŔ¶©(söđ<6ý,|ŁńSż»ď V¶·ˇ¤ŠŞč„Ŕť%©TF˝yVšĽÁů죏řđŻ_0¤ ­Aš°5¬ÍçÎĂlł0 XiCEI·N›X$ź…"K§đŠ Ď%BŔ“O}ĘÓOŤ’D˘“ˇCűŮ ĐHsK-ě:ż·÷ĆZ0g"mľÚ%xzQŇps˙»ądé9ÄţĎă…ş‹ŁĄśÔ]7tďż@ľëwť!ż˛[˙9öĄä}!řďŤŰPQ<‘µ‰B–´'¸ać~nůž Ő @"1…D9ŕnöOGśRMMxW\ArŮ2‚övJ?ů„Ž+Ü$#ĐRᇬĚŘtoc ;oWOqAÁӯ̱‚.ěš ýkKůĂ#¸ńŹ˘ôęó?aĹ5…,^Ůil©l łŔAÉĂ4niÂ1`KĂĐEĚyĺâ ´¤_ŃŻd%Íd…Ő × üż·fm”·kB>±ś~x‰őxA+Îc•_*h\ťeBďjŞ!7oůrhm…Ó(¶nP`¤cUý˙ňüA/÷— |ë$ň<›¸‚/ҧçűW×îÎŤň „‘(„‹ű‡±ăô®ŚB#-@k4’†ĽśLÉęEÄkjĐ••ÄdĆ”nM)đUşô—Ńڕ®;{+Ş+ň0¦Đö‡q`cs˛+ꆎZŤ6đÄäá3!áXműX‘!ýÝíą$“Ď_©K(ĐíSS B’Aş¦K&”8ćÁŔ*Ŕxv@2DK© Uĺ¸ĺ™ߥĎĺ ¤ˇŻÄ«Xxµ…3Ó»üHE]‘ 0GDł}Żýoř0XS^ÉO‡öeŇéGÓ”¸ýË—X°qA°Ťd`imT4µ»üH°~®~ýVFa¤ )şşšXy9k×0Ŕö§˛ĘŇʇf|EźŢúdهWóá—Ki¨-%•R(c¶+pńÄťąE ©@ńŇ[?"EcqÜż Łî‚IçUČ Hu±–áR˙Śwŕw‡bŞĘĐŹ<‰>ů8Ś1]šőĎ;â1¤Rč^F]x.Ş~ę‰G9ćĽń<őĚ$ľŘľlŃĽÝŞi“ÖG‘%‚_rXÁřJI˘U0lĚ´MC/;úä@\h4÷^1q“P`c`ms`…6WĎ*»vá7íśöĽouéůÝ 2 ĽĆAyŮ ”7§9sKIE{WíŚ]ФHi· .»ŘŘ©Y%kV;iĆz[ş´K“Ž^Í1›ż_ EʇÇĘÎUhٞ^E Ru4” H›­VŻOşre —/ +š:3ŠŠ*WlÔ“ÔUXůíĄ˙7Ů ô|ţˇ0 ć˘/ą}ú)迀™ú"&žKë˙­#Ţ'ćŰŠK'ś‚šńjâ¨É—cŚáĹOaĎ©†ýĆ®b§-|Ĺăkß´;(ą¶,ÚŰ έ č_0ó Á3ď6°>ßnPXˇ·=u.ćďÇĽMŁĂä™0‚!mˇü* ¤5Ămił ×ţßäŕťőÇhËÖ¬o˝ý‡? >]VŤ÷ękär¦+…ůx6ú#Qyy¨©Ż˘Fʞ|NV7n{BqĐnŠ#Ç ® xyMŔ3ë$žś\plßť<üDŔ#˙ôígź3®•ŠĽµÖCŚiçĎÇ\tćöŰ1çś~÷]üx<-€žmm¨Ý–:dW¦§1[ůĂ]ş„p$ś Ů®·űo.žź1î×ÖĆęŐ«{ EĺkŽÉű‚"?ĹGń6Č\@Ećµ¶\ vąčDu´Ył3šéeD€!řDXc]ŕ—DBedíÉM<ł¶íęfPś ôĄ~üuĂO+ }r µľá‚{ ĂűΞ=HK•_ą«Vżć r€ö5Ť,˝|ɢ*_ů´µEËc…Ą†Đ#ľŔ÷Ľt„Ŕ> _ÎZL*ŐÉč•|˛pC·’…)đ=ąĂŮ´.^HRh>ţb=CdŠx~5sW”0¦¤…Ť]Šo¦/u\„GŇoĎŮcNn0űímyôŢk9Q}çy4ď¬x‡ßŐ€Äb6ľ^űľç1¶b{’&Ŕ3†©‹^ćÁÇó<8ë,¨©‰äghéP00¬t¦+ĹđŻ–côj¶Ú}oL~.#űXÔ¨˛QxžÇóű=OÍń5˝ČżžĽ|·ÍĘß?ÎIż'žý•ýßsű_‡ŔŘmP«˘Ďý ú¸ă¨>üP”_„ľý$䇣nż‰°® Î°4”R$S’ß‘Ěü^rŇ!‚# ¶Ę(%Q0ďű€»ž|=Ď+­p÷Źg _–éň—ż`î¸sÎ9)Sş…“ŇP¢Ž5äÉj D2bo CJjâB“ZB»0“¦PKŮäýa§[6aćÖeňزň;~í&‡1sŃÄ»ą;íVvţźÉßcjăF;˸˛aĆ­CŤ¶GťMÖJ++§föLë‘®RQXXsł€ ± 2Ëyšůţv7Üř´áĽ A`řü˙±vŢaVU×ß˙ś{ďô^ˇ‚ €Ml(5¶Ř°cK,Dě5ĆŤ%1Š-¶¨5" ( (Pzg†6Ŕôą÷ěöţ±÷ąmîX~yĎó\náś9űě˝×ÚkŻő]ßő”áś#2?ňŢ?ţ*ůŕM¨×˙÷‹QdŻyoŢ'ťś‚ˇŕţ.i*XQŔĐÖcpĎ|ŢźłŠśrË(lŠę`Đš^Ť«ŮejŮstě*fĂ·©(ÉBÖô'ż°ťqGTÓ·Wכּ–Ĺ—cb·3€+h>ä-ž‘(köţĆ÷X޸‚ÖX3Uů=©Ę-çó­ź …Éńri‰µđíÎoYÝĽ Ł g<Ł“ňL™?/˙ ““éŃóÜ4Ě…fěżµá0•×_‡Ü´)ác‚†ăŹsźťĺ)‚Š<-}˛úöăŰgĂíüôńOVnü“ť„J)[Őéˇ?Ł*ŞŕÁ»ńyń$Ô “÷ĄŚź6Tką ż[-ąéo‚ű®đÔ×nßÖ­ńąünACŁŻV8”#)ç ĽĆ+üż˙=ć‘G0睇ůôÓT h,ʨyÇI°áJ̦őÖ|óG™ź”I6µA IDAT€ĂßC}ją…Ŕ™ď˙c€1]*€ňH˛Š7šű#Ȧه!áŐ™Ď}č‰Ä¤ů÷…Bôw,<ŐŰ:[´Ä×¶ÄvĆk´¶ćżŰx%V”ŻĚ± —˙üǰl·…Éţóż†+~“úü,Ř0»†•“uä}tŰ˝ž¶HÂń—HÎMč%žďeĚ]XŹĚÎç€A‰´ô—ćW·nçŢ’-Ômi‰[}rÁ˛8(E|Óč&čiś‘űgú_«X~í_ůkŻË¸yÚT.ř>ĆŽé5_ůT} J)О U5c _±MwYą˙Ző§÷˙ŤEC¦Ż’Çďśs0=„YżŢ.f]ĚźZ'HÉ×7˙+ĘßzűGÇÄîÝ?}üÓ€'DŠPÎ PJˇ®›‚úçsč+ŻAy yŐÚşůF{NR”Ŕ–Ľ“ř§w•äĽ}«}V7 ”ňX#¸ó2ź??#řz…Ż\  ź5ź»'ÔR×sxlëálŮTÇż|sŢywěÍd?˝Ń:CśgżwY/_:—m@ˇ(i÷ě(·WŇ_Ą~(eA.-©zźćŇ .eÝ®u‘č0ÜIi·éµŇĄ’ (ŻĺËI‹YśTJ‘eŞŮV@;4×r`?:™˙Ć €çy?ĎúpçIGŻ%” kż6:óµÂÇ @IËO‚S.ůď^p‚ý~ďS†ü,ĂW›Äţ4é<ëőîęS› ĺWĎf÷í“iĽę:˛üh'á×Ř-@řŹaî9ńęšę¬ «µeąő–µ^ňŔ·ÂąU®WI/^şő%.ľňŽ?¶k×7‘›¦_ďb-ŢJe·ÇŤ•üöXźś"Áëu>ŹmřZpaĄĎ™#Ď×ú<đśŕ‰×mÝL€ľDj+ôÉ \µg]đ/„Ňdąß„ÔHă<üIɉđL’·V$Vü`˙(Ë–âPQ»—J d”WvĺU©,ĂNĘf h­ńýĐJŽ#VŚŃŚ”‚ލ¨-ă[G3ZkÂáđĎVńC’€R»Wćë´U€Řşsŕ KVWc¸öĽ¤Ëë|˙@¤Çüäü™Ş\LVéwţ`ë´_Şb.xéo¬bHú¬H¸'ţ„šę"6×µ8ä ±¬AIĚAŇ9Đ*ĎŮÎÁww°»5Ě?ž^Ę/ýř†ůóçłvíÚřĘäű S5ţ.Â÷‘R ĄbŕŔ¶¦L!Ľyłětę”(Bâ;JÁ€°x1”ÝkçĽtcŚ5őŤqN?•äĽVq`ˇĚňgŚżÉeŹ ˙-w˘Ľuŕˇčiˇňsâű}uÔáč/Ł.˝ }ÚÉ艠Żü!ç»(+’ś}®`ô~‚í-‚Wú|°;‘˙pűFÁÇ»7öňąîRÁ衊ÎP°TË•…Y.NŻ.śIKî„_›Ôl.#$^÷j~i*;÷ąŽó&pČA·1ůňqŠ\íV2…t`˝jđ.ĄL… „˘1¨ŞJ˘˙(+uP[Ď÷‘JSU–‡t ‘[­·¦2ß)‡€ŤX9fbPĆőf†ńďrţÔÖv‚˛«u›ěŞżj ęľĐçśßëÇ~ZŁr#č§C˙ű?č[oÂĚž‹xä!†”ŔŐçH K«™ß xi»b›ô.J…ÂŻ’«ë$çV*ާąŹâť÷ÁcÜL“@ëÉTňČ8ˇ¤ë<_»îÄ.r“3"äHű.Ó~ޱcéĚ7™ţ9ÁŽE‹Q[[KKK ±­Äz˙űËxőýdwłxPżąŠŁöü;}Óš¦P¤ăWĄ"¶Đ.´óüěIűŻO °¤ľš3 3®™AM~M˝§µF6¬§×ŻNď´˙Ö«VŮ>IB÷uő9SzM€hIU/ Ůěď."EEyLýOQwgõI'%ꬻř-ý,Č<°?ńhŁł” że:`@řćtßÎÝbiYCwě [·«2n(łĚ8÷0ţ/ĐÖÖé·źĚ ¬5}7Ú˙őhJżwŇűM†@ (šc[pHŇ”\:®4ů3¬áÜř}BI÷LVrÉHŃÔ«áţ—ŕ‰} ŔŐ,Mßażżźď•łřq(¬›Ţ0xşÎ=3qúľ7Z“®—ZÇIe}|W&M$ÓśŻlhz#»S{cn˙Ńh'N+Ĺc«Š;?őO:š+ÖŻ®á^,>ťÍ>S?¤ Ĺ»ýnfyq-W?˝”ëJW’‚[WV2y”ćÁyź5$V$ťtű[xÎ.Vă14bČ$š¦”{Ž'm?‡Ü»ŁŹVŇX‘éb»ŁLBó:Ť­• |jYÚĂŘßEA|1#<‰‚‚BŽżGŚYËŕ° é—VyxŰ· AřäSńúöĹ‹Ĺđ_{ ůÁ6\"|űruémůíh ©±±!űŽÚŹ5Őżü3w.ĆŹbFíGżë§pÔ±Çňß·ßfËÖ­ôěe«ĺ]zYg±ÖaĽl‰—űµUÇcü,©Îç>ö¨}ţ…üŻâ´+Cq·b[N[k@»2ńĘčřďYd_’ÍôGËąĽv Í ´ËuPQIŢ€>ěذ!¶ µÁ÷%Űţ2ę č˘lÎxk7”\L"ćb8Ő<Ékúb|cěB %ŁĚű ßˇQ—ĐjBĽŁOÄs€tŰŁGj'Ń»|[T,Îó%Î<ŞĆž™ľ…5őQyOłť„ŃŚ„ă”P0é€É„Ăan™w+Wí?™[ćŢĆqŽç¤˝NĄČËÉĐ˙©2‡˘ş-Ű€n‚ÓŠ˙¸C°lµ@źÖYĎ“ĺ5pÖŘSü€ŔěrPT@+Eää“Ń+W2ńÍ·„O>ńŃGčÖ¶Ë)čżpZ.ĆŔ9÷ÜsÉ/*˘ýąäΚe3ŢdŘěĎ)íó"źq&Ç Ą¦§Ą×RRř·G: 5€|VĽe÷’/„¬ ™Ď{ěQ·e•ȨdTů(jŞk~@y&°Q…ُeţ;„róxí{*&,3Z»qxź\|± -ľo0WÝLë»oŁe”‚ďFĽ˛Îő˝¦‡YËťú:0Ď<-Č3M 5ź`QĚfö3ď1GJ“.¶Ů…AxĆm1}íŮŕ„T„B×MčEQľ Oßpn.ýójv·*ŚöŇ#¦=űBˇ8‹ťĂĚ5łřvëšc-TŻžÉo÷ť`k5$ť'µ#eŕ@ĚůçcyŢ˙ÓŃnyř¶ďŔLş2łp…9:±oÝŠiję\XXŢ?SSż^kM;ŰEµ´Ć-†–쨬\ŚPloď@ůó]2ŽŃXÜ?›Ěęj„Äë&0ałŐ&ď„öô1˝R·C:`á‘/¦üâKhúŕȵ|Ĺ'źJŃŃGÓ8ď¤ßŕ(Đú—?S¦)ądşµ…¶>Jţ”»ŃÝó1Ńë­/ˇ˙ÉúsM“&Röč śl:îľžÖcư¨~±vzö˘C¶ńâ’ç¨[ţ ׌ąĘŐ34ń=žÖšPV­_~băĐZ!|Y’K÷”n<|“φ-vűVYâ3é2ÁAą˙†‹|L“€ţ !RA·JBůůĦM#ëÜs1……PY‰Ů¶-UřÓú/yü+++ŮPĚ~2ŚĺqŰľWRËaʦĹě““CAĎÄřË´$ˇŃvŔâÇ`ëfű˝ý1ŘďWe<= «é„•aţj­i\¸—úvçó•M +´`¶Ď}Á—ýËń}‰!†ß®xfáł”›€Rš­ź=†Śbo®ÁĹoĚ#Ľhţ@ĄŢ†Ô†f1_ëѬß`·.ĺ{=ŚáúSćń޶ŢFńµe7’Ę2+ÇÝ+˛âÂoڎ¬8L÷Ň0ŰvDńB8‚«Îť.Ŕ·[—đţ˛÷ŘŐ± ­4o/™ÎčęQ ­Úéůíŕ»ď,lňŁŹ@řÁśpćŇ‹»Ö IV@üw tëféżÓ ‰ p˝Öšl ˛őąµĆóđŚGŁ`„”˘Pi<—‘‡°ű!O%&O2««µAŮŰÇ”‹LlčÍNy¸öh‘Äz“ÄęÎ+&T\Lń¸# •–a|źâcŽ!TZJ(;Ëňş%Y/ďŞaňĄżăń9QŽ?pOަ<Ŕc vűšKOĽĺ)¦Lk&‚Ď­˝Ä¤7}š}˝áî:űA(µ `d÷‘(ë›Ö#´Ďá|Nún ŤÓÎFůi`Ó• Ň»–ĺď.„›@IIMąäśrźesăżďü—ş>ľ/čQéóŘźĺó}ĚŁ˘5Ţ[·!çÎ!râ‰Č3ś~:zË[’:iĺOď?­“oçÎťäÓ6x8—ľpvsŞhŚĆXłßQ îhˇagŐŐŐvţtĄÂÝ v"ř«¬„őźŘĄđC*VýáOžŻ|¶™GI¤ôYŘRx#XöÝf|żßÓčć´“n%(Şˇ¸Źëďpeĺ$Ô™>irâRZ`Çb·—Oh„Ŕ(úÎGĚX@Ď-ă…94ÄłüĐŠšż<€—•eź+ÁËÉÁ}^xUʵ n,îSĹłs;řŐe¬ÚÜÎ cL<ľm4zr3Zi~j KV·rĹó L>§7Ziîg'ýFÖňenúh ·üâ6n˙ĺíÜőĆe\µ\pĐ&‡€Ěŕůx!!/l·Hˇi÷ŕ!8µź Rďłtî8Ž;á,vě‚čěWÉÍ<}…Ŕ›ěc¶%Ąr'AQqăďżđŮçž‹©îAdĐ b7Ý„ihH0&‹Äţ߸ţ 9 `ŚaĹŠĽúę«ě5tău_ŻČÇß´@G”#†ĺ0îđĚžő6Żżńçź>pZk®žqWg6ň˝vúĆFb€Ť-Űh7÷öd§s8bĐ ‘ź~Š./·yůJ'»´u®ˇ-éL¨°ÖÇ|„1ř˘”řBážFD5wťŃLÖšGyňóU()™8˘S~]Ă ÓiS¨ĎÔđĽžĚNSDž.`ťŔ1ćź›m|eöçóóâÂoÉ_Đc#]TI:BťÝ’ŰŔ'XĄ÷Čkőlk”„<–URÇHÉ Ŕ źđ0u-[¸čµ PFqᨉŚî3Ąáů‹h¬Şě!xh|6B˝‰˙Î+©Xüx(Ĺo(©ĺÓ;>e÷Ç»Sţ 13q˘ĺú˙};é~ń‹BpH)Ů÷_‡qٱ—łĽe…C˙ůřÚŁóŘŻ—Ŕó~łť‹đu»…kĹ^%CXx϶‘ENR8Ńżű„ö¨ŹüR ›Ü*&SˇČGđ,¬ĹÝnaj=Blr…/’pŕĘ <‹TŠ~˝ ˝řU¸ď{ÖÎ=€ţ§ž3ÇWqřčR¦˝µ!4—ţ¦­ ŹľĽ©4לӛď×µ2ăÓ®?Ż–_üŁĆŘľ¸~öuôŢŢŤ_4ý‘U}+YŮÇa(śÓÓăś<4„óňŘŘs=˙<ôLćM“,ůV ô<9ô8ćüoîĽĘgŔ ą0m+–E•€.,DoÜHűÝ÷ŘH€1Ö6ČĎÇdeĄTŐ.¡ËĘâ‘q°ˇ`c }<Ź!C‡pÓiřvTR†÷ËaíÚĽöď7©¨¨ ´Ô&I­yřÓg: ´Ľp>ą´GßD«v2á2yAp}» ďcŹŃž”t·\Dęř‡¤ń›o€±NđVde€VHĹ-ŻćpĐ>†S÷éO›€Î÷X»5ÇÝ]SŁWqťľŮé=ez…z;Çi”ęÍ<©ndž9Ô:5–UĂń»ďcĚ–ß3pó”óúK!ńW >ž'‘B±§Đ 5ö˙”’(©©ÝÁÍDűßLűŤ—ˇ6®OäÜA™ăU)~ ďĺ[1RŇTÝR’HßZšg,´ `w¶äß§Włx@Ő‡â:h¨2ˇÓ  2±HVxśvŢ©§Z'Žç%ˇWPZŔĺúĺöIaqZ°n/űą‡’tÓ…ca—ĘH´Ň VpËĘjáÇIPäunµ*xEIPd•E¦f‘CQeV<Ť9™ąH8ŐdFUĄ ÍĘ•śrTŢť×Ŕ¸Ë™ńé.¤Ňsp7´ÖĽ5§©4“ĎéËşş^ťµFsÚQŐ<óVk–Ă~ĹŃÓ‘ąłş'D•q°kâä*ĘqçUx´†·©‚Gŕ÷K KŞÉÍ<ţđžťZCÖ'ŢĐ· (¬˘.ü˛ˇ=#6ĆďŚ&^E¸Ĺe-3ű˙6Ţ[¸KÝř÷ěŮ“ŁŹ>šm۶QUe)Ă÷®ÍŹ+ýîÝk?~< <8VôÍt‚m¬ČGr»uuJá VŁ=ÉŁ•Őô‚¨T„’KËÉťX0ţAÄ(ä& ŠęŞ"—®.‰Ó¤kW YHľZ߬÷-—Eł‡ »ů#5Ú.ÉzŠ×ÍůÖŞ7¶„ÔU|f.BkÍnSB?mPĆBą-«·će>"k㑱¬ÂhN˘_3Iă§•‚ŐŠcp ŮövĽŇ2‚»>€â‡„ŤýÇ11żÍ†U˝{Á\w–ľ·+BŇ4DY2”nÇÇ;ŇĐ}-F›=ŘwÚľ ôÖĎ˝!lYÔ Ůň/Ąöçő´›dzĄ#Wr|Ćťş'Ľ¸žŃÇWˇ5|ůîZŔçüÉĂF}^|ü @rĘ„‘Ľ1·ła-Gź>Š/VçłłöŘüohßšÂ.j'Q÷Ýdz˘ŕ˙tü>0­řô§CaMhC5&ˇű¤»żźö[2PkŰŰeii't_€ňÔý&ăh@ ILJ 9çĂkţ'$ŕŠ«>¬YT»Hoč1Ŕ%Ŕ“úo“»Oď ÷Ţôl4¶xśv¬óč;/˘V†¦&şwŚań—šü7…•¶ŮŢi ·Ţą}Ę·3 ˘ž˝Wóņţ|żĄ?ëĘ‘)¬Ş©Ĺ ^ąĂvŢ—ář<Ť8¤ć m¬śUJË6%ʱńć–ŨŢHAîjŢ~÷zŽ<|0ł>\Á·KęŘçş]¬ü‡ˇČ­×Ă‘źu EýńŁ ˇšŰÝ=MEŘŘALAńi AV-h^ň 46Ŕ ·Ůëµcĺ•Ęîő•ÂSš°rfmâi?·Ţv/­Ŕ¸4VeËm`2X”•{×R˘„ŕÉéÓéCNiWG|×ÝE&Vpü/¬ľ˙®żăA»ĄřĽŠ)vÜ‹žQ„M !“EßI‰=°’eO˝…1Ôo˘)O¬űťÖş äO±HŇŇR7ţî/Üy'fGĂOo˙_Źgäŕnĺeńń×ő´t»ĺÔ6B¤SÇ”Ĺe ŠlćÔÂO©ţ#¶,ŔCSŕ*0ojĽÝIýçK@Ł^VOű˘egvlDZS:b•¤ýZśŠˇlkÝkJ$RŇ´÷ľÎYŁ?#ńĄćÍŻöKĐB)—Q&J@JMç«1耒Z ŚV´nUěXćŔ ÖR÷M.e˝šPľ˘e»fÓâ|ÚvGý¬™5k\Ë[ÓżEHEŹ;î˙ń8°ç1ć‚?đz]IƉ đÍ7߀}Fßĺ9ß¶^NŤ/ľ°Ű§â'đÚřö7W¦:+Çç«ípę §bj÷€Ę*+üĆ) ŚĄT˘TşVqG%%čľÝ‰n°Ŕ‘.üľoW|'řJřV 8-ÍŔaüČ GlÝÝĺPňáőý¸ňµD©¸8«ô\‡’‹¸^< BZŚb{ť˘_ďv–/‡ÍőmÔô Ž_°ď2~˝Ť¨w~˙‰!Ažó&NIŻR"d€ÂKůÓŰŹ&'Űîż=˛łĂń_)C»đđŚÉZĘą%ď1 ¨ 3đĚ! ó<_ŤŮnŕ ćP% óľŹůJb|Ěx3T`îő1 ô±÷Źž]›o`?·vh冸óÝ´ů‚[Żľ…QŹ˘v8“”1BhŹY+†óÁ÷JSY®P¤˛r…ÝÖ ĺŮw 1ă2˙´Ë\RÖë©DZkr ŰvJŰs¬aȱ[(ëíÓĽ=b ‡ ůféffĚ\Š”%őW˙ÁŃ{;N˙`ĺWv%ŐÂ'«ş‹ţţg0oßFkÍÉGźĐĺ)ŢđÇqllmŤi$'ˇřZ¸ŠË© G}‹Křhěś~eee‰ÉcřI¬Čx±ĂŽâ’mŰ(ěÓĺXlĐ:Nu„ăź]NąŃšHv6˝?űŚýĎ??ăsUÔÔp×íwpם·ł!§Ír¨g84Jî,.\wÁ—{ŰäˇýúdÇaąVÜ.®ďjĺLż· ĹÉk¤ÁÁÜYyŚý´Ť„äölÎ<»íKG1/ąÚtZí#w F>ľpyŃfľŞ–ŘĺßĹĎÉÂúBIířřůň§·ß—¬®kćµ÷–SZ”ÍçK·Ć |FE łťł >d|ůjĚŕ1c~‡©Ú“ń¸ăˇYüu4x}D%fŤ„•ł—ŔŚŃvÁ1;}Ě.sźŔ´ű{ !ťötiž±(äöńŘý˝ ÉeŢ5.‰‘Ó7Lt(Ď „A »Ňü{´SÚÖd}RŮýş §Č¤"“*©řdU~ďów´9Úb ÜŢ iWM%슚ߣŤďŇgÔN˝r%9ÝŰio(A‰«8v>J¸¬" ¤tćŹ[ˇ]|e×ÂÜó—çđ}źSĎĽ˘ë“˘$Xau"„dť–Jłd^CZ&dőSˇ¬•ŁFĹ9 Îő^(DŻ’®­ź™o˝ĹcŹ?Ɔµë0ĆpÇí·sÓÔ©™ON‚bĽ¦ŹO[®@IÁňŢ>Ă—Ś¬¸deYŽľHÄŐgHKÍ k„€šôG Í!Z)µ]@”GáŃvË%·…0Ú·«~<<č€Iu *ŔÓŕýmŢĽăÁЇďG¬kOq(+űŘD2€áväZ ýx!™@éhg ()Č)‘ĚPšö¨ŕÍykă´c1©4GD>ĺw é¶×PĚAŹcʇ°qGŚ·_ý–oW7đÂ]×đW 0íÓ*aÄ,v«ţXaCK|L›ŔLő1µ>¦X@±DßŕÚŻ]lWHC¬ě潩Żđŕ>Ůaź;|Š1˝„ĄĎYn:íj´anŰ3í*†më-ă­´źßĺ»–‚p¨–łhĂhGĄĄĹř«„†ułóŘăĐ­€5iEłdé;%Î!¨ř¶˘˝¸ Q_OJ!Źxç'xţµ«`¬Ą$«g/<űżëÂX8}_-Z„ćżńť<®Ka ެ°Öđń“jҧԨ7aPä(µů‰ěVö†Ĺ‹)čŐ ĺűqĐP°ĘÇ-€¤ď5ÉÉaă‚®ŮxN=ńnľőV>5›ň˘R[Ó©WG27ţVř4 aň]…™EŢU_OyyůĎţPú /„ŃŰQZÇ‘tRhŚö‘Ňă”9÷"„ćě!“0&aţs@Hk$€Ao‰YLůţ‹čźß€4ŕ/mI#Vµriü®8UPßâăöS ŞÔ Ć€™2Ţ~ˇ4!ŞÍ&~[ö9‡Ś(ÂŚ™JGŮ(>ű~3ž˙„ą 7˛uG+µý\Üţ`0%fąÄlóˇĂ:řLŘÇ|&0ĆǬw+˙+î{77\ ˙ ‘ Öś/¬ #dŘţ…`ĎĽ'~‚%±/ć´= Ť.şbL‚8B›”ďA­@­ˇ,ĎpýĚ0—Ü<šc/˝”¦uë¬wß!ß‚˝ľJţěţOKIIm-wg(¬ëë6rîçRLgÖ™äCC.ě}… $|ö˙"±¦żIPät(ëOż`k—Ü9©…Ćź3Îř±«QŇçwZ­)ě'mĄ#ĄUp[ęŃő¨G×óůL% ;[s¸oÉá\ĂłńH€ÂŽU¦ö+é~Ň60uű'µD…ĄK—(Ąi!"~'}Í9ű*rFžÍÚĐŢĽż`ďĎ{Źď×5ë°G8;LČł×ęĎŔŰW`ÖůĐ[b~ăcÖ Ě[®ĎŤŔĚö1Ç Ě$󼀯$¦É±R mMzí2”c‡ĺÇwFf‹Ŕ(ź ĎĚěhćËeEdăŘt“ ą B|•~ęŕV€ń鬠$~’‡ŰhA^YŚ’>16,Ě%’Fć"c’Ť‹Şé5şŤ«BxžäŰnÝé{×ÍÄę6Vh·&_Ŕ‚·¤"§Oćżôçß3,óĚîÖŤśýíŢüíÝ3ą˙•2ž¶ (i¨m ‹#0uÓ“g(®‘ŠHžbOř ÄYĄÓŰźĽŇ'Ţ«µ¶Pvé´ŕÓ5 md⨍؟…ţ^LŻy g±{wÂ…´C‘PĽNˇvŘ „‹%ć"ĂćiůŔő˙Éň1/ Ě49ĚúX¨ŕmG€ÚÖa']Y1tCż"8ŞďůöŢ–U ‚ŁËĎ`Vő»„„GŘÇjmµˇ‘ŻŞš\-\á !lŇŤLh}­UŽ©±ćŁgů‘Zz ;ˇo˙SAVB‹,”ö0!óر2LIÍn *b ÚRGveUĆU$ó„‚ â{đKŕ‹)™C€í†Xű®Ä÷‚ĘLgú`·#ŐŐnuSqE‡ŕ [KçÁ÷”B*ĺ<š!zŕ(םW[Đ^üł ĽÝÚs+Ń6Ž"$ůŐŐNŮYL\$aŚ”.IĆF $PzB˙ŚŹP 9/:<'qč[ćŇrň‹źÁĘëĆ?#”Ü?ĆĘlëkęQ‘EPušp čn„‹mją1MÎ!»OâŮűăŕŐ’T°ëčĹöóýkŃÚžI~ŕ°>×Îíďž×ÝÖ40 h»T˛3«˛ŕs\˙Ý úĹľď8ç>ncÝĆĺOUi%9i™„Ć żr¬Ü}<„®—°©ó¨€:˝\˙’ĐOXĎű* ·*¸ZÁŻş7xG]Ófv¶6ÖŚŇZ`ąV­‡ŢöR(ń\¦†íAXóÖ´=:ˇëHúüCđ\€F*şOÄËsé€âČ!u„Á9.€ŤżŢ‘™âŐ>\ü·#ţ'$ŕŞ?|XócđËô> ^!`üťmVť µ•$ ¤ô6ř@J5 ×Î'Ąý? ©ŮůÄ˙pÉ%–f×®Ć<ů€ěM›lßH™Â€ü–ÂŽŚ}n)%ˇP­5cÇn&uÄ%;?»ÂÖ‚Ő‰×Çă:·aÂŇŘvąNůÝ@˘ĘRţIz®@ýD.jŁŕŕ™©mÔšÁw †Í$ůŕčâ?đy}.MˢŘRyéÔĚé,ËÉěĘĐÖ¶}č·3ô˙gîŮÇfč˙0°<ƤĐÖJŘ4 jňÝOA~‘ů•-˘k zŞ«4.höF§’Bj Ě6 2é ´ÓFY§űW<ĚcaÓ٨“Ą#|qkj‹(¦KŐ´Ř|ßҤ;?EĘŔěq0D%·^8ú•óĐ´/X0k%hŤÚuZk˛˛ţ´rć•Ç2rď*®=˙ěPĂßŢ´Ń€€_+ůáŇŰśü= äÂĽě›ÄMŻ6ssh:ĹÉŐő‡rqż•{P~ý|˛zФO¬¦¦7ě‡:3oę†  řAA^I0;iC‘ţXG&ýž|ýŹ)’ŕúáťZmŹ,BV]pŮcB­ŮR˛íµ„ő֍˛˝˙”gŇŔXP–÷5Ó_¸€cĎşŠ–ŘŢń3đKJÓÚťüţÉ>pőiXmś ŘźţJźżĎqŻ —!}Uňđߎă¨A>5ăö‹·'’Â*«-«liNŕďtP°$ÔW`ÎÉeĚ ĄőH¨Ë]ˇI­ů=e fˇĆ‹jnŇ…´Ď;¤‡”aądÉs:ßż+V\©đB¶ZciD"Ą9`…}ŇB1şńڱôŐ•Ĺ‚ľ5‚ýzůä!ŮКÌ…šŤ;ýwĘňľfĂş0ps>Ě×_n$;{oľ»/«Ö–3ě¶6rÂ*ľ•JŢŽ¶Ö×3fřpNž8…éĂak©Fű?ŐřÉé@;So:‚â‚rs˘lk(¤#˛ç/9¦żţU/ňęבýđ_1§śżH «¬«Ł´€°˛Äŕĺ ĚŞÎPF/Bf(­J·đ¦Ć-r˘óá®5ę:hP°K±I*š¤AÄËř-Vu†R¦łâ*…6‚‚BÁ„îŹlhŁU šc>ľIb…Ť/;†m»ÚPĘP]ę3¬¶Y÷=--Őx”Ń{ŔŽŘĆ´­˝X_˛hĂĘB,'›UnuŰ[Y˝i7ĂvcwS”Ć–X| 7Ô7ŤI˛łĂ¬Żo¦ş2ß…$d§µ_(„(©8yŰ÷ÓľłaC_úř^Rű#đtăŁä¬,#ňůd5µ ŰŰÉ./!*BŘc~ŰEA+oZö5EKÉęukŮ^_Ź‚}öÝ71镲Ĺ5»„˛ľNm›·&śk żrNX°ů™((ě]ĂÓ$ Äjs±lçUwLÄZřqš·¸9ć“ÓŘ‘ÄęěúϱJŹSŠaBđ¸RLu~;…ŕ_đąđY‘‰UÚ@}óv”Vt¨ňŇ|GÚŕŻ]Ź-ó.×TŁ?^18‘ů J˝÷| óŰA+Ž=l “><Ť†óÎ'—)ĺć}źpŻž¬~ůú5&ĽRÇ3*ö·ôfĘaKRAe Iď‚Ţnîg“ť%xě«äćtpĎSG˛qCB ňňÂś=qcçRüŔ-9ó⎽›¦˛ř† DĐg•Ő ©Ú(/ŚÓPŰĐ\&(ă¬ÖDa,/BłhfKGŚć8ď¨)x„yú«),‚ęĽJ˛Š&1tG˛sĽRg(ĚĂÂ’$ú6ůHř6D‰Đťę«k ĄýĆ*­ójB<]×AEn_>j«Ä×sÁÄÔŰ㎵‰˘ŁÜčDľźÍjźg7 bƆnŚÚ«„ŮĎpő‘_pĺI†‹v”RYŕK„Ôś2nzv/"†pŘŁ#&â“§˝C ¤âú ÇP\EK»ďxŰÝĘĺÚŻ9‚] żŐçôZ Fđ÷Ď}DžOa®`k‹Ă¸öżSxű"· —v#”Uݧ';Ö5°ś<:Ař6Ź˝¦˘°Ž±¬® )lűC‘{î9„–Ö¶Tá°ń>Ď<ţ7p;7”Ʀö6«`”EcúÔ’ UqDľ%ßčSQÄ,6ŁůŁ Ícw "šes!˘&J˙H?†eăő–7é~HáuřÜ~Âçäă”hC»R QŠý„ŕźJq–ďłÁAˇO> ź‹|ÁT§ĘE€ĂpV—v…?µŚ#1×.ť‹ÖšŢ{޵ŽoáÖŽQJ$) ÍÖm… Ş Q+iďcŚB(ýÇcä†%›UPbÝ ‡xĺ$8đ@Ś6{ŠKg*~sód˛ŞűĆçŽNşN›˛3‰°¬fGżąŤ‡ ě GŮg7Ć…—mîŽűŹăŠ«%§?ź{9–‰§Í#y|ÚX|_˛sâDňĹŁ1Ć·áîpŻ^,űĎ(–ç+ú'éxQR=őĎ|+"üCę…t59|·u±ő9„ôîÓ›éďO5‹ŰžO~vë¶”sňé9ć—eżřćÍé ą9í ¶žs’óNŢĎó¶G1_á‘HškŚá—Ł{Ĺ5w4¦‡!++Â~‡ňâ4×~-FňĺÉ ‡ Nz>©Ű¨É)™·|ßő)`H–ÁóŁv5VšlDii‹ť8 &#Żc˛é›.üéý_=—šň=ËÝqw H d.ĄDHEMU91ĂŢĎ…˝oLu°GΤQüeÇýd‘ĺţO‚ đ Zőt(˛'Ů™X©3µß÷íꯤmłRcČ.­˘5TL~ź˝(í9ŘZCŇ2Q~ ´©˝y楎9tO›Í•7ž‰ß×a(}aya?aQă(Ď ˝öZü±c©>Ęcę+UÜ5ˇóŔN†µ Nö}nIŐ’Eŕ,ü¶üŕáRły[••=¸÷ĎĂ(»Éýăŵuöą Ęi»ďjV (äúĹ—łjŰrú—öé€r+eMUî=Í ś ĺ ˙m$TÂ÷ţv›w0/Žx‘łjĎŕĺµ/sć7gRP1ʲrtŞßŘx3Pb"Jjůř¬ŕŠ€4 Îj›ÖţG7(ţ|ŕ1ěY˛'m˘ŤM­›řEŹ_Rß^Ďöş„›ßeMčd ŔĹĺĄÔ´4—łW˙¦nj&*féšő|ą!Ěá~ŹhĘAĎŃź§˙ý-Ł÷©ˇ´(‡ě,ŹÍ[[ik·‚5vdOŚ1ĚY°Ą5µ=Kdy¬\·›ě¬Ď˝ů%”şö+‰źăłh…dÓÁĚ >Ź/ÚçŇ!‚Mí>ď,řĄ‰|řŰ—’kOČAĆšů¬­Äć^HÉ’»řR„ŚŠňo§d3+¶VrHÁT^óO+€„"B“fýŻ6ż Äő|—ťaţ¤˝‡BµÜ2 to%a$Ťöŕ{±śŮ{pEů$ľŽ~Ň­s…$;tÂĎEîÄJÝEű‘Ć- VřÚZnłżü™[NŮ}xáGśyôŮ\ĄM<µ`céłö:bł7‚<"ĹÓ¶µ´×L[nN PN AVßľ|7k#€×ŢUÜóŰvv˝—Kî.Ĺç*‹'ĄÍý÷]ßž}—B†2¨É裔âŕĂ{ň»S{Rřß×ńžÖBŻ}9|;.9“wÚđŕě{iő[$ćO‰u0)‡cW>:“ 3C9|$Ő»çůĹěŠőĺŔwŽD.Y†1šö>‚'ŻěOyv1&Ű#Ů#¨O[0X(©ďb±.,€´ű§´_Űö_3˙ň"yÄdŚŮAÄ‹°+ş‹;â<‡J; ꣕q)ĘŠ·żĚĄghOťóvďËšú-\uÔö­éŕ™8GšB*«.<ç_ÜxßqěnŽrńi{Ť î{zFÚ÷DŚ1ÜöÄ|„ŻčŐŁkÎĹŰsV±zcłź›7ĄµżČç’7ă÷ńą|¸ĺ¸ď[źg>rÂďJĄ+-ťC&ńşץ]űÁg!ůË+rů‰ł1ůÍÜóÄŃôuąúk“QxRˇĽŕyvŽ€Ě đť…ßž'‘ŇśPH%P(BRł*¶ś·}ŰĽ˝™Ű4­}ŕ)XţđŮpóxÁĆĆÄüUҢî„t$¶*°¦ü¸7˝O™äío RĆ-_ř ‡Ź>‚÷ćĎ@)Ĺ‘ŤÇňG“J`ä–ş˙GÚy‡YQÝ}ü3·loěŇvéUATÄEŤ˘ÁŁQͫƍ5j°D±÷DcŹQ1ö(&Vě‰,XiJ[–v¶ď˝wN{˙8gć–ÝELćy†™˝ÜąçĚéçw>żďÁ+-łdĄ!=×Ň/Ă'#SÜŐ‹ĹŘyőj*'OćBŮ…™ľ‘ęb‰ľď:v®(ĺ~­CßăVçĐÚÚç´&/dĺâw8üř.űýîTFŢq fáR›WŃB:Ż›FÝžŁ¸ő›?2oÝÇřřÝĘżť(7… 2*wĐ3ĘyŇ{Ѭ€ć8řHxék¶üöB0†áŹ>ĚąťSáÍŮЧ*ëë>US/ ß¶ś™=8€śđłâﬥ ‘ä¤'QS\Ă®}vĺíÚ·Yظ—׼„49(¦/íßNvńę6®‹–r÷µŐ.ĄěŃoóWä­yžŰ…Ć~îJíť)>]¸‘}w«¦oE!ŤÍťaAPĘęâmně䋯ë9ćQÜűĚ÷|NüŤŔ/÷yi‘Ď ó2PŇ*ë`¨"K­Ü*†Ź’&«ň‡_¦ďcJóÇç }Í“n ł}WwďýsŇ˙ÜŮpňN’ć”±”Z ´oOcﵨŕsc-Ü•Š+fĂR,IMřL;gˇµüűÎoÂ˙#$·‰)·„(uůiQ×ŘT,ŮQ~3­ĺaúé W)(W0Ú@%€ŔWŁ •ý8ĺČôöx:0„śÔ¸FkŞŃď’KëÖe«'稍–…Ď1‚ĹsçÚ5ô&‰‰ 8R@Ţ(kw67-2®îŢ0 /4Łëżfő7›¨^·ďO·`:\>MŘ“†ß˙š/â¸ăĂ«ŕY IDATłhJ6áÓ3Š#i•v«‹«mk)OĎs(0âFĘn(g㓽طŻk5ęü‹ ?ĎóŘrÁĹDG ĹŚ)‡hPRÚ ‘G%tTcbPÔ ŠP$@/$I=Á“#»…ß-ţλđőő݇"ĄI•DjÉČŠ‘ÝQLg!ďۧ(\7[ ¸äIñ˘Ťâ˘7Ç’ŘÚĹÖĘ­UZ—“D*ĹE˙7‰aKđ•bç‘•DÖ¦QÖAýKŃJsĹŮ{3°ŞÎ¤OÄsË€=Ä_ kč“%őRô€’vŘPĹŔţĹÎíÚ˝°VmËÇ;ŁĄ°Â+~@wfWţĚĂ‹Fađ`(-Ą7”÷É'K¤®vČ« ĺă6 … –šŤ˘őn@չȡÄZ¦ý BQ‘@ÝI)üţö7d˙RR]“~:­jÝ#Š+UČĚ-PR…P‚.‘ ó-Eö"âCíҡŃĆúśC×®%Ö§Oşw'˝Ţh3dÎýŤëŮ&¬\‰>üp"ý$ś^Ť" ©Ŕ)Hy&ŁţyŇžXŤLR Ý5ű 'râ˙a*b*"řżü űíĆ?ë_göň÷¨(¨ 8ݏWŮă LČ’ş­ĎżĽ†—dc”z6čÓşS[Ą;ďźMF"TĘ&ZľŐNĎú;›+o+^ńYM7şŹ%ŔŔśO;XĎNÝÂuôĘÂćBQ=±° ÎěN÷u`Ě…j8–´ż\žű^ ĐÁ–-3ŃZS]}vÉŻČ}GµözucZζ§ŕrIĐ č$VQsî)=ĽüŽŁ¤ŤŤ«˛ŰL¤U74PvŔ=’xaú˙ş—dŰ9«7f3k˝s=ťŕđíĺ˙÷±ĐEî ĘŠ¶Y÷őŰ_“ÉËJżŁúÉ“C˛ţˇźÍM«`»F*ó>Ü>O[Őd){Mú‡łŃwîşĹ¨HWç$V Vgü- m_äÁŔ«2¨Ěäíá]ÜđřUiů{XpŹŁżĚnöĄvh‹Âşa˛ĺÔĄ“Ş–ŤMj̉'Ř p$©u×0ŇI÷2ľ»ď]U9˘ľ3®™Áq“ŽŁ V`^úÄ"1şü.žź˙dYÍ˝Ţtł–>†CŃŻÓńÜÖEŁ="±ąăüq_°5ż@Ż[8.g>öý‡Ws†ÉbyuďŇ^Unm N«ĺ>mÚ›ü)ö·—\Š,(âúĎOĺ÷Ł#é'y໋\÷;Ţ›ůů…yVŞĚťV›@±üń˝x·­/·ým17ô[J^$Âô-9gć¨CĆrüÓőŘĆ3ČdFbü‡Ź»˝ÓÄćV@gĺogee®.qĐGąç«Şş!Č™ŹĚ}`Ó¦°ŁË oÄnůßYÉ=—“ŕ;2çď€Ç°Ýeţ÷üVć+'ɍ獵ßN¤(ŠmÂŹÖD ~^Ěú¤gč­°‡T†ż^đ•-Áçd¨ş Ι-ń”őýŹ(á´íFŰkÇĄł`g~qĺN‡»lń,N2‚Ş1ó),Lňüó‚Ĺ‹·ßŢÂŻ&?ĹNMkXóĹ»!ˇTáYÖYʇÜG×Ă_PX=”p/­íň…±ľ÷ˇ5٨ô˛ŃŤÓ¶ËGp÷ŮY(˛6©$rO "^m4~†ŇŠm5é†2÷–éľJ4J»÷^0¦ŻˇO!¶÷Óé}”N ´Dč";ú Ä9´ˇ_Ľ~†·÷Ŕ ů%’ŢśwĐ{« ¦Ý‰_č—n”±-6 «Ľ´Ěv¦ŞlŔ‘k!¸up­Ű¨hiAmÝJ´ €5ďď^0hĚjă·gíŘtŔőĆÁč.`üŚ=Ň•ß]ÝŠřÄę-‰§46b†'`k3F$1íÄD›Ý”Ň5.ĆXßvíZóZŃDÎ=Ž˘–Ít®ZC¤*NÁá4­ŢĚ’CJ|ˇŮŐŹTQŠç¶öç´>µüG•ĚݢýűÓňöŰ”yd¸kńö*PA3W@ŞKa×čHyaĺ7˙µižÍč ą›Şqoá÷€˛×lŮBeż~aClăćaXBŰŠâ•ĺS4ŕŚ™±Ľ¨­˘U[TW;1Ĺń8ß§$“ŚT‰V¤ŔÇ u÷ĄĂŹÝ˝áO°íZt,1’Ĺ‹%;ďl[Ďě1t6“îYâ"H7l?ćK< Ă—QŇbÖ|‘)̰˝0ă§dg€ç!GţČ‚<ĆŞIĺ &|şęS6mŰDJ¦¸ďÝűřýÔߣ´ „° '”ą{âk­ť8g6 üůY:´öfĹżăoŽ6´ÄŠ 1Ĺçĺô pŢ®ĐöŔJKK»?˙}ĐóŘvŢ/Řy睳—ĘţĹËŻ}o¶s[ň€YtÍžMáäÉ` µýűó6DŞ‡ŐšMëoěÝ;8Š$Ń$ŠŔxĘĹÝ*ÎŘ©€ÝR*«Ď ‡#.Îťđ×—W0nĹA¬;`<ĂFÎf^ĂěµjŻô=€Ď‡íÇM©+(ôâaĺ·;őZIą¦ŽĂ+)ăů…­Ś÷úšE-C8b\ZZęHúŠkú,ç/ícy¶±?'•¬cŚi¦ żŽw]°é†HŐÖ˛őąç0B˛ęŘcÓ•ÔOŹś2ĐüaĂóᇜњÖ:eÜɱ+p¦xE·çw R’÷‹ĹÜ{ö 67 «( ÓžŢh§*=ő’JŰéS˝©égĆE_˛Ó°š~ţ[4pÜ”7iÝőaşZ¶`tŠĘAÓ̶ŤŢn#°ö‘ʍÜů`DŞÁ¦‰VxXq{ +̢Ý^Z˘µ$V0••ŠËÖ2nîrŘ´?m…Q¦ÝŕóîŢđ~gN]{>_źFa,łňŰĆ%­m}ÂßUđĺ7­4”Űůé§ź|ΡUL¬´{I”ęNÎŤ-ćr1†'ň«â$逅ҶËč[zK Ň l\ůOڛʔ4´;;—›ţIm@J®9ôP"ÂÇsKÁfŁ^˙ţÄ>üĐ•ÁUäiȨ0d–źDâ äÖ6¶zŐlíÁ.ťßŚ˙“Ľü »× ‹qţůçóŕ’čJpîoĎĺ/Ź=ĆÜÎN.ůJ°łďcľS|Ě!>ćîtř1đáË<ô!’˙;ŐG«Ęsć™:P‹âx~0‡•áŐsν˘¤•Ă0»NĆfŔŘî=«Đř(ŻôQZńü§ĎÓžl%¶›;›yěÇ;xlÚ™'ČžPćď™d˘Ŕ™6 …őřń°E¨!=6(AüuŻĎo˙ô\fű˙Ř- —?UĎ]§Wďó‘H„ëvď˙™•{¸óNfű ŘéŃv¶Őýéű{~wŚ8n/¦Ý[͆Íě?as—¬§­3ĺ"i÷vvŘ/Ą ŁáŐ}řä1h˙ö~ô°ΓłQJÁéĄ\ˇŻv …ć&ý¨]7+żťćŮĎ®ŽqI´YźËR‹2—KV6 –Ô+|aříşńÖö $ľPĚH bdˇť‚HŇ(°v:g/ÁxľŹ'ŇWü-`ăwšúC]‹ł÷dh2 éżćę^Ó_žpěľ{wy/s ‘S~R‘“yó›1řCľEµJ–}}>'2žxOőđ}ź•+W’L&R0wî\üÎN–ů>ř>ż‚S|źč ů?łLŕ sS€čľ‚wiŻńřüÉ»ďXÇTĘç7żÜÔXĆ+'Ř^×—Ă„dT?ĹWó`î¶ĄŚŠŽÂWľÍXśŰâ°±čˇcť$µD·Żł˝¸±˝f~,ź ,ˇ¬—^0đ…φmhëhCHÁw ß±kÍ®VgMŰŢ_©ô e6Ú`rŚ€ÚŘ)@ Ó “Ó\¶źGc§É0¤>O´ Ś&ˇËĂíąĄ±˘¨J ·?-aŢS\uÝÁÔ6v†=µźe@ËŢÍn9®> „ţřßň}/ľąf-ŻÍB¸)ŔÖ˝Ţ~z(+¬q16j$Ëľ\€x•×]GéÉ'1,řâ"ĘśnZ·<łcŤ€ó˝ĽűHÎ;n_Ž9`WλëIi źB§±âĐ& ńĂŃ“ {wL°IÚŘg‡űs­â Bء¤Îć’Ś_¸°C˛ŃĆáÔ’µĚhŚrľ$räť´(ůY—§xCaÎ iv©$ŁĘ$_Ýř©ÉbU†¤oĐd xřŹ<‚I$_rI8"Őô ŠĽ˝ ĄÎ¬ÔAcPËgŇ»óQĽĄ5?7ŚňxA·ďŁŕ®®.^}őŐđď±cÇ2{öl„t ÁÝľĎűBpµď3ć±ěđcřđęâbĺĂŹť]˙ýřÁć}xyi±« 2c­ś7pßś{칬i]“F13ćÚľc˛}ĺPVG‹Ť®Í×7 y„=˝m4ÇN:–=GíÉ=oŢ6š ¦\@żŇ~¬ÜĽ!}G›ő€‡(sď#i„uýt(ä×˙Ň|9(ĘÚmV•×Wµ„.wrÓ_§ ‡T0ş xČoŁąÓ§±5®’řa…QvK´Ś«tŰe—Ćmv¬;Ľ7Ć SAe†Żi…em­vve\mAµ ´ëöĆݬäď ĎRҧÁt4ż»Ť€Ź”Š…+7˛ek;«ëH&SnK7ĺâ,ťł”ÍwĺÖđÁŽľ0y;¨üéő~)…#ŕ´5Öpf,Ť(ĄB8ť€ —÷…ý,@™})ąoŔ×ôŃť¤JS|¨ö ®¶Ő<,Y’Üĺ/(żŽ {üŚF@ÚcŚ1¨oľA|đfËf"S¦Ýe§SHwUäí59(őÚ1çžKjÍš´ĂďSčűžasXÜ;UçüŃŁ™űő×¶ 8…Ł‹.şďľűŽGy$ô ®źÁ‰ľĎ•RpŠtÂĽ(°’Ľµr]tđ"J„sZ-ě.łˇ˘­Ë@©’¬{đATCFÖľň eŔS-ďQXv€I´ÍýžFŔ6\Ć^šKs{‚UĄS¦+~ŕ5iGp*`ń­•[Ö“Ťŕy •!ę’†H<†Ö ·@ä¬Ý  ! ŐJ¤dĆĘiţ`Fü ŽÎŻăC=ŔĄź Qâ¸S%ÖR1¸(í–?ťQţ´BˇBĐKiC˙’t^Ű ‡T^X†˘ăĆQx÷Ýđ6,ýîĐ]ŮÝTŤGvGŮ5VU:R]íÔŁ- í9Cc¨#Bĺ–»ÝĎ !©®®fÝşu|óÍ7 <Řę6čę ĄXŞ+EđĺDA¸+ ěvô¸KľşÖt‡QL ×e|/ W?w5§O<•ĽXŰ:¶‘ô“ô-éKG˛>z€g/y¶{ř9(óg7~Fe^e8G’RŇĐŃŔaç–6»(pM'tdĐ}R;ŘLw?*P¸‰â‰|é\Óš€–ńqř×đćfúěö9[íĂňŞŞnÔY& żęs$&ŘyŘč°bĄ+š!ŐőEŻŤ€çýČôŚ'sţîYÔ±yů‰DóĽP±Y•VuvÓ‚`čoWÂVŚaÄ!ñ4Ynx˝áÍ™Đp/Ó™ő‰Î<)ă«] ›·ÚĽ × Ż“öúÍ?[­XŰ\pŚß{ďîôÂ…iú/łž<ąJÝ@6ś-sî{*!ĹśŮ[ĆîŔq ŕ˝üň_Í 't‘†R3ʬ­ą…ŰŢ·¦Ňftř zxý©ů‰‡ł·śŇ™˙¸9ÖöPÎýnÁüˇăKÍřĹĎĐřúŤ¤Áî—LM&Í-Űť}ćďxhżś·â'×ń{9“c“—3…ELÉűŽ“—ÂĆĎ^Ă–¤ž^âvže"HdąäfZfĺ ΋á9? Óş§Í»’ˇ^O˙ą˝łęA(“Ą «Dęě3S®<ćÉ˙ ….éěĚzFŁ9k`% ÚEŇ™ýSnß4í/K˛Ă“šß[†RŠT*.‘yžÇČ){ ;@¦ŇĹrĐ.źA[; Fóś})p.‡K‚ŢĄ{ü÷Šî˙|F/˙?±3·aŐˇ»Ś [»ĎşźRĂ„g**©µumÉĚ?ť“oˇÄ<Ä~ţó§ŘşőqfÍĘgŐŞf Ő(“ˇ*jďĄó7—Î($„bÖ,+¸\–gQĘĽh7|ť˘‰ ….$ŇM ÜŐyÍzġ”Ĺ4Ć„ â¦'”2ç쨯gţĐ‹Iś;aÝÚ_pó¸|´1&8ű¤÷yđ©9˙Ô÷xě…F|~úăyÜűÔŹI&ăĽţň_ŘV6ošŔS'%X±nĺEżcF˘”š>“™˝ö(®ßŘβ#Źvۡu"…Á—q¤”Ě|ŕ!`,µÓ›čËÇL|NÜK!RvAJAsU)ůü•Wř pÜôéĽ,Óéáµ”nýÝ Ý¤°j¶Á5TµméçdŁĐĘS0"uKW=©úŇÓsÎ8Ú­*ăT™˝(RGŇVrg)ź5#@ˇsPŘ\u{áEEaţĽĐšâŮéWˇ”M?%•uﯤÝlćĘ^ŕřj\řv‡«ęęŇ,cY°Rżő›'ηő7Ă6Éô›G¸ôóĐ&Bá ?ʧ«[ˇ=µ{üĐ÷Ü_Ůkě>ŚĘ¸mĂL¦é3óóM/Ľ€{}ç€ ±ĺßbL¤[ů߼ą_Ă=?I?ŻŚg_;Íx(EčFKNęűžńy~ÓEÜţ &–L΢˛˛?§ťfxűí:^zé[şş|ËjgXbŚ•:R RL¦MĐ:7Đ–jCi • *ĚúćŐ$T_řŮ(n†Na™÷Ű]FóĽpxe0ř©Ş˝ŤÚÚb„ÖÜ|ÉLŚčd}íî´nŰHë¶Z6Ö—1eď5l©KQńp@ňxňO”OCŻk`§%‹`ófv>”dQ%‡6wňőGËy3˛ů^'Âkcż1qf}ePušDKRÄĚş#^2‘˦ŃŻoľ]‰Ţ%3hmĺ°÷Ü“ľ~U·‘ŮJń‚R´ aw>vó8« 'lúĺŞÚFlA©kŢHQT1©J1ˇJ ŹWČFAŢ Ó,zUő ˘ë:]Á•0©ßTó>ž‘ü»î >¨ťŚ0Öę»Ę?¤Ä#íŮi˛QŘL5eí)üđ2ňćÍ×ÓX»ÎUx‰voC)RřH!¨48Łđ@{—pű&j:;ÓZ ÚQsJ)ĘęëĐ~ ă§ ŞŻ•9ÉúşFáčĎZ× ˛t1ĄčQ[Ú–“®%kĐŔŁ˙Ń5(mhü°•ŇÎf;âăŢ9oělčż)˙S‘—Z>,8­KŰh'…áśę›)ńWŃ]śÔ×çv~G Ę0¦‹HdÇSĚđáăyňÉŐ¬ZŐZgý`9ĆwŞ®nY&¨YKZ†ÄŢĄ»_JS˘‰Ĺ›ż&ŹqÉÄKxâ›'ř®ő;»/˙»—ľŁµćmŹđĺ†_ Ú۸{Ë„8%=*ĘZŔ¦üč+úU6qęĎ>äńö§şßfĆŤZCkW  ŮLEŃ8±H)LĂV¨®¦ł N;…lU1<Śšúćő'?oî:źřNýáűRJ aĺ¶ţ\|Ťáć f±>˙=ĹëkŻcÖŕ ¤‡*Ĺ!>őḩ}oXż~=㮢ЗíĄ(OIňžS„ŔLtś.(şËď&‘Ş*{Ţ.$ülÄ ~9ň6<ę1ôgŹĘ·0úzŢXs>i_KkčěÄäĺ…ŤA·/—Śt˝1‘ş©©[ţk­ůĺu7qׯNp•^†_ «‹'…ÝďŃ>@¨ęW#‘H8ěvŇZŁý$:ĺcd Ď÷Óďďđ`F«†íł#ŞŘ ĐĆ Ëj ZRDé#Ă–9_…ꇕ?çďO„óÎ347»^[{o#ńîW) ••pŮešř-îýµu`SČä*żĘp^{aóy\X=ŤŮŹ9ťÇ݉ŮVd0cŠŮeüEÜpĂ^ÜqÇ—Ě›·5ěńŠßSnMôü¨úGŚ­Ës«ţNJ§^<śq•ă8u§SąćÓkB_Cư˙ ´¶´0óÜEl­¬"?îń«±{óŐË ‘žÇťĘŕ9ý¸Ů€Ź…üůÚ§Y´|ísΉłxţů×ťÇ ۊاśůCa7ô™ÂŘĆĎ™Sy(ߍ¨ˇí»e,ţ`gF}É’uK‰—U’;řĐôďďqĘÉđź÷ ÁE~=äF¶}L©hŐl25áňćÓ™39 «Ëîx§5Ă…ÄĽ÷¶ĺN=ő{@´C©Ą¤ĄS2ŕ=EěÂ[hí„üçď zh-źHÎöÜˇŞŻÖ(<»Ş=ô~Ăbžß F±ő'đíQO˘ŚaÄ5WRůd˝kĄçmv&.eQÍPxGłë®µµŘĘ-°KĎ9ŞŘą×`!Bři<|•öc‘;I'3؆Ť~?¦ű$Rú–Dˇ­Ť´ë1fĆk).žČ-·ĚäĄwaÁ‹ÍH_!…DřĘJL IŮŹů˛ +”˛–ĆK)ŚRß±_ů|Ő°€;ćßAm{-ľń‘FÚöŁĽîąS_oQĘŚůr8g vu †“R Ač§ź¦hĂRBŕEc #(ťâňů‘ě»k=E ÚÚížńť%ýűlF+‰UT»Áăüéłť©ŃÍDVneˇŇÔËaŚ›7kJA&óHĘJš”SŇwo6.FuEÂpź˝`ÜxCq‘áăO@ ĂĂ+ŽăTµ’I©ůDýÉVqëşĆPOΑLŮ÷KtažyÓĐąô’ž€Ŕ›ÍOŁÔ1$‰NI^¤–C¨Ä)¤qźĽ6[UŮ®…çES”ľ͊RÄŰJß‚ Ä˝v|Yo‚µr/4$ećxßŃĆ »lců'Çq{{3!=Äżg”ú˙n˝“ŰŹ?*]ń}kóP®Fľ/]o©Z٤!Ť†N,bçăÄ IDATöžçŮŔqý^đţ~€[›Ś@°ŁŞŘŤQ´]ń Č·g”ĺËÁĘ&ٰÝepXŐ+“ŐäŞbűÂí‘á>—Ňn˝Ő~m”xôjŚ®ĹŚXŇÚŚ¸wĐY2/2ŚË'}@ Š1f0ĆŚĆĐĚ(L"…yv$?źů$Ç÷˘Ş#ůťí@˛2V(o|ş¶Íăô±§sÇçw༬ë>ĆDLĺ ¦ë×Űh~Şk[ŘÜŇAuY/4ŔLÜi%»Ź^Bqa;÷?ő#Şű6°pY ‰äxú÷iâđýçsĎ“żžá…—?§fź#¨Ż_Ě\á!ĺ$˘_/˘#!éň÷$ÖŘ†Ń JRRPR‚Џ¬ Ŕ{ďŘÖöí7 ]ťđ żö"{•´•»c¤ _[“۵üřŔ ť;7ÝűµwXáGácL sěń ~Űű e Ôó}ƦŘyĆtú%qüJ|ăSµÍ·*±™éLś±Č÷ât”ĆW…ńRşś†®rš“…i€;ńµ3°9U MaÇ}l8.ő"śŢsüu𼠟7Úđäĺ—"„Źôłçýv Üö`®\Őť ©»…Ąś‹®ńS(çN F~ÚŘmĺÓˇ'!ÓŢT±ÁzşblĐ4ç#:ź{c y5ŐŔ°×€ś#ÚűÂ5™ż—€ĐĹş0‘ލĘ\IYÄlŚ1§ĺk1ÍŔ,\aŔé]ťťŕÂńöď®{ʉU{pĚchMµŇî·3Ľt8Ż}÷ď×˝˘¸šPĘĚ0ż'üỎŁđÎ0ëkiÜĄ«ë8î{ę'Üý‡Ä#I~včçtvÁáßQ\ĐF˛SđÄË“Ů\_…]?ł[9 e(ITY›‡‡!Ďł |2•Ç-ÍćÁ÷°fهHĄ8ăg_đÚ »ŢŇÖâqÇmRPhxäAá'áÄ^‡ďžç±ßé§Ł÷Ý×˝ ¤d}‰ĎÉÇl·ň=¦ÖڢЎľ|oŤ¤jĽ í¨:*¶®%o• ú©O¤s;ůçk„ń,é(cĽ´ć<~=öN"ŢV”.GŞrţ¶âT:yř^ŔËŰF)!˘ń};˙6®ňkc0ý‡żôz0š.c0IW µµ‚Ǣ@D†óáĚ÷:ă®{ąaę!a…· € ŻZOú2-'Ö K ˇµv•ßNÇpš~är ‰4 ٢¸9#€śôë\qCVe^2őĆÜ~ ÚV^s-ďNďqę–——GËďĚ‚AQƉ»Iřőev›ŽřÂm@"Ň÷ÁöjRQ,ńĎ ő˙¨Ę¬u'Đcv‚×ŢŔ<ö¦Ąą÷Š2j˛‡pľĂ}ăsĂ×S×^Ç!5‡P’WÂý ďgŶV¤S©ĐĐ ĄěA‡ľ÷đaË MÄý şĄ©«/cĆß÷姇|Jg E.­Š }Š‹Ú!’^×—nY3 Ńî<-„á1gŢhęVôáęó_á¶ű~Ĺ×5źš¤Ś"„ati=7Ý]Bů âta—Î9Dk7ňKńčęĘz˙ŹÜ75ˇ^ĹóĹ,´:ÜŘÔŃ–ŁĘG2÷ÖąPF©›¤ŕĎ_ňK}Ţţ›ŹĚD¶m?ýĐ©˘áĽţńe˛şu4G~ŚĎëë¦ňâwÇă“v– $T _Ĺ-wÖ°a‹pîj2ôLú37L:0Ź—î›OkóÔ°üÇŁź—QńEz$ ůpé| ™”a8Ňů\ôĘŤ¤Rˇ^żçPjRAţŰř ĺńCT±ĂĽtÇďcĂÓϢ•fĚ}÷† QpSž€¤<ĘUh±ć•OŤfż.?J˛®-M?Š,Ý ·‘ŚqŞŔJ ´bdąbÎÓzfŰ đ÷E/>Š ()¶X˘kí®Ně" eĚxAĎó¨.®¦8Zî_7kő,^]ű*J+R"E4etĹh”Qá Jé”pv$| (ˇ°h0ń}ZCKŹUőqď ű’HyD<߇T ˘‘Iß#X(ČŞč[”F^…vĽĂ_…aŢŇźPQśâˇ§&P^áßźDpޏHpFő;ěÍżéş±“ć.×r»Šýť8v˛aď.ZÄĺ@sžäĄ_Vł`TśjçŇŞę:–B‰Đ9(µ#Ý2Qj©Ň" )Ý~ú‘Ôˇş°w_¶ő5n§†•ąJo@)e¬±)€J¤2ôíAÉł¤»ÓzH Ą¬<:heÁ° 5]w=÷żrĎi'٤­ôvÝ_Ů«Jktů>RjŠ Ł–_‘ĐúžgmŃŐhieęŚ †đV^¬şoÜ6P*J$2čĘVĹŽÉU±Ą”Äăé}. ĆŚfĚ­7ĄGh¤‘ŕ`I23n˙ků§¶&%…±jbZ÷2"ČSČDDŠM«27u)Ř ^çŚ#Ť>çť,:‰ŚűŢÎŕ(j޶°I™dĚĺcŇŕ].8ŇIîľ:—ôüŰ;>–DŽs€ßň˛ů±iúO»oça‡˙EŔ19‘ě AŐt‰ Żq »°Ź Ą‹ě×Ě$s‰Ŕ<««ŽÇ*üţ”:řˇ"¬Şp&.ĆöKżQWuB›Î&Ĺ2Qč€$“ącQîy-dŁg™×Ü ĎüĚÍ[§„ĆŔ@Ć}Ż!ĂŘÂŽ˙ö=ş’’dҧ+)éHúĽpUµĺ%’I|Ąđ}źd2ÉngžŮ-÷ŕ­ś„Ť±éĹxµÄ*öţ˛{úUlÝšĄ ‘iÓŘ‘ŁbĐ ˙©üŹ:›îu.}ž[ŚÓŻŠÇŃ9V‰ÜŇ›ůÉśű$DĺWÜzk W_˝‚éÓÇrçť›QŞ-#šą…˘¨ăţ_žÉ¤)0ůśLYßĐĹ_ÜŔ^{ąčhĐm k@§ş'Dg­]˛:˙˝o=´j  o‘U-•Ťµýňšm°şŤ!×MbÎ5t&üä® Ô?ťýúąÉ±˝łę°›˛ľŻ®ż!üĎč•W¸ŠäŰx$ýě{áł…7l^‚o=w¤ U¨r×ýyřä?ńö§MĽöţą¬KÁĺG?ÂÔ LyęzŢriUÝÜĆ,Fgç}äąjş™÷Ů(Şfpeßî©ć,đh÷oÍz^˘5T­Ô-ü¬Ü^›"ˇő&'řl”–0üîq×Ŕ¨Ç˛Qf43  âďN z\÷|Řë~C[2ý¸Ôv9Ń×vKŻďC©)™Ô‚çŮ^ż«•“|ËëWńÍ–5ě7b"Ąy%,®[NaA!Ąy%,X3˘1ĺ[Łâȵ$łăź•N™HnťŽ9I͛λŃRkŘM•Vak,ť”ÔÖ]7đJđŹó˙ÉO忨$‡ßý®?»íVŔüůťťÍB‰=„ŚqÔźrФEÂłąőŃżLź~¸Ë°('~ÇŢ{_n-«8”ôEI䔞QŇßxÜ|Ä`Ţü tť1Š›ßÚ€ÚšDöÉCé/%rSQ1†~1‚˘¨Ő|;âálš÷źń'.šÝJDţw(ëô‹Źtń7x٬QŃ ¸řňcł””…łEmďg]ü č;oŃ đçĚA/YBd—]Đ­­ČĎ?—CÉRá×͚ŹăŻä•Ń›ůůO˘˙±·S!4Źě˝7c6~Í+ű<ĎĹ‹, ˘Âw·Ű éźýEEEɤĎPTČ ć,í圎䠼‘”»Çç,t˨[+ífŚeI4i‚ CÝ´»ópňo3?› Ę ČÇQÚú&˙éG:”ÚX”ÚްŹÄKH˘Z)čŢÖ·ž?Ĺ•ĆCk‹RKeŇ+.ĘpߣPYP- ­ŤgOżŹg={973ŤĄUĚřt&ű ťČ>ĂwĂ;»říĐo”yůpí”ë\ü•]Ĺşěk-Aú)éěw¤ŕµŻšşPßZŹÝ¬ şR]řŇ'ËCHź„źÄ`čLuĐ‘lgpĄEQýë(µGQĆ5×ÔłyłO2iˇŚ`“O!âDéâŞ_˙ť »|ĆşŽ87}çťż@ŔbÖŐ%D$űîű!Ć4%˝G`>č%˝ĺĘOéW4™‹Ha4ÂÇăÉ/xó˝ZDEľuËÝÜÉ1S‡rÁţýĂąŮełÖóń´Yp4V´píŢ n}©‘řa(kPQęš»¬eS•wٍG…Ű I#C·raŇ‚B ĺĘśId5>ik»p €×sř(s]çĆ´mĹđ”5ţĺ‹´°ŘÁś=˘¸ĘdN‚ŇÝPęyßŘ6˶ŔţýŠ ÷>yuËx~Ţ«|ľvź¬_Ŕ~#&2ičDXßbą˝j;wŢú~+eqgtÎ` ěßÝÉLĽÄcýîµÄĐöK)™äG#dTŐÚ“m|ąv>‡îN^$ʍaîęą4ć`–Ô/ć©Ďţ†PLb´¶júô‰"•¦ĽC$űýUÚyz0»÷H^[+:–ÄDó‰ôëGK,ÁşÎ8©vEW2Âmż|žŠ‚­(%il-âî÷/|Ę/ŕľ;G’ň ţfŹ?ŰŔ´k×aWů'° ‹ľÓč8 źGď˙O9”‹OďÇO–Ż˘¸y#fúuđÂó¨eßđĐIę¨U”vú†^BUEŚ«.ZÎä哝?š>Ń>¶âFźF¦{×ă†Pi$ýb}yąćĺ^+żR‚楣©pWŹK©IŞJ;Ň5(p(°2ŻĐÍ0şˇ¸BA[ĘpôhÖĚĄ†Ľ¨uT G¤C©;í,Ű@ů)RQ8zÔţĽłě#1‰ůŤËh‹&9n×)´&ŰYXű5?űżóiK´‰†ĘürĚźî¶›‘(•˝—ÄQ-V–˙ź!Hń­_WSCßçžµ €"(„´%Z(2¸b…ŃBÖ4®!%S´$ZŘÚŃD”(ľSŕ8ŕ€ Î;Ż/gžµ–'źÎK/µ0sfBäNrĹ©/˛Çîsů¦MrńŰ›IÉ M>wXq‡GµĐ‚ Z`·»÷ĽĆ÷1»î gśwÝwoC•Ç‘ Á ŹŻ`÷ýűső!5ô)ňĆU»geúeo¬ç·×# Şň iý`•±„c]é.ţđţ0ĺZĺŘn籹 uăMx#ŕ×bŚLÇ_ ţqŘ<úYpĎ©ńd,Áż>›ţó-~”Żöü}ő źőŰÄüü”˛ŇÜřDT'ľŐÔSÍl¨KrýŢߡĘ&sŐ„o8ůé˘N L#|w:DĂ[ÚĐÄ'óZ8üĐ*O&1\ĺeÓNC]y [ëZYŮR`©8éDM…UL< ÔfŢ<›ÂÂhşňî îy'%Ďr#lUçűßż•AmnDČâqYµ›NĽ?»pv…PU:•5‚!xuŤ ĄÇŤô©öŚK,J­Ś-Çľ‚}* ĂĘ †Óv3Ô·ŢűÎ6Ň­¶ŕĂűçüŤ˙ĺĐç>×Ô›6¦EIĄŔÜ,0Ĺnô2ÄÇśźĂ‚¸U”%ɬŠOßâľ ď;ś%—Ńáw°|ór* ËY¸a!…}XݸšOVâd˘íĚťŰÄěŮŐţńŹf^˝ ! ™şß§śtÄżéĚ[Ëżę˘ÜůĹf„vë“™ŞľH¤Ś0q÷ď1bĆHĚ_ćÍśőOĄ0űďŹ9áĚţ?‚x ÝҲÁńrPźżş†Ł4ń楲 Ěž7ÍG,ÝŠżWŚ8+Ť$­*¬%b¸ö­?đřńĂ3˝;%…ެŰăŃ @°ĄzÖŻ~ř9Z˘Ąť©ĄKń˙ó ””€Ě'RTdw…‰\:}@iY˝ęjbŔqĎ]ËgĽÁĘďZ©hÉ#™R|đÉ&¶Ž›Ę¸ŮŻđŠŘMśµ+ËůŞćJŮw0ď~\‹Öő–5iŕ™č;ë«ŔcYä7Csg¸1ŠÄ ßXßs+ú©1Ź<W_ŹůçL"C»owS2*XÝJ?«2 uô€Ď¤ů­pĎѰą=Í(ě=ŕxľýöa–ö?…Na·ěu•É)/Ą{ŕš2ʧnÓpLvţK-Á–nóy§VĐ.5Ą>‡čöĄ}•ÁH|Vk8qĽˇ¦ÄŽëă†˙¬5i@&J˝ť#K®~{G®*±·|ĚĄă Ěß}űYńʎ-Jj üsá‹xĆł=ĘÇV %)SDĽMťMNßÍ„ řüë_-Hiůb;»ŹYĂ1~Ć_±¶+Ĺźçv±¬©ßřˇřg–Ş/­}¦łČ˘ŚŹIĚë(p<Ž9ř`ĚOŠ™4)Ýë¬RŁ0ČN‰ż©qG áÎ#‡t+0_^7‰3^\Í'ďŐ"Ş‹}â¶ČlUájU͵G^»ÝĘźľĆ6ZÚRXčÜ çę>÷´@K¨lm%RR’5‡Ű‘ ‰D¨™>ťýwťĹeo¤nc+łý˝¬$ÚÚ&/ßLJî‚g,A×™*#ňíSÜ×µB˝ JËĄ1”Žđ^t/ü7ä7Ö~ăËŐFTŕ+/}Ő ´Ď€<ŚŃl8ůBŢ|łžŤM@j*Wś2™-s Ę:Űí!Li4R{¤LČë%ţŢ€I“J§=ޤ‚Ĺ+bhżĹÉ9x ESgśą-3•?É€™Śł÷¤*-اźĎľ]ľĎA{GeNřJC—0,ÜdQaăş ŢĐÜeELvřţö€WŤÉq·ëůč¦J,ć3×Ĺű™Ů3 łÎ$not‘â¬΢(fŤ ™«eůe%¸pć¤Tʶ”® ľźÇ™?{Ź]†/AW,ŕĂ-ĄÜöŮf·7{ *ěwWő%ĆNăęŘit-̸–•a›‚9úh̰´'™P‚ŤY×ąŽźţă§ ßBlKâoíbú;łĎ"Ś1´űŠĂnů !5łŻźDIĚ㉓Fđţy×T Ň© źâ¦bî8ę"©-‰–pM7‹Wwg4Ą­­ŤčĺÓ¸ŕĘăXŰÔŠTš·~ňgv|ß—/GHimÉuú€Łú—ńŐmşĽÚűąďIץҢ̞˛$Ł1O»řhŢ­?ś~»ŢşUs§"•|năT뼶¶Íh)QE ŻB |i!ßÂLJ(ĘúTó ĺĆőÓąöOÄ·ńËă¦pËëq®:1†÷Á®ţęË4Î*Z¨poĂüáŮźżsŕ»1mZ5ŤŤ2{ŐH”LŰ ‚‹·Řň¸ýöů0m0Ęxá°Z*CgÁE|ŕ—3E߀’Iž/žN{WÄ śä˘ĚAţ+ßX>+±vá8;„VAcŢ ¬¤îľÖ†ˇĺ†'RĘ0˘OPv»‡ßxôŃ=Vjáű7y2DŁÔĎ™C^őqz¨”Q§ě·Ś>-a̰ĎhDňôŇSQH—Qlh]Ĺâ¦Ĺ,j\Ä—Ť_˛˛y%5%5đб™ňߌçőSG‡ă‘Ď6ó·¬F”ĺáG=öąřÎ:e$ż?°šCG—˛ţŃůĹ3«€5 AIŃ–"_häřGŹÇ÷ýnŞŞľp^hŇ ŹŽ=šŻżţvşÄ !-9îĺ}|)C‰pBzŃČH>P‡Ö:\&ű! ` pĘl٢̒ÚËV4"–ţÖ‰n60jX9 ąśF˘‰Ĺč®5? EMŽfO 6‡ţj l[Ă}ű˙ď˝ůä˝ń*ý¶÷|I }€iKÖđé§%¬Y“p«FÖÎ`m ÁŐ„¶é„WGŹ.–‚üąĄ Ę,•ˇCŤe|•á¶—&ĺŽ:aëV;/:T@Â5ńPUZŞŇľ3Ú{/`ę{B©ĄîľÖ†ç—¸i“6ĚßhmľĘ _BăŰo÷Úł7ľ˙>`Ą'{;ĽÎFJóʬżEĆj!}ŰeŘT4 D˝( ëť*°– ,čÖúŮ.‹Šľ3żz%C+‡ŮuZ7y;eď©®8š‘ËXŐZÍĂ ¶"Mś!}‹Óż!Óó+ĺMU߸÷6cľŮłćÇ?L˘mâάËď`őÖ˙đmí7¬hYÁ¦®M$’ ű<Šš’ű|śô§}¸yę`ڱžjg<˙rC;C&T!<»/Ş‹xď_őĽµ´…w~;Ž<ţůëť([p tŘ‹@†W‡áJĺÜ”Ň@Í˙†˘f=_WOá ĎŘ^hČCY±űTWÇť›«sěqjTÁ}02üţ•łAX]˙}‹Éč…aEŚ|2Jľi2Ô”ĐeÖüUé`‘Ť{=ŁŔ${ßr?^XŮ­BOw”şx;•{GŽ~7ö㜣ϵ;^‡ęŰv˝?í;"í ‡3rj·ÜąčÎ…N8‡î#µăřěAŘś-€žÁŞ$ţ€ă¶ź–Ł‹$3ŞaßÂb¬Tj iú+ĐđĚEaK öĺZ´Öţěľ˝î@M t$­…&Pz0Mö‡O:„Ą7ěŔ„ó'ĐĂó;~TźťE÷m}üe»´(ˇßo'gDĽg”¸łq~Ą&Ń˝8´ŕ¶´Ćěń,ÖüC9P›€ťĚýźPÔ˝üߎ>?ŠÉFŐz:uÎ}ĆŻś}m6]çk÷Ę:›ľËü;CÇ€)Łş%UŁ#C PöAďŢCüŻp(unř=…›‹R—ŔÚ/Gµđ?#¦QŞb÷†’ëśĎ3ęŹ7ਠŤďţ5ößîyž|W©‚Ă$­,›Yľ{ĘË‘ßËáîůŚ„ 22¨ÄBw ŕµGÖ°˙ęŐȆ-ÄË«°˛ŘßwY·‘¶Ő«ŮyÉ‚¬ĎsÍ2ßWĎ»÷Kş’i"%Pkőť‹Şôµ› h’RâűîŢ—Ä"̬XÄ»cůă»mLk›EELr]r §U,ç¸Iý9áé %ĚÍa›ý»†–ß…A%#|űřôŻh°+-ÚGG ˛’‡g6=ö:®đŞ0î¦ëÎpdG4~'Ι=„źň0ĽÓkúEď Ý÷’˙ćiz}~GŇq/ß'#ČĚR“[4Ď.ž›]ţ¤0ďmîZ‚í…rąZ¸¬úlîi!ěř~hü«ö·ßű÷¶jZVn˘8sűóĹűěJçś%Ů~Nť[Ôhř±˘š~}/XCĂĂŁÝÂč:b?¶µMçĎSÁ 6Ť@ąíş-Ľ!5`“VZđĘ_g÷Nďo#¶¸Ú-:oŘ! J¤2áôĎósËpÎ=m©# ˝ťăkQVu o®SśżKS(tëµęĎşëŹ4µřÜóűń6ý áŃwŘuäçu‘gŚ]–ô şÄ§đ˘z´’n+©ňIţ|ďĎBj,\zşô˛đý/é,ZJ—îŇ ÍĎýĹu•AúEŁx©Äbm¸äĐvD*ص9=Ą Ôˇ_{Ô©Bßr‹K…çŚcFO)›ţˇ:”ń莙3“‘&#˙t`ĎôĘtĎk!řxÖ,HÂôűU`CžédŻť–2qô ú”lĂhIS{ _.ĂÇ‹vˇ±Ą(tqžőčî݇ţóZŽ*ď3Ť×Ą~0J~í´{ą)…ŃůäUqE^ Ĺů…4w´đóiŹóŐÚe,­[•N?i—-_źöhvú˙ĺ7&»„,:xP¬ŮfÚź8Äće;\ű=Ď“EĆÄŚ2\üôF®úąť‡Ű/é´aĹfĽÝ˛É—‚Á%CśžFiŘÜH;ĄĹU(Ő¤Ă5é€F«îçí>”ÁoľĆÖ‹/góĂ÷Ď/%VŐ×RQ=ZÓ¦5ía‹đߪÚ>“wyńű1‰·ýU°1†´W#A »TŁ…uCŐ’HáŹý…–Új WU’÷ĹlR-­¨Îů}+H(Ź»|ţĹ^´ů1†T¶1°¸ý˙ĺťwTEŻßÓÝ“3Ěŕ†śEQsDAĹŐ5'ÔuU0`XÁ„č*®ş,‹®şş&Ä€VĹ€¨€€ä ŠJ†<&0©»âýŁN‡™„ĺţs÷ÖóśçśžéęS§NĹŻŢúĚŤ) IDAT}I†â]©HŰ1µ´"â«Ęx(Q† Ôúśă)l8‚,*vé‚@»v1’Öb))Ż‹eʵ6Çž˝8R‰ö]vI_(¶]›lb]gj*¶uk8ŢŠő©´‡s« iź…Şę1’@J!†3šŰ?Ä ęyć™g  °m۱ѹąôĺŘe‚cPe¤$ŮG©cŞČĄĎ*ţrgž{c‡e×0÷ÇŽ(iŃFŃżă·¨†_ňů™ěŘ•Maۢýí˘U†ť=·ó‡k IďjěJqp(ą…=ĹŰiQ¤lY9gÉňM?Ń·°;ůô%ţőÇÇX^ü#Ee[ś‹>)hźß&ˇ@7)ż·Üâ4sr\~}÷öűď±ß~Űex`¶ÖSfrŕ”ďůrÔNNm§‡Z Iěľ{Ň»FŤ‚iÓHo°x)šg×jěőc51…$& ŔପFK‚ÉĚ|čęD×Âd„h¬(c˘ËoĆmě0ľć»s.jIIpL÷^Ŕ:Ř˝ŤĘe/ŇbÜ0’z÷bçČ[ŰŞInŰyŻŤ@˘0Óžęj˛˛˛ŞđEA”ŠÍ›y­woßżťš­[±Z˛’âć3 R Ţ|ă5jZĂĎM¦zÓv´„#’Üxe65pě~8»·QűëFĽ–­HéÚ‰˛-ĺ¬MKَ„P<|Ú ňrłi¨ZËęťí¸č€p(ŞŤ(Răňgě±Fc=í¸x)}_’@TŃ •nüüB¸žBH'”’°Ş |ˇ”č.N+śvt놽ăv7+%Ůi['±žŔ"”âąłçIZ&Ă !3¸ýÖľTTDĐĆb˘ęľQ _Ł!†KgÉk™Ć{?Ą®®Ž´´´fďOlx„@ćáX‚čęE;=őŇ5 )Ű·CŻ2wOmQ šű&nŕé{O`ôÄ|®8ĺCTŔ’\GIuÝÚo`@Ź|>(9ÉĹueËËĽYšşZÍÍw*RľÓŘw$¶<ˇâď e7`¬!)ŮR˝łä$òM?qÓi—ňŹŻŢděy7đ¤%Ą ”żĺűŃŚ=łŻ*ŤÖŘ뮚ě‹/bׯÇb/¸Űľö裰ßÍot˙P•„žyš).äńĺý\ŃŤ*KÉYűRܱŹŕmŢć@L­Iۦ° ^UŘ[]‹_W+ůf¶dčů®¨­‘|ůąŕÂK\č §öJő‡ťŤUe­µT¬:“BŰn÷íµ8¬E&+VŔĽ öń*ÎĎŕ†Çî'í¸ţ4\w9Ů›7Bj*qÝáx°ŰZ":­ńß­ĄÁDř¤ř~×éR¬K“°š·ÖżĹĹť."3+dQáI©5xŠî2¨ÖŠç>ŻÂBD"‚µë7ĐŁgoş>4žşŻ!cĐ8^ľřJHIP|ęŇÓy§¨Ý“kH±ŠU©G2¨ŰĘ©˘A’‚©¤´ľä‚ľÔl˝«Ă~®˘_iÇ'îŚh×đ…ŤŚQ±µx |g"ľSŇXţ'ô\B:!X§­üi»ż7ě߸›ž?­ĹVUa““ą˝@†%Ę”ŻFă®%™’Iź_-cŕŃůlŮR“°÷ ®Đ´/UꎳO1Ť+żąe2ś°‘¬ŐŰ߆Ţ2ŻCĽÎF˘ :"Qő’sŹ›Gye&·?fůŰýÝřĂčK.“Ży©5ď/ůśM»¶!dt9Ý­ÖůŃńÜŮ‘€Ć`çÍĂöîŤ5 űŇK®÷żňJěĘUÍîŞi°Üvt gô>a–rÎýČŘŠĄŻĂ€Ť·˘Ř·}0Ö)íZ·Ý ¶;’J)Áôé’éďąëˇçKŢ"ú–@ÉĺW;M˛Ä——Řű.˙ąĹËQF2 ˇ–‡§7ëŤ1 ËŘRźOîucű/»)^8N'^@Ĺg‹xřË1IéŇš7b ZP<çŰ ˘żűѦŹřnű<ęe=×t˝k-ďmÎW[fQZWÂ辣b÷W> âˇépN’Sřó”5śŃXcxűťéÔŐŐ1úľqôîÓ“ ŹÉúpö­ý©ž[îLJËńnçď0”t<%Y8űWV¶É źJDŘRQ<…ť»*)…¤P%¬+€ĘďUTUÖs•ÜJś{n‰ő4ÖřĂaă*ŔGAŃ*¶Q§Ńč'aý^Š(¤ŁR;śUąí˛äćb§MĂNťę ˘”Xŕű¬‹zëőĄŞ|.¤łVP䊰R6ľÔ'mU\ź ÖíI©âş¸MU…ŐćÉ;řî»wNÁ Imń:܇.Ź×i|ăňC˝ŻhŘc s:‚áLă® ç!d&Rľ\rÝŰ®ĹCĐá°ÍéŇ}ţˇçžKJj*Ź=öŁďą‡w^SŚĽ#÷(l’r(nľ"Šâ"ŔMR’¦ľÖ•îŚĆk¶­cř+ĐłuŠvmĄ¬z·ÓE=u'TžDXk×óßsvŇ$ěŇĄî:+«™.¤BiĹ—[Z2¨ÓküceWZ·†Ů«7Ň'ň5äM()>’l7ő¸±YsWź;›ŤRś~‚›?ç}ôĘBŠpŽ”|%UR’¤ ŢÚŮńôTlŰAÁ›ŹŁAĽvQ%·SNhßÂÝ6­J#Đ<·čDî>ă 0˙~:ę5¬P_ÓőŚ1Ł›uĆHă)Śu†°hĂ`˘=Â7¶ęQŘČ5·˙yÁ˛­€Çi'tŕ‰g桴 fxk°‘*#”OĐ)ÁÔ¨°ÉNHŚÂKQN1úO’Śďö%ÝÚ„¦Ü«*3(ĄINҤ IjşE(ę ¤‹6R9Č' Ňš¨j+…=ůděěŮŘ7ßÂvę„˝ürě?$ Ŕńű‡Z!‹SÉď©`ŘsŚLý”bďX°é±-ű j#Ř™ĄX—$ůk_‰ü*níŹ)Új'č ˘ ĄFÓµ…fÉDŕÇu<đt![JD‚µß |ć;ć›Đ_PţpµS›d>i3gćCÖPtÖy\7ę+ŢůűhŁđ ó}M¦}Wňňň1bEEE1úď`Pŕę§ yP¦¦­Űqes8Yk®3­%왌ՂÓďÉŔ®ţhÉjQHﬠßWţVěhĹ“ @ô¬5ĘÓ¸eÚď0ZQ–ÔL T“|ĂMŚô=ăřSůĎó15ĆPĄŠÍż…tN9Ą˙·Ö-3>ěh~ÝXΫ“.ŕ…)Ë÷±ŕ—]Đş@!$Ć8ŇظµßhWéŤß¸ł&ŮÓ¬¬‚Š]×Çy$VŕßBˇ=Ďăľ1Ýi1 #AQY‘_9¤_â{tčUĹUZÓ­ «'¬>Š52ß˙Ô“ö­Šh™©řbí:ć“‘±‡1żű)ë˛Z±ć‹Kür­~‰D8ţ ÉÝçKRžPŘo"¬j%qłŹ>Ž+çj8˘aMBŕźýĄ?©”ďt7Ţ4RŐž4 {ß}Ř»ďĆćpěgźąá›ošÝ?dk:„‘=Čú’ŞŞ#Áno?ëčŃ`jB»€]©Š7ĎmC¨$keTŐV+2†!:©"W¨ťqgýoÓ*„l´$ŃŮCĐÇ?mڵÖQ*°j]—]7… ‹7@·Ăđ’©ÝO¦>ě )mÚ´ń‘ßC‡ÔżĎťâL’E}˝ą`|´"„Ä }—MƬ°Ś w¶ůŞ´éńž/ŠôjďuJk´6xÚú=€Z7„o•›ŚTÖ)'ĺáÝ2U (±ĽdA¨CtTظ†÷°<_YY˙ľĆ9çôÓ#¤áŁĎá˘s{ńü”%,X¶P1†g)¤iăKMé„wďŻůŰćď_[ÍŞ á±ŁG»ÂE…Ą›¦ÄPâÄĂ_çFkĚ×_C!Hí«"ű•;ОGôŠ®ăŞ¸Ń4:ksX2RäńÍŞ čĺśÝyY•X#)­ĘbHYWVWäѱM–ďv+ľ pÜQŠ« Úř»„ íBŐW8cdÍĆu„댨ÚIŰ6­]ąK@ň]ÇOt3ža/(÷kŻíýţ]ş4»ż×ćĽëęňV‡Ś©Ĺ“™®×7Śv=ŽóęF[lâ”ŔX5ý›í©—Ü#ľVŐ6X±ŔÉŻ5úGSڰ)ç˝FŹ«áźSÖc«« 0×ÍÍ›0ő{ ÖhŇR`÷˙üÍďî/}Ď—ěÚŽŃ}aˇÜ’¦ŠbČ>ĂBýüU2C°|Q“ŚŰŰŃ”LČ6/BY}‚2o€ąďʤmK˙V TT1„omś{ŕ4®8€ű'ľ¸ÄĎ9pĎvE­[ŢśNćŰŰwşđ_!ěńđ~“<ŽŽk߯98lµIŢ`0ř Iš*ý-\Úź‰@{`0–uűří˝żW]]ݬ¶żwÍÎÍýÍjŮ4î^>ďďČ)/§ý‘G˛sçN رbŚ Ó¦ýfü‡örżÄfc_eň–kaâ›°şç'Ť ‘Ű+6W^±WŢ=zä%Š'& 1!ő@&üa\ŻŕŚ3ľ?ˇIöG9ńX|Óś%Ź6&Ó›¨ÚdöXcđ«™z®R<7ű6t]zÝ:¬1D%350ůćůÍÓo˘9í¦)˙ę8[_Ç®ň’FUH“¦5ŠÄËßţ‰ŁGçÎćĂÇĐ«W>O?=ź7ŢřP|ůĺìý±Śn=ň9˙üQ4~űqyëň•U`*đőq1n{ {Ś€Gz·"äěőŢĘ:nó»˝ń÷Ť IČc c"Ť Ąž łJ€śÓ2úě ńâżcüĆý‡Ťă‹ú><őf=÷¤ý›śTÁ¸Ęˇ\Űâ.<ç0.™Ţ”żn|ČÎΆ °ď˝çüwďî:Ń;î8 ”‘‡vË˙Š8ńD¶oŘŔ”éÓYż~=Ć^ůôSnzé%¸â Ľ/żüÍű_ń·ń±‚‚Ńß”ŤŞ+ŤQ’.'@nXđj ­şYÂoNŕńq}čź—B0`ţöZ—&gŐźŞş}ßżÜXUÖiŮi7WSŠ.ůŠ “ä‡SŢ\r‰›VĚ1 S‚6††;î€=5ş:lC=&&×’Ë>ů”nţoÍłL›gxkŽŰďđĘl÷,/Ďň+ĹMł„Š*ŘS µ5ÎúŐçŇ{Ů|ÔĚ C0¨‘ŞÁ•Çä6Ó4 ×@€Á…ý9ă¸o(/Żç´Ó:±kW=wa۶=äµLcëÖ:ňňŇظ±)śaSÇ2úcďhPĄľ´›v«V`˝TZa˝čJ‘ďßĐz ŞČ.lß!0Ú őV¬­Ťż‡„CiÁŻ•Î^Y&‹?°íÁĹw?Tą•’˝ÄoúţŚ‚Źł'‘ş>¤ĺ_‘ZU®«'9Ż "ŔéuľŢtU‘$ßčpn¶´oźXkáž{ś›î»îŠWžÄŠ»/”b0Đ;l čâvíŠ}ňI?Î~âĎ™•UÜ{ë­LxćV®\ɲeËxđé§ylôhl$‚}sęľă[KyäÉEĄě©i@_y'&Çlb‡Đ†÷Źδ˛;ąűöÝčĺxˇ·ęĐĐ |ĺs`(g˘Ş¬v•żCľ`x'EV˝ä_/ ľúZ‰H’‚›o– ş¬€ď6;˘ńAYb’ŇÂĆĄ¤Eb•—ö­ĐÉ+ŔkgAú…×řŞÄľŞm˘@It)+!I’ü=śö“óřp^9ťśÇ‡sKąđä|>[J•±„&MŠmG6ư†@ ČşYł`ŽÄřx¬eČŹĎĆJ?bćzN<Ťź<¨x|َsnî]44ÜNm˙“ÜögÓ@ íő~ÄłŠ/×Ö72śj_ZL·\ś•äŢ©E çu6żr8Ő[KhĄ5+żvjS›„s_$4WKéśj çgPKI Ů–e”I~ĎźPůIŕ'Ľ ŠÚ=kŮ´éc""‰^=‘ťÝ6a4ä+ië?¦2,H)@˛'"ČIv7¶*f$}ŘÎ/ă´ľuBĺ =~ĽâÇ|:IąŹ'rC‡ž¤W§RŢL ;ŹäÎm)ݰ›µátęaé~áLj#)xFclUó®Ť7ôí‹}őŐF(®ő])7SĺM@ (b—.0höé§± bűôÁÖŐąüú뱥ĄűŽ˙ńG Üqă'NdéŇĄ,Y˛„{ś§îżß5Ż˝Ö<ľ1xĄ÷ÓJlᯧżÍ˘­ŐüsŮ_=ZńŁ•Ć}žĽażŁ@| !…Ö°*,yč•"”1쨎uŕa~ăů!AUV*L@qIə钒­’[ÇKvírËŠ}{JnťNF»V,*ŔŤ˙Žő%Ą 1M»XĎߤňÇÎĆ©ĎPcŔŁaKÔżŰoěXŢް«‡ yóŕŢ{ńµŰܦŁ$4x°†ç–a­ĺĂąĄců`n)•ĆPf,‘+®Ŕ†Ăî8ďşÁV­Čűć>€łó0Ć2řńJâ*?TÝRŇŻ{ę롶c„ 톧Q?­ yŇ4BÁ ‰íXŁHMľa“ř|M55aĺŹ~LLUXú˛j…ąÉě|i«#de%ĹG~ˇ*ÜmĹXŚéësŃž_ÇN/µ!ĘĘkYľj*ťóZJkúýú=„R˝¨@‰‰°’Ee‚Ď6KúçK’<É[żď$×DS€×u.cĆteË–[(đeŘ_{­´4§•XW§:tc#…¤ŽS;÷ţxY‚ą9Ľűc€nž&U+VEN挾ٵx Ęsqt„Ţťł9˛ýĽůőG8÷â‚Pf‹0ęěćâƲÂűrĎÝeGÜ˙ĎěF şď-]Š}ď=·+é’řő×ÍăGQĆ>)?j÷MŔâĹ‹ůţűďącÜĂ<óč#®xéĄfńg–śBE]%ĂÚ[ŽoźM§śnůtťó· ‰W~ĺ*őođŢ®,>|u#­4;+ü5uíÜJ+eH‘µű~źä’IŰ\ĹÍÝYµ’©Ż f~. ‡Ý.´®‘ś}U>’xtÉÝ”DN„Ú*Č_B~Z'„ŽÄz8iđĎ&V˘ŁščçöéÉĐv>Łó•¦ZJ_ŻĎő|^·ŽQŁFń×§žâM)ŃB¸CJZ(Ĺ`RśyL.Ě)uŁ€ąe\xr/Í)ĺĆ“ó÷Y)Á·ßŽĎ˙­uvž`Ą/ż Eő\}Šĺ•Ů–OdžüX*3Çîˇő‚âQ†ÂŰ#ěyýµXü¨-ˇŞŕ0*?{ˇ ­ńc­%)9DĐ&^ÚÎť$LL|* ¸ń“›ń‰×űe <‡Lcü-ÓVSwö?[$V7Đľ]mŰ<Ę⏢|{ ÎľĺKBIi”Wnâ:†RZ<+ů±B˛¨TpSO×S?ĽDĐ>S20Ďçc|§Żř8s#Ő#iyíőBfĎ®á…Ę‘Ň0bDź|Ň™AÖÇĄśU,YČ»ÝĎańŻ;33 hÁÂEż˛˛0ť~-@…ë"•°”tnÝë%‘ĘG™ŁS€˝©Š6ňîeLŚżm+ €=üpě’ĹŘ=´p!öŇK°żřRŔ´i ąď>ţ4~< .dÁ‚ůŚ3†˙ň„kž>żěI†¶ŔĘlÝ~¨ŔßmĆZÚÄzÎŰ;ľĘéąó˛đe†.|ą© f˘K/îÂ˙wĎvŞ˛C{(ÎÍTîTŚzTRRęöť9óćń×H¤ŘÔEJĘq ͬĄÎÁĺsK±ĆňâśR*¬áOJ©«¶ˇC]ľKç©7¬´nMŰůó)şńs¦ĚńP Îx<Ł,­ŻGG~ˇp„†-†ěóÎÆĂÎ=s$‚ ‡i5ň ~Ůř ٶÎNP]ŻbZ ŃmáÚX´uÚ NÂMŚ1䤅¸íĹ"vĽŘ'^±RUX)7uŽ@TĽâG©E/őR¨«šAué,şdźL;Ż KΧeŰB’IţŔ—0Se%}Z®ď!xb…˝©—¤k¶@k˘S‡băoĺ¶L‰Uţ2„°a4©”HD3ë«®śxÂŻ±= x{s€üş”ŞfiyŽAHÉŻżěfŤ!BH_*üë5ďs^˙«°VÄP㎠J¸/‚i(cŁřoľéÔ|GŤrCk±W]…­­ĹNťúŰńŁ÷ź:‰0iÜ8n{đAľűî;ľűî;ţ8ę^ť8ŃA#_|áâçŹÁ /§\V2fNGjj7'Ě“ýá˛2<˝îLĐ×ňĹqWóÔúX9„Úűýâůi ·ö–& ^x^1ós%×\!rUeş šß—ăat\Ö|ŃIűtł ߼ň»ďąűż˙ Ń[nţ|Z8ě׌eĹó$ĂÜÉËSümŮľAZşâăĎŕš‹ô铎®ś$Xűc×—ÍőţcđŔ>5ŠĆ÷ M˰“ăç`̱±řć?Ť~ݎˇÎI°ĺă·xóÝ-´`[…Hî'űMÂß´?:łtĚK!2}-#¦_Á ·=B妭ľŞ±›ă+á+K‰%Ý˙Ś?BĘíŇŰWĚ`ű| éď™Pń|'„5’¤ôČďx<!%¸›ÇťŤ4šŇ’RŔ©bGM­ŰJ0 _đq‘¤JHţ~Ľ dŹ18Nk78“G8MŢE_±­4\îT—/îěŇm(ZńÚăŠüíŘů*ź%<ÜŰ7ˇ”öť¸hÓTt˙Ü{F_n(aÝş3~H{îúĘ-† MPÂ&CÝßB›Ĺúi§á‹­M”KIDATź”äćţQ7?ú˝W_ĹF"<÷ŘcÜ8z4sćÎĺ›oľáę‘#yűŮg!'V¬ŔC0my)†WĎ=Ö˙ďăPŇÝg`:O8¤ç_}číŠë“”•9z° Op×=†‚>í»ă^ţá¶‹ü¸v˝żśŹż¦DĹ ;ű2ú4nüUx `P9 ÷ â{ž¦}k]z‘ŰoGŻZ…Ý˝SSmhŔ44¸^ßďů…RD”BjMDk’۵Ł˙âĹ´;¶3Ţ9—ů ¶´ŞŞ ¶Öá0¶ľŢŮŻĄÄŚľžŰ6ńó”›iWŰŽśhé7Ö•żö{řPČcŃC¸ä…GÉ;{E›cäśPMPt%¦ śga…ËWé–آ]ĽÖ‚Á–Ř€%c@/Ľ€G "ŐKrۉqÓFá+Gó+8ݤAąĘý{…WÖ˝żĎX@PŽ‘E§Ę¬»q)Đ™¸*tL:¶‰JĹÔ•×­OĄoNĆ(Öţś†p®‹]pČŞ°Ö6Žżx±‹ź—-Z¸ŞlÓűĎž ™™Ľ2i÷=ń‹/fÇŽŚš0IăÇcĆŚáâ”n;ÂéÖ+‰–ţYą–^+I‡>‚NGJvlЬůĆ­•[ĄącÖJńůűu‡á7)RSŰЦŤäÔă5CŻĚ 9U3iŐí¬Ř}éé–Î)vŻŞ°Ć@Ŕ* MBĺŢ‹*mŚ*Šc8Ć€IŔş V'¤_űé× ´ź~­Ŕř˘VcކMóţ΀\~ąŻ ÔxŰôdŚŰ÷Ž€ď0¦č©§Řxĺ:věAÍ€SČaż‚6÷Ł`­E)I8Ü؆ֆKź}„Ě›–ńŔČ~ľžń嵣ŠP>îC7Ú÷©g¬› Ě5 ÎöQŕ¬8ŞB•¨lEµŽ;Ĺe‹µ ‚­Ŕşuw tĽTďĐŇOŔsÎ-‰7-6áşGúÖ•8¨±Š¸ě蛆:ݏţďFAÚču¨ńż_ŹkĘ ßüđ«1™yc FąĘnPţ5>ÔäîŕňĂMÝŔ·ď—='‚‰MÂĆoÁ„ňWĹjdő†üf`4}ô˙Ǹ{ÁÝ®b7}ţącJô˘nűˇ–żá$’ŤÍiż¦`"'Ř? | (f§ÎťÇmú[żqśŢŢť .‰Ŕ-_řqÓô‰+Ű&ôl- Ążwďo°ö6>ö< ĐĺÜs)ţüóFYÖô#9i/)NŕĂDظĎô7•*hZö•ŃWŘľ®.!˛+q±÷'&!Üó†B@üŮ•1tśz 8ďÄ[ÔňRÚ^~ éżţzŔůß÷?'î¨/HĎî—ŻHýűrvżPCÉýĎłý”Ű`WQłwÓ$ě őh›řmtüy¬üüÜĎôľĽ7\đýŤź ö»7ç ˙ß„R˝YSŽÁ $aĺFldě?!ާ€'HjqŞö]´Ç µÂh‰¬űšťĄľ¨ć!¨’®Ů?Ô>ȶ !¦ż&XŁ G¤ŞjA묅şőëhó%µë·ŇâĘKÉ;z ÖZv<ű4©Ý{“”ŰÚµ'˝M;¬1mÚä'˙T—~k9rěX”Öäwé=şc…[^3 ÷Őţç/üű?řŕh:wÉgŔ€ŽĚţęgú÷/důň­”m)C+CPÍß7 ¤MđóχšřóÇVH”‹‡/çe•¤ä-w˙ôôtż´–.…Ś ¬çAJŠĘôߍ­ŞÂžr 6Ý©+•””đč©»IĎQ|™RĚĹßĎ%ůëů„,tÓßČ˙ô>Yműm*')4 ÍOk1ćjlĘéŞ'áRęÄnt¨5;*ňč4S%•ľŞnO߲l?(0°¶Č˛{W1—]ŕ łGJNО1Čľă{x”~ýŞĽŚŠĺËÉŞ¨'¸kÖZ~˝ęئR|Ž’‚>sćP|ÇÉ»ůO¨¤ÔXFD×¶lAIIF·n„7Ł}đĹY’EĚ•ZXŤ–ŽňxéĹyˇÉÉIgá $ËRjŚÜ¸”‹ŮéňĎjí+ëhżŇűĎďłĆ÷őh—ßO~>śu–éz`=« 6pg!°ÉÉ®ˇöQÖţżŔ±WÔ0nY-›7—˛¤d cO˙#Ýëk -\Š-.Úoţ÷ýd}mŐ ›3ëű]D荱8+ł (ĚŻ™SÓPK‘kĘęĘ\ĺ7Ć÷ őfăćô?…,óŇĂ»yěçtv6h^<‰{Îş…nCϢeŃ·¤kŚŻ#ŕkď§Ąc:uá»QĎÓćřŢ„ĎĽŠŤÓWŔž_ńBM…X÷rťŞ­ëíŤ/vˇYéí¤‘$ §wG›V(­híAT•Üź¤nz&g^ţď‚ÍŰŹ§e«"Ľ”Ŕ*JË)_Ýé€ $ŰąÔ× r3Ž#-ó ć}ߊÜÜÝš¨’j…}\bë%¶źßňNŘ\ýăŢQÚ«Ď×´PTT)¦~¤¸ëAţäY_Eiá/íD…%%µäk`'ŃSßŔ‚™=‹ !¨ýĺGęW® hI[K0NĆkÓ–íż?—ŁŻĽŻUfw%`|q_ćK*!§¬Ăa”t7Ž cĆĐîÎ;ŮňôÓ´=šm“'ű Aë[¶”sůµ'°»˘žuëĘŇĂ“ )ô~Qâú[n‰ÉZ ĘŠçQŐ­Ů~mÚDUE–n={ńÚ«)- CŔ˘ÂŠc°nÍ*¤4d¶ČćČ#űůËXđáĚ0}7Ösď)ő@ŕ÷ťČşbU˙ŞŕÜöíůhńFş7Ô9ţ߇ş´>ŕHČŚZÉ;Ŕ¬0˙k!6Őł­ôzé¬ěő»G1~RO¶=ř(ą×]Ců3'9IQÖp‹Ëgä˘d}Üš¨J*vĽÄľ“°ţ|¬Ŕž'±{öŽ‡Ăš'ß•Ü{“bÁrE8,yý …–žżNëaLc<¬ b´&)=ČšĂ÷eźsLĆ©ä%µ˘,RFůŠĹ´LOf÷Ř{B’Ö2Ý鳯\AíŘ»(čÖ‡)Á9“źĘľgő™˙¦ő1‡±ýĹXĄiqĆéXmPuu1l6˝o_ÚŽÉĆ1ch}óÍäśuĹ'ú#AH…I–a–ĚZÍĆő%$) B!¤Űy¶?”řĐPÖ¸ˇ¶ľ®ŽîÝ»“śšB8, ľŽÉ=<¸űÖoťÁóđľXë±fÍŹ1Ł(€Rš˙Ě¬ŁĽ2Č xjS*ĺ&ť°Ş§¦¦‘ íćÖÓ):%ŃboĚ:źđK¬ü NiťËîčFáo€ÔS/@,[IrIöM«©˙ćj†Ýô0çžw2—u‹JşEIČΙŠŔ”˙>ĺ˙!ÔˇS*»vIrs“°X.xá2¦žźJJ¶AÁ(“QG0%ť-/ ˘bIIąX› ÉÜ%Ţ%±÷ ěŢőÄnŮ7JĽu§âĽÓ•‚cW\‘Çĺw†ţĽ;öňüł”’ÎťkY¸Ҳo`â(»¦’ /˝Ö^2áLEH$“®Bě®i ¦ĄGϵ»Hýy7ܤ´Ŕň㜼řÔ×|´ŇúICq1FŠöÂy“‚đćÍlť8‘ÖÇS2e Gţ@łô÷XUŚ]đ(qSUŰAY×ë•R¬]űGőďO0ŕţČsČŰžŔ*ÉSÁ A{::dů÷‹ń‚ˇF €ÖŠ!śyšáĺâdŠ#I„UĘŇ3ňHÖĆ_W÷=ÎEfzľoÂ;Ä Jť¸V­ô‰ {½$Vű˛Ö} µŠúy-śxď]˙{ţŃ*ěŹDě}:n Z ™ý!ů˙Ż‡Đ•WF‹-bĂĎ©çŐ0íGÍĹÉďPuÁ¶¬E«:QműqlÇ#čÚe1ąą©ś;4•Ť+Ý`o(í˝Eb+$všŔľ»”řć{ɦ"Á€ľŠë/‚kž­%r© r–OvŚnĄ´e‘ó@ěcťţÜĘÁ!ÚŻś¸ĘăŰľa–őTŚ}ŐcÜ ő¬ąJ2p Ś})Č}÷5Pť\ Ć_)’®˘ĄÜ9úŮŞ˙rĂ ´=šÜÁÉčßź_nľ™ä¬¬}ŁĚ{#¸äŢźňäIśuÖjjjb8nâ9ń°ÖĆţ—••ŤI“5kÖZúqË–.uŽ;"a‚˘K˝ŰĐ","F<"Brú “‚ßźíŃëŹ'Íŕ‡šBÔńŹ“Ç“Č`×Ć ęk5ZÇŐšµ1df„hßc3N˝ć `ąúŐ ¨čř°_&Tü¨{ëččIJ‰ôÚ]ţ˛‡?ěÂ~•LýÓŐś¬%ä ç‰őĆ“ß+‘ (’“Ý)ĺ˙!”8Hʇ>íľ&t Ú€h˝içŰŻ˙@§NÇ3p Óč÷<Ąśgśf(mH`ĎŘ~ˇ?IbS%¶¶9J  ¤âĂ%×_ä1ěŮ:Äé‚đ ΫŚ0ŽźF"­űôś¨¨ř=†ŕ#÷pévŹ'†5PŢ&Ą5‹ Â\ň‘âç?FXx´¦×Şzš“ęvňAĚX;„5Zä¶mü2r$&Ĺ uëk%?ţQvď®dÓ¦MŤT‰eâ¨G:Ub%ăâ¤]ştańâĹ ĂxE0$ !=ŹÔëďĆ–ďróŢä=R“SHIMEII(B)ĹëŹAĎcCܱ8›]u ’$÷ ¸žŻ¦%ńɇ•””ďpx©ď#*ÍÝ­[«WϢëšÄŐĺŻüę‹^6®ôŃŠ=GýúI%‘8›SÝîŔ˝oÖÓć’äá>Ę™ěz{iÜŮyÖ±őá(Ôˇµ"/˝5oľÇşÂĹ=,­Śä÷S»z5đźsµµžßôŰ·N©`1Pë#;R‘ě§ßřňa±ĆŔŻÜF)w]ŞÓ1eţCD9ť*qëÖ­ăęĂŇW˛U ŠÄRş]q~i96>DÇÎť¨®Ş&'7‡¤!Ńţ˙< P^^NŻŢ˝HN‰{J2CáˇŐ¤‚ß±—·ý=_Ľ–ƲµddCÇô41u[PµŹčj_Dn©?”‰@&~žź‘ź0 PŤŚÚhBjäFhk59QVHMMĄ¦ľ–—?Eë~-ygSvlÍ߉¶~˘ą'ţńŔ`'Bę˙‚·sçN»WÁĂ„B˝ŽŞÂ¨„uł>ĘŘ Xř<ś08AśŕŠ[Mé.üs2qáÖ}©7U¦MümŕíŐQm I&~NŚ–H᥏ěăŮôůQâ˙&”——7yoNć[ůôźňŤŤÂ÷R…٬˙:çLfä%e8ë^ڵd/ ĂĚ˙ě€ŘbÄÁ†=[ţ˝°młwµ1äËťmo?âJ˙¦ˇť›éض#\‡ă•÷Ż$l&Ř˙˙&˙BĂY€4ŽÔIEND®B`‚rainloop-webmail-1.14.0/assets/css/images/000077500000000000000000000000001361462701300204005ustar00rootroot00000000000000rainloop-webmail-1.14.0/assets/css/images/editor.png000066400000000000000000000203131361462701300223730ustar00rootroot00000000000000‰PNG  IHDRĐ0`ŕôösRGB®ÎégAMA±Ź üa pHYsĂĂÇo¨dtEXtSoftwarePaint.NET v3.36©çâ% GIIńQXŕ/˛ŔGkŚśl{Ę÷íŐ{ţŃ™™67—¸ÄÝŐrŤc—şĆf-uŤËŇÚ›Ąît'qŞÍułoŚÎőáŁŢĎzĂG"ATŇ_Qć9±Ŕ<7¶—ćľ<ż9®‚Of»^µ .ć:p†}ćŰ âĆy.ߎT5ő+qěZü4ă{Ű@÷eÖA%3ÖT©v@úř›M3 ¨Zdŕ!O×ɶţk¶‡Äľńg_é˛oéěyQň]sŰťDČ*­mfËJjšŘ‚ʶ¸¦uŤ,c—lKřĺŰ5aý:“…€QF:GŔ9a5Z*á6Ëž#ú˙¨Ů ¨Nb y:+®?ă"0´<-,śĺ”­<×%ŰSí§ĚOm…OÔÝg:SŹŔó´Bđ™ďŹxKź¦ůËl‚JłY¶Ą¦¶jŐC R5R%G"¨¨AyŤpT%Ő0Ç<°Rž¬i[O›ľś"ÂôޤěF?Źž·-äĽäűR—ŘĚňÇ-ě ¶‰˝™ŰČ^Í~†%=fkź´°×óŘ˝W˛ł~şf߀rłB7´Fo…śĂ  ąâĘ]ź<ĐöŔâť0{[:L¶O…ńÖ÷ŰĎ,,,ěÖ¬Yk×®Ť–[¶l™:.Ě™3'AžŃÚ^_ąre.:/,Z´H‡/v~49M۲XÇ@t^ňÍĚĚ*Pk)ý­Q~—ÓŁÉ“'żŚ†‰›Ž™¶ŐYcNá8›ZÜĚ& ›ŮDŚD{1ę`nćF€ą`nćF€ą`n´—”iqŇO,ă”â«§w®†Ł®úpt»>qŃżíkŔÁxͬÜпܰOÝtuuőhúv>ˇ*5§Ľ¶‰šáQ}3ÔÖ7Áí¬G˘bȢ}Î@jaNç˛`Óń˘}˝˝ź˘óŮŃ” §K98ŇÚMź>=AMM &L ×yŰůsgĎž ß~ű­:ßÎFDcľÓ!€ŔĽt |gÉ’%4mŚ<$?őď@AÜë÷îÝk„Ѳ‚­6** îŢ˝ WŻ^…3gÎýFר •%©ÔĘŹSeű äç–`±Ž>XGüýcĽ^ŘQTn‰;;Â=¬´[Qžřôä›ď8Wš«ąK`Î×ÎŇĺ@µő`ćý ľ)„źoä÷őpŤşŽ…ŕ$¦W’ŔöŕI–w|»’[eÓöß‰ą „ĹçĂę}—:D;ßÉ”ŠÍ(6«ěŹżi&š¶anćF€ą`nTćF€ąh8Ýi!ĺ]°€´ăZ€ç°:$X Áű¬@$AMMM;Ş®®†GŹ5`zálsJČM×#h~Ž(ăŔł+´űnXEÜř îűîĐ"¨{Ň Zé°ÎWo.ißW8ĘÚQ‚*=]úňË/ýĐyáăŹ?Nř׿ţ5O'!˙X|óÍ7U|ĘKĘ €Ł Ŕń|ţůçó&+J¸ŰER”C† ˇúÚ’ĄDĆčŃŁ× p+˝˝˝-1b^ÂH×@—HD˙ÓotŤĘPYâáĂOe°ŽĎĺŐ±Ř-{ÄŽsĹ­íĆÎ5ÁľŕäŁ-aÚ´i\[°/eS_´–u9[ś{ňz9Xť,Ę%yÝáĄň rśG-µó‹@ö:-‹l<•-CK~:Ń)€©U^s8hęÖ_ďfě{ÂČçr|bn¬ň żńš†CďŽút±S\VĹăĆ„ą`nćF€ąD¦atĽW …8ť[¶=ŽPîysnĘ–ú‹:$˙Ľâ÷/„@/  \¸pÂĂĂ[éüůó@TQQѰ|ůrg3\$¸YMÍ-qšAÔĐÂM×aôˇéZÁĂ'¸ňŘŔË%¤P`ţŽ0< §Eµ÷SĘwpÚCÓꬣFŤHF÷Ö[ońĺß“"ŽÔŽ<ť ť&şł„uP˙פëFů†¨ż˙Â{ď˝בÜOńmNswwŻ , ذalŢĽ™űź~ŁkT†Ęʤ®®ř© ź:ŘqE°%°¨ŰHÝ5ÓÜňxAît›T^}ÓÖtďç!†eŽÁ`u¦¨K˘2ED AÓ ‡ p˛tłAÓ7±Ö ´ D¤CŢhíą<`’Ö”ŽlŻáŔWW¶F Ä4`^ÄćF€ą\gźp‘¨¸#@¸D )ž$Ď˝}s!ÖkśÚmΨ´´”#Ęm%T\\ ĺĺĺ K—.u¦ŐµŁ8¤éš3¶˝¦® Wßň¸ďk ő˙-© `w:J«@Íé>¬Ü—Żsˇ}_áHi'ÎwdśőÝwßt8p ź‚+—˘ÖČ‘#Őů”—”Ax`ľA–á1b„*ŔC^]¨»!N•ZWŕ$ĺI˙7ß|SĐ?łňŚĂ‘>G__˙.×#=ÁUHjř ýFר •%I]bţ±đݤ2:zëŇ:¨c¬tňÚőW^'=ŔD¤'R^űKđĘ“©ÍCç›O2×lˇÎ™B8• 'ă+ÁčB%üŕźĂfę·mÇ‚-·’Ö6±%Őxó´Ş-­ndËjY/ś6˘JĚŤs#ŔÜb (j€’ÚXęňGb5$źůpď\Hô·wÍ“;×s˘č#‰:aaa !δś5vgq«k˙<¨~Ü&‡Ü÷•ű2-­‡E»R!â^%‹…ú†f”Ô¶G Ţ@/Ř©ŞŞN—$Ť}çťwĚŃáŐW_­ěׯßpyť‰ů†ęřńăáß˙ţw·GSŔptĐJ_&眬?üP€+ő7ś8q"é/‰Ţx㍠Կ°¤Ű‚xAň:;G’k’ďtŤĘČk?]źm›~EŐ,9xŚV\_u§Lv”fěň®ř¬ý p VÇ şm3>útUf’ľŐCôÖ©şş"*Sô°¦™Č®ÂÍqű­fĘÖîţޞ™·Ź!S –Çî´ýZŁWî»2ßýbŇ×ćg˝Ç%ÓŢoÚ¶eÝ´iSëŃ Ü=´7äN‡č( w|‚6ÓÖ¨©S§ţéüŇ»Hh7>m(¦MÁ¸!h?ĺĚ™3ąťcÇŽ…Ź>úč™/őwĂÔŠ˘˙ËX}0/Qß7?÷ąŤĎĽm¸ĄÁ)G-R“--ÜËŚ75ń¦¦ý†+dłpYµÝn>ü¸´ŠěŁ|‘?—egI7ňĎäÇş8ý1iÔÂ6‹ŰŔé/nĂ0Ôˇő;ýĆSľę,Ö?—•[ŰŔ‡_"ůUhGň“¶ŽŔ1¸Ë;wŁÇŕČűř†ă.őc° 1ňś‚˙w›Sí—îa'šŢ۶>×Đrîě’ä#ĘOĂmUi¸3$ uHC_H›4iRÚ_|‘Ö‘>ÎĚęč.?ź¨÷áµ×^ĽŮU2AÝ2‘BT‘®‰écy6ěŃut!‚'Xş1x„bÇS;÷˝í§3~Ži:ßmr\tžČÁ Ń2ÄC~¤„ťŻťÄO€´^bđ´–E^Á:"Q™rbÉkż4x‚Q˙W¤eńĐźdÓŕá‹úËđR=uOîvŹ'ý†ŕ±Ç6Á©Ëpyť+Ź˙ëŤÉęSmSŹ|iś8pś^˘ęUń2uÚ‡”%-H™ş%ťŰă‡í©««‹páj• Šp a_Š>űě3‘´> ÝŮOן,J± *mawřĺµ­›×éř ěG1źä;ęŻű x„8jË8, ‘ŠťoŃ‘óŇőÎř?řŕ!:®:äWÁ-5BĽ!¨"ÝyňĄř ĐyŰŽ“çŔ$ ëđĹ6ÜFÚ‡|žAŰČ!iOţvrĄm€‘G•vSÎŕ1çyřňĎÝ–ct8ôćÂR/A•4źŢ«ń‰*‡xxLÓS;~í˝ÖŤ˛ň|¸eϢÉ—ŔŹüľmŰ/ѧMž’#yňtšÖbOËor¬8y‰›ŞlČ ’q± uHĆ}ŤÉ¸µ*7'c[’ŃŽ2Ó=ŐÍ©źj{ł©úľÂÖß»ĂßÝ6Ę)/ĐN,Gŕy6S8t¨lOµř¨‡dĎŕs ě|ń‚A0%üdŹ–$_@9 ăiˇóŇS5ÉyhnŤ <řiÎ/ńË<ť“żň;ĺ“lđˇă9W iŃÓ٧–x ś§uş†uĐ˙2Ó7žň=Äň‰·-řůŘo–źÚ.ĂOúŠ#G ęď‰ŕ‹Nŕ‰AÝcđ V FݱT®łű8|ůĺéżüzÔźVß(ďůIőżĽ= ő˙L tu§§rč.?‚ÄĹîä±äž§Ś˘t˛ËŐµžň÷TżÂ]Z@Ţ}…ůPX  tuGa8…PX@ażµŇĽřzbo•ń÷úŰ,ą?ŘŰ2yHŔ®Ô!ţÇŇ_ßs)k€yFá?ąEĹGaçŢŞŰÓU§íLß6{wćľi;2Y§»ü˝STŢę›8ÜćŰ4f‹p-ł=áŘuËóżeXź»Ćn>{9Űú4#°8v8Çh—_„››ůyňź{+ložśé /iŇSţ¶­™ě”¦az*źőş\ ŰóB1l8‘ß8ukjřç+b;}Y“¤žnń§ĽůJĘ<Źey–ĚşŁŚ?ř2›âŽÜŮx6í±´üŤ'ňZŚ˝"JJ™wśšÜ•hąUńQXŕů´Ŕ×?Ąľ»Ô[aqş Ć" ďń†yő“­“~»*–×ëyółö˝űfZŰhĺďc?‰dĚŔŤŮ6ĚŽ»/­ Š-ŰśÓ¸)m˛ôg›mžĎ©É8|®1B“©s|I÷ů´śB«§¶˝A€^âD§éáî´;–^MBéIˇôśë®*G^“®xńf%ŕY:«Ńĺ§3Ůb~Ŕł(rwű~c“lmîź_?Ó5óĚ´­©GC Ae]Ây˛%×yóçxOú*ďăSËBó#ś`Üá0ł&,"eC@nłéÉ8ˇőńků$ßڝɛ™¦{GfoV-VúŻ>Šr <3 |µáŢz‡Řü•ŢŮ9ă×$h"Ůo9ť*¦÷NňQ˘;ü}„笍üÎłn0»ŕă^t%rÍńĚ:cżŚÇGc®ßŮ~üj:É_ďQÇőňeDNÚLţ„^«řčŁ(ó_bńA.Ŕ'ÖÓkéĄX@Ż&ˇ·ŕăr—‹ŹÚzn[Ű3é=á%óô”_bâńk{MµO \ë—S˙ĄaĽáç?Üî÷Ĺę8Wzć±ÚŹ)÷?™sµőĄXuKwů_)‹÷q|\ŕ)bl —ŮŰ”óëĘ#E¦GŮ条ɉŹÓCíöÝÎ$ů+ěďT×»šžÝ›™F FđA§˙×P¨ůw±Ŕ„µ +ŚçÔ-Ţ™yoÜŞŘc´oŽśhäGt` —ôšŹfDčĘÝĺĺaYŔž†'Ś~sc‹d)Ś_ă—Ó¤w­>]|+1Qµa{|>É×vIi¬4ÝkŚF'G&c@_źżKżü-ÚI§źŕĂç¸÷áĐćń<÷><"÷AńČkŇ/ž%˙–UhČŰ=9ĎŃ^R°'üźŻ¸Ó—§Ő¬đĄHËve>ülńďßJ=bzôë+\f4ţšä ż¦îÁWÖěşl—Ť@őTN˙Yµ×*ę<°g>€ők.ďĂ7U¸¤Ö‹Uňo\÷ĂņĐMĺ7Hľ¶{Öc§ňk‡|€‰ö&nż(ü'ì4o|e†G›ĹÜiŘő«@u#§4A“wç( *,đWYŕ+ă»!?xd¶čxfşSZů(őëîNŤřÁw—GŽšíŘ<Űqžü ÉçÜýý n9\˙ĺ©˙€–řţJ»!@Ó9%džQŁMÓ‹P>pňÓźLů>#ŰnĂ“ó»ÍŞ˘–-OĘź»áľhŃÖTż%´WÜ|®÷OícqJ3Ţú«l˘¨÷˙Á==ĎgILş:K‚'2éµrs Î΢ůe^ëÁÇL“Lߩߡ Ű#t8lż¤#äŐůNÁŁĂzŃ&%¨@Ę3îř{!Ç»´Ę@ÍşŠŮăßĬ·fŮ"`l–sh%0—W“©Lý<`Ŕ¶š©Ţ–Ę$|éĂ\UZ=_ž\Ĺu…ž `¤qÖŘőopŹĐŠ<ô—ľKç@])zMk¨ýmýŹ…ÖďC™Í?@ ˙DÍďÝtqzŻ?ž;6óA?Ą‘ů›U—2ÎŰDŚź70^–ŔÔćRúf`*÷41eJ8ĺp&Ji‡ţ]Ąuťľ#čą0šB …¤-€`qEŞˇi›řo·ŢÁs]kŘfŚ89âU¸‚VđH„ĽWÔG©wŇŠţ˝“ýµUóg˝ ć¨E-snCľĽ ›pź {ń7żĄ3óâ”|x˝"RŃ üí,đ’Râđw•®iŤSŠŢŞöÂo{—+EzmTş´ŮMéâÂłJW9Ď˙ GüF$ůDđę°IEND®B`‚rainloop-webmail-1.14.0/assets/css/images/empty-contact.png000066400000000000000000000035311361462701300236770ustar00rootroot00000000000000‰PNG  IHDR..Wą+7 IDAThCµYŰNW=c Ř´`ĚĹZ-‘*¤Hy¨ň›MojűP©UőZő)OT)ĄĄ"!@ $€m.ľö¬=^ĂÎÁžŰd$Ëž™3gÖľ­}±×°‡ 9ęőşI$†Ë<Ď“Ő8—k^Â4/™JĄfŞŐŞÜç:ĐnCH],žš7oŢ‹‹ ^©TD¨ľľ>ů@đááa3::jŇéA]Żăľ'ŔőŢaJÔ÷bw7Ä˲tznŽŽŽLˇPŔÖj5YĐĐ8­…ó›7oš©©)30´÷ěš„\[)řŽ€kÍ‹Esxxh VۇĚ přĆZşĎéF?>>n…\ĹŐz”bç&ü ýý}spp`}ýÖo“š&XhŤÚĆ=|°×Ę岹qă†Éçóf¸é˙®Öő>­, 8A“>6[[[M:ô}ZkÝĄ0>ŹëŚţž™Î™‘‘±h\*”@Ž˘Cw3śźśśgĎž ÍŐ.Çá„Ë5c™333Ó’»Ă4¸ Ŕź>}ę'&ë*˝™Ń÷ŰŰ·cŕŘ p1wŹĎŽŤšéééXŮR Ňpp8€ Ýő¨ńńlFh±]jď‰UÜ(nnnú‰§GŤOMŽ›\.×±·Ej\3ŠDłuňäɵźÎO™ÉÉÉ+<ŢsćlEQpGbęŐUfgňfbbâ đ(Dj\o@!PP=~üX€3sF˝¨Ý}$ ď´ĐŠĹÓ2 snllřŐ_ ×î†ßRNˇq¸J'ɧă„X`˝xńB4Ž"+ě`•Čşś"ă%ź›|‹ăZ.Ră®&°ńóçĎÍË—/ý.(‚uš‡† Ľżż_”VAćdAĺV—í ­HŕęV‡(iă¦|·Ő°Mć>śWy'ŔÝŔAćDpžźźŰ–Ó/IŰxVk çpP*ŠO? ŞCşbX9Ë÷Djś¦ÓŠßh"P“_”ýć8 8ýYОf+‡`źťµÚžČľUş•h»}cwkrÔÔp™­íťPŕôq‚§őććć$ŐŁçÄŃŞËęą‘HřĄë20÷ĘźŹbŕ¨cyyŮvü)“hVĹď¸.ţő €Ł-0¸ľ!$®±qÚ´n‚oÜOĄRćÎť;2Wp7˝ÇIF‘®ĄÎţýĎĽző*x9Á1Ý®Ł¨şuë–ĐvOęQő‰Ć śÚ˘ą9z [źÍÚÚš°zHj×í=±‰¬ą¸¸h۵÷dËŞµ““«¤°N?¸ţf á»X:3ëëë}(čĚ!}vv&uÉ‚P šřV#8—B[Y=p-ą¦EhůŃ_‹¶Ý—q8DAáFeîÝűĚZÇZÁŽáZůt”ŰÄ®ÍOéIho˙ (Ŕ ­˘š<ë¬3·oß6©AżÖi ašŹÜ5@oooË™“Tǵš­`Îq¬3??o?^wŇs>F ‘Ŕµ›ŔÜH÷Śä#ZU)ß­7čRŚ5kěÁ©,™· “ł"ë•( H˘nW–mÚĆôü.aÉ•3o\Ă\ÎťťóúőkżĚ{9š ÓPë{vöŢś)bŤ*1›Í Mr~ÎçÜĺ•+µF2yu6R­úX”Ż(cQ›@S`6µAĐ^ŽZµ0Ţ—Éd„ăaâŇV©Đ84 )‹ …’ĚńA›źÔn@÷ Ô~·ŕÓ6‹BŘJ aOŚĺőLĆN»ŕbś ă]Ćů/ÁęęŞÔÚŘHłĄ†Lßx‰žâvľÖl ĐŘC+ VĹËËź &Ţ÷jVĺř[}äĘĘŠźHÔĚš!Č čUă´é“ Iťüä;ü %óRłź~‚ŞĚmF¨Ćl5/5ń8Ě—Ř !Šy˙ó€eBó‘e „TĚŰ!UóiCđµKlóĄ A0nž6@HÄ<ó­=‹!4? ±@íú¤ÁôĚówb! Ż(…Ó„Äm/C_˘4 вě7ď_ >%€ë.&Ěü…ˇ±‘"qÔPôßZ1ĚËŘJ@Ó € ůî0ó]ĂpĐPô ęlpŔSdĬ§ř<ŞĆ Ţ‚$ůŠaóL_ľżW!®5&MCŕwÁ{°!âE¬ĂĚKm3|kę!đŮÄq Ľé^X»l ⛩7cxRrBő?Íűo?l7úF”©Q–Â&Ţ˙bŢo˘&ž ű+Yn†¤Ő%¶˘–v‹Ü„rFÍpE€`űćH,ňěO)Łć‡…0±Š5D°ÖX÷§E-˛ÖÉűîpO¶ĆŠ|>ŕPč"…?#TřSbîś &ž‰ “5±¦Çrđµ˙8!ǦfĽá:JȱĂ'E)g…•Ö™ţ\î!Ç–&ďŤrě'•Ăd‹ěďät?ÁY»%ÎÚ®&ĄdÇ^á:sĚÉÉÉÉÉÉÉ©¨ú`®ŇY.čüłIEND®B`‚rainloop-webmail-1.14.0/assets/css/images/loading.gif000066400000000000000000000015451361462701300225110ustar00rootroot00000000000000GIF89ał‡‡‡???WWW'''ĎĎĎ···źźźooo˙˙˙!˙ NETSCAPE2.0!ů,SÉI«˝̵ćSQHކ Ă%Ф‰˘Ö:VoĎ î”ađŔÄçâŹs&—F'Ź`‚KµjÁb-[+âpxł`1™lFÖĺé„-—G!ů,NÉ)Kˇ8[›©1Ő&ö}áH–Ó b+ŰľŮÝŕÓ0 :Ďç îpÄź‡đ1™‡Ă-ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)Ťˇ8[›)Ő&ö}áH–Ó b+ŰľŮÝÝqŕA :Ďç îpÄź‡đ1™Ám0ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ) 8[›é9Ő&ö}áH–Ó b+ŰľŮÝť ŕSQ :Ďç îpÄź‡đ1™ŔŤ@ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)ϡ8[›©Ő&ö}áH–Ó b+ŰľŮÝ]ŕ“a :Ďç îpÄź‡đ1™Á­PŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)… 8[›iŐ&ö}áH–Ó b+ŰľŮÝÝ0ŕ :Ďç îpÄź‡đ1™ÂÍ`ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,NÉ)C 8[›éŐ& ö}áH–Ó b+ŰľŮÝAŕÓq :Ďç îpÄź‡đ1™… ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,EÉ)Ç 8[›)!Ő&ö}áH–Ó b+ŰľŮÝ]Qŕ“ :Ďç îpÄź‡đ1™ĂsŤNU)€jąÜ+¸+&g";rainloop-webmail-1.14.0/assets/css/images/rainloop-logo.png000066400000000000000000000112161361462701300236700ustar00rootroot00000000000000‰PNG  IHDRk¬XTEPLTEÜęę÷tRNS§~‹îÚÁN@Í\hs%´řĺ2bžŻOâIDATxÚěŃAn! Đ!Ća``|˙Ł6ÓVU˛AŞ˛Ě Ľ™oođ9î•RJ5ő˝ź4ĺĐiż&?Žŕkşo ŐžÍCřaĚ}[ 3\k%ź{Ž:NvË>çéŘFA|qĂ~HÝ޵S|É)÷Ű­WŤŤbv NĚŘĄsůŻfŻĆ÷Ü2żżî¨8*ĄÖ’kĆŞqŮ'§§ VQ‰jts˙٧֍Ąţ€D"ď‚]ř¸jh·˙äż°ŇňM4›Béě{ĎŢĹćłř˛Î_ňN:™] ĚöD¶·$*)gŻSc깉‹$Ă.ă*˛ĚBöjŚ/fÍlËM Čň"ŻČĆć˙?µLŰéF›†$܇ĚËś1şHŰJ·Ék÷·ř‰ăżšŁřŰ­çăü%̱ ß$A?¦G`",›€bAŤŚŇwIý-——ŰŻšťnŕqĎ€˝±pAÍ!†\’µöĐ™QüľI­mzÝŽż†ĽQPď`ÉB˙˙Ţ.<éGŔrĽÎq ˙}“:!jňČŢČcµ6r–î”ÇtsĘ)ĄćPÇą\vňţB¬łrΩă÷?ĆUŤ›…]E­ă[“ZÖÇt …,i+Ůk5]E·&%ś é˘ýšü˛.ŤĽo¶]Ü€‚Ź&u’ШŰâ˝YŚ'ŇHţÚ~4©ł ‘&O˛ż´ŤC ŕÂTëíşŘ–N@Ţ&»řfě»ÁB Ęe (ä¶ź:řĺ$v5Ëj}÷”ŚÖđŞ2€5_wÁçĐÍvł4˛H‹d–fÎČMÄ –&u č¤ ‚$]ť_ŤITb Dá‚Ň­IIŔt’Żs&ł“#H¶é\´§p=®€—&Ą}Łî,Kj-IîY‚4QK/fŔĹLÖ#’fvÓY>6Ô˛,ÂZ$`¤«íÔ<Š7v/Ńč¦ÜčĽkFҨˠľú+pJŐ m‡cś¦“x[‡(3–P1uÓ®SrćŞ#€MÄazŠýašCČę~˙FWÉ'Ě‘ÁCc÷<‚‹ź†9:ç&§j@"-ńź) ü @páÓý[ľ@¸Q…cČ\Üt˘ ¸üíţ­ä÷ďśĆ†Ü…Ä\˛›Î°XŚÁOKÂíţ­ÉŤU}łľŚY©:F–áÉÉ\;•ĎŇqżĂ ·Pďͧ=Ĺy#Ć8}Bź#@@«ËËćÂ@2ąŚcÔé}¸LÄc®u`kaúĚĽś%@ ¤„?‰—Ă1ĺ¸O°¦wˇŠŚŹjŤá—áŃXÎ čeĹ_&Vc#ÄY˝«\.9ıo‚ĘŻ§q’VýË 2ćJ®Ę˝ÉŔĽůqoĂż˝<' ŃŹYcިîMj”Éuťť0ýŽx’!ün&''Ź0Ţ“ŇË­ ĎęOm(îž…+9ÖŹéÍËű€ {ýGF̱ţů˝‰€§áâ÷mřB}±ąŽC`HÇĂă žÇ-”őµ)ŕ”íšZęž—Ď ę^Â<˝ '{ß‘Kaîé^çSgńżźĆő«Î†Ns™5îŁę齍9ő_bŔ•F¤5!Á.gGUjŽdŚőUŕ ˘¤~łÖöKŚhÔ\kn6á¨őů˙ 7@f„”’+Ä/[˛ =čPë(¬¦§˘ ŻÝ'ëS‡ËŚč\F­÷mIĚOž(™ú&ň |O¨˙ŻÄÂ!Ę–TŤ\žřXĘËŢ 4jć*ď'`Ţ÷B®f|Ţ‘‚Eîç 4›úEę˙+1Ś*Ű3ąťOz4…}˙iCo–‹Ĺżŕ\ĺnrŁ<§8ç–$˙É{oŻ˙äČs¬Ňü3ú€ň­™Ą{"d}ˇţ÷ ×™N O”ÝéńëDd»MŤĂÓqeŚXZď©ńÉfčKň=AJ Żż\R„ ťŰ UęfÝXÓyş,‘)%ϡPËgP”dëG¶÷u}i˙wćë¦9lžą¸óę_sF›|_Öµ˝´˙-őNeŻĆgőŮ{ #wÓű"ńż’ŐÜk@ëÂZSC$çÄo×%ĂşXđŻţ˙ż®fľÓ@ŃÍ&k4 gPmÝčŢnŻż˙Ąď5Ŕ·Ż×6OLÁ=^˙v¬Ů>î8˙ÔÓÜo@'k ”ÂŘđQJ“Në†Yďëá7ů÷W·cÖ‰4©‡âÇĆÜĚ*Ü×˙bPçě˝k ośŃŻÉPݤ~gü‚L Ď ¤;pč‰săÁÓ˙7.ÇE[ëÁ/÷Ć/PÇö®l»U†aŮH„1vţ˙SoDŇąÍÜ–öCΰVö¶đ É(`íUţYŚ‘„LH¦`żŘ˙ îTAL|zýW† r7Ş»*žĽRćDűÄÔ/łRăźŘ@}~˙ÓÔE·^Çúušňóţ[u1t—ąŻ;ÉXTţ)>Ë_Ń4r;¬ž˘ `«µyÁéXkM0V7éfI蹥R«J°@Ŕ„9hę̸R€âÔl•%%lŃ7)ęź˙0tنhë’iÔ0Ą±ůLëK'»ě ŢgÇt-â´Ř?÷Ł`4%Pť˙3Ô|6(+v®ţ6‹¦q¶ń˛†9"韉qeăCB4Ĺ,ËrFI>ćuáńěśťj5 ™u`bDóř鸛ëżK >-^D=QqL¸˛j¬ptSuůßRěµ`螉Ď<ť*%C–Jźí¬{Éyť‚tPXÁßş-›ôPţ€†šĹĚ1 Ĺ”ĘË0Ó,|Y)€!8übţSd@Š“†Ź‡űů˙/]@j¬Žâä`‘řF•·ŇşU@R&.ŕŹ4Y€5™°żë˙áâ˘=éNzb{š`‘oO'Ç1Rjë’É}řĹ ̄ěCÓÔ‰0všŕw;˙ťÜÜwŘŞ´Z6KHĐÉ2Bˇµ{á1χ~…4-©hjý 0čbśN–‰BŽ5"•X(/đ®âĄçEkŹCŁ1HD~!EĹľĎĹEÉm˙Ń˙¬˝lśä_O•0‹hAžŔZWP°Ú-ŰŚAİśżú“tCłźł »ţ‡üŻČŃ^¬F ŐIŁăôě2čsĐďZ­Ŕa!˙éĹŁŘĘśŕކˇI÷ťýáK,sý/#H{6ś@FĽZŔZ4Dô‹Çź»·ŘqÓ’Óq ßô#Ł‹4şnëDŻ˘Ěó¸} ĺÉůŰh”R_őŮř5öE ü´Č‹ źľ"–â“ »’ßXD‡)´–0Ş,Oa@imě¶ KX9ţ3†3‚1ynů^^śžjD$vň10 $ŁľNćI¤i.÷&hmţŞŔDĨ»çÍcŮ{@žÝŻS„Ź4;6©ŘycžT 4`Ś‹ř»îkˇ‡´ą,O˝Öý·Îg§K ”ŇWçfÝŰç7öÝ–ÉËëů+šääE´ę¸Ó®çżř­­öznň_YDÖăq,‘‰ńÉÇYcŰóW429KJ´klJŢ«óŰr©jľON¶ ‚g¸}řřţs§ĹLSÓ7oý.>ń§#’µPBH´ă©ř+Áâ\dŁY…ůĹk\őcüŃłć82ę™BĐ˙Ű+áŻČU&.(>xš¸†ą2†$í4MňqţóşÇ9I6ďÚ`S;Qň4Eă˝h±ćż=âaţŠ#HĘ룠Í7ˇůÔ†nÍ[Vđ×× raű6ü÷žj.rëúnąŇĎńW4ŞÓé Ů×ŐŠ9gŐ©˛7žćŻčś&˙ĄîŃÓŤIü‡˙Eč´]oĂî$čář+z­Ö>cö5 x÷ü˝V«ź?Ç~OfŕŤű%ţŞ€JĐÍţőť¬†="Ő5üťďÔ ‚ßĂŽ¨GÝţkˇíă´Ă˙_ŁĎl§wţż_D?¦żß÷ÄÎţ˙ţâńęţ|ČŚqúuţýĽ4]WŘŔúšˇ‘ K÷ëöŻY°}×FM‡ý_OÇnĽůžě‚ůo˝ tgś?ý˙é!±ń†…Ť^‘JUţż‹×ćM}ű?×;•ńçŚüL9y/küýąhş—­Ńř˙ŮG l@Řť#.âż~W|5…Ađ˙j#«@ŇXĆ\ÎËîŹ.ť¸ 0ڏ/qĂŤĽÇgŠî[gĄW?ľŤ„±ĐßđWî×3r â—™ĽMá$sµĺ Ă€N#ydLüëöĘÝŘşÁ ĺĎśd *Q‰_úu&™W>2˙şÍ|ߍaŽ0ćôY€SÚ@€©ŕĘú €GdŤcQůcţşjjn!…Źl˘Ŕd ćäř÷öoćz^"řóöâýŕ%µnĐ´˙Y€ő &B/ď~“~•)Ó% ëďÝ2'Jă0&bH_:KŻ] 3Áś¦Ú›ý'!Ęäbڰ‡ćę˙ZÎľŤŁ—śQ> °^„ €é]÷dq ®1AÝÇĄS˝—9ŤH$S4_z‹‡•î>6™(ż:ź‚!C‘ă^.Ů荖cáZäłu]ĹH‰Ů#‘ ŻLcJA*n/üµÄ:µŚě ŰXpÓîň…ŮŹ^čz˝¤)âE2»B¸› 6Tsy+­µ´Ą1ŚŢ0ýW Fc :ë ďżÚ ¨wvŞ…iCR–6&Ş.i-GÂÂĚs-îaţ˙`ć墹biC´ytĘá_Ź…Č˘W®îjüĹ·‹ć`3BLţćH9ÇűX˙ľ4›°§ŔV´š¦w˘2ä"dAć}^ąŘK´őU­,`ǡďĆśSJ&Z{čĺűSÁĽE)·ŕz…C‘ś‘íÉÜí…“Zr§m†4ʼnÉM6ţůůď†2ml%ic}2±łnŹó߆­_$0sşř ™÷k˙źŘhđ™ »)BŠ‘öl˙ Ľ­ çđ78W’OrARčíÎQőôÔ½*†~ ŢűäµÎrË÷î[hţrż˝ßT€t)ĺŻh `´ŐąĎłŚąą0˝ät†Ť´hĘűáöTÎ.ŽlÚpÖâ±+\ş–AźĚ™&Ű.Xőń+šŁU7 »2ş|ÚüĐ 9Y;ŮĘčµxvo›päX ĺ0öĂC÷8i8 Ó/*BŰN‚Ş«sŽHkZ,dĂÓ«.rş“Ţű¶I÷RťG§fĆHsj*ŔüµoĚaŠ·ůŰwŁP«¬ăáÎVŽë¤‘lZßÝŻ{Â8FĸkăĹŹ€ugb«‹$ˇ%˛Őľ˛ÎŢ =Ťď¤qÁ3č&˙.ˇ)Îľ đŔN­‚ J¦Čťľ_™[ą8&I¦T.WR•ئÇř+ 2 1·í??'ťU6É{‘ÖßM Îĺ–rČň­Ľú|QJ­Ž wţŰU€ČŔ·ů|ëćą­Üäß fÁ¨ýHI/?ŢŔź,‡.¤–¸ňWţD/˘«ď^“=}„nś 7ů;[#W]1j #…á˙pr\BçÉŔÄäÓY°Â~ ¬8pŕŔ8pŕŔ8pŕŔ8pŕŔ8pŕŔíÁ!€ ˙Ż=aŕ¤|uÁ Ä'IEND®B`‚rainloop-webmail-1.14.0/assets/css/images/sync.gif000066400000000000000000000015171361462701300220470ustar00rootroot00000000000000GIF89aô˙˙˙\_`úúú‚‚°±˛_bctvwääĺÇČČjlm§¨©ťžźíííĽľľÚÚŰ‰ŚŚ’”•!˙ NETSCAPE2.0!ţCreated with ajaxload.info!ů ,P ŽdižĄ0l!*„`Ş­Ć‘5€đŮ€[Ť<i…P‘…‰…˘Ž¬),€IZř˘$bđşH’8„¨5&x‰5k <ňyĹďŹB!ů ,h ŠGŇŚh*Ĺਨ@$E}ŔŔÁÖĹŚ”€eh ÁŔ @ LŔ€đcQGB´ĺ¶P5 <Ş5UdQ¶+č"ľŁg”0¨®˘ˇŹAkĎ#A n…I0$ŤK7˛ H,Á‰-t*‚E¤Ă-Ń`¨`Ŕů1‰°—@ŹC7h/1f\)‹Ś&!;rainloop-webmail-1.14.0/assets/css/images/sync.png000066400000000000000000000005441361462701300220650ustar00rootroot00000000000000‰PNG  IHDRíÝâR*PLTE˙˙˙°±˛_bc‚‚úúúĽľľÇČČtvwääĺjlm‰ŚŚťžźíííÚÚŰ˙YutRNS@ćŘfbKGDH pHYsHHFÉk>dIDAT×c`Ŕ„”E@”c@’’zۤ)lE% ‹”´ÜŽNRj``SŞQş($@ FYĂ(CI3h PÇ&%- őOÍŽ"%56ŃFŠXm•ă{ľY{%tEXtdate:create2012-11-10T23:05:33+01:00Ü\˙.%tEXtdate:modify2012-11-10T23:05:33+01:00­G’IEND®B`‚rainloop-webmail-1.14.0/assets/css/images/white.png000066400000000000000000000001561361462701300222300ustar00rootroot00000000000000‰PNG  IHDRĉtEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbř˙˙@€ |~č2„2IEND®B`‚rainloop-webmail-1.14.0/assets/css/img/000077500000000000000000000000001361462701300177075ustar00rootroot00000000000000rainloop-webmail-1.14.0/assets/css/img/loading.gif000066400000000000000000000015451361462701300220200ustar00rootroot00000000000000GIF89ał‡‡‡???WWW'''ĎĎĎ···źźźooo˙˙˙!˙ NETSCAPE2.0!ů,SÉI«˝̵ćSQHކ Ă%Ф‰˘Ö:VoĎ î”ađŔÄçâŹs&—F'Ź`‚KµjÁb-[+âpxł`1™lFÖĺé„-—G!ů,NÉ)Kˇ8[›©1Ő&ö}áH–Ó b+ŰľŮÝŕÓ0 :Ďç îpÄź‡đ1™‡Ă-ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)Ťˇ8[›)Ő&ö}áH–Ó b+ŰľŮÝÝqŕA :Ďç îpÄź‡đ1™Ám0ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ) 8[›é9Ő&ö}áH–Ó b+ŰľŮÝť ŕSQ :Ďç îpÄź‡đ1™ŔŤ@ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)ϡ8[›©Ő&ö}áH–Ó b+ŰľŮÝ]ŕ“a :Ďç îpÄź‡đ1™Á­PŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)… 8[›iŐ&ö}áH–Ó b+ŰľŮÝÝ0ŕ :Ďç îpÄź‡đ1™ÂÍ`ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,NÉ)C 8[›éŐ& ö}áH–Ó b+ŰľŮÝAŕÓq :Ďç îpÄź‡đ1™… ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,EÉ)Ç 8[›)!Ő&ö}áH–Ó b+ŰľŮÝ]Qŕ“ :Ďç îpÄź‡đ1™ĂsŤNU)€jąÜ+¸+&g";rainloop-webmail-1.14.0/assets/css/loading.gif000066400000000000000000000015451361462701300212440ustar00rootroot00000000000000GIF89ał‡‡‡???WWW'''ĎĎĎ···źźźooo˙˙˙!˙ NETSCAPE2.0!ů,SÉI«˝̵ćSQHކ Ă%Ф‰˘Ö:VoĎ î”ađŔÄçâŹs&—F'Ź`‚KµjÁb-[+âpxł`1™lFÖĺé„-—G!ů,NÉ)Kˇ8[›©1Ő&ö}áH–Ó b+ŰľŮÝŕÓ0 :Ďç îpÄź‡đ1™‡Ă-ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)Ťˇ8[›)Ő&ö}áH–Ó b+ŰľŮÝÝqŕA :Ďç îpÄź‡đ1™Ám0ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ) 8[›é9Ő&ö}áH–Ó b+ŰľŮÝť ŕSQ :Ďç îpÄź‡đ1™ŔŤ@ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)ϡ8[›©Ő&ö}áH–Ó b+ŰľŮÝ]ŕ“a :Ďç îpÄź‡đ1™Á­PŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)… 8[›iŐ&ö}áH–Ó b+ŰľŮÝÝ0ŕ :Ďç îpÄź‡đ1™ÂÍ`ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,NÉ)C 8[›éŐ& ö}áH–Ó b+ŰľŮÝAŕÓq :Ďç îpÄź‡đ1™… ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,EÉ)Ç 8[›)!Ő&ö}áH–Ó b+ŰľŮÝ]Qŕ“ :Ďç îpÄź‡đ1™ĂsŤNU)€jąÜ+¸+&g";rainloop-webmail-1.14.0/assets/css/preloader.gif000066400000000000000000000015451361462701300216040ustar00rootroot00000000000000GIF89ał‡‡‡???WWW'''ĎĎĎ···źźźooo˙˙˙!˙ NETSCAPE2.0!ů,SÉI«˝̵ćSQHކ Ă%Ф‰˘Ö:VoĎ î”ađŔÄçâŹs&—F'Ź`‚KµjÁb-[+âpxł`1™lFÖĺé„-—G!ů,NÉ)Kˇ8[›©1Ő&ö}áH–Ó b+ŰľŮÝŕÓ0 :Ďç îpÄź‡đ1™‡Ă-ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)Ťˇ8[›)Ő&ö}áH–Ó b+ŰľŮÝÝqŕA :Ďç îpÄź‡đ1™Ám0ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ) 8[›é9Ő&ö}áH–Ó b+ŰľŮÝť ŕSQ :Ďç îpÄź‡đ1™ŔŤ@ŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)ϡ8[›©Ő&ö}áH–Ó b+ŰľŮÝ]ŕ“a :Ďç îpÄź‡đ1™Á­PŔDŁ*•r•"‰¶Ęő‚Ábňí~JĐť!ů,NÉ)… 8[›iŐ&ö}áH–Ó b+ŰľŮÝÝ0ŕ :Ďç îpÄź‡đ1™ÂÍ`ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,NÉ)C 8[›éŐ& ö}áH–Ó b+ŰľŮÝAŕÓq :Ďç îpÄź‡đ1™… ŔDŁ*•r•" ‰¶Ęő‚Ábňí~JĐť!ů,EÉ)Ç 8[›)!Ő&ö}áH–Ó b+ŰľŮÝ]Qŕ“ :Ďç îpÄź‡đ1™ĂsŤNU)€jąÜ+¸+&g";rainloop-webmail-1.14.0/assets/favicon-light.ico000066400000000000000000000021761361462701300215770ustar00rootroot00000000000000 h(  ˙˙˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ě˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ň˙˙˙˙˙˙˙Ř˙˙˙˙˙˙˙Ň˙˙˙<˙˙˙Ą˙˙˙˙˙˙˙Ň˙˙˙<˙˙˙˙˙˙˙ç˙˙˙˙˙˙˙Ň˙˙˙:˙˙˙Í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ň˙˙˙:˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ů˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‚˙˙˙˙˙˙˙˙˙˙˙š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙«˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á˙˙˙˙˙˙˙˙˙˙˙˙?ü_řďóögxŽ{Ţwďď÷_ú?ü˙˙˙˙rainloop-webmail-1.14.0/assets/favicon-light.png000066400000000000000000000015421361462701300216050ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢbKGD˙˙˙ ˝§“ pHYs  šśtIMEá  58ÇďIDATxÚíšŃgAǗ帧PB(y ˇ} G)%”úô©”ľˇô©”Ł,%”ŽPB9JźňB8ŽB ˇ”RB9Jřôe.ĆÜÎěoogł»wó}ÜŰýÍ|?»·;żßü˘(((((((hi<ĆČô hgÄ‹GŚ# •ŁĄÎłéŁŔW[Íצ3ŕQüš &‡Ž@,0?tÄř 4,đ4Ž„ć…/ű®ő1V€SˇŻ+€dÁţć¶'óĘő$ n>ŔŃ"A°¸¬É"@°ß:NęâFC°™WżÍš ÁeŢ >›š!ËĽ:g řs @ű†14 ‚ÄĽvîp} @ж\ä]ŤŐŐĽvM¸Č3H-!Ěc^ä¬VŠ/2h- Tbľ.*5_5e~ŕÍ|VŽ_'ŢÍ« Ă&@(ĹĽ <ÍăşBđiضM˘ŞO|ßy• L€Ç&Ň–ÂUB(ă±×’ˇż@×+ „ý:ýçŤlđ‡wjQó_=Í-» Rp€÷–úŰ~óSőĘx|ćÇy XĚŹ}B ~* Ĺ|˘Ž÷Íý´ŻŤJÇÍĺmϲěíç*đË0%żîÓĽö{?e—éľöűpb3Y„đŰ,Äó¬łĚkçíĄmMçƱŕĄ0*á!đÝ÷ /É8˙9đϱ3vsfE lÜ™yăńKŰŤ>6çL… îÄĽabW˝Ţ;M.†TR%®K9¬ŇąYu5ď ‚ę¤h7ŃĽZďO«‰ćóBĎŇ "3Ą±Ý쨵Ȏł ˛»Ă`{Ůű.C‡Hč ]bˇOPŞKIÁDĄĽ7–çŔš Ć+Çüä;ü %óRłź~‚ŞĚmF¨Ćl5/5ń8Ě—Ř !Šy˙ó€eBó‘e „TĚŰ!UóiCđµKlóĄ A0nž6@HÄ<ó­=‹!4? ±@íú¤ÁôĚówb! Ż(…Ó„Äm/C_˘4 вě7ď_ >%€ë.&Ěü…ˇ±‘"qÔPôßZ1ĚËŘJ@Ó € ůî0ó]ĂpĐPô ęlpŔSdĬ§ř<ŞĆ Ţ‚$ůŠaóL_ľżW!®5&MCŕwÁ{°!âE¬ĂĚKm3|kę!đŮÄq Ľé^X»l ⛩7cxRrBő?Íűo?l7úF”©Q–Â&Ţ˙bŢo˘&ž ű+Yn†¤Ő%¶˘–v‹Ü„rFÍpE€`űćH,ňěO)Łć‡…0±Š5D°ÖX÷§E-˛ÖÉűîpO¶ĆŠ|>ŕPč"…?#TřSbîś &ž‰ “5±¦Çrđµ˙8!ǦfĽá:JȱĂ'E)g…•Ö™ţ\î!Ç–&ďŤrě'•Ăd‹ěďät?ÁY»%ÎÚ®&ĄdÇ^á:sĚÉÉÉÉÉÉÉ©¨ú`®ŇY.čüłIEND®B`‚rainloop-webmail-1.14.0/assets/manifest.json000066400000000000000000000005551361462701300210510ustar00rootroot00000000000000{ "name": "RainLoop Webmail", "short_name": "RainLoop", "description": "Simple, modern & fast web-based email client", "display": "standalone", "icons": [{ "src": "apple-touch-icon.png", "sizes": "64x64", "type": "image/png" }, { "src": "android-icon.png", "sizes": "192x192", "type": "image/png" }], "start_url": "../../../../" }rainloop-webmail-1.14.0/assets/sounds/000077500000000000000000000000001361462701300176565ustar00rootroot00000000000000rainloop-webmail-1.14.0/assets/sounds/new-mail.mp3000066400000000000000000000356701361462701300220230ustar00rootroot00000000000000ID3TSSE Lavf52.54.0˙ó€d ‘5Tˇ  ©Ú¨C÷w~¸‚wwřNîď˙Â"ď˙»»¸ ˘(  ŕě*_BĹĹÝď˙ĺÜ\÷DDD­á ˘Á 4\\\PPÄO˙˙„Gqqqqsî Ô:\?¬y@|˙˙âÜ YÇsţ»˘'˙˙ÎsňÎsźţs#_!sśú„lď9Î˙ţs€Áóőçţ*Îb5Ű ®Ă‰Ŕd˛z0#Ő¨Nŕ'c*#ifK2Y˝˙ó‚d‘›Ť/ČL‚c_‡8Ńĺb(•4¦Ň©.ŐWÔ^)–‹żřćŤ`L`ô'•ŻőżC(\ŇT‘g˙ĺťsQ&J¦&G Ä4Ť©˙ď˙‡l”ItăŽxć2ňIv˙ŇŐ˙ő˛ŽŰţŻ#řŕ~8®€Fé ŤŻb?5›NĎý†ĚÚ}N<żřÔh76 [ńâÜ^AF…‹˘˙ĺK‘ńÁÚ2©T˙ţoţazÂ]6âř3E#tXş˘€¸ŔT8É˙ó‚d Ei\źęŇĘÍ·Ç(yukn¶Í$˘9ѰŘăşi­˙˙ęk0P\˙˙Ńß˙CżşŽŤMA¨ń’:ši¬ć±¦Ź˙řčÔďÎ9żťÔŘŠDß˙ë Pe Pu™JóÔ,"°Ö>ßę˙ęR˙˙˙a_ý˙)yŚb˙˙ĐŔc/ĺ™×·˙Ěg˙˙úPH—˙úµŮHĄąĂLT÷_‰rT €a1Đʲ“Tڰ(0Đ!¤µ¶·59^nÝ{ö0Ă ž$„hâ,śŚť i†˙ó‚d:mł>?®(ZĆążR8ůç©9ďĚ˙Şž@`”b˙úĐU9ަ˛žwęlÔćÎ(L3(Źš>:r-ĐÓMë­NĐáńŚß˙ބǑ”ş˙8|˙˙ę•!ą˝R›Ű7e¸§"Ő&ç ŕ­“é¦ćč»)ëM°\Ě4|óĎ©íňôz·˙eŠH·˙ÓëúúšiĂbó[B-˙ţ˛E]˙˙řčÔ‰ü¨i¶ă{M¶Ôa˛ŘŤ'ĂËë§•r%—ÂoÍĺwJ,Ł:^ęŻđ˙ó‚d%ÁsnŹÇ A†ńż†( …k»źđn@Ś)RJç}×ćç‘F\UMź˙˙—ga…ž_˙V†{×ţQ†KŤł]໊ą´2nÖ+ă˙˙ôŠu´ju´j{?O˙řl2pĎř°ä»_řűţ=!ŕDČTözÁT©ĐqŠ…@0Űk@ pŕ±”­ń@ř¨şyuńr3+ľ›7ý‚`qÎü¨> 4Ď˙ŇL & Ěś˙˙ÍP –\şÓ%ÔMněF9¬Ž×˙ó‚dA­q/ĺ´CW_Ĺ(×NvęI$™tŐĘĎ+N˘R˛‰Ă#¦ËfFlЍśINŹ˙˙ţ•"h´ bęË«Z,î’ő?ëE”—ĄGďI×­˛EDąETżEk˙˙˙ëHşxŘĽu/ţłˇUÔ"˙p+pŠ,¨ýWýĘĆ*ôÜż§ś˙˙˙˙˙o«j‡⛵˙˙˙˙˙˙˙˙˙˙˙ţŚ,WP!–ű Vó¨:Ý]Ä©ňč­˙¦J¤äˇÖőŁî? _â )uQ˙ó‚d' ©io?5Ą]«ZÚ^QÎżoWţţź˙˘ľ€¸©u˙­XĎ(Ż3©jR·˙ö +)ÜHĹbŠÁU‚şÎýAĐTT5˙â Şś7“€š%Iîâ0Ş™ ô:ȡßüˇýÂĹţęlß;˙˙˙üÖ4Ŕ\%+f¦˙_Łô×˙˙ăĂĨw˙˙˙˙˙ÔjFpŚ6Áˇ‚Žŕ89mT‰á~ ĂD b„f}=/IJeAhJgţ‡ůQo˙ýď<źCß˙ţřëé˙©˝˙˙˙˙ó‚d? e?]/©r~Â_M8ýIĽJđ[Ó]ąďŇ"QtF`ń꩎­5Ď‹€/Ô'€%óu»ţÉŠ@óüجyăe˙˙łškt?˙ö§V4ŰöCŽ{š¦šmvCµ7ęk!·&6Mä{k.ßýuŢ]@ˇź.ĽScź@¦?ÜJ€aÓ´FŔĂ B¨të°sź! +hśętÎä~±–$ę{ú™‡~ňŻSśŚ)˙ěßďŐŢwßm[˙őßčËc¸ö8¸˙ó‚dZ 1hßƺſŹ8a˙˙CÂŔ €•®ßmÇăl ďšz¸›ĚFKZ 05Źrô|ŁÚ4RZ.„xJ<óÄ}…OE4D?BĽˇ'ź˙*ĘÎěa®˙˙ˇ1ˇůčkH:űĄ?˙=ü0PL‘ÜťŤťĐîZ&«bU!?WŻo˙˙ŐţĎîىt,’}k#¶·|¸j_<‹Y*Ě_úç @WĆ !Îlh™&K’cťd l@şxwOĐ´±±5śŘă(Ü fS% „ˇP–˙ó‚dd%Ĺ`Ç´ÚÍ•‹€¦Sc0ćĄÓĂ}2*˘]âŠF“† GëIâ%ňQ˙*E¤›§ż=Ě~aźçž|Ç h|’ęDbˇjškÝş{˙Zżďżýôč’BĆ®˛di/č4ŔŇŐ˘b’ŃWú“L\ĐB‚SĐŔ$IŽLČr6Ęԟݑš!¦›­7eř|âH‰pýÖŁC_™QŹŰ˙ß˙őó¦O˙˙ĎU@*;TAjSŽ´P5°|ŠĆĆEŕç˙ó‚d i•Vžé¨ ęŠâ_Â8·Ý­đ Î<&8”„zDů¦‘?ż˙ů¦ŠÂ°Ž˙›ëůÎŤ˙ů¦‘‹©¦ů¬Š=Nn­ç=MDH‰!Ţ=sUd&8VA|-˙˙SP›­ĆK…:ĐŰT}85ŕ‚]S˙˙˙˙˙ţĂ€¸N*z·§˙˙˙ýÎţż˙şţ5"ş™4ÝKEÉź©EşÍL…ФY‘w·{)hd‰©xĚŘń™žď_A”…?ĚŇ(’îJ(ű)$ŠË*I·« n_}Z ‡ÂčC/9µAć]1f­ş˙ý?˙ű×>{ţş°ű÷âß4vOćAż¤˛Ĺďł$üxl5ż˙ó‚D í“jßćśŇÎśŮ8ÎŁ˙˙8tE ŬśçÎ=żŐŽ˙˙ÎśqńѨÔjo9Ńčo˙ÝźůŁĆ˙ŁÜâDżő˙Ž‘ř:IK˙ÁĽi¸ŹÖ˝W™Jž÷F‘“ őŠăv;űß?™ýF ´ů­˙é˙˙óŠ,G˙«ßO˙úš†Ž‘cź6ŽŢwęÔ ÚůÝM7ţŹqâdg+ĺ]ă¨U„÷I„®c™á ±‚#!9±ÄăŠSŇ4ÝwęţŁ0…˙˙čg˙ţy(E˙E¨Őđ˙ó‚d2 )łJ?mG_ŹĆ€^ÉÎąłXç˙]śÉ¦Ž68|ĂłR.%i¦ż˙0xyżu_ôŁ”&54ď˙צs ©Ď*Č]M9ŘnÂŽ6ŮĐ#™ÎµňŰ,@ćć ËZëír×ţ¨¤3˙˙˙˙ô.AhĂ˙˙ß˙˙ękM9Űý[˙˙Î˙˙üxĄM۶ŰkE&ĘĚq˝F€»ó¸° C˘µ ďçťŰtőëR`yyća†a†yçžŰŻIŻ<ńXFSĎ˙ýA˙˙˙Ź­qMűCä¶GÓ¬úV¸ –ˇm¶Ő(µJmuŔčgŤK'`źm…ă[Ţ4éňńő–QĐą>Öús ţž‚’RęęE3ui,5`ąŹ-ZGţ‚Ý4A3SĄŇ0ĽA¦˙­¨›•Đ­4— .dÔŠ˙ó‚d`ýďvßÇČ;Šú_P \Ç„TpÝmú«š&驚ͧ`q$ đ[ĚXzrIóf'ô­ŐôÉĐ[˙úf&„ëąźc§:+‘h¨ÇPú!«‘îŚtńu0q˙ő\LŮěŘ/÷b‘T˙ó‚D` ‰iVd%\J”ŔJ¸,9G[Ó–Çaekć˙˙˙˙ý€€ 9˙˙˙E_“Ţú'ĎôW':1Ć(b+’®Gťéâ &<ř©Î‚ęđá°m-¸1uor VćÔ§ç?äc_˙˙˙ţrǦ0),{˙ţż˙úę<%†¬ú~m56ľk"±R"1=#¤Wţj=ĂäTß˙ôSMoŐ‘ŮăÎÁĐP–Ů(4řŰ«‰†m8&~ßó_˙˙˙˙Őś')żű˙˙5’Ąţ†3@˙ó‚Dz µrß)G_cjÉľ:Šż# ©¬—C:˙R¸u¨ţT/ü¨e xLtż˙čĄ+~¬c±ĘľU`@€ýuâIýóŚÍĂZúô{˙˙,ľë˙˙˙ęÎ8@Ş7ů¦ô5QŐ¶¦šµ[ˇÎ6*k9żč˙ţu8©˘ zc·Sf˙ç.:D—řë–YjUt.6·]®Ď;ĘË~äݧ p!kz+Řě#žÇ[ü(˙Łý¸Ëęܡ#Bp4’˙V}3˙˙ű"qĄgoÝ<ďô}×˙ó‚D— Yi`ďţo ÇózűKަiŞś@^ýżß?ţîx˙˙ř†YôXR:U4:3%VdâA»Í?÷^čPEňç˙˙ŽŇ_RRŔŹvŮWŤuE‡Žň0/ˇńj Víżoď×˙ó‚d¬ Ą3B?­ŹČŇ„Z8űőű µő—»S JdUź‚a]niµ1ťŇMI•ťh jšĐg™ |ĽuF[ć…âDRF+¦µň_'Ä)›Žad A2˙Ţä‚„M2dBä™@‚bń"¦dŕç‘4)żľńČ 6|Rćä@¸TspNâç!ŠRĹ#STžlžiôÖî»ůąČšËéŽahź …ĂDÔÁŃ gĹhAÇ8’ೣ0AQ.ątÇ˙˙ĺôÍȡ8ho˙ů˙ó‚dĂmďfŹÇĚś“Ůż†h4nH¸;ËUŚ’Ú-‹E˘Ńh¶Z]s¦ČQC_3 Ţ·­ŚÜýlĺăUú óbD÷é¦u9;úfŹtc8,̨˙ô4j‘¨Čşdď˙¦ägu˝iŹBâd«‹Bűęc¦";˙ýâ Ózoá๪ dI+ŘŻ˙˙ŰEhŮăÉß»ßŘL UvM[k×oĽĺG5˙ö˙˙ą¦Ž›˙ů¨ĘÚšŠ˙˙őcÇE­ôŤM1ô<ÓXuż8‘˙ó‚DA éck?äÎÖ_ČPĆśwÎ9?űHo˙ňĹjM¨ţÎűÁĐ·ÇvŞĽ®Í+IkÄroüĺsÓ©žßóµ8¨2,µÎüçT&ň­V˙ő"qdăźĐá_˝%!0›ţ¤#ÓŃ?ű\{o˙ňĂŐMA`8Ű{¸ąßÖőĽĄĘ¬ś*w¸E»ć«¨/‡íšě‡Ô°–˙˙•±Ę•(LBó ľÉ$iö7d9ęÚUÎ&CUË%]Hç§;>v3÷VÍ˙b†ł˙˙ó‚dY ĺiVźeJ]i*|TĂNp*= IDŮXOQŮ,s”`ŕ4âM=Č˙á~†ő‡eŞ!8 ł%’@ć7˙őĎ˙˙G˙˙¸đDEŹ"%ýßBo¶˙ŕˇçë=ę$U@&»}¶˙đjK•ő(€@ކ‹["Ě´Í4ě!§ż˙WW” uVE>ş=§©¬^a¦díí´€Úł«QüŢöŞ)Ź{SiĂzji†N;˝QH´ÝNB‹:ŚU·H÷cß°§Řç|Ă«Ź˙ó‚dl _W/¨¨Śń"µżB8¨yď˙a˙(–©ĚU|G‘@†ú(r7˙Fę”}kţ¸é#ßţÔÍ%g ›XÚ/`˙‰tĄ”+±Ń(”*‹E»Ćň±eŃJŢMŐ„^ÚšëIŚ’#šCoAíąWĐjh•QűPBTf$É ţ‚ÍÍŐrč @Ę$†¤\«˙µH$E |Ă>IŔ PjD{pnĐ@G˙âF [2xĐľ_7'ĚÍĚO€P0Ł€É" ^lŚSć,˙ó‚dińhßÇĐ› śh 0|:O˙ňáĂDÓ/›—ÔĚ›¦¤Č‡ŕŔŚ"LgE¸Ş*B<"¦ĚM˙˙˙¦‚‹˙ú9Âx™µéľ~ťňµ(eşŞ@c§>cM1:?6CosíýWEˇC/žE˙43)Ź52eŃŠ&(˙ő!AQsAěI›’C˘V_˙úÓ7˙Će0Ě Bµ˙˙ÝM˙âf0‰i"~|Ń›˙˙úDŞ /ş n‡­Ż Ńç3…¶-|¨W˙ó‚d 9±fŰçś‘jéżÇ8őúöµ±·¸68 Ľjr$\ĺšĎŃż˙Ł đç˙˙˙SDPz$ˇ/ők ‘ÍQ¨Ô•M5łŤ4އJ­Đls±§üâf–˙˙Í4ßýMŹ ĹFŰTÂłC‘张źóYYNŔńĂ‘ő7śűĐ4ö8>űŐÎQw€™şľ]Ďá)Ěĺߊá?ţsť€óźţB7©ýHÓčNsžB矉ÁŔ€ËŕůĹH”řś‚Ý÷mfß˙ó‚DX ,ńjß-MŞfć^8†şđÎëá†F*0lîXú‡kşţyčŤyĎęý SôA˙˙—î×r®qŞw>hNq ş'ýsŃ ÝÍÝô@€©Ŕűý`ř|@ Dśl¨¤´RŐ…©ë;1ŢŰŞuán}Vˇpŕ.áý­ŤkŐWřfżőŻ˙řfb`̆Ç9Ú{ąĎ¦kn§'˙«PŃč˛58ăŽ;×ŃÝçóM4ÓI 5łă›ú䦚<+%†~Í˙`ó[.Űď·ß€˙ó‚dp íiZß= ]Yęň^šb_r‡˝mÁŞ!›‚żľůU­ľ멣˘)$ Ť˙˙ô˙ů»4lH“{;ą`hHţ6ÝÄ÷˙Ă^ •żąÜ‚ä J7˘3ą¶'.{»˙ŔxĂşµJN*<Öź˙˙š"€Ń¸Á&˙uLÄvë˙ú˝Y 4Ó[×ë]M˙šŽĹ {}çV31Ńţ ë¶Ám·ŕŮ·RŮĘ஬®b4żó–€ Ë¶:5#Ú5çĚ5żýÂ˙żőŃ˙¦ý2Č(˙ó‚D‡ U3>?lç\˛Ňµľ‘Äşg+|ĘUĚűôo™HÔîú§żu@e<1[CżÄAŇUAo˙üRÖ±—ółŹ)R(}śŞî §?ŐĚeÍćcsĚ˙ř„÷ÇŹçŻěŽ,ž­©Zč+ăi­5Ô!ăS#*q{;¶Î%g:˛©Ď̵ś`÷Wía…TT"tX5Y›é4}ë¨Ĺ+jßH‘˙ŕTä kű 8$ rŃ© Ë(ă‰EÔPCXʦ·˙ř1¤˙ő)DŐQvË˙ó‚dť 5IRß`ĺ]a.xTĹrh§NZŹ*P$ݶ=vüa®w_¬)\đRßŢť;ůäkżć z|Š{0‚" ôďĆ˙˙˙w݉˙Ă‚•9÷ŚźB6B„!&9Ňs“ú¶ýŻę&.˙ô·#6ĚŞqpp`łŽO·¶Ż_…ąm¶ h ©ďÔ3ż”ş}Ň“ŠR#;÷Ĺ4F(đ |B$ODD/'w?Mß˙˙ěX?˙úę-K[’ŰFoçr_ú>jQ'ʶFµĐÖő}#6cNú˙ŹÎ˙ŕ훼” »lŇÝ„13Ż9SČ]Ô)dżPäâc˝Đć‘¶FľŃíúU”b˛tlgžĂ-egoÁąř|˙ó‚dýá‰(uŞ\‚™‘Λ„ Ť4mŁÜ‹ŕărV<Ą5ý5ýßÇţźWżđ߼ŐŃBí ~ýäLSZÎXĐȨzŻx€ň%÷˙ô‰OŠSć÷Ý÷Šjľ;Ć{Ţ>"ŢPX|‹ĺ”uJFŰm¶Ű5 •+P±„d‹Ô\bŃťçpבąÎsşSśď˙RŚ„P01 s˙˙ú©€˙ç:‹Ç˙ţ .`EÖëvŘ"]S¨ÝI¸Ľ§ ś¤#˙vš„‰Żô„ą˙ó‚dô-?D?i/\ˇć®^1D%ʎ!ÇáQ(éyʧ䤥)zň”ŁűźbĘ-q#˝ŻÇńç9řţY~ńÇźřŮć5f“GL×ęΩiqÇZ\iemuíwĄůZÝ-57u–UłłMM¬qß5.Ç™n–[J̤đ÷.éúß˙˙ţ˛Ë/Ç+¸J­Ô› Á_*wg,“µŘ ŽI$’@1 ;ŰCňQ"SfµLAUöĺn?ĆTĚÍž\ľľ¶îäáÓÍľĘÖiZłYťťßťÚhâTd@(˙ó‚dÜĄe`ßA8]şząľ{ş’öOMMüçS^â0Zó!­Í‘Axl,’?ýVĽÖn‡8˛q¨˛cżę€3e’M·ńÖޱgFaö‹őŤ;F‹(üÚŠ7_3{‹ĘIhësSôš,ĘëZOTÄĽ_‹S_Ô—üŢ««ŁÇ›ű©¦¨čÖsöôQŘÔÔwâ’ű9âI„ŽyĎĚsłŐ‘Já±#[™Gţ8ěgěѨÔ×`¨jzŻŽŤşµ?wWu*NĐf.Ž˙ó‚dy­PŹe§_2fŚöŃÔşŻ ‘tÜšqŢs\ČśsÔtޞÁP™[Ăďú9ÄÁ(tď˙űs“Ô…Éu!žJßýM:Źťéô9/ýaŞs+ŰíĂł ż+’7HśâCAࡂM§{„ Ŕ–Ěća`{@& ±aCőť äa-S}ţŠ+%źuÔ*2n`úő˛©@[_?ŠnžĎ*«™ŘłQz™M«ëams !1ţďéÝ'í¸ćŮ/óů1]k~ŘčGŚlăľß?˙«˙ó‚dť%4?r\©Ţˇ‹N–I.ŰKG•ŹŠÓÉPÄú?ę¦LŃľ‹”Ž„˝ý?­ŁĎý<çÍově謩WKrO[E `®ŮGXřÚÁ7µŽÝżĹ?×Ă©e©ęN„V›ŻŰß÷>Ă’É0¤<-Ç‚d q3ĚP~¸93o§§ű+eE&}_˙˙÷®hžG\Ď„ű»ž”@a˙§ Ý ›ş"DB.J”éˇ?m©˘„Łt‹‚âFÜĹ=BQ‘/řM]8˙ó‚d{!PŹec] ޱľiÄ–[ĄÄüšĐUÖ=¶&}ZĐ™‚@.ß3W¤-w,†ÓĎ&î.BNs˛Żţ®B)˙ő;óŰŻ™Pťß#" OsţRĄŐ m•–Š·Żţup—ßPŔc—đë7ĎéŰ8<ŽĆ0ۨá'|Â%ĐD¨nż(‘–ĂřĐmßöŁĄ{Xç6i°wľ.j˙s®ZÔÇÁš4ë˙íX‹kéÍčô¶=ť›ĎńŁĆÉo˘˘çĹÜ–5LJŢł˝˙ó‚DuŮkLĎ`«]Zj„^Âş\iG$‚‚Ěý7ţ/3lA“ĽS5eŚ/čďő…ś‰ŐÍhqÖµ0HňMC˘šny®úű•ŤŕFÉT»t–yEäęA%˛“R($íZ”ŹIĚP:?™ä‚Đ4K74zÔë{tťiQcTŚĘg‘zŠ™{ęȆžýżőŞ ÉZ®Ű„nöVS6žá ;xĹ©ZŔcűj=%n‰±Xzaěčsšĺ¬pČjµaÇýŤ5Ť(T Aj‡?ţ$ݡپ ˙ó‚dD}µD?iH_ŽQć„~{Jh˙˙˙ć˝`]âÜď[W »¶×˙ń”×W˙]­ű ?Z4v,,ÜZBÔ7űÇăĺk{řzým yŔĽyđúé¶Ć- öš7řbsˇc‘ďm kZ¤˛é«n1ĆM‘­­ş×íţVŞ( 7˙˙˙˙ţao˙ęŐ„U~÷m·ăľţ·zÁBm/˝ž™Žůź"ą‡?5´‰:ĎQ1ą†4‰aYGUQ`¤Zó?Îő¨ Ó ĘîN¶˘_©Ţ–ŢT™ú—‘˙ó‚dJ =±LŹ`â_˛…| š I“NŢIÔŇTĚEi$x3ŰBwSq šŁt;x»Źj-&I$’"bńsż+ńf ĚűŻ‚÷˙‘¨ÜÁ$«ý4zúÎZ¦¬ŕ(©¤żçö5ęźűunŻŃżâŰhÓZG¦–ݶ3ô‹C„ŕ ®ËOŤḻ†$Ř#Éá(\Ăn `‹1×óoř7&ßúJvdÚNßNß‹tew#îď#sh©mIÖ×Mß(ľÝÜBg'C7CU˙ó€da ‘LŹE_a&•ľzĆr=†Ő÷ˇŐ! qÉ$€vźr{m0:ú4n]OYąţmúäđDaaŇšť*tň¦…—đśÂÉ­Źú?ĺjA›ŰäLĐg†Ü©2»\3[ü§htëÄ‘Â"…¦Ť8˙ůE8Č’šĽ†ý¶ý›ţ† 8S¨żG4ĺ9NŘĺdwčýLzŁšŠ@FH©śŹj±˝éjż9Í.5ůń!Âď”2Ł˘ť˙ôüt­ÝhŰ W-Öę–,gň˙ó‚dy 1D{hĘ] ™*Ĺľ)rŰ-”i™Ľ¬oçµ)Ç?ÖÓQPËüŇÇQ(p‚śď˙ţ0X˙ŕJ [Ó×íÄs-Ţ·K"ä8 5µˇą\żűô8Ú04»çhrťśĄ7ś=˙; J)ů»9ŞŁ›Ů{Ű59Źš¦±Gs69"u[¬ßZ©¬w×Ě\âç˛ )Đ» ¶ źľ*IVpÁźďřě˛//îíâxó;d\č1QŐŽ˝µáCćZuˇ¦·?Ó˙ó‚d– Uc8?hę\&dTĘ”pOGO0{ęČ˙ÖŘú?MQe‘ÉE-N~îApB¦…˝”ČoÜbŮ˙QŃąŠK˙ú™@y›k(˙ŐÎŚ!y čł:ę^®CC± ;ę­ŮQŚť‹˙w˙ô{RîĘBjŹ×nVtčĺL÷3®ű™]ŕô¶†ŚqÁ‚r_#0# -¶€ ÜŘĺjYtHB U?›d˙ءŽ;˙ţgí˙ü–}›ýü\qÍ9;|ÓŘżV{~w÷ű{Ń 'ZU@wv˙ó‚d« eµ:?m˘_ rŤľ‘Nşş]nŘ^ź˙·K" ¬ă7h—Ą3|áž’.ó µc{$9&ľ5şcřofĹbG_˙˙˙«ŔAp\2zëůęâJ#%<[Ť´,a§¤ÓĆÉ,8ÂŃ^&~ľăŞ˙˙›¨›I>RR~ćŢľ?†2Ř˙’,e?:’ 1]ęŕů¶şÝ†Ěż€ĎşŽ{ůů8ĆÓ70 ! 1iLŻů t?ŕBaë™úš*hX ʤ÷˙˙yĄ ’8äJi¬Úź˙ó‚dżaaLß=č] ŕέľĆrĄ­Ě_€:Ť6Ö3 ŤółČgËŔŕţäË'›6R!Ů=aZ‡=;ĺ¶XŤŰž@zsúL ±ó<©K‚uŕíDłgVŻż˙âő·łÜGŐíĂň;‡ŠQ^–Ia6µCUŁ Ú1Ďy¤ń«őośo_˙«[4˝3Ą˛&/W8¶*#$č8€O˙R,ŕ»-¶ŰhU™5˙é ?éCŰľ;›"¦âęL Č7SUN,«B§ć»ţěý˙ó‚dČýAJßeŹ]ębľ^I”»–‹x¤GŤżýžěŽ×gž¤,E ÜÓ•-B"ÄăĹ˙˙ţÄeĄ+űŰ%{bßöóÎÍÉ3%r%v#fČ‘mU­GW(™ÔE˘,cJăAĚča^ßőcGhM‚XÝVŐ˙­/[jZ&Fßţ‰*N!gEI"§RuÔ«ëtv¬şŁVJ´}»tT‘°ÍhŹj‡D ÔF¶† IŽ@÷‹çuž9T ®ŐT/)zďa¨§ä*§f€ŹťÔ±żđ “ČjDť0î ąŇ4Ë۱έS‰˛Čq}Lt˙ó‚d™ń±,+iŁ^ˇŢdT’Š”|˘&ŃË˙ęP g˙˙?Íţ‰íč,yčŰęđ­ŻŰ]żÜRZ’@Ľç© ×kęĺYwq㍧řÜuy•ĹĐ™˝>şo˘)&ý÷˙Ä#ľtäî[ő}(ßď3jjDĽQ`ŻŞäŞAčÍsR1xş~×Íý~ae÷BňŤ”5čsDíš Ś˙˙Ŕońgűűz.á/xVY:”_ő!䩯ł$ťŃüď¨˙öjA ë w]şŐ^˛XE˙ó‚dŁ1ŁLß5_ Ů.\ô|pÝů˙ŐÔŃěÖűuŢ­m˛dl„tزqřź ¸ ý€a˛¶ąŞ}‡\ěPŞE4/¤ľŁŔ=MvvµxR+ Ďvl¨Ú ÚĎşŠjÉŠ![ěoµXco´†sĽ™CŇą50‘Ęő5ĄCŁ~ÇŁÇ>\©Ě×*…Qá÷ţ‰í%H% Ź[gŔŚČ“»%ç|†źlçý.Š<¸®­íçwßËĄĽviögd*~ů¨rE÷±š:˙,Ěţ˙ó‚d¶}Ż0ßHĺ^r@Ä„”±R«V t]VňµŠ@(cÍĎKŢůNĽ”qŚc'—ŰćßPĆ0 Ďž%ýŢe(ĆĹ™ĎĎv3·aşş©Jµ ěŐS–~Če™µŐeĎ c¶¤xqSŽZĹ ˇÇͤ܄TcH›ęÝYĽ‚ĄîU/ÜäUĹšŢA`$©—ď7^ _ĚÇvä=ş]+ő}´h@aĂTŻ2ţ¦tôYĹź˙* #‚ě×n:—€] ’ü˘b|ĚJ%UW¬Őc32ú˙ó‚dÄ (ĘegL ů"DÂp•UV?0ŁË™óP)˙™( A\±ď=»,řJzŁßţ"V"˙, RĹ]ÁŁŐ¬×eßĐ>k˙„ÍAňb«…0`#„ŞŞżţĄł2Şęż˙Ŕ™¸Ú–±aŻ®ĹUčR‡d7âôPVCbýâ»,˛ ý`(¨(ß„ńr|\]ç|ß źđş ˙˙ŞLAME3.98.2ŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ˙ó‚DŰ (ż§{sB8çśsÎ9çśsÎ9çśs‚ĐUA6†q§ HźŁEiȤÝŁĂ$h r ©GŁŁ‘Rę ”TĆI)ť 4d!„RH!…RH!…R!†bČ)§ś‚ *©¤˘Š2Ę,łĚ2Ë,łĚ2ë°łÎ:ě0ÄC ­´KMµŐXc­ąçśkŇZi­µÖJ)Ą”RJ) Y€dAF!…R!¦śrĘ)¨ BCV€<ÉsDGtDGtDGtDGtDÇs-=¸]‚±RüE ŘśŢpg÷Îßú†˙'7T±–‡ĺçË.𝽟űúu“ŞOI·ŰŘąóďą<#FŇÍŻqi%H8ťŽ©·¦U÷™ö™ó) ËŻŃČ4Z2]7ólĆ €dJçʆfTüÖß1đŹÜz——x x?PýÉ‹žZíé;Iťdà ׆§Ź"Ó0L4áw`żčűu©?ˇ`@đ“•ň†|ű˛6¨Ü÷hŻZEŐ T™"Ü&€zš6„űßăg™KĘňn&”bĎ#–öáłě™»=@Ç[Y(ąÝŐöµ]˙VlS" &(·Ď˙sÇ7˝¸xѾިÝ~ÖaDŢr˘i4­ˇ'Ťtůţ¶™Ś†uâ’&Ťf€súzłÜăɬ4…Hł˙úţHPHľĺú ŕąĂ'Ď!gçëł^%ť^@Łbť1pÄk’a5bžT@šs4ńţĘľ’Ł„ízřÄgýť[5ż^ŮW®éßĂďD\~B]›ŢYďžřřt$b „(ŠÖ,§Xç´7oľzű]˙(€ÎΩßźß7Đ'M§Źőu J®_k ňť1¶ĘŢŞ7)ÓŹÉşĎ0…IeöCňTÖO>şíY6OCë]_×u]×Ě(3Ż1`łßšÎ÷JŮ˝çvm3̆üđSâH$‰D"©“$I€ü.±˙ş®Ňkž…ńźo‡»uEpšN7äźo!Â1âřléoOsżőÇžÇúő D¶^ă… eŕô„@wBfE|éŹs?ßúcîÖjţ÷©Ť |ç­\ lw¤N#téoĎćtëŹ9_° ¬+™= ňÔWŻÚصяtéoĎrżô·Ű}Ŕ€¦l,lçűŮ7Lśű: öi5ŕ†+^¨—pĂ›"eäĂç«ţ:tç{ú7K?vţń(öń˘K˙yĽY©+ąšäśO“Ô‘żëţKdçwÓź.}űýŇ‚č×čĽwîŃ®BZKOPɶůóŠVöÍl_tçĎĆtéĎĆżâ–3x¬Ëžľ€ç,i»˛¸ĎŻ˘¤čTăóřý#<_}ü«ůÝűôĺA‚€Üürm÷öă#IĎU cRó \ă?—˙čÎOńűëA`•ó€VÎůÜž"÷•ÂćzRŢ÷·" “Ň dá_!ŰůćSsőŁĎ*f‚€ KÜ׏”(.]¬É”!S’F &ˇ<LĺGíóV~ž?«×ňůâś ÷Őře8®·?˝¬Í©qQ¦„VšşNĽÓŻ_Ś8ńźµ¶/5ÝT(ĎŕaD#u‡Ll]·÷Yń€öq@źBÓýĹ%ÓßýqĄńŐ٧—<ů~o˝ ł·ą šÂUcH·oĚŁŕ%¸9çş‚*i ö˛kc4 «mć…qhČ"FpÜĎ/żˇ hžş®á,P@‰J˙uJw ľ©.ÝěE ,`ĄÓR”1Úň‰ţ~m“o·qĄ f @ďXŽk:@Ś};€ş1Ăĺ€x8,ö-™;w–éç>µŔČ"MIţ}U߬ÎmU…  ÇuĆô‹ö™Ă»”ŐƨO*Né,§ŕCęÍ»:ú–ŠŰąŚŽçHuBŃn/íuŻ®®ű¦Ź’~\X­ŤâËÓűÎĚt¤HÖť6łTú7Ź×WK =¬SÍăˇHÖ·˘CĆc«!a$’>ăć<Î)’-Lĺ'Ľ7ú~}ńő CĐýĂ·@˛*'}ń2ĐjCŔpó {lĺŹÍźYřۆODڤ!EŤBßŢr&‚t{ ó dĺŹăź,üqŰëççro·Ü0@Ń:##•čLd㏇;Ő÷›ó\ € ĂGÎđśŘňśńľÂň–\ăo7ľYřŰż.Č"pŹäó•3÷WîľŢ ŕ—Dáo|ľU÷#í°N˙Ř7˛˙1{Ζ÷”ŻěLáßo˙ąşß’ĽúŔ°ÎOđeĚ$€‚‘NÓ?ĄCÉTáóoÔ}ż}Ŕˇ ĐçŹ-ěá7ž/´VIRGŁĚC”ýLTß[âźjűrń„‚`<Ě/ßµ[Ř^Ňšeödv˙ü˙oĎ”Tßç˙ńlź˘÷O°Ŕ ňöĽ#»éĂ/ď÷1˝áSń©T“"ÉH"»$MŻžRLŰgžě‹ŕŹBÁ€Śń±Ńňcż|ýÝ`Ť“_˝î©Óńź<Ů_%ŢĺúőĽ|ęÉżý¶˙íŕB7&§{ßóç©mš“Í[v¶@ŤDŮßAĚO÷ë÷¸ú€…‚šŁyBÝĎĎP^Żx ÎŇŘ„©űúťRUúŮ­\řŮ·˙ 'b˙Ę §é˝ tÜ‘őąÇá {÷ײ'jçůÂV V° c* qM%y'Ý?ťěo»öéóŮK72&˘Ň˝˛Řż™Y9;ÜsO®nŮöęÖ3ačëyYź ä~ĐWŽÇwąG‡@N˙~ľvµkĐ4_}°ťSLäĐŻ'>żaeńépň5ŕłNžŚž9ľ†đ37ײĄ†Ď™ŽíKů2|˨ź5~ş"5>ötŮ€‰V]|lz¬íh€P&‰‰Ibv{ŃtÚ @7Č2ÉbäÚ TÚŽ¦Źc^,TFkßź}€ă±3Vç€1ŢÎ äÚߦ$¬,t^Ó1W>Zľňó§·nż˝#|ÚfLşFî3Ë–‹śŠkšíqBť>¶ľĆW2BR"4qJŕ\í…—©Tř¨4q«(NĎŔa÷ ®Đ×ßúőd@ 㜪 ÉŔ±2łÇťľLrĆžSç+V Ož<9jľXIkŞÇd»Éôľ­ţ®pĐç·9U« P)ž?Ďg 7`¬¦żúepzv'’YĆ}‘é‡?|>Ű®Óiß4×h©Ű××gH"¶.¬¬Ďu΀C'H`ą÷­oU±€n)ŹŻ oč×˙ŔçănÜó ß}ôŚ,»éݏdĺ÷˙ußs<„ ú·9!×~äůiu*ZXŠĐşéŚdĺŰ?˙\ᏺ×+{śA‹˙š˘Ťi‰«¤ćsĆLdĺŰżžÓřîp€ ‚°Zgh]Ď©˝Du{đŕWť±ů#Ő¶‹sTăç˛?Űř˝Ĺ €Ź>C'ď*ô‰Ĺî^˙Ł™Ďl­Ĺb\ă§6˙ŤĎŐţěřŰ߯‰PÚTWkČG´Ď4 ]¦Ő™fĚ<ÍzZ~rXß pőS*\Ű›ˇĺ‹?klFčďŘ$ÖÜîôáŢ÷<ż€Č°IŔdÄ€;gߏ˝ČÚŰűaäĹéäÝC[öZ·.@T¸3:Ňí80ÎŃý|¶Ţż-hDźŻ9Ž×'öĂuʦŔˇ“';»|r§záÓí}ŁA§źżsĆ6qĎ9Ć43"ÁcĽ¶~ŠľrËş{ŕóőŽŢyv{Účů˘\$ěB=&ˇżŁóž´…"V€ ŮŠč Ö@ú<üů{ Üł#ŮÜ*d×ú€VĹďŽQ ÷›ÜńŹWŻ^µÚpŢŚt ˘FÖI¬ě66všŢ*7ÔˇřÄë­ę)5ß”›ÄyÄşŮq‡*”poŢ­vĂ'Ë5ABI„Mj$ ią´•zzz¶ą´\Ž$ΛăüĆ·Ým{jÄ@UŘ9€Ôí˘éÖMZílälZxß ‡żěâ÷vtéoßn_ĺoßv5×~ćúŠ@ľ{¸!v4 5déoßÄYůŰǦ€ć¨I諎0HOŚi tçoëdĺŹo  [‘Ч‚_TˇcŚ!?ěô"lçoßŘ×řăëGS˙µ20HKOŤÖšçžÔtçoߥłń·ß2ŕ §= 領kT ďtçoßî\ăoßî: sŰđŢźöĂTQľźi­ÓylçoĎz·ń·çx5Źžű´C‚@Đ đďsŰŃ÷Z\·~tç{>o5ľÝöÔĽú×WDŔS˝ĺ“™Ż1ŚN1u ÷\çŰ-Ď-|í»ëc đŘHD[,őâ|ЍĚUUĐ*˘ţňmĆ›lăkäżŮřłÁ_|­ôéĘ<Ţ4ťH7Űב3áÜë RlĺŰőoő˝±5Ő/*„ ŔĎ“6AzÎăž˝yÖŠ:¨ąóXpžptĺ§JoÔ}AľÚŐŻţÖŢ@P1¸ůµčřďsó©ş®ëä˙Čm¦L_X tă§Xľ[řá5ăĺÜBi2ÁxĹĄ©·¤Ţ?Ţ‹eĚ%*pBD®Z»~¨@ /PzĄĽ6ÝŽÔőEá6şčgśÖ¦‡ávŻ.m  b*öÚÉ\ó«ýÍG¶ëĎMŰ6lÍÜts+ÓëóҦýkędtŹÍ`8Í rű÷÷űżŞ: ĐŞę«iĚ ÎI±ľZ"  ęŻë‹xŤ¤»ľţ¦0/ŰľÚQňÚŐ4bôľUÓY]+{ką˙ĘÖutMŠÎ­šxz7Ě-&Ŕx´‚C‚d L ‚ pŔ2 Ś«€H§ĎżúS  €.€ŕÜű¶p9éfŕăńň‡U°hŹuŇúť |ć·=ěqŢťvş>­‹„ł‹J˝1YFÓGp“pąXâń¤á†§ażýdě"4$H8…ôpözOK{·ýFŃJ`ŔăÓ<«^ŹFÍoó§gT˙ötŰ€pÜę—*Î-řJ·7=™!éß” µg:ŢvÂČCŐ|éoďş[ůŰ›¬ vBo^>=o©UíŃ‘Ŕ×ŐQ„éŹ{ďVţvî;šÉ3×H¦ Ü/ä[»č>pęt®\éű操żÝÍuŔˇ?ĽSwńÁĐŚĹę.¸ąm6š|éoóůĽĆîż ­ ČËą×ţTŻoüÎßQŻÓŇŻoŇz˙Ç”té{Î{ŤűŹÎĐ'g0ž~ýá‚:S€Vé>é[eh§ÚŞľńřŰ/®uęoa…lMďťáżA¨'€§‹@ÎtżµŮ(żŐěŠíţßŐ!µ^Ddă˙ţ\߇şř㲉čšjR&>ô“Tdă;ßçô˝ÝőÇůúćŃb¸yuţzÚTÁOşdă{ż÷ Ţŕ_Ŕ‚Či_ඇSx§‚ŰKW”lĎůšă}dă÷vžďCţţéAAĚő Ýă‹SÇí$uČ~˙·éŘiĘTă×Ü?§ďŹ-˙şÖ“×—đß|Á÷ŕ°Ů6Đ DIA1ż7şY>­öďŰô|^­m7%Ý'ů˘F8ĘkJ…Ď4›·3ívŰŔ›$l0A`ävńtĐHL÷FĄŃ&EOč3……†O´¤}6ůőYWű ŕ®Ź—ą4 >ßÎ řŠů{ßěoŢ| dl.ĄĆČqv:ZľňwÉ]ŮÇ ®Ç‰±x†-!5ßąSRËÔ€Ź;şŢÓ¶Ó 7Ěqú$ #$Sô¤$!€łôôBŔŰZ^ÜŽtä»_^řAp€,ÝW×wаĐA@čG ĹÚůüđrÓ'ŔÝď»ŢIŢ*W‰}˛uśčľ}1ˇĺ+“8—XQťčúž4Ő@!*Ĺ«UPi|{őpĆŐ…©ŠŔFok`@,łÁ•W•řÝ1·qb°tÓ÷Ż©e—íe´ˇ¨‚69>Ă«„}˦Žc2ydŠ·ęUâ쬟Ä|¬*cuđJĺ)Y `áć°ýÇdOŚŤŽĄ)íSÎżOĄ€˘Ş˙ţű m’$I‚ďćw6"üţ˙˙oţ_ř˙˙n_·Żoją׆˙}#ů翌‡5]׾Fř÷Mş˙˙ýw*Táß˙ëĎÓ};{3‡éAő˙Ăťő}ÓĆ$k\á·˙ţ}użăĆaz €éÍŕăŢ·vĆ›üyDáç˙Í÷ů激‡A¨M@.U©Ď‡¤=Rőoöô'˙Ź·YTá/ęúʍű0ţm7OZŤ0"ó€g…xęr‡tügEŤs TĺŻŕăďŇý‚S˙éA3@°ź^őĺ›˝†H wń‘!©Ş§z’lżČZšŢ•®˙S)eťŢÚŢYđ)•®ß´(˝BwĐ7ú(ngÚ/UŔĘLšFŔf~5)1;ýú»!r•‡ čłź—˘*@µwĎ©đ Đ˙_6 N§ř•ł~°ůXpäTeŹ`u÷ńö/€ÓsšśťsdŮxň|ä™ć¦ÎľŞŢ*ÉóB˝Nń{wG÷[›ĆtŽkpűÝ[×›rzG×ň±}Űś5«€ eŔ9ŕ0@ćŔh é„˙ X­[]×ňY%€ţ2Ő/>Xý´ â ŕ;kôőۇëńô;ß|@!ůlę×Ű×{Ś“}‘3śs@3Fžˇň0Š>«äĺâu¸î“îiĂŘ×đKŇ/Äšš6wg/MSĂ=jh}üuKŕâűĺČPÜT:éGbÚŹ­&0Ťk÷^HNg@~;ŇćÜ/$€Öć%Ň“Ţ>ź¨i Ł8Ž!Úně0 ZŢ*w guRç^ŐČďęý·±`q#Ĺío…€>ĽŠ+ĄjŚś÷éÓÚ§ńÁÂÂőőőÁ"ĺCú Ź®C tUĎŰ˝Iđ÷F"u]×I ďPXŤR±Ž–°C:Ď~ÄíS®Č ÉZ@ išDĘ„ýţŮŰżQŐ!\ă{Ű·úŢm_`L7$+Ľ…rnL !Ó?Tă{ÍťÂdOXÇTĐEG’iK9W'ŁTăËý§ Řxz` @ĽówőÚ"ÚĘ$W„€´zőmkLáÇßţ…Ďl˙˘‚ôgBnŢĄśCT™ZżË|®H™H Ü`Tá÷ëűő˙°ŢÍ>O›,ŔŮ×iuÔś®î @ę#ç‰2ş)>•ý7G·l1Ôw€­é$µ“ĽZ—˙ş0ŽńPËc;‘ŔꬂähAŨ P^ Ŕ3Ő´łc2ľřzlęřŤŁ©;ƬdI,¦hdÖ-ă÷«ő*çS5ç”Öě§<Ţ6Xm€#§ť¦wÝ€ AŞŹľý)IP@šˇ| °şËŽvA„żŹ"Ţ9ľó—ËĹ2y¤˝ÇÄĚhůÎ_%Í$ú™ĂŽĘňj‚lxŔj‘‹ŕú‰€R@ôţý_ Ř:˛ľ5ŕÁŻkJpłń=Ń@‚Dz {\ĐĆ˝é)ěé˛Ö%ňÉĹϦů:ë,Ä‹B–iľYľ¨7É}g›í¤ˇŇ9ľZw űdËáÉ®ó´qcŃ´˛ĽĐ Ŕ•2ăHŕś`ÉÜŽŤ ”ő5Ň Č:n 5Őť2Ś×ŻŔ«/äŽTB’BUŐ#zP.ľYŢŞW)}ŠŹI‹'ÝTʦřjÝ%®`ë„]_űb«ŔŻQť€śtĐzŐ7FI±D@c^7yáV@żßp$ÉúŐ«/ŔłřŁu«ß,~č„J€Dč-|{!ę` T Z>ąÇ·¬Xwç÷şŁë­m'Mń®<%\ŹýáeG×Ұ:‘ą*`‘€śqçŁcóÓk ć:÷-¢Ŕ1y˝ą+ĽZ»íű×Ď„äŢřK„Ô©ŠU7ÔwĎ$ T=ń>ĎĎ÷€´‹Ý .ßŘ^E3Ľ^zľńWI-D?ů=źčĘ÷˱Ů_•›äćâš<ňŽŃX«@° D@Dr;]?©€[Äř"áŚ[ťŔő˙K¨@sľĽ<h!čCôHW|÷)€Âţ§śâŠW?ţiŢ*W©ýŻIç¤{RGdř´Ż’çdź“4Nš­ŚŐ@F´¦t‰€L „oDV«‚5*€ođË5 >ďî@a €­zßO=¸#`-r,ŞšI‚ –I>í›äŮÄÇd¶mŠb*Ăoë2­ř0‡4ăv¦ Uş:TĄ±ó9Ł…‰X,2._*$x÷´ÜčéSUšTU#€ĂO- ©ë$˝sÄŔ­^ Ă.´ţI§H `҇on¦ÉÜĹ Ş•F\áŹ|źŐ÷śuOM1g9‚ČC~ńĎ~Z`ĺ'*Dáşçó˝ł<0¨)ˇćŞ,mďÝmĚÝeTá{Ö·ęŢ{]ăčÔ2Á;źo<ś6 }ˇ´MLß{š;uďY®¦ZT<€GűŞ6¤WőµěDTß{··ę>4đ“&EA"ŔŰg=é{ĽTß;űź©{»ó退¨IüT˛üâ9ďÂ*őŁ Lß»ŻgŐ='îŹqÜ\@ŁÉŠ;ü}ÜŰŮn™DÝKú}¶×3®¦v’ t§dOSŹ™ÓϽժL}űŘ%DŰłě?¦đEě_´Ť—˛8˛dάłoá3Ż_·?( Čo¤z)^‚«ţ ”.}mŤ:Bϧ}ÓżnýťĽ°:‘˛HP@ŚUŔŢ Ôî˘ÁG·wŽÎrď˝'oŰĂĽé ˘˘iŹ'î–Ć´´[çĐßý¸(Á·N˙@ö[Đ ŃáavtOëĎiUő@οί î)¤_đéđeď­ę‹Îvž)^˛oÉ˰%âŽî6źč#¸IY!^_i§÷,V%€ŠWŚ€Vv :îöCR‘ď?©úÇ;öŕŐ_¨úŕsÖę[Üҧxý*M>g78M}îkŽ!×ČšpY^ž2o©ĎÍÖT4'ÍŻňiľŘ7©sg›ä¤ˇbuˇ*ÍźČ €Őqó—|s˙€ŤÚMČş¶/ Ďţ%ň·€Ţ€ÂÝtç #k^ŮéVnµ€BuŁ€hPŻADÁ ~ľw‰§Ř2Xťč}OFçřn_$ě],›ŕÄXа:hp€„J$` 0'jă#ŇQcř,FdĚb~˝÷ĺ…]ŕ®\oh¸ĽAZ ÷Ř˝ůżV¸Pl@IHî(]ž Ţ•Çoĺją;żÇ]_;m8™ü^Ë%¶śćD×ëŔk#¬@dŘX\”M O:4ŮÝy•řůa{tîÂŐĂď HŇtŢ­öa #§@t/Ľ]†±ż§›ś±XÚăćüůn\béÍ ZNělő»öŞłJ¦0%pů‰`ţ>Ă«¤ž‰ÇťĂę‰í‰“Ţ—r~{&–#t'z§=ÇV  dT'P_ X âY‡ŐeC3ĺ ă?4DôZř—#€Ř¦} ë÷â@ çź^ťu€ éé«%{­¸m•qON„^é}ç÷VgđOT^~¬Ń1é}©ç…¸Zó°Ł˙˝ß·†UÍQM 6 CqJ@©'Dŕ÷ލ×bČ>ż>žŢ€f ¸ůý#xW¬€Ň€¬J•^*ଠ'oĂç€!é+9­Č˘ÜÇn·…ž–<Ś.T"ţČ}„‡”ŰŐ5›jÇ®GĆďÝ:$-źéD‰żs°Ş9n:€˝®€Ä+e\&B—Ł®<čý{˝>–ŕŃť·¸UÂßś›B˘­őz»@”"€V€łb‚ţC—¸qőÖŇ-­ĐŹľ„T‚We DXţȽډ+Ôş{śčzi`ń{±·»ŠÇ`u˘ č VyĹ!@´,řN˰vGSv*·Đ{ ×Tř|@Ő’ĺSn1|}¶{}}Đ8füţ]&Ű_fs+qĎřůe°€ż §¬č€Ä+V${ŇÍ7›m+ÁQžČÝ­Ű˙őż|¸Ó;„5.Áwţ*Ń[ϱžč~S€ŐĚͨhŘ Ć®7ćß Ŕhřď–VJ÷;QăÖ8N»Â§'>ÇéŹ_ů ź3€ÜiÍçFČöŰ‹¤ÉôP¨*4N_Ő ©†˝Ź j˝AR€!  ţČÝrWI«©ÇĚú|bT<ŻJ$x«^Ą´Î>&źN”xRú@†ÄM©g1Čv îk:wTępZU;ÓŰ—ĐďjAŇíě?(Ŕ’’T>iş8¤Ý˘Ĺ€ *“+Žç× :6żu=WŰűh†t10^Č=Ő­„w©·čŽoţ7)‘ß-•Ú;űD 'Ý~°qCÓ‹ CâJ™"ř#ŕŇ Ŕ7ç~hľ ;\č×ô …ţ-@‚ä ĘoŔu!ôôJ!H67LV[ě\ĘWÁZ¬,H–Č˝)‡”ĄęÓ­sűD1‹Ý»uJž*>m§JŠ{¶űšÎ ’R*BŔśŮEĆÍń–Łé°ĺÂzŹĐ5$I ď=´d3MI CôÖíęBÝr&î$y‡đYÂŞż>.á^gŔ/­†ó®Ď]©bŘ滪¤p <هěs˝÷qéSŇíD,×·ÉŢÝľFĄ~”ŔÉѡ0G$ZˇŚ>,×Űmor}׾í@-?÷I!iýľąłÎ˝XC8I14×>—ëÓ§–e]‚ĐÓ¦Čöć}ÁWŐUUÁ†Ťj ü´,×-ţ×˙°‡úC1ŘóvAn?ô‚˛}u•¨űAú^¬‡@¸E‡Źx¬M\ącp(¸YŃŤ·'M«€6Ţ `Pč"”ÓôpŢČV«ůÎ?řÉg}ôé…$ÝX˘[NkF™ :h›‹Ŕ˝8ĐtňËVÓ Mwçˇ×:?Ý]ťpÓÍqgH·ě‘ľL BI/HH.>͸íÁŤ^)>•›”eĹ>öI÷ě¦GÄ#w˛_’—Q‹"ě;FĹÇw&‡Ő@A‚2PP€ł ×cw.ź?ľoDąxćŃŠThřłŔáU€ęg@ż Č;Ë~´ďNĘó«)Jđö†]śŔľŞ"ĆÜI' w^ů˝XW ×d×&8ˇ®Ę 7Ľ9ÇC€řud¨šĄGpę2<ÝąĽđřă€Xţf  Żţ4Ż®ßŐ´IHŐ„&}ű+ȡT×x=B·¬Ůů^Swi5˝$€BŢČ}„Ç˙uť‚˝—M…GîEÝţîRÝh’gôżYŠj˙QkűĐ ^©?!€±˝ Ŕú[Č]ěëďQuÍę3Ţé]Ĺ2Ä#wG÷˙˛j|–;FĹl á†kĎľL067艀_^ą, IŹp“Ç«Ńěg‘zĄSľ[ Dś2Ŕ'µ>nňëAKű¸÷°^–ý;zßl>›BkX^.i)€‘KśV,çÁó)ĹýW[3!¶Ý¬QFę#TXľČ˝€‹Ôuµě3Üé˝KŰ…ÜCąJÚ­xŚâ7'Mż©4 «ČMŇ?"z „ÝŃîżžč<_™ @Î=O€ÚÄ#@„˘Yý' ŕýŻ}¸>Ašś‘őĂŔb€/Y Ű4îÝr˘MĹl¶ý—í5Ť€‚ ~ČÝ‚«”_Ĺeŕ¤÷jJSL"÷7)Ż‹USíô^MşT źCÓžŔ@q­”˘OD ë„ŔĎŹŔqç»ŕv|U Ňşť´p B# w{ ž@Ŕ n\íI$ł;š»L¬RNA Iq3~ČÝâ­Ä»ÔZšäö«†%Ä!÷‚O‰źPJŃŇ- @‡ú솑 ®”Ňl"Bć—%çÔ Z€Ńç=PÁ˘§¬(‚Ü@{˙rŚ‚tň„N€ čâË+LÝaáĆÚ—¬ňvěBî@©ÉŔ%‚^Čݲ­XBIÔŁß 1Č=Ůůű›Ň:Ür‡ýâŮĺčݸŞÔ‰ŔšO8Ŕ čIŔř JťP Ç ş<ęR€ ‚>~„U!HDwą ŔzĎçöŰ÷NŻäľöĺŐŽ‚dQŔŔ~Č˝ůó·T¸˝[{‘2Č}şýwĂÜ+Žô:ŠŁ0ú€=ˇřO`=wQ—şlL"n˝.ÂĽ±×ŞÇC÷tZĺıŞĺ‚ëF@ @ý BÝtL ¬c ˘RŤşH/ŐÔ9üMÖˇ›kç‘Ĺ39 ¨ žČÝü¬_J@t’Čýź#}AŔŐ„¸Ń€ÎÇŠŇşjGwf q•DRsá«°ŕ’®¬žČýď¬_şČýď,_şn rainloop-webmail-1.14.0/build/000077500000000000000000000000001361462701300161405ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/000077500000000000000000000000001361462701300177725ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/000077500000000000000000000000001361462701300223735ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/INSTALL000077500000000000000000000016041361462701300234300ustar00rootroot00000000000000************************************************************************ * * ownCloud/Nextcloud - RainLoop Webmail package * * @author RainLoop Team * @copyright 2019 RainLoop Team * * https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud * ************************************************************************ REQUIREMENTS: - ownCloud version 6 or higher or - Nextcloud version 10 or higher INSTALL: - Unpack the RainLoop Webmail application package in the apps directory of your ownCloud or Nextcloud instance - Make sure the rights are appropriately set CONFIGURATION: - ownCloud: 1) In the Apps > Enable 'RainLoop' plugin 2) In the Settings > Personal > Type your email server login and password - Nextcloud: 1) In the Apps > Enable 'RainLoop' plugin after checking 'Enable experimental apps' 2) In the Settings > Personal > Type your email server login and password rainloop-webmail-1.14.0/build/owncloud/rainloop-app/VERSION000066400000000000000000000000031361462701300234340ustar00rootroot000000000000000.0rainloop-webmail-1.14.0/build/owncloud/rainloop-app/admin.php000066400000000000000000000010301361462701300241660ustar00rootroot00000000000000assign('rainloop-admin-panel-link', OC_RainLoop_Helper::getAppUrl().'?admin'); $oTemplate->assign('rainloop-autologin', OCP\Config::getAppValue('rainloop', 'rainloop-autologin', false)); return $oTemplate->fetchPage(); rainloop-webmail-1.14.0/build/owncloud/rainloop-app/ajax/000077500000000000000000000000001361462701300233165ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/ajax/admin.php000066400000000000000000000014501361462701300251170ustar00rootroot00000000000000 'Invalid Argument(s)')); return false; } sleep(1); OCP\JSON::success(array('Message' => 'Saved successfully')); return true; rainloop-webmail-1.14.0/build/owncloud/rainloop-app/ajax/personal.php000066400000000000000000000022541361462701300256550ustar00rootroot00000000000000 'Invalid argument(s)', 'Email' => $sEmail)); return false; } sleep(1); OCP\JSON::success(array('Message' => 'Saved successfully', 'Email' => $sEmail)); return true; rainloop-webmail-1.14.0/build/owncloud/rainloop-app/app.php000066400000000000000000000016751361462701300236750ustar00rootroot00000000000000 'rainloop_index', 'order' => 10, 'href' => OCP\Util::linkToRoute('rainloop_index'), 'icon' => OCP\Util::imagePath('rainloop', 'mail.png'), 'name' => 'Email' )); rainloop-webmail-1.14.0/build/owncloud/rainloop-app/appinfo/info.xml000066400000000000000000000013561361462701300255110ustar00rootroot00000000000000 rainloop RainLoop RainLoop Webmail Simple, modern and fast web-based email client. 0.0 RainLoop Team 6.0 165254 tools https://www.rainloop.net/ https://github.com/RainLoop/rainloop-webmail/issues rainloop-webmail-1.14.0/build/owncloud/rainloop-app/appinfo/routes.php000066400000000000000000000006011361462701300260560ustar00rootroot00000000000000create('rainloop_index', '/') ->actionInclude('rainloop/index.php'); $this->create('rainloop_app', '/app/') ->actionInclude('rainloop/app.php'); $this->create('rainloop_ajax_personal', 'ajax/personal.php') ->actionInclude('rainloop/ajax/personal.php'); $this->create('rainloop_ajax_admin', 'ajax/admin.php') ->actionInclude('rainloop/ajax/admin.php'); rainloop-webmail-1.14.0/build/owncloud/rainloop-app/css/000077500000000000000000000000001361462701300231635ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/css/style.css000066400000000000000000000002771361462701300250430ustar00rootroot00000000000000/* Empty style sheet! Only needed to give you the opportunity to theme the owncloud part of the rainloop app with the theming system integrated in ownCoud if the rainloop app is activated. */rainloop-webmail-1.14.0/build/owncloud/rainloop-app/img/000077500000000000000000000000001361462701300231475ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/img/logo-64x64.png000077500000000000000000000015001361462701300254050ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢtEXtSoftwareAdobe ImageReadyqÉe<âIDATxÚěšŃGALJ帧¸§#"zŠ8úzŠč5"zŠ8Ž#Ž#Žč©§#"""""â¸~ŁÖŢof·;ŰÎîΗß˵ýnľźŮŰýÍo†1''''''§"k˘ Ń'Ä%D9$źŃÖä8…(…ä(‰ëT9 ľĘbĽŞ·óüÂW˘ůsÂŔąůŽ&G[\fţ\“ă€hţŠŕ‰O<É|‡8đ¤g­NČ1qCôő˘ĐĚŮĎ\ugľčî€fÎÍŁNs3¬P¦ó3ż 1€ĺ‚Ę<Ă#˛ AgŔ˙áEaćąĆ!>üä;ü %óRłź~‚ŞĚmF¨Ćl5/5ń8Ě—Ř !Šy˙ó€eBó‘e „TĚŰ!UóiCđµKlóĄ A0nž6@HÄ<ó­=‹!4? ±@íú¤ÁôĚówb! Ż(…Ó„Äm/C_˘4 вě7ď_ >%€ë.&Ěü…ˇ±‘"qÔPôßZ1ĚËŘJ@Ó € ůî0ó]ĂpĐPô ęlpŔSdĬ§ř<ŞĆ Ţ‚$ůŠaóL_ľżW!®5&MCŕwÁ{°!âE¬ĂĚKm3|kę!đŮÄq Ľé^X»l ⛩7cxRrBő?Íűo?l7úF”©Q–Â&Ţ˙bŢo˘&ž ű+Yn†¤Ő%¶˘–v‹Ü„rFÍpE€`űćH,ňěO)Łć‡…0±Š5D°ÖX÷§E-˛ÖÉűîpO¶ĆŠ|>ŕPč"…?#TřSbîś &ž‰ “5±¦Çrđµ˙8!ǦfĽá:JȱĂ'E)g…•Ö™ţ\î!Ç–&ďŤrě'•Ăd‹ěďät?ÁY»%ÎÚ®&ĄdÇ^á:sĚÉÉÉÉÉÉÉ©¨ú`®ŇY.čüłIEND®B`‚rainloop-webmail-1.14.0/build/owncloud/rainloop-app/img/mail.png000077500000000000000000000007361361462701300246100ustar00rootroot00000000000000‰PNG  IHDR szzôgAMA±Ź üa pHYsÂÂ(J€tEXtSoftwarePaint.NET v3.5.11GóB7ZIDATXGí–Q D=šGëÍz4›Çj-´řUß #&ŮMJg§››eYf[[ćś.S*ńĚá+ť<`&č ~ŘúBÎĄ•C [ŐD>čĂđ@U8z¨•~°¦Ööş!đV‹÷iy0kŢĂđ!𔵼yÚúţ;s† —,;=)TýďCŕ!«^¤;?ZYśô@(ýq4’Ú¨€|˛90µ’thz É«,6¤FĄ±§o z»­±šĐśJş-÷€n¤€\׼1‰)Ąşnb5 żDÇUL©µEĂ^!ĹěŮ;DxRU3„Żĺˇ?Ddbą÷1Vô»ü$^qĘgTsg×o›ÝÜiúZŇ˙hĎKš;kzÚ*źdĽ\ÚÜń>ągů"‚Ë›;ôRK ŕ/Nu‹3±łwBËc۫܄é8J`Ĺ1÷šęíµĘ÷x4ënţŤizŔ'čüxĘIEND®B`‚rainloop-webmail-1.14.0/build/owncloud/rainloop-app/index.php000066400000000000000000000014661361462701300242220ustar00rootroot00000000000000assign('rainloop-iframe-url', OC_RainLoop_Helper::normalizeUrl($sUrl).'?OwnCloudAuth'); $oTemplate->printpage(); rainloop-webmail-1.14.0/build/owncloud/rainloop-app/js/000077500000000000000000000000001361462701300230075ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/js/admin.js000077500000000000000000000003511361462701300244370ustar00rootroot00000000000000 /** * ownCloud - RainLoop mail plugin * * @author RainLoop Team * * https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud */ $(function() { RainLoopFormHelper('#mail-rainloop-admin-form', 'admin.php'); }); rainloop-webmail-1.14.0/build/owncloud/rainloop-app/js/personal.js000077500000000000000000000003571361462701300252000ustar00rootroot00000000000000 /** * ownCloud - RainLoop mail plugin * * @author RainLoop Team * * https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud */ $(function() { RainLoopFormHelper('#mail-rainloop-personal-form', 'personal.php'); }); rainloop-webmail-1.14.0/build/owncloud/rainloop-app/js/rainloop.js000077500000000000000000000025111361462701300251720ustar00rootroot00000000000000 function RainLoopFormHelper(sID, sAjaxFile, fCallback) { try { var oForm = $(sID), oSubmit = $('#rainloop-save-button', oForm), sSubmitValue = oSubmit.val(), oDesc = oForm.find('.rainloop-result-desc') ; oSubmit.click(function (oEvent) { var oDefAjax = null; oEvent.preventDefault(); oForm .addClass('rainloop-ajax') .removeClass('rainloop-error') .removeClass('rainloop-success') ; oDesc.text(''); oSubmit.val('...'); oDefAjax = $.ajax({ 'type': 'POST', 'async': true, 'url': OC.filePath('rainloop', 'ajax', sAjaxFile), 'data': oForm.serialize(), 'dataType': 'json', 'global': true }); oDefAjax.always(function (oData) { var bResult = false; oForm.removeClass('rainloop-ajax'); oSubmit.val(sSubmitValue); if (oData) { bResult = 'success' === oData['status']; if (oData['Message']) { oDesc.text(oData['Message']); } } if (bResult) { oForm.addClass('rainloop-success'); } else { oForm.addClass('rainloop-error'); if ('' === oDesc.text()) { oDesc.text('Error'); } } if (fCallback) { fCallback(bResult, oData); } }); return false; }); } catch(e) {} } rainloop-webmail-1.14.0/build/owncloud/rainloop-app/js/resize.js000077500000000000000000000010321361462701300246450ustar00rootroot00000000000000$(function (window, document) { var buffer = 5, ifr = document.getElementById('rliframe') ; function pageY(elem) { return elem.offsetParent ? (elem.offsetTop + pageY(elem.offsetParent)) : elem.offsetTop; } function resizeIframe() { var height = document.documentElement.clientHeight; height -= pageY(ifr) + buffer; height = (height < 0) ? 0 : height; ifr.style.height = height + 'px'; } if (ifr) { ifr.onload = resizeIframe; window.onresize = resizeIframe; } }(window, document));rainloop-webmail-1.14.0/build/owncloud/rainloop-app/lib/000077500000000000000000000000001361462701300231415ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/lib/RainLoopHelper.php000066400000000000000000000205211361462701300265350ustar00rootroot00000000000000getSystemConfig()->getValue( 'datadirectory', isset(\OC::$SERVERROOT) ? \OC::$SERVERROOT.'/data' : '' ) ), '\\/').'/'; } return @is_dir($sData) ? $sData.'rainloop-storage' : ''; } } } public static function mimeContentType($filename) { $mime_types = array( 'woff' => 'application/font-woff', 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', // images 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', // archives 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', // audio/video 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // ms office 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', // open office 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', ); if (0 < strpos($filename, '.')) { $ext = strtolower(array_pop(explode('.',$filename))); if (array_key_exists($ext, $mime_types)) { return $mime_types[$ext]; } else if (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME); $mimetype = finfo_file($finfo, $filename); finfo_close($finfo); return $mimetype; } } return 'application/octet-stream'; } } rainloop-webmail-1.14.0/build/owncloud/rainloop-app/personal.php000066400000000000000000000015521361462701300247320ustar00rootroot00000000000000assign('rainloop-email', $sEmail); $oTemplate->assign('rainloop-password', 0 === strlen($sPass) && 0 === strlen($sEmail) ? '' : '******'); } return $oTemplate->fetchPage(); rainloop-webmail-1.14.0/build/owncloud/rainloop-app/templates/000077500000000000000000000000001361462701300243715ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/templates/admin-local.php000066400000000000000000000022261361462701300272640ustar00rootroot00000000000000

t('RainLoop Webmail')); ?>


t('Go to RainLoop Webmail admin panel')); ?>


checked="checked" />

  

rainloop-webmail-1.14.0/build/owncloud/rainloop-app/templates/empty.php000077500000000000000000000000161361462701300262400ustar00rootroot00000000000000rainloop-webmail-1.14.0/build/owncloud/rainloop-app/templates/index-empty.php000077500000000000000000000001421361462701300273450ustar00rootroot00000000000000
t('RainLoop Webmail is not configured yet.')); ?>
rainloop-webmail-1.14.0/build/owncloud/rainloop-app/templates/index.php000077500000000000000000000006631361462701300262210ustar00rootroot00000000000000

t('RainLoop Webmail')); ?>

  

rainloop-webmail-1.14.0/build/test_connection.php000066400000000000000000000005451361462701300220530ustar00rootroot00000000000000 array( 'verify_host' => true, 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => false ) ); $streamContext = stream_context_create($streamContextSettings); $errorStr = ''; $errorNo = 0; $connection = stream_socket_client($host.':'.$port, $errorNo, $errorStr, 5, STREAM_CLIENT_CONNECT, $streamContext); if (is_resource($connection)) { echo ' = OK'; fclose($connection); } else { echo ' = ERROR ([#'.$errorNo.'] '.$errorStr.')'; } rainloop-webmail-1.14.0/data/000077500000000000000000000000001361462701300157525ustar00rootroot00000000000000rainloop-webmail-1.14.0/data/VERSION000066400000000000000000000000051361462701300170150ustar00rootroot000000000000000.0.0rainloop-webmail-1.14.0/dev/000077500000000000000000000000001361462701300156175ustar00rootroot00000000000000rainloop-webmail-1.14.0/dev/App/000077500000000000000000000000001361462701300163375ustar00rootroot00000000000000rainloop-webmail-1.14.0/dev/App/Abstract.js000066400000000000000000000210231361462701300204360ustar00rootroot00000000000000import window from 'window'; import $ from '$'; import _ from '_'; import ko from 'ko'; import key from 'key'; import ssm from 'ssm'; import { $win, $html, $doc, leftPanelDisabled, leftPanelType, sUserAgent, bMobileDevice, bAnimationSupported } from 'Common/Globals'; import { isNormal, pString, detectDropdownVisibility, windowResizeCallback } from 'Common/Utils'; import { KeyState, Magics } from 'Common/Enums'; import { root, rootAdmin, rootUser, populateAuthSuffix } from 'Common/Links'; import { initOnStartOrLangChange, initNotificationLanguage } from 'Common/Translator'; import * as Events from 'Common/Events'; import * as Settings from 'Storage/Settings'; import LanguageStore from 'Stores/Language'; import ThemeStore from 'Stores/Theme'; import SocialStore from 'Stores/Social'; import { routeOff, setHash } from 'Knoin/Knoin'; import { AbstractBoot } from 'Knoin/AbstractBoot'; class AbstractApp extends AbstractBoot { /** * @param {RemoteStorage|AdminRemoteStorage} Remote */ constructor() { super(); this.googlePreviewSupportedCache = null; this.isLocalAutocomplete = true; this.iframe = null; this.lastErrorTime = 0; this.iframe = $('
'; } /** * A ReCaptchaResponse is returned from recaptcha_check_answer() */ class ReCaptchaResponse { var $is_valid; var $error; } /** * Calls an HTTP POST function to verify if the user's guess was correct * @param string $privkey * @param string $remoteip * @param string $challenge * @param string $response * @param array $extra_params an array of extra variables to post to the server * @return ReCaptchaResponse */ function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) { if ($privkey == null || $privkey == '') { $recaptcha_response = new ReCaptchaResponse(); $recaptcha_response->is_valid = false; $recaptcha_response->error = 'To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create'; return $recaptcha_response; } if ($remoteip == null || $remoteip == '') { $recaptcha_response = new ReCaptchaResponse(); $recaptcha_response->is_valid = false; $recaptcha_response->error = 'For security reasons, you must pass the remote ip to reCAPTCHA'; return $recaptcha_response; } //discard spam submissions if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { $recaptcha_response = new ReCaptchaResponse(); $recaptcha_response->is_valid = false; $recaptcha_response->error = 'incorrect-captcha-sol'; return $recaptcha_response; } $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify", array ( 'privatekey' => $privkey, 'remoteip' => $remoteip, 'challenge' => $challenge, 'response' => $response ) + $extra_params ); $answers = explode ("\n", $response [1]); $recaptcha_response = new ReCaptchaResponse(); if (trim ($answers [0]) == 'true') { $recaptcha_response->is_valid = true; } else { $recaptcha_response->is_valid = false; $recaptcha_response->error = $answers [1]; } return $recaptcha_response; } /** * gets a URL where the user can sign up for reCAPTCHA. If your application * has a configuration page where you enter a key, you should provide a link * using this function. * @param string $domain The domain where the page is hosted * @param string $appname The name of your application */ function recaptcha_get_signup_url ($domain = null, $appname = null) { return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); } function _recaptcha_aes_pad($val) { $block_size = 16; $numpad = $block_size - (strlen ($val) % $block_size); return str_pad($val, strlen ($val) + $numpad, chr($numpad)); } /* Mailhide related code */ function _recaptcha_aes_encrypt($val,$ky) { if (! function_exists ("mcrypt_encrypt")) { die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); } $mode=MCRYPT_MODE_CBC; $enc=MCRYPT_RIJNDAEL_128; $val=_recaptcha_aes_pad($val); return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); } function _recaptcha_mailhide_urlbase64 ($x) { return strtr(base64_encode ($x), '+/', '-_'); } /* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ function recaptcha_mailhide_url($pubkey, $privkey, $email) { if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . "you can do so at http://www.google.com/recaptcha/mailhide/apikey"); } $ky = pack('H*', $privkey); $cryptmail = _recaptcha_aes_encrypt ($email, $ky); return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); } /** * gets the parts of the email to expose to the user. * eg, given johndoe@example,com return ["john", "example.com"]. * the email is then displayed as john...@example.com */ function _recaptcha_mailhide_email_parts ($email) { $arr = preg_split("/@/", $email ); if (strlen ($arr[0]) <= 4) { $arr[0] = substr ($arr[0], 0, 1); } else if (strlen ($arr[0]) <= 6) { $arr[0] = substr ($arr[0], 0, 3); } else { $arr[0] = substr ($arr[0], 0, 4); } return $arr; } /** * Gets html to display an email address given a public an private key. * to get a key, go to: * * http://www.google.com/recaptcha/mailhide/apikey */ function recaptcha_mailhide_html($pubkey, $privkey, $email) { $emailparts = _recaptcha_mailhide_email_parts ($email); $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); } rainloop-webmail-1.14.0/plugins/_depricated/recaptcha/templates/000077500000000000000000000000001361462701300247155ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/_depricated/recaptcha/templates/PluginLoginReCaptchaGroup.html000066400000000000000000000011761361462701300326270ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/add-x-originating-ip-header/000077500000000000000000000000001361462701300236635ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/add-x-originating-ip-header/LICENSE000066400000000000000000000020701361462701300246670ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/add-x-originating-ip-header/README000066400000000000000000000001211361462701300245350ustar00rootroot00000000000000Adds X-Originating-IP header to outgoing message, containing sender's IP address.rainloop-webmail-1.14.0/plugins/add-x-originating-ip-header/VERSION000066400000000000000000000000031361462701300247240ustar00rootroot000000000000001.2rainloop-webmail-1.14.0/plugins/add-x-originating-ip-header/index.php000066400000000000000000000017771361462701300255170ustar00rootroot00000000000000addHook('filter.build-message', 'FilterBuildMessage'); } /** * @param \MailSo\Mime\Message $oMessage */ public function FilterBuildMessage(&$oMessage) { if ($oMessage instanceof \MailSo\Mime\Message) { $sIP = $this->Manager()->Actions()->Http()->GetClientIp( !!$this->Config()->Get('plugin', 'check_proxy', false)); $oMessage->SetCustomHeader( \MailSo\Mime\Enumerations\Header::X_ORIGINATING_IP, $this->Manager()->Actions()->Http()->IsLocalhost($sIP) ? '127.0.0.1' : $sIP ); } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('check_proxy') ->SetLabel('Сheck User Proxy') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetDescription('Enable, if you need to check proxy header') ->SetDefaultValue(false) ); } }rainloop-webmail-1.14.0/plugins/auto-domain-grab/000077500000000000000000000000001361462701300216505ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/auto-domain-grab/LICENSE000066400000000000000000000024011361462701300226520ustar00rootroot00000000000000This plugin, written by https://github.com/jas8522 and optimised by https://github.com/rhyswilliamsza https://github.com/rhysit https://github.com/RainLoop is released under: The MIT License (MIT) Copyright (c) 2015 https://github.com/jas8522 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/auto-domain-grab/README000066400000000000000000000013641361462701300225340ustar00rootroot00000000000000What is it? In essense, this plugin allows for multiple users across multiple servers to use one RainLoop installation, all without the administrator needing to create each domain separately. This plugin detects the required hostname from the inputted email address (for example, it would detect "example.com" as the hostname if "info@example.com" is inputted). This hostname is then used for IMAP and SMTP communication. How to Use: 1) Activate plugin 2) Visit Settings, and add a new wildcard domain "*" 3) Set your ports/ssl requirements as needed. These will not be changed by the plugin. 4) In the SMTP and/or IMAP host fields, place the single word "auto". This will be replaced when the plugin is active. 5) That's it! The plugin should now work!rainloop-webmail-1.14.0/plugins/auto-domain-grab/VERSION000066400000000000000000000000031361462701300227110ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/auto-domain-grab/index.php000066400000000000000000000044331361462701300234740ustar00rootroot00000000000000addHook('filter.smtp-credentials', 'FilterSmtpCredentials'); $this->addHook('filter.imap-credentials', 'FilterImapCredentials'); } /** * This function detects the IMAP Host, and if it is set to "auto", replaces it with the MX or email domain. * * @param \RainLoop\Model\Account $oAccount * @param array $aImapCredentials */ public function FilterImapCredentials($oAccount, &$aImapCredentials) { if ($oAccount instanceof \RainLoop\Model\Account && \is_array($aImapCredentials)) { // Check for mail.$DOMAIN as entered value in RL settings if (!empty($aImapCredentials['Host']) && 'auto' === $aImapCredentials['Host']) { $domain = substr(strrchr($oAccount->Email(), "@"), 1); $mxhosts = array(); if(getmxrr($domain, $mxhosts) && sizeof($mxhosts) > 0) { $aImapCredentials['Host'] = $mxhosts[0]; } else { $aImapCredentials['Host'] = $this->imap_prefix.$domain; } } } } /** * This function detects the SMTP Host, and if it is set to "auto", replaces it with the MX or email domain. * * @param \RainLoop\Model\Account $oAccount * @param array $aSmtpCredentials */ public function FilterSmtpCredentials($oAccount, &$aSmtpCredentials) { if ($oAccount instanceof \RainLoop\Model\Account && \is_array($aSmtpCredentials)) { // Check for mail.$DOMAIN as entered value in RL settings if (!empty($aSmtpCredentials['Host']) && 'auto' === $aSmtpCredentials['Host']) { $domain = substr(strrchr($oAccount->Email(), "@"), 1); $mxhosts = array(); if(getmxrr($domain, $mxhosts) && sizeof($mxhosts) > 0) { $aSmtpCredentials['Host'] = $mxhosts[0]; } else { $aSmtpCredentials['Host'] = $this->smtp_prefix.$domain; } } } } } rainloop-webmail-1.14.0/plugins/black-list/000077500000000000000000000000001361462701300205475ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/black-list/LICENSE000066400000000000000000000020701361462701300215530ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/black-list/README000066400000000000000000000000301361462701300214200ustar00rootroot00000000000000Simple black list pluginrainloop-webmail-1.14.0/plugins/black-list/VERSION000066400000000000000000000000031361462701300216100ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/black-list/index.php000066400000000000000000000036031361462701300223710ustar00rootroot00000000000000addHook('filter.login-credentials', 'FilterLoginCredentials'); } /** * @param string $sEmail * @param string $sLogin * @param string $sPassword * * @throws \RainLoop\Exceptions\ClientException */ public function FilterLoginCredentials(&$sEmail, &$sLogin, &$sPassword) { $sBlackList = \trim($this->Config()->Get('plugin', 'black_list', '')); if (0 < \strlen($sBlackList) && \RainLoop\Plugins\Helper::ValidateWildcardValues($sEmail, $sBlackList)) { $sExceptions = \trim($this->Config()->Get('plugin', 'exceptions', '')); if (0 === \strlen($sExceptions) || !\RainLoop\Plugins\Helper::ValidateWildcardValues($sEmail, $sExceptions)) { throw new \RainLoop\Exceptions\ClientException( $this->Config()->Get('plugin', 'auth_error', true) ? \RainLoop\Notifications::AuthError : \RainLoop\Notifications::AccountNotAllowed); } } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('auth_error')->SetLabel('Auth Error') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetDescription('Throw an authentication error instead of an access error.') ->SetDefaultValue(true), \RainLoop\Plugins\Property::NewInstance('black_list')->SetLabel('Black List') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Emails black list, space as delimiter, wildcard supported.') ->SetDefaultValue('*@domain1.com user@domain2.com'), \RainLoop\Plugins\Property::NewInstance('exceptions')->SetLabel('Exceptions') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Exceptions for black list, space as delimiter, wildcard supported.') ->SetDefaultValue('demo@domain1.com *@domain2.com admin@*') ); } } rainloop-webmail-1.14.0/plugins/change-password-custom-sql/000077500000000000000000000000001361462701300237145ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php000066400000000000000000000116201361462701300323640ustar00rootroot00000000000000mHost = $mHost; return $this; } /** * @param string $mUser * * @return \ChangePasswordCustomSqlDriver */ public function SetmUser($mUser) { $this->mUser = $mUser; return $this; } /** * @param string $mPass * * @return \ChangePasswordCustomSqlDriver */ public function SetmPass($mPass) { $this->mPass = $mPass; return $this; } /** * @param string $mDatabase * * @return \ChangePasswordCustomSqlDriver */ public function SetmDatabase($mDatabase) { $this->mDatabase = $mDatabase; return $this; } /** * @param string $mTable * * @return \ChangePasswordCustomSqlDriver */ public function SetmTable($mTable) { $this->mTable = $mTable; return $this; } /** * @param string $mSql * * @return \ChangePasswordCustomSqlDriver */ public function SetmSql($mSql) { $this->mSql = $mSql; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \ChangePasswordCustomSqlDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email(); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Try to change password for '.$oAccount->Email()); } $bResult = false; $dsn = 'mysql:host='.$this->mHost.';dbname='.$this->mDatabase.';charset=utf8'; $options = array( PDO::ATTR_EMULATE_PREPARES => true, PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); try { $conn = new PDO($dsn,$this->mUser,$this->mPass,$options); //prepare SQL varaibles $sEmail = $oAccount->Email(); $sEmailUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail); $sEmailDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); // some variables cannot be prepared $this->mSql = str_replace(array( ':table' ), array( $this->mTable ), $this->mSql); $placeholders = array( ':email' => $sEmail, ':oldpass' => $sPrevPassword, ':newpass' => $sNewPassword, ':domain' => $sEmailDomain, ':username' => $sEmailUser ); // we have to check that all placehoders are used in the query, passing any unused placeholders will generate an error $used_placeholders = array(); foreach($placeholders as $placeholder => $value) { if(preg_match_all('/'.$placeholder . '(?![a-zA-Z0-9\-])'.'/', $this->mSql) === 1) { // backwards-compabitibility: remove single and double quotes around placeholders $this->mSql = str_replace('`'.$placeholder.'`', $placeholder, $this->mSql); $this->mSql = str_replace("'".$placeholder."'", $placeholder, $this->mSql); $this->mSql = str_replace('"'.$placeholder.'"', $placeholder, $this->mSql); $used_placeholders[$placeholder] = $value; } } $statement = $conn->prepare($this->mSql); // everything is ready (hopefully), bind the values foreach($used_placeholders as $placeholder => $value) { $statement->bindValue($placeholder, $value); } // and execute $mSqlReturn = $statement->execute(); /* can be used for debugging ob_start(); $statement->debugDumpParams(); $r = ob_get_contents(); ob_end_clean(); $this->oLogger->Write($r); */ if ($mSqlReturn == true) { $bResult = true; if ($this->oLogger) { $this->oLogger->Write('Success! Password changed.'); } } else { $bResult = false; if ($this->oLogger) { $this->oLogger->Write('Something went wrong. Either current password is incorrect, or new password does not match criteria.'); } } } catch (\Exception $oException) { $bResult = false; if ($this->oLogger) { $this->oLogger->WriteException($oException); } } return $bResult; } } rainloop-webmail-1.14.0/plugins/change-password-custom-sql/LICENSE000066400000000000000000000021211361462701300247150ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2017 Martin Vilimovsky (vilimovsky@mvcs.cz) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/change-password-custom-sql/README000066400000000000000000000001171361462701300245730ustar00rootroot00000000000000You can use your own SQL (MySQL) statement (with wildcards) to change password rainloop-webmail-1.14.0/plugins/change-password-custom-sql/README.md000066400000000000000000000007311361462701300251740ustar00rootroot00000000000000Rainloop change password custom mysql plugin ============================================ This plugin adds change password capability to Rainloop webmail by write your own SQL statement ##### Installation is simple: 1. Drop the change-password-custom-sql in the plugins directory (eg. _RainLoopDir_/data/data_xxxxx/_default/plugins/*) 2. In rainloop admin panel go to Plugins, and activate change-password-custom-sql. 3. Enter mysql details on the plugin config screen. rainloop-webmail-1.14.0/plugins/change-password-custom-sql/VERSION000066400000000000000000000000031361462701300247550ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/change-password-custom-sql/index.php000066400000000000000000000037221361462701300255400ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/ChangePasswordCustomSqlDriver.php'; $oProvider = new ChangePasswordCustomSqlDriver(); $oProvider ->SetLogger($this->Manager()->Actions()->Logger()) ->SetmHost($this->Config()->Get('plugin', 'mHost', '')) ->SetmUser($this->Config()->Get('plugin', 'mUser', '')) ->SetmPass($this->Config()->Get('plugin', 'mPass', '')) ->SetmDatabase($this->Config()->Get('plugin', 'mDatabase', '')) ->SetmTable($this->Config()->Get('plugin', 'mTable', '')) ->SetmSql($this->Config()->Get('plugin', 'mSql', '')) ; break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('mHost')->SetLabel('MySQL Host') ->SetDefaultValue('127.0.0.1'), \RainLoop\Plugins\Property::NewInstance('mUser')->SetLabel('MySQL User'), \RainLoop\Plugins\Property::NewInstance('mPass')->SetLabel('MySQL Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD), \RainLoop\Plugins\Property::NewInstance('mDatabase')->SetLabel('MySQL Database'), \RainLoop\Plugins\Property::NewInstance('mTable')->SetLabel('MySQL Table'), \RainLoop\Plugins\Property::NewInstance('mSql')->SetLabel('SQL statement') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('SQL statement (allowed wildcards :table, :email, :oldpass, :newpass, :domain, :username). Use SQL functions for encryption.') ->SetDefaultValue('UPDATE :table SET password = md5(:newpass) WHERE domain = :domain AND username = :username and oldpass = md5(:oldpass)') ); } } rainloop-webmail-1.14.0/plugins/change-password-cyberpanel/000077500000000000000000000000001361462701300237315ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/change-password-cyberpanel/ChangePasswordCyberPanel.php000066400000000000000000000062201361462701300313170ustar00rootroot00000000000000mHost = $mHost; return $this; } /** * @param string $mUser * * @return \ChangePasswordCyberPanel */ public function SetmUser($mUser) { $this->mUser = $mUser; return $this; } /** * @param string $mPass * * @return \ChangePasswordCyberPanel */ public function SetmPass($mPass) { $this->mPass = $mPass; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \ChangePasswordCyberPanel */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email(); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Try to change password for '.$oAccount->Email()); } $bResult = false; $db = mysqli_connect($this->mHost, $this->mUser, $this->mPass, 'cyberpanel'); try { $sEmail = mysqli_real_escape_string($db, $oAccount->Email()); $sEmailUser = mysqli_real_escape_string($db, \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail)); $sEmailDomain = mysqli_real_escape_string($db, \MailSo\Base\Utils::GetDomainFromEmail($sEmail)); $password_check_query = "SELECT * FROM e_users WHERE emailOwner_id = '$sEmailDomain' AND email = '$sEmail'"; $result = mysqli_query($db, $password_check_query); $password_check = mysqli_fetch_assoc($result); if (password_verify($sPrevPassword, substr($password_check['password'], 7))) { $hashed_password = mysqli_real_escape_string($db, '{CRYPT}'.password_hash($sNewPassword, PASSWORD_BCRYPT, ['cost' => 12,])); $password_update_query = "UPDATE e_users SET password = '$hashed_password' WHERE emailOwner_id = '$sEmailDomain' AND email = '$sEmail'"; mysqli_query($db, $password_update_query); $bResult = true; if ($this->oLogger) { $this->oLogger->Write('Success! The password was changed.'); } } else { $bResult = false; if ($this->oLogger) { $this->oLogger->Write('Something went wrong. Either the current password is incorrect or the new password does not meet the criteria.'); } } } catch (\Exception $oException) { $bResult = false; if ($this->oLogger) { $this->oLogger->WriteException($oException); } } return $bResult; } } rainloop-webmail-1.14.0/plugins/change-password-cyberpanel/LICENSE000066400000000000000000000020701361462701300247350ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2019 David Forbush Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/change-password-cyberpanel/README000066400000000000000000000001461361462701300246120ustar00rootroot00000000000000This plugin allows you to change passwords of email accounts managed by CyberPanel web panel software rainloop-webmail-1.14.0/plugins/change-password-cyberpanel/README.md000066400000000000000000000010301361462701300252020ustar00rootroot00000000000000RainLoop CyberPanel Password Changing Plugin ============================================ This plugin adds password changing capability to RainLoop webmail for servers running CyberPanel web panel software. ##### Installation is simple: 1. Place the change-password-cyberpanel folder in the plugins directory (e.g. _RainLoopDir_/data/data_xxxxx/_default/plugins/*). 2. In RainLoop administration panel, go to Plugins and activate change-password-cyberpanel. 3. Enter CyberPanel's SQL user details on the plugin configuration screen. rainloop-webmail-1.14.0/plugins/change-password-cyberpanel/VERSION000066400000000000000000000000041361462701300247730ustar00rootroot000000000000001.1 rainloop-webmail-1.14.0/plugins/change-password-cyberpanel/index.php000066400000000000000000000022431361462701300255520ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/ChangePasswordCyberPanel.php'; $oProvider = new ChangePasswordCyberPanel(); $oProvider ->SetLogger($this->Manager()->Actions()->Logger()) ->SetmHost($this->Config()->Get('plugin', 'mHost', '')) ->SetmUser($this->Config()->Get('plugin', 'mUser', '')) ->SetmPass($this->Config()->Get('plugin', 'mPass', '')) ; break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('mHost')->SetLabel('MySQL Host') ->SetDefaultValue('127.0.0.1'), \RainLoop\Plugins\Property::NewInstance('mUser')->SetLabel('MySQL User'), \RainLoop\Plugins\Property::NewInstance('mPass')->SetLabel('MySQL Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ); } } rainloop-webmail-1.14.0/plugins/change-password-example/000077500000000000000000000000001361462701300232405ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/change-password-example/ChangePasswordExampleDriver.php000066400000000000000000000016611361462701300313550ustar00rootroot00000000000000sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { $bResult = false; // TODO return $bResult; } }rainloop-webmail-1.14.0/plugins/change-password-example/LICENSE000066400000000000000000000020701361462701300242440ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/change-password-example/VERSION000066400000000000000000000000031361462701300243010ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/change-password-example/index.php000066400000000000000000000017321361462701300250630ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/ChangePasswordExampleDriver.php'; $oProvider = new ChangePasswordExampleDriver(); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } }rainloop-webmail-1.14.0/plugins/change-smtp-ehlo-message/000077500000000000000000000000001361462701300232775ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/change-smtp-ehlo-message/LICENSE000066400000000000000000000020701361462701300243030ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/change-smtp-ehlo-message/VERSION000066400000000000000000000000031361462701300243400ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/change-smtp-ehlo-message/index.php000066400000000000000000000011461361462701300251210ustar00rootroot00000000000000addHook('filter.smtp-credentials', 'FilterSmtpCredentials'); } /** * @param \RainLoop\Model\Account $oAccount * @param array $aSmtpCredentials */ public function FilterSmtpCredentials($oAccount, &$aSmtpCredentials) { if ($oAccount instanceof \RainLoop\Model\Account && \is_array($aSmtpCredentials)) { // Default: // $aSmtpCredentials['Ehlo'] = \MailSo\Smtp\SmtpClient::EhloHelper(); // // or write your custom php $aSmtpCredentials['Ehlo'] = 'localhost'; } } } rainloop-webmail-1.14.0/plugins/contact-group-excel-paste/000077500000000000000000000000001361462701300235175ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/contact-group-excel-paste/LICENCE000066400000000000000000000021121361462701300245000ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2017 https://github.com/korukugashi/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/contact-group-excel-paste/README000066400000000000000000000005511361462701300244000ustar00rootroot00000000000000Add ability to paste multi row email addresses (from Excel for instance) to a contact in a single row, in order to create a contact group. Usage : open address book, paste your emails separated by line breaks in an email field. Emails will be collapsed with "," separator. Then, when you write an email, select the email group and all addresses will be added. rainloop-webmail-1.14.0/plugins/contact-group-excel-paste/VERSION000066400000000000000000000000031361462701300245600ustar00rootroot000000000000000.1rainloop-webmail-1.14.0/plugins/contact-group-excel-paste/index.php000066400000000000000000000002421361462701300253350ustar00rootroot00000000000000addJs('js/excel_contact_group.js'); } } rainloop-webmail-1.14.0/plugins/contact-group-excel-paste/js/000077500000000000000000000000001361462701300241335ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/contact-group-excel-paste/js/excel_contact_group.js000066400000000000000000000014761361462701300305300ustar00rootroot00000000000000(function(window, $) { $(function() { function replaceGroup() { $('li[data-inputosaurus][title*=","]').each(function (index, elem) { var $elem = $(elem) var title = $elem.attr('title') var cut = title.indexOf('<') title = title.substr(cut + 1, title.length - cut - 2) $elem.parents('ul').find('.ui-autocomplete-input').val(title) $('.ui-autocomplete-input').trigger('blur') }) setTimeout(function () { $('li[data-inputosaurus][title*=","]').find('a').trigger('click') }) } $('body').on('click', '.ui-autocomplete a', function () { replaceGroup() }) $(document).on('keydown', function (e) { if (e.which === 13) { setTimeout(function () { replaceGroup() }) } }) }) }(window, $)) rainloop-webmail-1.14.0/plugins/contacts-suggestions-example/000077500000000000000000000000001361462701300243415ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/contacts-suggestions-example/ContactsExampleSuggestions.php000066400000000000000000000006341361462701300324020ustar00rootroot00000000000000Email(), ''), array('email@domain.com', 'name') ); return $aResult; } } rainloop-webmail-1.14.0/plugins/contacts-suggestions-example/LICENSE000066400000000000000000000020701361462701300253450ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/contacts-suggestions-example/VERSION000066400000000000000000000000031361462701300254020ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/contacts-suggestions-example/index.php000066400000000000000000000010151361462701300261560ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $mResult */ public function MainFabrica($sName, &$mResult) { switch ($sName) { case 'suggestions': if (!\is_array($mResult)) { $mResult = array(); } include_once __DIR__.'/ContactsExampleSuggestions.php'; $mResult[] = new ContactsExampleSuggestions(); break; } } }rainloop-webmail-1.14.0/plugins/cpanel-change-password/000077500000000000000000000000001361462701300230475ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/cpanel-change-password/CpanelChangePasswordDriver.php000066400000000000000000000077431361462701300310020ustar00rootroot00000000000000sHost = $sHost; $this->iPost = $iPost; $this->bSsl = !!$bSsl; $this->sUser = $sUser; $this->sPassword = $sPassword; return $this; } /** * @param string $sAllowedEmails * * @return \CpanelChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \CpanelChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Try to change password for '.$oAccount->Email()); } if (!\class_exists('xmlapi')) { include_once __DIR__.'/xmlapi.php'; } $bResult = false; if (!empty($this->sHost) && 0 < $this->iPost && 0 < \strlen($this->sUser) && 0 < \strlen($this->sPassword) && $oAccount && \class_exists('xmlapi')) { $sEmail = $oAccount->Email(); $sEmailUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail); $sEmailDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); $sHost = $this->sHost; $sHost = \str_replace('{user:domain}', $sEmailDomain, $sHost); $sUser = $this->sUser; $sUser = \str_replace('{user:email}', $sEmail, $sUser); $sUser = \str_replace('{user:login}', $sEmailUser, $sUser); $sPassword = $this->sPassword; $sPassword = \str_replace('{user:password}', $oAccount->Password(), $sPassword); try { $oXmlApi = new \xmlapi($sHost); $oXmlApi->set_port($this->iPost); $oXmlApi->set_protocol($this->bSsl ? 'https' : 'http'); $oXmlApi->set_debug(false); $oXmlApi->set_output('json'); // $oXmlApi->set_http_client('fopen'); $oXmlApi->set_http_client('curl'); $oXmlApi->password_auth($sUser, $sPassword); $aArgs = array( 'email' => $sEmailUser, 'domain' => $sEmailDomain, 'password' => $sNewPassword ); $sResult = $oXmlApi->api2_query($sUser, 'Email', 'passwdpop', $aArgs); if ($sResult) { if ($this->oLogger) { $this->oLogger->Write('CPANEL: '.$sResult, \MailSo\Log\Enumerations\Type::INFO); } $aResult = @\json_decode($sResult, true); $bResult = isset($aResult['cpanelresult']['data'][0]['result']) && !!$aResult['cpanelresult']['data'][0]['result']; } if (!$bResult && $this->oLogger) { $this->oLogger->Write('CPANEL: '.$sResult, \MailSo\Log\Enumerations\Type::ERROR); } } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException); } } } else { if ($this->oLogger) { $this->oLogger->Write('CPANEL: Incorrent configuration data', \MailSo\Log\Enumerations\Type::ERROR); } } return $bResult; } }rainloop-webmail-1.14.0/plugins/cpanel-change-password/LICENSE000066400000000000000000000020701361462701300240530ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/cpanel-change-password/VERSION000066400000000000000000000000031361462701300241100ustar00rootroot000000000000001.3rainloop-webmail-1.14.0/plugins/cpanel-change-password/index.php000066400000000000000000000043421361462701300246720ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sHost = \trim($this->Config()->Get('plugin', 'host', '')); $iPost = (int) $this->Config()->Get('plugin', 'port', 2087); $sUser = (string) $this->Config()->Get('plugin', 'user', ''); $sPassword = (string) $this->Config()->Get('plugin', 'password', ''); $bSsl = (bool) $this->Config()->Get('plugin', 'ssl', false); if (!empty($sHost) && 0 < $iPost && 0 < \strlen($sUser) && 0 < \strlen($sPassword)) { include_once __DIR__.'/CpanelChangePasswordDriver.php'; $oProvider = new CpanelChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sHost, $iPost, $bSsl, $sUser, $sPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('cPanel Host') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('cPanel Port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(2087), \RainLoop\Plugins\Property::NewInstance('ssl')->SetLabel('Use SSL') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetDefaultValue(false), \RainLoop\Plugins\Property::NewInstance('user')->SetLabel('cPanel User') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('cPanel Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } }rainloop-webmail-1.14.0/plugins/cpanel-change-password/xmlapi.php000066400000000000000000002500731361462701300250610ustar00rootroot00000000000000set_hash("username", $accessHash); * $xmlapi->set_password("username", "password"); * * 3.) Execute a function * $xmlapi->listaccts(); * * @category Cpanel * @package xmlapi * @copyright 2012 cPanel, Inc. * @license http://sdk.cpanel.net/license/bsd.html * @version Release: 1.0.13 * @link http://twiki.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/XmlApi * @since Class available since release 0.1 **/ class xmlapi { // should debugging statements be printed? private $debug = false; // The host to connect to private $host = '127.0.0.1'; // the port to connect to private $port = '2087'; // should be the literal strings http or https private $protocol = 'https'; // output that should be given by the xml-api private $output = 'simplexml'; // literal strings hash or password private $auth_type = null; // the actual password or hash private $auth = null; // username to authenticate as private $user = null; // The HTTP Client to use private $http_client = 'curl'; /** * Instantiate the XML-API Object * All parameters to this function are optional and can be set via the accessor functions or constants * This defaults to password auth, however set_hash can be used to use hash authentication * * @param string $host The host to perform queries on * @param string $user The username to authenticate as * @param string $password The password to authenticate with * @return Xml_Api object */ public function __construct($host = null, $user = null, $password = null ) { // Check if debugging must be enabled if ( (defined('XMLAPI_DEBUG')) && (XMLAPI_DEBUG == '1') ) { $this->debug = true; } // Check if raw xml output must be enabled if ( (defined('XMLAPI_RAW_XML')) && (XMLAPI_RAW_XML == '1') ) { $this->raw_xml = true; } /** * Authentication * This can either be passed at this point or by using the set_hash or set_password functions **/ if ( ( defined('XMLAPI_USER') ) && ( strlen(XMLAPI_USER) > 0 ) ) { $this->user = XMLAPI_USER; // set the authtype to pass and place the password in $this->pass if ( ( defined('XMLAPI_PASS') ) && ( strlen(XMLAPI_PASS) > 0 ) ) { $this->auth_type = 'pass'; $this->auth = XMLAPI_PASS; } // set the authtype to hash and place the hash in $this->auth if ( ( defined('XMLAPI_HASH') ) && ( strlen(XMLAPI_HASH) > 0 ) ) { $this->auth_type = 'hash'; $this->auth = preg_replace("/(\n|\r|\s)/", '', XMLAPI_HASH); } // Throw warning if XMLAPI_HASH and XMLAPI_PASS are defined if ( ( ( defined('XMLAPI_HASH') ) && ( strlen(XMLAPI_HASH) > 0 ) ) && ( ( defined('XMLAPI_PASS') ) && ( strlen(XMLAPI_PASS) > 0 ) ) ) { error_log('warning: both XMLAPI_HASH and XMLAPI_PASS are defined, defaulting to XMLAPI_HASH'); } // Throw a warning if XMLAPI_HASH and XMLAPI_PASS are undefined and XMLAPI_USER is defined if ( !(defined('XMLAPI_HASH') ) || !defined('XMLAPI_PASS') ) { error_log('warning: XMLAPI_USER set but neither XMLAPI_HASH or XMLAPI_PASS have not been defined'); } } if ( ( $user != null ) && ( strlen( $user ) < 9 ) ) { $this->user = $user; } if ($password != null) { $this->set_password($password); } /** * Connection * * $host/XMLAPI_HOST should always be equal to either the IP of the server or it's hostname */ // Set the host, error if not defined if ($host == null) { if ( (defined('XMLAPI_HOST')) && (strlen(XMLAPI_HOST) > 0) ) { $this->host = XMLAPI_HOST; } else { throw new Exception("No host defined"); } } else { $this->host = $host; } // disabling SSL is probably a bad idea.. just saying. if ( defined('XMLAPI_USE_SSL' ) && (XMLAPI_USE_SSL == '0' ) ) { $this->protocol = "http"; } // Detemine what the default http client should be. if ( function_exists('curl_setopt') ) { $this->http_client = "curl"; } elseif ( ini_get('allow_url_fopen') ) { $this->http_client = "fopen"; } else { throw new Exception('allow_url_fopen and curl are neither available in this PHP configuration'); } } /** * Accessor Functions **/ /** * Return whether the debug option is set within the object * * @return boolean * @see set_debug() */ public function get_debug() { return $this->debug; } /** * Turn on debug mode * * Enabling this option will cause this script to print debug information such as * the queries made, the response XML/JSON and other such pertinent information. * Calling this function without any parameters will enable debug mode. * * @param bool $debug turn on or off debug mode * @see get_debug() */ public function set_debug( $debug = 1 ) { $this->debug = $debug; } /** * Get the host being connected to * * This function will return the host being connected to * @return string host * @see set_host() */ public function get_host() { return $this->host; } /** * Set the host to query * * Setting this will set the host to be queried * @param string $host The host to query * @see get_host() */ public function set_host( $host ) { $this->host = $host; } /** * Get the port to connect to * * This will return which port the class is connecting to * @return int $port * @see set_port() */ public function get_port() { return $this->port; } /** * Set the port to connect to * * This will allow a user to define which port needs to be connected to. * The default port set within the class is 2087 (WHM-SSL) however other ports are optional * this function will automatically set the protocol to http if the port is equal to: * - 2082 * - 2086 * - 2095 * - 80 * @param int $port the port to connect to * @see set_protocol() * @see get_port() */ public function set_port( $port ) { if ( !is_int( $port ) ) { $port = intval($port); } if ($port < 1 || $port > 65535) { throw new Exception('non integer or negative integer passed to set_port'); } // Account for ports that are non-ssl if ($port == '2086' || $port == '2082' || $port == '80' || $port == '2095') { $this->set_protocol('http'); } $this->port = $port; } /** * Return the protocol being used to query * * This will return the protocol being connected to * @return string * @see set_protocol() */ public function get_protocol() { return $this->protocol; } /** * Set the protocol to use to query * * This will allow you to set the protocol to query cpsrvd with. The only to acceptable values * to be passed to this function are 'http' or 'https'. Anything else will cause the class to throw * an Exception. * @param string $proto the protocol to use to connect to cpsrvd * @see get_protocol() */ public function set_protocol( $proto ) { if ($proto != 'https' && $proto != 'http') { throw new Exception('https and http are the only protocols that can be passed to set_protocol'); } $this->protocol = $proto; } /** * Return what format calls with be returned in * * This function will return the currently set output format * @see set_output() * @return string */ public function get_output() { return $this->output; } /** * Set the output format for call functions * * This class is capable of returning data in numerous formats including: * - json * - xml * - {@link http://php.net/simplexml SimpleXML} * - {@link http://us.php.net/manual/en/language.types.array.php Associative Arrays} * * These can be set by passing this class any of the following values: * - json - return JSON string * - xml - return XML string * - simplexml - return SimpleXML object * - array - Return an associative array * * Passing any value other than these to this class will cause an Exception to be thrown. * @param string $output the output type to be set * @see get_output() */ public function set_output( $output ) { if ($output != 'json' && $output != 'xml' && $output != 'array' && $output != 'simplexml') { throw new Exception('json, xml, array and simplexml are the only allowed values for set_output'); } $this->output = $output; } /** * Return the auth_type being used * * This function will return a string containing the auth type in use * @return string auth type * @see set_auth_type() */ public function get_auth_type() { return $this->auth_type; } /** * Set the auth type * * This class is capable of authenticating with both hash auth and password auth * This function will allow you to manually set which auth_type you are using. * * the only accepted parameters for this function are "hash" and "pass" anything else will cuase * an exception to be thrown * * @see set_password() * @see set_hash() * @see get_auth_type() * @param string auth_type the auth type to be set */ public function set_auth_type( $auth_type ) { if ($auth_type != 'hash' && $auth_type != 'pass') { throw new Exception('the only two allowable auth types arehash and path'); } $this->auth_type = $auth_type; } /** * Set the password to be autenticated with * * This will set the password to be authenticated with, the auth_type will be automatically adjusted * when this function is used * * @param string $pass the password to authenticate with * @see set_hash() * @see set_auth_type() * @see set_user() */ public function set_password( $pass ) { $this->auth_type = 'pass'; $this->auth = $pass; } /** * Set the hash to authenticate with * * This will set the hash to authenticate with, the auth_type will automatically be set when this function * is used. This function will automatically strip the newlines from the hash. * @param string $hash the hash to autenticate with * @see set_password() * @see set_auth_type() * @see set_user() */ public function set_hash( $hash ) { $this->auth_type = 'hash'; $this->auth = preg_replace("/(\n|\r|\s)/", '', $hash); } /** * Return the user being used for authtication * * This will return the username being authenticated against. * * @return string */ public function get_user() { return $this->user; } /** * Set the user to authenticate against * * This will set the user being authenticated against. * @param string $user username * @see set_password() * @see set_hash() * @see get_user() */ public function set_user( $user ) { $this->user = $user; } /** * Set the user and hash to be used for authentication * * This function will allow one to set the user AND hash to be authenticated with * * @param string $user username * @param string $hash WHM Access Hash * @see set_hash() * @see set_user() */ public function hash_auth( $user, $hash ) { $this->set_hash( $hash ); $this->set_user( $user ); } /** * Set the user and password to be used for authentication * * This function will allow one to set the user AND password to be authenticated with * @param string $user username * @param string $pass password * @see set_pass() * @see set_user() */ public function password_auth( $user, $pass ) { $this->set_password( $pass ); $this->set_user( $user ); } /** * Return XML format * * this function will cause call functions to return XML format, this is the same as doing: * set_output('xml') * * @see set_output() */ public function return_xml() { $this->set_output('xml'); } /** * Return simplexml format * * this function will cause all call functions to return simplexml format, this is the same as doing: * set_output('simplexml') * * @see set_output() */ public function return_object() { $this->set_output('simplexml'); } /** * Set the HTTP client to use * * This class is capable of two types of HTTP Clients: * - curl * - fopen * * When using allow url fopen the class will use get_file_contents to perform the query * The only two acceptable parameters for this function are 'curl' and 'fopen'. * This will default to fopen, however if allow_url_fopen is disabled inside of php.ini * it will switch to curl * * @param string client The http client to use * @see get_http_client() */ public function set_http_client( $client ) { if ( ( $client != 'curl' ) && ( $client != 'fopen' ) ) { throw new Exception('only curl and fopen and allowed http clients'); } $this->http_client = $client; } /** * Get the HTTP Client in use * * This will return a string containing the HTTP client currently in use * * @see set_http_client() * @return string */ public function get_http_client() { return $this->http_client; } /* * Query Functions * -- * This is where the actual calling of the XML-API, building API1 & API2 calls happens */ /** * Perform an XML-API Query * * This function will perform an XML-API Query and return the specified output format of the call being made * * @param string $function The XML-API call to execute * @param array $vars An associative array of the parameters to be passed to the XML-API Calls * @return mixed */ public function xmlapi_query( $function, $vars = array() ) { // Check to make sure all the data needed to perform the query is in place if (!$function) { throw new Exception('xmlapi_query() requires a function to be passed to it'); } if ($this->user == null) { throw new Exception('no user has been set'); } if ($this->auth ==null) { throw new Exception('no authentication information has been set'); } // Build the query: $query_type = '/xml-api/'; if ($this->output == 'json') { $query_type = '/json-api/'; } $args = http_build_query($vars, '', '&'); $url = $this->protocol . '://' . $this->host . ':' . $this->port . $query_type . $function; if ($this->debug) { error_log('URL: ' . $url); error_log('DATA: ' . $args); } // Set the $auth string $authstr = ''; if ($this->auth_type == 'hash') { $authstr = 'Authorization: WHM ' . $this->user . ':' . $this->auth . "\r\n"; } elseif ($this->auth_type == 'pass') { $authstr = 'Authorization: Basic ' . base64_encode($this->user .':'. $this->auth) . "\r\n"; } else { throw new Exception('invalid auth_type set'); } if ($this->debug) { error_log("Authentication Header: " . $authstr ."\n"); } // Perform the query (or pass the info to the functions that actually do perform the query) $response = ''; if ($this->http_client == 'curl') { $response = $this->curl_query($url, $args, $authstr); } elseif ($this->http_client == 'fopen') { $response = $this->fopen_query($url, $args, $authstr); } // fix #1 $aMatch = array(); if ($response && false !== stripos($response, '') && preg_match('/HTTP-EQUIV[\s]?=[\s]?"refresh"/i', $response) && preg_match('/]+url[\s]?=[\s]?([^">]+)/i', $response, $aMatch) && !empty($aMatch[1]) && 0 === strpos(trim($aMatch[1]), 'http')) { $url = trim($aMatch[1]) . $query_type . $function; if ($this->debug) { error_log('new URL: ' . $url); } if ($this->http_client == 'curl') { $response = $this->curl_query($url, $args, $authstr); } elseif ($this->http_client == 'fopen') { $response = $this->fopen_query($url, $args, $authstr); } } // --- /* * Post-Query Block * Handle response, return proper data types, debug, etc */ // print out the response if debug mode is enabled. if ($this->debug) { error_log("RESPONSE:\n " . $response); } // The only time a response should contain is in the case of authentication error // cPanel 11.25 fixes this issue, but if is in the response, we'll error out. if (stristr($response, '') == true) { if (stristr($response, 'Login Attempt Failed') == true) { error_log("Login Attempt Failed"); return; } if (stristr($response, 'action="/login/"') == true) { error_log("Authentication Error"); return; } return; } // perform simplexml transformation (array relies on this) if ( ($this->output == 'simplexml') || $this->output == 'array') { $response = simplexml_load_string($response, null, LIBXML_NOERROR | LIBXML_NOWARNING); if (!$response) { error_log("Some error message here"); return; } if ($this->debug) { error_log("SimpleXML var_dump:\n" . print_r($response, true)); } } // perform array tranformation if ($this->output == 'array') { $response = $this->unserialize_xml($response); if ($this->debug) { error_log("Associative Array var_dump:\n" . print_r($response, true)); } } return $response; } private function curl_query( $url, $postdata, $authstr ) { $curl = curl_init(); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // Return contents of transfer on curl_exec curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // Allow self-signed certs curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // Set the URL curl_setopt($curl, CURLOPT_URL, $url); // Increase buffer size to avoid "funny output" exception curl_setopt($curl, CURLOPT_BUFFERSIZE, 131072); // Pass authentication header $header[0] =$authstr . "Content-Type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($postdata) . "\r\n" . "\r\n" . $postdata; curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_POST, 1); $result = curl_exec($curl); if ($result == false) { throw new Exception("curl_exec threw error \"" . curl_error($curl) . "\" for " . $url . "?" . $postdata ); } curl_close($curl); return $result; } private function fopen_query( $url, $postdata, $authstr ) { if ( !(ini_get('allow_url_fopen') ) ) { throw new Exception('fopen_query called on system without allow_url_fopen enabled in php.ini'); } $opts = array( 'http' => array( 'allow_self_signed' => true, 'method' => 'POST', 'header' => $authstr . "Content-Type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($postdata) . "\r\n" . "\r\n" . $postdata ) ); $context = stream_context_create($opts); return file_get_contents($url, false, $context); } /* * Convert simplexml to associative arrays * * This function will convert simplexml to associative arrays. */ private function unserialize_xml($input, $callback = null, $recurse = false) { // Get input, loading an xml string with simplexml if its the top level of recursion $data = ( (!$recurse) && is_string($input) ) ? simplexml_load_string($input) : $input; // Convert SimpleXMLElements to array if ($data instanceof SimpleXMLElement) { $data = (array) $data; } // Recurse into arrays if (is_array($data)) { foreach ($data as &$item) { $item = $this->unserialize_xml($item, $callback, true); } } // Run callback and return return (!is_array($data) && is_callable($callback)) ? call_user_func($callback, $data) : $data; } /* TO DO: Implement API1 and API2 query functions!!!!! */ /** * Call an API1 function * * This function allows you to call API1 from within the XML-API, This allowes a user to peform actions * such as adding ftp accounts, etc * * @param string $user The username of the account to perform API1 actions on * @param string $module The module of the API1 call to use * @param string $function The function of the API1 call * @param array $args The arguments for the API1 function, this should be a non-associative array * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CallingAPIFunctions XML API Call documentation * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiRef/WebHome API1 & API2 Call documentation * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiBasics/CallingApiOne API1 Documentation */ public function api1_query($user, $module, $function, $args = array() ) { if ( !isset($module) || !isset($function) || !isset($user) ) { error_log("api1_query requires that a module and function are passed to it"); return false; } if (!is_array($args)) { error_log('api1_query requires that it is passed an array as the 4th parameter'); return false; } $cpuser = 'cpanel_xmlapi_user'; $module_type = 'cpanel_xmlapi_module'; $func_type = 'cpanel_xmlapi_func'; $api_type = 'cpanel_xmlapi_apiversion'; if ( $this->get_output() == 'json' ) { $cpuser = 'cpanel_jsonapi_user'; $module_type = 'cpanel_jsonapi_module'; $func_type = 'cpanel_jsonapi_func'; $api_type = 'cpanel_jsonapi_apiversion'; } $call = array( $cpuser => $user, $module_type => $module, $func_type => $function, $api_type => '1' ); for ($int = 0; $int < count($args); $int++) { $call['arg-' . $int] = $args[$int]; } return $this->xmlapi_query('cpanel', $call); } /** * Call an API2 Function * * This function allows you to call an API2 function, this is the modern API for cPanel and should be used in preference over * API1 when possible * * @param string $user The username of the account to perform API2 actions on * @param string $module The module of the API2 call to use * @param string $function The function of the API2 call * @param array $args An associative array containing the arguments for the API2 call * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CallingAPIFunctions XML API Call documentation * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiRef/WebHome API1 & API2 Call documentation * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ApiTwo Legacy API2 Documentation * @link http://docs.cpanel.net/twiki/bin/view/DeveloperResources/ApiBasics/CallingApiTwo API2 Documentation */ public function api2_query($user, $module, $function, $args = array()) { if (!isset($user) || !isset($module) || !isset($function) ) { error_log("api2_query requires that a username, module and function are passed to it"); return false; } if (!is_array($args)) { error_log("api2_query requires that an array is passed to it as the 4th parameter"); return false; } $cpuser = 'cpanel_xmlapi_user'; $module_type = 'cpanel_xmlapi_module'; $func_type = 'cpanel_xmlapi_func'; $api_type = 'cpanel_xmlapi_apiversion'; if ( $this->get_output() == 'json' ) { $cpuser = 'cpanel_jsonapi_user'; $module_type = 'cpanel_jsonapi_module'; $func_type = 'cpanel_jsonapi_func'; $api_type = 'cpanel_jsonapi_apiversion'; } $args[$cpuser] = $user; $args[$module_type] = $module; $args[$func_type] = $function; $args[$api_type] = '2'; return $this->xmlapi_query('cpanel', $args); } #### # XML API Functions #### /** * Return a list of available XML-API calls * * This function will return an array containing all applications available within the XML-API * * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListAvailableCalls XML API Call documentation */ public function applist() { return $this->xmlapi_query('applist'); } #### # Account functions #### /** * Create a cPanel Account * * This function will allow one to create an account, the $acctconf parameter requires that the follow * three associations are defined: * - username * - password * - domain * * Failure to prive these will cause an error to be logged. Any other key/value pairs as defined by the createaccount call * documentation are allowed parameters for this call. * * @param array $acctconf * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CreateAccount XML API Call documentation */ public function createacct($acctconf) { if (!is_array($acctconf)) { error_log("createacct requires that first parameter passed to it is an array"); return false; } if (!isset($acctconf['username']) || !isset($acctconf['password']) || !isset($acctconf['domain'])) { error_log("createacct requires that username, password & domain elements are in the array passed to it"); return false; } return $this->xmlapi_query('createacct', $acctconf); } /** * Change a cPanel Account's Password * * This function will allow you to change the password of a cpanel account * * @param string $username The username to change the password of * @param string $pass The new password for the cPanel Account * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ChangePassword XML API Call documentation */ public function passwd($username, $pass) { if (!isset($username) || !isset($pass)) { error_log("passwd requires that an username and password are passed to it"); return false; } return $this->xmlapi_query('passwd', array('user' => $username, 'pass' => $pass)); } /** * Limit an account's monthly bandwidth usage * * This function will set an account's bandwidth limit. * * @param string $username The username of the cPanel account to modify * @param int $bwlimit The new bandwidth limit in megabytes * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/LimitBandwidth XML API Call documentation */ public function limitbw($username, $bwlimit) { if (!isset($username) || !isset($bwlimit)) { error_log("limitbw requires that an username and bwlimit are passed to it"); return false; } return $this->xmlapi_query('limitbw', array('user' => $username, 'bwlimit' => $bwlimit)); } /** * List accounts on Server * * This call will return a list of account on a server, either no parameters or both parameters may be passed to this function. * * @param string $searchtype Type of account search to use, allowed values: domain, owner, user, ip or package * @param string $search the string to search against * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListAccounts XML API Call documentation */ public function listaccts($searchtype = null, $search = null) { if ($search) { return $this->xmlapi_query('listaccts', array('searchtype' => $searchtype, 'search' => $search )); } return $this->xmlapi_query('listaccts'); } /** * Modify a cPanel account * * This call will allow you to change limitations and information about an account. See the XML API call documentation for a list of * acceptable values for args. * * @param string $username The username to modify * @param array $args the new values for the modified account (see {@link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ModifyAccount modifyacct documentation}) * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ModifyAccount XML API Call documentation */ public function modifyacct($username, $args = array()) { if (!isset($username)) { error_log("modifyacct requires that username is passed to it"); return false; } $args['user'] = $username; if (sizeof($args) < 2) { error_log("modifyacct requires that at least one attribute is passed to it"); return false; } return $this->xmlapi_query('modifyacct', $args); } /** * Edit a cPanel Account's Quota * * This call will allow you to change a cPanel account's quota * * @param string $username The username of the account to modify the quota. * @param int $quota the new quota in megabytes * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/EditQuota XML API Call documentation */ public function editquota($username, $quota) { if (!isset($username) || !isset($quota)) { error_log("editquota requires that an username and quota are passed to it"); return false; } return $this->xmlapi_query('editquota', array('user' => $username, 'quota' => $quota)); } /** * Return a summary of the account's information * * This call will return a brief report of information about an account, such as: * - Disk Limit * - Disk Used * - Domain * - Account Email * - Theme * - Start Data * * Please see the XML API Call documentation for more information on what is returned by this call * * @param string $username The username to retrieve a summary of * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ShowAccountInformation XML API Call documenation */ public function accountsummary($username) { if (!isset($username)) { error_log("accountsummary requires that an username is passed to it"); return false; } return $this->xmlapi_query('accountsummary', array('user' => $username)); } /** * Suspend a User's Account * * This function will suspend the specified cPanel users account. * The $reason parameter is optional, but can contain a string of any length * * @param string $username The username to suspend * @param string $reason The reason for the suspension * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SuspendAccount XML API Call documentation */ public function suspendacct($username, $reason = null) { if (!isset($username)) { error_log("suspendacct requires that an username is passed to it"); return false; } if ($reason) { return $this->xmlapi_query('suspendacct', array('user' => $username, 'reason' => $reason )); } return $this->xmlapi_query('suspendacct', array('user' => $username)); } /** * List suspended accounts on a server * * This function will return an array containing all the suspended accounts on a server * * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListSuspended XML API Call documentation */ public function listsuspended() { return $this->xmlapi_query('listsuspended'); } /** * Remove an Account * * This XML API call will remove an account on the server * The $keepdns parameter is optional, when enabled this will leave the DNS zone on the server * * @param string $username The usename to delete * @param bool $keepdns When pass a true value, the DNS zone will be retained * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/TerminateAccount */ public function removeacct($username, $keepdns = false) { if (!isset($username)) { error_log("removeacct requires that a username is passed to it"); return false; } if ($keepdns) { return $this->xmlapi_query('removeacct', array('user' => $username, 'keepdns' => '1')); } return $this->xmlapi_query('removeacct', array('user' => $username)); } /** * Unsuspend an Account * * This XML API call will unsuspend an account * * @param string $username The username to unsuspend * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/UnsuspendAcount XML API Call documentation */ public function unsuspendacct($username) { if (!isset($username)) { error_log("unsuspendacct requires that a username is passed to it"); return false; } return $this->xmlapi_query('unsuspendacct', array('user' => $username)); } /** * Change an Account's Package * * This XML API will change the package associated account. * * @param string $username the username to change the package of * @param string $pkg The package to change the account to. * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ChangePackage XML API Call documentation */ public function changepackage($username, $pkg) { if (!isset($username) || !isset($pkg)) { error_log("changepackage requires that username and pkg are passed to it"); return false; } return $this->xmlapi_query('changepackage', array('user' => $username, 'pkg' => $pkg)); } /** * Return the privileges a reseller has in WHM * * This will return a list of the privileges that a reseller has to WHM * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ViewPrivileges XML API Call documentation */ public function myprivs() { return $this->xmlapi_query('myprivs'); } /** * Display Data about a Virtual Host * * This function will return information about a specific domain. This data is essentially a representation of the data * Contained in the httpd.conf VirtualHost for the domain. * * @return mixed * @param string $domain The domain to fetch information for * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DomainUserData */ public function domainuserdata( $domain ) { if (!isset( $domain ) ) { error_log("domainuserdata requires that domain is passed to it"); return false; } return $this->xmlapi_query("domainuserdata", array( 'domain' => $domain ) ); } /** * Change a site's IP Address * * This function will allow you to change the IP address that a domain listens on. * In order to properly call this function Either $user or $domain parameters must be defined * @param string $ip The $ip address to change the account or domain to * @param string $user The username to change the IP of * @param string $domain The domain to change the IP of * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetSiteIp XML API Call documentation */ public function setsiteip ( $ip, $user = null, $domain = null ) { if ( !isset($ip) ) { error_log("setsiteip requires that ip is passed to it"); return false; } if ($user == null && $domain == null) { error_log("setsiteip requires that either domain or user is passed to it"); return false; } if ($user == null) { return $this->xmlapi_query( "setsiteip", array( "ip" => $ip, "domain" => $domain ) ); } else { return $this->xmlapi_query( "setsiteip", array( "ip" => $ip, "user" => $user ) ); } } #### # DNS Functions #### // This API function lets you create a DNS zone. /** * Add a DNS Zone * * This XML API function will create a DNS Zone. This will use the "standard" template when * creating the zone. * * @param string $domain The DNS Domain that you wish to create a zone for * @param string $ip The IP you want the domain to resolve to * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddDNSZone XML API Call documentation */ public function adddns($domain, $ip) { if (!isset($domain) || !isset($ip)) { error_log("adddns require that domain, ip are passed to it"); return false; } return $this->xmlapi_query('adddns', array('domain' => $domain, 'ip' => $ip)); } /** * Add a record to a zone * * This will append a record to a DNS Zone. The $args argument to this function * must be an associative array containing information about the DNS zone, please * see the XML API Call documentation for more info * * @param string $zone The DNS zone that you want to add the record to * @param array $args Associative array representing the record to be added * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddZoneRecord XML API Call documentation */ public function addzonerecord( $zone, $args ) { if (!is_array($args)) { error_log("addzonerecord requires that $args passed to it is an array"); return; } $args['zone'] = $zone; return $this->xmlapi_query('addzonerecord', $args); } /** * Edit a Zone Record * * This XML API Function will allow you to edit an existing DNS Zone Record. * This works by passing in the line number of the record you wish to edit. * Line numbers can be retrieved with dumpzone() * * @param string $zone The zone to edit * @param int $line The line number of the zone to edit * @param array $args An associative array representing the zone record * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/EditZoneRecord XML API Call documentation * @see dumpzone() */ public function editzonerecord( $zone, $line, $args ) { if (!is_array($args)) { error_log("editzone requires that $args passed to it is an array"); return; } $args['domain'] = $zone; $args['Line'] = $line; return $this->xmlapi_query('editzonerecord', $args); } /** * Retrieve a DNS Record * * This function will return a data structure representing a DNS record, to * retrieve all lines see dumpzone. * @param string $zone The zone that you want to retrieve a record from * @param string $line The line of the zone that you want to retrieve * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/GetZoneRecord XML API Call documentation */ public function getzonerecord( $zone, $line ) { return $this->xmlapi_query('getzonerecord', array( 'domain' => $zone, 'Line' => $line ) ); } /** * Remove a DNS Zone * * This function will remove a DNS Zone from the server * * @param string $domain The domain to be remove * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeleteDNSZone XML API Call documentation */ public function killdns($domain) { if (!isset($domain)) { error_log("killdns requires that domain is passed to it"); return false; } return $this->xmlapi_query('killdns', array('domain' => $domain)); } /** * Return a List of all DNS Zones on the server * * This XML API function will return an array containing all the DNS Zones on the server * * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListDNSZone XML API Call documentation */ public function listzones() { return $this->xmlapi_query('listzones'); } /** * Return all records in a zone * * This function will return all records within a zone. * @param string $domain The domain to return the records from. * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListOneZone XML API Call documentation * @see editdnsrecord() * @see getdnsrecord() */ public function dumpzone($domain) { if (!isset($domain)) { error_log("dumpzone requires that a domain is passed to it"); return false; } return $this->xmlapi_query('dumpzone', array('domain' => $domain)); } /** * Return a Nameserver's IP * * This function will return a nameserver's IP * * @param string $nameserver The nameserver to lookup * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/LookupIP XML API Call documentation */ public function lookupnsip($nameserver) { if (!isset($nameserver)) { error_log("lookupnsip requres that a nameserver is passed to it"); return false; } return $this->xmlapi_query('lookupnsip', array('nameserver' => $nameserver)); } /** * Remove a line from a zone * * This function will remove the specified line from a zone * @param string $zone The zone to remove a line from * @param int $line The line to remove from the zone * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RemoveZone XML API Call documentation */ public function removezonerecord($zone, $line) { if ( !isset($zone) || !isset($line) ) { error_log("removezone record requires that a zone and line number is passed to it"); return false; } return $this->xmlapi_query('removezonerecord', array('zone' => $zone, 'Line' => $line) ); } /** * Reset a zone * * This function will reset a zone removing all custom records. Subdomain records will be readded by scanning the userdata datastore. * @param string $domain the domain name of the zone to reset * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ResetZone XML API Call documentation */ public function resetzone($domain) { if ( !isset($domain) ) { error_log("resetzone requires that a domain name is passed to it"); return false; } return $this->xmlapi_query('resetzone', array('domain' => $domain)); } #### # Package Functions #### /** * Add a new package * * This function will allow you to add a new package * This function should be passed an associative array containing elements that define package parameters. * These variables map directly to the parameters for the XML-API Call, please refer to the link below for a complete * list of possible variable. The "name" element is required. * @param array $pkg an associative array containing package parameters * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddPackage XML API Call documentation */ public function addpkg($pkg) { if (!isset($pkg['name'])) { error_log("addpkg requires that name is defined in the array passed to it"); return false; } return $this->xmlapi_query('addpkg', $pkg); } /** * Remove a package * * This function allow you to delete a package * @param string $pkgname The package you wish to delete * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeletePackage XML API Call documentation */ public function killpkg($pkgname) { if (!isset($pkgname)) { error_log("killpkg requires that the package name is passed to it"); return false; } return $this->xmlapi_query('killpkg', array('pkg' => $pkgname)); } /** * Edit a package * * This function allows you to change a package's paremeters. This is passed an associative array defining * the parameters for the package. The keys within this array map directly to the XML-API call, please see the link * below for a list of possible keys within this package. The name element is required. * @param array $pkg An associative array containing new parameters for the package * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/EditPackage XML API Call documentation */ public function editpkg($pkg) { if (!isset($pkg['name'])) { error_log("editpkg requires that name is defined in the array passed to it"); return false; } return $this->xmlapi_query('editpkg', $pkg); } /** * List Packages * * This function will list all packages available to the user * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListPackages XML API Call documentation */ public function listpkgs() { return $this->xmlapi_query('listpkgs'); } #### # Reseller functions #### /** * Make a user a reseller * * This function will allow you to mark an account as having reseller privileges * @param string $username The username of the account you wish to add reseller privileges to * @param int $makeowner Boolean 1 or 0 defining whether the account should own itself or not * @see setacls() * @see setresellerlimits() * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddResellerPrivileges XML API Call documentation */ public function setupreseller($username, $makeowner = true) { if (!isset($username)) { error_log("setupreseller requires that username is passed to it"); return false; } if ($makeowner) { return $this->xmlapi_query('setupreseller', array('user' => $username, 'makeowner' => '1')); } return $this->xmlapi_query('setupreseller', array('user' => $username, 'makeowner' => '0')); } /** * Create a New ACL List * * This function allows you to create a new privilege set for reseller accounts. This is passed an * Associative Array containing the configuration information for this variable. Please see the XML API Call documentation * For more information. "acllist" is a required element within this array * @param array $acl an associative array describing the parameters for the ACL to be create * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/CreateResellerACLList XML API Call documentation */ public function saveacllist($acl) { if (!isset($acl['acllist'])) { error_log("saveacllist requires that acllist is defined in the array passed to it"); return false; } return $this->xmlapi_query('saveacllist', $acl); } /** * List available saved ACLs * * This function will return a list of Saved ACLs for reseller accounts * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListCurrentResellerACLLists XML API Call documentation */ public function listacls() { return $this->xmlapi_query('listacls'); } /** * List Resellers * * This function will return a list of resellers on the server * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListResellerAccounts XML API Call documentation */ public function listresellers() { return $this->xmlapi_query('listresellers'); } /** * Get a reseller's statistics * * This function will return general information on a reseller and all it's account individually such as disk usage and bandwidth usage * * @param string $username The reseller to be checked * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListResellersAccountsInformation XML API Call documentation */ public function resellerstats($username) { if (!isset($username)) { error_log("resellerstats requires that a username is passed to it"); return false; } return $this->xmlapi_query('resellerstats', array('reseller' => $username)); } /** * Remove Reseller Privileges * * This function will remove an account's reseller privileges, this does not remove the account. * * @param string $username The username to remove reseller privileges from * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RemoveResellerPrivileges XML API Call documentation */ public function unsetupreseller($username) { if (!isset($username)) { error_log("unsetupreseller requires that a username is passed to it"); return false; } return $this->xmlapi_query('unsetupreseller', array('user' => $username)); } /** * Set a reseller's privileges * * This function will allow you to set what parts of WHM a reseller has access to. This is passed an associative array * containing the privleges that this reseller should have access to. These map directly to the parameters passed to the XML API Call * Please view the XML API Call documentation for more information. "reseller" is the only required element within this array * @param array $acl An associative array containing all the ACL information for the reseller * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellersACLList XML API Call documentation */ public function setacls($acl) { if (!isset($acl['reseller'])) { error_log("setacls requires that reseller is defined in the array passed to it"); return false; } return $this->xmlapi_query('setacls', $acl); } /** * Terminate a Reseller's Account * * This function will terminate a reseller's account and all accounts owned by the reseller * * @param string $reseller the name of the reseller to terminate * @param boolean $terminatereseller Passing this as true will terminate the the reseller's account as well as all the accounts owned by the reseller * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/TerminateResellerandAccounts XML API Call documentation * **/ public function terminatereseller($reseller, $terminatereseller = true) { if (!isset($reseller)) { error_log("terminatereseller requires that username is passed to it"); return false; } $verify = 'I understand this will irrevocably remove all the accounts owned by the reseller ' . $reseller; if ($terminatereseller) { return $this->xmlapi_query('terminatereseller', array('reseller' => $reseller, 'terminatereseller' => '1', 'verify' => $verify)); } return $this->xmlapi_query('terminatereseller', array('reseller' => $reseller, 'terminatereseller' => '0', 'verify' => $verify)); } /** * Set a reseller's dedicated IP addresses * * This function will set a reseller's dedicated IP addresses. If an IP is not passed to this function, * it will reset the reseller to use the server's main shared IP address. * @param string $user The username of the reseller to change dedicated IPs for * @param string $ip The IP to assign to the reseller, this can be a comma-seperated list of IPs to allow for multiple IP addresses * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerIps XML API Call documentation */ public function setresellerips($user, $ip = null) { if (!isset($user) ) { error_log("setresellerips requires that a username is passed to it"); return false; } $params = array("user" => $user); if ($ip != null) { $params['ip'] = $ip; } return $this->xmlapi_query('setresellerips',$params); } /** * Set Accounting Limits for a reseller account * * This function allows you to define limits for reseller accounts not included with in access control such as * the number of accounts a reseller is allowed to create, the amount of disk space to use. * This function is passed an associative array defining these limits, these map directly to the parameters for the XML API * Call, please refer to the XML API Call documentation for more information. The only required parameters is "user" * * @param array $reseller_cfg An associative array containing configuration information for the specified reseller * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerLimits XML API Call documentation * */ public function setresellerlimits( $reseller_cfg ) { if ( !isset($reseller_cfg['user'] ) ) { error_log("setresellerlimits requires that a user is defined in the array passed to it"); return false; } return $this->xmlapi_query('setresellerlimits',$reseller_cfg); } /** * Set a reseller's main IP * * This function will allow you to set a reseller's main IP. By default all accounts created by this reseller * will be created on this IP * @param string $reseller the username of the reseller to change the main IP of * @param string $ip The ip you would like this reseller to create accounts on by default * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerMainIp XML API Call documentation */ public function setresellermainip($reseller, $ip) { if ( !isset($reseller) || !isset($ip) ) { error_log("setresellermainip requires that an reseller and ip are passed to it"); return false; } return $this->xmlapi_query("setresellermainip", array('user' => $reseller, 'ip' => $ip)); } /** * Set reseller package limits * * This function allows you to define which packages a reseller has access to use * @param string $user The reseller you wish to define package limits for * @param boolean $no_limit Whether or not you wish this reseller to have packages limits * @param string $package if $no_limit is false, then the package you wish to modify privileges for * @param boolean $allowed if $no_limit is false, then defines if the reseller should have access to the package or not * @param int $number if $no_limit is false, then defines the number of account a reseller can create of a specific package * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerPkgLimit XML API Call documentation */ public function setresellerpackagelimits($user, $no_limit, $package = null, $allowed = null, $number = null) { if (!isset($user) || !isset($no_limit) ) { error_log("setresellerpackagelimits requires that a username and no_limit are passed to it by default"); return false; } if ($no_limit) { return $this->xmlapi_query("setresellerpackagelimits", array( 'user' => $user, "no_limit" => '1') ); } else { if ( is_null($package) || is_null($allowed) ) { error_log('setresellerpackagelimits requires that package and allowed are passed to it if no_limit eq 0'); return false; } $params = array( 'user' => $user, 'no_limit' => '0', 'package' => $package, ); if ($allowed) { $params['allowed'] = 1; } else { $params['allowed'] = 0; } if ( !is_null($number) ) { $params['number'] = $number; } return $this->xmlapi_query('setresellerpackagelimits', $params); } } /** * Suspend a reseller and all accounts owned by a reseller * * This function, when called will suspend a reseller account and all account owned by said reseller * @param string $reseller The reseller account to be suspended * @param string $reason (optional) The reason for suspending the reseller account * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SuspendReseller XML API Call documentation */ public function suspendreseller($reseller, $reason = null) { if (!isset($reseller) ) { error_log("suspendreseller requires that the reseller's username is passed to it"); return false; } $params = array("user" => $reseller); if ($reason) { $params['reason'] = $reason; } return $this->xmlapi_query('suspendreseller', $params); } /** * Unsuspend a Reseller Account * * This function will unsuspend a reseller account and all accounts owned by the reseller in question * @param string $user The username of the reseller to be unsuspended * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/UnsuspendReseller XML API Call documentation */ public function unsuspendreseller($user) { if (!isset($user) ) { error_log("unsuspendreseller requires that a username is passed to it"); return false; } return $this->xmlapi_query('unsuspendreseller', array('user' => $user)); } /** * Get the number of accounts owned by a reseller * * This function will return the number of accounts owned by a reseller account, along with information such as the number of active, suspended and accounting limits * @param string $user The username of the reseller to get account information from * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AcctCounts XML API Call documentation */ public function acctcounts($user) { if (!isset($user)) { error_log('acctcounts requires that a username is passed to it'); return false; } return $this->xmlapi_query('acctcounts', array('user' => $user) ); } /** * Set a reseller's nameservers * * This function allows you to change the nameservers that account created by a specific reseller account will use. * If this function is not passed a $nameservers parameter, it will reset the nameservers for the reseller to the servers's default * @param string $user The username of the reseller account to grab reseller accounts from * @param string $nameservers A comma seperate list of nameservers * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResellerNameservers XML API Call documentation */ public function setresellernameservers($user, $nameservers = null) { if (!isset($user)) { error_log("setresellernameservers requires that a username is passed to it"); return false; } $params = array('user' => $user); if ($nameservers) { $params['nameservers'] = $nameservers; } return $this->xmlapi_query('setresellernameservers', $params); } #### # Server information #### /** * Get a server's hostname * * This function will return a server's hostname * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DisplayServerHostname XML API Call documentation */ public function gethostname() { return $this->xmlapi_query('gethostname'); } /** * Get the version of cPanel running on the server * * This function will return the version of cPanel/WHM running on the remote system * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DisplaycPanelWHMVersion XML API Call documentation */ public function version() { return $this->xmlapi_query('version'); } /** * Get Load Average * * This function will return the loadavg of the remote system * * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/LoadAvg XML API Call documentation */ public function loadavg() { return $this->xmlapi_query('loadavg'); } /** * Get a list of languages on the remote system * * This function will return a list of available langauges for the cPanel interface * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/GetLangList XML API Call documentation * */ public function getlanglist() { return $this->xmlapi_query('getlanglist'); } #### # Server administration #### /** * Reboot server * * This function will reboot the server * @param boolean $force This will determine if the server should be given a graceful or forceful reboot * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RebootServer XML API Call documentation */ public function reboot($force = false) { if ($force) { return $this->xmlapi_query('reboot', array('force' => '1')); } return $this->xmlapi_query('reboot'); } /** * Add an IP to a server * * This function will add an IP alias to your server * @param string $ip The IP to be added * @param string $netmask The netmask of the IP to be added * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/AddIPAddress XML API Call documentation */ public function addip($ip, $netmask) { if (!isset($ip) || !isset($netmask)) { error_log("addip requires that an IP address and Netmask are passed to it"); return false; } return $this->xmlapi_query('addip', array('ip' => $ip, 'netmask' => $netmask)); } // This function allows you to delete an IP address from your server. /** * Delete an IP from a server * * Remove an IP from the server * @param string $ip The IP to remove * @param string $ethernetdev The ethernet device that the IP is bound to * @param bool $skipifshutdown Whether the function should remove the IP even if the ethernet interface is down * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeleteIPAddress XML API Call documentation */ public function delip($ip, $ethernetdev = null, $skipifshutdown = false) { $args = array(); if (!isset($ip)) { error_log("delip requires that an IP is defined in the array passed to it"); return false; } $args['ip'] = $ip; if ($ethernetdev) { $args['ethernetdev'] = $ethernetdev; } $args['skipifshutdown'] = ($skipifshutdown) ? '1' : '0'; return $this->xmlapi_query('delip', $args); } /** * List IPs * * This should return a list of IPs on a server * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/DeleteIPAddress XML API Call documentation */ public function listips() { return $this->xmlapi_query('listips'); } /** * Set Hostname * * This function will allow you to set the hostname of the server * @param string $hostname the hostname that should be assigned to the serve * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetHostname XML API Call documentation */ public function sethostname($hostname) { if (!isset($hostname)) { error_log("sethostname requires that hostname is passed to it"); return false; } return $this->xmlapi_query('sethostname', array('hostname' => $hostname)); } /** * Set the resolvers used by the server * * This function will set the resolvers in /etc/resolv.conf for the server * @param string $nameserver1 The IP of the first nameserver to use * @param string $nameserver2 The IP of the second namesever to use * @param string $nameserver3 The IP of the third nameserver to use * @param string $nameserver4 The IP of the forth nameserver to use * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/SetResolvers XML API Call documentation */ public function setresolvers($nameserver1, $nameserver2 = null, $nameserver3 = null) { $args = array(); if (!isset($nameserver1)) { error_log("setresolvers requires that nameserver1 is defined in the array passed to it"); return false; } $args['nameserver1'] = $nameserver1; if ($nameserver2) { $args['nameserver2'] = $nameserver2; } if ($nameserver3) { $args['nameserver3'] = $nameserver3; } return $this->xmlapi_query('setresolvers', $args); } /** * Display bandwidth Usage * * This function will return all bandwidth usage information for the server, * The arguments for this can be passed in via an associative array, the elements of this array map directly to the * parameters of the call, please see the XML API Call documentation for more information * @param array $args The configuration for what bandwidth information to display * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ShowBw XML API Call documentation */ public function showbw($args = null) { if (is_array($args)) { return $this->xmlapi_query('showbw', $args); } return $this->xmlapi_query('showbw'); } public function nvset($key, $value) { if (!isset($key) || !isset($value)) { error_log("nvset requires that key and value are passed to it"); return false; } return $this->xmlapi_query('nvset', array('key' => $key, 'value' => $value)); } // This function allows you to retrieve and view a non-volatile variable's value. public function nvget($key) { if (!isset($key)) { error_log("nvget requires that key is passed to it"); return false; } return $this->xmlapi_query('nvget', array('key' => $key)); } #### # Service functions #### /** * Restart a Service * * This function allows you to restart a service on the server * @param string $service the service that you wish to restart please view the XML API Call documentation for acceptable values to this parameters * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/RestartService XML API Call documentation */ public function restartsrv($service) { if (!isset($service)) { error_log("restartsrv requires that service is passed to it"); return false; } return $this->xmlapi_query('restartservice', array('service' => $service)); } /** * Service Status * * This function will return the status of all services on the and whether they are running or not * @param array $args A single service to filter for. * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ServiceStatus XML API Call documentation */ public function servicestatus($args=array()) { if (!empty($args) && !is_array($args)) { $args = array('service'=>$args); } elseif (!is_array($args)) { $args = array(); } return $this->xmlapi_query('servicestatus', $args); } /** * Configure A Service * * This function will allow you to enabled or disable services along with their monitoring by chkservd * @param string $service The service to be monitored * @param bool $enabled Whether the service should be enabled or not * @param bool $monitored Whether the service should be monitored or not * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ConfigureService XML API Call documentation */ public function configureservice($service, $enabled = true, $monitored = true) { if (!isset($service)) { error_log("configure service requires that a service is passed to it"); return false; } $params = array('service' => $service); if ($enabled) { $params['enabled'] = 1; } else { $params['enabled'] = 0; } if ($monitored) { $params['monitored'] = 1; } else { $params['monitored'] = 0; } return $this->xmlapi_query('configureservice', $params); } #### # SSL functions #### /** * Display information on an SSL host * * This function will return information on an SSL Certificate, CSR, cabundle and SSL key for a specified domain * @param array $args Configuration information for the SSL certificate, please see XML API Call documentation for required values * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/FetchSSL XML API Call documentation */ public function fetchsslinfo($args) { if ( (isset($args['domain']) && isset($args['crtdata'])) || (!isset($args['domain']) && !isset($args['crtdata'])) ) { error_log("fetchsslinfo requires domain OR crtdata is passed to it"); } if (isset($args['crtdata'])) { // crtdata must be URL-encoded! $args['crtdata'] = urlencode(trim($args['crtdata'])); } return $this->xmlapi_query('fetchsslinfo', $args); } /** * Generate an SSL Certificate * * This function will generate an SSL Certificate, the arguments for this map directly to the call for the XML API call. Please consult the XML API Call documentation for more information * @param array $args the configuration for the SSL Certificate being generated * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/GenerateSSL XML API Call documentation */ public function generatessl($args) { if (!isset($args['xemail']) || !isset($args['host']) || !isset($args['country']) || !isset($args['state']) || !isset($args['city']) || !isset($args['co']) || !isset($args['cod']) || !isset($args['email']) || !isset($args['pass'])) { error_log("generatessl requires that xemail, host, country, state, city, co, cod, email and pass are defined in the array passed to it"); return false; } return $this->xmlapi_query('generatessl', $args); } /** * Install an SSL certificate * * This function will allow you to install an SSL certificate that is uploaded via the $argument parameter to this call. The arguments for this call map directly to the parameters for the XML API call, * please consult the XML API Call documentation for more information. * @param array $args The configuration for the SSL certificate * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/InstallSSL XML API Call documentation */ public function installssl($args) { if (!isset($args['user']) || !isset($args['domain']) || !isset($args['cert']) || !isset($args['key']) || !isset($args['cab']) || !isset($args['ip'])) { error_log("installssl requires that user, domain, cert, key, cab and ip are defined in the array passed to it"); return false; } return $this->xmlapi_query('installssl', $args); } /** * List SSL Certs * * This function will list all SSL certificates installed on the server * @return mixed * @link http://docs.cpanel.net/twiki/bin/view/AllDocumentation/AutomationIntegration/ListSSL XML API Call documentation */ public function listcrts() { return $this->xmlapi_query('listcrts'); } #### # cPanel API1 functions # Note: A cPanel account username is required # Some cPanel features must be enabled to be able to use some function (f.e. park, unpark) #### // This API1 function adds a emailaccount for a specific user. public function addpop($username, $args) { if (!isset($username) || !isset($args)) { error_log("addpop requires that a user and args are passed to it"); return false; } if (is_array($args) && (sizeof($args) < 3)) { error_log("addpop requires that args at least contains an email_username, email_password and email_domain"); return false; } return $this->api1_query($username, 'Email', 'addpop', $args); } // This API function displays a list of all parked domains for a specific user. public function park($username, $newdomain, $topdomain) { $args = array(); if ( (!isset($username)) && (!isset($newdomain)) ) { error_log("park requires that a username and new domain are passed to it"); return false; } $args['domain'] = $newdomain; if ($topdomain) { $args['topdomain'] = $topdomain; } return $this->api2_query($username, 'Park', 'park', $args); } // This API function displays a list of all parked domains for a specific user. public function unpark($username, $domain) { $args = array(); if ( (!isset($username)) && (!isset($domain)) ) { error_log("unpark requires that a username and domain are passed to it"); return false; } $args['domain'] = $domain; return $this->api2_query($username, 'Park', 'unpark', $args); } #### # cPanel API2 functions # Note: A cPanel account username is required # Some cPanel features must be enabled to be able to use some function #### // This API2 function allows you to view the diskusage of a emailaccount. public function getdiskusage($username, $args) { if (!isset($username) || !isset($args)) { error_log("getdiskusage requires that a username and args are passed to it"); return false; } if (is_array($args) && (!isset($args['domain']) || !isset($args['login']))) { error_log("getdiskusage requires that args at least contains an email_domain and email_username"); return false; } return $this->api2_query($username, 'Email', 'getdiskusage', $args); } // This API2 function allows you to list ftp-users associated with a cPanel account including disk information. public function listftpwithdisk($username) { if (!isset($username)) { error_log("listftpwithdisk requires that user is passed to it"); return false; } return $this->api2_query($username, 'Ftp', 'listftpwithdisk'); } // This API2 function allows you to list ftp-users associated with a cPanel account. public function listftp($username) { if (!isset($username)) { error_log("listftp requires that user is passed to it"); return false; } return $this->api2_query($username, 'Ftp', 'listftp'); } // This API function displays a list of all parked domains for a specific user. public function listparkeddomains($username, $domain = null) { $args = array(); if (!isset($username)) { error_log("listparkeddomains requires that a user is passed to it"); return false; } if (isset($domain)) { $args['regex'] = $domain; return $this->api2_query($username, 'Park', 'listparkeddomains', $args); } return $this->api2_query($username, 'Park', 'listparkeddomains'); } // This API function displays a list of all addon domains for a specific user. public function listaddondomains($username, $domain = null) { $args = array(); if (!isset($username)) { error_log("listaddondomains requires that a user is passed to it"); return false; } if (isset($domain)) { $args['regex'] = $domain; return $this->api2_query($username, 'AddonDomain', 'listaddondomains', $args); } return $this->api2_query($username, 'Park', 'listaddondomains'); } // This API function displays a list of all selected stats for a specific user. public function stat($username, $args = null) { if ( (!isset($username)) || (!isset($args)) ) { error_log("stat requires that a username and options are passed to it"); return false; } if (is_array($args)) { $display = ''; foreach ($args as $value) { $display .= $value . '|'; } $values['display'] = substr($display, 0, -1); } else { $values['display'] = substr($args, 0, -1); } return $this->api2_query($username, 'StatsBar', 'stat', $values); } } rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/000077500000000000000000000000001361462701300235245ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/LICENSE000066400000000000000000000020701361462701300245300ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/VERSION000066400000000000000000000000031361462701300245650ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/index.php000066400000000000000000000010521361462701300253420ustar00rootroot00000000000000UseLangs(true); // start use langs folder $this->addJs('js/CustomAdminSettings.js', true); // add js file $this->addAjaxHook('AjaxAdminGetData', 'AjaxAdminGetData'); $this->addTemplate('templates/PluginCustomAdminSettingnTab.html', true); } /** * @return array */ public function AjaxAdminGetData() { return $this->ajaxResponse(__FUNCTION__, array( 'PHP' => phpversion() )); } } rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/js/000077500000000000000000000000001361462701300241405ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/js/CustomAdminSettings.js000066400000000000000000000013261361462701300304440ustar00rootroot00000000000000 (function () { if (!window.rl) { return; } /** * @constructor */ function CustomAdminSettings() { this.php = ko.observable(''); this.loading = ko.observable(false); } CustomAdminSettings.prototype.onBuild = function () // special function { var self = this; this.loading(true); window.rl.pluginRemoteRequest(function (sResult, oData) { self.loading(false); if (window.rl.Enums.StorageResultType.Success === sResult && oData && oData.Result) { self.php(oData.Result.PHP || ''); } }, 'AjaxAdminGetData'); }; window.rl.addSettingsViewModelForAdmin(CustomAdminSettings, 'PluginCustomAdminSettingnTab', 'SETTINGS_CUSTOM_ADMIN_CUSTOM_TAB_PLUGIN/TAB_NAME', 'custom'); }());rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/langs/000077500000000000000000000000001361462701300246305ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/langs/en.ini000066400000000000000000000002301361462701300257260ustar00rootroot00000000000000[SETTINGS_CUSTOM_ADMIN_CUSTOM_TAB_PLUGIN] TAB_NAME = "Custom Plugin Tab" LEGEND_CUSTOM = "Custom Plugin Tab (Example)" LABEL_PHP_VERSION = "PHP version"rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/langs/ru.ini000066400000000000000000000002301361462701300257520ustar00rootroot00000000000000[SETTINGS_CUSTOM_ADMIN_CUSTOM_TAB_PLUGIN] TAB_NAME = "Плагин" LEGEND_CUSTOM = "Плагин (Пример)" LABEL_PHP_VERSION = "PHP верŃия"rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/templates/000077500000000000000000000000001361462701300255225ustar00rootroot00000000000000PluginCustomAdminSettingnTab.html000066400000000000000000000010771361462701300341030ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-admin-settings-tab/templates
   
rainloop-webmail-1.14.0/plugins/custom-auth-example/000077500000000000000000000000001361462701300224245ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-auth-example/LICENSE000066400000000000000000000020701361462701300234300ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/custom-auth-example/VERSION000066400000000000000000000000031361462701300234650ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/custom-auth-example/index.php000066400000000000000000000017101361462701300242430ustar00rootroot00000000000000addHook('filter.login-credentials', 'FilterLoginСredentials'); } /** * @param string $sEmail * @param string $sLogin * @param string $sPassword * * @throws \RainLoop\Exceptions\ClientException */ public function FilterLoginСredentials(&$sEmail, &$sLogin, &$sPassword) { // Your custom php logic // You may change login credentials if ('demo@rainloop.net' === $sEmail) { $sEmail = 'user@rainloop.net'; $sLogin = 'user@rainloop.net'; $sPassword = 'super-puper-password'; } else { // or throw auth exeption throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); // or throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountNotAllowed); // or throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DomainNotAllowed); } } } rainloop-webmail-1.14.0/plugins/custom-login-mapping/000077500000000000000000000000001361462701300225735ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-login-mapping/LICENSE000066400000000000000000000020701361462701300235770ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/custom-login-mapping/README000066400000000000000000000001121361462701300234450ustar00rootroot00000000000000Plugin which allows you to set up custom username (login) by email addressrainloop-webmail-1.14.0/plugins/custom-login-mapping/VERSION000066400000000000000000000000031361462701300236340ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/custom-login-mapping/index.php000066400000000000000000000024311361462701300244130ustar00rootroot00000000000000addHook('filter.login-credentials', 'FilterLoginСredentials'); } /** * @param string $sEmail * @param string $sLogin * @param string $sPassword * * @throws \RainLoop\Exceptions\ClientException */ public function FilterLoginСredentials(&$sEmail, &$sLogin, &$sPassword) { $sMapping = \trim($this->Config()->Get('plugin', 'mapping', '')); if (!empty($sMapping)) { $aLines = \explode("\n", \preg_replace('/[\r\n\t\s]+/', "\n", $sMapping)); foreach ($aLines as $sLine) { if (false !== strpos($sLine, ':')) { $aData = \explode(':', $sLine, 2); if (is_array($aData) && !empty($aData[0]) && isset($aData[1])) { $aData = \array_map('trim', $aData); if ($sEmail === $aData[0] && 0 < strlen($aData[1])) { $sLogin = $aData[1]; } } } } } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('mapping')->SetLabel('Mapping') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('email:login mapping') ->SetDefaultValue("user@domain.com:user.bob\nadmin@domain.com:user.john") ); } } rainloop-webmail-1.14.0/plugins/custom-settings-tab/000077500000000000000000000000001361462701300224365ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-settings-tab/LICENSE000066400000000000000000000020701361462701300234420ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/custom-settings-tab/VERSION000066400000000000000000000000031361462701300234770ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/custom-settings-tab/index.php000066400000000000000000000025251361462701300242620ustar00rootroot00000000000000UseLangs(true); // start use langs folder $this->addJs('js/CustomUserSettings.js'); // add js file $this->addAjaxHook('AjaxGetCustomUserData', 'AjaxGetCustomUserData'); $this->addAjaxHook('AjaxSaveCustomUserData', 'AjaxSaveCustomUserData'); $this->addTemplate('templates/PluginCustomSettingsTab.html'); } /** * @return array */ public function AjaxGetCustomUserData() { $aSettings = $this->getUserSettings(); $sUserFacebook = isset($aSettings['UserFacebook']) ? $aSettings['UserFacebook'] : ''; $sUserSkype = isset($aSettings['UserSkype']) ? $aSettings['UserSkype'] : ''; // or get user's data from your custom storage ( DB / LDAP / ... ). \sleep(1); return $this->ajaxResponse(__FUNCTION__, array( 'UserFacebook' => $sUserFacebook, 'UserSkype' => $sUserSkype )); } /** * @return array */ public function AjaxSaveCustomUserData() { $sUserFacebook = $this->ajaxParam('UserFacebook'); $sUserSkype = $this->ajaxParam('UserSkype'); // or put user's data to your custom storage ( DB / LDAP / ... ). \sleep(1); return $this->ajaxResponse(__FUNCTION__, $this->saveUserSettings(array( 'UserFacebook' => $sUserFacebook, 'UserSkype' => $sUserSkype ))); } } rainloop-webmail-1.14.0/plugins/custom-settings-tab/js/000077500000000000000000000000001361462701300230525ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-settings-tab/js/CustomUserSettings.js000066400000000000000000000026601361462701300272460ustar00rootroot00000000000000 (function () { if (!window.rl) { return; } /** * @constructor */ function CustomUserSettings() { this.userSkype = ko.observable(''); this.userFacebook = ko.observable(''); this.loading = ko.observable(false); this.saving = ko.observable(false); this.savingOrLoading = ko.computed(function () { return this.loading() || this.saving(); }, this); } CustomUserSettings.prototype.customAjaxSaveData = function () { var self = this; if (this.saving()) { return false; } this.saving(true); window.rl.pluginRemoteRequest(function (sResult, oData) { self.saving(false); if (window.rl.Enums.StorageResultType.Success === sResult && oData && oData.Result) { // true } else { // false } }, 'AjaxSaveCustomUserData', { 'UserSkype': this.userSkype(), 'UserFacebook': this.userFacebook() }); }; CustomUserSettings.prototype.onBuild = function () // special function { var self = this; this.loading(true); window.rl.pluginRemoteRequest(function (sResult, oData) { self.loading(false); if (window.rl.Enums.StorageResultType.Success === sResult && oData && oData.Result) { self.userSkype(oData.Result.UserSkype || ''); self.userFacebook(oData.Result.UserFacebook || ''); } }, 'AjaxGetCustomUserData'); }; window.rl.addSettingsViewModel(CustomUserSettings, 'PluginCustomSettingsTab', 'SETTINGS_CUSTOM_PLUGIN/TAB_NAME', 'custom'); }());rainloop-webmail-1.14.0/plugins/custom-settings-tab/langs/000077500000000000000000000000001361462701300235425ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-settings-tab/langs/en.ini000066400000000000000000000002441361462701300246450ustar00rootroot00000000000000[SETTINGS_CUSTOM_PLUGIN] TAB_NAME = "Custom Plugin" LEGEND_CUSTOM = "Custom Plugin (Example)" LABEL_SKYPE = "Skype" LABEL_FACEBOOK = "Facebook" BUTTON_SAVE = "Save"rainloop-webmail-1.14.0/plugins/custom-settings-tab/langs/ru.ini000066400000000000000000000002651361462701300246740ustar00rootroot00000000000000[SETTINGS_CUSTOM_PLUGIN] TAB_NAME = "Плагин" LEGEND_CUSTOM = "Плагин (Пример)" LABEL_SKYPE = "Skype" LABEL_FACEBOOK = "Facebook" BUTTON_SAVE = "Сохранить"rainloop-webmail-1.14.0/plugins/custom-settings-tab/templates/000077500000000000000000000000001361462701300244345ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-settings-tab/templates/PluginCustomSettingsTab.html000066400000000000000000000023231361462701300321230ustar00rootroot00000000000000
   
rainloop-webmail-1.14.0/plugins/custom-system-folders/000077500000000000000000000000001361462701300230125ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/custom-system-folders/LICENSE000066400000000000000000000020701361462701300240160ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/custom-system-folders/README000066400000000000000000000000241361462701300236660ustar00rootroot00000000000000custom-sytem-foldersrainloop-webmail-1.14.0/plugins/custom-system-folders/VERSION000066400000000000000000000000031361462701300240530ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/custom-system-folders/index.php000066400000000000000000000072451361462701300246420ustar00rootroot00000000000000sSentFolder = \trim($this->Config()->Get('plugin', 'sent_folder', '')); $this->sDraftsFolder = \trim($this->Config()->Get('plugin', 'drafts_folder', '')); $this->sSpamFolder = \trim($this->Config()->Get('plugin', 'spam_folder', '')); $this->sTrashFolder = \trim($this->Config()->Get('plugin', 'trash_folder', '')); $this->sArchiveFolder = \trim($this->Config()->Get('plugin', 'archive_folder', '')); $this->addHook('filter.system-folders-names', 'FilterSystemFoldersNames'); $this->addHook('filter.folders-system-types', 'FilterFoldersSystemTypes'); } /** * @param \RainLoop\Model\Account $oAccount * @param array $aSystemTypes */ public function FilterFoldersSystemTypes($oAccount, &$aSystemTypes) { if ($oAccount) { $aSystemTypes = array(); if (0 < \strlen($this->sSentFolder)) { $aSystemTypes[] = \MailSo\Imap\Enumerations\FolderType::SENT; } if (0 < \strlen($this->sDraftsFolder)) { $aSystemTypes[] = \MailSo\Imap\Enumerations\FolderType::DRAFTS; } if (0 < \strlen($this->sSpamFolder)) { $aSystemTypes[] = \MailSo\Imap\Enumerations\FolderType::JUNK; } if (0 < \strlen($this->sTrashFolder)) { $aSystemTypes[] = \MailSo\Imap\Enumerations\FolderType::TRASH; } if (0 < \strlen($this->sArchiveFolder)) { $aSystemTypes[] = \MailSo\Imap\Enumerations\FolderType::ALL; } } } private function helperFolderType($sFolderName, $iType, &$aPrepend, &$aSystemFolderNames) { if (0 < \strlen($sFolderName) && '{@system@}' !== $sFolderName) { $aPrepend[$sFolderName] = $iType; if (isset($aSystemFolderNames[$sFolderName])) { unset($aSystemFolderNames[$sFolderName]); } } } /** * @param \RainLoop\Model\Account $oAccount * @param array $aSystemFolderNames */ public function FilterSystemFoldersNames($oAccount, &$aSystemFolderNames) { $aPrepend = array(); if ($oAccount && \is_array($aSystemFolderNames)) { $this->helperFolderType($this->sSentFolder, \MailSo\Imap\Enumerations\FolderType::SENT, $aPrepend, $aSystemFolderNames); $this->helperFolderType($this->sDraftsFolder, \MailSo\Imap\Enumerations\FolderType::DRAFTS, $aPrepend, $aSystemFolderNames); $this->helperFolderType($this->sSpamFolder, \MailSo\Imap\Enumerations\FolderType::JUNK, $aPrepend, $aSystemFolderNames); $this->helperFolderType($this->sTrashFolder, \MailSo\Imap\Enumerations\FolderType::TRASH, $aPrepend, $aSystemFolderNames); $this->helperFolderType($this->sArchiveFolder, \MailSo\Imap\Enumerations\FolderType::ALL, $aPrepend, $aSystemFolderNames); if (0 < \count($aPrepend)) { $aSystemFolderNames = \array_merge($aPrepend, $aSystemFolderNames); } } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('sent_folder')->SetLabel('Sent') ->SetDefaultValue('Sent'), \RainLoop\Plugins\Property::NewInstance('drafts_folder')->SetLabel('Drafts') ->SetDefaultValue('Drafts'), \RainLoop\Plugins\Property::NewInstance('spam_folder')->SetLabel('Spam') ->SetDefaultValue('Spam'), \RainLoop\Plugins\Property::NewInstance('trash_folder')->SetLabel('Trash') ->SetDefaultValue('Trash'), \RainLoop\Plugins\Property::NewInstance('archive_folder')->SetLabel('Archive') ->SetDefaultValue('Archive') ); } }rainloop-webmail-1.14.0/plugins/demo-account/000077500000000000000000000000001361462701300211005ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/demo-account/VERSION000066400000000000000000000000031361462701300221410ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/demo-account/index.php000066400000000000000000000053071361462701300227250ustar00rootroot00000000000000addHook('filter.app-data', 'FilterAppData'); $this->addHook('filter.action-params', 'FilterActionParams'); $this->addHook('ajax.action-pre-call', 'AjaxActionPreCall'); $this->addHook('filter.send-message', 'FilterSendMessage'); $this->addHook('main.fabrica', 'MainFabrica'); } /** * @return array */ protected function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('email')->SetLabel('Demo Email') ->SetDefaultValue('demo@domain.com'), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('Demo Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ); } /** * @return void */ public function FilterAppData($bAdmin, &$aResult) { if (!$bAdmin && \is_array($aResult) && isset($aResult['Auth']) && !$aResult['Auth']) { $aResult['DevEmail'] = $this->Config()->Get('plugin', 'email', $aResult['DevEmail']); $aResult['DevPassword'] = APP_DUMMY; } } /** * @return void */ public function FilterActionParams($sMethodName, &$aActionParams) { if ('DoLogin' === $sMethodName && isset($aActionParams['Email']) && isset($aActionParams['Password'])) { if ($this->Config()->Get('plugin', 'email') === $aActionParams['Email']) { $aActionParams['Password'] = $this->Config()->Get('plugin', 'password'); } } } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function isDemoAccount($oAccount) { return ($oAccount && $oAccount->Email() === $this->Config()->Get('plugin', 'email')); } public function AjaxActionPreCall($sAction) { if ('AccountSetup' === $sAction && $this->isDemoAccount($this->Manager()->Actions()->GetAccount())) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DemoAccountError); } } public function FilterSendMessage(&$oMessage) { if ($oMessage && $this->isDemoAccount($this->Manager()->Actions()->GetAccount())) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DemoSendMessageError); } } /** * @param string $sName * @param mixed $oDriver */ public function MainFabrica($sName, &$oDriver) { switch ($sName) { case 'storage': case 'storage-local': if (\class_exists('\\RainLoop\\Providers\\Storage\\TemproryApcStorage') && \function_exists('apc_store')) { $oAccount = $this->Manager()->Actions()->GetAccount(); if ($this->isDemoAccount($oAccount)) { $oDriver = new \RainLoop\Providers\Storage\TemproryApcStorage(APP_PRIVATE_DATA.'storage', $sName === 'storage-local'); } } break; } } } rainloop-webmail-1.14.0/plugins/directadmin-change-password/000077500000000000000000000000001361462701300240705ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/directadmin-change-password/DirectAdminChangePasswordDriver.php000066400000000000000000000063031361462701300327730ustar00rootroot00000000000000sHost = $sHost; $this->iPort = $iPort; return $this; } /** * @param string $sAllowedEmails * * @return \DirectAdminChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \DirectAdminChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('DirectAdmin: Try to change password for '.$oAccount->Email()); } $bResult = false; if (!empty($this->sHost) && 0 < $this->iPort && $oAccount) { $sEmail = \trim(\strtolower($oAccount->Email())); $sHost = \trim($this->sHost); $sHost = \str_replace('{user:host-imap}', $oAccount->Domain()->IncHost(), $sHost); $sHost = \str_replace('{user:host-smtp}', $oAccount->Domain()->OutHost(), $sHost); $sHost = \str_replace('{user:domain}', \MailSo\Base\Utils::GetDomainFromEmail($sEmail), $sHost); $sHost = \rtrim($this->sHost, '/\\'); if (!\preg_match('/^http[s]?:\/\//i', $sHost)) { $sHost = 'http://'.$sHost; } $sUrl = $sHost.':'.$this->iPort.'/CMD_CHANGE_EMAIL_PASSWORD'; $iCode = 0; $oHttp = \MailSo\Base\Http::SingletonInstance(); if ($this->oLogger) { $this->oLogger->Write('DirectAdmin[Api Request]:'.$sUrl); } $mResult = $oHttp->SendPostRequest($sUrl, array( 'email' => $sEmail, 'oldpassword' => $sPrevPassword, 'password1' => $sNewPassword, 'password2' => $sNewPassword, 'api' => '1' ), 'MailSo Http User Agent (v1)', $iCode, $this->oLogger); if (false !== $mResult && 200 === $iCode) { $aRes = null; @\parse_str($mResult, $aRes); if (is_array($aRes) && (!isset($aRes['error']) || (int) $aRes['error'] !== 1)) { $bResult = true; } else { if ($this->oLogger) { $this->oLogger->Write('DirectAdmin[Error]: Response: '.$mResult); } } } else { if ($this->oLogger) { $this->oLogger->Write('DirectAdmin[Error]: Empty Response: Code:'.$iCode); } } } return $bResult; } }rainloop-webmail-1.14.0/plugins/directadmin-change-password/LICENSE000066400000000000000000000020701361462701300250740ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/directadmin-change-password/README000066400000000000000000000001221361462701300247430ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (DirectAdmin).rainloop-webmail-1.14.0/plugins/directadmin-change-password/VERSION000066400000000000000000000000031361462701300251310ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/directadmin-change-password/index.php000066400000000000000000000032641361462701300257150ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sHost = \trim($this->Config()->Get('plugin', 'direct_admin_host', '')); $iPort = (int) $this->Config()->Get('plugin', 'direct_admin_port', 2222); if (!empty($sHost) && 0 < $iPort) { include_once __DIR__.'/DirectAdminChangePasswordDriver.php'; $oProvider = new DirectAdminChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sHost, $iPort); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('direct_admin_host')->SetLabel('DirectAdmin Host') ->SetDefaultValue('') ->SetDescription('Allowed patterns: {user:host-imap}, {user:host-smtp}, {user:domain}'), \RainLoop\Plugins\Property::NewInstance('direct_admin_port')->SetLabel('DirectAdmin Port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(2222), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } }rainloop-webmail-1.14.0/plugins/excel-multirow-maillist-parser/000077500000000000000000000000001361462701300246105ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/excel-multirow-maillist-parser/LICENCE000066400000000000000000000021041361462701300255720ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 https://github.com/sharq88 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.rainloop-webmail-1.14.0/plugins/excel-multirow-maillist-parser/README000066400000000000000000000000721361462701300254670ustar00rootroot00000000000000Add ability to paste multi row email addresses from excel.rainloop-webmail-1.14.0/plugins/excel-multirow-maillist-parser/VERSION000066400000000000000000000000031361462701300256510ustar00rootroot000000000000000.1rainloop-webmail-1.14.0/plugins/excel-multirow-maillist-parser/index.php000066400000000000000000000003011361462701300264220ustar00rootroot00000000000000addJs('js/parse_excel_list.js'); // add js file } } rainloop-webmail-1.14.0/plugins/excel-multirow-maillist-parser/js/000077500000000000000000000000001361462701300252245ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/excel-multirow-maillist-parser/js/parse_excel_list.js000066400000000000000000000005401361462701300311060ustar00rootroot00000000000000 (function(window, $) { $(function() { $(window.document).on('keyup', '.b-compose .b-header .inputosaurus-input input[type="text"]:first', function() { var $this = $(this), value = $this.val() ; if (value && value.match(/@/ig).length >= 2) { $this.val($this.val().replace(/\n| /ig, ',')); } }); }); }(window, $))rainloop-webmail-1.14.0/plugins/froxlor-change-password/000077500000000000000000000000001361462701300233005ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/froxlor-change-password/FroxlorChangePasswordDriver.php000066400000000000000000000200251361462701300314500ustar00rootroot00000000000000sDsn = $sDsn; $this->sUser = $sUser; $this->sPassword = $sPassword; return $this; } /** * @param string $sAllowedEmails * * @return \FroxlorChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \FroxlorChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Froxlor: Try to change password for '.$oAccount->Email()); } $bResult = false; if (!empty($this->sDsn) && 0 < \strlen($this->sUser) && 0 < \strlen($this->sPassword) && $oAccount) { try { $oPdo = new \PDO($this->sDsn, $this->sUser, $this->sPassword); $oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $oStmt = $oPdo->prepare('SELECT password_enc, id FROM mail_users WHERE username = ? LIMIT 1'); if ($oStmt->execute(array($oAccount->IncLogin()))) { $aFetchResult = $oStmt->fetchAll(\PDO::FETCH_ASSOC); if (\is_array($aFetchResult) && isset($aFetchResult[0]['password_enc'], $aFetchResult[0]['id'])) { $sDbPassword = \stripslashes($aFetchResult[0]['password_enc']); if ( $this->validatePasswordLogin( $sDbPassword, $sPrevPassword ) ) { $sEncNewPassword = $this->cryptPassword($sNewPassword, 3); $oStmt = $oPdo->prepare('UPDATE mail_users SET password_enc = ?,password = ? WHERE id = ?'); $bResult = (bool) $oStmt->execute( array($sEncNewPassword, $sNewPassword, $aFetchResult[0]['id'])); } } } } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException); } } } return $bResult; } /** * @param string $sPassword * @return string */ private function cryptPassword($sPassword, $type = 3) { return $this->makeCryptPassword($sPassword,$type); } /** * This file is part of the Froxlor project. * Copyright (c) 2010 the Froxlor Team (see authors). * * For the full copyright and license information, please view the COPYING * file that was distributed with this source code. You can also view the * COPYING file online at http://files.froxlor.org/misc/COPYING.txt * * @copyright (c) the authors * @author Michal Wojcik * @author Michael Kaufmann * @author Froxlor team (2010-) * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * @package Functions * */ /** * Make crypted password from clear text password * * @author Michal Wojcik * @author Michael Kaufmann * @author Froxlor team (2010-) * * 0 - default crypt (depenend on system configuration) * 1 - MD5 $1$ * 2 - BLOWFISH $2a$ | $2y$07$ (on php 5.3.7+) * 3 - SHA-256 $5$ (default) * 4 - SHA-512 $6$ * * @param string $password Password to be crypted * * @return string encrypted password */ private function makeCryptPassword ($password,$type = 3) { switch ($type) { case 0: $cryptPassword = \crypt($password); break; case 1: $cryptPassword = \crypt($password, '$1$' . $this->generatePassword(true). $this->generatePassword(true)); break; case 2: if (\version_compare(\phpversion(), '5.3.7', '<')) { $cryptPassword = \crypt($password, '$2a$' . $this->generatePassword(true). $this->generatePassword(true)); } else { // Blowfish hashing with a salt as follows: "$2a$", "$2x$" or "$2y$", // a two digit cost parameter, "$", and 22 characters from the alphabet "./0-9A-Za-z" $cryptPassword = \crypt( $password, '$2y$07$' . \substr($this->generatePassword(true).$this->generatePassword(true).$this->generatePassword(true), 0, 22) ); } break; case 3: $cryptPassword = \crypt($password, '$5$' . $this->generatePassword(true). $this->generatePassword(true)); break; case 4: $cryptPassword = \crypt($password, '$6$' . $this->generatePassword(true). $this->generatePassword(true)); break; default: $cryptPassword = \crypt($password); break; } return $cryptPassword; } /** * Generates a random password * * @param boolean $isSalt * optional, create a hash for a salt used in makeCryptPassword because crypt() does not like some special characters in its salts, default is false */ private function generatePassword($isSalt = false) { $alpha_lower = 'abcdefghijklmnopqrstuvwxyz'; $alpha_upper = \strtoupper($alpha_lower); $numeric = '0123456789'; $special = '!?<>§$%&+#='; $length = 10; $pw = $this->special_shuffle($alpha_lower); $n = \floor(($length) / 4); $pw .= \mb_substr($this->special_shuffle($alpha_upper), 0, $n); $pw .= \mb_substr($this->special_shuffle($numeric), 0, $n); $pw = \mb_substr($pw, - $length); return $this->special_shuffle($pw); } /** * multibyte-character safe shuffle function * * @param string $str * * @return string */ private function special_shuffle($str = null) { $len = \mb_strlen($str); $sploded = array(); while ($len -- > 0) { $sploded[] = \mb_substr($str, $len, 1); } \shuffle($sploded); return \join('', $sploded); } /** * Function validatePasswordLogin * * compare user password-hash with given user-password * and check if they are the same * additionally it updates the hash if the system settings changed * or if the very old md5() sum is used * * @param array $userinfo user-data from table * @param string $password the password to validate * @param string $table either panel_customers or panel_admins * @param string $uid user-id-field in $table * * @return boolean */ private function validatePasswordLogin($pwd_hash, $password = null) { $systype = 3; // SHA256 $update_hash = false; // check for good'ole md5 if (\strlen($pwd_hash) == 32 && \ctype_xdigit($pwd_hash)) { $pwd_check = \md5($password); $update_hash = true; } else { // cut out the salt from the hash $pwd_salt = \str_replace(\substr(\strrchr($pwd_hash, "$"), 1), "", $pwd_hash); // create same hash to compare $pwd_check = \crypt($password, $pwd_salt); // check whether the hash needs to be updated $hash_type_chk = \substr($pwd_hash, 0, 3); if (($systype == 1 && $hash_type_chk != '$1$') || // MD5 ($systype == 2 && $hash_type_chk != '$2$') || // BLOWFISH ($systype == 3 && $hash_type_chk != '$5$') || // SHA256 ($systype == 4 && $hash_type_chk != '$6$') // SHA512 ) { $update_hash = true; } } return $pwd_check; } } rainloop-webmail-1.14.0/plugins/froxlor-change-password/LICENSE000066400000000000000000000021221361462701300243020ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2017 Bob Kromonos Achten Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/froxlor-change-password/README000066400000000000000000000001171361462701300241570ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (Froxlor). rainloop-webmail-1.14.0/plugins/froxlor-change-password/VERSION000066400000000000000000000000041361462701300243420ustar00rootroot000000000000001.0 rainloop-webmail-1.14.0/plugins/froxlor-change-password/index.php000066400000000000000000000044141361462701300251230ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!extension_loaded('pdo') || !class_exists('PDO')) { return 'The PHP exention PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { return 'The PHP exention PDO (mysql) must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sDsn = \trim($this->Config()->Get('plugin', 'pdo_dsn', '')); $sUser = (string) $this->Config()->Get('plugin', 'user', ''); $sPassword = (string) $this->Config()->Get('plugin', 'password', ''); if (!empty($sDsn) && 0 < \strlen($sUser) && 0 < \strlen($sPassword)) { include_once __DIR__.'/FroxlorChangePasswordDriver.php'; $oProvider = new FroxlorChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sDsn, $sUser, $sPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('pdo_dsn')->SetLabel('Froxlor PDO dsn') ->SetDefaultValue('mysql:host=127.0.0.1;dbname=froxlor'), \RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User') ->SetDefaultValue('root'), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('DB Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/google-analytics/000077500000000000000000000000001361462701300217635ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/google-analytics/LICENSE000066400000000000000000000020701361462701300227670ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/google-analytics/README000066400000000000000000000001271361462701300226430ustar00rootroot00000000000000Embed Google Analytics (Universal Analytics) code into your webmail installation pages.rainloop-webmail-1.14.0/plugins/google-analytics/VERSION000066400000000000000000000000031361462701300230240ustar00rootroot000000000000001.5rainloop-webmail-1.14.0/plugins/google-analytics/index.php000066400000000000000000000026001361462701300236010ustar00rootroot00000000000000Config()->Get('plugin', 'account', '')) { $this->addJs('js/include.js'); } } /** * @return array */ public function configMapping() { $oAccount = \RainLoop\Plugins\Property::NewInstance('account')->SetLabel('Account') ->SetAllowedInJs(true) ->SetDefaultValue('') ; if (\method_exists($oAccount, 'SetPlaceholder')) { $oAccount->SetPlaceholder('UA-XXXXXXXX-X'); } return array($oAccount, \RainLoop\Plugins\Property::NewInstance('domain_name')->SetLabel('Domain Name') ->SetAllowedInJs(true) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('universal_analytics')->SetLabel('Use Universal Analytics') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetAllowedInJs(true) ->SetDefaultValue(true), \RainLoop\Plugins\Property::NewInstance('track_pageview')->SetLabel('Track Pageview') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetAllowedInJs(true) ->SetDefaultValue(true), \RainLoop\Plugins\Property::NewInstance('send_events')->SetLabel('Send Events') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetAllowedInJs(true) ->SetDefaultValue(false) ); } } rainloop-webmail-1.14.0/plugins/google-analytics/js/000077500000000000000000000000001361462701300223775ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/google-analytics/js/include.js000066400000000000000000000050261361462701300243630ustar00rootroot00000000000000 $(function () { if (!window.rl) { return; } var sAccount = window.rl.pluginSettingsGet('google-analytics', 'account'), sDomain = window.rl.pluginSettingsGet('google-analytics', 'domain_name'), bUniversalAnalytics = !!window.rl.pluginSettingsGet('google-analytics', 'universal_analytics'), bTrackPageview = !!window.rl.pluginSettingsGet('google-analytics', 'track_pageview'), bSendEvent = !!window.rl.pluginSettingsGet('google-analytics', 'send_events'), fSendEvent = null ; if (sAccount && '' !== sAccount) { if (bUniversalAnalytics) { (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); if (window.ga) { if (sDomain) { window.ga('create', sAccount, sDomain); } else { window.ga('create', sAccount); } if (bTrackPageview) { window.ga('send', 'pageview'); window.setInterval(function () { window.ga('send', 'pageview'); }, 1000 * 60 * 2); } if (bSendEvent) { fSendEvent = function(sCategory, sAction, sLabel) { window.ga('send', 'event', sCategory, sAction, sLabel); }; } } } else { window._gaq = window._gaq || []; window._gaq.push(['_setAccount', sAccount]); if (sDomain) { window._gaq.push(['_setDomainName', sDomain]); } if (bTrackPageview) { window._gaq.push(['_trackPageview']); window.setInterval(function () { window._gaq.push(['_trackPageview']); }, 1000 * 60 * 2); } if (bSendEvent) { fSendEvent = function(sCategory, sAction, sLabel) { window._gaq.push(['_trackEvent', sCategory, sAction, sLabel]); }; } var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); } if (fSendEvent) { window.rl.addHook('ajax-default-response', function (sAction, oData, sType) { switch (sAction) { case 'Login': case 'SendMessage': case 'MessageMove': case 'MessageDelete': fSendEvent('RainLoop', sAction, 'success' === sType && oData && oData['Result'] ? 'true' : 'false'); break; } }); } } });rainloop-webmail-1.14.0/plugins/hmailserver-change-password/000077500000000000000000000000001361462701300241265ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/hmailserver-change-password/HmailserverChangePasswordDriver.php000066400000000000000000000053701361462701300331320ustar00rootroot00000000000000sLogin = $sLogin; $this->sPassword = $sPassword; return $this; } /** * @param string $sAllowedEmails * * @return \HmailserverChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \HmailserverChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oHmailAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oHmailAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Try to change password for '.$oHmailAccount->Email()); } $bResult = false; try { $oHmailApp = new COM("hMailServer.Application"); $oHmailApp->Connect(); if ($oHmailApp->Authenticate($this->sLogin, $this->sPassword)) { $sEmail = $oHmailAccount->Email(); $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); $oHmailDomain = $oHmailApp->Domains->ItemByName($sDomain); if ($oHmailDomain) { $oHmailAccount = $oHmailDomain->Accounts->ItemByAddress($sEmail); if ($oHmailAccount) { $oHmailAccount->Password = $sNewPassword; $oHmailAccount->Save(); $bResult = true; } else { $this->oLogger->Write('HMAILSERVER: Unknown account ('.$sEmail.')', \MailSo\Log\Enumerations\Type::ERROR); } } else { $this->oLogger->Write('HMAILSERVER: Unknown domain ('.$sDomain.')', \MailSo\Log\Enumerations\Type::ERROR); } } else { $this->oLogger->Write('HMAILSERVER: Auth error', \MailSo\Log\Enumerations\Type::ERROR); } } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException); } } return $bResult; } }rainloop-webmail-1.14.0/plugins/hmailserver-change-password/LICENSE000066400000000000000000000020701361462701300251320ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/hmailserver-change-password/VERSION000066400000000000000000000000031361462701300251670ustar00rootroot000000000000001.2rainloop-webmail-1.14.0/plugins/hmailserver-change-password/index.php000066400000000000000000000034521361462701300257520ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!class_exists('COM')) { return 'The PHP extension COM must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sLogin = (string) $this->Config()->Get('plugin', 'login', ''); $sPassword = (string) $this->Config()->Get('plugin', 'password', ''); if (0 < \strlen($sLogin) && 0 < \strlen($sPassword)) { include_once __DIR__.'/HmailserverChangePasswordDriver.php'; $oProvider = new HmailserverChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sLogin, $sPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('login')->SetLabel('HmailServer Admin Login') ->SetDefaultValue('Administrator'), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('HmailServer Admin Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } }rainloop-webmail-1.14.0/plugins/ispconfig-change-password/000077500000000000000000000000001361462701300235665ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/ispconfig-change-password/IspConfigChangePasswordDriver.php000066400000000000000000000063661361462701300322000ustar00rootroot00000000000000sDsn = $sDsn; $this->sUser = $sUser; $this->sPassword = $sPassword; return $this; } /** * @param string $sAllowedEmails * * @return \IspConfigChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \IspConfigChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('ISP: Try to change password for '.$oAccount->Email()); } $bResult = false; if (!empty($this->sDsn) && 0 < \strlen($this->sUser) && 0 < \strlen($this->sPassword) && $oAccount) { try { $oPdo = new \PDO($this->sDsn, $this->sUser, $this->sPassword); $oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $oStmt = $oPdo->prepare('SELECT password, mailuser_id FROM mail_user WHERE login = ? LIMIT 1'); if ($oStmt->execute(array($oAccount->IncLogin()))) { $aFetchResult = $oStmt->fetchAll(\PDO::FETCH_ASSOC); if (\is_array($aFetchResult) && isset($aFetchResult[0]['password'], $aFetchResult[0]['mailuser_id'])) { $sDbPassword = \stripslashes($aFetchResult[0]['password']); $sDbSalt = '$1$'.\substr($sDbPassword, 3, 8).'$'; if (\crypt(\stripslashes($sPrevPassword), $sDbSalt) === $sDbPassword) { $oStmt = $oPdo->prepare('UPDATE mail_user SET password = ? WHERE mailuser_id = ?'); $bResult = (bool) $oStmt->execute( array($this->cryptPassword($sNewPassword), $aFetchResult[0]['mailuser_id'])); } } } } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException); } } } return $bResult; } /** * @param string $sPassword * @return string */ private function cryptPassword($sPassword) { $sSalt = ''; $sBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; for ($iIndex = 0; $iIndex < 8; $iIndex++) { $sSalt .= $sBase64[\rand(0, 63)]; } return \crypt($sPassword, '$1$'.$sSalt.'$'); } }rainloop-webmail-1.14.0/plugins/ispconfig-change-password/LICENSE000066400000000000000000000020701361462701300245720ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/ispconfig-change-password/README000066400000000000000000000001201361462701300244370ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (ISPConfig).rainloop-webmail-1.14.0/plugins/ispconfig-change-password/VERSION000066400000000000000000000000031361462701300246270ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/ispconfig-change-password/index.php000066400000000000000000000043151361462701300254110ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!extension_loaded('pdo') || !class_exists('PDO')) { return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sDsn = \trim($this->Config()->Get('plugin', 'pdo_dsn', '')); $sUser = (string) $this->Config()->Get('plugin', 'user', ''); $sPassword = (string) $this->Config()->Get('plugin', 'password', ''); if (!empty($sDsn) && 0 < \strlen($sUser) && 0 < \strlen($sPassword)) { include_once __DIR__.'/IspConfigChangePasswordDriver.php'; $oProvider = new IspConfigChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sDsn, $sUser, $sPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('pdo_dsn')->SetLabel('ISPConfig PDO dsn') ->SetDefaultValue('mysql:host=127.0.0.1;dbname=dbispconfig'), \RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User') ->SetDefaultValue('root'), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('DB Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } }rainloop-webmail-1.14.0/plugins/ispmail-change-password/000077500000000000000000000000001361462701300232435ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/ispmail-change-password/ChangePasswordISPmailDriver.php000077500000000000000000000114351361462701300312660ustar00rootroot00000000000000sHost = $sHost; return $this; } /** * @param int $iPort * * @return \ChangePasswordISPmailDriver */ public function SetPort($iPort) { $this->iPort = (int) $iPort; return $this; } /** * @param string $sDatabase * * @return \ChangePasswordISPmailDriver */ public function SetDatabase($sDatabase) { $this->sDatabase = $sDatabase; return $this; } /** * @param string $sTable * * @return \ChangePasswordISPmailDriver */ public function SetTable($sTable) { $this->sTable = $sTable; return $this; } /** * @param string $sUsercol * * @return \ChangePasswordISPmailDriver */ public function SetUserColumn($sUsercol) { $this->sUsercol = $sUsercol; return $this; } /** * @param string $sPasscol * * @return \ChangePasswordISPmailDriver */ public function SetPasswordColumn($sPasscol) { $this->sPasscol = $sPasscol; return $this; } /** * @param string $sUser * * @return \ChangePasswordISPmailDriver */ public function SetUser($sUser) { $this->sUser = $sUser; return $this; } /** * @param string $sPassword * * @return \ChangePasswordISPmailDriver */ public function SetPassword($sPassword) { $this->sPassword = $sPassword; return $this; } /** * @param string $sEncrypt * * @return \ChangePasswordISPmailDriver */ public function SetEncrypt($sEncrypt) { $this->sEncrypt = $sEncrypt; return $this; } /** * @param string $sAllowedEmails * * @return \ChangePasswordISPmailDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \ChangePasswordISPmailDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('ISPmail: Try to change password for '.$oAccount->Email()); } unset($sPrevPassword); $bResult = false; if (0 < \strlen($sNewPassword)) { try { $sDsn = 'mysql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; $oPdo = new \PDO($sDsn, $this->sUser, $this->sPassword); $oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $sUpdatePassword = $this->cryptPassword($sNewPassword, $oPdo); if (0 < \strlen($sUpdatePassword)) { $oStmt = $oPdo->prepare("UPDATE {$this->sTable} SET {$this->sPasscol} = ? WHERE {$this->sUsercol} = ?"); $bResult = (bool) $oStmt->execute(array($sUpdatePassword, $oAccount->Email())); } else { if ($this->oLogger) { $this->oLogger->Write('ISPmail: Encrypted password is empty', \MailSo\Log\Enumerations\Type::ERROR); } } $oPdo = null; } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException); } } } return $bResult; } /** * @param string $sPassword * @param \PDO $oPdo * * @return string */ private function cryptPassword($sPassword, $oPdo) { $sResult = ''; $sSalt = substr(str_shuffle('./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), 0, 16); switch (strtolower($this->sEncrypt)) { default: case 'plain-md5': $sResult = '{PLAIN-MD5}' . md5($sPassword); break; case 'sha256-crypt': $sResult = '{SHA256-CRYPT}' . crypt($sPassword,'$5$'.$sSalt); break; } return $sResult; } } rainloop-webmail-1.14.0/plugins/ispmail-change-password/LICENSE000066400000000000000000000021251361462701300242500ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Julien Lutran (https://github.com/jlutran) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/ispmail-change-password/README000066400000000000000000000001171361462701300241220ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (ISPmail). rainloop-webmail-1.14.0/plugins/ispmail-change-password/VERSION000066400000000000000000000000041361462701300243050ustar00rootroot000000000000001.0 rainloop-webmail-1.14.0/plugins/ispmail-change-password/index.php000077500000000000000000000066251361462701300250770ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!extension_loaded('pdo') || !class_exists('PDO')) { return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/ChangePasswordISPmailDriver.php'; $oProvider = new ChangePasswordISPmailDriver(); $oProvider ->SetHost($this->Config()->Get('plugin', 'host', '')) ->SetPort((int) $this->Config()->Get('plugin', 'port', 3306)) ->SetDatabase($this->Config()->Get('plugin', 'database', '')) ->SetTable($this->Config()->Get('plugin', 'table', '')) ->SetUserColumn($this->Config()->Get('plugin', 'usercol', '')) ->SetPasswordColumn($this->Config()->Get('plugin', 'passcol', '')) ->SetUser($this->Config()->Get('plugin', 'user', '')) ->SetPassword($this->Config()->Get('plugin', 'password', '')) ->SetEncrypt($this->Config()->Get('plugin', 'encrypt', '')) ->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))) ->SetLogger($this->Manager()->Actions()->Logger()) ; break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('MySQL Host') ->SetDefaultValue('127.0.0.1'), \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('MySQL Port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(3306), \RainLoop\Plugins\Property::NewInstance('database')->SetLabel('MySQL Database') ->SetDefaultValue('mailserver'), \RainLoop\Plugins\Property::NewInstance('table')->SetLabel('MySQL table') ->SetDefaultValue('virtual_users'), \RainLoop\Plugins\Property::NewInstance('usercol')->SetLabel('MySQL username column') ->SetDefaultValue('email'), \RainLoop\Plugins\Property::NewInstance('passcol')->SetLabel('MySQL password column') ->SetDefaultValue('password'), \RainLoop\Plugins\Property::NewInstance('user')->SetLabel('MySQL User') ->SetDefaultValue('mailuser'), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('MySQL Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('encrypt')->SetLabel('Encrypt') ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array('PLAIN-MD5', 'SHA256-CRYPT')) ->SetDescription('In what way do you want the passwords to be crypted ?'), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/ldap-change-password/000077500000000000000000000000001361462701300225255ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/ldap-change-password/ChangePasswordLdapDriver.php000066400000000000000000000130231361462701300301220ustar00rootroot00000000000000sHostName = $sHostName; $this->iHostPort = $iHostPort; $this->sUserDnFormat = $sUserDnFormat; $this->sPasswordField = $sPasswordField; $this->sPasswordEncType = $sPasswordEncType; return $this; } /** * @param string $sAllowedEmails * * @return \ChangePasswordLdapDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \ChangePasswordLdapDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { $bResult = false; try { $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email()); $sUserDn = \strtr($this->sUserDnFormat, array( '{domain}' => $sDomain, '{domain:dc}' => 'dc='.\strtr($sDomain, array('.' => ',dc=')), '{email}' => $oAccount->Email(), '{email:user}' => \MailSo\Base\Utils::GetAccountNameFromEmail($oAccount->Email()), '{email:domain}' => $sDomain, '{login}' => $oAccount->Login(), '{imap:login}' => $oAccount->Login(), '{imap:host}' => $oAccount->DomainIncHost(), '{imap:port}' => $oAccount->DomainIncPort(), '{gecos}' => function_exists('posix_getpwnam') ? posix_getpwnam($oAccount->Login()) : '' )); $oCon = @\ldap_connect($this->sHostName, $this->iHostPort); if ($oCon) { if (!@\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3)) { $this->oLogger->Write( 'Failed to set LDAP Protocol version to 3, TLS not supported.', \MailSo\Log\Enumerations\Type::WARNING, 'LDAP' ); } else if (@!ldap_start_tls($oCon)) { $this->oLogger->Write("ldap_start_tls failed: ".$oCon, \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); } if (!@\ldap_bind($oCon, $sUserDn, $sPrevPassword)) { if ($this->oLogger) { $sError = $oCon ? @\ldap_error($oCon) : ''; $iErrno = $oCon ? @\ldap_errno($oCon) : 0; $this->oLogger->Write('ldap_bind error: '.$sError.' ('.$iErrno.')', \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); } return false; } } else { return false; } $sSshaSalt = ''; $sShaPrefix = '{SHA}'; $sEncodedNewPassword = $sNewPassword; switch (\strtolower($this->sPasswordEncType)) { case 'ssha': $sSshaSalt = $this->getSalt(4); $sShaPrefix = '{SSHA}'; case 'sha': switch (true) { default: case \function_exists('sha1'): $sEncodedNewPassword = $sShaPrefix.\base64_encode(\sha1($sNewPassword.$sSshaSalt, true).$sSshaSalt); break; case \function_exists('hash'): $sEncodedNewPassword = $sShaPrefix.\base64_encode(\hash('sha1', $sNewPassword, true).$sSshaSalt); break; case \function_exists('mhash') && defined('MHASH_SHA1'): $sEncodedNewPassword = $sShaPrefix.\base64_encode(\mhash(MHASH_SHA1, $sNewPassword).$sSshaSalt); break; } break; case 'md5': $sEncodedNewPassword = '{MD5}'.\base64_encode(\pack('H*', \md5($sNewPassword))); break; case 'crypt': $sEncodedNewPassword = '{CRYPT}'.\crypt($sNewPassword, $this->getSalt(2)); break; } $aEntry = array(); $aEntry[$this->sPasswordField] = (string) $sEncodedNewPassword; if (!!@\ldap_modify($oCon, $sUserDn, $aEntry)) { $bResult = true; } else { if ($this->oLogger) { $sError = $oCon ? @\ldap_error($oCon) : ''; $iErrno = $oCon ? @\ldap_errno($oCon) : 0; $this->oLogger->Write('ldap_modify error: '.$sError.' ('.$iErrno.')', \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); } } } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException, \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); } $bResult = false; } return $bResult; } /** * @param int $iLength * * @return string */ private function getSalt($iLength) { $sChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $iCharsLength = \strlen($sChars); $sResult = ''; while (\strlen($sResult) < $iLength) { $sResult .= \substr($sChars, \rand() % $iCharsLength, 1); } return $sResult; } } rainloop-webmail-1.14.0/plugins/ldap-change-password/LICENSE000066400000000000000000000020701361462701300235310ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/ldap-change-password/README000066400000000000000000000001251361462701300234030ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (LDAP Password). rainloop-webmail-1.14.0/plugins/ldap-change-password/VERSION000066400000000000000000000000031361462701300235660ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/ldap-change-password/index.php000066400000000000000000000053431361462701300243520ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!\function_exists('ldap_connect')) { return 'The LDAP PHP extension must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sHostName = \trim($this->Config()->Get('plugin', 'hostname', '')); $iHostPort = (int) $this->Config()->Get('plugin', 'port', 389); $sUserDnFormat = \trim($this->Config()->Get('plugin', 'user_dn_format', '')); $sPasswordField = \trim($this->Config()->Get('plugin', 'password_field', '')); $sPasswordEncType = \trim($this->Config()->Get('plugin', 'password_enc_type', '')); if (!empty($sHostName) && 0 < $iHostPort && !empty($sUserDnFormat) && !empty($sPasswordField) && !empty($sPasswordEncType)) { include_once __DIR__.'/ChangePasswordLdapDriver.php'; $oProvider = new \ChangePasswordLdapDriver(); $oProvider ->SetConfig($sHostName, $iHostPort, $sUserDnFormat, $sPasswordField, $sPasswordEncType) ->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))) ->SetLogger($this->Manager()->Actions()->Logger()) ; } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('hostname')->SetLabel('LDAP hostname') ->SetDefaultValue('127.0.0.1'), \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('LDAP port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(389), \RainLoop\Plugins\Property::NewInstance('user_dn_format')->SetLabel('User DN format') ->SetDescription('LDAP user dn format. Supported tokens: {email}, {email:user}, {email:domain}, {login}, {domain}, {domain:dc}, {imap:login}, {imap:host}, {imap:port}, {gecos}') ->SetDefaultValue('uid={imap:login},ou=Users,{domain:dc}'), \RainLoop\Plugins\Property::NewInstance('password_field')->SetLabel('Password field') ->SetDefaultValue('userPassword'), \RainLoop\Plugins\Property::NewInstance('password_enc_type')->SetLabel('Encryption type') ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array('SHA', 'SSHA', 'MD5', 'Crypt', 'Clear')), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/ldap-contacts-suggestions/000077500000000000000000000000001361462701300236265ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/ldap-contacts-suggestions/LICENSE000066400000000000000000000020701361462701300246320ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php000066400000000000000000000161651361462701300311620ustar00rootroot00000000000000sHostName = $sHostName; $this->iHostPort = $iHostPort; if (0 < \strlen($sAccessDn)) { $this->sAccessDn = $sAccessDn; $this->sAccessPassword = $sAccessPassword; } $this->sUsersDn = $sUsersDn; $this->sObjectClass = $sObjectClass; $this->sUidField = $sUidField; $this->sNameField = $sNameField; $this->sEmailField = $sEmailField; return $this; } /** * @param string $sAllowedEmails * * @return \LdapContactsSuggestions */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \RainLoop\Model\Account $oAccount * @param string $sQuery * @param int $iLimit = 20 * * @return array */ public function Process($oAccount, $sQuery, $iLimit = 20) { $sQuery = \trim($sQuery); if (2 > \strlen($sQuery)) { return array(); } else if (!$oAccount || !\RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails)) { return array(); } $aResult = $this->ldapSearch($oAccount, $sQuery); $aResult = \RainLoop\Utils::RemoveSuggestionDuplicates($aResult); if ($iLimit < \count($aResult)) { $aResult = \array_slice($aResult, 0, $iLimit); } return $aResult; } /** * @param array $aLdapItem * @param array $aEmailFields * @param array $aNameFields * * @return array */ private function findNameAndEmail($aLdapItem, $aEmailFields, $aNameFields, $aUidFields) { $sEmail = $sName = $sUid = ''; if ($aLdapItem) { foreach ($aEmailFields as $sField) { if (!empty($aLdapItem[$sField][0])) { $sEmail = \trim($aLdapItem[$sField][0]); if (!empty($sEmail)) { break; } } } foreach ($aNameFields as $sField) { if (!empty($aLdapItem[$sField][0])) { $sName = \trim($aLdapItem[$sField][0]); if (!empty($sName)) { break; } } } foreach ($aUidFields as $sField) { if (!empty($aLdapItem[$sField][0])) { $sUid = \trim($aLdapItem[$sField][0]); if (!empty($sUid)) { break; } } } } return array($sEmail, $sName, $sUid); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sQuery * * @return array */ private function ldapSearch($oAccount, $sQuery) { $sSearchEscaped = $this->escape($sQuery); $aResult = array(); $oCon = @\ldap_connect($this->sHostName, $this->iHostPort); if ($oCon) { $this->oLogger->Write('ldap_connect: connected', \MailSo\Log\Enumerations\Type::INFO, 'LDAP'); @\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3); if (!@\ldap_bind($oCon, $this->sAccessDn, $this->sAccessPassword)) { if (is_null($this->sAccessDn)) { $this->logLdapError($oCon, 'ldap_bind (anonymous)'); } else { $this->logLdapError($oCon, 'ldap_bind'); } return $aResult; } $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email()); $sSearchDn = \strtr($this->sUsersDn, array( '{domain}' => $sDomain, '{domain:dc}' => 'dc='.\strtr($sDomain, array('.' => ',dc=')), '{email}' => $oAccount->Email(), '{email:user}' => \MailSo\Base\Utils::GetAccountNameFromEmail($oAccount->Email()), '{email:domain}' => $sDomain, '{login}' => $oAccount->Login(), '{imap:login}' => $oAccount->Login(), '{imap:host}' => $oAccount->DomainIncHost(), '{imap:port}' => $oAccount->DomainIncPort() )); $aEmails = empty($this->sEmailField) ? array() : \explode(',', $this->sEmailField); $aNames = empty($this->sNameField) ? array() : \explode(',', $this->sNameField); $aUIDs = empty($this->sUidField) ? array() : \explode(',', $this->sUidField); $aEmails = \array_map('trim', $aEmails); $aNames = \array_map('trim', $aNames); $aUIDs = \array_map('trim', $aUIDs); $aFields = \array_merge($aEmails, $aNames, $aUIDs); $aItems = array(); $sSubFilter = ''; foreach ($aFields as $sItem) { if (!empty($sItem)) { $aItems[] = $sItem; $sSubFilter .= '('.$sItem.'=*'.$sSearchEscaped.'*)'; } } $sFilter = '(&(objectclass='.$this->sObjectClass.')'; $sFilter .= (1 < count($aItems) ? '(|' : '').$sSubFilter.(1 < count($aItems) ? ')' : ''); $sFilter .= ')'; $this->oLogger->Write('ldap_search: start: '.$sSearchDn.' / '.$sFilter, \MailSo\Log\Enumerations\Type::INFO, 'LDAP'); $oS = @\ldap_search($oCon, $sSearchDn, $sFilter, $aItems, 0, 30, 30); if ($oS) { $aEntries = @\ldap_get_entries($oCon, $oS); if (is_array($aEntries)) { if (isset($aEntries['count'])) { unset($aEntries['count']); } foreach ($aEntries as $aItem) { if ($aItem) { $sName = $sEmail = ''; list ($sEmail, $sName) = $this->findNameAndEmail($aItem, $aEmails, $aNames, $aUIDs); if (!empty($sEmail)) { $aResult[] = array($sEmail, $sName); } } } } else { $this->logLdapError($oCon, 'ldap_get_entries'); } } else { $this->logLdapError($oCon, 'ldap_search'); } } else { return $aResult; } return $aResult; } /** * @param string $sStr * * @return string */ public function escape($sStr) { $aNewChars = array(); $aChars = array('\\', '*', '(', ')', \chr(0)); foreach ($aChars as $iIndex => $sValue) { $aNewChars[$iIndex] = '\\'.\str_pad(\dechex(\ord($sValue)), 2, '0'); } return \str_replace($aChars, $aNewChars, $sStr); } /** * @param mixed $oCon * @param string $sCmd * * @return string */ public function logLdapError($oCon, $sCmd) { if ($this->oLogger) { $sError = $oCon ? @\ldap_error($oCon) : ''; $iErrno = $oCon ? @\ldap_errno($oCon) : 0; $this->oLogger->Write($sCmd.' error: '.$sError.' ('.$iErrno.')', \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); } } /** * @param \MailSo\Log\Logger $oLogger * * @return \LdapContactsSuggestions */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } } rainloop-webmail-1.14.0/plugins/ldap-contacts-suggestions/VERSION000066400000000000000000000000041361462701300246700ustar00rootroot000000000000001.1 rainloop-webmail-1.14.0/plugins/ldap-contacts-suggestions/index.php000066400000000000000000000066771361462701300254660ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!\function_exists('ldap_connect')) { return 'The LDAP PHP extension must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $mResult */ public function MainFabrica($sName, &$mResult) { switch ($sName) { case 'suggestions': if (!\is_array($mResult)) { $mResult = array(); } $sHostName = \trim($this->Config()->Get('plugin', 'hostname', '')); $iHostPort = (int) $this->Config()->Get('plugin', 'port', 389); $sAccessDn = \trim($this->Config()->Get('plugin', 'access_dn', '')); $sAccessPassword = \trim($this->Config()->Get('plugin', 'access_password', '')); $sUsersDn = \trim($this->Config()->Get('plugin', 'users_dn_format', '')); $sObjectClass = \trim($this->Config()->Get('plugin', 'object_class', '')); $sSearchField = \trim($this->Config()->Get('plugin', 'search_field', '')); $sNameField = \trim($this->Config()->Get('plugin', 'name_field', '')); $sEmailField = \trim($this->Config()->Get('plugin', 'mail_field', '')); if (0 < \strlen($sUsersDn) && 0 < \strlen($sObjectClass) && 0 < \strlen($sEmailField)) { include_once __DIR__.'/LdapContactsSuggestions.php'; $oProvider = new LdapContactsSuggestions(); $oProvider->SetConfig($sHostName, $iHostPort, $sAccessDn, $sAccessPassword, $sUsersDn, $sObjectClass, $sSearchField, $sNameField, $sEmailField); $mResult[] = $oProvider; } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('hostname')->SetLabel('LDAP hostname') ->SetDefaultValue('127.0.0.1'), \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('LDAP port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(389), \RainLoop\Plugins\Property::NewInstance('access_dn')->SetLabel('Access dn (login)') ->SetDescription('LDAP bind DN to authentifcate with. If left blank, anonymous bind will be tried and Access password will be ignored') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('access_password')->SetLabel('Access password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('users_dn_format')->SetLabel('Users DN format') ->SetDescription('LDAP users dn format. Supported tokens: {email}, {login}, {domain}, {domain:dc}, {imap:login}, {imap:host}, {imap:port}') ->SetDefaultValue('ou=People,dc=domain,dc=com'), \RainLoop\Plugins\Property::NewInstance('object_class')->SetLabel('objectClass value') ->SetDefaultValue('inetOrgPerson'), \RainLoop\Plugins\Property::NewInstance('search_field')->SetLabel('Search field') ->SetDefaultValue('uid'), \RainLoop\Plugins\Property::NewInstance('name_field')->SetLabel('Name field') ->SetDefaultValue('givenname'), \RainLoop\Plugins\Property::NewInstance('mail_field')->SetLabel('Mail field') ->SetDefaultValue('mail'), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/mailcow-change-password/000077500000000000000000000000001361462701300232405ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/mailcow-change-password/LICENSE000066400000000000000000000021541361462701300242470ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Caleb Blankemeyer (https://github.com/zikeji) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/mailcow-change-password/MailcowChangePasswordDriver.php000066400000000000000000000077021361462701300313570ustar00rootroot00000000000000sDsn = $sDsn; $this->sUser = $sUser; $this->sPassword = $sPassword; return $this; } /** * @param string $sAllowedEmails * * @return \IspConfigChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \IspConfigChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Mailcow: Try to change password for '.$oAccount->Email()); } $bResult = false; if (!empty($this->sDsn) && 0 < \strlen($this->sUser) && 0 < \strlen($this->sPassword) && $oAccount) { try { $oPdo = new \PDO($this->sDsn, $this->sUser, $this->sPassword); $oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $oStmt = $oPdo->prepare('SELECT password, username FROM mailbox WHERE username = ? LIMIT 1'); if ($oStmt->execute(array($oAccount->IncLogin()))) { $aFetchResult = $oStmt->fetchAll(\PDO::FETCH_ASSOC); if (\is_array($aFetchResult) && isset($aFetchResult[0]['password'], $aFetchResult[0]['username'])) { $sDbPassword = $aFetchResult[0]['password']; if (\substr($sDbPassword, 0, 14) === '{SHA512-CRYPT}') { $sDbSalt = \substr($sDbPassword, 17, 16); } else { $sDbSalt = \substr($sDbPassword, 3, 16); } if ('{SHA512-CRYPT}'.\crypt($sPrevPassword, '$6$'.$sDbSalt) === $sDbPassword) { $oStmt = $oPdo->prepare('UPDATE mailbox SET password = ? WHERE username = ?'); if ($oStmt->execute(array($this->cryptPassword($sNewPassword), $aFetchResult[0]['username']))) { $oStmt = $oPdo ->prepare('UPDATE users SET digesta1=MD5(CONCAT(?, ":SabreDAV:", ?)) WHERE username=?'); if ($oStmt->execute(array($aFetchResult[0]['username'],$sNewPassword,$aFetchResult[0]['username']))) { //the MailCow & SabreDav have been updated, now update the doveadm password exec("/usr/bin/doveadm pw -s SHA512-CRYPT -p $sNewPassword", $hash, $return); $bResult = true; } } } } } } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException); } } } return $bResult; } /** * @param string $sPassword * @return string */ private function cryptPassword($sPassword) { $sSalt = ''; $sBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; for ($iIndex = 0; $iIndex < 16; $iIndex++) { $sSalt .= $sBase64[\rand(0, 63)]; } $crypted = \crypt($sPassword, '$6$'.$sSalt); return '{SHA512-CRYPT}'.$crypted; } } rainloop-webmail-1.14.0/plugins/mailcow-change-password/README000066400000000000000000000010761361462701300241240ustar00rootroot00000000000000Plugin that adds functionality to change the email account password with the email frontend [mailcow](https://github.com/andryyy/mailcow). Changes the SQL password (for the default ui for users), the dovecot password, and the SabreDAV password. Essentially does what their own PHP script does. It also ensures the old password matches the actual old password (something their Roundcube plugin does not do). This plugin is a modification of the [ispconfig-change-password](https://github.com/RainLoop/rainloop-webmail/tree/master/plugins/ipsconfig-change-password) plugin. rainloop-webmail-1.14.0/plugins/mailcow-change-password/VERSION000066400000000000000000000000041361462701300243020ustar00rootroot000000000000001.0 rainloop-webmail-1.14.0/plugins/mailcow-change-password/index.php000066400000000000000000000044211361462701300250610ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!extension_loaded('pdo') || !class_exists('PDO')) { return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sDsn = \trim($this->Config()->Get('plugin', 'pdo_dsn', '')); $sUser = (string) $this->Config()->Get('plugin', 'user', ''); $sPassword = (string) $this->Config()->Get('plugin', 'password', ''); if (!empty($sDsn) && 0 < \strlen($sUser) && 0 < \strlen($sPassword)) { include_once __DIR__.'/MailcowChangePasswordDriver.php'; $oProvider = new MailcowChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sDsn, $sUser, $sPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('pdo_dsn')->SetLabel('Mailcow PDO dsn') ->SetDefaultValue('mysql:host=127.0.0.1;dbname=mailcow'), \RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User') ->SetDefaultValue('mailcow'), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('DB Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/mailinabox-change-password/000077500000000000000000000000001361462701300237305ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/mailinabox-change-password/LICENSE000066400000000000000000000021201361462701300247300ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2017 Marius Gripsgard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/mailinabox-change-password/MailInABoxChangePasswordDriver.php000066400000000000000000000077631361462701300324060ustar00rootroot00000000000000sHost = $sHost; $this->sAdminUser = $sAdminUser; $this->sAdminPassword = $sAdminPassword; return $this; } /** * @param string $sAllowedEmails * * @return \MailInABoxChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \MailInABoxChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param string $sDesc * @param int $iType = \MailSo\Log\Enumerations\Type::INFO * * @return \MailInABoxChangePasswordDriver */ public function WriteLog($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO) { if ($this->oLogger) { $this->oLogger->Write($sDesc, $iType); } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { $this->WriteLog('Mail-in-a-box: Try to change password for '.$oAccount->Email()); $bResult = false; if (!empty($this->sHost) && !empty($this->sAdminUser) && !empty($this->sAdminPassword) && $oAccount) { $this->WriteLog('Mail-in-a-box:[Check] Required Fields Present'); $sEmail = \trim(\strtolower($oAccount->Email())); $sHost = \rtrim(\trim($this->sHost), '/'); $sUrl = $sHost.'/admin/mail/users/password'; $sAdminUser = $this->sAdminUser; $sAdminPassword = $this->sAdminPassword; $iCode = 0; $aPost = array( 'email' => $sEmail, 'password' => $sNewPassword, ); $aOptions = array( CURLOPT_URL => $sUrl, CURLOPT_HEADER => false, CURLOPT_FAILONERROR => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), CURLOPT_TIMEOUT => 20, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_USERPWD => $sAdminUser.':'.$sAdminPassword, CURLOPT_HTTPAUTH => CURLAUTH_BASIC ); $oCurl = \curl_init(); \curl_setopt_array($oCurl, $aOptions); $this->WriteLog('Mail-in-a-box: Send post request: '.$sUrl); $mResult = \curl_exec($oCurl); $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); $this->WriteLog('Mail-in-a-box: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); if (false === $mResult || 200 !== $iCode) { $this->WriteLog('Mail-in-a-box: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); } if (\is_resource($oCurl)) { \curl_close($oCurl); } if (false !== $mResult && 200 === $iCode) { $this->WriteLog('Mail-in-a-box: Password Change Status: Success'); $bResult = true; } else { $this->WriteLog('Mail-in-a-box[Error]: Empty Response: Code: '.$iCode); } } return $bResult; } } rainloop-webmail-1.14.0/plugins/mailinabox-change-password/README000066400000000000000000000001251361462701300246060ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (Mail-in-a-Box). rainloop-webmail-1.14.0/plugins/mailinabox-change-password/VERSION000066400000000000000000000000041361462701300247720ustar00rootroot000000000000001.0 rainloop-webmail-1.14.0/plugins/mailinabox-change-password/index.php000066400000000000000000000035761361462701300255630ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/MailInABoxChangePasswordDriver.php'; $sHost = \trim($this->Config()->Get('plugin', 'host', '')); $sAdminUser = (string) $this->Config()->Get('plugin', 'admin_user', ''); $sAdminPassword = (string) $this->Config()->Get('plugin', 'admin_password', ''); $oProvider = new \MailInABoxChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sHost, $sAdminUser, $sAdminPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('Mail-in-a-box Host') ->SetDefaultValue('https://box.mailinabox.email') ->SetDescription('Mail-in-a-box host URL. Example: https://box.mailinabox.email'), \RainLoop\Plugins\Property::NewInstance('admin_user')->SetLabel('Admin User') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('admin_password')->SetLabel('Admin Password') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/override-smtp-credentials/000077500000000000000000000000001361462701300236155ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/override-smtp-credentials/LICENSE000066400000000000000000000020701361462701300246210ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/override-smtp-credentials/README000066400000000000000000000001051361462701300244710ustar00rootroot00000000000000Plugin which allows you to override smtp credentials specified users.rainloop-webmail-1.14.0/plugins/override-smtp-credentials/VERSION000066400000000000000000000000031361462701300246560ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/override-smtp-credentials/index.php000066400000000000000000000056061361462701300254440ustar00rootroot00000000000000addHook('filter.smtp-credentials', 'FilterSmtpCredentials'); } /** * @param \RainLoop\Model\Account $oAccount * @param array $aSmtpCredentials */ public function FilterSmtpCredentials($oAccount, &$aSmtpCredentials) { if ($oAccount instanceof \RainLoop\Model\Account && \is_array($aSmtpCredentials)) { $sEmail = $oAccount->Email(); $sHost = \trim($this->Config()->Get('plugin', 'smtp_host', '')); $sWhiteList = \trim($this->Config()->Get('plugin', 'override_users', '')); if (0 < strlen($sWhiteList) && 0 < \strlen($sHost) && \RainLoop\Plugins\Helper::ValidateWildcardValues($sEmail, $sWhiteList)) { $aSmtpCredentials['Host'] = $sHost; $aSmtpCredentials['Port'] = (int) $this->Config()->Get('plugin', 'smtp_port', 25); $sSecure = \trim($this->Config()->Get('plugin', 'smtp_secure', 'None')); switch ($sSecure) { case 'SSL': $aSmtpCredentials['Secure'] = MailSo\Net\Enumerations\ConnectionSecurityType::SSL; break; case 'TLS': $aSmtpCredentials['Secure'] = MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS; break; default: $aSmtpCredentials['Secure'] = MailSo\Net\Enumerations\ConnectionSecurityType::NONE; break; } $aSmtpCredentials['UseAuth'] = (bool) $this->Config()->Get('plugin', 'smtp_auth', true); $aSmtpCredentials['Login'] = \trim($this->Config()->Get('plugin', 'smtp_user', '')); $aSmtpCredentials['Password'] = (string) $this->Config()->Get('plugin', 'smtp_password', ''); } } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('smtp_host')->SetLabel('SMTP Host') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('smtp_port')->SetLabel('SMTP Port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(25), \RainLoop\Plugins\Property::NewInstance('smtp_secure')->SetLabel('SMTP Secure') ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array('None', 'SSL', 'TLS')), \RainLoop\Plugins\Property::NewInstance('smtp_auth')->SetLabel('Use auth') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetDefaultValue(true), \RainLoop\Plugins\Property::NewInstance('smtp_user')->SetLabel('SMTP User') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('smtp_password')->SetLabel('SMTP Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('override_users')->SetLabel('Override users') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('space as delimiter, wildcard supported.') ->SetDefaultValue('user@example.com *@example2.com') ); } } rainloop-webmail-1.14.0/plugins/piwik-analytics/000077500000000000000000000000001361462701300216325ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/piwik-analytics/LICENSE000066400000000000000000000020701361462701300226360ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/piwik-analytics/README000066400000000000000000000001451361462701300225120ustar00rootroot00000000000000Embed Piwik Analytics (Open source web analytics platform) code into your webmail installation pages.rainloop-webmail-1.14.0/plugins/piwik-analytics/VERSION000066400000000000000000000000031361462701300226730ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/piwik-analytics/index.php000066400000000000000000000013611361462701300234530ustar00rootroot00000000000000Config()->Get('plugin', 'piwik_url', '') && '' !== $this->Config()->Get('plugin', 'site_id', '')) { $this->addJs('js/include.js'); } } /** * @return array */ public function configMapping() { $oUrl = \RainLoop\Plugins\Property::NewInstance('piwik_url')->SetLabel('Piwik URL') ->SetAllowedInJs(true); $oSiteID = \RainLoop\Plugins\Property::NewInstance('site_id')->SetLabel('Site ID') ->SetAllowedInJs(true); if (\method_exists($oUrl, 'SetPlaceholder')) { $oUrl->SetPlaceholder('http://'); $oSiteID->SetPlaceholder(''); } return array($oUrl, $oSiteID); } } rainloop-webmail-1.14.0/plugins/piwik-analytics/js/000077500000000000000000000000001361462701300222465ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/piwik-analytics/js/include.js000066400000000000000000000017361361462701300242360ustar00rootroot00000000000000 $(function () { if (!window.rl) { return; } var sPiwikURL = '' + window.rl.pluginSettingsGet('piwik-analytics', 'piwik_url'), sSiteID = '' + window.rl.pluginSettingsGet('piwik-analytics', 'site_id') ; if ('' !== sPiwikURL && '' !== sSiteID) { sPiwikURL = sPiwikURL.replace(/[\\\/\s]+$/, '') + '/'; if (!/^https?:/i.test(sPiwikURL)) { sPiwikURL = 'http://' + sPiwikURL; } window._paq = window._paq || []; (function(window){ window._paq.push(['setSiteId', sSiteID]); window._paq.push(['setTrackerUrl', sPiwikURL + 'piwik.php']); window._paq.push(['trackPageView']); window.setInterval(function () { window._paq.push(['trackPageView']); }, 1000 * 60 * 2); var d = window.document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; g.type = 'text/javascript'; g.defer = true; g.async = true; g.src = sPiwikURL + 'piwik.js'; if (s && s.parentNode) { s.parentNode.insertBefore(g, s); } }(window)); } });rainloop-webmail-1.14.0/plugins/poppassd-change-password/000077500000000000000000000000001361462701300234365ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/poppassd-change-password/ChangePasswordPoppassdDriver.php000066400000000000000000000041251361462701300317470ustar00rootroot00000000000000sHost = $sHost; return $this; } /** * @param int $iPort * * @return \ChangePasswordPoppassdDriver */ public function SetPort($iPort) { $this->iPort = (int) $iPort; return $this; } /** * @param string $sAllowedEmails * * @return \ChangePasswordPoppassdDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \ChangePasswordPoppassdDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { $bResult = false; try { $oPoppassdClient = \MailSo\Poppassd\PoppassdClient::NewInstance(); if ($this->oLogger instanceof \MailSo\Log\Logger) { $oPoppassdClient->SetLogger($this->oLogger); } $oPoppassdClient ->Connect($this->sHost, $this->iPort) ->Login($oAccount->Login(), $oAccount->Password()) ->NewPass($sNewPassword) ->LogoutAndDisconnect() ; $bResult = true; } catch (\Exception $oException) { $bResult = false; } return $bResult; } }rainloop-webmail-1.14.0/plugins/poppassd-change-password/LICENSE000066400000000000000000000020701361462701300244420ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/poppassd-change-password/README000066400000000000000000000001171361462701300243150ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (POPPASSD).rainloop-webmail-1.14.0/plugins/poppassd-change-password/VERSION000066400000000000000000000000031361462701300244770ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/poppassd-change-password/index.php000066400000000000000000000026711361462701300252640ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/ChangePasswordPoppassdDriver.php'; $oProvider = new ChangePasswordPoppassdDriver(); $oProvider ->SetHost($this->Config()->Get('plugin', 'host', '')) ->SetPort((int) $this->Config()->Get('plugin', 'port', 106)) ->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))) ->SetLogger($this->Manager()->Actions()->Logger()) ; break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('POPPASSD Host') ->SetDefaultValue('127.0.0.1'), \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('POPPASSD Port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(106), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/postfixadmin-change-password/000077500000000000000000000000001361462701300243125ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/postfixadmin-change-password/ChangePasswordPostfixAdminDriver.php000077500000000000000000000145721361462701300334510ustar00rootroot00000000000000sEngine = $sEngine; return $this; } /** * @param string $sHost * * @return \ChangePasswordPostfixAdminDriver */ public function SetHost($sHost) { $this->sHost = $sHost; return $this; } /** * @param int $iPort * * @return \ChangePasswordPostfixAdminDriver */ public function SetPort($iPort) { $this->iPort = (int) $iPort; return $this; } /** * @param string $sDatabase * * @return \ChangePasswordPostfixAdminDriver */ public function SetDatabase($sDatabase) { $this->sDatabase = $sDatabase; return $this; } /** * @param string $sTable * * @return \ChangePasswordPostfixAdminDriver */ public function SetTable($sTable) { $this->sTable = $sTable; return $this; } /** * @param string $sUsercol * * @return \ChangePasswordPostfixAdminDriver */ public function SetUserColumn($sUsercol) { $this->sUsercol = $sUsercol; return $this; } /** * @param string $sPasscol * * @return \ChangePasswordPostfixAdminDriver */ public function SetPasswordColumn($sPasscol) { $this->sPasscol = $sPasscol; return $this; } /** * @param string $sUser * * @return \ChangePasswordPostfixAdminDriver */ public function SetUser($sUser) { $this->sUser = $sUser; return $this; } /** * @param string $sPassword * * @return \ChangePasswordPostfixAdminDriver */ public function SetPassword($sPassword) { $this->sPassword = $sPassword; return $this; } /** * @param string $sEncrypt * * @return \ChangePasswordPostfixAdminDriver */ public function SetEncrypt($sEncrypt) { $this->sEncrypt = $sEncrypt; return $this; } /** * @param string $sAllowedEmails * * @return \ChangePasswordPostfixAdminDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \ChangePasswordPostfixAdminDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Postfix: Try to change password for '.$oAccount->Email()); } unset($sPrevPassword); $bResult = false; if (0 < \strlen($sNewPassword)) { try { $sDsn = ''; switch($this->sEngine){ case 'MySQL': $sDsn = 'mysql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; break; case 'PostgreSQL': $sDsn = 'pgsql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; break; default: $sDsn = 'mysql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; break; } $oPdo = new \PDO($sDsn, $this->sUser, $this->sPassword); $oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $sUpdatePassword = $this->cryptPassword($sNewPassword, $oPdo); if (0 < \strlen($sUpdatePassword)) { $oStmt = $oPdo->prepare("UPDATE {$this->sTable} SET {$this->sPasscol} = ? WHERE {$this->sUsercol} = ?"); $bResult = (bool) $oStmt->execute(array($sUpdatePassword, $oAccount->Email())); } else { if ($this->oLogger) { $this->oLogger->Write('Postfix: Encrypted password is empty', \MailSo\Log\Enumerations\Type::ERROR); } } $oPdo = null; } catch (\Exception $oException) { if ($this->oLogger) { $this->oLogger->WriteException($oException); } } } return $bResult; } /** * @param string $sPassword * @param \PDO $oPdo * * @return string */ private function cryptPassword($sPassword, $oPdo) { $sResult = ''; if (function_exists('random_bytes')) { $sSalt = substr(base64_encode(random_bytes(32)), 0, 16); } else { $sSalt = substr(str_shuffle('./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), 0, 16); } switch (strtolower($this->sEncrypt)) { default: case 'plain': case 'cleartext': $sResult = '{PLAIN}' . $sPassword; break; case 'md5crypt': include_once __DIR__.'/md5crypt.php'; $sResult = '{MD5-CRYPT}' . md5crypt($sPassword); break; case 'md5': $sResult = '{PLAIN-MD5}' . md5($sPassword); break; case 'system': $sResult = '{CRYPT}' . crypt($sPassword); break; case 'sha256-crypt': $sResult = '{SHA256-CRYPT}' . crypt($sPassword,'$5$'.$sSalt); break; case 'sha512-crypt': $sResult = '{SHA512-CRYPT}' . crypt($sPassword,'$6$'.$sSalt); break; case 'mysql_encrypt': if($this->sEngine == 'MySQL'){ $oStmt = $oPdo->prepare('SELECT ENCRYPT(?) AS encpass'); if ($oStmt->execute(array($sPassword))) { $aFetchResult = $oStmt->fetchAll(\PDO::FETCH_ASSOC); if (\is_array($aFetchResult) && isset($aFetchResult[0]['encpass'])) { $sResult = $aFetchResult[0]['encpass']; } } }else{ throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CouldNotSaveNewPassword); } break; } return $sResult; } } rainloop-webmail-1.14.0/plugins/postfixadmin-change-password/LICENSE000066400000000000000000000021021361462701300253120ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 RainLoop Team, @zaffkea Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/postfixadmin-change-password/README000066400000000000000000000001231361462701300251660ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (PostfixAdmin).rainloop-webmail-1.14.0/plugins/postfixadmin-change-password/VERSION000066400000000000000000000000041361462701300253540ustar00rootroot000000000000001.3 rainloop-webmail-1.14.0/plugins/postfixadmin-change-password/index.php000077500000000000000000000074071361462701300261450ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @return string */ public function Supported() { if (!extension_loaded('pdo') || !class_exists('PDO')) { return 'The PHP extension PDO must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || (!in_array('mysql', $aDrivers) && !in_array('pgsql', $aDrivers))) { return 'The PHP extension PDO (mysql or pgsql) must be installed to use this plugin'; } return ''; } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/ChangePasswordPostfixAdminDriver.php'; $oProvider = new ChangePasswordPostfixAdminDriver(); $oProvider ->SetEngine($this->Config()->Get('plugin', 'engine','')) ->SetHost($this->Config()->Get('plugin', 'host', '')) ->SetPort((int) $this->Config()->Get('plugin', 'port', 3306)) ->SetDatabase($this->Config()->Get('plugin', 'database', '')) ->SetTable($this->Config()->Get('plugin', 'table', '')) ->SetUserColumn($this->Config()->Get('plugin', 'usercol', '')) ->SetPasswordColumn($this->Config()->Get('plugin', 'passcol', '')) ->SetUser($this->Config()->Get('plugin', 'user', '')) ->SetPassword($this->Config()->Get('plugin', 'password', '')) ->SetEncrypt($this->Config()->Get('plugin', 'encrypt', '')) ->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))) ->SetLogger($this->Manager()->Actions()->Logger()) ; break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('engine')->SetLabel('Engine') ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array('MySQL', 'PostgreSQL')) ->SetDescription('Database Engine'), \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('Host') ->SetDefaultValue('127.0.0.1'), \RainLoop\Plugins\Property::NewInstance('port')->SetLabel('Port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(3306), \RainLoop\Plugins\Property::NewInstance('database')->SetLabel('Database') ->SetDefaultValue('postfixadmin'), \RainLoop\Plugins\Property::NewInstance('table')->SetLabel('table') ->SetDefaultValue('mailbox'), \RainLoop\Plugins\Property::NewInstance('usercol')->SetLabel('username column') ->SetDefaultValue('username'), \RainLoop\Plugins\Property::NewInstance('passcol')->SetLabel('password column') ->SetDefaultValue('password'), \RainLoop\Plugins\Property::NewInstance('user')->SetLabel('User') ->SetDefaultValue('postfixadmin'), \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('encrypt')->SetLabel('Encrypt') ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array('md5crypt', 'md5', 'system', 'cleartext', 'mysql_encrypt', 'SHA256-CRYPT', 'SHA512-CRYPT')) ->SetDescription('In what way do you want the passwords to be crypted ?'), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/postfixadmin-change-password/md5crypt.php000066400000000000000000000051211361462701300265710ustar00rootroot00000000000000 0; $i -= 16) { if ($i > 16) { $ctx .= substr($final,0,16); } else { $ctx .= substr($final,0,$i); } } $i = strlen($pw); while ($i > 0) { if ($i & 1) { $ctx .= chr(0); } else { $ctx .= $pw[0]; } $i = $i >> 1; } $final = hex2bin(md5($ctx)); for ($i=0; $i<1000; $i++) { $ctx1 = ""; if ($i & 1) { $ctx1 .= $pw; } else { $ctx1 .= substr($final,0,16); } if ($i % 3) { $ctx1 .= $salt; } if ($i % 7) { $ctx1 .= $pw; } if ($i & 1) { $ctx1 .= substr($final, 0, 16); } else { $ctx1 .= $pw; } $final = hex2bin(md5($ctx1)); } $passwd = ""; $passwd .= to64(((ord($final[0]) << 16) | (ord($final[6]) << 8) | (ord($final[12]))), 4); $passwd .= to64(((ord($final[1]) << 16) | (ord($final[7]) << 8) | (ord($final[13]))), 4); $passwd .= to64(((ord($final[2]) << 16) | (ord($final[8]) << 8) | (ord($final[14]))), 4); $passwd .= to64(((ord($final[3]) << 16) | (ord($final[9]) << 8) | (ord($final[15]))), 4); $passwd .= to64(((ord($final[4]) << 16) | (ord($final[10]) << 8) | (ord($final[5]))), 4); $passwd .= to64(ord($final[11]), 2); return $magic.$salt.'$'.$passwd; } function create_salt() { srand((double) microtime() * 1000000); return substr(md5(rand(0,9999999)), 0, 8); } // PHP around 5.3.8 includes hex2bin as native function - http://php.net/hex2bin if (!function_exists('hex2bin')) { function hex2bin($str) { $len = strlen($str); $nstr = ""; for ($i = 0; $i < $len; $i += 2) { $num = sscanf(substr($str, $i, 2), "%x"); $nstr .= chr($num[0]); } return $nstr; } } function to64($v, $n) { $ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; $ret = ""; while (($n - 1) >= 0) { $n--; $ret .= $ITOA64[$v & 0x3f]; $v = $v >> 6; } return $ret; }rainloop-webmail-1.14.0/plugins/proxyauth-login-example/000077500000000000000000000000001361462701300233245ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/proxyauth-login-example/LICENSE000066400000000000000000000020701361462701300243300ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/proxyauth-login-example/VERSION000066400000000000000000000000031361462701300243650ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/proxyauth-login-example/index.php000066400000000000000000000023641361462701300251510ustar00rootroot00000000000000addHook('event.login-post-login-provide', 'EventLoginPostLoginProvide'); } /** * @param string $sLogin * @param string $sPassword */ public function isValidAccount($sLogin, $sPassword) { return !empty($sLogin) && !empty($sPassword); } /** * @param \RainLoop\Model\Account $oAccount */ public function EventLoginPostLoginProvide(&$oAccount) { if ($oAccount instanceof \RainLoop\Model\Account) { // Verify logic $bValid = $this->isValidAccount($oAccount->Login(), $oAccount->Password()); /** * $oAccount->Email(); // Email (It is not a IMAP login) * $oAccount->Login(); // IMAP login * $oAccount->Password(); // IMAP password * $oAccount->DomainIncHost(); // IMAP host * * @see \RainLoo\Model\Account for more */ if (!$bValid) // if verify failed { // throw a Auth Error Exception throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } else // Or setup your proxyauth admin account credentials { $oAccount->SetProxyAuthUser('admin@domain.com'); $oAccount->SetProxyAuthPassword('secret-admin-password'); } } } } rainloop-webmail-1.14.0/plugins/recaptcha/000077500000000000000000000000001361462701300204545ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/recaptcha/LICENSE000066400000000000000000000020701361462701300214600ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/recaptcha/README000066400000000000000000000004161361462701300213350ustar00rootroot00000000000000A CAPTCHA (v2) is a program that can generate and grade tests that humans can pass but current computer programs cannot. For example, humans can read distorted text as the one shown below, but current computer programs can't. More info at http://www.google.com/recaptcharainloop-webmail-1.14.0/plugins/recaptcha/VERSION000066400000000000000000000000031361462701300215150ustar00rootroot000000000000002.2rainloop-webmail-1.14.0/plugins/recaptcha/index.php000066400000000000000000000072541361462701300223040ustar00rootroot00000000000000UseLangs(true); $this->addJs('js/recaptcha.js'); $this->addHook('ajax.action-pre-call', 'AjaxActionPreCall'); $this->addHook('filter.ajax-response', 'FilterAjaxResponse'); } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('public_key')->SetLabel('Site key') ->SetAllowedInJs(true) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('private_key')->SetLabel('Secret key') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('theme')->SetLabel('Theme') ->SetAllowedInJs(true) ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array('light', 'dark')), \RainLoop\Plugins\Property::NewInstance('error_limit')->SetLabel('Limit') ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array(0, 1, 2, 3, 4, 5)) ->SetDescription('') ); } /** * @return string */ private function getCaptchaCacherKey() { return 'CaptchaNew/Login/'.\RainLoop\Utils::GetConnectionToken(); } /** * @return int */ private function getLimit() { $iConfigLimit = $this->Config()->Get('plugin', 'error_limit', 0); if (0 < $iConfigLimit) { $oCacher = $this->Manager()->Actions()->Cacher(); $sLimit = $oCacher && $oCacher->IsInited() ? $oCacher->Get($this->getCaptchaCacherKey()) : '0'; if (0 < \strlen($sLimit) && \is_numeric($sLimit)) { $iConfigLimit -= (int) $sLimit; } } return $iConfigLimit; } /** * @return void */ public function FilterAppDataPluginSection($bAdmin, $bAuth, &$aData) { if (!$bAdmin && !$bAuth && \is_array($aData)) { $aData['show_captcha_on_login'] = 1 > $this->getLimit(); } } /** * @param string $sAction */ public function AjaxActionPreCall($sAction) { if ('Login' === $sAction && 0 >= $this->getLimit()) { $bResult = false; $sResult = $this->Manager()->Actions()->Http()->SendPostRequest( 'https://www.google.com/recaptcha/api/siteverify', array( 'secret' => $this->Config()->Get('plugin', 'private_key', ''), 'response' => $this->Manager()->Actions()->GetActionParam('RecaptchaResponse', '') ) ); if ($sResult) { $aResp = @\json_decode($sResult, true); if (\is_array($aResp) && isset($aResp['success']) && $aResp['success']) { $bResult = true; } } if (!$bResult) { $this->Manager()->Actions()->Logger()->Write('RecaptchaResponse:'.$sResult); throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CaptchaError); } } } /** * @param string $sAction * @param array $aResponseItem */ public function FilterAjaxResponse($sAction, &$aResponseItem) { if ('Login' === $sAction && $aResponseItem && isset($aResponseItem['Result'])) { $oCacher = $this->Manager()->Actions()->Cacher(); $iConfigLimit = (int) $this->Config()->Get('plugin', 'error_limit', 0); $sKey = $this->getCaptchaCacherKey(); if (0 < $iConfigLimit && $oCacher && $oCacher->IsInited()) { if (false === $aResponseItem['Result']) { $iLimit = 0; $sLimut = $oCacher->Get($sKey); if (0 < \strlen($sLimut) && \is_numeric($sLimut)) { $iLimit = (int) $sLimut; } $oCacher->Set($sKey, ++$iLimit); if ($iConfigLimit <= $iLimit) { $aResponseItem['Captcha'] = true; } } else { $oCacher->Delete($sKey); } } } } } rainloop-webmail-1.14.0/plugins/recaptcha/js/000077500000000000000000000000001361462701300210705ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/recaptcha/js/recaptcha.js000066400000000000000000000043341361462701300233640ustar00rootroot00000000000000(function ($, window) { $(function () { var nId = null, bStarted = false ; function ShowRecaptcha() { if (window.grecaptcha && window.rl) { if (null === nId) { var oEl = null, oLink = $('.plugin-mark-Login-BottomControlGroup') ; if (oLink && oLink[0]) { oEl = $('
'); $(oLink[0]).after(oEl); nId = window.grecaptcha.render(oEl[0], { 'sitekey': window.rl.pluginSettingsGet('recaptcha', 'public_key'), 'theme': window.rl.pluginSettingsGet('recaptcha', 'theme') }); } } } } window.__globalShowRecaptcha = ShowRecaptcha; function StartRecaptcha() { if (!window.grecaptcha && window.rl) { $.getScript('https://www.google.com/recaptcha/api.js?onload=__globalShowRecaptcha&render=explicit&hl=' + window.rl.settingsGet('Language')); } else { ShowRecaptcha(); } } if (window.rl) { window.rl.addHook('user-login-submit', function (fSubmitResult) { if (null !== nId && !window.grecaptcha.getResponse(nId)) { fSubmitResult(105); } }); window.rl.addHook('view-model-on-show', function (sName, oViewModel) { if (!bStarted && oViewModel && ('View:RainLoop:Login' === sName || 'View/App/Login' === sName || 'LoginViewModel' === sName || 'LoginAppView' === sName) && window.rl.pluginSettingsGet('recaptcha', 'show_captcha_on_login')) { bStarted = true; StartRecaptcha(); } }); window.rl.addHook('ajax-default-request', function (sAction, oParameters) { if ('Login' === sAction && oParameters && null !== nId && window.grecaptcha) { oParameters['RecaptchaResponse'] = window.grecaptcha.getResponse(nId); } }); window.rl.addHook('ajax-default-response', function (sAction, oData, sType) { if ('Login' === sAction) { if (!oData || 'success' !== sType || !oData['Result']) { if (null !== nId && window.grecaptcha) { window.grecaptcha.reset(nId); } else if (oData && oData['Captcha']) { StartRecaptcha(); } } } }); } }); }($, window));rainloop-webmail-1.14.0/plugins/rest-change-password/000077500000000000000000000000001361462701300225625ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/rest-change-password/LICENSE000066400000000000000000000020701361462701300235660ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/rest-change-password/README000066400000000000000000000001231361462701300234360ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (Generic REST).rainloop-webmail-1.14.0/plugins/rest-change-password/RestChangePasswordDriver.php000066400000000000000000000103041361462701300302130ustar00rootroot00000000000000sUrl = $sUrl; $this->sKey = $sKey; return $this; } $oProvider->SetFieldNames($sFieldEmail, $sFieldOldpassword, $sFieldNewpassword); /** * @param string $sFieldEmail * @param string $sFieldOldpassword * @param string $sFieldNewpassword * * @return \RestChangePasswordDriver */ public function SetFieldNames($sFieldEmail, $sFieldOldpassword, $sFieldNewpassword) { $this->sFieldEmail = $sFieldEmail; $this->sFieldOldpassword = $sFieldOldpassword; $this->sFieldNewpassword = $sFieldNewpassword; return $this; } /** * @param string $sAllowedEmails * * @return \RestChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \RestChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Rest: Try to change password for '.$oAccount->Email()); } $bResult = false; if (!empty($this->sHost) && 0 < $this->iPort && $oAccount) { $sEmail = \trim(\strtolower($oAccount->Email())); # Adding the REST Api key to the url, try to use always https $sUrl = str_replace('://', '://'+$this->sKey+"@", $this->sUrl); $iCode = 0; $oHttp = \MailSo\Base\Http::SingletonInstance(); if ($this->oLogger) { $this->oLogger->Write('Rest[Api Request]:'.$sUrl); } $mResult = $oHttp->SendPostRequest($sUrl, array( $this->sFieldEmail => $sEmail, $this->sFieldOldpassword => $sPrevPassword, $this->sFieldNewpassword => $sNewPassword, ), 'MailSo Http User Agent (v1)', $iCode, $this->oLogger); if (false !== $mResult && 200 === $iCode) { $aRes = null; @\parse_str($mResult, $aRes); if (is_array($aRes) && (!isset($aRes['error']) || (int) $aRes['error'] !== 1)) { $bResult = true; } else { if ($this->oLogger) { $this->oLogger->Write('Rest[Error]: Response: '.$mResult); } } } else { if ($this->oLogger) { $this->oLogger->Write('Rest[Error]: Empty Response: Code:'.$iCode); } } } return $bResult; } } rainloop-webmail-1.14.0/plugins/rest-change-password/VERSION000066400000000000000000000000031361462701300236230ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/rest-change-password/index.php000066400000000000000000000070771361462701300244150ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sUrl = \trim($this->Config()->Get('plugin', 'rest_url', '')); $sKey = \trim($this->Config()->Get('plugin', 'rest_key', '')); $sFieldEmail = \trim($this->Config()->Get('plugin', 'rest_field_email', '')); $sFieldOldpassword = \trim($this->Config()->Get('plugin', 'rest_field_oldpassword', '')); $sFieldNewpassword = \trim($this->Config()->Get('plugin', 'rest_field_newpassword', '')); if (!empty($sHost) && (!empty($sKey))) { include_once __DIR__.'/RestChangePasswordDriver.php'; $oProvider = new RestChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sUrl, $sKey); $oProvider->SetFieldNames($sFieldEmail, $sFieldOldpassword, $sFieldNewpassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('rest_url') ->SetLabel('REST API Url') ->SetDefaultValue('') ->SetDescription('Ex: http://localhost:8080/api/change_password or https://domain.com/api/user/passsword_update'), \RainLoop\Plugins\Property::NewInstance('rest_key') ->SetLabel('REST API key') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) ->SetDescription('REST API Key for authentication, if you have "user" and "passsword" enter it as "user:password"') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('rest_field_email') ->SetLabel('Field "email" name') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Enter the name of the REST field name for email') ->SetDefaultValue('email'), \RainLoop\Plugins\Property::NewInstance('rest_field_oldpassword') ->SetLabel('Field "oldpassword" name') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Enter the name of the REST field name for oldpassword') ->SetDefaultValue('oldpassword'), \RainLoop\Plugins\Property::NewInstance('rest_field_newpassword') ->SetLabel('Field "newpassword" name') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Enter the name of the REST field name for newpassword') ->SetDefaultValue('newpassword'), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/000077500000000000000000000000001361462701300233445ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/LICENSE000066400000000000000000000020701361462701300243500ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/README000066400000000000000000000000441361462701300242220ustar00rootroot00000000000000Add snowfall to your login screen :)rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/VERSION000066400000000000000000000000031361462701300244050ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/index.php000066400000000000000000000002671361462701300251710ustar00rootroot00000000000000addJs('js/snowfall.js'); $this->addJs('js/include.js'); } } rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/js/000077500000000000000000000000001361462701300237605ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/js/include.js000066400000000000000000000010121361462701300257330ustar00rootroot00000000000000 $(function () { if (window.snowFall && window.rl && !window.rl.settingsGet('Auth')) { var sUserAgent = (navigator.userAgent || '').toLowerCase(), bIsiOSDevice = -1 < sUserAgent.indexOf('iphone') || -1 < sUserAgent.indexOf('ipod') || -1 < sUserAgent.indexOf('ipad'), bIsAndroidDevice = -1 < sUserAgent.indexOf('android') ; if (!bIsiOSDevice && !bIsAndroidDevice) { window.snowFall.snow(document.getElementsByTagName('body'), { shadow: true, round: true, minSize: 2, maxSize: 5 }); } } });rainloop-webmail-1.14.0/plugins/snowfall-on-login-screen/js/snowfall.js000066400000000000000000000212351361462701300261460ustar00rootroot00000000000000/* Snowfall pure js ==================================================================== LICENSE ==================================================================== 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. ==================================================================== 1.0 Wanted to rewrite my snow plugin to use pure JS so you werent necessarily tied to using a framework. Does not include a selector engine or anything, just pass elements to it using standard JS selectors. Does not clear snow currently. Collection portion removed just for ease of testing will add back in next version Theres a few ways to call the snow you could do it the following way by directly passing the selector, snowFall.snow(document.getElementsByTagName("body"), {options}); or you could save the selector results to a variable, and then call it var elements = document.getElementsByClassName('yourclass'); snowFall.snow(elements, {options}); Options are all the same as the plugin except clear, and collection values for snow options are flakeCount, flakeColor, flakeIndex, minSize, maxSize, minSpeed, maxSpeed, round, true or false, makes the snowflakes rounded if the browser supports it. shadow true or false, gives the snowflakes a shadow if the browser supports it. */ // Paul Irish requestAnimationFrame polyfill (function(window) { var lastTime = 0; var vendors = ['webkit', 'moz']; for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; } if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element) { var currTime = new Date().getTime(); var timeToCall = window.Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id) { clearTimeout(id); }; }(window)); var snowFall = (function(){ function jSnow(){ // local methods var defaults = { flakeCount : 35, flakeColor : '#ffffff', flakeIndex: 999999, minSize : 1, maxSize : 2, minSpeed : 1, maxSpeed : 5, round : false, shadow : false, collection : false, image : false, collectionHeight : 40 }, element = {}, flakes = [], flakeId = 0, elHeight = 0, elWidth = 0, elTop = 0, elLeft = 0, widthOffset = 0, snowTimeout = 0, // For extending the default object with properties extend = function(obj, extObj){ for(var i in extObj){ if(obj.hasOwnProperty(i)){ obj[i] = extObj[i]; } } }, // random between range random = function random(min, max){ return window.Math.round(min + window.Math.random()*(max-min)); }, // Set multiple styles at once. setStyle = function(element, props) { for (var property in props){ element.style[property] = props[property] + ((property === 'width' || property === 'height') ? 'px' : ''); } }, // snowflake flake = function(_x, _y, _size, _speed, _id) { // Flake properties this.id = _id; this.x = _x + elLeft; this.y = _y + elTop; this.size = _size; this.speed = _speed; this.step = 0; this.stepSize = random(1,10) / 100; if(defaults.collection){ this.target = defaults.collection[random(0,defaults.collection.length-1)]; } var flakeObj = null; if(defaults.image){ flakeObj = new Image(); flakeObj.src = defaults.image; }else{ flakeObj = window.document.createElement("div"); setStyle(flakeObj, {'background' : defaults.flakeColor}); } flakeObj.className = 'snowfall-flakes'; flakeObj.setAttribute('id','flake-' + this.id); setStyle(flakeObj, {'width' : this.size, 'height' : this.size, 'position' : 'absolute', 'top' : this.y, 'left' : this.x, 'fontSize' : 0, 'zIndex' : defaults.flakeIndex}); // This adds the style to make the snowflakes round via border radius property if(defaults.round){ setStyle(flakeObj,{'-moz-border-radius' : ~~(defaults.maxSize) + 'px', '-webkit-border-radius' : ~~(defaults.maxSize) + 'px', 'borderRadius' : ~~(defaults.maxSize) + 'px'}); } // This adds shadows just below the snowflake so they pop a bit on lighter colored web pages if(defaults.shadow){ setStyle(flakeObj,{'-moz-box-shadow' : '1px 1px 1px #555', '-webkit-box-shadow' : '1px 1px 1px #555', 'boxShadow' : '1px 1px 1px #555'}); } window.document.body.appendChild(flakeObj); this.element = flakeObj; // Update function, used to update the snow flakes, and checks current snowflake against bounds this.update = function(){ this.y += this.speed; if(this.y > (elTop + elHeight) - (this.size + 6)){ this.reset(); } this.element.style.top = this.y + 'px'; this.element.style.left = ~~this.x + 'px'; this.step += this.stepSize; this.x += window.Math.cos(this.step); if(this.x > (elLeft + elWidth) - widthOffset || this.x < widthOffset){ this.reset(); } }; // Resets the snowflake once it reaches one of the bounds set this.reset = function(){ this.y = elTop; this.x = elLeft + random(widthOffset, elWidth - widthOffset); this.stepSize = random(1,10) / 100; this.size = random((defaults.minSize * 100), (defaults.maxSize * 100)) / 100; this.speed = random(defaults.minSpeed, defaults.maxSpeed); }; }, // this controls flow of the updating snow animateSnow = function(){ for(var i = 0; i < flakes.length; i += 1){ flakes[i].update(); } snowTimeout = requestAnimationFrame(function(){animateSnow();}); }; return{ snow : function(_element, _options){ extend(defaults, _options); //init the element vars element = _element; elHeight = element.clientHeight, elWidth = element.offsetWidth; elTop = element.offsetTop; elLeft = element.offsetLeft; element.snow = this; // if this is the body the offset is a little different if(element.tagName.toLowerCase() === 'body'){ widthOffset = 25; } // Bind the window resize event so we can get the innerHeight again window.onresize = function(){ elHeight = element.clientHeight; elWidth = element.offsetWidth; elTop = element.offsetTop; elLeft = element.offsetLeft; }; // initialize the flakes for(var i = 0; i < defaults.flakeCount; i+=1){ flakeId = flakes.length; flakes.push(new flake(random(widthOffset,elWidth - widthOffset), random(0, elHeight), random((defaults.minSize * 100), (defaults.maxSize * 100)) / 100, random(defaults.minSpeed, defaults.maxSpeed), flakeId)); } // start the snow animateSnow(); }, clear : function(){ var flakeChildren = null; if(!element.getElementsByClassName){ flakeChildren = element.querySelectorAll('.snowfall-flakes'); }else{ flakeChildren = element.getElementsByClassName('snowfall-flakes'); } var flakeChilLen = flakeChildren.length; while(flakeChilLen--){ element.removeChild(flakeChildren[flakeChilLen]); } flakes = []; cancelAnimationFrame(snowTimeout); } }; }; return{ snow : function(elements, options){ if(typeof(options) === 'string'){ if(elements.length > 0){ for(var i = 0; i < elements.length; i++){ if(elements[i].snow){ elements[i].snow.clear(); } } }else{ elements.snow.clear(); } }else{ if(elements.length > 0){ for(var i = 0; i < elements.length; i++){ new jSnow().snow(elements[i], options); } }else{ new jSnow().snow(elements, options); } } } }; })();rainloop-webmail-1.14.0/plugins/vesta-change-password/000077500000000000000000000000001361462701300227275ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/vesta-change-password/LICENSE000066400000000000000000000020701361462701300237330ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/vesta-change-password/README000066400000000000000000000001321361462701300236030ustar00rootroot00000000000000Plugin that adds functionality to change the email account password (Vesta Control Panel).rainloop-webmail-1.14.0/plugins/vesta-change-password/VERSION000066400000000000000000000000031361462701300237700ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/vesta-change-password/VestaChangePasswordDriver.php000066400000000000000000000074261361462701300305400ustar00rootroot00000000000000sHost = $sHost; $this->iPort = $iPort; return $this; } /** * @param string $sAllowedEmails * * @return \VestaChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \VestaChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Vesta: Try to change password for '.$oAccount->Email()); } $bResult = false; if (!empty($this->sHost) && 0 < $this->iPort && $oAccount) { $sEmail = \trim(\strtolower($oAccount->Email())); $sHost = \trim($this->sHost); $sHost = \str_replace('{user:host-imap}', $oAccount->Domain()->IncHost(), $sHost); $sHost = \str_replace('{user:host-smtp}', $oAccount->Domain()->OutHost(), $sHost); $sHost = \str_replace('{user:domain}', \MailSo\Base\Utils::GetDomainFromEmail($sEmail), $sHost); $sHost = \rtrim($this->sHost, '/\\'); $sHost = 'https://'.$sHost; $sUrl = $sHost.':'.$this->iPort.'/reset/mail/'; $iCode = 0; $oHttp = \MailSo\Base\Http::SingletonInstance(); if ($this->oLogger) { $this->oLogger->Write('Vesta[Api Request]:'.$sUrl); } $mResult = $oHttp->SendPostRequest($sUrl, array( 'email' => $sEmail, 'password' => $sPrevPassword, 'new' => $sNewPassword, ), 'MailSo Http User Agent (v1)', $iCode, $this->oLogger); if (false !== $mResult && 200 === $iCode) { $aRes = null; @\parse_str($mResult, $aRes); if (is_array($aRes) && (!isset($aRes['error']) || (int) $aRes['error'] !== 1)) { $bResult = true; } else { if ($this->oLogger) { $this->oLogger->Write('Vesta[Error]: Response: '.$mResult); } } } else { if ($this->oLogger) { $this->oLogger->Write('Vesta[Error]: Empty Response: Code:'.$iCode); } } } return $bResult; } } rainloop-webmail-1.14.0/plugins/vesta-change-password/index.php000066400000000000000000000036621361462701300245560ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': $sHost = \trim($this->Config()->Get('plugin', 'vesta_host', '')); $iPort = (int) $this->Config()->Get('plugin', 'vesta_port', 8083); if (!empty($sHost) && 0 < $iPort) { include_once __DIR__.'/VestaChangePasswordDriver.php'; $oProvider = new VestaChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sHost, $iPort); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); } break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('vesta_host')->SetLabel('Vesta Host') ->SetDefaultValue('') ->SetDescription('Ex: localhost or domain.com'), \RainLoop\Plugins\Property::NewInstance('Vesta_port')->SetLabel('Vesta Port') ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(8083), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/video-on-login-screen/000077500000000000000000000000001361462701300226255ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/video-on-login-screen/LICENSE000066400000000000000000000020701361462701300236310ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/video-on-login-screen/README000066400000000000000000000000541361462701300235040ustar00rootroot00000000000000Fullscreen background video on login screen.rainloop-webmail-1.14.0/plugins/video-on-login-screen/VERSION000066400000000000000000000000031361462701300236660ustar00rootroot000000000000001.1rainloop-webmail-1.14.0/plugins/video-on-login-screen/index.php000066400000000000000000000024041361462701300244450ustar00rootroot00000000000000addJs('js/vide/jquery.vide.js'); $this->addJs('js/video-on-login.js'); } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('mp4_file')->SetLabel('Url to a mp4 file') ->SetPlaceholder('http://') ->SetAllowedInJs(true) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('webm_file')->SetLabel('Url to a webm file') ->SetPlaceholder('http://') ->SetAllowedInJs(true) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('ogv_file')->SetLabel('Url to a ogv file') ->SetPlaceholder('http://') ->SetAllowedInJs(true) ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('playback_rate')->SetLabel('Playback rate') ->SetAllowedInJs(true) ->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) ->SetDefaultValue(array('100%', '25%', '50%', '75%', '125%', '150%', '200%')), \RainLoop\Plugins\Property::NewInstance('muted')->SetLabel('Muted') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetAllowedInJs(true) ->SetDefaultValue(true), ); } } rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/000077500000000000000000000000001361462701300232415ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/000077500000000000000000000000001361462701300241705ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/CHANGELOG.md000066400000000000000000000020171361462701300260010ustar00rootroot00000000000000### 0.3.0 * Added the `resizing` option. * Updated tests. ### 0.2.1 * Code refactoring. * Updated devDependencies. ### 0.2.0 * Lots of updates since 0.1.0. * Improved code linting. * Cleaned up the repository. * Added bower dependencies. * Updated devDependencies. ### 0.1.4 * Fixed wrong URL parsing. * Changed main files in bower.json. ### 0.1.3 * Path argument can receive list of sources. * Strings with options and pathes can be passed to the constructor directly. * Added `posterType: none` value. * Updated README. * Updated JSDoc. * Updated tests. * Updated examples. * Added CONTRIBUTING.md * Other small fixes and optimizations. ### 0.1.2 * Restored `posterType` option to specify poster image type. ### 0.1.1 * Support of absolute URLs (#10). * Fixed the CORS issue (#11). * Fixed the destroy method. * Fixed parsing of empty options. * Poster and video positions are the same now. * Syntax and behavior of the position option are similar to the CSS `background-position` property. * Add support of the `.jpeg` extension. rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/CONTRIBUTING.md000066400000000000000000000003261361462701300264220ustar00rootroot00000000000000CONTRIBUTING ==== 1. Fork. 2. Run `npm install`. 3. Make your changes on the `src` folder. 4. Update tests. 5. Run `npm test`, make sure everything is okay. 6. Submit a pull request to the master branch. Thanks. rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/MIT-LICENSE000066400000000000000000000021231361462701300256220ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 Ilya Makarov, http://vodkabears.github.io Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/README.md000066400000000000000000000113661361462701300254560ustar00rootroot00000000000000[![Bower version](https://badge.fury.io/bo/vide.svg)](http://badge.fury.io/bo/vide) [![Travis](https://travis-ci.org/VodkaBears/Vide.svg?branch=master)](https://travis-ci.org/VodkaBears/Vide) [![devDependency Status](https://david-dm.org/vodkabears/vide/dev-status.svg)](https://david-dm.org/vodkabears/vide#info=devDependencies) Vide ==== Easy as hell jQuery plugin for video backgrounds. ## Notes * All modern desktop browsers are supported. * IE9+ * iOS plays video from a browser only in the native player. So video for iOS is disabled, only fullscreen poster will be used. * Some android devices play video, some not — go figure. So video for android is disabled, only fullscreen poster will be used. ## Instructions Download it from [GitHub](https://github.com/VodkaBears/Vide/releases/latest) or via Bower: `bower install vide` Include plugin: `` Prepare your video in several formats like '.webm', '.mp4' for cross browser compatability, also add a poster with `.jpg`, `.png` or `.gif` extension: ``` path/ ├── to/ │ ├── video.mp4 │ ├── video.ogv │ ├── video.webm │ └── video.jpg ``` Add `data-vide-bg` attribute with a path to the video and poster without extension, video and poster must have the same name. Add `data-vide-options` to pass vide options, if you need it. By default video is muted, looped and starts automatically. ```html
``` Also you can set extended path: ```html
``` In some situations it can be helpful to initialize it with JS because Vide doesn't have mutation observers: ```js $("#myBlock").vide("path/to/video"); $("#myBlock").vide("path/to/video", { ...options... }); $("#myBlock").vide({ mp4: path/to/video1, webm: path/to/video2, ogv: path/to/video3, poster: path/to/poster }, { ...options... }); $("#myBlock").vide("extended path as a string", "options as a string"); ``` Easy as hell. ## Options Below is a complete list of options and matching default values: ```js $("#yourElement").vide({ volume: 1, playbackRate: 1, muted: true, loop: true, autoplay: true, position: "50% 50%", // Similar to the CSS `background-position` property. posterType: "detect", // Poster image type. "detect" — auto-detection; "none" — no poster; "jpg", "png", "gif",... - extensions. resizing: true // Auto-resizing, read: https://github.com/VodkaBears/Vide#resizing }); ``` ## Methods Below is a complete list of methods: ```js // Get instance of the plugin var instance = $("#yourElement").data("vide"); // Get video element of the background. Do what you want. instance.getVideoObject(); // Resize video background. // It calls automatically, if window resize (or element, if you will use something like https://github.com/cowboy/jquery-resize). instance.resize(); // Destroy plugin instance instance.destroy(); ``` ## Resizing The Vide plugin resizes if the window resizes. If you will use something like https://github.com/cowboy/jquery-resize, it will resize automatically when the container resizes. Or simply use `resize()` method whenever you need. Set the `resizing` option to false to disable auto-resizing. ## Encoding video http://diveintohtml5.info/video.html#miro ## Ruby Gem [Vider](https://github.com/wazery/vider) by Islam Wazery. ## License ``` The MIT License (MIT) Copyright (c) 2014 Ilya Makarov, http://vodkabears.github.io Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/bower.json000066400000000000000000000013511361462701300262010ustar00rootroot00000000000000{ "name": "vide", "version": "0.3.0", "homepage": "http://vodkabears.github.io/vide/", "authors": [ "Ilya Makarov " ], "description": "Easy as hell jQuery plugin for video backgrounds.", "main": "dist/jquery.vide.js", "ignore": [ "**/.*", "examples/", "libs/", "src/", "test/", "*.md", "Gruntfile.js", "package.json", "vide.jquery.json" ], "keywords": [ "jquery", "plugin", "jquery-plugin", "video", "background", "ui", "responsive", "declarative" ], "license": "MIT", "dependencies": { "jquery": "*" }, "devDependencies": { "qunit": "~1.15.0", "jquery": "jquery#^1.11.1", "jquery2": "jquery#^2.1.1" } } rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/jquery.vide.js000066400000000000000000000311361361462701300267770ustar00rootroot00000000000000/* * Vide - v0.3.0 * Easy as hell jQuery plugin for video backgrounds. * http://vodkabears.github.io/vide/ * * Made by Ilya Makarov * Under MIT License */ !(function($, window, document, navigator) { "use strict"; /** * Vide settings * @private */ var pluginName = "vide", defaults = { volume: 1, playbackRate: 1, muted: true, loop: true, autoplay: true, position: "50% 50%", posterType: "detect", resizing: true }, // is iOs? isIOS = /iPad|iPhone|iPod/i.test(navigator.userAgent), // is Android? isAndroid = /Android/i.test(navigator.userAgent); /** * Parse string with options * @param {String} str * @returns {Object|String} * @private */ function parseOptions(str) { var obj = {}, delimiterIndex, option, prop, val, arr, len, i; // remove spaces around delimiters and split arr = str.replace(/\s*:\s*/g, ":").replace(/\s*,\s*/g, ",").split(","); // parse string for (i = 0, len = arr.length; i < len; i++) { option = arr[i]; // Ignore urls and string without colon delimiters if (option.search(/^(http|https|ftp):\/\//) !== -1 || option.search(":") === -1) { break; } delimiterIndex = option.indexOf(":"); prop = option.substring(0, delimiterIndex); val = option.substring(delimiterIndex + 1); // if val is an empty string, make it undefined if (!val) { val = undefined; } // convert string value if it is like a boolean if (typeof val === "string") { val = val === "true" || (val === "false" ? false : val); } // convert string value if it is like a number if (typeof val === "string") { val = !isNaN(val) ? +val : val; } obj[prop] = val; } // if nothing is parsed if (prop == null && val == null) { return str; } return obj; } /** * Parse position option * @param {String} str * @returns {Object} * @private */ function parsePosition(str) { str = "" + str; // default value is a center var args = str.split(/\s+/), x = "50%", y = "50%", len, arg, i; for (i = 0, len = args.length; i < len; i++) { arg = args[i]; // convert values if (arg === "left") { x = "0%"; } else if (arg === "right") { x = "100%"; } else if (arg === "top") { y = "0%"; } else if (arg === "bottom") { y = "100%"; } else if (arg === "center") { if (i === 0) { x = "50%"; } else { y = "50%"; } } else { if (i === 0) { x = arg; } else { y = arg; } } } return { x: x, y: y }; } /** * Search poster * @param {String} path * @param {Function} callback * @private */ function findPoster(path, callback) { var onLoad = function() { callback(this.src); }; $("").load(onLoad); $("").load(onLoad); $("").load(onLoad); $("").load(onLoad); } /** * Vide constructor * @param {HTMLElement} element * @param {Object|String} path * @param {Object|String} options * @constructor */ function Vide(element, path, options) { this.$element = $(element); // parse path if (typeof path === "string") { path = parseOptions(path); } // parse options if (!options) { options = {}; } else if (typeof options === "string") { options = parseOptions(options); } // remove extension if (typeof path === "string") { path = path.replace(/\.\w*$/, ""); } else if (typeof path === "object") { for (var i in path) { if (path.hasOwnProperty(i)) { path[i] = path[i].replace(/\.\w*$/, ""); } } } this.settings = $.extend({}, defaults, options); this.path = path; this.init(); } /** * Initialization * @public */ Vide.prototype.init = function() { var vide = this, position = parsePosition(vide.settings.position), sources, poster; // Set video wrapper styles vide.$wrapper = $("
").css({ "position": "absolute", "z-index": -1, "top": 0, "left": 0, "bottom": 0, "right": 0, "overflow": "hidden", "-webkit-background-size": "cover", "-moz-background-size": "cover", "-o-background-size": "cover", "background-size": "cover", "background-repeat": "no-repeat", "background-position": position.x + " " + position.y }); // Get poster path poster = vide.path; if (typeof vide.path === "object") { if (vide.path.poster) { poster = vide.path.poster; } else { if (vide.path.mp4) { poster = vide.path.mp4; } else if (vide.path.webm) { poster = vide.path.webm; } else if (vide.path.ogv) { poster = vide.path.ogv; } } } // Set video poster // if (vide.settings.posterType === "detect") { // findPoster(poster, function(url) { // vide.$wrapper.css("background-image", "url(" + url + ")"); // }); // } else if (vide.settings.posterType !== "none") { // vide.$wrapper // .css("background-image", "url(" + poster + "." + vide.settings.posterType + ")"); // } // if parent element has a static position, make it relative if (vide.$element.css("position") === "static") { vide.$element.css("position", "relative"); } vide.$element.prepend(vide.$wrapper); if (!isIOS && !isAndroid) { sources = ""; if (typeof vide.path === "object") { if (vide.path.mp4) { sources += ""; } if (vide.path.webm) { sources += ""; } if (vide.path.ogv) { sources += ""; } vide.$video = $(""); } else { vide.$video = $(""); } // Disable visibility, while loading vide.$video.css("visibility", "hidden"); // Set video properties vide.$video.prop({ autoplay: vide.settings.autoplay, loop: vide.settings.loop, volume: vide.settings.volume, muted: vide.settings.muted, playbackRate: vide.settings.playbackRate }); // Append video vide.$wrapper.append(vide.$video); // Video alignment vide.$video.css({ "margin": "auto", "position": "absolute", "z-index": -1, "top": position.y, "left": position.x, "-webkit-transform": "translate(-" + position.x + ", -" + position.y + ")", "-ms-transform": "translate(-" + position.x + ", -" + position.y + ")", "transform": "translate(-" + position.x + ", -" + position.y + ")" }); // resize video, when it's loaded vide.$video.bind("loadedmetadata." + pluginName, function() { vide.$video.css("visibility", "visible"); vide.resize(); vide.$wrapper.css("background-image", "none"); }); // resize event is available only for 'window', // use another code solutions to detect DOM elements resizing vide.$element.bind("resize." + pluginName, function() { if (vide.settings.resizing) { vide.resize(); } }); } }; /** * Get video element of the background * @returns {HTMLVideoElement|null} * @public */ Vide.prototype.getVideoObject = function() { return this.$video ? this.$video[0] : null; }; /** * Resize video background * @public */ Vide.prototype.resize = function() { if (!this.$video) { return; } var // get native video size videoHeight = this.$video[0].videoHeight, videoWidth = this.$video[0].videoWidth, // get wrapper size wrapperHeight = this.$wrapper.height(), wrapperWidth = this.$wrapper.width(); if (wrapperWidth / videoWidth > wrapperHeight / videoHeight) { this.$video.css({ "width": wrapperWidth + 2, // +2 pixels to prevent empty space after transformation "height": "auto" }); } else { this.$video.css({ "width": "auto", // +2 pixels to prevent empty space after transformation "height": wrapperHeight + 2 }); } }; /** * Destroy video background * @public */ Vide.prototype.destroy = function() { this.$element.unbind(pluginName); if (this.$video) { this.$video.unbind(pluginName); } delete $[pluginName].lookup[this.index]; this.$element.removeData(pluginName); this.$wrapper.remove(); }; /** * Special plugin object for instances. * @type {Object} * @public */ $[pluginName] = { lookup: [] }; /** * Plugin constructor * @param {Object|String} path * @param {Object|String} options * @returns {JQuery} * @constructor */ $.fn[pluginName] = function(path, options) { var instance; this.each(function() { instance = $.data(this, pluginName); if (instance) { // destroy plugin instance if exists instance.destroy(); } // create plugin instance instance = new Vide(this, path, options); instance.index = $[pluginName].lookup.push(instance) - 1; $.data(this, pluginName, instance); }); return this; }; $(document).ready(function() { // window resize event listener $(window).bind("resize." + pluginName, function() { for (var len = $[pluginName].lookup.length, i = 0, instance; i < len; i++) { instance = $[pluginName].lookup[i]; if (instance && instance.settings.resizing) { instance.resize(); } } }); // Auto initialization. // Add 'data-vide-bg' attribute with a path to the video without extension. // Also you can pass options throw the 'data-vide-options' attribute. // 'data-vide-options' must be like "muted: false, volume: 0.5". $(document).find("[data-" + pluginName + "-bg]").each(function(i, element) { var $element = $(element), options = $element.data(pluginName + "-options"), path = $element.data(pluginName + "-bg"); $element[pluginName](path, options); }); }); })(window.jQuery, window, document, navigator); rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/vide/jquery.vide.min.js000066400000000000000000000104741361462701300275630ustar00rootroot00000000000000/* * Vide - v0.3.0 * Easy as hell jQuery plugin for video backgrounds. * http://vodkabears.github.io/vide/ * * Made by Ilya Makarov * Under MIT License */ !function(a,b,c,d){"use strict";function e(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,":").replace(/\s*,\s*/g,",").split(","),h=0,g=f.length;g>h&&(c=f[h],-1===c.search(/^(http|https|ftp):\/\//)&&-1!==c.search(":"));h++)b=c.indexOf(":"),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),"string"==typeof e&&(e="true"===e||("false"===e?!1:e)),"string"==typeof e&&(e=isNaN(e)?e:+e),i[d]=e;return null==d&&null==e?a:i}function f(a){a=""+a;var b,c,d,e=a.split(/\s+/),f="50%",g="50%";for(d=0,b=e.length;b>d;d++)c=e[d],"left"===c?f="0%":"right"===c?f="100%":"top"===c?g="0%":"bottom"===c?g="100%":"center"===c?0===d?f="50%":g="50%":0===d?f=c:g=c;return{x:f,y:g}}function g(b,c){var d=function(){c(this.src)};a("").load(d),a("").load(d),a("").load(d),a("").load(d)}function h(b,c,d){if(this.$element=a(b),"string"==typeof c&&(c=e(c)),d?"string"==typeof d&&(d=e(d)):d={},"string"==typeof c)c=c.replace(/\.\w*$/,"");else if("object"==typeof c)for(var f in c)c.hasOwnProperty(f)&&(c[f]=c[f].replace(/\.\w*$/,""));this.settings=a.extend({},j,d),this.path=c,this.init()}var i="vide",j={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:"50% 50%",posterType:"detect",resizing:!0},k=/iPad|iPhone|iPod/i.test(d.userAgent),l=/Android/i.test(d.userAgent);h.prototype.init=function(){var b,c,d=this,e=f(d.settings.position);d.$wrapper=a("
").css({position:"absolute","z-index":-1,top:0,left:0,bottom:0,right:0,overflow:"hidden","-webkit-background-size":"cover","-moz-background-size":"cover","-o-background-size":"cover","background-size":"cover","background-repeat":"no-repeat","background-position":e.x+" "+e.y}),c=d.path,"object"==typeof d.path&&(d.path.poster?c=d.path.poster:d.path.mp4?c=d.path.mp4:d.path.webm?c=d.path.webm:d.path.ogv&&(c=d.path.ogv)),"detect"===d.settings.posterType?g(c,function(a){d.$wrapper.css("background-image","url("+a+")")}):"none"!==d.settings.posterType&&d.$wrapper.css("background-image","url("+c+"."+d.settings.posterType+")"),"static"===d.$element.css("position")&&d.$element.css("position","relative"),d.$element.prepend(d.$wrapper),k||l||(b="","object"==typeof d.path?(d.path.mp4&&(b+=""),d.path.webm&&(b+=""),d.path.ogv&&(b+=""),d.$video=a("")):d.$video=a(""),d.$video.css("visibility","hidden"),d.$video.prop({autoplay:d.settings.autoplay,loop:d.settings.loop,volume:d.settings.volume,muted:d.settings.muted,playbackRate:d.settings.playbackRate}),d.$wrapper.append(d.$video),d.$video.css({margin:"auto",position:"absolute","z-index":-1,top:e.y,left:e.x,"-webkit-transform":"translate(-"+e.x+", -"+e.y+")","-ms-transform":"translate(-"+e.x+", -"+e.y+")",transform:"translate(-"+e.x+", -"+e.y+")"}),d.$video.bind("loadedmetadata."+i,function(){d.$video.css("visibility","visible"),d.resize(),d.$wrapper.css("background-image","none")}),d.$element.bind("resize."+i,function(){d.settings.resizing&&d.resize()}))},h.prototype.getVideoObject=function(){return this.$video?this.$video[0]:null},h.prototype.resize=function(){if(this.$video){var a=this.$video[0].videoHeight,b=this.$video[0].videoWidth,c=this.$wrapper.height(),d=this.$wrapper.width();this.$video.css(d/b>c/a?{width:d+2,height:"auto"}:{width:"auto",height:c+2})}},h.prototype.destroy=function(){this.$element.unbind(i),this.$video&&this.$video.unbind(i),delete a[i].lookup[this.index],this.$element.removeData(i),this.$wrapper.remove()},a[i]={lookup:[]},a.fn[i]=function(b,c){var d;return this.each(function(){d=a.data(this,i),d&&d.destroy(),d=new h(this,b,c),d.index=a[i].lookup.push(d)-1,a.data(this,i,d)}),this},a(c).ready(function(){a(b).bind("resize."+i,function(){for(var b,c=a[i].lookup.length,d=0;c>d;d++)b=a[i].lookup[d],b&&b.settings.resizing&&b.resize()}),a(c).find("[data-"+i+"-bg]").each(function(b,c){var d=a(c),e=d.data(i+"-options"),f=d.data(i+"-bg");d[i](f,e)})})}(window.jQuery,window,document,navigator);rainloop-webmail-1.14.0/plugins/video-on-login-screen/js/video-on-login.js000066400000000000000000000016601361462701300264300ustar00rootroot00000000000000(function ($, window) { $(function () { if (window.rl && window.rl && !window.rl.settingsGet('Auth')) { var iRate = 1, sRate = window.rl.pluginSettingsGet('video-on-login-screen', 'playback_rate') ; switch (sRate) { case '25%': iRate = 0.25; break; case '50%': iRate = 0.5; break; case '75%': iRate = 0.75; break; case '125%': iRate = 1.25; break; case '150%': iRate = 1.5; break; case '200%': iRate = 2; break; } $('#rl-bg').vide({ 'mp4': window.rl.pluginSettingsGet('video-on-login-screen', 'mp4_file') || '', 'webm': window.rl.pluginSettingsGet('video-on-login-screen', 'webm_file') || '', 'ogv': window.rl.pluginSettingsGet('video-on-login-screen', 'ogv_file') || '' }, { playbackRate: iRate, muted: !!window.rl.pluginSettingsGet('video-on-login-screen', 'muted') }); } }); }($, window)); rainloop-webmail-1.14.0/plugins/virtualmin-change-password/000077500000000000000000000000001361462701300237775ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/virtualmin-change-password/LICENSE000066400000000000000000000020641361462701300250060ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 icedman21 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/virtualmin-change-password/README000066400000000000000000000004671361462701300246660ustar00rootroot00000000000000This plugin utilizes Virtualmin's remote API to change user passwords. The plugin requires the Admin user name and password to succesfully execute the password change. The host and port where Virtualmin listens on is also needed. See https://www.virtualmin.com/documentation/developer/http for more information.rainloop-webmail-1.14.0/plugins/virtualmin-change-password/VERSION000066400000000000000000000000031361462701300250400ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/virtualmin-change-password/VirtualminChangePasswordDriver.php000066400000000000000000000112561361462701300326540ustar00rootroot00000000000000sHost = $sHost; $this->sAdminUser = $sAdminUser; $this->sAdminPassword = $sAdminPassword; return $this; } /** * @param string $sAllowedEmails * * @return \VirtualminChangePasswordDriver */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \VirtualminChangePasswordDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param string $sDesc * @param int $iType = \MailSo\Log\Enumerations\Type::INFO * * @return \VirtualminChangePasswordDriver */ public function WriteLog($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO) { if ($this->oLogger) { $this->oLogger->Write($sDesc, $iType); } return $this; } /** * @param \RainLoop\Model\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return $oAccount && $oAccount->Email() && \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); } /** * @param \RainLoop\Model\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { $this->WriteLog('Virtualmin: Try to change password for '.$oAccount->Email()); $bResult = false; if (!empty($this->sHost) && !empty($this->sAdminUser) && !empty($this->sAdminPassword) && $oAccount) { $this->WriteLog('Virtualmin:[Check] Required Fields Present'); $sEmail = \trim(\strtolower($oAccount->Email())); $sEmailUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail); $sEmailDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); $sHost = \rtrim(\trim($this->sHost), '/'); $sUrl = $sHost.'/virtual-server/remote.cgi'; $sAdminUser = $this->sAdminUser; $sAdminPassword = $this->sAdminPassword; $iCode = 0; $aPost = array( 'user' => $sEmailUser, 'pass' => $sNewPassword, 'domain' => $sEmailDomain, 'program' => 'modify-user' ); $aOptions = array( CURLOPT_URL => $sUrl, CURLOPT_HEADER => false, CURLOPT_FAILONERROR => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), CURLOPT_TIMEOUT => 20, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_USERPWD => $sAdminUser.':'.$sAdminPassword ); $oCurl = \curl_init(); \curl_setopt_array($oCurl, $aOptions); $this->WriteLog('Virtualmin: Send post request: '.$sUrl); $mResult = \curl_exec($oCurl); $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); $this->WriteLog('Virtualmin: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); if (false === $mResult || 200 !== $iCode) { $this->WriteLog('Virtualmin: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); } if (\is_resource($oCurl)) { \curl_close($oCurl); } if (false !== $mResult && 200 === $iCode) { $aRes = null; @\parse_str($mResult, $aRes); if (\is_array($aRes) && (!isset($aRes['error']) || (int) $aRes['error'] !== 1)) { $iPos = \strpos($mResult, 'Exit status: '); if ($iPos !== false) { $aStatus = \explode(' ', $mResult); $sStatus = \trim(\array_pop($aStatus)); if ('0' === $sStatus) { $this->WriteLog('Virtualmin: Password Change Status: Success'); $bResult = true; } else { $this->WriteLog('Virtualmin[Error]: Response: '.$mResult); } } } else { $this->WriteLog('Virtualmin[Error]: Response: '.$mResult); } } else { $this->WriteLog('Virtualmin[Error]: Empty Response: Code: '.$iCode); } } return $bResult; } } rainloop-webmail-1.14.0/plugins/virtualmin-change-password/index.php000066400000000000000000000034011361462701300256150ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/VirtualminChangePasswordDriver.php'; $sHost = \trim($this->Config()->Get('plugin', 'host', '')); $sAdminUser = (string) $this->Config()->Get('plugin', 'admin_user', ''); $sAdminPassword = (string) $this->Config()->Get('plugin', 'admin_password', ''); $oProvider = new \VirtualminChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); $oProvider->SetConfig($sHost, $sAdminUser, $sAdminPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('Virtualmin Host') ->SetDefaultValue('https://localhost:10000') ->SetDescription('Virtualmin host URL. Example: https://example.com:10000'), \RainLoop\Plugins\Property::NewInstance('admin_user')->SetLabel('Admin User') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('admin_password')->SetLabel('Admin Password') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') ->SetDefaultValue('*') ); } } rainloop-webmail-1.14.0/plugins/vpopmail-change-password/000077500000000000000000000000001361462701300234345ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/vpopmail-change-password/ChangePasswordVpopmailDriver.php000077500000000000000000000106051361462701300317460ustar00rootroot00000000000000mHost = $mHost; return $this; } /** * @param string $mUser * * @return \ChangePasswordVpopmailDriver */ public function SetmUser($mUser) { $this->mUser = $mUser; return $this; } /** * @param string $mPass * * @return \ChangePasswordVpopmailDriver */ public function SetmPass($mPass) { $this->mPass = $mPass; return $this; } /** * @param string $mDatabase * * @return \ChangePasswordVpopmailDriver */ public function SetmDatabase($mDatabase) { $this->mDatabase = $mDatabase; return $this; } /** * @param string $mTable * * @return \ChangePasswordVpopmailDriver */ public function SetmTable($mTable) { $this->mTable = $mTable; return $this; } /** * @param string $mColumn * * @return \ChangePasswordVpopmailDriver */ public function SetmColumn($mColumn) { $this->mColumn = $mColumn; return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \ChangePasswordVpopmailDriver */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) { $this->oLogger = $oLogger; } return $this; } /** * @param array $aDomains * * @return bool */ public function SetAllowedDomains($aDomains) { if (\is_array($aDomains) && 0 < \count($aDomains)) { $this->aDomains = $aDomains; } return $this; } /** * @param \RainLoop\Account $oAccount * * @return bool */ public function PasswordChangePossibility($oAccount) { return 0 === \count($this->aDomains) || ($oAccount && \in_array(\strtolower( \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email)), $this->aDomains)); } /** * @param \RainLoop\Account $oAccount * @param string $sPrevPassword * @param string $sNewPassword * * @return bool */ public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) { if ($this->oLogger) { $this->oLogger->Write('Try to change password for '.$oAccount->Email()); } if (empty($this->mHost) || empty($this->mDatabase) || empty($this->mColumn) || empty($this->mTable)) { return false; } $bResult = false; $sDsn = 'mysql:host='.$this->mHost.';dbname='.$this->mDatabase.';charset=utf8'; $aOptions = array( PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); $sLoginPart = \MailSo\Base\Utils::GetAccountNameFromEmail($oAccount->Email()); $sDomainPart = \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email()); try { $oConn = new PDO($sDsn, $this->mUser, $this->mPass, $aOptions); $oSelect = $oConn->prepare('SELECT '.$this->mColumn.' FROM '.$this->mTable.' WHERE pw_name=? AND pw_domain=? LIMIT 1'); $oSelect->execute(array($sLoginPart, $sDomainPart)); $aColCrypt = $oSelect->fetchAll(PDO::FETCH_ASSOC); $sCryptPass = isset($aColCrypt[0][$this->mColumn]) ? $aColCrypt[0][$this->mColumn] : ''; if (0 < \strlen($sCryptPass) && \crypt($sPrevPassword, $sCryptPass) === $sCryptPass) { $oUpdate = $oConn->prepare('UPDATE '.$this->mTable.' SET '.$this->mColumn.'=ENCRYPT(?,concat("$1$",right(md5(rand()), 8 ),"$")), pw_clear_passwd=\'\' WHERE pw_name=? AND pw_domain=?'); $oUpdate->execute(array( $sNewPassword, $sLoginPart, $sDomainPart )); $bResult = true; if ($this->oLogger) { $this->oLogger->Write('Success! Password changed.'); } } else { $bResult = false; if ($this->oLogger) { $this->oLogger->Write('Something went wrong. Either current password is incorrect, or new password does not match criteria.'); } } } catch (\Exception $oException) { $bResult = false; if ($this->oLogger) { $this->oLogger->WriteException($oException); } } return $bResult; } } rainloop-webmail-1.14.0/plugins/vpopmail-change-password/LICENSE000077500000000000000000000020751361462701300244500ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 Almas at Dusal.net Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/vpopmail-change-password/VERSION000077500000000000000000000000041361462701300245010ustar00rootroot000000000000001.1 rainloop-webmail-1.14.0/plugins/vpopmail-change-password/index.php000077500000000000000000000043201361462701300252560ustar00rootroot00000000000000addHook('main.fabrica', 'MainFabrica'); } /** * @param string $sName * @param mixed $oProvider */ public function MainFabrica($sName, &$oProvider) { switch ($sName) { case 'change-password': include_once __DIR__.'/ChangePasswordVpopmailDriver.php'; $oProvider = new ChangePasswordVpopmailDriver(); $sDomains = \strtolower(\trim(\preg_replace('/[\s;,]+/', ' ', $this->Config()->Get('plugin', 'domains', '')))); if (0 < \strlen($sDomains)) { $aDomains = \explode(' ', $sDomains); $oProvider->SetAllowedDomains($aDomains); } $oProvider ->SetLogger($this->Manager()->Actions()->Logger()) ->SetmHost($this->Config()->Get('plugin', 'mHost', '')) ->SetmUser($this->Config()->Get('plugin', 'mUser', '')) ->SetmPass($this->Config()->Get('plugin', 'mPass', '')) ->SetmDatabase($this->Config()->Get('plugin', 'mDatabase', '')) ->SetmTable($this->Config()->Get('plugin', 'mTable', '')) ->SetmColumn($this->Config()->Get('plugin', 'mColumn', '')) ; break; } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('domains')->SetLabel('Allowed Domains') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed domains, space as delimiter') ->SetDefaultValue('gmail.com yahoo.com'), \RainLoop\Plugins\Property::NewInstance('mHost')->SetLabel('MySQL Host') ->SetDefaultValue('localhost'), \RainLoop\Plugins\Property::NewInstance('mUser')->SetLabel('MySQL User') ->SetDefaultValue('vpopmail'), \RainLoop\Plugins\Property::NewInstance('mPass')->SetLabel('MySQL Password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD), \RainLoop\Plugins\Property::NewInstance('mDatabase')->SetLabel('MySQL Database') ->SetDefaultValue('vpopmail'), \RainLoop\Plugins\Property::NewInstance('mTable')->SetLabel('MySQL Table') ->SetDefaultValue('vpopmail'), \RainLoop\Plugins\Property::NewInstance('mColumn')->SetLabel('MySQL Column') ->SetDefaultValue('pw_passwd') ); } } rainloop-webmail-1.14.0/plugins/white-list/000077500000000000000000000000001361462701300206135ustar00rootroot00000000000000rainloop-webmail-1.14.0/plugins/white-list/LICENSE000066400000000000000000000020701361462701300216170ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 RainLoop Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/plugins/white-list/README000066400000000000000000000000301361462701300214640ustar00rootroot00000000000000Simple white list pluginrainloop-webmail-1.14.0/plugins/white-list/VERSION000066400000000000000000000000031361462701300216540ustar00rootroot000000000000001.0rainloop-webmail-1.14.0/plugins/white-list/index.php000066400000000000000000000036031361462701300224350ustar00rootroot00000000000000addHook('filter.login-credentials', 'FilterLoginCredentials'); } /** * @param string $sEmail * @param string $sLogin * @param string $sPassword * * @throws \RainLoop\Exceptions\ClientException */ public function FilterLoginCredentials(&$sEmail, &$sLogin, &$sPassword) { $sWhiteList = \trim($this->Config()->Get('plugin', 'white_list', '')); if (0 < strlen($sWhiteList) && !\RainLoop\Plugins\Helper::ValidateWildcardValues($sEmail, $sWhiteList)) { $sExceptions = \trim($this->Config()->Get('plugin', 'exceptions', '')); if (0 === \strlen($sExceptions) || !\RainLoop\Plugins\Helper::ValidateWildcardValues($sEmail, $sExceptions)) { throw new \RainLoop\Exceptions\ClientException( $this->Config()->Get('plugin', 'auth_error', true) ? \RainLoop\Notifications::AuthError : \RainLoop\Notifications::AccountNotAllowed); } } } /** * @return array */ public function configMapping() { return array( \RainLoop\Plugins\Property::NewInstance('auth_error')->SetLabel('Auth Error') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) ->SetDescription('Throw an authentication error instead of an access error.') ->SetDefaultValue(true), \RainLoop\Plugins\Property::NewInstance('white_list')->SetLabel('White List') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Emails white list, space as delimiter, wildcard supported.') ->SetDefaultValue('*@domain1.com user@domain2.com'), \RainLoop\Plugins\Property::NewInstance('exceptions')->SetLabel('Exceptions') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Exceptions for white list, space as delimiter, wildcard supported.') ->SetDefaultValue('demo@domain1.com *@domain2.com admin@*') ); } } rainloop-webmail-1.14.0/rainloop/000077500000000000000000000000001361462701300166645ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/000077500000000000000000000000001361462701300171315ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/000077500000000000000000000000001361462701300175645ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/000077500000000000000000000000001361462701300203445ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/.htaccess000066400000000000000000000002721361462701300221430ustar00rootroot00000000000000 Require all denied Deny from all Options -Indexes rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/domains/000077500000000000000000000000001361462701300217765ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/domains/default.ini.dist000066400000000000000000000002231361462701300250620ustar00rootroot00000000000000imap_host = "IMAP_HOST" imap_port = IMAP_PORT imap_secure = "SSL" smtp_host = "SMTP_HOST" smtp_port = SMTP_PORT smtp_secure = "SSL" smtp_auth = On rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/domains/disabled000066400000000000000000000000341361462701300234650ustar00rootroot00000000000000outlook.com,qq.com,yahoo.comrainloop-webmail-1.14.0/rainloop/v/0.0.0/app/domains/gmail.com.ini000066400000000000000000000002211361462701300243400ustar00rootroot00000000000000imap_host = "imap.gmail.com" imap_port = 993 imap_secure = "SSL" smtp_host = "smtp.gmail.com" smtp_port = 587 smtp_secure = "TLS" smtp_auth = On rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/domains/outlook.com.ini000066400000000000000000000002361361462701300247510ustar00rootroot00000000000000imap_host = "imap-mail.outlook.com" imap_port = 993 imap_secure = "SSL" smtp_host = "smtp-mail.outlook.com" smtp_port = 587 smtp_secure = "TLS" smtp_auth = Onrainloop-webmail-1.14.0/rainloop/v/0.0.0/app/domains/qq.com.ini000066400000000000000000000002131361462701300236710ustar00rootroot00000000000000imap_host = "imap.qq.com" imap_port = 993 imap_secure = "SSL" smtp_host = "smtp.qq.com" smtp_port = 465 smtp_secure = "SSL" smtp_auth = On rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/domains/yahoo.com.ini000066400000000000000000000002331361462701300243710ustar00rootroot00000000000000imap_host = "imap.mail.yahoo.com" imap_port = 993 imap_secure = "SSL" smtp_host = "smtp.mail.yahoo.com" smtp_port = 587 smtp_secure = "TLS" smtp_auth = On rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/handle.php000066400000000000000000000051101361462701300223050ustar00rootroot00000000000000value = $accessToken; if ($expiresAt) { $this->setExpiresAtFromTimeStamp($expiresAt); } } /** * Generate an app secret proof to sign a request to Graph. * * @param string $appSecret The app secret. * * @return string */ public function getAppSecretProof($appSecret) { return hash_hmac('sha256', $this->value, $appSecret); } /** * Getter for expiresAt. * * @return \DateTime|null */ public function getExpiresAt() { return $this->expiresAt; } /** * Determines whether or not this is an app access token. * * @return bool */ public function isAppAccessToken() { return strpos($this->value, '|') !== false; } /** * Determines whether or not this is a long-lived token. * * @return bool */ public function isLongLived() { if ($this->expiresAt) { return $this->expiresAt->getTimestamp() > time() + (60 * 60 * 2); } if ($this->isAppAccessToken()) { return true; } return false; } /** * Checks the expiration of the access token. * * @return boolean|null */ public function isExpired() { if ($this->getExpiresAt() instanceof \DateTime) { return $this->getExpiresAt()->getTimestamp() < time(); } if ($this->isAppAccessToken()) { return false; } return null; } /** * Returns the access token as a string. * * @return string */ public function getValue() { return $this->value; } /** * Returns the access token as a string. * * @return string */ public function __toString() { return $this->getValue(); } /** * Setter for expires_at. * * @param int $timeStamp */ protected function setExpiresAtFromTimeStamp($timeStamp) { $dt = new \DateTime(); $dt->setTimestamp($timeStamp); $this->expiresAt = $dt; } } AccessTokenMetadata.php000066400000000000000000000231311361462701300333050ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Authenticationmetadata = $metadata['data']; $this->castTimestampsToDateTime(); } /** * Returns a value from the metadata. * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getField($field, $default = null) { if (isset($this->metadata[$field])) { return $this->metadata[$field]; } return $default; } /** * Returns a value from the metadata. * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed * * @deprecated 5.0.0 getProperty() has been renamed to getField() * @todo v6: Remove this method */ public function getProperty($field, $default = null) { return $this->getField($field, $default); } /** * Returns a value from a child property in the metadata. * * @param string $parentField The parent property. * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getChildProperty($parentField, $field, $default = null) { if (!isset($this->metadata[$parentField])) { return $default; } if (!isset($this->metadata[$parentField][$field])) { return $default; } return $this->metadata[$parentField][$field]; } /** * Returns a value from the error metadata. * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getErrorProperty($field, $default = null) { return $this->getChildProperty('error', $field, $default); } /** * Returns a value from the "metadata" metadata. *Brain explodes* * * @param string $field The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed */ public function getMetadataProperty($field, $default = null) { return $this->getChildProperty('metadata', $field, $default); } /** * The ID of the application this access token is for. * * @return string|null */ public function getAppId() { return $this->getField('app_id'); } /** * Name of the application this access token is for. * * @return string|null */ public function getApplication() { return $this->getField('application'); } /** * Any error that a request to the graph api * would return due to the access token. * * @return bool|null */ public function isError() { return $this->getField('error') !== null; } /** * The error code for the error. * * @return int|null */ public function getErrorCode() { return $this->getErrorProperty('code'); } /** * The error message for the error. * * @return string|null */ public function getErrorMessage() { return $this->getErrorProperty('message'); } /** * The error subcode for the error. * * @return int|null */ public function getErrorSubcode() { return $this->getErrorProperty('subcode'); } /** * DateTime when this access token expires. * * @return \DateTime|null */ public function getExpiresAt() { return $this->getField('expires_at'); } /** * Whether the access token is still valid or not. * * @return boolean|null */ public function getIsValid() { return $this->getField('is_valid'); } /** * DateTime when this access token was issued. * * Note that the issued_at field is not returned * for short-lived access tokens. * * @see https://developers.facebook.com/docs/facebook-login/access-tokens#debug * * @return \DateTime|null */ public function getIssuedAt() { return $this->getField('issued_at'); } /** * General metadata associated with the access token. * Can contain data like 'sso', 'auth_type', 'auth_nonce'. * * @return array|null */ public function getMetadata() { return $this->getField('metadata'); } /** * The 'sso' child property from the 'metadata' parent property. * * @return string|null */ public function getSso() { return $this->getMetadataProperty('sso'); } /** * The 'auth_type' child property from the 'metadata' parent property. * * @return string|null */ public function getAuthType() { return $this->getMetadataProperty('auth_type'); } /** * The 'auth_nonce' child property from the 'metadata' parent property. * * @return string|null */ public function getAuthNonce() { return $this->getMetadataProperty('auth_nonce'); } /** * For impersonated access tokens, the ID of * the page this token contains. * * @return string|null */ public function getProfileId() { return $this->getField('profile_id'); } /** * List of permissions that the user has granted for * the app in this access token. * * @return array */ public function getScopes() { return $this->getField('scopes'); } /** * The ID of the user this access token is for. * * @return string|null */ public function getUserId() { return $this->getField('user_id'); } /** * Ensures the app ID from the access token * metadata is what we expect. * * @param string $appId * * @throws FacebookSDKException */ public function validateAppId($appId) { if ($this->getAppId() !== $appId) { throw new FacebookSDKException('Access token metadata contains unexpected app ID.', 401); } } /** * Ensures the user ID from the access token * metadata is what we expect. * * @param string $userId * * @throws FacebookSDKException */ public function validateUserId($userId) { if ($this->getUserId() !== $userId) { throw new FacebookSDKException('Access token metadata contains unexpected user ID.', 401); } } /** * Ensures the access token has not expired yet. * * @throws FacebookSDKException */ public function validateExpiration() { if (!$this->getExpiresAt() instanceof \DateTime) { return; } if ($this->getExpiresAt()->getTimestamp() < time()) { throw new FacebookSDKException('Inspection of access token metadata shows that the access token has expired.', 401); } } /** * Converts a unix timestamp into a DateTime entity. * * @param int $timestamp * * @return \DateTime */ private function convertTimestampToDateTime($timestamp) { $dt = new \DateTime(); $dt->setTimestamp($timestamp); return $dt; } /** * Casts the unix timestamps as DateTime entities. */ private function castTimestampsToDateTime() { foreach (static::$dateProperties as $key) { if (isset($this->metadata[$key])) { $this->metadata[$key] = $this->convertTimestampToDateTime($this->metadata[$key]); } } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Authentication/OAuth2Client.php000066400000000000000000000207671361462701300317760ustar00rootroot00000000000000app = $app; $this->client = $client; $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; } /** * Returns the last FacebookRequest that was sent. * Useful for debugging and testing. * * @return FacebookRequest|null */ public function getLastRequest() { return $this->lastRequest; } /** * Get the metadata associated with the access token. * * @param AccessToken|string $accessToken The access token to debug. * * @return AccessTokenMetadata */ public function debugToken($accessToken) { $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; $params = ['input_token' => $accessToken]; $this->lastRequest = new FacebookRequest( $this->app, $this->app->getAccessToken(), 'GET', '/debug_token', $params, null, $this->graphVersion ); $response = $this->client->sendRequest($this->lastRequest); $metadata = $response->getDecodedBody(); return new AccessTokenMetadata($metadata); } /** * Generates an authorization URL to begin the process of authenticating a user. * * @param string $redirectUrl The callback URL to redirect to. * @param array $scope An array of permissions to request. * @param string $state The CSPRNG-generated CSRF value. * @param array $params An array of parameters to generate URL. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getAuthorizationUrl($redirectUrl, $state, array $scope = [], array $params = [], $separator = '&') { $params += [ 'client_id' => $this->app->getId(), 'state' => $state, 'response_type' => 'code', 'sdk' => 'php-sdk-' . Facebook::VERSION, 'redirect_uri' => $redirectUrl, 'scope' => implode(',', $scope) ]; return static::BASE_AUTHORIZATION_URL . '/' . $this->graphVersion . '/dialog/oauth?' . http_build_query($params, null, $separator); } /** * Get a valid access token from a code. * * @param string $code * @param string $redirectUri * * @return AccessToken * * @throws FacebookSDKException */ public function getAccessTokenFromCode($code, $redirectUri = '') { $params = [ 'code' => $code, 'redirect_uri' => $redirectUri, ]; return $this->requestAnAccessToken($params); } /** * Exchanges a short-lived access token with a long-lived access token. * * @param AccessToken|string $accessToken * * @return AccessToken * * @throws FacebookSDKException */ public function getLongLivedAccessToken($accessToken) { $accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken; $params = [ 'grant_type' => 'fb_exchange_token', 'fb_exchange_token' => $accessToken, ]; return $this->requestAnAccessToken($params); } /** * Get a valid code from an access token. * * @param AccessToken|string $accessToken * @param string $redirectUri * * @return AccessToken * * @throws FacebookSDKException */ public function getCodeFromLongLivedAccessToken($accessToken, $redirectUri = '') { $params = [ 'redirect_uri' => $redirectUri, ]; $response = $this->sendRequestWithClientParams('/oauth/client_code', $params, $accessToken); $data = $response->getDecodedBody(); if (!isset($data['code'])) { throw new FacebookSDKException('Code was not returned from Graph.', 401); } return $data['code']; } /** * Send a request to the OAuth endpoint. * * @param array $params * * @return AccessToken * * @throws FacebookSDKException */ protected function requestAnAccessToken(array $params) { $response = $this->sendRequestWithClientParams('/oauth/access_token', $params); $data = $response->getDecodedBody(); if (!isset($data['access_token'])) { throw new FacebookSDKException('Access token was not returned from Graph.', 401); } // Graph returns two different key names for expiration time // on the same endpoint. Doh! :/ $expiresAt = 0; if (isset($data['expires'])) { // For exchanging a short lived token with a long lived token. // The expiration time in seconds will be returned as "expires". $expiresAt = time() + $data['expires']; } elseif (isset($data['expires_in'])) { // For exchanging a code for a short lived access token. // The expiration time in seconds will be returned as "expires_in". // See: https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code $expiresAt = time() + $data['expires_in']; } return new AccessToken($data['access_token'], $expiresAt); } /** * Send a request to Graph with an app access token. * * @param string $endpoint * @param array $params * @param string|null $accessToken * * @return FacebookResponse * * @throws FacebookResponseException */ protected function sendRequestWithClientParams($endpoint, array $params, $accessToken = null) { $params += $this->getClientParams(); $accessToken = $accessToken ?: $this->app->getAccessToken(); $this->lastRequest = new FacebookRequest( $this->app, $accessToken, 'GET', $endpoint, $params, null, $this->graphVersion ); return $this->client->sendRequest($this->lastRequest); } /** * Returns the client_* params for OAuth requests. * * @return array */ protected function getClientParams() { return [ 'client_id' => $this->app->getId(), 'client_secret' => $this->app->getSecret(), ]; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Exceptions/000077500000000000000000000000001361462701300261525ustar00rootroot00000000000000FacebookAuthenticationException.php000066400000000000000000000023521361462701300350760ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Exceptionsresponse = $response; $this->responseData = $response->getDecodedBody(); $errorMessage = $this->get('message', 'Unknown error from Graph.'); $errorCode = $this->get('code', -1); parent::__construct($errorMessage, $errorCode, $previousException); } /** * A factory for creating the appropriate exception based on the response from Graph. * * @param FacebookResponse $response The response that threw the exception. * * @return FacebookResponseException */ public static function create(FacebookResponse $response) { $data = $response->getDecodedBody(); if (!isset($data['error']['code']) && isset($data['code'])) { $data = ['error' => $data]; } $code = isset($data['error']['code']) ? $data['error']['code'] : null; $message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.'; $previousException = null; if (isset($data['error']['error_subcode'])) { switch ($data['error']['error_subcode']) { // Other authentication issues case 458: case 459: case 460: case 463: case 464: case 467: return new static($response, new FacebookAuthenticationException($message, $code)); } } switch ($code) { // Login status or token expired, revoked, or invalid case 100: case 102: case 190: return new static($response, new FacebookAuthenticationException($message, $code)); // Server issue, possible downtime case 1: case 2: return new static($response, new FacebookServerException($message, $code)); // API Throttling case 4: case 17: case 341: return new static($response, new FacebookThrottleException($message, $code)); // Duplicate Post case 506: return new static($response, new FacebookClientException($message, $code)); } // Missing Permissions if ($code == 10 || ($code >= 200 && $code <= 299)) { return new static($response, new FacebookAuthorizationException($message, $code)); } // OAuth authentication error if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') { return new static($response, new FacebookAuthenticationException($message, $code)); } // All others return new static($response, new FacebookOtherException($message, $code)); } /** * Checks isset and returns that or a default value. * * @param string $key * @param mixed $default * * @return mixed */ private function get($key, $default = null) { if (isset($this->responseData['error'][$key])) { return $this->responseData['error'][$key]; } return $default; } /** * Returns the HTTP status code * * @return int */ public function getHttpStatusCode() { return $this->response->getHttpStatusCode(); } /** * Returns the sub-error code * * @return int */ public function getSubErrorCode() { return $this->get('error_subcode', -1); } /** * Returns the error type * * @return string */ public function getErrorType() { return $this->get('type', ''); } /** * Returns the raw response used to create the exception. * * @return string */ public function getRawResponse() { return $this->response->getBody(); } /** * Returns the decoded response used to create the exception. * * @return array */ public function getResponseData() { return $this->responseData; } /** * Returns the response entity used to create the exception. * * @return FacebookResponse */ public function getResponse() { return $this->response; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Exceptions/FacebookSDKException.php000066400000000000000000000023121361462701300326130ustar00rootroot00000000000000app = new FacebookApp($appId, $appSecret); $httpClientHandler = null; if (isset($config['http_client_handler'])) { if ($config['http_client_handler'] instanceof FacebookHttpClientInterface) { $httpClientHandler = $config['http_client_handler']; } elseif ($config['http_client_handler'] === 'curl') { $httpClientHandler = new FacebookCurlHttpClient(); } elseif ($config['http_client_handler'] === 'stream') { $httpClientHandler = new FacebookStreamHttpClient(); } elseif ($config['http_client_handler'] === 'guzzle') { $httpClientHandler = new FacebookGuzzleHttpClient(); } else { throw new \InvalidArgumentException('The http_client_handler must be set to "curl", "stream", "guzzle", or be an instance of Facebook\HttpClients\FacebookHttpClientInterface'); } } $enableBeta = isset($config['enable_beta_mode']) && $config['enable_beta_mode'] === true; $this->client = new FacebookClient($httpClientHandler, $enableBeta); if (isset($config['url_detection_handler'])) { if ($config['url_detection_handler'] instanceof UrlDetectionInterface) { $this->urlDetectionHandler = $config['url_detection_handler']; } else { throw new \InvalidArgumentException('The url_detection_handler must be an instance of Facebook\Url\UrlDetectionInterface'); } } if (isset($config['pseudo_random_string_generator'])) { if ($config['pseudo_random_string_generator'] instanceof PseudoRandomStringGeneratorInterface) { $this->pseudoRandomStringGenerator = $config['pseudo_random_string_generator']; } elseif ($config['pseudo_random_string_generator'] === 'mcrypt') { $this->pseudoRandomStringGenerator = new McryptPseudoRandomStringGenerator(); } elseif ($config['pseudo_random_string_generator'] === 'openssl') { $this->pseudoRandomStringGenerator = new OpenSslPseudoRandomStringGenerator(); } elseif ($config['pseudo_random_string_generator'] === 'urandom') { $this->pseudoRandomStringGenerator = new UrandomPseudoRandomStringGenerator(); } else { throw new \InvalidArgumentException('The pseudo_random_string_generator must be set to "mcrypt", "openssl", or "urandom", or be an instance of Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface'); } } if (isset($config['persistent_data_handler'])) { if ($config['persistent_data_handler'] instanceof PersistentDataInterface) { $this->persistentDataHandler = $config['persistent_data_handler']; } elseif ($config['persistent_data_handler'] === 'session') { $this->persistentDataHandler = new FacebookSessionPersistentDataHandler(); } elseif ($config['persistent_data_handler'] === 'memory') { $this->persistentDataHandler = new FacebookMemoryPersistentDataHandler(); } else { throw new \InvalidArgumentException('The persistent_data_handler must be set to "session", "memory", or be an instance of Facebook\PersistentData\PersistentDataInterface'); } } if (isset($config['default_access_token'])) { $this->setDefaultAccessToken($config['default_access_token']); } if (isset($config['default_graph_version'])) { $this->defaultGraphVersion = $config['default_graph_version']; } else { // @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set $this->defaultGraphVersion = static::DEFAULT_GRAPH_VERSION; } } /** * Returns the FacebookApp entity. * * @return FacebookApp */ public function getApp() { return $this->app; } /** * Returns the FacebookClient service. * * @return FacebookClient */ public function getClient() { return $this->client; } /** * Returns the OAuth 2.0 client service. * * @return OAuth2Client */ public function getOAuth2Client() { if (!$this->oAuth2Client instanceof OAuth2Client) { $app = $this->getApp(); $client = $this->getClient(); $this->oAuth2Client = new OAuth2Client($app, $client, $this->defaultGraphVersion); } return $this->oAuth2Client; } /** * Returns the last response returned from Graph. * * @return FacebookResponse|FacebookBatchResponse|null */ public function getLastResponse() { return $this->lastResponse; } /** * Returns the URL detection handler. * * @return UrlDetectionInterface */ public function getUrlDetectionHandler() { if (!$this->urlDetectionHandler instanceof UrlDetectionInterface) { $this->urlDetectionHandler = new FacebookUrlDetectionHandler(); } return $this->urlDetectionHandler; } /** * Returns the default AccessToken entity. * * @return AccessToken|null */ public function getDefaultAccessToken() { return $this->defaultAccessToken; } /** * Sets the default access token to use with requests. * * @param AccessToken|string $accessToken The access token to save. * * @throws \InvalidArgumentException */ public function setDefaultAccessToken($accessToken) { if (is_string($accessToken)) { $this->defaultAccessToken = new AccessToken($accessToken); return; } if ($accessToken instanceof AccessToken) { $this->defaultAccessToken = $accessToken; return; } throw new \InvalidArgumentException('The default access token must be of type "string" or Facebook\AccessToken'); } /** * Returns the default Graph version. * * @return string */ public function getDefaultGraphVersion() { return $this->defaultGraphVersion; } /** * Returns the redirect login helper. * * @return FacebookRedirectLoginHelper */ public function getRedirectLoginHelper() { return new FacebookRedirectLoginHelper( $this->getOAuth2Client(), $this->persistentDataHandler, $this->urlDetectionHandler, $this->pseudoRandomStringGenerator ); } /** * Returns the JavaScript helper. * * @return FacebookJavaScriptHelper */ public function getJavaScriptHelper() { return new FacebookJavaScriptHelper($this->app, $this->client, $this->defaultGraphVersion); } /** * Returns the canvas helper. * * @return FacebookCanvasHelper */ public function getCanvasHelper() { return new FacebookCanvasHelper($this->app, $this->client, $this->defaultGraphVersion); } /** * Returns the page tab helper. * * @return FacebookPageTabHelper */ public function getPageTabHelper() { return new FacebookPageTabHelper($this->app, $this->client, $this->defaultGraphVersion); } /** * Sends a GET request to Graph and returns the result. * * @param string $endpoint * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function get($endpoint, $accessToken = null, $eTag = null, $graphVersion = null) { return $this->sendRequest( 'GET', $endpoint, $params = [], $accessToken, $eTag, $graphVersion ); } /** * Sends a POST request to Graph and returns the result. * * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function post($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { return $this->sendRequest( 'POST', $endpoint, $params, $accessToken, $eTag, $graphVersion ); } /** * Sends a DELETE request to Graph and returns the result. * * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function delete($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { return $this->sendRequest( 'DELETE', $endpoint, $params, $accessToken, $eTag, $graphVersion ); } /** * Sends a request to Graph for the next page of results. * * @param GraphEdge $graphEdge The GraphEdge to paginate over. * * @return GraphEdge|null * * @throws FacebookSDKException */ public function next(GraphEdge $graphEdge) { return $this->getPaginationResults($graphEdge, 'next'); } /** * Sends a request to Graph for the previous page of results. * * @param GraphEdge $graphEdge The GraphEdge to paginate over. * * @return GraphEdge|null * * @throws FacebookSDKException */ public function previous(GraphEdge $graphEdge) { return $this->getPaginationResults($graphEdge, 'previous'); } /** * Sends a request to Graph for the next page of results. * * @param GraphEdge $graphEdge The GraphEdge to paginate over. * @param string $direction The direction of the pagination: next|previous. * * @return GraphEdge|null * * @throws FacebookSDKException */ public function getPaginationResults(GraphEdge $graphEdge, $direction) { $paginationRequest = $graphEdge->getPaginationRequest($direction); if (!$paginationRequest) { return null; } $this->lastResponse = $this->client->sendRequest($paginationRequest); // Keep the same GraphNode subclass $subClassName = $graphEdge->getSubClassName(); $graphEdge = $this->lastResponse->getGraphEdge($subClassName, false); return count($graphEdge) > 0 ? $graphEdge : null; } /** * Sends a request to Graph and returns the result. * * @param string $method * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookResponse * * @throws FacebookSDKException */ public function sendRequest($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; $request = $this->request($method, $endpoint, $params, $accessToken, $eTag, $graphVersion); return $this->lastResponse = $this->client->sendRequest($request); } /** * Sends a batched request to Graph and returns the result. * * @param array $requests * @param AccessToken|string|null $accessToken * @param string|null $graphVersion * * @return FacebookBatchResponse * * @throws FacebookSDKException */ public function sendBatchRequest(array $requests, $accessToken = null, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; $batchRequest = new FacebookBatchRequest( $this->app, $requests, $accessToken, $graphVersion ); return $this->lastResponse = $this->client->sendBatchRequest($batchRequest); } /** * Instantiates a new FacebookRequest entity. * * @param string $method * @param string $endpoint * @param array $params * @param AccessToken|string|null $accessToken * @param string|null $eTag * @param string|null $graphVersion * * @return FacebookRequest * * @throws FacebookSDKException */ public function request($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null) { $accessToken = $accessToken ?: $this->defaultAccessToken; $graphVersion = $graphVersion ?: $this->defaultGraphVersion; return new FacebookRequest( $this->app, $accessToken, $method, $endpoint, $params, $eTag, $graphVersion ); } /** * Factory to create FacebookFile's. * * @param string $pathToFile * * @return FacebookFile * * @throws FacebookSDKException */ public function fileToUpload($pathToFile) { return new FacebookFile($pathToFile); } /** * Factory to create FacebookVideo's. * * @param string $pathToFile * * @return FacebookVideo * * @throws FacebookSDKException */ public function videoToUpload($pathToFile) { return new FacebookVideo($pathToFile); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FacebookApp.php000066400000000000000000000046531361462701300267240ustar00rootroot00000000000000id = $id; $this->secret = $secret; } /** * Returns the app ID. * * @return string */ public function getId() { return $this->id; } /** * Returns the app secret. * * @return string */ public function getSecret() { return $this->secret; } /** * Returns an app access token. * * @return AccessToken */ public function getAccessToken() { return new AccessToken($this->id . '|' . $this->secret); } /** * Serializes the FacebookApp entity as a string. * * @return string */ public function serialize() { return serialize([$this->id, $this->secret]); } /** * Unserializes a string as a FacebookApp entity. * * @param string $serialized */ public function unserialize($serialized) { list($id, $secret) = unserialize($serialized); $this->__construct($id, $secret); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FacebookBatchRequest.php000066400000000000000000000207171361462701300305750ustar00rootroot00000000000000add($requests); } /** * A a new request to the array. * * @param FacebookRequest|array $request * @param string|null $name * * @return FacebookBatchRequest * * @throws \InvalidArgumentException */ public function add($request, $name = null) { if (is_array($request)) { foreach ($request as $key => $req) { $this->add($req, $key); } return $this; } if (!$request instanceof FacebookRequest) { throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.'); } $this->addFallbackDefaults($request); $requestToAdd = [ 'name' => $name, 'request' => $request, ]; // File uploads $attachedFiles = $this->extractFileAttachments($request); if ($attachedFiles) { $requestToAdd['attached_files'] = $attachedFiles; } $this->requests[] = $requestToAdd; return $this; } /** * Ensures that the FacebookApp and access token fall back when missing. * * @param FacebookRequest $request * * @throws FacebookSDKException */ public function addFallbackDefaults(FacebookRequest $request) { if (!$request->getApp()) { $app = $this->getApp(); if (!$app) { throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.'); } $request->setApp($app); } if (!$request->getAccessToken()) { $accessToken = $this->getAccessToken(); if (!$accessToken) { throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.'); } $request->setAccessToken($accessToken); } } /** * Extracts the files from a request. * * @param FacebookRequest $request * * @return string|null * * @throws FacebookSDKException */ public function extractFileAttachments(FacebookRequest $request) { if (!$request->containsFileUploads()) { return null; } $files = $request->getFiles(); $fileNames = []; foreach ($files as $file) { $fileName = uniqid(); $this->addFile($fileName, $file); $fileNames[] = $fileName; } $request->resetFiles(); // @TODO Does Graph support multiple uploads on one endpoint? return implode(',', $fileNames); } /** * Return the FacebookRequest entities. * * @return array */ public function getRequests() { return $this->requests; } /** * Prepares the requests to be sent as a batch request. * * @return string */ public function prepareRequestsForBatch() { $this->validateBatchRequestCount(); $params = [ 'batch' => $this->convertRequestsToJson(), 'include_headers' => true, ]; $this->setParams($params); } /** * Converts the requests into a JSON(P) string. * * @return string */ public function convertRequestsToJson() { $requests = []; foreach ($this->requests as $request) { $attachedFiles = isset($request['attached_files']) ? $request['attached_files'] : null; $requests[] = $this->requestEntityToBatchArray($request['request'], $request['name'], $attachedFiles); } return json_encode($requests); } /** * Validate the request count before sending them as a batch. * * @throws FacebookSDKException */ public function validateBatchRequestCount() { $batchCount = count($this->requests); if ($batchCount === 0) { throw new FacebookSDKException('There are no batch requests to send.'); } elseif ($batchCount > 50) { // Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.'); } } /** * Converts a Request entity into an array that is batch-friendly. * * @param FacebookRequest $request The request entity to convert. * @param string|null $requestName The name of the request. * @param string|null $attachedFiles Names of files associated with the request. * * @return array */ public function requestEntityToBatchArray(FacebookRequest $request, $requestName = null, $attachedFiles = null) { $compiledHeaders = []; $headers = $request->getHeaders(); foreach ($headers as $name => $value) { $compiledHeaders[] = $name . ': ' . $value; } $batch = [ 'headers' => $compiledHeaders, 'method' => $request->getMethod(), 'relative_url' => $request->getUrl(), ]; // Since file uploads are moved to the root request of a batch request, // the child requests will always be URL-encoded. $body = $request->getUrlEncodedBody()->getBody(); if ($body) { $batch['body'] = $body; } if (isset($requestName)) { $batch['name'] = $requestName; } if (isset($attachedFiles)) { $batch['attached_files'] = $attachedFiles; } // @TODO Add support for "omit_response_on_success" // @TODO Add support for "depends_on" // @TODO Add support for JSONP with "callback" return $batch; } /** * Get an iterator for the items. * * @return ArrayIterator */ public function getIterator() { return new ArrayIterator($this->requests); } /** * @inheritdoc */ public function offsetSet($offset, $value) { $this->add($value, $offset); } /** * @inheritdoc */ public function offsetExists($offset) { return isset($this->requests[$offset]); } /** * @inheritdoc */ public function offsetUnset($offset) { unset($this->requests[$offset]); } /** * @inheritdoc */ public function offsetGet($offset) { return isset($this->requests[$offset]) ? $this->requests[$offset] : null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FacebookBatchResponse.php000066400000000000000000000104241361462701300307350ustar00rootroot00000000000000batchRequest = $batchRequest; $request = $response->getRequest(); $body = $response->getBody(); $httpStatusCode = $response->getHttpStatusCode(); $headers = $response->getHeaders(); parent::__construct($request, $body, $httpStatusCode, $headers); $responses = $response->getDecodedBody(); $this->setResponses($responses); } /** * Returns an array of FacebookResponse entities. * * @return array */ public function getResponses() { return $this->responses; } /** * The main batch response will be an array of requests so * we need to iterate over all the responses. * * @param array $responses */ public function setResponses(array $responses) { $this->responses = []; foreach ($responses as $key => $graphResponse) { $this->addResponse($key, $graphResponse); } } /** * Add a response to the list. * * @param int $key * @param array|null $response */ public function addResponse($key, $response) { $originalRequestName = isset($this->batchRequest[$key]['name']) ? $this->batchRequest[$key]['name'] : $key; $originalRequest = isset($this->batchRequest[$key]['request']) ? $this->batchRequest[$key]['request'] : null; $httpResponseBody = isset($response['body']) ? $response['body'] : null; $httpResponseCode = isset($response['code']) ? $response['code'] : null; $httpResponseHeaders = isset($response['headers']) ? $response['headers'] : []; $this->responses[$originalRequestName] = new FacebookResponse( $originalRequest, $httpResponseBody, $httpResponseCode, $httpResponseHeaders ); } /** * @inheritdoc */ public function getIterator() { return new ArrayIterator($this->responses); } /** * @inheritdoc */ public function offsetSet($offset, $value) { $this->addResponse($offset, $value); } /** * @inheritdoc */ public function offsetExists($offset) { return isset($this->responses[$offset]); } /** * @inheritdoc */ public function offsetUnset($offset) { unset($this->responses[$offset]); } /** * @inheritdoc */ public function offsetGet($offset) { return isset($this->responses[$offset]) ? $this->responses[$offset] : null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FacebookClient.php000066400000000000000000000166601361462701300274230ustar00rootroot00000000000000httpClientHandler = $httpClientHandler ?: $this->detectHttpClientHandler(); $this->enableBetaMode = $enableBeta; } /** * Sets the HTTP client handler. * * @param FacebookHttpClientInterface $httpClientHandler */ public function setHttpClientHandler(FacebookHttpClientInterface $httpClientHandler) { $this->httpClientHandler = $httpClientHandler; } /** * Returns the HTTP client handler. * * @return FacebookHttpClientInterface */ public function getHttpClientHandler() { return $this->httpClientHandler; } /** * Detects which HTTP client handler to use. * * @return FacebookHttpClientInterface */ public function detectHttpClientHandler() { return function_exists('curl_init') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient(); } /** * Toggle beta mode. * * @param boolean $betaMode */ public function enableBetaMode($betaMode = true) { $this->enableBetaMode = $betaMode; } /** * Returns the base Graph URL. * * @param boolean $postToVideoUrl Post to the video API if videos are being uploaded. * * @return string */ public function getBaseGraphUrl($postToVideoUrl = false) { if ($postToVideoUrl) { return $this->enableBetaMode ? static::BASE_GRAPH_VIDEO_URL_BETA : static::BASE_GRAPH_VIDEO_URL; } return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL; } /** * Prepares the request for sending to the client handler. * * @param FacebookRequest $request * * @return array */ public function prepareRequestMessage(FacebookRequest $request) { $postToVideoUrl = $request->containsVideoUploads(); $url = $this->getBaseGraphUrl($postToVideoUrl) . $request->getUrl(); // If we're sending files they should be sent as multipart/form-data if ($request->containsFileUploads()) { $requestBody = $request->getMultipartBody(); $request->setHeaders([ 'Content-Type' => 'multipart/form-data; boundary=' . $requestBody->getBoundary(), ]); } else { $requestBody = $request->getUrlEncodedBody(); $request->setHeaders([ 'Content-Type' => 'application/x-www-form-urlencoded', ]); } return [ $url, $request->getMethod(), $request->getHeaders(), $requestBody->getBody(), ]; } /** * Makes the request to Graph and returns the result. * * @param FacebookRequest $request * * @return FacebookResponse * * @throws FacebookSDKException */ public function sendRequest(FacebookRequest $request) { if (get_class($request) === 'FacebookRequest') { $request->validateAccessToken(); } list($url, $method, $headers, $body) = $this->prepareRequestMessage($request); // Since file uploads can take a while, we need to give more time for uploads $timeOut = static::DEFAULT_REQUEST_TIMEOUT; if ($request->containsFileUploads()) { $timeOut = static::DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT; } elseif ($request->containsVideoUploads()) { $timeOut = static::DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT; } // Should throw `FacebookSDKException` exception on HTTP client error. // Don't catch to allow it to bubble up. $rawResponse = $this->httpClientHandler->send($url, $method, $body, $headers, $timeOut); static::$requestCount++; $returnResponse = new FacebookResponse( $request, $rawResponse->getBody(), $rawResponse->getHttpResponseCode(), $rawResponse->getHeaders() ); if ($returnResponse->isError()) { throw $returnResponse->getThrownException(); } return $returnResponse; } /** * Makes a batched request to Graph and returns the result. * * @param FacebookBatchRequest $request * * @return FacebookBatchResponse * * @throws FacebookSDKException */ public function sendBatchRequest(FacebookBatchRequest $request) { $request->prepareRequestsForBatch(); $facebookResponse = $this->sendRequest($request); return new FacebookBatchResponse($request, $facebookResponse); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FacebookRequest.php000066400000000000000000000315211361462701300276260ustar00rootroot00000000000000setApp($app); $this->setAccessToken($accessToken); $this->setMethod($method); $this->setEndpoint($endpoint); $this->setParams($params); $this->setETag($eTag); $this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; } /** * Set the access token for this request. * * @param AccessToken|string * * @return FacebookRequest */ public function setAccessToken($accessToken) { $this->accessToken = $accessToken; if ($accessToken instanceof AccessToken) { $this->accessToken = $accessToken->getValue(); } return $this; } /** * Sets the access token with one harvested from a URL or POST params. * * @param string $accessToken The access token. * * @return FacebookRequest * * @throws FacebookSDKException */ public function setAccessTokenFromParams($accessToken) { $existingAccessToken = $this->getAccessToken(); if (!$existingAccessToken) { $this->setAccessToken($accessToken); } elseif ($accessToken !== $existingAccessToken) { throw new FacebookSDKException('Access token mismatch. The access token provided in the FacebookRequest and the one provided in the URL or POST params do not match.'); } return $this; } /** * Return the access token for this request. * * @return string|null */ public function getAccessToken() { return $this->accessToken; } /** * Return the access token for this request an an AccessToken entity. * * @return AccessToken|null */ public function getAccessTokenEntity() { return $this->accessToken ? new AccessToken($this->accessToken) : null; } /** * Set the FacebookApp entity used for this request. * * @param FacebookApp|null $app */ public function setApp(FacebookApp $app = null) { $this->app = $app; } /** * Return the FacebookApp entity used for this request. * * @return FacebookApp */ public function getApp() { return $this->app; } /** * Generate an app secret proof to sign this request. * * @return string|null */ public function getAppSecretProof() { if (!$accessTokenEntity = $this->getAccessTokenEntity()) { return null; } return $accessTokenEntity->getAppSecretProof($this->app->getSecret()); } /** * Validate that an access token exists for this request. * * @throws FacebookSDKException */ public function validateAccessToken() { $accessToken = $this->getAccessToken(); if (!$accessToken) { throw new FacebookSDKException('You must provide an access token.'); } } /** * Set the HTTP method for this request. * * @param string * * @return FacebookRequest */ public function setMethod($method) { $this->method = strtoupper($method); } /** * Return the HTTP method for this request. * * @return string */ public function getMethod() { return $this->method; } /** * Validate that the HTTP method is set. * * @throws FacebookSDKException */ public function validateMethod() { if (!$this->method) { throw new FacebookSDKException('HTTP method not specified.'); } if (!in_array($this->method, ['GET', 'POST', 'DELETE'])) { throw new FacebookSDKException('Invalid HTTP method specified.'); } } /** * Set the endpoint for this request. * * @param string * * @return FacebookRequest * * @throws FacebookSDKException */ public function setEndpoint($endpoint) { // Harvest the access token from the endpoint to keep things in sync $params = FacebookUrlManipulator::getParamsAsArray($endpoint); if (isset($params['access_token'])) { $this->setAccessTokenFromParams($params['access_token']); } // Clean the token & app secret proof from the endpoint. $filterParams = ['access_token', 'appsecret_proof']; $this->endpoint = FacebookUrlManipulator::removeParamsFromUrl($endpoint, $filterParams); return $this; } /** * Return the HTTP method for this request. * * @return string */ public function getEndpoint() { // For batch requests, this will be empty return $this->endpoint; } /** * Generate and return the headers for this request. * * @return array */ public function getHeaders() { $headers = static::getDefaultHeaders(); if ($this->eTag) { $headers['If-None-Match'] = $this->eTag; } return array_merge($this->headers, $headers); } /** * Set the headers for this request. * * @param array $headers */ public function setHeaders(array $headers) { $this->headers = array_merge($this->headers, $headers); } /** * Sets the eTag value. * * @param string $eTag */ public function setETag($eTag) { $this->eTag = $eTag; } /** * Set the params for this request. * * @param array $params * * @return FacebookRequest * * @throws FacebookSDKException */ public function setParams(array $params = []) { if (isset($params['access_token'])) { $this->setAccessTokenFromParams($params['access_token']); } // Don't let these buggers slip in. unset($params['access_token'], $params['appsecret_proof']); // @TODO Refactor code above with this //$params = $this->sanitizeAuthenticationParams($params); $params = $this->sanitizeFileParams($params); $this->dangerouslySetParams($params); return $this; } /** * Set the params for this request without filtering them first. * * @param array $params * * @return FacebookRequest */ public function dangerouslySetParams(array $params = []) { $this->params = array_merge($this->params, $params); return $this; } /** * Iterate over the params and pull out the file uploads. * * @param array $params * * @return array */ public function sanitizeFileParams(array $params) { foreach ($params as $key => $value) { if ($value instanceof FacebookFile) { $this->addFile($key, $value); unset($params[$key]); } } return $params; } /** * Add a file to be uploaded. * * @param string $key * @param FacebookFile $file */ public function addFile($key, FacebookFile $file) { $this->files[$key] = $file; } /** * Removes all the files from the upload queue. */ public function resetFiles() { $this->files = []; } /** * Get the list of files to be uploaded. * * @return array */ public function getFiles() { return $this->files; } /** * Let's us know if there is a file upload with this request. * * @return boolean */ public function containsFileUploads() { return !empty($this->files); } /** * Let's us know if there is a video upload with this request. * * @return boolean */ public function containsVideoUploads() { foreach ($this->files as $file) { if ($file instanceof FacebookVideo) { return true; } } return false; } /** * Returns the body of the request as multipart/form-data. * * @return RequestBodyMultipart */ public function getMultipartBody() { $params = $this->getPostParams(); return new RequestBodyMultipart($params, $this->files); } /** * Returns the body of the request as URL-encoded. * * @return RequestBodyUrlEncoded */ public function getUrlEncodedBody() { $params = $this->getPostParams(); return new RequestBodyUrlEncoded($params); } /** * Generate and return the params for this request. * * @return array */ public function getParams() { $params = $this->params; $accessToken = $this->getAccessToken(); if ($accessToken) { $params['access_token'] = $accessToken; $params['appsecret_proof'] = $this->getAppSecretProof(); } return $params; } /** * Only return params on POST requests. * * @return array */ public function getPostParams() { if ($this->getMethod() === 'POST') { return $this->getParams(); } return []; } /** * The graph version used for this request. * * @return string */ public function getGraphVersion() { return $this->graphVersion; } /** * Generate and return the URL for this request. * * @return string */ public function getUrl() { $this->validateMethod(); $graphVersion = FacebookUrlManipulator::forceSlashPrefix($this->graphVersion); $endpoint = FacebookUrlManipulator::forceSlashPrefix($this->getEndpoint()); $url = $graphVersion . $endpoint; if ($this->getMethod() !== 'POST') { $params = $this->getParams(); $url = FacebookUrlManipulator::appendParamsToUrl($url, $params); } return $url; } /** * Return the default headers that every request should use. * * @return array */ public static function getDefaultHeaders() { return [ 'User-Agent' => 'fb-php-' . Facebook::VERSION, 'Accept-Encoding' => '*', ]; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FacebookResponse.php000066400000000000000000000244461361462701300300040ustar00rootroot00000000000000request = $request; $this->body = $body; $this->httpStatusCode = $httpStatusCode; $this->headers = $headers; $this->decodeBody(); } /** * Return the original request that returned this response. * * @return FacebookRequest */ public function getRequest() { return $this->request; } /** * Return the FacebookApp entity used for this response. * * @return FacebookApp */ public function getApp() { return $this->request->getApp(); } /** * Return the access token that was used for this response. * * @return string|null */ public function getAccessToken() { return $this->request->getAccessToken(); } /** * Return the HTTP status code for this response. * * @return int */ public function getHttpStatusCode() { return $this->httpStatusCode; } /** * Return the HTTP headers for this response. * * @return array */ public function getHeaders() { return $this->headers; } /** * Return the raw body response. * * @return string */ public function getBody() { return $this->body; } /** * Return the decoded body response. * * @return array */ public function getDecodedBody() { return $this->decodedBody; } /** * Get the app secret proof that was used for this response. * * @return string|null */ public function getAppSecretProof() { return $this->request->getAppSecretProof(); } /** * Get the ETag associated with the response. * * @return string|null */ public function getETag() { return isset($this->headers['ETag']) ? $this->headers['ETag'] : null; } /** * Get the version of Graph that returned this response. * * @return string|null */ public function getGraphVersion() { return isset($this->headers['Facebook-API-Version']) ? $this->headers['Facebook-API-Version'] : null; } /** * Returns true if Graph returned an error message. * * @return boolean */ public function isError() { return isset($this->decodedBody['error']); } /** * Throws the exception. * * @throws FacebookSDKException */ public function throwException() { throw $this->thrownException; } /** * Instantiates an exception to be thrown later. */ public function makeException() { $this->thrownException = FacebookResponseException::create($this); } /** * Returns the exception that was thrown for this request. * * @return FacebookSDKException|null */ public function getThrownException() { return $this->thrownException; } /** * Convert the raw response into an array if possible. * * Graph will return 2 types of responses: * - JSON(P) * Most responses from Grpah are JSON(P) * - application/x-www-form-urlencoded key/value pairs * Happens on the `/oauth/access_token` endpoint when exchanging * a short-lived access token for a long-lived access token * - And sometimes nothing :/ but that'd be a bug. */ public function decodeBody() { $this->decodedBody = json_decode($this->body, true); if ($this->decodedBody === null) { $this->decodedBody = []; parse_str($this->body, $this->decodedBody); } elseif (is_bool($this->decodedBody)) { // Backwards compatibility for Graph < 2.1. // Mimics 2.1 responses. // @TODO Remove this after Graph 2.0 is no longer supported $this->decodedBody = ['success' => $this->decodedBody]; } elseif (is_numeric($this->decodedBody)) { $this->decodedBody = ['id' => $this->decodedBody]; } if (!is_array($this->decodedBody)) { $this->decodedBody = []; } if ($this->isError()) { $this->makeException(); } } /** * Instantiate a new GraphObject from response. * * @param string|null $subclassName The GraphNode sub class to cast to. * * @return \Facebook\GraphNodes\GraphObject * * @throws FacebookSDKException * * @deprecated 5.0.0 getGraphObject() has been renamed to getGraphNode() * @todo v6: Remove this method */ public function getGraphObject($subclassName = null) { return $this->getGraphNode($subclassName); } /** * Instantiate a new GraphNode from response. * * @param string|null $subclassName The GraphNode sub class to cast to. * * @return \Facebook\GraphNodes\GraphNode * * @throws FacebookSDKException */ public function getGraphNode($subclassName = null) { $factory = new GraphNodeFactory($this); return $factory->makeGraphNode($subclassName); } /** * Convenience method for creating a GraphAlbum collection. * * @return \Facebook\GraphNodes\GraphAlbum * * @throws FacebookSDKException */ public function getGraphAlbum() { $factory = new GraphNodeFactory($this); return $factory->makeGraphAlbum(); } /** * Convenience method for creating a GraphPage collection. * * @return \Facebook\GraphNodes\GraphPage * * @throws FacebookSDKException */ public function getGraphPage() { $factory = new GraphNodeFactory($this); return $factory->makeGraphPage(); } /** * Convenience method for creating a GraphSessionInfo collection. * * @return \Facebook\GraphNodes\GraphSessionInfo * * @throws FacebookSDKException */ public function getGraphSessionInfo() { $factory = new GraphNodeFactory($this); return $factory->makeGraphSessionInfo(); } /** * Convenience method for creating a GraphUser collection. * * @return \Facebook\GraphNodes\GraphUser * * @throws FacebookSDKException */ public function getGraphUser() { $factory = new GraphNodeFactory($this); return $factory->makeGraphUser(); } /** * Convenience method for creating a GraphEvent collection. * * @return \Facebook\GraphNodes\GraphEvent * * @throws FacebookSDKException */ public function getGraphEvent() { $factory = new GraphNodeFactory($this); return $factory->makeGraphEvent(); } /** * Convenience method for creating a GraphGroup collection. * * @return \Facebook\GraphNodes\GraphGroup * * @throws FacebookSDKException */ public function getGraphGroup() { $factory = new GraphNodeFactory($this); return $factory->makeGraphGroup(); } /** * Instantiate a new GraphList from response. * * @param string|null $subclassName The GraphNode sub class to cast list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return \Facebook\GraphNodes\GraphList * * @throws FacebookSDKException * * @deprecated 5.0.0 getGraphList() has been renamed to getGraphEdge() * @todo v6: Remove this method */ public function getGraphList($subclassName = null, $auto_prefix = true) { return $this->getGraphEdge($subclassName, $auto_prefix); } /** * Instantiate a new GraphEdge from response. * * @param string|null $subclassName The GraphNode sub class to cast list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return \Facebook\GraphNodes\GraphEdge * * @throws FacebookSDKException */ public function getGraphEdge($subclassName = null, $auto_prefix = true) { $factory = new GraphNodeFactory($this); return $factory->makeGraphEdge($subclassName, $auto_prefix); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FileUpload/000077500000000000000000000000001361462701300260555ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FileUpload/FacebookFile.php000066400000000000000000000065011361462701300311010ustar00rootroot00000000000000path = $filePath; $this->open(); } /** * Closes the stream when destructed. */ public function __destruct() { $this->close(); } /** * Opens a stream for the file. * * @throws FacebookSDKException */ public function open() { if (!$this->isRemoteFile($this->path) && !is_readable($this->path)) { throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to read resource: ' . $this->path . '.'); } $this->stream = fopen($this->path, 'r'); if (!$this->stream) { throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to open resource: ' . $this->path . '.'); } } /** * Stops the file stream. */ public function close() { if (is_resource($this->stream)) { fclose($this->stream); } } /** * Return the contents of the file. * * @return string */ public function getContents() { return stream_get_contents($this->stream); } /** * Return the name of the file. * * @return string */ public function getFileName() { return basename($this->path); } /** * Return the mimetype of the file. * * @return string */ public function getMimetype() { return Mimetypes::getInstance()->fromFilename($this->path) ?: 'text/plain'; } /** * Returns true if the path to the file is remote. * * @param string $pathToFile * * @return boolean */ protected function isRemoteFile($pathToFile) { return preg_match('/^(https?|ftp):\/\/.*/', $pathToFile) === 1; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/FileUpload/FacebookVideo.php000066400000000000000000000022761361462701300312750ustar00rootroot00000000000000 'text/vnd.in3d.3dml', '3g2' => 'video/3gpp2', '3gp' => 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aab' => 'application/x-authorware-bin', 'aac' => 'audio/x-aac', 'aam' => 'application/x-authorware-map', 'aas' => 'application/x-authorware-seg', 'abw' => 'application/x-abiword', 'ac' => 'application/pkix-attr-cert', 'acc' => 'application/vnd.americandynamics.acc', 'ace' => 'application/x-ace-compressed', 'acu' => 'application/vnd.acucobol', 'acutc' => 'application/vnd.acucorp', 'adp' => 'audio/adpcm', 'aep' => 'application/vnd.audiograph', 'afm' => 'application/x-font-type1', 'afp' => 'application/vnd.ibm.modcap', 'ahead' => 'application/vnd.ahead.space', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'air' => 'application/vnd.adobe.air-application-installer-package+zip', 'ait' => 'application/vnd.dvb.ait', 'ami' => 'application/vnd.amiga.ami', 'apk' => 'application/vnd.android.package-archive', 'application' => 'application/x-ms-application', 'apr' => 'application/vnd.lotus-approach', 'asa' => 'text/plain', 'asax' => 'application/octet-stream', 'asc' => 'application/pgp-signature', 'ascx' => 'text/plain', 'asf' => 'video/x-ms-asf', 'ashx' => 'text/plain', 'asm' => 'text/x-asm', 'asmx' => 'text/plain', 'aso' => 'application/vnd.accpac.simply.aso', 'asp' => 'text/plain', 'aspx' => 'text/plain', 'asx' => 'video/x-ms-asf', 'atc' => 'application/vnd.acucorp', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/basic', 'avi' => 'video/x-msvideo', 'aw' => 'application/applixware', 'axd' => 'text/plain', 'azf' => 'application/vnd.airzip.filesecure.azf', 'azs' => 'application/vnd.airzip.filesecure.azs', 'azw' => 'application/vnd.amazon.ebook', 'bat' => 'application/x-msdownload', 'bcpio' => 'application/x-bcpio', 'bdf' => 'application/x-font-bdf', 'bdm' => 'application/vnd.syncml.dm+wbxml', 'bed' => 'application/vnd.realvnc.bed', 'bh2' => 'application/vnd.fujitsu.oasysprs', 'bin' => 'application/octet-stream', 'bmi' => 'application/vnd.bmi', 'bmp' => 'image/bmp', 'book' => 'application/vnd.framemaker', 'box' => 'application/vnd.previewsystems.box', 'boz' => 'application/x-bzip2', 'bpk' => 'application/octet-stream', 'btif' => 'image/prs.btif', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'c' => 'text/x-c', 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', 'c4d' => 'application/vnd.clonk.c4group', 'c4f' => 'application/vnd.clonk.c4group', 'c4g' => 'application/vnd.clonk.c4group', 'c4p' => 'application/vnd.clonk.c4group', 'c4u' => 'application/vnd.clonk.c4group', 'cab' => 'application/vnd.ms-cab-compressed', 'car' => 'application/vnd.curl.car', 'cat' => 'application/vnd.ms-pki.seccat', 'cc' => 'text/x-c', 'cct' => 'application/x-director', 'ccxml' => 'application/ccxml+xml', 'cdbcmsg' => 'application/vnd.contact.cmsg', 'cdf' => 'application/x-netcdf', 'cdkey' => 'application/vnd.mediastation.cdkey', 'cdmia' => 'application/cdmi-capability', 'cdmic' => 'application/cdmi-container', 'cdmid' => 'application/cdmi-domain', 'cdmio' => 'application/cdmi-object', 'cdmiq' => 'application/cdmi-queue', 'cdx' => 'chemical/x-cdx', 'cdxml' => 'application/vnd.chemdraw+xml', 'cdy' => 'application/vnd.cinderella', 'cer' => 'application/pkix-cert', 'cfc' => 'application/x-coldfusion', 'cfm' => 'application/x-coldfusion', 'cgm' => 'image/cgm', 'chat' => 'application/x-chat', 'chm' => 'application/vnd.ms-htmlhelp', 'chrt' => 'application/vnd.kde.kchart', 'cif' => 'chemical/x-cif', 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', 'cil' => 'application/vnd.ms-artgalry', 'cla' => 'application/vnd.claymore', 'class' => 'application/java-vm', 'clkk' => 'application/vnd.crick.clicker.keyboard', 'clkp' => 'application/vnd.crick.clicker.palette', 'clkt' => 'application/vnd.crick.clicker.template', 'clkw' => 'application/vnd.crick.clicker.wordbank', 'clkx' => 'application/vnd.crick.clicker', 'clp' => 'application/x-msclip', 'cmc' => 'application/vnd.cosmocaller', 'cmdf' => 'chemical/x-cmdf', 'cml' => 'chemical/x-cml', 'cmp' => 'application/vnd.yellowriver-custom-menu', 'cmx' => 'image/x-cmx', 'cod' => 'application/vnd.rim.cod', 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'cryptonote' => 'application/vnd.rig.cryptonote', 'cs' => 'text/plain', 'csh' => 'application/x-csh', 'csml' => 'chemical/x-csml', 'csp' => 'application/vnd.commonspace', 'css' => 'text/css', 'cst' => 'application/x-director', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'curl' => 'text/vnd.curl', 'cww' => 'application/prs.cww', 'cxt' => 'application/x-director', 'cxx' => 'text/x-c', 'dae' => 'model/vnd.collada+xml', 'daf' => 'application/vnd.mobius.daf', 'dataless' => 'application/vnd.fdsn.seed', 'davmount' => 'application/davmount+xml', 'dcr' => 'application/x-director', 'dcurl' => 'text/vnd.curl.dcurl', 'dd2' => 'application/vnd.oma.dd2+xml', 'ddd' => 'application/vnd.fujixerox.ddd', 'deb' => 'application/x-debian-package', 'def' => 'text/plain', 'deploy' => 'application/octet-stream', 'der' => 'application/x-x509-ca-cert', 'dfac' => 'application/vnd.dreamfactory', 'dic' => 'text/x-c', 'dir' => 'application/x-director', 'dis' => 'application/vnd.mobius.dis', 'dist' => 'application/octet-stream', 'distz' => 'application/octet-stream', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'dll' => 'application/x-msdownload', 'dmg' => 'application/octet-stream', 'dms' => 'application/octet-stream', 'dna' => 'application/vnd.dna', 'doc' => 'application/msword', 'docm' => 'application/vnd.ms-word.document.macroenabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dot' => 'application/msword', 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dp' => 'application/vnd.osgi.dp', 'dpg' => 'application/vnd.dpgraph', 'dra' => 'audio/vnd.dra', 'dsc' => 'text/prs.lines.tag', 'dssc' => 'application/dssc+der', 'dtb' => 'application/x-dtbook+xml', 'dtd' => 'application/xml-dtd', 'dts' => 'audio/vnd.dts', 'dtshd' => 'audio/vnd.dts.hd', 'dump' => 'application/octet-stream', 'dvi' => 'application/x-dvi', 'dwf' => 'model/vnd.dwf', 'dwg' => 'image/vnd.dwg', 'dxf' => 'image/vnd.dxf', 'dxp' => 'application/vnd.spotfire.dxp', 'dxr' => 'application/x-director', 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', 'ecma' => 'application/ecmascript', 'edm' => 'application/vnd.novadigm.edm', 'edx' => 'application/vnd.novadigm.edx', 'efif' => 'application/vnd.picsel', 'ei6' => 'application/vnd.pg.osasli', 'elc' => 'application/octet-stream', 'eml' => 'message/rfc822', 'emma' => 'application/emma+xml', 'eol' => 'audio/vnd.digital-winds', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'es3' => 'application/vnd.eszigno3+xml', 'esf' => 'application/vnd.epson.esf', 'et3' => 'application/vnd.eszigno3+xml', 'etx' => 'text/x-setext', 'exe' => 'application/x-msdownload', 'exi' => 'application/exi', 'ext' => 'application/vnd.novadigm.ext', 'ez' => 'application/andrew-inset', 'ez2' => 'application/vnd.ezpix-album', 'ez3' => 'application/vnd.ezpix-package', 'f' => 'text/x-fortran', 'f4v' => 'video/x-f4v', 'f77' => 'text/x-fortran', 'f90' => 'text/x-fortran', 'fbs' => 'image/vnd.fastbidsheet', 'fcs' => 'application/vnd.isac.fcs', 'fdf' => 'application/vnd.fdf', 'fe_launch' => 'application/vnd.denovo.fcselayout-link', 'fg5' => 'application/vnd.fujitsu.oasysgp', 'fgd' => 'application/x-director', 'fh' => 'image/x-freehand', 'fh4' => 'image/x-freehand', 'fh5' => 'image/x-freehand', 'fh7' => 'image/x-freehand', 'fhc' => 'image/x-freehand', 'fig' => 'application/x-xfig', 'fli' => 'video/x-fli', 'flo' => 'application/vnd.micrografx.flo', 'flv' => 'video/x-flv', 'flw' => 'application/vnd.kde.kivio', 'flx' => 'text/vnd.fmi.flexstor', 'fly' => 'text/vnd.fly', 'fm' => 'application/vnd.framemaker', 'fnc' => 'application/vnd.frogans.fnc', 'for' => 'text/x-fortran', 'fpx' => 'image/vnd.fpx', 'frame' => 'application/vnd.framemaker', 'fsc' => 'application/vnd.fsc.weblaunch', 'fst' => 'image/vnd.fst', 'ftc' => 'application/vnd.fluxtime.clip', 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', 'fvt' => 'video/vnd.fvt', 'fxp' => 'application/vnd.adobe.fxp', 'fxpl' => 'application/vnd.adobe.fxp', 'fzs' => 'application/vnd.fuzzysheet', 'g2w' => 'application/vnd.geoplan', 'g3' => 'image/g3fax', 'g3w' => 'application/vnd.geospace', 'gac' => 'application/vnd.groove-account', 'gdl' => 'model/vnd.gdl', 'geo' => 'application/vnd.dynageo', 'gex' => 'application/vnd.geometry-explorer', 'ggb' => 'application/vnd.geogebra.file', 'ggt' => 'application/vnd.geogebra.tool', 'ghf' => 'application/vnd.groove-help', 'gif' => 'image/gif', 'gim' => 'application/vnd.groove-identity-message', 'gmx' => 'application/vnd.gmx', 'gnumeric' => 'application/x-gnumeric', 'gph' => 'application/vnd.flographit', 'gqf' => 'application/vnd.grafeq', 'gqs' => 'application/vnd.grafeq', 'gram' => 'application/srgs', 'gre' => 'application/vnd.geometry-explorer', 'grv' => 'application/vnd.groove-injector', 'grxml' => 'application/srgs+xml', 'gsf' => 'application/x-font-ghostscript', 'gtar' => 'application/x-gtar', 'gtm' => 'application/vnd.groove-tool-message', 'gtw' => 'model/vnd.gtw', 'gv' => 'text/vnd.graphviz', 'gxt' => 'application/vnd.geonext', 'h' => 'text/x-c', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'hal' => 'application/vnd.hal+xml', 'hbci' => 'application/vnd.hbci', 'hdf' => 'application/x-hdf', 'hh' => 'text/x-c', 'hlp' => 'application/winhlp', 'hpgl' => 'application/vnd.hp-hpgl', 'hpid' => 'application/vnd.hp-hpid', 'hps' => 'application/vnd.hp-hps', 'hqx' => 'application/mac-binhex40', 'hta' => 'application/octet-stream', 'htc' => 'text/html', 'htke' => 'application/vnd.kenameaapp', 'htm' => 'text/html', 'html' => 'text/html', 'hvd' => 'application/vnd.yamaha.hv-dic', 'hvp' => 'application/vnd.yamaha.hv-voice', 'hvs' => 'application/vnd.yamaha.hv-script', 'i2g' => 'application/vnd.intergeo', 'icc' => 'application/vnd.iccprofile', 'ice' => 'x-conference/x-cooltalk', 'icm' => 'application/vnd.iccprofile', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ief' => 'image/ief', 'ifb' => 'text/calendar', 'ifm' => 'application/vnd.shana.informed.formdata', 'iges' => 'model/iges', 'igl' => 'application/vnd.igloader', 'igm' => 'application/vnd.insors.igm', 'igs' => 'model/iges', 'igx' => 'application/vnd.micrografx.igx', 'iif' => 'application/vnd.shana.informed.interchange', 'imp' => 'application/vnd.accpac.simply.imp', 'ims' => 'application/vnd.ms-ims', 'in' => 'text/plain', 'ini' => 'text/plain', 'ipfix' => 'application/ipfix', 'ipk' => 'application/vnd.shana.informed.package', 'irm' => 'application/vnd.ibm.rights-management', 'irp' => 'application/vnd.irepository.package+xml', 'iso' => 'application/octet-stream', 'itp' => 'application/vnd.shana.informed.formtemplate', 'ivp' => 'application/vnd.immervision-ivp', 'ivu' => 'application/vnd.immervision-ivu', 'jad' => 'text/vnd.sun.j2me.app-descriptor', 'jam' => 'application/vnd.jam', 'jar' => 'application/java-archive', 'java' => 'text/x-java-source', 'jisp' => 'application/vnd.jisp', 'jlt' => 'application/vnd.hp-jlyt', 'jnlp' => 'application/x-java-jnlp-file', 'joda' => 'application/vnd.joost.joda-archive', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpgm' => 'video/jpm', 'jpgv' => 'video/jpeg', 'jpm' => 'video/jpm', 'js' => 'text/javascript', 'json' => 'application/json', 'kar' => 'audio/midi', 'karbon' => 'application/vnd.kde.karbon', 'kfo' => 'application/vnd.kde.kformula', 'kia' => 'application/vnd.kidspiration', 'kml' => 'application/vnd.google-earth.kml+xml', 'kmz' => 'application/vnd.google-earth.kmz', 'kne' => 'application/vnd.kinar', 'knp' => 'application/vnd.kinar', 'kon' => 'application/vnd.kde.kontour', 'kpr' => 'application/vnd.kde.kpresenter', 'kpt' => 'application/vnd.kde.kpresenter', 'ksp' => 'application/vnd.kde.kspread', 'ktr' => 'application/vnd.kahootz', 'ktx' => 'image/ktx', 'ktz' => 'application/vnd.kahootz', 'kwd' => 'application/vnd.kde.kword', 'kwt' => 'application/vnd.kde.kword', 'lasxml' => 'application/vnd.las.las+xml', 'latex' => 'application/x-latex', 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', 'les' => 'application/vnd.hhe.lesson-player', 'lha' => 'application/octet-stream', 'link66' => 'application/vnd.route66.link66+xml', 'list' => 'text/plain', 'list3820' => 'application/vnd.ibm.modcap', 'listafp' => 'application/vnd.ibm.modcap', 'log' => 'text/plain', 'lostxml' => 'application/lost+xml', 'lrf' => 'application/octet-stream', 'lrm' => 'application/vnd.ms-lrm', 'ltf' => 'application/vnd.frogans.ltf', 'lvp' => 'audio/vnd.lucent.voice', 'lwp' => 'application/vnd.lotus-wordpro', 'lzh' => 'application/octet-stream', 'm13' => 'application/x-msmediaview', 'm14' => 'application/x-msmediaview', 'm1v' => 'video/mpeg', 'm21' => 'application/mp21', 'm2a' => 'audio/mpeg', 'm2v' => 'video/mpeg', 'm3a' => 'audio/mpeg', 'm3u' => 'audio/x-mpegurl', 'm3u8' => 'application/vnd.apple.mpegurl', 'm4a' => 'audio/mp4', 'm4u' => 'video/vnd.mpegurl', 'm4v' => 'video/mp4', 'ma' => 'application/mathematica', 'mads' => 'application/mads+xml', 'mag' => 'application/vnd.ecowin.chart', 'maker' => 'application/vnd.framemaker', 'man' => 'text/troff', 'mathml' => 'application/mathml+xml', 'mb' => 'application/mathematica', 'mbk' => 'application/vnd.mobius.mbk', 'mbox' => 'application/mbox', 'mc1' => 'application/vnd.medcalcdata', 'mcd' => 'application/vnd.mcd', 'mcurl' => 'text/vnd.curl.mcurl', 'mdb' => 'application/x-msaccess', 'mdi' => 'image/vnd.ms-modi', 'me' => 'text/troff', 'mesh' => 'model/mesh', 'meta4' => 'application/metalink4+xml', 'mets' => 'application/mets+xml', 'mfm' => 'application/vnd.mfmp', 'mgp' => 'application/vnd.osgeo.mapguide.package', 'mgz' => 'application/vnd.proteus.magazine', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mif' => 'application/vnd.mif', 'mime' => 'message/rfc822', 'mj2' => 'video/mj2', 'mjp2' => 'video/mj2', 'mlp' => 'application/vnd.dolby.mlp', 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', 'mmf' => 'application/vnd.smaf', 'mmr' => 'image/vnd.fujixerox.edmics-mmr', 'mny' => 'application/x-msmoney', 'mobi' => 'application/x-mobipocket-ebook', 'mods' => 'application/mods+xml', 'mov' => 'video/quicktime', 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp21' => 'application/mp21', 'mp2a' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4s' => 'application/mp4', 'mp4v' => 'video/mp4', 'mpc' => 'application/vnd.mophun.certificate', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', 'mpkg' => 'application/vnd.apple.installer+xml', 'mpm' => 'application/vnd.blueice.multipass', 'mpn' => 'application/vnd.mophun.application', 'mpp' => 'application/vnd.ms-project', 'mpt' => 'application/vnd.ms-project', 'mpy' => 'application/vnd.ibm.minipay', 'mqy' => 'application/vnd.mobius.mqy', 'mrc' => 'application/marc', 'mrcx' => 'application/marcxml+xml', 'ms' => 'text/troff', 'mscml' => 'application/mediaservercontrol+xml', 'mseed' => 'application/vnd.fdsn.mseed', 'mseq' => 'application/vnd.mseq', 'msf' => 'application/vnd.epson.msf', 'msh' => 'model/mesh', 'msi' => 'application/x-msdownload', 'msl' => 'application/vnd.mobius.msl', 'msty' => 'application/vnd.muvee.style', 'mts' => 'model/vnd.mts', 'mus' => 'application/vnd.musician', 'musicxml' => 'application/vnd.recordare.musicxml+xml', 'mvb' => 'application/x-msmediaview', 'mwf' => 'application/vnd.mfer', 'mxf' => 'application/mxf', 'mxl' => 'application/vnd.recordare.musicxml', 'mxml' => 'application/xv+xml', 'mxs' => 'application/vnd.triscape.mxs', 'mxu' => 'video/vnd.mpegurl', 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', 'n3' => 'text/n3', 'nb' => 'application/mathematica', 'nbp' => 'application/vnd.wolfram.player', 'nc' => 'application/x-netcdf', 'ncx' => 'application/x-dtbncx+xml', 'ngdat' => 'application/vnd.nokia.n-gage.data', 'nlu' => 'application/vnd.neurolanguage.nlu', 'nml' => 'application/vnd.enliven', 'nnd' => 'application/vnd.noblenet-directory', 'nns' => 'application/vnd.noblenet-sealer', 'nnw' => 'application/vnd.noblenet-web', 'npx' => 'image/vnd.net-fpx', 'nsf' => 'application/vnd.lotus-notes', 'oa2' => 'application/vnd.fujitsu.oasys2', 'oa3' => 'application/vnd.fujitsu.oasys3', 'oas' => 'application/vnd.fujitsu.oasys', 'obd' => 'application/x-msbinder', 'oda' => 'application/oda', 'odb' => 'application/vnd.oasis.opendocument.database', 'odc' => 'application/vnd.oasis.opendocument.chart', 'odf' => 'application/vnd.oasis.opendocument.formula', 'odft' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'odi' => 'application/vnd.oasis.opendocument.image', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'odt' => 'application/vnd.oasis.opendocument.text', 'oga' => 'audio/ogg', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'onepkg' => 'application/onenote', 'onetmp' => 'application/onenote', 'onetoc' => 'application/onenote', 'onetoc2' => 'application/onenote', 'opf' => 'application/oebps-package+xml', 'oprc' => 'application/vnd.palm', 'org' => 'application/vnd.lotus-organizer', 'osf' => 'application/vnd.yamaha.openscoreformat', 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'otf' => 'application/x-font-otf', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'oth' => 'application/vnd.oasis.opendocument.text-web', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'oxt' => 'application/vnd.openofficeorg.extension', 'p' => 'text/x-pascal', 'p10' => 'application/pkcs10', 'p12' => 'application/x-pkcs12', 'p7b' => 'application/x-pkcs7-certificates', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'p8' => 'application/pkcs8', 'pas' => 'text/x-pascal', 'paw' => 'application/vnd.pawaafile', 'pbd' => 'application/vnd.powerbuilder6', 'pbm' => 'image/x-portable-bitmap', 'pcf' => 'application/x-font-pcf', 'pcl' => 'application/vnd.hp-pcl', 'pclxl' => 'application/vnd.hp-pclxl', 'pct' => 'image/x-pict', 'pcurl' => 'application/vnd.curl.pcurl', 'pcx' => 'image/x-pcx', 'pdb' => 'application/vnd.palm', 'pdf' => 'application/pdf', 'pfa' => 'application/x-font-type1', 'pfb' => 'application/x-font-type1', 'pfm' => 'application/x-font-type1', 'pfr' => 'application/font-tdpfr', 'pfx' => 'application/x-pkcs12', 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp-encrypted', 'php' => 'text/x-php', 'phps' => 'application/x-httpd-phps', 'pic' => 'image/x-pict', 'pkg' => 'application/octet-stream', 'pki' => 'application/pkixcmp', 'pkipath' => 'application/pkix-pkipath', 'plb' => 'application/vnd.3gpp.pic-bw-large', 'plc' => 'application/vnd.mobius.plc', 'plf' => 'application/vnd.pocketlearn', 'pls' => 'application/pls+xml', 'pml' => 'application/vnd.ctc-posml', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'portpkg' => 'application/vnd.macports.portpkg', 'pot' => 'application/vnd.ms-powerpoint', 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppd' => 'application/vnd.cups-ppd', 'ppm' => 'image/x-portable-pixmap', 'pps' => 'application/vnd.ms-powerpoint', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppt' => 'application/vnd.ms-powerpoint', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', 'prc' => 'application/x-mobipocket-ebook', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'ps' => 'application/postscript', 'psb' => 'application/vnd.3gpp.pic-bw-small', 'psd' => 'image/vnd.adobe.photoshop', 'psf' => 'application/x-font-linux-psf', 'pskcxml' => 'application/pskc+xml', 'ptid' => 'application/vnd.pvi.ptid1', 'pub' => 'application/x-mspublisher', 'pvb' => 'application/vnd.3gpp.pic-bw-var', 'pwn' => 'application/vnd.3m.post-it-notes', 'pya' => 'audio/vnd.ms-playready.media.pya', 'pyv' => 'video/vnd.ms-playready.media.pyv', 'qam' => 'application/vnd.epson.quickanime', 'qbo' => 'application/vnd.intu.qbo', 'qfx' => 'application/vnd.intu.qfx', 'qps' => 'application/vnd.publishare-delta-tree', 'qt' => 'video/quicktime', 'qwd' => 'application/vnd.quark.quarkxpress', 'qwt' => 'application/vnd.quark.quarkxpress', 'qxb' => 'application/vnd.quark.quarkxpress', 'qxd' => 'application/vnd.quark.quarkxpress', 'qxl' => 'application/vnd.quark.quarkxpress', 'qxt' => 'application/vnd.quark.quarkxpress', 'ra' => 'audio/x-pn-realaudio', 'ram' => 'audio/x-pn-realaudio', 'rar' => 'application/x-rar-compressed', 'ras' => 'image/x-cmu-raster', 'rb' => 'text/plain', 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', 'rdf' => 'application/rdf+xml', 'rdz' => 'application/vnd.data-vision.rdz', 'rep' => 'application/vnd.businessobjects', 'res' => 'application/x-dtbresource+xml', 'resx' => 'text/xml', 'rgb' => 'image/x-rgb', 'rif' => 'application/reginfo+xml', 'rip' => 'audio/vnd.rip', 'rl' => 'application/resource-lists+xml', 'rlc' => 'image/vnd.fujixerox.edmics-rlc', 'rld' => 'application/resource-lists-diff+xml', 'rm' => 'application/vnd.rn-realmedia', 'rmi' => 'audio/midi', 'rmp' => 'audio/x-pn-realaudio-plugin', 'rms' => 'application/vnd.jcp.javame.midlet-rms', 'rnc' => 'application/relax-ng-compact-syntax', 'roff' => 'text/troff', 'rp9' => 'application/vnd.cloanto.rp9', 'rpss' => 'application/vnd.nokia.radio-presets', 'rpst' => 'application/vnd.nokia.radio-preset', 'rq' => 'application/sparql-query', 'rs' => 'application/rls-services+xml', 'rsd' => 'application/rsd+xml', 'rss' => 'application/rss+xml', 'rtf' => 'application/rtf', 'rtx' => 'text/richtext', 's' => 'text/x-asm', 'saf' => 'application/vnd.yamaha.smaf-audio', 'sbml' => 'application/sbml+xml', 'sc' => 'application/vnd.ibm.secure-container', 'scd' => 'application/x-msschedule', 'scm' => 'application/vnd.lotus-screencam', 'scq' => 'application/scvp-cv-request', 'scs' => 'application/scvp-cv-response', 'scurl' => 'text/vnd.curl.scurl', 'sda' => 'application/vnd.stardivision.draw', 'sdc' => 'application/vnd.stardivision.calc', 'sdd' => 'application/vnd.stardivision.impress', 'sdkd' => 'application/vnd.solent.sdkm+xml', 'sdkm' => 'application/vnd.solent.sdkm+xml', 'sdp' => 'application/sdp', 'sdw' => 'application/vnd.stardivision.writer', 'see' => 'application/vnd.seemail', 'seed' => 'application/vnd.fdsn.seed', 'sema' => 'application/vnd.sema', 'semd' => 'application/vnd.semd', 'semf' => 'application/vnd.semf', 'ser' => 'application/java-serialized-object', 'setpay' => 'application/set-payment-initiation', 'setreg' => 'application/set-registration-initiation', 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', 'sfs' => 'application/vnd.spotfire.sfs', 'sgl' => 'application/vnd.stardivision.writer-global', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'shf' => 'application/shf+xml', 'sig' => 'application/pgp-signature', 'silo' => 'model/mesh', 'sis' => 'application/vnd.symbian.install', 'sisx' => 'application/vnd.symbian.install', 'sit' => 'application/x-stuffit', 'sitx' => 'application/x-stuffitx', 'skd' => 'application/vnd.koan', 'skm' => 'application/vnd.koan', 'skp' => 'application/vnd.koan', 'skt' => 'application/vnd.koan', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'slt' => 'application/vnd.epson.salt', 'sm' => 'application/vnd.stepmania.stepchart', 'smf' => 'application/vnd.stardivision.math', 'smi' => 'application/smil+xml', 'smil' => 'application/smil+xml', 'snd' => 'audio/basic', 'snf' => 'application/x-font-snf', 'so' => 'application/octet-stream', 'spc' => 'application/x-pkcs7-certificates', 'spf' => 'application/vnd.yamaha.smaf-phrase', 'spl' => 'application/x-futuresplash', 'spot' => 'text/vnd.in3d.spot', 'spp' => 'application/scvp-vp-response', 'spq' => 'application/scvp-vp-request', 'spx' => 'audio/ogg', 'src' => 'application/x-wais-source', 'sru' => 'application/sru+xml', 'srx' => 'application/sparql-results+xml', 'sse' => 'application/vnd.kodak-descriptor', 'ssf' => 'application/vnd.epson.ssf', 'ssml' => 'application/ssml+xml', 'st' => 'application/vnd.sailingtracker.track', 'stc' => 'application/vnd.sun.xml.calc.template', 'std' => 'application/vnd.sun.xml.draw.template', 'stf' => 'application/vnd.wt.stf', 'sti' => 'application/vnd.sun.xml.impress.template', 'stk' => 'application/hyperstudio', 'stl' => 'application/vnd.ms-pki.stl', 'str' => 'application/vnd.pg.format', 'stw' => 'application/vnd.sun.xml.writer.template', 'sub' => 'image/vnd.dvb.subtitle', 'sus' => 'application/vnd.sus-calendar', 'susp' => 'application/vnd.sus-calendar', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'svc' => 'application/vnd.dvb.service', 'svd' => 'application/vnd.svd', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'swa' => 'application/x-director', 'swf' => 'application/x-shockwave-flash', 'swi' => 'application/vnd.aristanetworks.swi', 'sxc' => 'application/vnd.sun.xml.calc', 'sxd' => 'application/vnd.sun.xml.draw', 'sxg' => 'application/vnd.sun.xml.writer.global', 'sxi' => 'application/vnd.sun.xml.impress', 'sxm' => 'application/vnd.sun.xml.math', 'sxw' => 'application/vnd.sun.xml.writer', 't' => 'text/troff', 'tao' => 'application/vnd.tao.intent-module-archive', 'tar' => 'application/x-tar', 'tcap' => 'application/vnd.3gpp2.tcap', 'tcl' => 'application/x-tcl', 'teacher' => 'application/vnd.smart.teacher', 'tei' => 'application/tei+xml', 'teicorpus' => 'application/tei+xml', 'tex' => 'application/x-tex', 'texi' => 'application/x-texinfo', 'texinfo' => 'application/x-texinfo', 'text' => 'text/plain', 'tfi' => 'application/thraud+xml', 'tfm' => 'application/x-tex-tfm', 'thmx' => 'application/vnd.ms-officetheme', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'tmo' => 'application/vnd.tmobile-livetv', 'torrent' => 'application/x-bittorrent', 'tpl' => 'application/vnd.groove-tool-template', 'tpt' => 'application/vnd.trid.tpt', 'tr' => 'text/troff', 'tra' => 'application/vnd.trueapp', 'trm' => 'application/x-msterminal', 'tsd' => 'application/timestamped-data', 'tsv' => 'text/tab-separated-values', 'ttc' => 'application/x-font-ttf', 'ttf' => 'application/x-font-ttf', 'ttl' => 'text/turtle', 'twd' => 'application/vnd.simtech-mindmapper', 'twds' => 'application/vnd.simtech-mindmapper', 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', 'u32' => 'application/x-authorware-bin', 'udeb' => 'application/x-debian-package', 'ufd' => 'application/vnd.ufdl', 'ufdl' => 'application/vnd.ufdl', 'umj' => 'application/vnd.umajin', 'unityweb' => 'application/vnd.unity', 'uoml' => 'application/vnd.uoml+xml', 'uri' => 'text/uri-list', 'uris' => 'text/uri-list', 'urls' => 'text/uri-list', 'ustar' => 'application/x-ustar', 'utz' => 'application/vnd.uiq.theme', 'uu' => 'text/x-uuencode', 'uva' => 'audio/vnd.dece.audio', 'uvd' => 'application/vnd.dece.data', 'uvf' => 'application/vnd.dece.data', 'uvg' => 'image/vnd.dece.graphic', 'uvh' => 'video/vnd.dece.hd', 'uvi' => 'image/vnd.dece.graphic', 'uvm' => 'video/vnd.dece.mobile', 'uvp' => 'video/vnd.dece.pd', 'uvs' => 'video/vnd.dece.sd', 'uvt' => 'application/vnd.dece.ttml+xml', 'uvu' => 'video/vnd.uvvu.mp4', 'uvv' => 'video/vnd.dece.video', 'uvva' => 'audio/vnd.dece.audio', 'uvvd' => 'application/vnd.dece.data', 'uvvf' => 'application/vnd.dece.data', 'uvvg' => 'image/vnd.dece.graphic', 'uvvh' => 'video/vnd.dece.hd', 'uvvi' => 'image/vnd.dece.graphic', 'uvvm' => 'video/vnd.dece.mobile', 'uvvp' => 'video/vnd.dece.pd', 'uvvs' => 'video/vnd.dece.sd', 'uvvt' => 'application/vnd.dece.ttml+xml', 'uvvu' => 'video/vnd.uvvu.mp4', 'uvvv' => 'video/vnd.dece.video', 'uvvx' => 'application/vnd.dece.unspecified', 'uvx' => 'application/vnd.dece.unspecified', 'vcd' => 'application/x-cdlink', 'vcf' => 'text/x-vcard', 'vcg' => 'application/vnd.groove-vcard', 'vcs' => 'text/x-vcalendar', 'vcx' => 'application/vnd.vcx', 'vis' => 'application/vnd.visionary', 'viv' => 'video/vnd.vivo', 'vor' => 'application/vnd.stardivision.writer', 'vox' => 'application/x-authorware-bin', 'vrml' => 'model/vrml', 'vsd' => 'application/vnd.visio', 'vsf' => 'application/vnd.vsf', 'vss' => 'application/vnd.visio', 'vst' => 'application/vnd.visio', 'vsw' => 'application/vnd.visio', 'vtu' => 'model/vnd.vtu', 'vxml' => 'application/voicexml+xml', 'w3d' => 'application/x-director', 'wad' => 'application/x-doom', 'wav' => 'audio/x-wav', 'wax' => 'audio/x-ms-wax', 'wbmp' => 'image/vnd.wap.wbmp', 'wbs' => 'application/vnd.criticaltools.wbs+xml', 'wbxml' => 'application/vnd.wap.wbxml', 'wcm' => 'application/vnd.ms-works', 'wdb' => 'application/vnd.ms-works', 'weba' => 'audio/webm', 'webm' => 'video/webm', 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgt' => 'application/widget', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', 'wmd' => 'application/x-ms-wmd', 'wmf' => 'application/x-msmetafile', 'wml' => 'text/vnd.wap.wml', 'wmlc' => 'application/vnd.wap.wmlc', 'wmls' => 'text/vnd.wap.wmlscript', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wmz' => 'application/x-ms-wmz', 'woff' => 'application/x-font-woff', 'wpd' => 'application/vnd.wordperfect', 'wpl' => 'application/vnd.ms-wpl', 'wps' => 'application/vnd.ms-works', 'wqd' => 'application/vnd.wqd', 'wri' => 'application/x-mswrite', 'wrl' => 'model/vrml', 'wsdl' => 'application/wsdl+xml', 'wspolicy' => 'application/wspolicy+xml', 'wtb' => 'application/vnd.webturbo', 'wvx' => 'video/x-ms-wvx', 'x32' => 'application/x-authorware-bin', 'x3d' => 'application/vnd.hzn-3d-crossword', 'xap' => 'application/x-silverlight-app', 'xar' => 'application/vnd.xara', 'xbap' => 'application/x-ms-xbap', 'xbd' => 'application/vnd.fujixerox.docuworks.binder', 'xbm' => 'image/x-xbitmap', 'xdf' => 'application/xcap-diff+xml', 'xdm' => 'application/vnd.syncml.dm+xml', 'xdp' => 'application/vnd.adobe.xdp+xml', 'xdssc' => 'application/dssc+xml', 'xdw' => 'application/vnd.fujixerox.docuworks', 'xenc' => 'application/xenc+xml', 'xer' => 'application/patch-ops-error+xml', 'xfdf' => 'application/vnd.adobe.xfdf', 'xfdl' => 'application/vnd.xfdl', 'xht' => 'application/xhtml+xml', 'xhtml' => 'application/xhtml+xml', 'xhvml' => 'application/xv+xml', 'xif' => 'image/vnd.xiff', 'xla' => 'application/vnd.ms-excel', 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', 'xlc' => 'application/vnd.ms-excel', 'xlm' => 'application/vnd.ms-excel', 'xls' => 'application/vnd.ms-excel', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlt' => 'application/vnd.ms-excel', 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xlw' => 'application/vnd.ms-excel', 'xml' => 'application/xml', 'xo' => 'application/vnd.olpc-sugar', 'xop' => 'application/xop+xml', 'xpi' => 'application/x-xpinstall', 'xpm' => 'image/x-xpixmap', 'xpr' => 'application/vnd.is-xpr', 'xps' => 'application/vnd.ms-xpsdocument', 'xpw' => 'application/vnd.intercon.formnet', 'xpx' => 'application/vnd.intercon.formnet', 'xsl' => 'application/xml', 'xslt' => 'application/xslt+xml', 'xsm' => 'application/vnd.syncml+xml', 'xspf' => 'application/xspf+xml', 'xul' => 'application/vnd.mozilla.xul+xml', 'xvm' => 'application/xv+xml', 'xvml' => 'application/xv+xml', 'xwd' => 'image/x-xwindowdump', 'xyz' => 'chemical/x-xyz', 'yaml' => 'text/yaml', 'yang' => 'application/yang', 'yin' => 'application/yin+xml', 'yml' => 'text/yaml', 'zaz' => 'application/vnd.zzazz.deck+xml', 'zip' => 'application/zip', 'zir' => 'application/vnd.zul', 'zirz' => 'application/vnd.zul', 'zmm' => 'application/vnd.handheld-entertainment+xml' ]; /** * Get a singleton instance of the class * * @return self * @codeCoverageIgnore */ public static function getInstance() { if (!self::$instance) { self::$instance = new self(); } return self::$instance; } /** * Get a mimetype value from a file extension * * @param string $extension File extension * * @return string|null */ public function fromExtension($extension) { $extension = strtolower($extension); return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; } /** * Get a mimetype from a filename * * @param string $filename Filename to generate a mimetype from * * @return string|null */ public function fromFilename($filename) { return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/000077500000000000000000000000001361462701300260635ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/Collection.php000066400000000000000000000126731361462701300307000ustar00rootroot00000000000000items = $items; } /** * Gets the value of a field from the Graph node. * * @param string $name The field to retrieve. * @param mixed $default The default to return if the field doesn't exist. * * @return mixed */ public function getField($name, $default = null) { if (isset($this->items[$name])) { return $this->items[$name]; } return $default ?: null; } /** * Gets the value of the named property for this graph object. * * @param string $name The property to retrieve. * @param mixed $default The default to return if the property doesn't exist. * * @return mixed * * @deprecated 5.0.0 getProperty() has been renamed to getField() * @todo v6: Remove this method */ public function getProperty($name, $default = null) { return $this->getField($name, $default); } /** * Returns a list of all fields set on the object. * * @return array */ public function getFieldNames() { return array_keys($this->items); } /** * Returns a list of all properties set on the object. * * @return array * * @deprecated 5.0.0 getPropertyNames() has been renamed to getFieldNames() * @todo v6: Remove this method */ public function getPropertyNames() { return $this->getFieldNames(); } /** * Get all of the items in the collection. * * @return array */ public function all() { return $this->items; } /** * Get the collection of items as a plain array. * * @return array */ public function asArray() { return array_map(function ($value) { return $value instanceof Collection ? $value->asArray() : $value; }, $this->items); } /** * Run a map over each of the items. * * @param \Closure $callback * * @return static */ public function map(\Closure $callback) { return new static(array_map($callback, $this->items, array_keys($this->items))); } /** * Get the collection of items as JSON. * * @param int $options * * @return string */ public function asJson($options = 0) { return json_encode($this->asArray(), $options); } /** * Count the number of items in the collection. * * @return int */ public function count() { return count($this->items); } /** * Get an iterator for the items. * * @return ArrayIterator */ public function getIterator() { return new ArrayIterator($this->items); } /** * Determine if an item exists at an offset. * * @param mixed $key * * @return bool */ public function offsetExists($key) { return array_key_exists($key, $this->items); } /** * Get an item at a given offset. * * @param mixed $key * * @return mixed */ public function offsetGet($key) { return $this->items[$key]; } /** * Set the item at a given offset. * * @param mixed $key * @param mixed $value * * @return void */ public function offsetSet($key, $value) { if (is_null($key)) { $this->items[] = $value; } else { $this->items[$key] = $value; } } /** * Unset the item at a given offset. * * @param string $key * * @return void */ public function offsetUnset($key) { unset($this->items[$key]); } /** * Convert the collection to its string representation. * * @return string */ public function __toString() { return $this->asJson(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphAchievement.php000066400000000000000000000055741361462701300320210ustar00rootroot00000000000000 '\Facebook\GraphNodes\GraphUser', 'application' => '\Facebook\GraphNodes\GraphApplication', ]; /** * Returns the ID for the achievement. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the user who achieved this. * * @return GraphUser|null */ public function getFrom() { return $this->getField('from'); } /** * Returns the time at which this was achieved. * * @return \DateTime|null */ public function getPublishTime() { return $this->getField('publish_time'); } /** * Returns the app in which the user achieved this. * * @return GraphApplication|null */ public function getApplication() { return $this->getField('application'); } /** * Returns information about the achievement type this instance is connected with. * * @return array|null */ public function getData() { return $this->getField('data'); } /** * Returns the type of achievement. * * @see https://developers.facebook.com/docs/graph-api/reference/v2.2/achievement * * @return string */ public function getType() { return 'game.achievement'; } /** * Indicates whether gaining the achievement published a feed story for the user. * * @return boolean|null */ public function isNoFeedStory() { return $this->getField('no_feed_story'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphAlbum.php000066400000000000000000000100361361462701300306160ustar00rootroot00000000000000 '\Facebook\GraphNodes\GraphUser', 'place' => '\Facebook\GraphNodes\GraphPage', ]; /** * Returns the ID for the album. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns whether the viewer can upload photos to this album. * * @return boolean|null */ public function getCanUpload() { return $this->getField('can_upload'); } /** * Returns the number of photos in this album. * * @return int|null */ public function getCount() { return $this->getField('count'); } /** * Returns the ID of the album's cover photo. * * @return string|null */ public function getCoverPhoto() { return $this->getField('cover_photo'); } /** * Returns the time the album was initially created. * * @return \DateTime|null */ public function getCreatedTime() { return $this->getField('created_time'); } /** * Returns the time the album was updated. * * @return \DateTime|null */ public function getUpdatedTime() { return $this->getField('updated_time'); } /** * Returns the description of the album. * * @return string|null */ public function getDescription() { return $this->getField('description'); } /** * Returns profile that created the album. * * @return GraphUser|null */ public function getFrom() { return $this->getField('from'); } /** * Returns profile that created the album. * * @return GraphPage|null */ public function getPlace() { return $this->getField('place'); } /** * Returns a link to this album on Facebook. * * @return string|null */ public function getLink() { return $this->getField('link'); } /** * Returns the textual location of the album. * * @return string|null */ public function getLocation() { return $this->getField('location'); } /** * Returns the title of the album. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the privacy settings for the album. * * @return string|null */ public function getPrivacy() { return $this->getField('privacy'); } /** * Returns the type of the album. * * enum{ profile, mobile, wall, normal, album } * * @return string|null */ public function getType() { return $this->getField('type'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphApplication.php000066400000000000000000000025551361462701300320300ustar00rootroot00000000000000getField('id'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphCoverPhoto.php000066400000000000000000000036331361462701300316530ustar00rootroot00000000000000getField('id'); } /** * Returns the source of cover if it exists * * @return string|null */ public function getSource() { return $this->getField('source'); } /** * Returns the offset_x of cover if it exists * * @return int|null */ public function getOffsetX() { return $this->getField('offset_x'); } /** * Returns the offset_y of cover if it exists * * @return int|null */ public function getOffsetY() { return $this->getField('offset_y'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphEdge.php000066400000000000000000000166031361462701300304300ustar00rootroot00000000000000request = $request; $this->metaData = $metaData; $this->parentEdgeEndpoint = $parentEdgeEndpoint; $this->subclassName = $subclassName; parent::__construct($data); } /** * Gets the parent Graph edge endpoint that generated the list. * * @return string|null */ public function getParentGraphEdge() { return $this->parentEdgeEndpoint; } /** * Gets the subclass name that the child GraphNode's are cast as. * * @return string|null */ public function getSubClassName() { return $this->subclassName; } /** * Returns the raw meta data associated with this GraphEdge. * * @return array */ public function getMetaData() { return $this->metaData; } /** * Returns the next cursor if it exists. * * @return string|null */ public function getNextCursor() { return $this->getCursor('after'); } /** * Returns the previous cursor if it exists. * * @return string|null */ public function getPreviousCursor() { return $this->getCursor('before'); } /** * Returns the cursor for a specific direction if it exists. * * @param string $direction The direction of the page: after|before * * @return string|null */ public function getCursor($direction) { if (isset($this->metaData['paging']['cursors'][$direction])) { return $this->metaData['paging']['cursors'][$direction]; } return null; } /** * Generates a pagination URL based on a cursor. * * @param string $direction The direction of the page: next|previous * * @return string|null * * @throws FacebookSDKException */ public function getPaginationUrl($direction) { $this->validateForPagination(); // Do we have a paging URL? if (isset($this->metaData['paging'][$direction])) { // Graph returns the full URL with all the original params. // We just want the endpoint though. $pageUrl = $this->metaData['paging'][$direction]; return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl); } // Do we have a cursor to work with? $cursorDirection = $direction === 'next' ? 'after' : 'before'; $cursor = $this->getCursor($cursorDirection); if (!$cursor) { return null; } // If we don't know the ID of the parent node, this ain't gonna work. if (!$this->parentEdgeEndpoint) { return null; } // We have the parent node ID, paging cursor & original request. // These were the ingredients chosen to create the perfect little URL. $pageUrl = $this->parentEdgeEndpoint . '?' . $cursorDirection . '=' . urlencode($cursor); // Pull in the original params $originalUrl = $this->request->getUrl(); $pageUrl = FacebookUrlManipulator::mergeUrlParams($originalUrl, $pageUrl); return FacebookUrlManipulator::forceSlashPrefix($pageUrl); } /** * Validates whether or not we can paginate on this request. * * @throws FacebookSDKException */ public function validateForPagination() { if ($this->request->getMethod() !== 'GET') { throw new FacebookSDKException('You can only paginate on a GET request.', 720); } } /** * Gets the request object needed to make a next|previous page request. * * @param string $direction The direction of the page: next|previous * * @return FacebookRequest|null * * @throws FacebookSDKException */ public function getPaginationRequest($direction) { $pageUrl = $this->getPaginationUrl($direction); if (!$pageUrl) { return null; } $newRequest = clone $this->request; $newRequest->setEndpoint($pageUrl); return $newRequest; } /** * Gets the request object needed to make a "next" page request. * * @return FacebookRequest|null * * @throws FacebookSDKException */ public function getNextPageRequest() { return $this->getPaginationRequest('next'); } /** * Gets the request object needed to make a "previous" page request. * * @return FacebookRequest|null * * @throws FacebookSDKException */ public function getPreviousPageRequest() { return $this->getPaginationRequest('previous'); } /** * The total number of results according to Graph if it exists. * * This will be returned if the summary=true modifier is present in the request. * * @return int|null */ public function getTotalCount() { if (isset($this->metaData['summary']['total_count'])) { return $this->metaData['summary']['total_count']; } return null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphEvent.php000066400000000000000000000137551361462701300306520ustar00rootroot00000000000000 '\Facebook\GraphNodes\GraphCoverPhoto', 'place' => '\Facebook\GraphNodes\GraphPage', 'picture' => '\Facebook\GraphNodes\GraphPicture', 'parent_group' => '\Facebook\GraphNodes\GraphGroup', ]; /** * Returns the `id` (The event ID) as string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the `cover` (Cover picture) as GraphCoverPhoto if present. * * @return GraphCoverPhoto|null */ public function getCover() { return $this->getField('cover'); } /** * Returns the `description` (Long-form description) as string if present. * * @return string|null */ public function getDescription() { return $this->getField('description'); } /** * Returns the `end_time` (End time, if one has been set) as DateTime if present. * * @return \DateTime|null */ public function getEndTime() { return $this->getField('end_time'); } /** * Returns the `is_date_only` (Whether the event only has a date specified, but no time) as bool if present. * * @return bool|null */ public function getIsDateOnly() { return $this->getField('is_date_only'); } /** * Returns the `name` (Event name) as string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the `owner` (The profile that created the event) as GraphNode if present. * * @return GraphNode|null */ public function getOwner() { return $this->getField('owner'); } /** * Returns the `parent_group` (The group the event belongs to) as GraphGroup if present. * * @return GraphGroup|null */ public function getParentGroup() { return $this->getField('parent_group'); } /** * Returns the `place` (Event Place information) as GraphPage if present. * * @return GraphPage|null */ public function getPlace() { return $this->getField('place'); } /** * Returns the `privacy` (Who can see the event) as string if present. * * @return string|null */ public function getPrivacy() { return $this->getField('privacy'); } /** * Returns the `start_time` (Start time) as DateTime if present. * * @return \DateTime|null */ public function getStartTime() { return $this->getField('start_time'); } /** * Returns the `ticket_uri` (The link users can visit to buy a ticket to this event) as string if present. * * @return string|null */ public function getTicketUri() { return $this->getField('ticket_uri'); } /** * Returns the `timezone` (Timezone) as string if present. * * @return string|null */ public function getTimezone() { return $this->getField('timezone'); } /** * Returns the `updated_time` (Last update time) as DateTime if present. * * @return \DateTime|null */ public function getUpdatedTime() { return $this->getField('updated_time'); } /** * Returns the `picture` (Event picture) as GraphPicture if present. * * @return GraphPicture|null */ public function getPicture() { return $this->getField('picture'); } /** * Returns the `attending_count` (Number of people attending the event) as int if present. * * @return int|null */ public function getAttendingCount() { return $this->getField('attending_count'); } /** * Returns the `declined_count` (Number of people who declined the event) as int if present. * * @return int|null */ public function getDeclinedCount() { return $this->getField('declined_count'); } /** * Returns the `maybe_count` (Number of people who maybe going to the event) as int if present. * * @return int|null */ public function getMaybeCount() { return $this->getField('maybe_count'); } /** * Returns the `noreply_count` (Number of people who did not reply to the event) as int if present. * * @return int|null */ public function getNoreplyCount() { return $this->getField('noreply_count'); } /** * Returns the `invited_count` (Number of people invited to the event) as int if present. * * @return int|null */ public function getInvitedCount() { return $this->getField('invited_count'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphGroup.php000066400000000000000000000107041361462701300306540ustar00rootroot00000000000000 '\Facebook\GraphNodes\GraphCoverPhoto', 'venue' => '\Facebook\GraphNodes\GraphLocation', ]; /** * Returns the `id` (The Group ID) as string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the `cover` (The cover photo of the Group) as GraphCoverPhoto if present. * * @return GraphCoverPhoto|null */ public function getCover() { return $this->getField('cover'); } /** * Returns the `description` (A brief description of the Group) as string if present. * * @return string|null */ public function getDescription() { return $this->getField('description'); } /** * Returns the `email` (The email address to upload content to the Group. Only current members of the Group can use this) as string if present. * * @return string|null */ public function getEmail() { return $this->getField('email'); } /** * Returns the `icon` (The URL for the Group's icon) as string if present. * * @return string|null */ public function getIcon() { return $this->getField('icon'); } /** * Returns the `link` (The Group's website) as string if present. * * @return string|null */ public function getLink() { return $this->getField('link'); } /** * Returns the `name` (The name of the Group) as string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the `member_request_count` (Number of people asking to join the group.) as int if present. * * @return int|null */ public function getMemberRequestCount() { return $this->getField('member_request_count'); } /** * Returns the `owner` (The profile that created this Group) as GraphNode if present. * * @return GraphNode|null */ public function getOwner() { return $this->getField('owner'); } /** * Returns the `parent` (The parent Group of this Group, if it exists) as GraphNode if present. * * @return GraphNode|null */ public function getParent() { return $this->getField('parent'); } /** * Returns the `privacy` (The privacy setting of the Group) as string if present. * * @return string|null */ public function getPrivacy() { return $this->getField('privacy'); } /** * Returns the `updated_time` (The last time the Group was updated (this includes changes in the Group's properties and changes in posts and comments if user can see them)) as \DateTime if present. * * @return \DateTime|null */ public function getUpdatedTime() { return $this->getField('updated_time'); } /** * Returns the `venue` (The location for the Group) as GraphLocation if present. * * @return GraphLocation|null */ public function getVenue() { return $this->getField('venue'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphList.php000066400000000000000000000024221361462701300304710ustar00rootroot00000000000000getField('street'); } /** * Returns the city component of the location * * @return string|null */ public function getCity() { return $this->getField('city'); } /** * Returns the state component of the location * * @return string|null */ public function getState() { return $this->getField('state'); } /** * Returns the country component of the location * * @return string|null */ public function getCountry() { return $this->getField('country'); } /** * Returns the zipcode component of the location * * @return string|null */ public function getZip() { return $this->getField('zip'); } /** * Returns the latitude component of the location * * @return float|null */ public function getLatitude() { return $this->getField('latitude'); } /** * Returns the street component of the location * * @return float|null */ public function getLongitude() { return $this->getField('longitude'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphNode.php000066400000000000000000000120551361462701300304460ustar00rootroot00000000000000castItems($data)); } /** * Iterates over an array and detects the types each node * should be cast to and returns all the items as an array. * * @TODO Add auto-casting to AccessToken entities. * * @param array $data The array to iterate over. * * @return array */ public function castItems(array $data) { $items = []; foreach ($data as $k => $v) { if ($this->shouldCastAsDateTime($k) && (is_numeric($v) || $k === 'birthday' || $this->isIso8601DateString($v)) ) { $items[$k] = $this->castToDateTime($v); } else { $items[$k] = $v; } } return $items; } /** * Uncasts any auto-casted datatypes. * Basically the reverse of castItems(). * * @return array */ public function uncastItems() { $items = $this->asArray(); return array_map(function ($v) { if ($v instanceof \DateTime) { return $v->format(\DateTime::ISO8601); } return $v; }, $items); } /** * Get the collection of items as JSON. * * @param int $options * * @return string */ public function asJson($options = 0) { return json_encode($this->uncastItems(), $options); } /** * Detects an ISO 8601 formatted string. * * @param string $string * * @return boolean * * @see https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers * @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html * @see http://en.wikipedia.org/wiki/ISO_8601 */ public function isIso8601DateString($string) { // This insane regex was yoinked from here: // http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ // ...and I'm all like: // http://thecodinglove.com/post/95378251969/when-code-works-and-i-dont-know-why $crazyInsaneRegexThatSomehowDetectsIso8601 = '/^([\+-]?\d{4}(?!\d{2}\b))' . '((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?' . '|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d' . '|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])' . '((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d' . '([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/'; return preg_match($crazyInsaneRegexThatSomehowDetectsIso8601, $string) === 1; } /** * Determines if a value from Graph should be cast to DateTime. * * @param string $key * * @return boolean */ public function shouldCastAsDateTime($key) { return in_array($key, [ 'created_time', 'updated_time', 'start_time', 'end_time', 'backdated_time', 'issued_at', 'expires_at', 'birthday', 'publish_time' ], true); } /** * Casts a date value from Graph to DateTime. * * @param int|string $value * * @return \DateTime */ public function castToDateTime($value) { if (is_int($value)) { $dt = new \DateTime(); $dt->setTimestamp($value); } else { $dt = new \DateTime($value); } return $dt; } /** * Getter for $graphObjectMap. * * @return array */ public static function getObjectMap() { return static::$graphObjectMap; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphNodeFactory.php000066400000000000000000000303601361462701300317750ustar00rootroot00000000000000response = $response; $this->decodedBody = $response->getDecodedBody(); } /** * Tries to convert a FacebookResponse entity into a GraphNode. * * @param string|null $subclassName The GraphNode sub class to cast to. * * @return GraphNode * * @throws FacebookSDKException */ public function makeGraphNode($subclassName = null) { $this->validateResponseAsArray(); $this->validateResponseCastableAsGraphNode(); return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); } /** * Convenience method for creating a GraphAchievement collection. * * @return GraphAchievement * * @throws FacebookSDKException */ public function makeGraphAchievement() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAchievement'); } /** * Convenience method for creating a GraphAlbum collection. * * @return GraphAlbum * * @throws FacebookSDKException */ public function makeGraphAlbum() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAlbum'); } /** * Convenience method for creating a GraphPage collection. * * @return GraphPage * * @throws FacebookSDKException */ public function makeGraphPage() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphPage'); } /** * Convenience method for creating a GraphSessionInfo collection. * * @return GraphSessionInfo * * @throws FacebookSDKException */ public function makeGraphSessionInfo() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphSessionInfo'); } /** * Convenience method for creating a GraphUser collection. * * @return GraphUser * * @throws FacebookSDKException */ public function makeGraphUser() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphUser'); } /** * Convenience method for creating a GraphEvent collection. * * @return GraphEvent * * @throws FacebookSDKException */ public function makeGraphEvent() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); } /** * Convenience method for creating a GraphGroup collection. * * @return GraphGroup * * @throws FacebookSDKException */ public function makeGraphGroup() { return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphGroup'); } /** * Tries to convert a FacebookResponse entity into a GraphEdge. * * @param string|null $subclassName The GraphNode sub class to cast the list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return GraphEdge * * @throws FacebookSDKException */ public function makeGraphEdge($subclassName = null, $auto_prefix = true) { $this->validateResponseAsArray(); $this->validateResponseCastableAsGraphEdge(); if ($subclassName && $auto_prefix) { $subclassName = static::BASE_GRAPH_OBJECT_PREFIX . $subclassName; } return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName); } /** * Validates the decoded body. * * @throws FacebookSDKException */ public function validateResponseAsArray() { if (!is_array($this->decodedBody)) { throw new FacebookSDKException('Unable to get response from Graph as array.', 620); } } /** * Validates that the return data can be cast as a GraphNode. * * @throws FacebookSDKException */ public function validateResponseCastableAsGraphNode() { if (isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data'])) { throw new FacebookSDKException( 'Unable to convert response from Graph to a GraphNode because the response looks like a GraphEdge. Try using GraphNodeFactory::makeGraphEdge() instead.', 620 ); } } /** * Validates that the return data can be cast as a GraphEdge. * * @throws FacebookSDKException */ public function validateResponseCastableAsGraphEdge() { if (!(isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data']))) { throw new FacebookSDKException( 'Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.', 620 ); } } /** * Safely instantiates a GraphNode of $subclassName. * * @param array $data The array of data to iterate over. * @param string|null $subclassName The subclass to cast this collection to. * * @return GraphNode * * @throws FacebookSDKException */ public function safelyMakeGraphNode(array $data, $subclassName = null) { $subclassName = $subclassName ?: static::BASE_GRAPH_NODE_CLASS; static::validateSubclass($subclassName); // Remember the parent node ID $parentNodeId = isset($data['id']) ? $data['id'] : null; $items = []; foreach ($data as $k => $v) { // Array means could be recurable if (is_array($v)) { // Detect any smart-casting from the $graphObjectMap array. // This is always empty on the GraphNode collection, but subclasses can define // their own array of smart-casting types. $graphObjectMap = $subclassName::getObjectMap(); $objectSubClass = isset($graphObjectMap[$k]) ? $graphObjectMap[$k] : null; // Could be a GraphEdge or GraphNode $items[$k] = $this->castAsGraphNodeOrGraphEdge($v, $objectSubClass, $k, $parentNodeId); } else { $items[$k] = $v; } } return new $subclassName($items); } /** * Takes an array of values and determines how to cast each node. * * @param array $data The array of data to iterate over. * @param string|null $subclassName The subclass to cast this collection to. * @param string|null $parentKey The key of this data (Graph edge). * @param string|null $parentNodeId The parent Graph node ID. * * @return GraphNode|GraphEdge * * @throws FacebookSDKException */ public function castAsGraphNodeOrGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) { if (isset($data['data'])) { // Create GraphEdge if (static::isCastableAsGraphEdge($data['data'])) { return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId); } // Sometimes Graph is a weirdo and returns a GraphNode under the "data" key $data = $data['data']; } // Create GraphNode return $this->safelyMakeGraphNode($data, $subclassName); } /** * Return an array of GraphNode's. * * @param array $data The array of data to iterate over. * @param string|null $subclassName The GraphNode subclass to cast each item in the list to. * @param string|null $parentKey The key of this data (Graph edge). * @param string|null $parentNodeId The parent Graph node ID. * * @return GraphEdge * * @throws FacebookSDKException */ public function safelyMakeGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null) { if (!isset($data['data'])) { throw new FacebookSDKException('Cannot cast data to GraphEdge. Expected a "data" key.', 620); } $dataList = []; foreach ($data['data'] as $graphNode) { $dataList[] = $this->safelyMakeGraphNode($graphNode, $subclassName, $parentKey, $parentNodeId); } $metaData = $this->getMetaData($data); // We'll need to make an edge endpoint for this in case it's a GraphEdge (for cursor pagination) $parentGraphEdgeEndpoint = $parentNodeId && $parentKey ? '/' . $parentNodeId . '/' . $parentKey : null; $className = static::BASE_GRAPH_EDGE_CLASS; return new $className($this->response->getRequest(), $dataList, $metaData, $parentGraphEdgeEndpoint, $subclassName); } /** * Get the meta data from a list in a Graph response. * * @param array $data The Graph response. * * @return array */ public function getMetaData(array $data) { unset($data['data']); return $data; } /** * Determines whether or not the data should be cast as a GraphEdge. * * @param array $data * * @return boolean */ public static function isCastableAsGraphEdge(array $data) { if ($data === []) { return true; } // Checks for a sequential numeric array which would be a GraphEdge return array_keys($data) === range(0, count($data) - 1); } /** * Ensures that the subclass in question is valid. * * @param string $subclassName The GraphNode subclass to validate. * * @throws FacebookSDKException */ public static function validateSubclass($subclassName) { if ($subclassName == static::BASE_GRAPH_NODE_CLASS || is_subclass_of($subclassName, static::BASE_GRAPH_NODE_CLASS)) { return; } throw new FacebookSDKException('The given subclass "' . $subclassName . '" is not valid. Cannot cast to an object that is not a GraphNode subclass.', 620); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphObject.php000066400000000000000000000024301361462701300307630ustar00rootroot00000000000000makeGraphNode($subclassName); } /** * Convenience method for creating a GraphEvent collection. * * @return GraphEvent * * @throws FacebookSDKException */ public function makeGraphEvent() { return $this->makeGraphObject(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent'); } /** * Tries to convert a FacebookResponse entity into a GraphEdge. * * @param string|null $subclassName The GraphNode sub class to cast the list items to. * @param boolean $auto_prefix Toggle to auto-prefix the subclass name. * * @return GraphEdge * * @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory */ public function makeGraphList($subclassName = null, $auto_prefix = true) { return $this->makeGraphEdge($subclassName, $auto_prefix); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphPage.php000066400000000000000000000062551361462701300304420ustar00rootroot00000000000000 '\Facebook\GraphNodes\GraphPage', 'global_brand_parent_page' => '\Facebook\GraphNodes\GraphPage', 'location' => '\Facebook\GraphNodes\GraphLocation', ]; /** * Returns the ID for the user's page as a string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the Category for the user's page as a string if present. * * @return string|null */ public function getCategory() { return $this->getField('category'); } /** * Returns the Name of the user's page as a string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the best available Page on Facebook. * * @return GraphPage|null */ public function getBestPage() { return $this->getField('best_page'); } /** * Returns the brand's global (parent) Page. * * @return GraphPage|null */ public function getGlobalBrandParentPage() { return $this->getField('global_brand_parent_page'); } /** * Returns the location of this place. * * @return GraphLocation|null */ public function getLocation() { return $this->getField('location'); } /** * Returns the page access token for the admin user. * * Only available in the `/me/accounts` context. * * @return string|null */ public function getAccessToken() { return $this->getField('access_token'); } /** * Returns the roles of the page admin user. * * Only available in the `/me/accounts` context. * * @return array|null */ public function getPerms() { return $this->getField('perms'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphPicture.php000066400000000000000000000036521361462701300311770ustar00rootroot00000000000000getField('is_silhouette'); } /** * Returns the url of user picture if it exists * * @return string|null */ public function getUrl() { return $this->getField('url'); } /** * Returns the width of user picture if it exists * * @return int|null */ public function getWidth() { return $this->getField('width'); } /** * Returns the height of user picture if it exists * * @return int|null */ public function getHeight() { return $this->getField('height'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphSessionInfo.php000066400000000000000000000050531361462701300320200ustar00rootroot00000000000000getField('app_id'); } /** * Returns the application name the token was issued for. * * @return string|null */ public function getApplication() { return $this->getField('application'); } /** * Returns the date & time that the token expires. * * @return \DateTime|null */ public function getExpiresAt() { return $this->getField('expires_at'); } /** * Returns whether the token is valid. * * @return boolean */ public function getIsValid() { return $this->getField('is_valid'); } /** * Returns the date & time the token was issued at. * * @return \DateTime|null */ public function getIssuedAt() { return $this->getField('issued_at'); } /** * Returns the scope permissions associated with the token. * * @return array */ public function getScopes() { return $this->getField('scopes'); } /** * Returns the login id of the user associated with the token. * * @return string|null */ public function getUserId() { return $this->getField('user_id'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/GraphNodes/GraphUser.php000066400000000000000000000076641361462701300305110ustar00rootroot00000000000000 '\Facebook\GraphNodes\GraphPage', 'location' => '\Facebook\GraphNodes\GraphPage', 'significant_other' => '\Facebook\GraphNodes\GraphUser', 'picture' => '\Facebook\GraphNodes\GraphPicture', ]; /** * Returns the ID for the user as a string if present. * * @return string|null */ public function getId() { return $this->getField('id'); } /** * Returns the name for the user as a string if present. * * @return string|null */ public function getName() { return $this->getField('name'); } /** * Returns the first name for the user as a string if present. * * @return string|null */ public function getFirstName() { return $this->getField('first_name'); } /** * Returns the middle name for the user as a string if present. * * @return string|null */ public function getMiddleName() { return $this->getField('middle_name'); } /** * Returns the last name for the user as a string if present. * * @return string|null */ public function getLastName() { return $this->getField('last_name'); } /** * Returns the gender for the user as a string if present. * * @return string|null */ public function getGender() { return $this->getField('gender'); } /** * Returns the Facebook URL for the user as a string if available. * * @return string|null */ public function getLink() { return $this->getField('link'); } /** * Returns the users birthday, if available. * * @return \DateTime|null */ public function getBirthday() { return $this->getField('birthday'); } /** * Returns the current location of the user as a GraphPage. * * @return GraphPage|null */ public function getLocation() { return $this->getField('location'); } /** * Returns the current location of the user as a GraphPage. * * @return GraphPage|null */ public function getHometown() { return $this->getField('hometown'); } /** * Returns the current location of the user as a GraphUser. * * @return GraphUser|null */ public function getSignificantOther() { return $this->getField('significant_other'); } /** * Returns the picture of the user as a GraphPicture * * @return GraphPicture|null */ public function getPicture() { return $this->getField('picture'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Helpers/000077500000000000000000000000001361462701300254335ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Helpers/FacebookCanvasHelper.php000066400000000000000000000032121361462701300321470ustar00rootroot00000000000000signedRequest ? $this->signedRequest->get('app_data') : null; } /** * Get raw signed request from POST. * * @return string|null */ public function getRawSignedRequest() { return $this->getRawSignedRequestFromPost() ?: null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Helpers/FacebookJavaScriptHelper.php000066400000000000000000000026741361462701300330150ustar00rootroot00000000000000getRawSignedRequestFromCookie(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Helpers/FacebookPageTabHelper.php000066400000000000000000000051711361462701300322450ustar00rootroot00000000000000signedRequest) { return; } $this->pageData = $this->signedRequest->get('page'); } /** * Returns a value from the page data. * * @param string $key * @param mixed|null $default * * @return mixed|null */ public function getPageData($key, $default = null) { if (isset($this->pageData[$key])) { return $this->pageData[$key]; } return $default; } /** * Returns true if the user is an admin. * * @return boolean */ public function isAdmin() { return $this->getPageData('admin') === true; } /** * Returns the page id if available. * * @return string|null */ public function getPageId() { return $this->getPageData('id'); } } FacebookRedirectLoginHelper.php000066400000000000000000000272631361462701300334230ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HelpersoAuth2Client = $oAuth2Client; $this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler(); $this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler(); $this->pseudoRandomStringGenerator = $prsg ?: $this->detectPseudoRandomStringGenerator(); } /** * Returns the persistent data handler. * * @return PersistentDataInterface */ public function getPersistentDataHandler() { return $this->persistentDataHandler; } /** * Returns the URL detection handler. * * @return UrlDetectionInterface */ public function getUrlDetectionHandler() { return $this->urlDetectionHandler; } /** * Returns the cryptographically secure pseudo-random string generator. * * @return PseudoRandomStringGeneratorInterface */ public function getPseudoRandomStringGenerator() { return $this->pseudoRandomStringGenerator; } /** * Detects which pseudo-random string generator to use. * * @return PseudoRandomStringGeneratorInterface * * @throws FacebookSDKException */ public function detectPseudoRandomStringGenerator() { // Since openssl_random_pseudo_bytes() can sometimes return non-cryptographically // secure pseudo-random strings (in rare cases), we check for mcrypt_create_iv() first. if (function_exists('mcrypt_create_iv')) { return new McryptPseudoRandomStringGenerator(); } if (function_exists('openssl_random_pseudo_bytes')) { return new OpenSslPseudoRandomStringGenerator(); } if (!ini_get('open_basedir') && is_readable('/dev/urandom')) { return new UrandomPseudoRandomStringGenerator(); } throw new FacebookSDKException('Unable to detect a cryptographically secure pseudo-random string generator.'); } /** * Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param array $params An array of parameters to generate URL. * @param string $separator The separator to use in http_build_query(). * * @return string */ private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&') { $state = $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH); $this->persistentDataHandler->set('state', $state); return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator); } /** * Returns the URL to send the user in order to login to Facebook. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&') { return $this->makeUrl($redirectUrl, $scope, [], $separator); } /** * Returns the URL to send the user in order to log out of Facebook. * * @param AccessToken|string $accessToken The access token that will be logged out. * @param string $next The url Facebook should redirect the user to after a successful logout. * @param string $separator The separator to use in http_build_query(). * * @return string * * @throws FacebookSDKException */ public function getLogoutUrl($accessToken, $next, $separator = '&') { if (!$accessToken instanceof AccessToken) { $accessToken = new AccessToken($accessToken); } if ($accessToken->isAppAccessToken()) { throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722); } $params = [ 'next' => $next, 'access_token' => $accessToken->getValue(), ]; return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator); } /** * Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&') { $params = ['auth_type' => 'rerequest']; return $this->makeUrl($redirectUrl, $scope, $params, $separator); } /** * Returns the URL to send the user in order to login to Facebook with user to be re-authenticated. * * @param string $redirectUrl The URL Facebook should redirect users to after login. * @param array $scope List of permissions to request during login. * @param string $separator The separator to use in http_build_query(). * * @return string */ public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&') { $params = ['auth_type' => 'reauthenticate']; return $this->makeUrl($redirectUrl, $scope, $params, $separator); } /** * Takes a valid code from a login redirect, and returns an AccessToken entity. * * @param string|null $redirectUrl The redirect URL. * * @return AccessToken|null * * @throws FacebookSDKException */ public function getAccessToken($redirectUrl = null) { if (!$code = $this->getCode()) { return null; } $this->validateCsrf(); $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); // At minimum we need to remove the state param $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']); return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); } /** * Validate the request against a cross-site request forgery. * * @throws FacebookSDKException */ protected function validateCsrf() { $state = $this->getState(); $savedState = $this->persistentDataHandler->get('state'); if (!$state || !$savedState) { throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing.'); } $savedLen = strlen($savedState); $givenLen = strlen($state); if ($savedLen !== $givenLen) { throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); } $result = 0; for ($i = 0; $i < $savedLen; $i++) { $result |= ord($state[$i]) ^ ord($savedState[$i]); } if ($result !== 0) { throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'); } } /** * Return the code. * * @return string|null */ protected function getCode() { return $this->getInput('code'); } /** * Return the state. * * @return string|null */ protected function getState() { return $this->getInput('state'); } /** * Return the error code. * * @return string|null */ public function getErrorCode() { return $this->getInput('error_code'); } /** * Returns the error. * * @return string|null */ public function getError() { return $this->getInput('error'); } /** * Returns the error reason. * * @return string|null */ public function getErrorReason() { return $this->getInput('error_reason'); } /** * Returns the error description. * * @return string|null */ public function getErrorDescription() { return $this->getInput('error_description'); } /** * Returns a value from a GET param. * * @param string $key * * @return string|null */ private function getInput($key) { return isset($_GET[$key]) ? $_GET[$key] : null; } } FacebookSignedRequestFromInputHelper.php000066400000000000000000000111051361462701300353030ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Helpersapp = $app; $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION; $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion); $this->instantiateSignedRequest(); } /** * Instantiates a new SignedRequest entity. * * @param string|null */ public function instantiateSignedRequest($rawSignedRequest = null) { $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest(); if (!$rawSignedRequest) { return; } $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest); } /** * Returns an AccessToken entity from the signed request. * * @return AccessToken|null * * @throws \Facebook\Exceptions\FacebookSDKException */ public function getAccessToken() { if ($this->signedRequest && $this->signedRequest->hasOAuthData()) { $code = $this->signedRequest->get('code'); $accessToken = $this->signedRequest->get('oauth_token'); if ($code && !$accessToken) { return $this->oAuth2Client->getAccessTokenFromCode($code); } $expiresAt = $this->signedRequest->get('expires', 0); return new AccessToken($accessToken, $expiresAt); } return null; } /** * Returns the SignedRequest entity. * * @return SignedRequest|null */ public function getSignedRequest() { return $this->signedRequest; } /** * Returns the user_id if available. * * @return string|null */ public function getUserId() { return $this->signedRequest ? $this->signedRequest->getUserId() : null; } /** * Get raw signed request from input. * * @return string|null */ abstract public function getRawSignedRequest(); /** * Get raw signed request from POST input. * * @return string|null */ public function getRawSignedRequestFromPost() { if (isset($_POST['signed_request'])) { return $_POST['signed_request']; } return null; } /** * Get raw signed request from cookie set from the Javascript SDK. * * @return string|null */ public function getRawSignedRequestFromCookie() { if (isset($_COOKIE['fbsr_' . $this->app->getId()])) { return $_COOKIE['fbsr_' . $this->app->getId()]; } return null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Http/000077500000000000000000000000001361462701300247505ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Http/GraphRawResponse.php000066400000000000000000000075541361462701300307260ustar00rootroot00000000000000httpResponseCode = (int)$httpStatusCode; } if (is_array($headers)) { $this->headers = $headers; } else { $this->setHeadersFromString($headers); } $this->body = $body; } /** * Return the response headers. * * @return array */ public function getHeaders() { return $this->headers; } /** * Return the body of the response. * * @return string */ public function getBody() { return $this->body; } /** * Return the HTTP response code. * * @return int */ public function getHttpResponseCode() { return $this->httpResponseCode; } /** * Sets the HTTP response code from a raw header. * * @param string $rawResponseHeader */ public function setHttpResponseCodeFromHeader($rawResponseHeader) { preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|', $rawResponseHeader, $match); $this->httpResponseCode = (int)$match[1]; } /** * Parse the raw headers and set as an array. * * @param string $rawHeaders The raw headers from the response. */ protected function setHeadersFromString($rawHeaders) { // Normalize line breaks $rawHeaders = str_replace("\r\n", "\n", $rawHeaders); // There will be multiple headers if a 301 was followed // or a proxy was followed, etc $headerCollection = explode("\n\n", trim($rawHeaders)); // We just want the last response (at the end) $rawHeader = array_pop($headerCollection); $headerComponents = explode("\n", $rawHeader); foreach ($headerComponents as $line) { if (strpos($line, ': ') === false) { $this->setHttpResponseCodeFromHeader($line); } else { list($key, $value) = explode(': ', $line); $this->headers[$key] = $value; } } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Http/RequestBodyInterface.php000066400000000000000000000024451361462701300315550ustar00rootroot00000000000000params = $params; $this->files = $files; $this->boundary = $boundary ?: uniqid(); } /** * @inheritdoc */ public function getBody() { $body = ''; // Compile normal params $params = $this->getNestedParams($this->params); foreach ($params as $k => $v) { $body .= $this->getParamString($k, $v); } // Compile files foreach ($this->files as $k => $v) { $body .= $this->getFileString($k, $v); } // Peace out $body .= "--{$this->boundary}--\r\n"; return $body; } /** * Get the boundary * * @return string */ public function getBoundary() { return $this->boundary; } /** * Get the string needed to transfer a file. * * @param string $name * @param FacebookFile $file * * @return string */ private function getFileString($name, FacebookFile $file) { return sprintf( "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"%s\r\n\r\n%s\r\n", $this->boundary, $name, $file->getFileName(), $this->getFileHeaders($file), $file->getContents() ); } /** * Get the string needed to transfer a POST field. * * @param string $name * @param string $value * * @return string */ private function getParamString($name, $value) { return sprintf( "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", $this->boundary, $name, $value ); } /** * Returns the params as an array of nested params. * * @param array $params * * @return array */ private function getNestedParams(array $params) { $query = http_build_query($params, null, '&'); $params = explode('&', $query); $result = []; foreach ($params as $param) { list($key, $value) = explode('=', $param, 2); $result[urldecode($key)] = urldecode($value); } return $result; } /** * Get the headers needed before transferring the content of a POST file. * * @param FacebookFile $file * * @return string */ protected function getFileHeaders(FacebookFile $file) { return "\r\nContent-Type: {$file->getMimetype()}"; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Http/RequestBodyUrlEncoded.php000066400000000000000000000032051361462701300316740ustar00rootroot00000000000000params = $params; } /** * @inheritdoc */ public function getBody() { return http_build_query($this->params, null, '&'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClients/000077500000000000000000000000001361462701300262725ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClients/FacebookCurl.php000066400000000000000000000055311361462701300313460ustar00rootroot00000000000000curl = curl_init(); } /** * Set a curl option * * @param $key * @param $value */ public function setopt($key, $value) { curl_setopt($this->curl, $key, $value); } /** * Set an array of options to a curl resource * * @param array $options */ public function setoptArray(array $options) { curl_setopt_array($this->curl, $options); } /** * Send a curl request * * @return mixed */ public function exec() { return curl_exec($this->curl); } /** * Return the curl error number * * @return int */ public function errno() { return curl_errno($this->curl); } /** * Return the curl error message * * @return string */ public function error() { return curl_error($this->curl); } /** * Get info from a curl reference * * @param $type * * @return mixed */ public function getinfo($type) { return curl_getinfo($this->curl, $type); } /** * Get the currently installed curl version * * @return array */ public function version() { return curl_version(); } /** * Close the resource connection to curl */ public function close() { curl_close($this->curl); } } FacebookCurlHttpClient.php000066400000000000000000000142431361462701300332660ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClientsfacebookCurl = $facebookCurl ?: new FacebookCurl(); } /** * @inheritdoc */ public function send($url, $method, $body, array $headers, $timeOut) { $this->openConnection($url, $method, $body, $headers, $timeOut); $this->sendRequest(); if ($curlErrorCode = $this->facebookCurl->errno()) { throw new FacebookSDKException($this->facebookCurl->error(), $curlErrorCode); } // Separate the raw headers from the raw body list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); $this->closeConnection(); return new GraphRawResponse($rawHeaders, $rawBody); } /** * Opens a new curl connection. * * @param string $url The endpoint to send the request to. * @param string $method The request method. * @param string $body The body of the request. * @param array $headers The request headers. * @param int $timeOut The timeout in seconds for the request. */ public function openConnection($url, $method, $body, array $headers, $timeOut) { $options = [ CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), CURLOPT_URL => $url, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => $timeOut, CURLOPT_RETURNTRANSFER => true, // Follow 301 redirects CURLOPT_HEADER => true, // Enable header processing CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', ]; if ($method !== "GET") { $options[CURLOPT_POSTFIELDS] = $body; } $this->facebookCurl->init(); $this->facebookCurl->setoptArray($options); } /** * Closes an existing curl connection */ public function closeConnection() { $this->facebookCurl->close(); } /** * Send the request and get the raw response from curl */ public function sendRequest() { $this->rawResponse = $this->facebookCurl->exec(); } /** * Compiles the request headers into a curl-friendly format. * * @param array $headers The request headers. * * @return array */ public function compileRequestHeaders(array $headers) { $return = []; foreach ($headers as $key => $value) { $return[] = $key . ': ' . $value; } return $return; } /** * Extracts the headers and the body into a two-part array * * @return array */ public function extractResponseHeadersAndBody() { $headerSize = $this->getHeaderSize(); $rawHeaders = mb_substr($this->rawResponse, 0, $headerSize); $rawBody = mb_substr($this->rawResponse, $headerSize); return [trim($rawHeaders), trim($rawBody)]; } /** * Return proper header size * * @return integer */ private function getHeaderSize() { $headerSize = $this->facebookCurl->getinfo(CURLINFO_HEADER_SIZE); // This corrects a Curl bug where header size does not account // for additional Proxy headers. if ($this->needsCurlProxyFix()) { // Additional way to calculate the request body size. if (preg_match('/Content-Length: (\d+)/', $this->rawResponse, $m)) { $headerSize = mb_strlen($this->rawResponse) - $m[1]; } elseif (stripos($this->rawResponse, self::CONNECTION_ESTABLISHED) !== false) { $headerSize += mb_strlen(self::CONNECTION_ESTABLISHED); } } return $headerSize; } /** * Detect versions of Curl which report incorrect header lengths when * using Proxies. * * @return boolean */ private function needsCurlProxyFix() { $ver = $this->facebookCurl->version(); $version = $ver['version_number']; return $version < self::CURL_PROXY_QUIRK_VER; } } FacebookGuzzleHttpClient.php000066400000000000000000000063341361462701300336430ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClientsguzzleClient = $guzzleClient ?: new Client(); } /** * @inheritdoc */ public function send($url, $method, $body, array $headers, $timeOut) { $options = [ 'headers' => $headers, 'body' => $body, 'timeout' => $timeOut, 'connect_timeout' => 10, 'verify' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', ]; $request = $this->guzzleClient->createRequest($method, $url, $options); try { $rawResponse = $this->guzzleClient->send($request); } catch (RequestException $e) { $rawResponse = $e->getResponse(); if ($e->getPrevious() instanceof RingException || !$rawResponse instanceof ResponseInterface) { throw new FacebookSDKException($e->getMessage(), $e->getCode()); } } $rawHeaders = $this->getHeadersAsString($rawResponse); $rawBody = $rawResponse->getBody(); $httpStatusCode = $rawResponse->getStatusCode(); return new GraphRawResponse($rawHeaders, $rawBody, $httpStatusCode); } /** * Returns the Guzzle array of headers as a string. * * @param ResponseInterface $response The Guzzle response. * * @return string */ public function getHeadersAsString(ResponseInterface $response) { $headers = $response->getHeaders(); $rawHeaders = []; foreach ($headers as $name => $values) { $rawHeaders[] = $name . ": " . implode(", ", $values); } return implode("\r\n", $rawHeaders); } } FacebookHttpClientInterface.php000066400000000000000000000034531361462701300342620ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClientsstream = stream_context_create($options); } /** * The response headers from the stream wrapper * * @return array|null */ public function getResponseHeaders() { return $this->responseHeaders; } /** * Send a stream wrapped request * * @param string $url * * @return mixed */ public function fileGetContents($url) { $rawResponse = file_get_contents($url, false, $this->stream); $this->responseHeaders = $http_response_header; return $rawResponse; } } FacebookStreamHttpClient.php000066400000000000000000000061221361462701300336110ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClientsfacebookStream = $facebookStream ?: new FacebookStream(); } /** * @inheritdoc */ public function send($url, $method, $body, array $headers, $timeOut) { $options = [ 'http' => [ 'method' => $method, 'header' => $this->compileHeader($headers), 'content' => $body, 'timeout' => $timeOut, 'ignore_errors' => true ], 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, 'allow_self_signed' => true, // All root certificates are self-signed 'cafile' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', ], ]; $this->facebookStream->streamContextCreate($options); $rawBody = $this->facebookStream->fileGetContents($url); $rawHeaders = $this->facebookStream->getResponseHeaders(); if ($rawBody === false || !$rawHeaders) { throw new FacebookSDKException('Stream returned an empty response', 660); } $rawHeaders = implode("\r\n", $rawHeaders); return new GraphRawResponse($rawHeaders, $rawBody); } /** * Formats the headers for use in the stream wrapper. * * @param array $headers The request headers. * * @return string */ public function compileHeader(array $headers) { $header = []; foreach ($headers as $k => $v) { $header[] = $k . ': ' . $v; } return implode("\r\n", $header); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClients/certs/000077500000000000000000000000001361462701300274125ustar00rootroot00000000000000DigiCertHighAssuranceEVRootCA.pem000066400000000000000000000025271361462701300355060ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/HttpClients/certs-----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/PersistentData/000077500000000000000000000000001361462701300267635ustar00rootroot00000000000000FacebookMemoryPersistentDataHandler.php000066400000000000000000000032041361462701300364670ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/PersistentDatasessionData[$key]) ? $this->sessionData[$key] : null; } /** * @inheritdoc */ public function set($key, $value) { $this->sessionData[$key] = $value; } } FacebookSessionPersistentDataHandler.php000066400000000000000000000043731361462701300366520ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/PersistentDatasessionPrefix . $key])) { return $_SESSION[$this->sessionPrefix . $key]; } return null; } /** * @inheritdoc */ public function set($key, $value) { $_SESSION[$this->sessionPrefix . $key] = $value; } } PersistentDataInterface.php000066400000000000000000000030141361462701300341660ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/PersistentDatavalidateLength($length); $binaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); if ($binaryString === false) { throw new FacebookSDKException( static::ERROR_MESSAGE . 'mcrypt_create_iv() returned an error.' ); } return $this->binToHex($binaryString, $length); } } OpenSslPseudoRandomStringGenerator.php000066400000000000000000000050431361462701300372160ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/PseudoRandomStringvalidateLength($length); $wasCryptographicallyStrong = false; $binaryString = openssl_random_pseudo_bytes($length, $wasCryptographicallyStrong); if ($binaryString === false) { throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned an unknown error.'); } if ($wasCryptographicallyStrong !== true) { throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned a pseudo-random string but it was not cryptographically secure and cannot be used.'); } return $this->binToHex($binaryString, $length); } } PseudoRandomStringGeneratorInterface.php000066400000000000000000000031531361462701300375330ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/PseudoRandomStringvalidateLength($length); $stream = fopen('/dev/urandom', 'rb'); if (!is_resource($stream)) { throw new FacebookSDKException( static::ERROR_MESSAGE . 'Unable to open stream to /dev/urandom.' ); } if (!defined('HHVM_VERSION')) { stream_set_read_buffer($stream, 0); } $binaryString = fread($stream, $length); fclose($stream); if (!$binaryString) { throw new FacebookSDKException( static::ERROR_MESSAGE . 'Stream to /dev/urandom returned no data.' ); } return $this->binToHex($binaryString, $length); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/SignedRequest.php000066400000000000000000000206321361462701300273270ustar00rootroot00000000000000app = $facebookApp; if (!$rawSignedRequest) { return; } $this->rawSignedRequest = $rawSignedRequest; $this->parse(); } /** * Returns the raw signed request data. * * @return string|null */ public function getRawSignedRequest() { return $this->rawSignedRequest; } /** * Returns the parsed signed request data. * * @return array|null */ public function getPayload() { return $this->payload; } /** * Returns a property from the signed request data if available. * * @param string $key * @param mixed|null $default * * @return mixed|null */ public function get($key, $default = null) { if (isset($this->payload[$key])) { return $this->payload[$key]; } return $default; } /** * Returns user_id from signed request data if available. * * @return string|null */ public function getUserId() { return $this->get('user_id'); } /** * Checks for OAuth data in the payload. * * @return boolean */ public function hasOAuthData() { return $this->get('oauth_token') || $this->get('code'); } /** * Creates a signed request from an array of data. * * @param array $payload * * @return string */ public function make(array $payload) { $payload['algorithm'] = isset($payload['algorithm']) ? $payload['algorithm'] : 'HMAC-SHA256'; $payload['issued_at'] = isset($payload['issued_at']) ? $payload['issued_at'] : time(); $encodedPayload = $this->base64UrlEncode(json_encode($payload)); $hashedSig = $this->hashSignature($encodedPayload); $encodedSig = $this->base64UrlEncode($hashedSig); return $encodedSig . '.' . $encodedPayload; } /** * Validates and decodes a signed request and saves * the payload to an array. */ protected function parse() { list($encodedSig, $encodedPayload) = $this->split(); // Signature validation $sig = $this->decodeSignature($encodedSig); $hashedSig = $this->hashSignature($encodedPayload); $this->validateSignature($hashedSig, $sig); $this->payload = $this->decodePayload($encodedPayload); // Payload validation $this->validateAlgorithm(); } /** * Splits a raw signed request into signature and payload. * * @returns array * * @throws FacebookSDKException */ protected function split() { if (strpos($this->rawSignedRequest, '.') === false) { throw new FacebookSDKException('Malformed signed request.', 606); } return explode('.', $this->rawSignedRequest, 2); } /** * Decodes the raw signature from a signed request. * * @param string $encodedSig * * @returns string * * @throws FacebookSDKException */ protected function decodeSignature($encodedSig) { $sig = $this->base64UrlDecode($encodedSig); if (!$sig) { throw new FacebookSDKException('Signed request has malformed encoded signature data.', 607); } return $sig; } /** * Decodes the raw payload from a signed request. * * @param string $encodedPayload * * @returns array * * @throws FacebookSDKException */ protected function decodePayload($encodedPayload) { $payload = $this->base64UrlDecode($encodedPayload); if ($payload) { $payload = json_decode($payload, true); } if (!is_array($payload)) { throw new FacebookSDKException('Signed request has malformed encoded payload data.', 607); } return $payload; } /** * Validates the algorithm used in a signed request. * * @throws FacebookSDKException */ protected function validateAlgorithm() { if ($this->get('algorithm') !== 'HMAC-SHA256') { throw new FacebookSDKException('Signed request is using the wrong algorithm.', 605); } } /** * Hashes the signature used in a signed request. * * @param string $encodedData * * @return string * * @throws FacebookSDKException */ protected function hashSignature($encodedData) { $hashedSig = hash_hmac( 'sha256', $encodedData, $this->app->getSecret(), $raw_output = true ); if (!$hashedSig) { throw new FacebookSDKException('Unable to hash signature from encoded payload data.', 602); } return $hashedSig; } /** * Validates the signature used in a signed request. * * @param string $hashedSig * @param string $sig * * @throws FacebookSDKException */ protected function validateSignature($hashedSig, $sig) { if (mb_strlen($hashedSig) === mb_strlen($sig)) { $validate = 0; for ($i = 0; $i < mb_strlen($sig); $i++) { $validate |= ord($hashedSig[$i]) ^ ord($sig[$i]); } if ($validate === 0) { return; } } throw new FacebookSDKException('Signed request has an invalid signature.', 602); } /** * Base64 decoding which replaces characters: * + instead of - * / instead of _ * * @link http://en.wikipedia.org/wiki/Base64#URL_applications * * @param string $input base64 url encoded input * * @return string decoded string */ public function base64UrlDecode($input) { $urlDecodedBase64 = strtr($input, '-_', '+/'); $this->validateBase64($urlDecodedBase64); return base64_decode($urlDecodedBase64); } /** * Base64 encoding which replaces characters: * + instead of - * / instead of _ * * @link http://en.wikipedia.org/wiki/Base64#URL_applications * * @param string $input string to encode * * @return string base64 url encoded input */ public function base64UrlEncode($input) { return strtr(base64_encode($input), '+/', '-_'); } /** * Validates a base64 string. * * @param string $input base64 value to validate * * @throws FacebookSDKException */ protected function validateBase64($input) { if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $input)) { throw new FacebookSDKException('Signed request contains malformed base64 encoding.', 608); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Url/000077500000000000000000000000001361462701300245735ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Url/FacebookUrlDetectionHandler.php000066400000000000000000000110031361462701300326300ustar00rootroot00000000000000getHttpScheme() . '://' . $this->getHostName() . $this->getServerVar('REQUEST_URI'); } /** * Get the currently active URL scheme. * * @return string */ protected function getHttpScheme() { return $this->isBehindSsl() ? 'https' : 'http'; } /** * Tries to detect if the server is running behind an SSL. * * @return boolean */ protected function isBehindSsl() { // Check for proxy first $protocol = $this->getHeader('X_FORWARDED_PROTO'); if ($protocol) { return $this->protocolWithActiveSsl($protocol); } $protocol = $this->getServerVar('HTTPS'); if ($protocol) { return $this->protocolWithActiveSsl($protocol); } return (string)$this->getServerVar('SERVER_PORT') === '443'; } /** * Detects an active SSL protocol value. * * @param string $protocol * * @return boolean */ protected function protocolWithActiveSsl($protocol) { $protocol = strtolower((string)$protocol); return in_array($protocol, ['on', '1', 'https', 'ssl'], true); } /** * Tries to detect the host name of the server. * * Some elements adapted from * * @see https://github.com/symfony/HttpFoundation/blob/master/Request.php * * @return string */ protected function getHostName() { // Check for proxy first if ($host = $this->getHeader('X_FORWARDED_HOST')) { $elements = explode(',', $host); $host = $elements[count($elements) - 1]; } elseif (!$host = $this->getHeader('HOST')) { if (!$host = $this->getServerVar('SERVER_NAME')) { $host = $this->getServerVar('SERVER_ADDR'); } } // trim and remove port number from host // host is lowercase as per RFC 952/2181 $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); // Port number $scheme = $this->getHttpScheme(); $port = $this->getCurrentPort(); $appendPort = ':' . $port; // Don't append port number if a normal port. if (($scheme == 'http' && $port == '80') || ($scheme == 'https' && $port == '443')) { $appendPort = ''; } return $host . $appendPort; } protected function getCurrentPort() { // Check for proxy first $port = $this->getHeader('X_FORWARDED_PORT'); if ($port) { return (string)$port; } $protocol = (string)$this->getHeader('X_FORWARDED_PROTO'); if ($protocol === 'https') { return '443'; } return (string)$this->getServerVar('SERVER_PORT'); } /** * Returns the a value from the $_SERVER super global. * * @param string $key * * @return string */ protected function getServerVar($key) { return isset($_SERVER[$key]) ? $_SERVER[$key] : ''; } /** * Gets a value from the HTTP request headers. * * @param string $key * * @return string */ protected function getHeader($key) { return $this->getServerVar('HTTP_' . $key); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Url/FacebookUrlManipulator.php000066400000000000000000000121271361462701300317170ustar00rootroot00000000000000 0) { $query = '?' . http_build_query($params, null, '&'); } } $scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : ''; $host = isset($parts['host']) ? $parts['host'] : ''; $port = isset($parts['port']) ? ':' . $parts['port'] : ''; $path = isset($parts['path']) ? $parts['path'] : ''; $fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; return $scheme . $host . $port . $path . $query . $fragment; } /** * Gracefully appends params to the URL. * * @param string $url The URL that will receive the params. * @param array $newParams The params to append to the URL. * * @return string */ public static function appendParamsToUrl($url, array $newParams = []) { if (!$newParams) { return $url; } if (strpos($url, '?') === false) { return $url . '?' . http_build_query($newParams, null, '&'); } list($path, $query) = explode('?', $url, 2); $existingParams = []; parse_str($query, $existingParams); // Favor params from the original URL over $newParams $newParams = array_merge($newParams, $existingParams); // Sort for a predicable order ksort($newParams); return $path . '?' . http_build_query($newParams, null, '&'); } /** * Returns the params from a URL in the form of an array. * * @param string $url The URL to parse the params from. * * @return array */ public static function getParamsAsArray($url) { $query = parse_url($url, PHP_URL_QUERY); if (!$query) { return []; } $params = []; parse_str($query, $params); return $params; } /** * Adds the params of the first URL to the second URL. * * Any params that already exist in the second URL will go untouched. * * @param string $urlToStealFrom The URL harvest the params from. * @param string $urlToAddTo The URL that will receive the new params. * * @return string The $urlToAddTo with any new params from $urlToStealFrom. */ public static function mergeUrlParams($urlToStealFrom, $urlToAddTo) { $newParams = static::getParamsAsArray($urlToStealFrom); // Nothing new to add, return as-is if (!$newParams) { return $urlToAddTo; } return static::appendParamsToUrl($urlToAddTo, $newParams); } /** * Check for a "/" prefix and prepend it if not exists. * * @param string|null $string * * @return string|null */ public static function forceSlashPrefix($string) { if (!$string) { return $string; } return strpos($string, '/') === 0 ? $string : '/' . $string; } /** * Trims off the hostname and Graph version from a URL. * * @param string $urlToTrim The URL the needs the surgery. * * @return string The $urlToTrim with the hostname and Graph version removed. */ public static function baseGraphUrlEndpoint($urlToTrim) { return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Facebook/Url/UrlDetectionInterface.php000066400000000000000000000024611361462701300315310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Draw; use Imagine\Image\AbstractFont; use Imagine\Image\BoxInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\PointInterface; use Imagine\Exception\RuntimeException; /** * Interface for the drawer */ interface DrawerInterface { /** * Draws an arc on a starting at a given x, y coordinates under a given * start and end angles * * @param PointInterface $center * @param BoxInterface $size * @param integer $start * @param integer $end * @param ColorInterface $color * @param integer $thickness * * @throws RuntimeException * * @return DrawerInterface */ public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1); /** * Same as arc, but also connects end points with a straight line * * @param PointInterface $center * @param BoxInterface $size * @param integer $start * @param integer $end * @param ColorInterface $color * @param Boolean $fill * @param integer $thickness * * @throws RuntimeException * * @return DrawerInterface */ public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1); /** * Draws and ellipse with center at the given x, y coordinates, and given * width and height * * @param PointInterface $center * @param BoxInterface $size * @param ColorInterface $color * @param Boolean $fill * @param integer $thickness * * @throws RuntimeException * * @return DrawerInterface */ public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1); /** * Draws a line from start(x, y) to end(x, y) coordinates * * @param PointInterface $start * @param PointInterface $end * @param ColorInterface $outline * @param integer $thickness * * @return DrawerInterface */ public function line(PointInterface $start, PointInterface $end, ColorInterface $outline, $thickness = 1); /** * Same as arc, but connects end points and the center * * @param PointInterface $center * @param BoxInterface $size * @param integer $start * @param integer $end * @param ColorInterface $color * @param Boolean $fill * @param integer $thickness * * @throws RuntimeException * * @return DrawerInterface */ public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1); /** * Places a one pixel point at specific coordinates and fills it with * specified color * * @param PointInterface $position * @param ColorInterface $color * * @throws RuntimeException * * @return DrawerInterface */ public function dot(PointInterface $position, ColorInterface $color); /** * Draws a polygon using array of x, y coordinates. Must contain at least * three coordinates * * @param array $coordinates * @param ColorInterface $color * @param Boolean $fill * @param integer $thickness * * @throws RuntimeException * * @return DrawerInterface */ public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1); /** * Annotates image with specified text at a given position starting on the * top left of the final text box * * The rotation is done CW * * @param string $string * @param AbstractFont $font * @param PointInterface $position * @param integer $angle * @param integer $width * * @throws RuntimeException * * @return DrawerInterface */ public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Effects/000077500000000000000000000000001361462701300252505ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Effects/EffectsInterface.php000066400000000000000000000027511361462701300311660ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Effects; use Imagine\Exception\RuntimeException; use Imagine\Image\Palette\Color\ColorInterface; /** * Interface for the effects */ interface EffectsInterface { /** * Apply gamma correction * * @param float $correction * @return EffectsInterface * * @throws RuntimeException */ public function gamma($correction); /** * Invert the colors of the image * * @return EffectsInterface * * @throws RuntimeException */ public function negative(); /** * Grayscale the image * * @return EffectsInterface * * @throws RuntimeException */ public function grayscale(); /** * Colorize the image * * @param ColorInterface $color * * @return EffectsInterface * * @throws RuntimeException */ public function colorize(ColorInterface $color); /** * Sharpens the image * * @return EffectsInterface * * @throws RuntimeException */ public function sharpen(); /** * Blur the image * * @param float|int $sigma * * @return EffectsInterface * * @throws RuntimeException */ public function blur($sigma); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Exception/000077500000000000000000000000001361462701300256275ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Exception/Exception.php000066400000000000000000000005161361462701300303000ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Exception; /** * Imagine-specific exception */ interface Exception { } InvalidArgumentException.php000066400000000000000000000006411361462701300332320ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Exception * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Exception; /** * Imagine-specific invalid argument exception */ class InvalidArgumentException extends \InvalidArgumentException implements Exception { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Exception/NotSupportedException.php000066400000000000000000000006451361462701300326720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Exception; /** * Should be used when a driver does not support an operation. */ class NotSupportedException extends RuntimeException implements Exception { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Exception/OutOfBoundsException.php000066400000000000000000000006261361462701300324320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Exception; /** * Imagine-specific out of bounds exception */ class OutOfBoundsException extends \OutOfBoundsException implements Exception { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Exception/RuntimeException.php000066400000000000000000000006101361462701300316370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Exception; /** * Imagine-specific runtime exception */ class RuntimeException extends \RuntimeException implements Exception { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/000077500000000000000000000000001361462701300251165ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Advanced/000077500000000000000000000000001361462701300266235ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Advanced/Border.php000066400000000000000000000043361361462701300305570ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Advanced; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Point; /** * A border filter */ class Border implements FilterInterface { /** * @var ColorInterface */ private $color; /** * @var integer */ private $width; /** * @var integer */ private $height; /** * Constructs Border filter with given color, width and height * * @param ColorInterface $color * @param integer $width Width of the border on the left and right sides of the image * @param integer $height Height of the border on the top and bottom sides of the image */ public function __construct(ColorInterface $color, $width = 1, $height = 1) { $this->color = $color; $this->width = $width; $this->height = $height; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { $size = $image->getSize(); $width = $size->getWidth(); $height = $size->getHeight(); $draw = $image->draw(); // Draw top and bottom lines $draw ->line( new Point(0, 0), new Point($width - 1, 0), $this->color, $this->height ) ->line( new Point($width - 1, $height - 1), new Point(0, $height - 1), $this->color, $this->height ) ; // Draw sides $draw ->line( new Point(0, 0), new Point(0, $height - 1), $this->color, $this->width ) ->line( new Point($width - 1, 0), new Point($width - 1, $height - 1), $this->color, $this->width ) ; return $image; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Advanced/Canvas.php000066400000000000000000000033211361462701300305460ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Advanced; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; use Imagine\Image\BoxInterface; use Imagine\Image\Point; use Imagine\Image\PointInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\ImagineInterface; /** * A canvas filter */ class Canvas implements FilterInterface { /** * @var BoxInterface */ private $size; /** * @var PointInterface */ private $placement; /** * @var ColorInterface */ private $background; /** * @var ImagineInterface */ private $imagine; /** * Constructs Canvas filter with given width and height and the placement of the current image * inside the new canvas * * @param ImagineInterface $imagine * @param BoxInterface $size * @param PointInterface $placement * @param ColorInterface $background */ public function __construct(ImagineInterface $imagine, BoxInterface $size, PointInterface $placement = null, ColorInterface $background = null) { $this->imagine = $imagine; $this->size = $size; $this->placement = $placement ?: new Point(0, 0); $this->background = $background; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { $canvas = $this->imagine->create($this->size, $this->background); $canvas->paste($image, $this->placement); return $canvas; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Advanced/Grayscale.php000066400000000000000000000013701361462701300312470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Advanced; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; use Imagine\Image\Point; /** * The Grayscale filter calculates the gray-value based on RGB. */ class Grayscale extends OnPixelBased implements FilterInterface { public function __construct() { parent::__construct(function (ImageInterface $image, Point $point) { $color = $image->getColorAt($point); $image->draw()->dot($point, $color->grayscale()); }); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Advanced/OnPixelBased.php000066400000000000000000000027021361462701300316520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Advanced; use Imagine\Exception\InvalidArgumentException; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; use Imagine\Image\Point; /** * The OnPixelBased takes a callable, and for each pixel, this callable is called with the * image (\Imagine\Image\ImageInterface) and the current point (\Imagine\Image\Point) */ class OnPixelBased implements FilterInterface { protected $callback; public function __construct($callback) { if (!is_callable($callback)) { throw new InvalidArgumentException('$callback has to be callable'); } $this->callback = $callback; } /** * Applies scheduled transformation to ImageInterface instance * Returns processed ImageInterface instance * * @param ImageInterface $image * * @return ImageInterface */ public function apply(ImageInterface $image) { $w = $image->getSize()->getWidth(); $h = $image->getSize()->getHeight(); for ($x = 0; $x < $w; $x++) { for ($y = 0; $y < $h; $y++) { call_user_func($this->callback, $image, new Point($x, $y)); } } return $image; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Advanced/RelativeResize.php000066400000000000000000000025031361462701300322710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Advanced; use Imagine\Exception\InvalidArgumentException; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; /** * The RelativeResize filter allows images to be resized relative to their * existing dimensions. */ class RelativeResize implements FilterInterface { private $method; private $parameter; /** * Constructs a RelativeResize filter with the given method and argument. * * @param string $method BoxInterface method * @param mixed $parameter Parameter for BoxInterface method */ public function __construct($method, $parameter) { if (!in_array($method, array('heighten', 'increase', 'scale', 'widen'))) { throw new InvalidArgumentException(sprintf('Unsupported method: ', $method)); } $this->method = $method; $this->parameter = $parameter; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->resize(call_user_func(array($image->getSize(), $this->method), $this->parameter)); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/000077500000000000000000000000001361462701300261375ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/ApplyMask.php000066400000000000000000000014141361462701300305510ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; /** * An apply mask filter */ class ApplyMask implements FilterInterface { /** * @var ImageInterface */ private $mask; /** * @param ImageInterface $mask */ public function __construct(ImageInterface $mask) { $this->mask = $mask; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->applyMask($this->mask); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Autorotate.php000066400000000000000000000045711361462701300310060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; use Imagine\Image\Palette\Color\ColorInterface; /** * Rotates an image automatically based on exif information. * * Your attention please: This filter requires the use of the * ExifMetadataReader to work. * * @see https://imagine.readthedocs.org/en/latest/usage/metadata.html */ class Autorotate implements FilterInterface { private $color; /** * @param string|array|ColorInterface $color A color */ public function __construct($color = '000000') { $this->color = $color; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { $metadata = $image->metadata(); switch (isset($metadata['ifd0.Orientation']) ? $metadata['ifd0.Orientation'] : null) { case 1: // top-left break; case 2: // top-right $image->flipHorizontally(); break; case 3: // bottom-right $image->rotate(180, $this->getColor($image)); break; case 4: // bottom-left $image->flipHorizontally(); $image->rotate(180, $this->getColor($image)); break; case 5: // left-top $image->flipHorizontally(); $image->rotate(-90, $this->getColor($image)); break; case 6: // right-top $image->rotate(90, $this->getColor($image)); break; case 7: // right-bottom $image->flipHorizontally(); $image->rotate(90, $this->getColor($image)); break; case 8: // left-bottom $image->rotate(-90, $this->getColor($image)); break; default: // Invalid orientation break; } return $image; } private function getColor(ImageInterface $image) { if ($this->color instanceof ColorInterface) { return $this->color; } return $image->palette()->color($this->color); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Copy.php000066400000000000000000000010361361462701300275620ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; /** * A copy filter */ class Copy implements FilterInterface { /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->copy(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Crop.php000066400000000000000000000021161361462701300275530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Image\BoxInterface; use Imagine\Image\PointInterface; use Imagine\Filter\FilterInterface; /** * A crop filter */ class Crop implements FilterInterface { /** * @var PointInterface */ private $start; /** * @var BoxInterface */ private $size; /** * Constructs a Crop filter with given x, y, coordinates and crop width and * height values * * @param PointInterface $start * @param BoxInterface $size */ public function __construct(PointInterface $start, BoxInterface $size) { $this->start = $start; $this->size = $size; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->crop($this->start, $this->size); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Fill.php000066400000000000000000000014361361462701300275420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Filter\FilterInterface; use Imagine\Image\Fill\FillInterface; use Imagine\Image\ImageInterface; /** * A fill filter */ class Fill implements FilterInterface { /** * @var FillInterface */ private $fill; /** * @param FillInterface $fill */ public function __construct(FillInterface $fill) { $this->fill = $fill; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->fill($this->fill); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/FlipHorizontally.php000066400000000000000000000011051361462701300321560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Filter\FilterInterface; /** * A "flip horizontally" filter */ class FlipHorizontally implements FilterInterface { /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->flipHorizontally(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/FlipVertically.php000066400000000000000000000010771361462701300316060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Filter\FilterInterface; /** * A "flip vertically" filter */ class FlipVertically implements FilterInterface { /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->flipVertically(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Paste.php000066400000000000000000000021101361462701300277160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Image\PointInterface; use Imagine\Filter\FilterInterface; /** * A paste filter */ class Paste implements FilterInterface { /** * @var ImageInterface */ private $image; /** * @var PointInterface */ private $start; /** * Constructs a Paste filter with given ImageInterface to paste and x, y * coordinates of target position * * @param ImageInterface $image * @param PointInterface $start */ public function __construct(ImageInterface $image, PointInterface $start) { $this->image = $image; $this->start = $start; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->paste($this->image, $this->start); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Resize.php000066400000000000000000000017621361462701300301170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Filter\FilterInterface; use Imagine\Image\ImageInterface; use Imagine\Image\BoxInterface; /** * A resize filter */ class Resize implements FilterInterface { /** * @var BoxInterface */ private $size; private $filter; /** * Constructs Resize filter with given width and height * * @param BoxInterface $size * @param string $filter */ public function __construct(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) { $this->size = $size; $this->filter = $filter; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->resize($this->size, $this->filter); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Rotate.php000066400000000000000000000021001361462701300300770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Filter\FilterInterface; /** * A rotate filter */ class Rotate implements FilterInterface { /** * @var integer */ private $angle; /** * @var ColorInterface */ private $background; /** * Constructs Rotate filter with given angle and background color * * @param integer $angle * @param ColorInterface $background */ public function __construct($angle, ColorInterface $background = null) { $this->angle = $angle; $this->background = $background; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->rotate($this->angle, $this->background); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Save.php000066400000000000000000000017131361462701300275500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Filter\FilterInterface; /** * A save filter */ class Save implements FilterInterface { /** * @var string */ private $path; /** * @var array */ private $options; /** * Constructs Save filter with given path and options * * @param string $path * @param array $options */ public function __construct($path = null, array $options = array()) { $this->path = $path; $this->options = $options; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->save($this->path, $this->options); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Show.php000066400000000000000000000017241361462701300275740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Filter\FilterInterface; /** * A show filter */ class Show implements FilterInterface { /** * @var string */ private $format; /** * @var array */ private $options; /** * Constructs the Show filter with given format and options * * @param string $format * @param array $options */ public function __construct($format, array $options = array()) { $this->format = $format; $this->options = $options; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->show($this->format, $this->options); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Strip.php000066400000000000000000000010411361462701300277450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Filter\FilterInterface; /** * A strip filter */ class Strip implements FilterInterface { /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->strip(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/Thumbnail.php000066400000000000000000000023271361462701300305770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Image\BoxInterface; use Imagine\Filter\FilterInterface; /** * A thumbnail filter */ class Thumbnail implements FilterInterface { /** * @var BoxInterface */ private $size; /** * @var string */ private $mode; /** * @var string */ private $filter; /** * Constructs the Thumbnail filter with given width, height and mode * * @param BoxInterface $size * @param string $mode * @param string $filter */ public function __construct(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) { $this->size = $size; $this->mode = $mode; $this->filter = $filter; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return $image->thumbnail($this->size, $this->mode, $this->filter); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Basic/WebOptimization.php000066400000000000000000000025341361462701300320000ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter\Basic; use Imagine\Image\ImageInterface; use Imagine\Image\Palette\RGB; use Imagine\Filter\FilterInterface; /** * A filter to render web-optimized images */ class WebOptimization implements FilterInterface { private $palette; private $path; private $options; public function __construct($path = null, array $options = array()) { $this->path = $path; $this->options = array_replace(array( 'resolution-units' => ImageInterface::RESOLUTION_PIXELSPERINCH, 'resolution-y' => 72, 'resolution-x' => 72, ), $options); $this->palette = new RGB(); } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { $image ->usePalette($this->palette) ->strip(); if (is_callable($this->path)) { $path = call_user_func($this->path, $image); } elseif (null !== $this->path) { $path = $this->path; } else { return $image; } return $image->save($path, $this->options); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/FilterInterface.php000066400000000000000000000011751361462701300307010ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter; use Imagine\Image\ImageInterface; /** * Interface for imagine filters */ interface FilterInterface { /** * Applies scheduled transformation to ImageInterface instance * Returns processed ImageInterface instance * * @param ImageInterface $image * * @return ImageInterface */ public function apply(ImageInterface $image); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/ImagineAware.php000066400000000000000000000023411361462701300301600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter; use Imagine\Exception\InvalidArgumentException; use Imagine\Image\ImagineInterface; /** * ImagineAware base class */ abstract class ImagineAware implements FilterInterface { /** * An ImagineInterface instance. * * @var ImagineInterface */ private $imagine; /** * Set ImagineInterface instance. * * @param ImagineInterface $imagine An ImagineInterface instance */ public function setImagine(ImagineInterface $imagine) { $this->imagine = $imagine; } /** * Get ImagineInterface instance. * * @return ImagineInterface * * @throws InvalidArgumentException */ public function getImagine() { if (!$this->imagine instanceof ImagineInterface) { throw new InvalidArgumentException(sprintf('In order to use %s pass an Imagine\Image\ImagineInterface instance to filter constructor', get_class($this))); } return $this->imagine; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Filter/Transformation.php000066400000000000000000000130731361462701300306410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Filter; use Imagine\Exception\InvalidArgumentException; use Imagine\Filter\Basic\ApplyMask; use Imagine\Filter\Basic\Copy; use Imagine\Filter\Basic\Crop; use Imagine\Filter\Basic\Fill; use Imagine\Filter\Basic\FlipVertically; use Imagine\Filter\Basic\FlipHorizontally; use Imagine\Filter\Basic\Paste; use Imagine\Filter\Basic\Resize; use Imagine\Filter\Basic\Rotate; use Imagine\Filter\Basic\Save; use Imagine\Filter\Basic\Show; use Imagine\Filter\Basic\Strip; use Imagine\Filter\Basic\Thumbnail; use Imagine\Image\ImageInterface; use Imagine\Image\ImagineInterface; use Imagine\Image\BoxInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Fill\FillInterface; use Imagine\Image\ManipulatorInterface; use Imagine\Image\PointInterface; /** * A transformation filter */ final class Transformation implements FilterInterface, ManipulatorInterface { /** * @var array */ private $filters = array(); /** * @var array */ private $sorted; /** * An ImagineInterface instance. * * @var ImagineInterface */ private $imagine; /** * Class constructor. * * @param ImagineInterface $imagine An ImagineInterface instance */ public function __construct(ImagineInterface $imagine = null) { $this->imagine = $imagine; } /** * Applies a given FilterInterface onto given ImageInterface and returns * modified ImageInterface * * @param ImageInterface $image * @param FilterInterface $filter * * @return ImageInterface * @throws InvalidArgumentException */ public function applyFilter(ImageInterface $image, FilterInterface $filter) { if ($filter instanceof ImagineAware) { if ($this->imagine === null) { throw new InvalidArgumentException(sprintf('In order to use %s pass an Imagine\Image\ImagineInterface instance to Transformation constructor', get_class($filter))); } $filter->setImagine($this->imagine); } return $filter->apply($image); } /** * Returns a list of filters sorted by their priority. Filters with same priority will be returned in the order they were added. * * @return array */ public function getFilters() { if (null === $this->sorted) { if (!empty($this->filters)) { ksort($this->filters); $this->sorted = call_user_func_array('array_merge', $this->filters); } else { $this->sorted = array(); } } return $this->sorted; } /** * {@inheritdoc} */ public function apply(ImageInterface $image) { return array_reduce( $this->getFilters(), array($this, 'applyFilter'), $image ); } /** * {@inheritdoc} */ public function copy() { return $this->add(new Copy()); } /** * {@inheritdoc} */ public function crop(PointInterface $start, BoxInterface $size) { return $this->add(new Crop($start, $size)); } /** * {@inheritdoc} */ public function flipHorizontally() { return $this->add(new FlipHorizontally()); } /** * {@inheritdoc} */ public function flipVertically() { return $this->add(new FlipVertically()); } /** * {@inheritdoc} */ public function strip() { return $this->add(new Strip()); } /** * {@inheritdoc} */ public function paste(ImageInterface $image, PointInterface $start) { return $this->add(new Paste($image, $start)); } /** * {@inheritdoc} */ public function applyMask(ImageInterface $mask) { return $this->add(new ApplyMask($mask)); } /** * {@inheritdoc} */ public function fill(FillInterface $fill) { return $this->add(new Fill($fill)); } /** * {@inheritdoc} */ public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) { return $this->add(new Resize($size, $filter)); } /** * {@inheritdoc} */ public function rotate($angle, ColorInterface $background = null) { return $this->add(new Rotate($angle, $background)); } /** * {@inheritdoc} */ public function save($path = null, array $options = array()) { return $this->add(new Save($path, $options)); } /** * {@inheritdoc} */ public function show($format, array $options = array()) { return $this->add(new Show($format, $options)); } /** * {@inheritdoc} */ public function thumbnail(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) { return $this->add(new Thumbnail($size, $mode, $filter)); } /** * Registers a given FilterInterface in an internal array of filters for * later application to an instance of ImageInterface * * @param FilterInterface $filter * @param int $priority * @return Transformation */ public function add(FilterInterface $filter, $priority = 0) { $this->filters[$priority][] = $filter; $this->sorted = null; return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gd/000077500000000000000000000000001361462701300242235ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gd/Drawer.php000066400000000000000000000250261361462701300261650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gd; use Imagine\Draw\DrawerInterface; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; use Imagine\Image\AbstractFont; use Imagine\Image\BoxInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Palette\Color\RGB as RGBColor; use Imagine\Image\PointInterface; /** * Drawer implementation using the GD library */ final class Drawer implements DrawerInterface { /** * @var resource */ private $resource; /** * @var array */ private $info; /** * Constructs Drawer with a given gd image resource * * @param resource $resource */ public function __construct($resource) { $this->loadGdInfo(); $this->resource = $resource; } /** * {@inheritdoc} */ public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Draw arc operation failed'); } if (false === imagearc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw arc operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Draw arc operation failed'); } return $this; } /** * This function does not work properly because of a bug in GD * * {@inheritdoc} */ public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); if ($fill) { $style = IMG_ARC_CHORD; } else { $style = IMG_ARC_CHORD | IMG_ARC_NOFILL; } if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Draw chord operation failed'); } if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { imagealphablending($this->resource, false); throw new RuntimeException('Draw chord operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Draw chord operation failed'); } return $this; } /** * {@inheritdoc} */ public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); if ($fill) { $callback = 'imagefilledellipse'; } else { $callback = 'imageellipse'; } if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Draw ellipse operation failed'); } if (false === $callback($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw ellipse operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Draw ellipse operation failed'); } return $this; } /** * {@inheritdoc} */ public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Draw line operation failed'); } if (false === imageline($this->resource, $start->getX(), $start->getY(), $end->getX(), $end->getY(), $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw line operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Draw line operation failed'); } return $this; } /** * {@inheritdoc} */ public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); if ($fill) { $style = IMG_ARC_EDGED; } else { $style = IMG_ARC_EDGED | IMG_ARC_NOFILL; } if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Draw chord operation failed'); } if (false === imagefilledarc($this->resource, $center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start, $end, $this->getColor($color), $style)) { imagealphablending($this->resource, false); throw new RuntimeException('Draw chord operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Draw chord operation failed'); } return $this; } /** * {@inheritdoc} */ public function dot(PointInterface $position, ColorInterface $color) { if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Draw point operation failed'); } if (false === imagesetpixel($this->resource, $position->getX(), $position->getY(), $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw point operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Draw point operation failed'); } return $this; } /** * {@inheritdoc} */ public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) { imagesetthickness($this->resource, max(1, (int) $thickness)); if (count($coordinates) < 3) { throw new InvalidArgumentException(sprintf('A polygon must consist of at least 3 points, %d given', count($coordinates))); } $points = call_user_func_array('array_merge', array_map(function (PointInterface $p) { return array($p->getX(), $p->getY()); }, $coordinates)); if ($fill) { $callback = 'imagefilledpolygon'; } else { $callback = 'imagepolygon'; } if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Draw polygon operation failed'); } if (false === $callback($this->resource, $points, count($coordinates), $this->getColor($color))) { imagealphablending($this->resource, false); throw new RuntimeException('Draw polygon operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Draw polygon operation failed'); } return $this; } /** * {@inheritdoc} */ public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) { if (!$this->info['FreeType Support']) { throw new RuntimeException('GD is not compiled with FreeType support'); } $angle = -1 * $angle; $fontsize = $font->getSize(); $fontfile = $font->getFile(); $x = $position->getX(); $y = $position->getY() + $fontsize; if ($width !== null) { $string = $this->wrapText($string, $font, $angle, $width); } if (false === imagealphablending($this->resource, true)) { throw new RuntimeException('Font mask operation failed'); } if (false === imagefttext($this->resource, $fontsize, $angle, $x, $y, $this->getColor($font->getColor()), $fontfile, $string)) { imagealphablending($this->resource, false); throw new RuntimeException('Font mask operation failed'); } if (false === imagealphablending($this->resource, false)) { throw new RuntimeException('Font mask operation failed'); } return $this; } /** * Internal * * Generates a GD color from Color instance * * @param ColorInterface $color * * @return resource * * @throws RuntimeException * @throws InvalidArgumentException */ private function getColor(ColorInterface $color) { if (!$color instanceof RGBColor) { throw new InvalidArgumentException('GD driver only supports RGB colors'); } $gdColor = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), (100 - $color->getAlpha()) * 127 / 100); if (false === $gdColor) { throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); } return $gdColor; } private function loadGdInfo() { if (!function_exists('gd_info')) { throw new RuntimeException('Gd not installed'); } $this->info = gd_info(); } /** * Internal * * Fits a string into box with given width */ private function wrapText($string, AbstractFont $font, $angle, $width) { $result = ''; $words = explode(' ', $string); foreach ($words as $word) { $teststring = $result . ' ' . $word; $testbox = imagettfbbox($font->getSize(), $angle, $font->getFile(), $teststring); if ($testbox[2] > $width) { $result .= ($result == '' ? '' : "\n") . $word; } else { $result .= ($result == '' ? '' : ' ') . $word; } } return $result; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gd/Effects.php000066400000000000000000000051321361462701300263140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gd; use Imagine\Effects\EffectsInterface; use Imagine\Exception\RuntimeException; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Palette\Color\RGB as RGBColor; /** * Effects implementation using the GD library */ class Effects implements EffectsInterface { private $resource; public function __construct($resource) { $this->resource = $resource; } /** * {@inheritdoc} */ public function gamma($correction) { if (false === imagegammacorrect($this->resource, 1.0, $correction)) { throw new RuntimeException('Failed to apply gamma correction to the image'); } return $this; } /** * {@inheritdoc} */ public function negative() { if (false === imagefilter($this->resource, IMG_FILTER_NEGATE)) { throw new RuntimeException('Failed to negate the image'); } return $this; } /** * {@inheritdoc} */ public function grayscale() { if (false === imagefilter($this->resource, IMG_FILTER_GRAYSCALE)) { throw new RuntimeException('Failed to grayscale the image'); } return $this; } /** * {@inheritdoc} */ public function colorize(ColorInterface $color) { if (!$color instanceof RGBColor) { throw new RuntimeException('Colorize effects only accepts RGB color in GD context'); } if (false === imagefilter($this->resource, IMG_FILTER_COLORIZE, $color->getRed(), $color->getGreen(), $color->getBlue())) { throw new RuntimeException('Failed to colorize the image'); } return $this; } /** * {@inheritdoc} */ public function sharpen() { $sharpenMatrix = array(array(-1,-1,-1), array(-1,16,-1), array(-1,-1,-1)); $divisor = array_sum(array_map('array_sum', $sharpenMatrix)); if (false === imageconvolution($this->resource, $sharpenMatrix, $divisor, 0)) { throw new RuntimeException('Failed to sharpen the image'); } return $this; } /** * {@inheritdoc} */ public function blur($sigma = 1) { if (false === imagefilter($this->resource, IMG_FILTER_GAUSSIAN_BLUR)) { throw new RuntimeException('Failed to blur the image'); } return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gd/Font.php000066400000000000000000000021311361462701300256370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gd; use Imagine\Exception\RuntimeException; use Imagine\Image\AbstractFont; use Imagine\Image\Box; /** * Font implementation using the GD library */ final class Font extends AbstractFont { /** * {@inheritdoc} */ public function box($string, $angle = 0) { if (!function_exists('imageftbbox')) { throw new RuntimeException('GD must have been compiled with `--with-freetype-dir` option to use the Font feature.'); } $angle = -1 * $angle; $info = imageftbbox($this->size, $angle, $this->file, $string); $xs = array($info[0], $info[2], $info[4], $info[6]); $ys = array($info[1], $info[3], $info[5], $info[7]); $width = abs(max($xs) - min($xs)); $height = abs(max($ys) - min($ys)); return new Box($width, $height); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gd/Image.php000066400000000000000000000500341361462701300257600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gd; use Imagine\Image\AbstractImage; use Imagine\Image\ImageInterface; use Imagine\Image\Box; use Imagine\Image\BoxInterface; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Fill\FillInterface; use Imagine\Image\Point; use Imagine\Image\PointInterface; use Imagine\Image\Palette\PaletteInterface; use Imagine\Image\Palette\Color\RGB as RGBColor; use Imagine\Image\ProfileInterface; use Imagine\Image\Palette\RGB; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\OutOfBoundsException; use Imagine\Exception\RuntimeException; /** * Image implementation using the GD library */ final class Image extends AbstractImage { /** * @var resource */ private $resource; /** * @var Layers|null */ private $layers; /** * @var PaletteInterface */ private $palette; /** * Constructs a new Image instance * * @param resource $resource * @param PaletteInterface $palette * @param MetadataBag $metadata */ public function __construct($resource, PaletteInterface $palette, MetadataBag $metadata) { $this->metadata = $metadata; $this->palette = $palette; $this->resource = $resource; } /** * Makes sure the current image resource is destroyed */ public function __destruct() { if (is_resource($this->resource) && 'gd' === get_resource_type($this->resource)) { imagedestroy($this->resource); } } /** * Returns Gd resource * * @return resource */ public function getGdResource() { return $this->resource; } /** * {@inheritdoc} * * @return ImageInterface */ final public function copy() { $size = $this->getSize(); $copy = $this->createImage($size, 'copy'); if (false === imagecopy($copy, $this->resource, 0, 0, 0, 0, $size->getWidth(), $size->getHeight())) { throw new RuntimeException('Image copy operation failed'); } return new Image($copy, $this->palette, $this->metadata); } /** * {@inheritdoc} * * @return ImageInterface */ final public function crop(PointInterface $start, BoxInterface $size) { if (!$start->in($this->getSize())) { throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); } $width = $size->getWidth(); $height = $size->getHeight(); $dest = $this->createImage($size, 'crop'); if (false === imagecopy($dest, $this->resource, 0, 0, $start->getX(), $start->getY(), $width, $height)) { throw new RuntimeException('Image crop operation failed'); } imagedestroy($this->resource); $this->resource = $dest; return $this; } /** * {@inheritdoc} * * @return ImageInterface */ final public function paste(ImageInterface $image, PointInterface $start) { if (!$image instanceof self) { throw new InvalidArgumentException(sprintf('Gd\Image can only paste() Gd\Image instances, %s given', get_class($image))); } $size = $image->getSize(); if (!$this->getSize()->contains($size, $start)) { throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); } imagealphablending($this->resource, true); imagealphablending($image->resource, true); if (false === imagecopy($this->resource, $image->resource, $start->getX(), $start->getY(), 0, 0, $size->getWidth(), $size->getHeight())) { throw new RuntimeException('Image paste operation failed'); } imagealphablending($this->resource, false); imagealphablending($image->resource, false); return $this; } /** * {@inheritdoc} * * @return ImageInterface */ final public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) { if (ImageInterface::FILTER_UNDEFINED !== $filter) { throw new InvalidArgumentException('Unsupported filter type, GD only supports ImageInterface::FILTER_UNDEFINED filter'); } $width = $size->getWidth(); $height = $size->getHeight(); $dest = $this->createImage($size, 'resize'); imagealphablending($this->resource, true); imagealphablending($dest, true); if (false === imagecopyresampled($dest, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource))) { throw new RuntimeException('Image resize operation failed'); } imagealphablending($this->resource, false); imagealphablending($dest, false); imagedestroy($this->resource); $this->resource = $dest; return $this; } /** * {@inheritdoc} * * @return ImageInterface */ final public function rotate($angle, ColorInterface $background = null) { $color = $background ? $background : $this->palette->color('fff'); $resource = imagerotate($this->resource, -1 * $angle, $this->getColor($color)); if (false === $resource) { throw new RuntimeException('Image rotate operation failed'); } imagedestroy($this->resource); $this->resource = $resource; return $this; } /** * {@inheritdoc} * * @return ImageInterface */ final public function save($path = null, array $options = array()) { $path = null === $path ? (isset($this->metadata['filepath']) ? $this->metadata['filepath'] : $path) : $path; if (null === $path) { throw new RuntimeException('You can omit save path only if image has been open from a file'); } if (isset($options['format'])) { $format = $options['format']; } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { $format = $extension; } else { $originalPath = isset($this->metadata['filepath']) ? $this->metadata['filepath'] : null; $format = pathinfo($originalPath, \PATHINFO_EXTENSION); } $this->saveOrOutput($format, $options, $path); return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function show($format, array $options = array()) { header('Content-type: '.$this->getMimeType($format)); $this->saveOrOutput($format, $options); return $this; } /** * {@inheritdoc} */ public function get($format, array $options = array()) { ob_start(); $this->saveOrOutput($format, $options); return ob_get_clean(); } /** * {@inheritdoc} */ public function __toString() { return $this->get('png'); } /** * {@inheritdoc} * * @return ImageInterface */ final public function flipHorizontally() { $size = $this->getSize(); $width = $size->getWidth(); $height = $size->getHeight(); $dest = $this->createImage($size, 'flip'); for ($i = 0; $i < $width; $i++) { if (false === imagecopy($dest, $this->resource, $i, 0, ($width - 1) - $i, 0, 1, $height)) { throw new RuntimeException('Horizontal flip operation failed'); } } imagedestroy($this->resource); $this->resource = $dest; return $this; } /** * {@inheritdoc} * * @return ImageInterface */ final public function flipVertically() { $size = $this->getSize(); $width = $size->getWidth(); $height = $size->getHeight(); $dest = $this->createImage($size, 'flip'); for ($i = 0; $i < $height; $i++) { if (false === imagecopy($dest, $this->resource, 0, $i, 0, ($height - 1) - $i, $width, 1)) { throw new RuntimeException('Vertical flip operation failed'); } } imagedestroy($this->resource); $this->resource = $dest; return $this; } /** * {@inheritdoc} * * @return ImageInterface */ final public function strip() { // GD strips profiles and comment, so there's nothing to do here return $this; } /** * {@inheritdoc} */ public function draw() { return new Drawer($this->resource); } /** * {@inheritdoc} */ public function effects() { return new Effects($this->resource); } /** * {@inheritdoc} */ public function getSize() { return new Box(imagesx($this->resource), imagesy($this->resource)); } /** * {@inheritdoc} * * @return ImageInterface */ public function applyMask(ImageInterface $mask) { if (!$mask instanceof self) { throw new InvalidArgumentException('Cannot mask non-gd images'); } $size = $this->getSize(); $maskSize = $mask->getSize(); if ($size != $maskSize) { throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); } for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { $position = new Point($x, $y); $color = $this->getColorAt($position); $maskColor = $mask->getColorAt($position); $round = (int) round(max($color->getAlpha(), (100 - $color->getAlpha()) * $maskColor->getRed() / 255)); if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($color->dissolve($round - $color->getAlpha())))) { throw new RuntimeException('Apply mask operation failed'); } } } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function fill(FillInterface $fill) { $size = $this->getSize(); for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { if (false === imagesetpixel($this->resource, $x, $y, $this->getColor($fill->getColor(new Point($x, $y))))) { throw new RuntimeException('Fill operation failed'); } } } return $this; } /** * {@inheritdoc} */ public function mask() { $mask = $this->copy(); if (false === imagefilter($mask->resource, IMG_FILTER_GRAYSCALE)) { throw new RuntimeException('Mask operation failed'); } return $mask; } /** * {@inheritdoc} */ public function histogram() { $size = $this->getSize(); $colors = array(); for ($x = 0, $width = $size->getWidth(); $x < $width; $x++) { for ($y = 0, $height = $size->getHeight(); $y < $height; $y++) { $colors[] = $this->getColorAt(new Point($x, $y)); } } return array_unique($colors); } /** * {@inheritdoc} */ public function getColorAt(PointInterface $point) { if (!$point->in($this->getSize())) { throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); } $index = imagecolorat($this->resource, $point->getX(), $point->getY()); $info = imagecolorsforindex($this->resource, $index); return $this->palette->color(array($info['red'], $info['green'], $info['blue']), max(min(100 - (int) round($info['alpha'] / 127 * 100), 100), 0)); } /** * {@inheritdoc} */ public function layers() { if (null === $this->layers) { $this->layers = new Layers($this, $this->palette, $this->resource); } return $this->layers; } /** * {@inheritdoc} **/ public function interlace($scheme) { static $supportedInterlaceSchemes = array( ImageInterface::INTERLACE_NONE => 0, ImageInterface::INTERLACE_LINE => 1, ImageInterface::INTERLACE_PLANE => 1, ImageInterface::INTERLACE_PARTITION => 1, ); if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { throw new InvalidArgumentException('Unsupported interlace type'); } imageinterlace($this->resource, $supportedInterlaceSchemes[$scheme]); return $this; } /** * {@inheritdoc} */ public function palette() { return $this->palette; } /** * {@inheritdoc} */ public function profile(ProfileInterface $profile) { throw new RuntimeException('GD driver does not support color profiles'); } /** * {@inheritdoc} */ public function usePalette(PaletteInterface $palette) { if (!$palette instanceof RGB) { throw new RuntimeException('GD driver only supports RGB palette'); } $this->palette = $palette; return $this; } /** * Internal * * Performs save or show operation using one of GD's image... functions * * @param string $format * @param array $options * @param string $filename * * @throws InvalidArgumentException * @throws RuntimeException */ private function saveOrOutput($format, array $options, $filename = null) { $format = $this->normalizeFormat($format); if (!$this->supported($format)) { throw new InvalidArgumentException(sprintf('Saving image in "%s" format is not supported, please use one of the following extensions: "%s"', $format, implode('", "', $this->supported()))); } $save = 'image'.$format; $args = array(&$this->resource, $filename); // Preserve BC until version 1.0 if (isset($options['quality']) && !isset($options['png_compression_level'])) { $options['png_compression_level'] = round((100 - $options['quality']) * 9 / 100); } if (isset($options['filters']) && !isset($options['png_compression_filter'])) { $options['png_compression_filter'] = $options['filters']; } $options = $this->updateSaveOptions($options); if ($format === 'jpeg' && isset($options['jpeg_quality'])) { $args[] = $options['jpeg_quality']; } if ($format === 'png') { if (isset($options['png_compression_level'])) { if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); } $args[] = $options['png_compression_level']; } else { $args[] = -1; // use default level } if (isset($options['png_compression_filter'])) { if (~PNG_ALL_FILTERS & $options['png_compression_filter']) { throw new InvalidArgumentException('png_compression_filter option should be a combination of the PNG_FILTER_XXX constants'); } $args[] = $options['png_compression_filter']; } } if (($format === 'wbmp' || $format === 'xbm') && isset($options['foreground'])) { $args[] = $options['foreground']; } $this->setExceptionHandler(); if (false === call_user_func_array($save, $args)) { throw new RuntimeException('Save operation failed'); } $this->resetExceptionHandler(); } /** * Internal * * Generates a GD image * * @param BoxInterface $size * @param string the operation initiating the creation * * @return resource * * @throws RuntimeException * */ private function createImage(BoxInterface $size, $operation) { $resource = imagecreatetruecolor($size->getWidth(), $size->getHeight()); if (false === $resource) { throw new RuntimeException('Image '.$operation.' failed'); } if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { throw new RuntimeException('Image '.$operation.' failed'); } if (function_exists('imageantialias')) { imageantialias($resource, true); } $transparent = imagecolorallocatealpha($resource, 255, 255, 255, 127); imagefill($resource, 0, 0, $transparent); imagecolortransparent($resource, $transparent); return $resource; } /** * Internal * * Generates a GD color from Color instance * * @param ColorInterface $color * * @return integer A color identifier * * @throws RuntimeException * @throws InvalidArgumentException */ private function getColor(ColorInterface $color) { if (!$color instanceof RGBColor) { throw new InvalidArgumentException('GD driver only supports RGB colors'); } $index = imagecolorallocatealpha($this->resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * (100 - $color->getAlpha()) / 100)); if (false === $index) { throw new RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent', $color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha())); } return $index; } /** * Internal * * Normalizes a given format name * * @param string $format * * @return string */ private function normalizeFormat($format) { $format = strtolower($format); if ('jpg' === $format || 'pjpeg' === $format) { $format = 'jpeg'; } return $format; } /** * Internal * * Checks whether a given format is supported by GD library * * @param string $format * * @return Boolean */ private function supported($format = null) { $formats = array('gif', 'jpeg', 'png', 'wbmp', 'xbm'); if (null === $format) { return $formats; } return in_array($format, $formats); } private function setExceptionHandler() { set_error_handler(function ($errno, $errstr, $errfile, $errline) { if (0 === error_reporting()) { return; } throw new RuntimeException($errstr, $errno, new \ErrorException($errstr, 0, $errno, $errfile, $errline)); }, E_WARNING | E_NOTICE); } private function resetExceptionHandler() { restore_error_handler(); } /** * Internal * * Get the mime type based on format. * * @param string $format * * @return string mime-type * * @throws RuntimeException */ private function getMimeType($format) { $format = $this->normalizeFormat($format); if (!$this->supported($format)) { throw new RuntimeException('Invalid format'); } static $mimeTypes = array( 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'wbmp' => 'image/vnd.wap.wbmp', 'xbm' => 'image/xbm', ); return $mimeTypes[$format]; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gd/Imagine.php000066400000000000000000000127271361462701300263160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gd; use Imagine\Image\AbstractImagine; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Palette\RGB; use Imagine\Image\Palette\PaletteInterface; use Imagine\Image\BoxInterface; use Imagine\Image\Palette\Color\RGB as RGBColor; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; /** * Imagine implementation using the GD library */ final class Imagine extends AbstractImagine { /** * @var array */ private $info; /** * @throws RuntimeException */ public function __construct() { $this->loadGdInfo(); $this->requireGdVersion('2.0.1'); } /** * {@inheritdoc} */ public function create(BoxInterface $size, ColorInterface $color = null) { $width = $size->getWidth(); $height = $size->getHeight(); $resource = imagecreatetruecolor($width, $height); if (false === $resource) { throw new RuntimeException('Create operation failed'); } $palette = null !== $color ? $color->getPalette() : new RGB(); $color = $color ? $color : $palette->color('fff'); if (!$color instanceof RGBColor) { throw new InvalidArgumentException('GD driver only supports RGB colors'); } $index = imagecolorallocatealpha($resource, $color->getRed(), $color->getGreen(), $color->getBlue(), round(127 * (100 - $color->getAlpha()) / 100)); if (false === $index) { throw new RuntimeException('Unable to allocate color'); } if (false === imagefill($resource, 0, 0, $index)) { throw new RuntimeException('Could not set background color fill'); } if ($color->getAlpha() >= 95) { imagecolortransparent($resource, $index); } return $this->wrap($resource, $palette, new MetadataBag()); } /** * {@inheritdoc} */ public function open($path) { $path = $this->checkPath($path); $data = @file_get_contents($path); if (false === $data) { throw new RuntimeException(sprintf('Failed to open file %s', $path)); } $resource = @imagecreatefromstring($data); if (!is_resource($resource)) { throw new RuntimeException(sprintf('Unable to open image %s', $path)); } return $this->wrap($resource, new RGB(), $this->getMetadataReader()->readFile($path)); } /** * {@inheritdoc} */ public function load($string) { return $this->doLoad($string, $this->getMetadataReader()->readData($string)); } /** * {@inheritdoc} */ public function read($resource) { if (!is_resource($resource)) { throw new InvalidArgumentException('Variable does not contain a stream resource'); } $content = stream_get_contents($resource); if (false === $content) { throw new InvalidArgumentException('Cannot read resource content'); } return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); } /** * {@inheritdoc} */ public function font($file, $size, ColorInterface $color) { if (!$this->info['FreeType Support']) { throw new RuntimeException('GD is not compiled with FreeType support'); } return new Font($file, $size, $color); } private function wrap($resource, PaletteInterface $palette, MetadataBag $metadata) { if (!imageistruecolor($resource)) { list($width, $height) = array(imagesx($resource), imagesy($resource)); // create transparent truecolor canvas $truecolor = imagecreatetruecolor($width, $height); $transparent = imagecolorallocatealpha($truecolor, 255, 255, 255, 127); imagefill($truecolor, 0, 0, $transparent); imagecolortransparent($truecolor, $transparent); imagecopymerge($truecolor, $resource, 0, 0, 0, 0, $width, $height, 100); imagedestroy($resource); $resource = $truecolor; } if (false === imagealphablending($resource, false) || false === imagesavealpha($resource, true)) { throw new RuntimeException('Could not set alphablending, savealpha and antialias values'); } if (function_exists('imageantialias')) { imageantialias($resource, true); } return new Image($resource, $palette, $metadata); } private function loadGdInfo() { if (!function_exists('gd_info')) { throw new RuntimeException('Gd not installed'); } $this->info = gd_info(); } private function requireGdVersion($version) { if (version_compare(GD_VERSION, $version, '<')) { throw new RuntimeException(sprintf('GD2 version %s or higher is required', $version)); } } private function doLoad($string, MetadataBag $metadata) { $resource = @imagecreatefromstring($string); if (!is_resource($resource)) { throw new RuntimeException('An image could not be created from the given input'); } return $this->wrap($resource, new RGB(), $metadata); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gd/Layers.php000066400000000000000000000051411361462701300261740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gd; use Imagine\Image\AbstractLayers; use Imagine\Exception\RuntimeException; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\PaletteInterface; use Imagine\Exception\NotSupportedException; class Layers extends AbstractLayers { private $image; private $offset; private $resource; private $palette; public function __construct(Image $image, PaletteInterface $palette, $resource) { if (!is_resource($resource)) { throw new RuntimeException('Invalid Gd resource provided'); } $this->image = $image; $this->resource = $resource; $this->offset = 0; $this->palette = $palette; } /** * {@inheritdoc} */ public function merge() { } /** * {@inheritdoc} */ public function coalesce() { } /** * {@inheritdoc} */ public function animate($format, $delay, $loops) { return $this; } /** * {@inheritdoc} */ public function current() { return new Image($this->resource, $this->palette, new MetadataBag()); } /** * {@inheritdoc} */ public function key() { return $this->offset; } /** * {@inheritdoc} */ public function next() { ++$this->offset; } /** * {@inheritdoc} */ public function rewind() { $this->offset = 0; } /** * {@inheritdoc} */ public function valid() { return $this->offset < 1; } /** * {@inheritdoc} */ public function count() { return 1; } /** * {@inheritdoc} */ public function offsetExists($offset) { return 0 === $offset; } /** * {@inheritdoc} */ public function offsetGet($offset) { if (0 === $offset) { return new Image($this->resource, $this->palette, new MetadataBag()); } throw new RuntimeException('GD only supports one layer at offset 0'); } /** * {@inheritdoc} */ public function offsetSet($offset, $value) { throw new NotSupportedException('GD does not support layer set'); } /** * {@inheritdoc} */ public function offsetUnset($offset) { throw new NotSupportedException('GD does not support layer unset'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gmagick/000077500000000000000000000000001361462701300252335ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gmagick/Drawer.php000066400000000000000000000244001361462701300271700ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gmagick; use Imagine\Draw\DrawerInterface; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\NotSupportedException; use Imagine\Exception\RuntimeException; use Imagine\Image\AbstractFont; use Imagine\Image\BoxInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Point; use Imagine\Image\PointInterface; /** * Drawer implementation using the Gmagick PHP extension */ final class Drawer implements DrawerInterface { /** * @var \Gmagick */ private $gmagick; /** * @param \Gmagick $gmagick */ public function __construct(\Gmagick $gmagick) { $this->gmagick = $gmagick; } /** * {@inheritdoc} */ public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) { $x = $center->getX(); $y = $center->getY(); $width = $size->getWidth(); $height = $size->getHeight(); try { $pixel = $this->getColor($color); $arc = new \GmagickDraw(); $arc->setstrokecolor($pixel); $arc->setstrokewidth(max(1, (int) $thickness)); $arc->setfillcolor('transparent'); $arc->arc( $x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end ); $this->gmagick->drawImage($arc); $pixel = null; $arc = null; } catch (\GmagickException $e) { throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { $x = $center->getX(); $y = $center->getY(); $width = $size->getWidth(); $height = $size->getHeight(); try { $pixel = $this->getColor($color); $chord = new \GmagickDraw(); $chord->setstrokecolor($pixel); $chord->setstrokewidth(max(1, (int) $thickness)); if ($fill) { $chord->setfillcolor($pixel); } else { $x1 = round($x + $width / 2 * cos(deg2rad($start))); $y1 = round($y + $height / 2 * sin(deg2rad($start))); $x2 = round($x + $width / 2 * cos(deg2rad($end))); $y2 = round($y + $height / 2 * sin(deg2rad($end))); $this->line(new Point($x1, $y1), new Point($x2, $y2), $color); $chord->setfillcolor('transparent'); } $chord->arc($x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end); $this->gmagick->drawImage($chord); $pixel = null; $chord = null; } catch (\GmagickException $e) { throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) { $width = $size->getWidth(); $height = $size->getHeight(); try { $pixel = $this->getColor($color); $ellipse = new \GmagickDraw(); $ellipse->setstrokecolor($pixel); $ellipse->setstrokewidth(max(1, (int) $thickness)); if ($fill) { $ellipse->setfillcolor($pixel); } else { $ellipse->setfillcolor('transparent'); } $ellipse->ellipse( $center->getX(), $center->getY(), $width / 2, $height / 2, 0, 360 ); $this->gmagick->drawImage($ellipse); $pixel = null; $ellipse = null; } catch (\GmagickException $e) { throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) { try { $pixel = $this->getColor($color); $line = new \GmagickDraw(); $line->setstrokecolor($pixel); $line->setstrokewidth(max(1, (int) $thickness)); $line->setfillcolor($pixel); $line->line( $start->getX(), $start->getY(), $end->getX(), $end->getY() ); $this->gmagick->drawImage($line); $pixel = null; $line = null; } catch (\GmagickException $e) { throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { $width = $size->getWidth(); $height = $size->getHeight(); $x1 = round($center->getX() + $width / 2 * cos(deg2rad($start))); $y1 = round($center->getY() + $height / 2 * sin(deg2rad($start))); $x2 = round($center->getX() + $width / 2 * cos(deg2rad($end))); $y2 = round($center->getY() + $height / 2 * sin(deg2rad($end))); if ($fill) { $this->chord($center, $size, $start, $end, $color, true, $thickness); $this->polygon( array( $center, new Point($x1, $y1), new Point($x2, $y2), ), $color, true, $thickness ); } else { $this->arc($center, $size, $start, $end, $color, $thickness); $this->line($center, new Point($x1, $y1), $color, $thickness); $this->line($center, new Point($x2, $y2), $color, $thickness); } return $this; } /** * {@inheritdoc} */ public function dot(PointInterface $position, ColorInterface $color) { $x = $position->getX(); $y = $position->getY(); try { $pixel = $this->getColor($color); $point = new \GmagickDraw(); $point->setfillcolor($pixel); $point->point($x, $y); $this->gmagick->drawimage($point); $pixel = null; $point = null; } catch (\GmagickException $e) { throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) { if (count($coordinates) < 3) { throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); } $points = array_map(function (PointInterface $p) { return array('x' => $p->getX(), 'y' => $p->getY()); }, $coordinates); try { $pixel = $this->getColor($color); $polygon = new \GmagickDraw(); $polygon->setstrokecolor($pixel); $polygon->setstrokewidth(max(1, (int) $thickness)); if ($fill) { $polygon->setfillcolor($pixel); } else { $polygon->setfillcolor('transparent'); } $polygon->polygon($points); $this->gmagick->drawImage($polygon); unset($pixel, $polygon); } catch (\GmagickException $e) { throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) { try { $pixel = $this->getColor($font->getColor()); $text = new \GmagickDraw(); $text->setfont($font->getFile()); /** * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 * * ensure font resolution is the same as GD's hard-coded 96 */ $text->setfontsize((int) ($font->getSize() * (96 / 72))); $text->setfillcolor($pixel); $info = $this->gmagick->queryfontmetrics($text, $string); $rad = deg2rad($angle); $cos = cos($rad); $sin = sin($rad); $x1 = round(0 * $cos - 0 * $sin); $x2 = round($info['textWidth'] * $cos - $info['textHeight'] * $sin); $y1 = round(0 * $sin + 0 * $cos); $y2 = round($info['textWidth'] * $sin + $info['textHeight'] * $cos); $xdiff = 0 - min($x1, $x2); $ydiff = 0 - min($y1, $y2); if ($width !== null) { throw new NotSupportedException('Gmagick doesn\'t support queryfontmetrics function for multiline text', 1); } $this->gmagick->annotateimage($text, $position->getX() + $x1 + $xdiff, $position->getY() + $y2 + $ydiff, $angle, $string); unset($pixel, $text); } catch (\GmagickException $e) { throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); } return $this; } /** * Gets specifically formatted color string from Color instance * * @param ColorInterface $color * * @return \GmagickPixel * * @throws InvalidArgumentException In case a non-opaque color is passed */ private function getColor(ColorInterface $color) { if (!$color->isOpaque()) { throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); } return new \GmagickPixel((string) $color); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gmagick/Effects.php000066400000000000000000000045671361462701300273370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gmagick; use Imagine\Effects\EffectsInterface; use Imagine\Exception\RuntimeException; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Exception\NotSupportedException; /** * Effects implementation using the Gmagick PHP extension */ class Effects implements EffectsInterface { private $gmagick; public function __construct(\Gmagick $gmagick) { $this->gmagick = $gmagick; } /** * {@inheritdoc} */ public function gamma($correction) { try { $this->gmagick->gammaimage($correction); } catch (\GmagickException $e) { throw new RuntimeException('Failed to apply gamma correction to the image'); } return $this; } /** * {@inheritdoc} */ public function negative() { if (!method_exists($this->gmagick, 'negateimage')) { throw new NotSupportedException('Gmagick version 1.1.0 RC3 is required for negative effect'); } try { $this->gmagick->negateimage(false, \Gmagick::CHANNEL_ALL); } catch (\GmagickException $e) { throw new RuntimeException('Failed to negate the image'); } return $this; } /** * {@inheritdoc} */ public function grayscale() { try { $this->gmagick->setImageType(2); } catch (\GmagickException $e) { throw new RuntimeException('Failed to grayscale the image'); } return $this; } /** * {@inheritdoc} */ public function colorize(ColorInterface $color) { throw new NotSupportedException('Gmagick does not support colorize'); } /** * {@inheritdoc} */ public function sharpen() { throw new NotSupportedException('Gmagick does not support sharpen yet'); } /** * {@inheritdoc} */ public function blur($sigma = 1) { try { $this->gmagick->blurImage(0, $sigma); } catch (\GmagickException $e) { throw new RuntimeException('Failed to blur the image', $e->getCode(), $e); } return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gmagick/Font.php000066400000000000000000000027461361462701300266630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gmagick; use Imagine\Image\AbstractFont; use Imagine\Image\Box; use Imagine\Image\Palette\Color\ColorInterface; /** * Font implementation using the Gmagick PHP extension */ final class Font extends AbstractFont { /** * @var \Gmagick */ private $gmagick; /** * @param \Gmagick $gmagick * @param string $file * @param integer $size * @param ColorInterface $color */ public function __construct(\Gmagick $gmagick, $file, $size, ColorInterface $color) { $this->gmagick = $gmagick; parent::__construct($file, $size, $color); } /** * {@inheritdoc} */ public function box($string, $angle = 0) { $text = new \GmagickDraw(); $text->setfont($this->file); /** * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 * * ensure font resolution is the same as GD's hard-coded 96 */ $text->setfontsize((int) ($this->size * (96 / 72))); $text->setfontstyle(\Gmagick::STYLE_OBLIQUE); $info = $this->gmagick->queryfontmetrics($text, $string); $box = new Box($info['textWidth'], $info['textHeight']); return $box; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gmagick/Image.php000066400000000000000000000564701361462701300270020ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gmagick; use Imagine\Exception\OutOfBoundsException; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; use Imagine\Image\AbstractImage; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\PaletteInterface; use Imagine\Image\ImageInterface; use Imagine\Image\Box; use Imagine\Image\BoxInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Fill\FillInterface; use Imagine\Image\Point; use Imagine\Image\PointInterface; use Imagine\Image\ProfileInterface; /** * Image implementation using the Gmagick PHP extension */ final class Image extends AbstractImage { /** * @var \Gmagick */ private $gmagick; /** * @var Layers */ private $layers; /** * @var PaletteInterface */ private $palette; private static $colorspaceMapping = array( PaletteInterface::PALETTE_CMYK => \Gmagick::COLORSPACE_CMYK, PaletteInterface::PALETTE_RGB => \Gmagick::COLORSPACE_RGB, ); /** * Constructs a new Image instance * * @param \Gmagick $gmagick * @param PaletteInterface $palette * @param MetadataBag $metadata */ public function __construct(\Gmagick $gmagick, PaletteInterface $palette, MetadataBag $metadata) { $this->metadata = $metadata; $this->gmagick = $gmagick; $this->setColorspace($palette); $this->layers = new Layers($this, $this->palette, $this->gmagick); } /** * Destroys allocated gmagick resources */ public function __destruct() { if ($this->gmagick instanceof \Gmagick) { $this->gmagick->clear(); $this->gmagick->destroy(); } } /** * Returns gmagick instance * * @return Gmagick */ public function getGmagick() { return $this->gmagick; } /** * {@inheritdoc} * * @return ImageInterface */ public function copy() { return new self(clone $this->gmagick, $this->palette, clone $this->metadata); } /** * {@inheritdoc} * * @return ImageInterface */ public function crop(PointInterface $start, BoxInterface $size) { if (!$start->in($this->getSize())) { throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); } try { $this->gmagick->cropimage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); } catch (\GmagickException $e) { throw new RuntimeException('Crop operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function flipHorizontally() { try { $this->gmagick->flopimage(); } catch (\GmagickException $e) { throw new RuntimeException('Horizontal flip operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function flipVertically() { try { $this->gmagick->flipimage(); } catch (\GmagickException $e) { throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function strip() { try { try { $this->profile($this->palette->profile()); } catch (\Exception $e) { // here we discard setting the profile as the previous incorporated profile // is corrupted, let's now strip the image } $this->gmagick->stripimage(); } catch (\GmagickException $e) { throw new RuntimeException('Strip operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function paste(ImageInterface $image, PointInterface $start) { if (!$image instanceof self) { throw new InvalidArgumentException(sprintf('Gmagick\Image can only paste() Gmagick\Image instances, %s given', get_class($image))); } if (!$this->getSize()->contains($image->getSize(), $start)) { throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); } try { $this->gmagick->compositeimage($image->gmagick, \Gmagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); } catch (\GmagickException $e) { throw new RuntimeException('Paste operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) { static $supportedFilters = array( ImageInterface::FILTER_UNDEFINED => \Gmagick::FILTER_UNDEFINED, ImageInterface::FILTER_BESSEL => \Gmagick::FILTER_BESSEL, ImageInterface::FILTER_BLACKMAN => \Gmagick::FILTER_BLACKMAN, ImageInterface::FILTER_BOX => \Gmagick::FILTER_BOX, ImageInterface::FILTER_CATROM => \Gmagick::FILTER_CATROM, ImageInterface::FILTER_CUBIC => \Gmagick::FILTER_CUBIC, ImageInterface::FILTER_GAUSSIAN => \Gmagick::FILTER_GAUSSIAN, ImageInterface::FILTER_HANNING => \Gmagick::FILTER_HANNING, ImageInterface::FILTER_HAMMING => \Gmagick::FILTER_HAMMING, ImageInterface::FILTER_HERMITE => \Gmagick::FILTER_HERMITE, ImageInterface::FILTER_LANCZOS => \Gmagick::FILTER_LANCZOS, ImageInterface::FILTER_MITCHELL => \Gmagick::FILTER_MITCHELL, ImageInterface::FILTER_POINT => \Gmagick::FILTER_POINT, ImageInterface::FILTER_QUADRATIC => \Gmagick::FILTER_QUADRATIC, ImageInterface::FILTER_SINC => \Gmagick::FILTER_SINC, ImageInterface::FILTER_TRIANGLE => \Gmagick::FILTER_TRIANGLE ); if (!array_key_exists($filter, $supportedFilters)) { throw new InvalidArgumentException('Unsupported filter type'); } try { $this->gmagick->resizeimage($size->getWidth(), $size->getHeight(), $supportedFilters[$filter], 1); } catch (\GmagickException $e) { throw new RuntimeException('Resize operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function rotate($angle, ColorInterface $background = null) { try { $background = $background ?: $this->palette->color('fff'); $pixel = $this->getColor($background); $this->gmagick->rotateimage($pixel, $angle); unset($pixel); } catch (\GmagickException $e) { throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); } return $this; } /** * Internal * * Applies options before save or output * * @param \Gmagick $image * @param array $options * @param string $path * * @throws InvalidArgumentException */ private function applyImageOptions(\Gmagick $image, array $options, $path) { if (isset($options['format'])) { $format = $options['format']; } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { $format = $extension; } else { $format = pathinfo($image->getImageFilename(), \PATHINFO_EXTENSION); } $format = strtolower($format); $options = $this->updateSaveOptions($options); if (isset($options['jpeg_quality']) && in_array($format, array('jpeg', 'jpg', 'pjpeg'))) { $image->setCompressionQuality($options['jpeg_quality']); } if ((isset($options['png_compression_level']) || isset($options['png_compression_filter'])) && $format === 'png') { // first digit: compression level (default: 7) if (isset($options['png_compression_level'])) { if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); } $compression = $options['png_compression_level'] * 10; } else { $compression = 70; } // second digit: compression filter (default: 5) if (isset($options['png_compression_filter'])) { if ($options['png_compression_filter'] < 0 || $options['png_compression_filter'] > 9) { throw new InvalidArgumentException('png_compression_filter option should be an integer from 0 to 9'); } $compression += $options['png_compression_filter']; } else { $compression += 5; } $image->setCompressionQuality($compression); } if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { $image->setimageunits(\Gmagick::RESOLUTION_PIXELSPERCENTIMETER); } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { $image->setimageunits(\Gmagick::RESOLUTION_PIXELSPERINCH); } else { throw new InvalidArgumentException('Unsupported image unit format'); } $image->setimageresolution($options['resolution-x'], $options['resolution-y']); } } /** * {@inheritdoc} * * @return ImageInterface */ public function save($path = null, array $options = array()) { $path = null === $path ? $this->gmagick->getImageFilename() : $path; if ('' === trim($path)) { throw new RuntimeException('You can omit save path only if image has been open from a file'); } try { $this->prepareOutput($options, $path); $allFrames = !isset($options['animated']) || false === $options['animated']; $this->gmagick->writeimage($path, $allFrames); } catch (\GmagickException $e) { throw new RuntimeException('Save operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function show($format, array $options = array()) { header('Content-type: '.$this->getMimeType($format)); echo $this->get($format, $options); return $this; } /** * {@inheritdoc} */ public function get($format, array $options = array()) { try { $options['format'] = $format; $this->prepareOutput($options); } catch (\GmagickException $e) { throw new RuntimeException('Get operation failed', $e->getCode(), $e); } return $this->gmagick->getimagesblob(); } /** * @param array $options * @param string $path */ private function prepareOutput(array $options, $path = null) { if (isset($options['format'])) { $this->gmagick->setimageformat($options['format']); } if (isset($options['animated']) && true === $options['animated']) { $format = isset($options['format']) ? $options['format'] : 'gif'; $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; $options['flatten'] = false; $this->layers->animate($format, $delay, $loops); } else { $this->layers->merge(); } $this->applyImageOptions($this->gmagick, $options, $path); // flatten only if image has multiple layers if ((!isset($options['flatten']) || $options['flatten'] === true) && count($this->layers) > 1) { $this->flatten(); } } /** * {@inheritdoc} */ public function __toString() { return $this->get('png'); } /** * {@inheritdoc} */ public function draw() { return new Drawer($this->gmagick); } /** * {@inheritdoc} */ public function effects() { return new Effects($this->gmagick); } /** * {@inheritdoc} */ public function getSize() { try { $i = $this->gmagick->getimageindex(); $this->gmagick->setimageindex(0); //rewind $width = $this->gmagick->getimagewidth(); $height = $this->gmagick->getimageheight(); $this->gmagick->setimageindex($i); } catch (\GmagickException $e) { throw new RuntimeException('Get size operation failed', $e->getCode(), $e); } return new Box($width, $height); } /** * {@inheritdoc} * * @return ImageInterface */ public function applyMask(ImageInterface $mask) { if (!$mask instanceof self) { throw new InvalidArgumentException('Can only apply instances of Imagine\Gmagick\Image as masks'); } $size = $this->getSize(); $maskSize = $mask->getSize(); if ($size != $maskSize) { throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); } try { $mask = $mask->copy(); $this->gmagick->compositeimage($mask->gmagick, \Gmagick::COMPOSITE_DEFAULT, 0, 0); } catch (\GmagickException $e) { throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function mask() { $mask = $this->copy(); try { $mask->gmagick->modulateimage(100, 0, 100); } catch (\GmagickException $e) { throw new RuntimeException('Mask operation failed', $e->getCode(), $e); } return $mask; } /** * {@inheritdoc} * * @return ImageInterface */ public function fill(FillInterface $fill) { try { $draw = new \GmagickDraw(); $size = $this->getSize(); $w = $size->getWidth(); $h = $size->getHeight(); for ($x = 0; $x <= $w; $x++) { for ($y = 0; $y <= $h; $y++) { $pixel = $this->getColor($fill->getColor(new Point($x, $y))); $draw->setfillcolor($pixel); $draw->point($x, $y); $pixel = null; } } $this->gmagick->drawimage($draw); $draw = null; } catch (\GmagickException $e) { throw new RuntimeException('Fill operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function histogram() { try { $pixels = $this->gmagick->getimagehistogram(); } catch (\GmagickException $e) { throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); } $image = $this; return array_map(function (\GmagickPixel $pixel) use ($image) { return $image->pixelToColor($pixel); }, $pixels); } /** * {@inheritdoc} */ public function getColorAt(PointInterface $point) { if (!$point->in($this->getSize())) { throw new InvalidArgumentException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); } try { $cropped = clone $this->gmagick; $histogram = $cropped ->cropImage(1, 1, $point->getX(), $point->getY()) ->getImageHistogram(); } catch (\GmagickException $e) { throw new RuntimeException('Unable to get the pixel'); } $pixel = array_shift($histogram); unset($histogram, $cropped); return $this->pixelToColor($pixel); } /** * Returns a color given a pixel, depending the Palette context * * Note : this method is public for PHP 5.3 compatibility * * @param \GmagickPixel $pixel * * @return ColorInterface * * @throws InvalidArgumentException In case a unknown color is requested */ public function pixelToColor(\GmagickPixel $pixel) { static $colorMapping = array( ColorInterface::COLOR_RED => \Gmagick::COLOR_RED, ColorInterface::COLOR_GREEN => \Gmagick::COLOR_GREEN, ColorInterface::COLOR_BLUE => \Gmagick::COLOR_BLUE, ColorInterface::COLOR_CYAN => \Gmagick::COLOR_CYAN, ColorInterface::COLOR_MAGENTA => \Gmagick::COLOR_MAGENTA, ColorInterface::COLOR_YELLOW => \Gmagick::COLOR_YELLOW, ColorInterface::COLOR_KEYLINE => \Gmagick::COLOR_BLACK, // There is no gray component in \Gmagick, let's use one of the RGB comp ColorInterface::COLOR_GRAY => \Gmagick::COLOR_RED, ); if ($this->palette->supportsAlpha()) { try { $alpha = (int) round($pixel->getcolorvalue(\Gmagick::COLOR_ALPHA) * 100); } catch (\GmagickPixelException $e) { $alpha = null; } } else { $alpha = null; } $palette = $this->palette(); return $this->palette->color(array_map(function ($color) use ($palette, $pixel, $colorMapping) { if (!isset($colorMapping[$color])) { throw new InvalidArgumentException(sprintf('Color %s is not mapped in Gmagick', $color)); } $multiplier = 255; if ($palette->name() === PaletteInterface::PALETTE_CMYK) { $multiplier = 100; } return $pixel->getcolorvalue($colorMapping[$color]) * $multiplier; }, $this->palette->pixelDefinition()), $alpha); } /** * {@inheritdoc} */ public function layers() { return $this->layers; } /** * {@inheritdoc} */ public function interlace($scheme) { static $supportedInterlaceSchemes = array( ImageInterface::INTERLACE_NONE => \Gmagick::INTERLACE_NO, ImageInterface::INTERLACE_LINE => \Gmagick::INTERLACE_LINE, ImageInterface::INTERLACE_PLANE => \Gmagick::INTERLACE_PLANE, ImageInterface::INTERLACE_PARTITION => \Gmagick::INTERLACE_PARTITION, ); if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { throw new InvalidArgumentException('Unsupported interlace type'); } $this->gmagick->setInterlaceScheme($supportedInterlaceSchemes[$scheme]); return $this; } /** * {@inheritdoc} */ public function usePalette(PaletteInterface $palette) { if (!isset(static::$colorspaceMapping[$palette->name()])) { throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver',$palette->name())); } if ($this->palette->name() === $palette->name()) { return $this; } try { try { $hasICCProfile = (Boolean) $this->gmagick->getimageprofile('ICM'); } catch (\GmagickException $e) { $hasICCProfile = false; } if (!$hasICCProfile) { $this->profile($this->palette->profile()); } $this->profile($palette->profile()); $this->setColorspace($palette); $this->palette = $palette; } catch (\GmagickException $e) { throw new RuntimeException('Failed to set colorspace', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function palette() { return $this->palette; } /** * {@inheritdoc} */ public function profile(ProfileInterface $profile) { try { $this->gmagick->profileimage('ICM', $profile->data()); } catch (\GmagickException $e) { throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); } return $this; } /** * Internal * * Flatten the image. */ private function flatten() { /** * @see http://pecl.php.net/bugs/bug.php?id=22435 */ if (method_exists($this->gmagick, 'flattenImages')) { try { $this->gmagick = $this->gmagick->flattenImages(); } catch (\GmagickException $e) { throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); } } } /** * Gets specifically formatted color string from Color instance * * @param ColorInterface $color * * @return \GmagickPixel * * @throws InvalidArgumentException */ private function getColor(ColorInterface $color) { if (!$color->isOpaque()) { throw new InvalidArgumentException('Gmagick doesn\'t support transparency'); } return new \GmagickPixel((string) $color); } /** * Internal * * Get the mime type based on format. * * @param string $format * * @return string mime-type * * @throws InvalidArgumentException */ private function getMimeType($format) { static $mimeTypes = array( 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'wbmp' => 'image/vnd.wap.wbmp', 'xbm' => 'image/xbm', ); if (!isset($mimeTypes[$format])) { throw new InvalidArgumentException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); } return $mimeTypes[$format]; } /** * Sets colorspace and image type, assigns the palette. * * @param PaletteInterface $palette * * @throws InvalidArgumentException */ private function setColorspace(PaletteInterface $palette) { if (!isset(static::$colorspaceMapping[$palette->name()])) { throw new InvalidArgumentException(sprintf('The palette %s is not supported by Gmagick driver', $palette->name())); } $this->gmagick->setimagecolorspace(static::$colorspaceMapping[$palette->name()]); $this->palette = $palette; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gmagick/Imagine.php000066400000000000000000000116101361462701300273140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gmagick; use Imagine\Image\AbstractImagine; use Imagine\Exception\NotSupportedException; use Imagine\Image\BoxInterface; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Palette\Grayscale; use Imagine\Image\Palette\CMYK; use Imagine\Image\Palette\RGB; use Imagine\Image\Palette\Color\CMYK as CMYKColor; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; /** * Imagine implementation using the Gmagick PHP extension */ class Imagine extends AbstractImagine { /** * @throws RuntimeException */ public function __construct() { if (!class_exists('Gmagick')) { throw new RuntimeException('Gmagick not installed'); } } /** * {@inheritdoc} */ public function open($path) { $path = $this->checkPath($path); try { $gmagick = new \Gmagick($path); $image = new Image($gmagick, $this->createPalette($gmagick), $this->getMetadataReader()->readFile($path)); } catch (\GmagickException $e) { throw new RuntimeException(sprintf('Unable to open image %s', $path), $e->getCode(), $e); } return $image; } /** * {@inheritdoc} */ public function create(BoxInterface $size, ColorInterface $color = null) { $width = $size->getWidth(); $height = $size->getHeight(); $palette = null !== $color ? $color->getPalette() : new RGB(); $color = null !== $color ? $color : $palette->color('fff'); try { $gmagick = new \Gmagick(); // Gmagick does not support creation of CMYK GmagickPixel // see https://bugs.php.net/bug.php?id=64466 if ($color instanceof CMYKColor) { $switchPalette = $palette; $palette = new RGB(); $pixel = new \GmagickPixel($palette->color((string) $color)); } else { $switchPalette = null; $pixel = new \GmagickPixel((string) $color); } if ($color->getPalette()->supportsAlpha() && $color->getAlpha() < 100) { throw new NotSupportedException('alpha transparency is not supported'); } $gmagick->newimage($width, $height, $pixel->getcolor(false)); $gmagick->setimagecolorspace(\Gmagick::COLORSPACE_TRANSPARENT); $gmagick->setimagebackgroundcolor($pixel); $image = new Image($gmagick, $palette, new MetadataBag()); if ($switchPalette) { $image->usePalette($switchPalette); } return $image; } catch (\GmagickException $e) { throw new RuntimeException('Could not create empty image', $e->getCode(), $e); } } /** * {@inheritdoc} */ public function load($string) { return $this->doLoad($string, $this->getMetadataReader()->readData($string)); } /** * {@inheritdoc} */ public function read($resource) { if (!is_resource($resource)) { throw new InvalidArgumentException('Variable does not contain a stream resource'); } $content = stream_get_contents($resource); if (false === $content) { throw new InvalidArgumentException('Couldn\'t read given resource'); } return $this->doLoad($content, $this->getMetadataReader()->readStream($resource)); } /** * {@inheritdoc} */ public function font($file, $size, ColorInterface $color) { $gmagick = new \Gmagick(); $gmagick->newimage(1, 1, 'transparent'); return new Font($gmagick, $file, $size, $color); } private function createPalette(\Gmagick $gmagick) { switch ($gmagick->getimagecolorspace()) { case \Gmagick::COLORSPACE_SRGB: case \Gmagick::COLORSPACE_RGB: return new RGB(); case \Gmagick::COLORSPACE_CMYK: return new CMYK(); case \Gmagick::COLORSPACE_GRAY: return new Grayscale(); default: throw new NotSupportedException('Only RGB and CMYK colorspace are currently supported'); } } private function doLoad($content, MetadataBag $metadata) { try { $gmagick = new \Gmagick(); $gmagick->readimageblob($content); } catch (\GmagickException $e) { throw new RuntimeException( 'Could not load image from string', $e->getCode(), $e ); } return new Image($gmagick, $this->createPalette($gmagick), $metadata); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Gmagick/Layers.php000066400000000000000000000151541361462701300272110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Gmagick; use Imagine\Image\AbstractLayers; use Imagine\Exception\RuntimeException; use Imagine\Exception\NotSupportedException; use Imagine\Exception\OutOfBoundsException; use Imagine\Exception\InvalidArgumentException; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\PaletteInterface; class Layers extends AbstractLayers { /** * @var Image */ private $image; /** * @var \Gmagick */ private $resource; /** * @var integer */ private $offset = 0; /** * @var array */ private $layers = array(); /** * @var PaletteInterface */ private $palette; public function __construct(Image $image, PaletteInterface $palette, \Gmagick $resource) { $this->image = $image; $this->resource = $resource; $this->palette = $palette; } /** * {@inheritdoc} */ public function merge() { foreach ($this->layers as $offset => $image) { try { $this->resource->setimageindex($offset); $this->resource->setimage($image->getGmagick()); } catch (\GmagickException $e) { throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); } } } /** * {@inheritdoc} */ public function coalesce() { throw new NotSupportedException('Gmagick does not support coalescing'); } /** * {@inheritdoc} */ public function animate($format, $delay, $loops) { if ('gif' !== strtolower($format)) { throw new NotSupportedException('Animated picture is currently only supported on gif'); } if (!is_int($loops) || $loops < 0) { throw new InvalidArgumentException('Loops must be a positive integer.'); } if (null !== $delay && (!is_int($delay) || $delay < 0)) { throw new InvalidArgumentException('Delay must be either null or a positive integer.'); } try { foreach ($this as $offset => $layer) { $this->resource->setimageindex($offset); $this->resource->setimageformat($format); if (null !== $delay) { $this->resource->setimagedelay($delay / 10); } $this->resource->setimageiterations($loops); } } catch (\GmagickException $e) { throw new RuntimeException('Failed to animate layers', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function current() { return $this->extractAt($this->offset); } /** * Tries to extract layer at given offset * * @param integer $offset * @return Image * @throws RuntimeException */ private function extractAt($offset) { if (!isset($this->layers[$offset])) { try { $this->resource->setimageindex($offset); $this->layers[$offset] = new Image($this->resource->getimage(), $this->palette, new MetadataBag()); } catch (\GmagickException $e) { throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); } } return $this->layers[$offset]; } /** * {@inheritdoc} */ public function key() { return $this->offset; } /** * {@inheritdoc} */ public function next() { ++$this->offset; } /** * {@inheritdoc} */ public function rewind() { $this->offset = 0; } /** * {@inheritdoc} */ public function valid() { return $this->offset < count($this); } /** * {@inheritdoc} */ public function count() { try { return $this->resource->getnumberimages(); } catch (\GmagickException $e) { throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); } } /** * {@inheritdoc} */ public function offsetExists($offset) { return is_int($offset) && $offset >= 0 && $offset < count($this); } /** * {@inheritdoc} */ public function offsetGet($offset) { return $this->extractAt($offset); } /** * {@inheritdoc} */ public function offsetSet($offset, $image) { if (!$image instanceof Image) { throw new InvalidArgumentException('Only a Gmagick Image can be used as layer'); } if (null === $offset) { $offset = count($this) - 1; } else { if (!is_int($offset)) { throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); } if (count($this) < $offset || 0 > $offset) { throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); } if (isset($this[$offset])) { unset($this[$offset]); $offset = $offset - 1; } } $frame = $image->getGmagick(); try { if (count($this) > 0) { $this->resource->setimageindex($offset); $this->resource->nextimage(); } $this->resource->addimage($frame); /** * ugly hack to bypass issue https://bugs.php.net/bug.php?id=64623 */ if (count($this) == 2) { $this->resource->setimageindex($offset+1); $this->resource->nextimage(); $this->resource->addimage($frame); unset($this[0]); } } catch (\GmagickException $e) { throw new RuntimeException('Unable to set the layer', $e->getCode(), $e); } $this->layers = array(); } /** * {@inheritdoc} */ public function offsetUnset($offset) { try { $this->extractAt($offset); } catch (RuntimeException $e) { return; } try { $this->resource->setimageindex($offset); $this->resource->removeimage(); } catch (\GmagickException $e) { throw new RuntimeException('Unable to remove layer', $e->getCode(), $e); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/000077500000000000000000000000001361462701300247135ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/AbstractFont.php000066400000000000000000000025421361462701300300210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Image\Palette\Color\ColorInterface; /** * Abstract font base class */ abstract class AbstractFont implements FontInterface { /** * @var string */ protected $file; /** * @var integer */ protected $size; /** * @var ColorInterface */ protected $color; /** * Constructs a font with specified $file, $size and $color * * The font size is to be specified in points (e.g. 10pt means 10) * * @param string $file * @param integer $size * @param ColorInterface $color */ public function __construct($file, $size, ColorInterface $color) { $this->file = $file; $this->size = $size; $this->color = $color; } /** * {@inheritdoc} */ final public function getFile() { return $this->file; } /** * {@inheritdoc} */ final public function getSize() { return $this->size; } /** * {@inheritdoc} */ final public function getColor() { return $this->color; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/AbstractImage.php000066400000000000000000000065161361462701300301420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Exception\InvalidArgumentException; use Imagine\Image\Metadata\MetadataBag; abstract class AbstractImage implements ImageInterface { /** * @var MetadataBag */ protected $metadata; /** * {@inheritdoc} * * @return ImageInterface */ public function thumbnail(BoxInterface $size, $mode = ImageInterface::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED) { if ($mode !== ImageInterface::THUMBNAIL_INSET && $mode !== ImageInterface::THUMBNAIL_OUTBOUND) { throw new InvalidArgumentException('Invalid mode specified'); } $imageSize = $this->getSize(); $ratios = array( $size->getWidth() / $imageSize->getWidth(), $size->getHeight() / $imageSize->getHeight() ); $thumbnail = $this->copy(); $thumbnail->usePalette($this->palette()); $thumbnail->strip(); // if target width is larger than image width // AND target height is longer than image height if ($size->contains($imageSize)) { return $thumbnail; } if ($mode === ImageInterface::THUMBNAIL_INSET) { $ratio = min($ratios); } else { $ratio = max($ratios); } if ($mode === ImageInterface::THUMBNAIL_OUTBOUND) { if (!$imageSize->contains($size)) { $size = new Box( min($imageSize->getWidth(), $size->getWidth()), min($imageSize->getHeight(), $size->getHeight()) ); } else { $imageSize = $thumbnail->getSize()->scale($ratio); $thumbnail->resize($imageSize, $filter); } $thumbnail->crop(new Point( max(0, round(($imageSize->getWidth() - $size->getWidth()) / 2)), max(0, round(($imageSize->getHeight() - $size->getHeight()) / 2)) ), $size); } else { if (!$imageSize->contains($size)) { $imageSize = $imageSize->scale($ratio); $thumbnail->resize($imageSize, $filter); } else { $imageSize = $thumbnail->getSize()->scale($ratio); $thumbnail->resize($imageSize, $filter); } } return $thumbnail; } /** * Updates a given array of save options for backward compatibility with legacy names * * @param array $options * * @return array */ protected function updateSaveOptions(array $options) { // Preserve BC until version 1.0 if (isset($options['quality']) && !isset($options['jpeg_quality'])) { $options['jpeg_quality'] = $options['quality']; } return $options; } /** * {@inheritdoc} */ public function metadata() { return $this->metadata; } /** * Assures the metadata instance will be cloned, too */ public function __clone() { if ($this->metadata !== null) { $this->metadata = clone $this->metadata; } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/AbstractImagine.php000066400000000000000000000037541361462701300304720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Image\Metadata\DefaultMetadataReader; use Imagine\Image\Metadata\ExifMetadataReader; use Imagine\Image\Metadata\MetadataReaderInterface; use Imagine\Exception\InvalidArgumentException; abstract class AbstractImagine implements ImagineInterface { /** @var MetadataReaderInterface */ private $metadataReader; /** * @param MetadataReaderInterface $metadataReader * * @return ImagineInterface */ public function setMetadataReader(MetadataReaderInterface $metadataReader) { $this->metadataReader = $metadataReader; return $this; } /** * @return MetadataReaderInterface */ public function getMetadataReader() { if (null === $this->metadataReader) { if (ExifMetadataReader::isSupported()) { $this->metadataReader = new ExifMetadataReader(); } else { $this->metadataReader = new DefaultMetadataReader(); } } return $this->metadataReader; } /** * Checks a path that could be used with ImagineInterface::open and returns * a proper string. * * @param string|object $path * * @return string * * @throws InvalidArgumentException In case the given path is invalid. */ protected function checkPath($path) { // provide compatibility with objects such as \SplFileInfo if (is_object($path) && method_exists($path, '__toString')) { $path = (string) $path; } $handle = @fopen($path, 'r'); if (false === $handle) { throw new InvalidArgumentException(sprintf('File %s does not exist.', $path)); } fclose($handle); return $path; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/AbstractLayers.php000066400000000000000000000017631361462701300303560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; abstract class AbstractLayers implements LayersInterface { /** * {@inheritdoc} */ public function add(ImageInterface $image) { $this[] = $image; return $this; } /** * {@inheritdoc} */ public function set($offset, ImageInterface $image) { $this[$offset] = $image; return $this; } /** * {@inheritdoc} */ public function remove($offset) { unset($this[$offset]); return $this; } /** * {@inheritdoc} */ public function get($offset) { return $this[$offset]; } /** * {@inheritdoc} */ public function has($offset) { return isset($this[$offset]); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Box.php000066400000000000000000000046331361462701300261620ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Exception\InvalidArgumentException; /** * A box implementation */ final class Box implements BoxInterface { /** * @var integer */ private $width; /** * @var integer */ private $height; /** * Constructs the Size with given width and height * * @param integer $width * @param integer $height * * @throws InvalidArgumentException */ public function __construct($width, $height) { if ($height < 1 || $width < 1) { throw new InvalidArgumentException(sprintf('Length of either side cannot be 0 or negative, current size is %sx%s', $width, $height)); } $this->width = (int) $width; $this->height = (int) $height; } /** * {@inheritdoc} */ public function getWidth() { return $this->width; } /** * {@inheritdoc} */ public function getHeight() { return $this->height; } /** * {@inheritdoc} */ public function scale($ratio) { return new Box(round($ratio * $this->width), round($ratio * $this->height)); } /** * {@inheritdoc} */ public function increase($size) { return new Box((int) $size + $this->width, (int) $size + $this->height); } /** * {@inheritdoc} */ public function contains(BoxInterface $box, PointInterface $start = null) { $start = $start ? $start : new Point(0, 0); return $start->in($this) && $this->width >= $box->getWidth() + $start->getX() && $this->height >= $box->getHeight() + $start->getY(); } /** * {@inheritdoc} */ public function square() { return $this->width * $this->height; } /** * {@inheritdoc} */ public function __toString() { return sprintf('%dx%d px', $this->width, $this->height); } /** * {@inheritdoc} */ public function widen($width) { return $this->scale($width / $this->width); } /** * {@inheritdoc} */ public function heighten($height) { return $this->scale($height / $this->height); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/BoxInterface.php000066400000000000000000000037251361462701300300040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; /** * Interface for a box */ interface BoxInterface { /** * Gets current image height * * @return integer */ public function getHeight(); /** * Gets current image width * * @return integer */ public function getWidth(); /** * Creates new BoxInterface instance with ratios applied to both sides * * @param float $ratio * * @return BoxInterface */ public function scale($ratio); /** * Creates new BoxInterface, adding given size to both sides * * @param integer $size * * @return BoxInterface */ public function increase($size); /** * Checks whether current box can fit given box at a given start position, * start position defaults to top left corner xy(0,0) * * @param BoxInterface $box * @param PointInterface $start * * @return Boolean */ public function contains(BoxInterface $box, PointInterface $start = null); /** * Gets current box square, useful for getting total number of pixels in a * given box * * @return integer */ public function square(); /** * Returns a string representation of the current box * * @return string */ public function __toString(); /** * Resizes box to given width, constraining proportions and returns the new box * * @param integer $width * * @return BoxInterface */ public function widen($width); /** * Resizes box to given height, constraining proportions and returns the new box * * @param integer $height * * @return BoxInterface */ public function heighten($height); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Fill/000077500000000000000000000000001361462701300256015ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Fill/FillInterface.php000066400000000000000000000011621361462701300310210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Fill; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\PointInterface; /** * Interface for the fill */ interface FillInterface { /** * Gets color of the fill for the given position * * @param PointInterface $position * * @return ColorInterface */ public function getColor(PointInterface $position); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Fill/Gradient/000077500000000000000000000000001361462701300273365ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Fill/Gradient/Horizontal.php000066400000000000000000000010301361462701300321720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Fill\Gradient; use Imagine\Image\PointInterface; /** * Horizontal gradient fill */ final class Horizontal extends Linear { /** * {@inheritdoc} */ public function getDistance(PointInterface $position) { return $position->getX(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Fill/Gradient/Linear.php000066400000000000000000000037471361462701300312740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Fill\Gradient; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Fill\FillInterface; use Imagine\Image\PointInterface; /** * Linear gradient fill */ abstract class Linear implements FillInterface { /** * @var integer */ private $length; /** * @var ColorInterface */ private $start; /** * @var ColorInterface */ private $end; /** * Constructs a linear gradient with overall gradient length, and start and * end shades, which default to 0 and 255 accordingly * * @param integer $length * @param ColorInterface $start * @param ColorInterface $end */ final public function __construct($length, ColorInterface $start, ColorInterface $end) { $this->length = $length; $this->start = $start; $this->end = $end; } /** * {@inheritdoc} */ final public function getColor(PointInterface $position) { $l = $this->getDistance($position); if ($l >= $this->length) { return $this->end; } if ($l < 0) { return $this->start; } return $this->start->getPalette()->blend($this->start, $this->end, $l / $this->length); } /** * @return ColorInterface */ final public function getStart() { return $this->start; } /** * @return ColorInterface */ final public function getEnd() { return $this->end; } /** * Get the distance of the position relative to the beginning of the gradient * * @param PointInterface $position * * @return integer */ abstract protected function getDistance(PointInterface $position); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Fill/Gradient/Vertical.php000066400000000000000000000010241361462701300316150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Fill\Gradient; use Imagine\Image\PointInterface; /** * Vertical gradient fill */ final class Vertical extends Linear { /** * {@inheritdoc} */ public function getDistance(PointInterface $position) { return $position->getY(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/FontInterface.php000066400000000000000000000017011361462701300301520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Image\Palette\Color\ColorInterface; /** * The font interface */ interface FontInterface { /** * Gets the fontfile for current font * * @return string */ public function getFile(); /** * Gets font's integer point size * * @return integer */ public function getSize(); /** * Gets font's color * * @return ColorInterface */ public function getColor(); /** * Gets BoxInterface of font size on the image based on string and angle * * @param string $string * @param integer $angle * * @return BoxInterface */ public function box($string, $angle = 0); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Histogram/000077500000000000000000000000001361462701300266505ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Histogram/Bucket.php000066400000000000000000000017361361462701300306050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Histogram; /** * Bucket histogram */ final class Bucket implements \Countable { /** * @var Range */ private $range; /** * @var integer */ private $count; /** * @param Range $range * @param integer $count */ public function __construct(Range $range, $count = 0) { $this->range = $range; $this->count = $count; } /** * @param integer $value */ public function add($value) { if ($this->range->contains($value)) { $this->count++; } } /** * @return integer The number of elements in the bucket. */ public function count() { return $this->count; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Histogram/Range.php000066400000000000000000000021021361462701300304100ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Histogram; use Imagine\Exception\OutOfBoundsException; /** * Range histogram */ final class Range { /** * @var integer */ private $start; /** * @var integer */ private $end; /** * @param integer $start * @param integer $end * * @throws OutOfBoundsException */ public function __construct($start, $end) { if ($end <= $start) { throw new OutOfBoundsException(sprintf('Range end cannot be bigger than start, %d %d given accordingly', $this->start, $this->end)); } $this->start = $start; $this->end = $end; } /** * @param integer $value * * @return Boolean */ public function contains($value) { return $value >= $this->start && $value < $this->end; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/ImageInterface.php000066400000000000000000000101741361462701300302720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Draw\DrawerInterface; use Imagine\Effects\EffectsInterface; use Imagine\Image\Palette\PaletteInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Exception\RuntimeException; use Imagine\Exception\OutOfBoundsException; /** * The image interface */ interface ImageInterface extends ManipulatorInterface { const RESOLUTION_PIXELSPERINCH = 'ppi'; const RESOLUTION_PIXELSPERCENTIMETER = 'ppc'; const INTERLACE_NONE = 'none'; const INTERLACE_LINE = 'line'; const INTERLACE_PLANE = 'plane'; const INTERLACE_PARTITION = 'partition'; const FILTER_UNDEFINED = 'undefined'; const FILTER_POINT = 'point'; const FILTER_BOX = 'box'; const FILTER_TRIANGLE = 'triangle'; const FILTER_HERMITE = 'hermite'; const FILTER_HANNING = 'hanning'; const FILTER_HAMMING = 'hamming'; const FILTER_BLACKMAN = 'blackman'; const FILTER_GAUSSIAN = 'gaussian'; const FILTER_QUADRATIC = 'quadratic'; const FILTER_CUBIC = 'cubic'; const FILTER_CATROM = 'catrom'; const FILTER_MITCHELL = 'mitchell'; const FILTER_LANCZOS = 'lanczos'; const FILTER_BESSEL = 'bessel'; const FILTER_SINC = 'sinc'; /** * Returns the image content as a binary string * * @param string $format * @param array $options * * @throws RuntimeException * * @return string binary */ public function get($format, array $options = array()); /** * Returns the image content as a PNG binary string * * @throws RuntimeException * * @return string binary */ public function __toString(); /** * Instantiates and returns a DrawerInterface instance for image drawing * * @return DrawerInterface */ public function draw(); /** * @return EffectsInterface */ public function effects(); /** * Returns current image size * * @return BoxInterface */ public function getSize(); /** * Transforms creates a grayscale mask from current image, returns a new * image, while keeping the existing image unmodified * * @return ImageInterface */ public function mask(); /** * Returns array of image colors as Imagine\Image\Palette\Color\ColorInterface instances * * @return array */ public function histogram(); /** * Returns color at specified positions of current image * * @param PointInterface $point * * @throws RuntimeException * * @return ColorInterface */ public function getColorAt(PointInterface $point); /** * Returns the image layers when applicable. * * @throws RuntimeException In case the layer can not be returned * @throws OutOfBoundsException In case the index is not a valid value * * @return LayersInterface */ public function layers(); /** * Enables or disables interlacing * * @param string $scheme * * @throws InvalidArgumentException When an unsupported Interface type is supplied * * @return ImageInterface */ public function interlace($scheme); /** * Return the current color palette * * @return PaletteInterface */ public function palette(); /** * Set a palette for the image. Useful to change colorspace. * * @param PaletteInterface $palette * * @return ImageInterface * * @throws RuntimeException */ public function usePalette(PaletteInterface $palette); /** * Applies a color profile on the Image * * @param ProfileInterface $profile * * @return ImageInterface * * @throws RuntimeException */ public function profile(ProfileInterface $profile); /** * Returns the Image's meta data * * @return Metadata\MetadataInterface */ public function metadata(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/ImagineInterface.php000066400000000000000000000034771361462701300306310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; /** * The imagine interface */ interface ImagineInterface { const VERSION = '0.7-dev'; /** * Creates a new empty image with an optional background color * * @param BoxInterface $size * @param ColorInterface $color * * @throws InvalidArgumentException * @throws RuntimeException * * @return ImageInterface */ public function create(BoxInterface $size, ColorInterface $color = null); /** * Opens an existing image from $path * * @param string $path * * @throws RuntimeException * * @return ImageInterface */ public function open($path); /** * Loads an image from a binary $string * * @param string $string * * @throws RuntimeException * * @return ImageInterface */ public function load($string); /** * Loads an image from a resource $resource * * @param resource $resource * * @throws RuntimeException * * @return ImageInterface */ public function read($resource); /** * Constructs a font with specified $file, $size and $color * * The font size is to be specified in points (e.g. 10pt means 10) * * @param string $file * @param integer $size * @param ColorInterface $color * * @return FontInterface */ public function font($file, $size, ColorInterface $color); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/LayersInterface.php000066400000000000000000000047671361462701300305220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Exception\RuntimeException; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\OutOfBoundsException; /** * The layers interface */ interface LayersInterface extends \Iterator, \Countable, \ArrayAccess { /** * Merge layers into the original objects * * @throws RuntimeException */ public function merge(); /** * Animates layers * * @param string $format The output output format * @param integer $delay The delay in milliseconds between two frames * @param integer $loops The number of loops, 0 means infinite * * @return LayersInterface * * @throws InvalidArgumentException In case an invalid argument is provided * @throws RuntimeException In case the driver fails to animate */ public function animate($format, $delay, $loops); /** * Coalesce layers. Each layer in the sequence is the same size as the first and composited with the next layer in * the sequence. */ public function coalesce(); /** * Adds an image at the end of the layers stack * * @param ImageInterface $image * * @return LayersInterface * * @throws RuntimeException */ public function add(ImageInterface $image); /** * Set an image at offset * * @param integer $offset * @param ImageInterface $image * * @return LayersInterface * * @throws RuntimeException * @throws InvalidArgumentException * @throws OutOfBoundsException */ public function set($offset, ImageInterface $image); /** * Removes the image at offset * * @param integer $offset * * @return LayersInterface * * @throws RuntimeException * @throws InvalidArgumentException */ public function remove($offset); /** * Returns the image at offset * * @param integer $offset * * @return ImageInterface * * @throws RuntimeException * @throws InvalidArgumentException */ public function get($offset); /** * Returns true if a layer at offset is preset * * @param integer $offset * * @return Boolean */ public function has($offset); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/ManipulatorInterface.php000066400000000000000000000106601361462701300315430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\OutOfBoundsException; use Imagine\Exception\RuntimeException; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Fill\FillInterface; /** * The manipulator interface */ interface ManipulatorInterface { const THUMBNAIL_INSET = 'inset'; const THUMBNAIL_OUTBOUND = 'outbound'; /** * Copies current source image into a new ImageInterface instance * * @throws RuntimeException * * @return static */ public function copy(); /** * Crops a specified box out of the source image (modifies the source image) * Returns cropped self * * @param PointInterface $start * @param BoxInterface $size * * @throws OutOfBoundsException * @throws RuntimeException * * @return static */ public function crop(PointInterface $start, BoxInterface $size); /** * Resizes current image and returns self * * @param BoxInterface $size * @param string $filter * * @throws RuntimeException * * @return static */ public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED); /** * Rotates an image at the given angle. * Optional $background can be used to specify the fill color of the empty * area of rotated image. * * @param integer $angle * @param ColorInterface $background * * @throws RuntimeException * * @return static */ public function rotate($angle, ColorInterface $background = null); /** * Pastes an image into a parent image * Throws exceptions if image exceeds parent image borders or if paste * operation fails * * Returns source image * * @param ImageInterface $image * @param PointInterface $start * * @throws InvalidArgumentException * @throws OutOfBoundsException * @throws RuntimeException * * @return static */ public function paste(ImageInterface $image, PointInterface $start); /** * Saves the image at a specified path, the target file extension is used * to determine file format, only jpg, jpeg, gif, png, wbmp and xbm are * supported * * @param string $path * @param array $options * * @throws RuntimeException * * @return static */ public function save($path = null, array $options = array()); /** * Outputs the image content * * @param string $format * @param array $options * * @throws RuntimeException * * @return static */ public function show($format, array $options = array()); /** * Flips current image using horizontal axis * * @throws RuntimeException * * @return static */ public function flipHorizontally(); /** * Flips current image using vertical axis * * @throws RuntimeException * * @return static */ public function flipVertically(); /** * Remove all profiles and comments * * @throws RuntimeException * * @return static */ public function strip(); /** * Generates a thumbnail from a current image * Returns it as a new image, doesn't modify the current image * * @param BoxInterface $size * @param string $mode * @param string $filter The filter to use for resizing, one of ImageInterface::FILTER_* * * @throws RuntimeException * * @return static */ public function thumbnail(BoxInterface $size, $mode = self::THUMBNAIL_INSET, $filter = ImageInterface::FILTER_UNDEFINED); /** * Applies a given mask to current image's alpha channel * * @param ImageInterface $mask * * @return static */ public function applyMask(ImageInterface $mask); /** * Fills image with provided filling, by replacing each pixel's color in * the current image with corresponding color from FillInterface, and * returns modified image * * @param FillInterface $fill * * @return static */ public function fill(FillInterface $fill); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Metadata/000077500000000000000000000000001361462701300264335ustar00rootroot00000000000000AbstractMetadataReader.php000066400000000000000000000047331361462701300334230ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Metadata * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Metadata; use Imagine\Exception\InvalidArgumentException; abstract class AbstractMetadataReader implements MetadataReaderInterface { /** * {@inheritdoc} */ public function readFile($file) { if (stream_is_local($file)) { if (!is_file($file)) { throw new InvalidArgumentException(sprintf('File %s does not exist.', $file)); } return new MetadataBag(array_merge(array('filepath' => realpath($file), 'uri' => $file), $this->extractFromFile($file))); } return new MetadataBag(array_merge(array('uri' => $file), $this->extractFromFile($file))); } /** * {@inheritdoc} */ public function readData($data) { return new MetadataBag($this->extractFromData($data)); } /** * {@inheritdoc} */ public function readStream($resource) { if (!is_resource($resource)) { throw new InvalidArgumentException('Invalid resource provided.'); } return new MetadataBag(array_merge($this->getStreamMetadata($resource), $this->extractFromStream($resource))); } /** * Gets the URI from a stream resource * * @param resource $resource * * @return string|null The URI f ava */ private function getStreamMetadata($resource) { $metadata = array(); if (false !== $data = @stream_get_meta_data($resource)) { $metadata['uri'] = $data['uri']; if (stream_is_local($resource)) { $metadata['filepath'] = realpath($data['uri']); } } return $metadata; } /** * Extracts metadata from a file * * @param $file * * @return array An associative array of metadata */ abstract protected function extractFromFile($file); /** * Extracts metadata from raw data * * @param $data * * @return array An associative array of metadata */ abstract protected function extractFromData($data); /** * Extracts metadata from a stream * * @param $resource * * @return array An associative array of metadata */ abstract protected function extractFromStream($resource); } DefaultMetadataReader.php000066400000000000000000000013441361462701300332370ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Metadata * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Metadata; /** * Default metadata reader */ class DefaultMetadataReader extends AbstractMetadataReader { /** * {@inheritdoc} */ protected function extractFromFile($file) { return array(); } /** * {@inheritdoc} */ protected function extractFromData($data) { return array(); } /** * {@inheritdoc} */ protected function extractFromStream($resource) { return array(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Metadata/ExifMetadataReader.php000066400000000000000000000053461361462701300326330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Metadata; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\NotSupportedException; /** * Metadata driven by Exif information */ class ExifMetadataReader extends AbstractMetadataReader { public function __construct() { if (!self::isSupported()) { throw new NotSupportedException('PHP exif extension is required to use the ExifMetadataReader'); } } public static function isSupported() { return function_exists('exif_read_data'); } /** * {@inheritdoc} */ protected function extractFromFile($file) { if (false === $data = @file_get_contents($file)) { throw new InvalidArgumentException(sprintf('File %s is not readable.', $file)); } return $this->doReadData($data); } /** * {@inheritdoc} */ protected function extractFromData($data) { return $this->doReadData($data); } /** * {@inheritdoc} */ protected function extractFromStream($resource) { if (0 < ftell($resource)) { $metadata = stream_get_meta_data($resource); if ($metadata['seekable']) { rewind($resource); } } return $this->doReadData(stream_get_contents($resource)); } /** * Extracts metadata from raw data, merges with existing metadata * * @param string $data * * @return MetadataBag */ private function doReadData($data) { if (substr($data, 0, 2) === 'II') { $mime = 'image/tiff'; } else { $mime = 'image/jpeg'; } return $this->extract('data://' . $mime . ';base64,' . base64_encode($data)); } /** * Performs the exif data extraction given a path or data-URI representation. * * @param string $path The path to the file or the data-URI representation. * * @return MetadataBag */ private function extract($path) { if (false === $exifData = @exif_read_data($path, null, true, false)) { return array(); } $metadata = array(); $sources = array('EXIF' => 'exif', 'IFD0' => 'ifd0'); foreach ($sources as $name => $prefix) { if (!isset($exifData[$name])) { continue; } foreach ($exifData[$name] as $prop => $value) { $metadata[$prefix.'.'.$prop] = $value; } } return $metadata; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Metadata/MetadataBag.php000066400000000000000000000034271361462701300313040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Metadata; /** * An interface for Image Metadata */ class MetadataBag implements \ArrayAccess, \IteratorAggregate, \Countable { /** @var array */ private $data; public function __construct(array $data = array()) { $this->data = $data; } /** * Returns the metadata key, default value if it does not exist * * @param string $key * @param mixed|null $default * * @return mixed */ public function get($key, $default = null) { return array_key_exists($key, $this->data) ? $this->data[$key] : $default; } /** * {@inheritdoc} */ public function count() { return count($this->data); } /** * {@inheritdoc} */ public function getIterator() { return new \ArrayIterator($this->data); } /** * {@inheritdoc} */ public function offsetExists($offset) { return array_key_exists($offset, $this->data); } /** * {@inheritdoc} */ public function offsetSet($offset, $value) { $this->data[$offset] = $value; } /** * {@inheritdoc} */ public function offsetUnset($offset) { unset($this->data[$offset]); } /** * {@inheritdoc} */ public function offsetGet($offset) { return $this->get($offset); } /** * Returns metadata as an array * * @return array An associative array */ public function toArray() { return $this->data; } } MetadataReaderInterface.php000066400000000000000000000021001361462701300335420ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Metadata * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Metadata; use Imagine\Exception\InvalidArgumentException; interface MetadataReaderInterface { /** * Reads metadata from a file. * * @param $file The path to the file where to read metadata. * * @throws InvalidArgumentException In case the file does not exist. * * @return MetadataBag */ public function readFile($file); /** * Reads metadata from a binary string. * * @param $data The binary string to read. * * @return MetadataBag */ public function readData($data); /** * Reads metadata from a stream. * * @param $resource The stream to read. * * @throws InvalidArgumentException In case the resource is not valid. * * @return MetadataBag */ public function readStream($resource); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/000077500000000000000000000000001361462701300263115ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/CMYK.php000066400000000000000000000055311361462701300275710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette; use Imagine\Image\Palette\Color\CMYK as CMYKColor; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Exception\RuntimeException; use Imagine\Exception\InvalidArgumentException; use Imagine\Image\Profile; use Imagine\Image\ProfileInterface; class CMYK implements PaletteInterface { private $parser; private $profile; private static $colors = array(); public function __construct() { $this->parser = new ColorParser(); } /** * {@inheritdoc} */ public function name() { return PaletteInterface::PALETTE_CMYK; } /** * {@inheritdoc} */ public function pixelDefinition() { return array( ColorInterface::COLOR_CYAN, ColorInterface::COLOR_MAGENTA, ColorInterface::COLOR_YELLOW, ColorInterface::COLOR_KEYLINE, ); } /** * {@inheritdoc} */ public function supportsAlpha() { return false; } /** * {@inheritdoc} */ public function color($color, $alpha = null) { if (null !== $alpha) { throw new InvalidArgumentException('CMYK palette does not support alpha'); } $color = $this->parser->parseToCMYK($color); $index = sprintf('cmyk(%d, %d, %d, %d)', $color[0], $color[1], $color[2], $color[3]); if (false === array_key_exists($index, self::$colors)) { self::$colors[$index] = new CMYKColor($this, $color); } return self::$colors[$index]; } /** * {@inheritdoc} */ public function blend(ColorInterface $color1, ColorInterface $color2, $amount) { if (!$color1 instanceof CMYKColor || ! $color2 instanceof CMYKColor) { throw new RuntimeException('CMYK palette can only blend CMYK colors'); } return $this->color(array( min(100, $color1->getCyan() + $color2->getCyan() * $amount), min(100, $color1->getMagenta() + $color2->getMagenta() * $amount), min(100, $color1->getYellow() + $color2->getYellow() * $amount), min(100, $color1->getKeyline() + $color2->getKeyline() * $amount), )); } /** * {@inheritdoc} */ public function useProfile(ProfileInterface $profile) { $this->profile = $profile; return $this; } /** * {@inheritdoc} */ public function profile() { if (!$this->profile) { $this->profile = Profile::fromPath(__DIR__ . '/../../resources/Adobe/CMYK/USWebUncoated.icc'); } return $this->profile; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/Color/000077500000000000000000000000001361462701300273675ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/Color/CMYK.php000066400000000000000000000107521361462701300306500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette\Color; use Imagine\Image\Palette\CMYK as CMYKPalette; use Imagine\Exception\RuntimeException; use Imagine\Exception\InvalidArgumentException; final class CMYK implements ColorInterface { /** * @var integer */ private $c; /** * @var integer */ private $m; /** * @var integer */ private $y; /** * @var integer */ private $k; /** * * @var CMYK */ private $palette; public function __construct(CMYKPalette $palette, array $color) { $this->palette = $palette; $this->setColor($color); } /** * {@inheritdoc} */ public function getValue($component) { switch ($component) { case ColorInterface::COLOR_CYAN: return $this->getCyan(); case ColorInterface::COLOR_MAGENTA: return $this->getMagenta(); case ColorInterface::COLOR_YELLOW: return $this->getYellow(); case ColorInterface::COLOR_KEYLINE: return $this->getKeyline(); default: throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); } } /** * Returns Cyan value of the color * * @return integer */ public function getCyan() { return $this->c; } /** * Returns Magenta value of the color * * @return integer */ public function getMagenta() { return $this->m; } /** * Returns Yellow value of the color * * @return integer */ public function getYellow() { return $this->y; } /** * Returns Key value of the color * * @return integer */ public function getKeyline() { return $this->k; } /** * {@inheritdoc} */ public function getPalette() { return $this->palette; } /** * {@inheritdoc} */ public function getAlpha() { return null; } /** * {@inheritdoc} */ public function dissolve($alpha) { throw new RuntimeException('CMYK does not support dissolution'); } /** * {@inheritdoc} */ public function lighten($shade) { return $this->palette->color( array( $this->c, $this->m, $this->y, max(0, $this->k - $shade), ) ); } /** * {@inheritdoc} */ public function darken($shade) { return $this->palette->color( array( $this->c, $this->m, $this->y, min(100, $this->k + $shade), ) ); } /** * {@inheritdoc} */ public function grayscale() { $color = array( $this->c * (1 - $this->k / 100) + $this->k, $this->m * (1 - $this->k / 100) + $this->k, $this->y * (1 - $this->k / 100) + $this->k, ); $gray = min(100, round(0.299 * $color[0] + 0.587 * $color[1] + 0.114 * $color[2])); return $this->palette->color(array($gray, $gray, $gray, $this->k)); } /** * {@inheritdoc} */ public function isOpaque() { return true; } /** * Returns hex representation of the color * * @return string */ public function __toString() { return sprintf('cmyk(%d%%, %d%%, %d%%, %d%%)', $this->c, $this->m, $this->y, $this->k); } /** * Internal, Performs checks for color validity (an of array(C, M, Y, K)) * * @param array $color * * @throws InvalidArgumentException */ private function setColor(array $color) { if (count($color) !== 4) { throw new InvalidArgumentException('Color argument must look like array(C, M, Y, K), where C, M, Y, K are the integer values between 0 and 255 for cyan, magenta, yellow and black color indexes accordingly'); } $colors = array_values($color); array_walk($colors, function ($color) { return max(0, min(100, $color)); }); list($this->c, $this->m, $this->y, $this->k) = $colors; } } ColorInterface.php000066400000000000000000000040071361462701300327210ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/Color * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette\Color; use Imagine\Image\Palette\PaletteInterface; interface ColorInterface { const COLOR_RED = 'red'; const COLOR_GREEN = 'green'; const COLOR_BLUE = 'blue'; const COLOR_CYAN = 'cyan'; const COLOR_MAGENTA = 'magenta'; const COLOR_YELLOW = 'yellow'; const COLOR_KEYLINE = 'keyline'; const COLOR_GRAY = 'gray'; /** * Return the value of one of the component. * * @param string $component One of the ColorInterface::COLOR_* component * * @return Integer */ public function getValue($component); /** * Returns percentage of transparency of the color * * @return integer */ public function getAlpha(); /** * Returns the palette attached to the current color * * @return PaletteInterface */ public function getPalette(); /** * Returns a copy of current color, incrementing the alpha channel by the * given amount * * @param integer $alpha * * @return ColorInterface */ public function dissolve($alpha); /** * Returns a copy of the current color, lightened by the specified number * of shades * * @param integer $shade * * @return ColorInterface */ public function lighten($shade); /** * Returns a copy of the current color, darkened by the specified number of * shades * * @param integer $shade * * @return ColorInterface */ public function darken($shade); /** * Returns a gray related to the current color * * @return ColorInterface */ public function grayscale(); /** * Checks if the current color is opaque * * @return Boolean */ public function isOpaque(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/Color/Gray.php000066400000000000000000000065221361462701300310070ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette\Color; use Imagine\Image\Palette\Grayscale; use Imagine\Exception\InvalidArgumentException; final class Gray implements ColorInterface { /** * @var integer */ private $gray; /** * @var integer */ private $alpha; /** * * @var Grayscale */ private $palette; public function __construct(Grayscale $palette, array $color, $alpha) { $this->palette = $palette; $this->setColor($color); $this->setAlpha($alpha); } /** * {@inheritdoc} */ public function getValue($component) { switch ($component) { case ColorInterface::COLOR_GRAY: return $this->getGray(); default: throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); } } /** * Returns Gray value of the color * * @return integer */ public function getGray() { return $this->gray; } /** * {@inheritdoc} */ public function getPalette() { return $this->palette; } /** * {@inheritdoc} */ public function getAlpha() { return $this->alpha; } /** * {@inheritdoc} */ public function dissolve($alpha) { return $this->palette->color( array($this->gray), $this->alpha + $alpha ); } /** * {@inheritdoc} */ public function lighten($shade) { return $this->palette->color(array(min(255, $this->gray + $shade)), $this->alpha); } /** * {@inheritdoc} */ public function darken($shade) { return $this->palette->color(array(max(0, $this->gray - $shade)), $this->alpha); } /** * {@inheritdoc} */ public function grayscale() { return $this; } /** * {@inheritdoc} */ public function isOpaque() { return 100 === $this->alpha; } /** * Returns hex representation of the color * * @return string */ public function __toString() { return sprintf('#%02x%02x%02x', $this->gray, $this->gray, $this->gray); } /** * Performs checks for validity of given alpha value and sets it * * @param integer $alpha * * @throws InvalidArgumentException */ private function setAlpha($alpha) { if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); } $this->alpha = $alpha; } /** * Performs checks for color validity (array of array(gray)) * * @param array $color * * @throws InvalidArgumentException */ private function setColor(array $color) { if (count($color) !== 1) { throw new InvalidArgumentException('Color argument must look like array(gray), where gray is the integer value between 0 and 255 for the grayscale'); } list($this->gray) = array_values($color); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/Color/RGB.php000066400000000000000000000106711361462701300305170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette\Color; use Imagine\Image\Palette\RGB as RGBPalette; use Imagine\Exception\InvalidArgumentException; final class RGB implements ColorInterface { /** * @var integer */ private $r; /** * @var integer */ private $g; /** * @var integer */ private $b; /** * @var integer */ private $alpha; /** * * @var RGBPalette */ private $palette; public function __construct(RGBPalette $palette, array $color, $alpha) { $this->palette = $palette; $this->setColor($color); $this->setAlpha($alpha); } /** * {@inheritdoc} */ public function getValue($component) { switch ($component) { case ColorInterface::COLOR_RED: return $this->getRed(); case ColorInterface::COLOR_GREEN: return $this->getGreen(); case ColorInterface::COLOR_BLUE: return $this->getBlue(); default: throw new InvalidArgumentException(sprintf('Color component %s is not valid', $component)); } } /** * Returns RED value of the color * * @return integer */ public function getRed() { return $this->r; } /** * Returns GREEN value of the color * * @return integer */ public function getGreen() { return $this->g; } /** * Returns BLUE value of the color * * @return integer */ public function getBlue() { return $this->b; } /** * {@inheritdoc} */ public function getPalette() { return $this->palette; } /** * {@inheritdoc} */ public function getAlpha() { return $this->alpha; } /** * {@inheritdoc} */ public function dissolve($alpha) { return $this->palette->color(array($this->r, $this->g, $this->b), $this->alpha + $alpha); } /** * {@inheritdoc} */ public function lighten($shade) { return $this->palette->color( array( min(255, $this->r + $shade), min(255, $this->g + $shade), min(255, $this->b + $shade), ), $this->alpha ); } /** * {@inheritdoc} */ public function darken($shade) { return $this->palette->color( array( max(0, $this->r - $shade), max(0, $this->g - $shade), max(0, $this->b - $shade), ), $this->alpha ); } /** * {@inheritdoc} */ public function grayscale() { $gray = min(255, round(0.299 * $this->getRed() + 0.114 * $this->getBlue() + 0.587 * $this->getGreen())); return $this->palette->color(array($gray, $gray, $gray), $this->alpha); } /** * {@inheritdoc} */ public function isOpaque() { return 100 === $this->alpha; } /** * Returns hex representation of the color * * @return string */ public function __toString() { return sprintf('#%02x%02x%02x', $this->r, $this->g, $this->b); } /** * Internal * * Performs checks for validity of given alpha value and sets it * * @param integer $alpha * * @throws InvalidArgumentException */ private function setAlpha($alpha) { if (!is_int($alpha) || $alpha < 0 || $alpha > 100) { throw new InvalidArgumentException(sprintf('Alpha must be an integer between 0 and 100, %s given', $alpha)); } $this->alpha = $alpha; } /** * Internal * * Performs checks for color validity (array of array(R, G, B)) * * @param array $color * * @throws InvalidArgumentException */ private function setColor(array $color) { if (count($color) !== 3) { throw new InvalidArgumentException('Color argument must look like array(R, G, B), where R, G, B are the integer values between 0 and 255 for red, green and blue color indexes accordingly'); } list($this->r, $this->g, $this->b) = array_values($color); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/ColorParser.php000066400000000000000000000106111361462701300312540ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette; use Imagine\Exception\InvalidArgumentException; class ColorParser { /** * Parses a color to a RGB tuple * * @param string|array|integer $color * * @return array * * @throws InvalidArgumentException */ public function parseToRGB($color) { $color = $this->parse($color); if (4 === count($color)) { $color = array( 255 * (1 - $color[0] / 100) * (1 - $color[3] / 100), 255 * (1 - $color[1] / 100) * (1 - $color[3] / 100), 255 * (1 - $color[2] / 100) * (1 - $color[3] / 100), ); } return $color; } /** * Parses a color to a CMYK tuple * * @param string|array|integer $color * * @return array * * @throws InvalidArgumentException */ public function parseToCMYK($color) { $color = $this->parse($color); if (3 === count($color)) { $r = $color[0] / 255; $g = $color[1] / 255; $b = $color[2] / 255; $k = 1 - max($r, $g, $b); $color = array( 1 === $k ? 0 : round((1 - $r - $k) / (1- $k) * 100), 1 === $k ? 0 : round((1 - $g - $k) / (1- $k) * 100), 1 === $k ? 0 : round((1 - $b - $k) / (1- $k) * 100), round($k * 100) ); } return $color; } /** * Parses a color to a grayscale value * * @param string|array|integer $color * * @return array * * @throws InvalidArgumentException */ public function parseToGrayscale($color) { if (is_array($color) && 1 === count($color)) { return array_values($color); } $color = array_unique($this->parse($color)); if (1 !== count($color)) { throw new InvalidArgumentException('The provided color has different values of red, green and blue components. Grayscale colors must have the same values for these.'); } return $color; } /** * Parses a color * * @param string|array|integer $color * * @return array * * @throws InvalidArgumentException */ private function parse($color) { if (!is_string($color) && !is_array($color) && !is_int($color)) { throw new InvalidArgumentException(sprintf('Color must be specified as a hexadecimal string, array or integer, %s given', gettype($color))); } if (is_array($color)) { if (3 === count($color) || 4 === count($color)) { return array_values($color); } throw new InvalidArgumentException('Color argument if array, must look like array(R, G, B), or array(C, M, Y, K) where R, G, B are the integer values between 0 and 255 for red, green and blue or cyan, magenta, yellow and black color indexes accordingly'); } if (is_string($color)) { if (0 === strpos($color, 'cmyk(')) { $substrColor = substr($color, 5, strlen($color) - 6); $components = array_map(function ($component) { return round(trim($component, ' %')); }, explode(',', $substrColor)); if (count($components) !== 4) { throw new InvalidArgumentException(sprintf('Unable to parse color %s', $color)); } return $components; } else { $color = ltrim($color, '#'); if (strlen($color) !== 3 && strlen($color) !== 6) { throw new InvalidArgumentException(sprintf('Color must be a hex value in regular (6 characters) or short (3 characters) notation, "%s" given', $color)); } if (strlen($color) === 3) { $color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2]; } $color = array_map('hexdec', str_split($color, 2)); } } if (is_int($color)) { $color = array(255 & ($color >> 16), 255 & ($color >> 8), 255 & $color); } return $color; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/Grayscale.php000066400000000000000000000054001361462701300307330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette; use Imagine\Image\Palette\Color\Gray as GrayColor; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\ProfileInterface; use Imagine\Image\Profile; use Imagine\Exception\RuntimeException; class Grayscale implements PaletteInterface { /** * @var ColorParser */ private $parser; /** * @var ProfileInterface */ private $profile; /** * @var array */ protected static $colors = array(); public function __construct() { $this->parser = new ColorParser(); } /** * {@inheritdoc} */ public function name() { return PaletteInterface::PALETTE_GRAYSCALE; } /** * {@inheritdoc} */ public function pixelDefinition() { return array(ColorInterface::COLOR_GRAY); } /** * {@inheritdoc} */ public function supportsAlpha() { return true; } /** * {@inheritdoc} */ public function useProfile(ProfileInterface $profile) { $this->profile = $profile; return $this; } /** * {@inheritdoc} */ public function profile() { if (!$this->profile) { $this->profile = Profile::fromPath(__DIR__ . '/../../resources/colormanagement.org/ISOcoated_v2_grey1c_bas.ICC'); } return $this->profile; } /** * {@inheritdoc} */ public function color($color, $alpha = null) { if (null === $alpha) { $alpha = 0; } $color = $this->parser->parseToGrayscale($color); $index = sprintf('#%02x%02x%02x-%d', $color[0], $color[0], $color[0], $alpha); if (false === array_key_exists($index, static::$colors)) { static::$colors[$index] = new GrayColor($this, $color, $alpha); } return static::$colors[$index]; } /** * {@inheritdoc} */ public function blend(ColorInterface $color1, ColorInterface $color2, $amount) { if (!$color1 instanceof GrayColor || ! $color2 instanceof GrayColor) { throw new RuntimeException('Grayscale palette can only blend Grayscale colors'); } return $this->color( array( (int) min(255, min($color1->getGray(), $color2->getGray()) + round(abs($color2->getGray() - $color1->getGray()) * $amount)), ), (int) min(100, min($color1->getAlpha(), $color2->getAlpha()) + round(abs($color2->getAlpha() - $color1->getAlpha()) * $amount)) ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/PaletteInterface.php000066400000000000000000000042121361462701300322400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette; use Imagine\Image\ProfileInterface; use Imagine\Image\Palette\Color\ColorInterface; interface PaletteInterface { const PALETTE_GRAYSCALE = 'gray'; const PALETTE_RGB = 'rgb'; const PALETTE_CMYK = 'cmyk'; /** * Returns a color given some values * * @param string|array|integer $color A color * @param integer|null $alpha Set alpha to null to disable it * * @return ColorInterface * * @throws InvalidArgumentException In case you pass an alpha value to a * Palette that does not support alpha */ public function color($color, $alpha = null); /** * Blend two colors given an amount * * @param ColorInterface $color1 * @param ColorInterface $color2 * @param float $amount The amount of color2 in color1 * * @return ColorInterface */ public function blend(ColorInterface $color1, ColorInterface $color2, $amount); /** * Attachs an ICC profile to this Palette. * * (A default profile is provided by default) * * @param ProfileInterface $profile * * @return PaletteInterface */ public function useProfile(ProfileInterface $profile); /** * Returns the ICC profile attached to this Palette. * * @return ProfileInterface */ public function profile(); /** * Returns the name of this Palette, one of PaletteInterface::PALETTE_* * constants * * @return String */ public function name(); /** * Returns an array containing ColorInterface::COLOR_* constants that * define the structure of colors for a pixel. * * @return array */ public function pixelDefinition(); /** * Tells if alpha channel is supported in this palette * * @return Boolean */ public function supportsAlpha(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Palette/RGB.php000066400000000000000000000061351361462701300274410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Palette; use Imagine\Image\Palette\Color\RGB as RGBColor; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\ProfileInterface; use Imagine\Image\Profile; use Imagine\Exception\RuntimeException; class RGB implements PaletteInterface { /** * @var ColorParser */ private $parser; /** * @var ProfileInterface */ private $profile; /** * @var array */ protected static $colors = array(); public function __construct() { $this->parser = new ColorParser(); } /** * {@inheritdoc} */ public function name() { return PaletteInterface::PALETTE_RGB; } /** * {@inheritdoc} */ public function pixelDefinition() { return array( ColorInterface::COLOR_RED, ColorInterface::COLOR_GREEN, ColorInterface::COLOR_BLUE, ); } /** * {@inheritdoc} */ public function supportsAlpha() { return true; } /** * {@inheritdoc} */ public function useProfile(ProfileInterface $profile) { $this->profile = $profile; return $this; } /** * {@inheritdoc} */ public function profile() { if (!$this->profile) { $this->profile = Profile::fromPath(__DIR__ . '/../../resources/color.org/sRGB_IEC61966-2-1_black_scaled.icc'); } return $this->profile; } /** * {@inheritdoc} */ public function color($color, $alpha = null) { if (null === $alpha) { $alpha = 100; } $color = $this->parser->parseToRGB($color); $index = sprintf('#%02x%02x%02x-%d', $color[0], $color[1], $color[2], $alpha); if (false === array_key_exists($index, static::$colors)) { static::$colors[$index] = new RGBColor($this, $color, $alpha); } return static::$colors[$index]; } /** * {@inheritdoc} */ public function blend(ColorInterface $color1, ColorInterface $color2, $amount) { if (!$color1 instanceof RGBColor || ! $color2 instanceof RGBColor) { throw new RuntimeException('RGB palette can only blend RGB colors'); } return $this->color( array( (int) min(255, min($color1->getRed(), $color2->getRed()) + round(abs($color2->getRed() - $color1->getRed()) * $amount)), (int) min(255, min($color1->getGreen(), $color2->getGreen()) + round(abs($color2->getGreen() - $color1->getGreen()) * $amount)), (int) min(255, min($color1->getBlue(), $color2->getBlue()) + round(abs($color2->getBlue() - $color1->getBlue()) * $amount)), ), (int) min(100, min($color1->getAlpha(), $color2->getAlpha()) + round(abs($color2->getAlpha() - $color1->getAlpha()) * $amount)) ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Point.php000066400000000000000000000031121361462701300265120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Exception\InvalidArgumentException; /** * The point class */ final class Point implements PointInterface { /** * @var integer */ private $x; /** * @var integer */ private $y; /** * Constructs a point of coordinates * * @param integer $x * @param integer $y * * @throws InvalidArgumentException */ public function __construct($x, $y) { if ($x < 0 || $y < 0) { throw new InvalidArgumentException(sprintf('A coordinate cannot be positioned outside of a bounding box (x: %s, y: %s given)', $x, $y)); } $this->x = $x; $this->y = $y; } /** * {@inheritdoc} */ public function getX() { return $this->x; } /** * {@inheritdoc} */ public function getY() { return $this->y; } /** * {@inheritdoc} */ public function in(BoxInterface $box) { return $this->x < $box->getWidth() && $this->y < $box->getHeight(); } /** * {@inheritdoc} */ public function move($amount) { return new Point($this->x + $amount, $this->y + $amount); } /** * {@inheritdoc} */ public function __toString() { return sprintf('(%d, %d)', $this->x, $this->y); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Point/000077500000000000000000000000001361462701300260045ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Point/Center.php000066400000000000000000000027151361462701300277420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image\Point; use Imagine\Image\BoxInterface; use Imagine\Image\Point as OriginalPoint; use Imagine\Image\PointInterface; /** * Point center */ final class Center implements PointInterface { /** * @var BoxInterface */ private $box; /** * Constructs coordinate with size instance, it needs to be relative to * * @param BoxInterface $box */ public function __construct(BoxInterface $box) { $this->box = $box; } /** * {@inheritdoc} */ public function getX() { return ceil($this->box->getWidth() / 2); } /** * {@inheritdoc} */ public function getY() { return ceil($this->box->getHeight() / 2); } /** * {@inheritdoc} */ public function in(BoxInterface $box) { return $this->getX() < $box->getWidth() && $this->getY() < $box->getHeight(); } /** * {@inheritdoc} */ public function move($amount) { return new OriginalPoint($this->getX() + $amount, $this->getY() + $amount); } /** * {@inheritdoc} */ public function __toString() { return sprintf('(%d, %d)', $this->getX(), $this->getY()); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/PointInterface.php000066400000000000000000000020571361462701300303420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; /** * The point interface */ interface PointInterface { /** * Gets points x coordinate * * @return integer */ public function getX(); /** * Gets points y coordinate * * @return integer */ public function getY(); /** * Checks if current coordinate is inside a given bo * * @param BoxInterface $box * * @return Boolean */ public function in(BoxInterface $box); /** * Returns another point, moved by a given amount from current coordinates * * @param integer $amount * @return ImageInterface */ public function move($amount); /** * Gets a string representation for the current point * * @return string */ public function __toString(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/Profile.php000066400000000000000000000023741361462701300270320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; use Imagine\Exception\InvalidArgumentException; class Profile implements ProfileInterface { private $data; private $name; public function __construct($name, $data) { $this->name = $name; $this->data = $data; } /** * {@inheritdoc} */ public function name() { return $this->name; } /** * {@inheritdoc} */ public function data() { return $this->data; } /** * Creates a profile from a path to a file * * @param String $path * * @return Profile * * @throws InvalidArgumentException In case the provided path is not valid */ public static function fromPath($path) { if (!file_exists($path) || !is_file($path) || !is_readable($path)) { throw new InvalidArgumentException(sprintf('Path %s is an invalid profile file or is not readable', $path)); } return new static(basename($path), file_get_contents($path)); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Image/ProfileInterface.php000066400000000000000000000010051361462701300306410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Image; interface ProfileInterface { /** * Returns the name of the profile * * @return String */ public function name(); /** * Returns the profile data * * @return String */ public function data(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Imagick/000077500000000000000000000000001361462701300252355ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Imagick/Drawer.php000066400000000000000000000271171361462701300272020ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Imagick; use Imagine\Draw\DrawerInterface; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; use Imagine\Image\AbstractFont; use Imagine\Image\BoxInterface; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Point; use Imagine\Image\PointInterface; /** * Drawer implementation using the Imagick PHP extension */ final class Drawer implements DrawerInterface { /** * @var Imagick */ private $imagick; /** * @param \Imagick $imagick */ public function __construct(\Imagick $imagick) { $this->imagick = $imagick; } /** * {@inheritdoc} */ public function arc(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $thickness = 1) { $x = $center->getX(); $y = $center->getY(); $width = $size->getWidth(); $height = $size->getHeight(); try { $pixel = $this->getColor($color); $arc = new \ImagickDraw(); $arc->setStrokeColor($pixel); $arc->setStrokeWidth(max(1, (int) $thickness)); $arc->setFillColor('transparent'); $arc->arc($x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end); $this->imagick->drawImage($arc); $pixel->clear(); $pixel->destroy(); $arc->clear(); $arc->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Draw arc operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function chord(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { $x = $center->getX(); $y = $center->getY(); $width = $size->getWidth(); $height = $size->getHeight(); try { $pixel = $this->getColor($color); $chord = new \ImagickDraw(); $chord->setStrokeColor($pixel); $chord->setStrokeWidth(max(1, (int) $thickness)); if ($fill) { $chord->setFillColor($pixel); } else { $this->line( new Point(round($x + $width / 2 * cos(deg2rad($start))), round($y + $height / 2 * sin(deg2rad($start)))), new Point(round($x + $width / 2 * cos(deg2rad($end))), round($y + $height / 2 * sin(deg2rad($end)))), $color ); $chord->setFillColor('transparent'); } $chord->arc( $x - $width / 2, $y - $height / 2, $x + $width / 2, $y + $height / 2, $start, $end ); $this->imagick->drawImage($chord); $pixel->clear(); $pixel->destroy(); $chord->clear(); $chord->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Draw chord operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function ellipse(PointInterface $center, BoxInterface $size, ColorInterface $color, $fill = false, $thickness = 1) { $width = $size->getWidth(); $height = $size->getHeight(); try { $pixel = $this->getColor($color); $ellipse = new \ImagickDraw(); $ellipse->setStrokeColor($pixel); $ellipse->setStrokeWidth(max(1, (int) $thickness)); if ($fill) { $ellipse->setFillColor($pixel); } else { $ellipse->setFillColor('transparent'); } $ellipse->ellipse( $center->getX(), $center->getY(), $width / 2, $height / 2, 0, 360 ); if (false === $this->imagick->drawImage($ellipse)) { throw new RuntimeException('Ellipse operation failed'); } $pixel->clear(); $pixel->destroy(); $ellipse->clear(); $ellipse->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Draw ellipse operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function line(PointInterface $start, PointInterface $end, ColorInterface $color, $thickness = 1) { try { $pixel = $this->getColor($color); $line = new \ImagickDraw(); $line->setStrokeColor($pixel); $line->setStrokeWidth(max(1, (int) $thickness)); $line->setFillColor($pixel); $line->line( $start->getX(), $start->getY(), $end->getX(), $end->getY() ); $this->imagick->drawImage($line); $pixel->clear(); $pixel->destroy(); $line->clear(); $line->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Draw line operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function pieSlice(PointInterface $center, BoxInterface $size, $start, $end, ColorInterface $color, $fill = false, $thickness = 1) { $width = $size->getWidth(); $height = $size->getHeight(); $x1 = round($center->getX() + $width / 2 * cos(deg2rad($start))); $y1 = round($center->getY() + $height / 2 * sin(deg2rad($start))); $x2 = round($center->getX() + $width / 2 * cos(deg2rad($end))); $y2 = round($center->getY() + $height / 2 * sin(deg2rad($end))); if ($fill) { $this->chord($center, $size, $start, $end, $color, true, $thickness); $this->polygon( array( $center, new Point($x1, $y1), new Point($x2, $y2), ), $color, true, $thickness ); } else { $this->arc($center, $size, $start, $end, $color, $thickness); $this->line($center, new Point($x1, $y1), $color, $thickness); $this->line($center, new Point($x2, $y2), $color, $thickness); } return $this; } /** * {@inheritdoc} */ public function dot(PointInterface $position, ColorInterface $color) { $x = $position->getX(); $y = $position->getY(); try { $pixel = $this->getColor($color); $point = new \ImagickDraw(); $point->setFillColor($pixel); $point->point($x, $y); $this->imagick->drawimage($point); $pixel->clear(); $pixel->destroy(); $point->clear(); $point->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Draw point operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function polygon(array $coordinates, ColorInterface $color, $fill = false, $thickness = 1) { if (count($coordinates) < 3) { throw new InvalidArgumentException(sprintf('Polygon must consist of at least 3 coordinates, %d given', count($coordinates))); } $points = array_map(function (PointInterface $p) { return array('x' => $p->getX(), 'y' => $p->getY()); }, $coordinates); try { $pixel = $this->getColor($color); $polygon = new \ImagickDraw(); $polygon->setStrokeColor($pixel); $polygon->setStrokeWidth(max(1, (int) $thickness)); if ($fill) { $polygon->setFillColor($pixel); } else { $polygon->setFillColor('transparent'); } $polygon->polygon($points); $this->imagick->drawImage($polygon); $pixel->clear(); $pixel->destroy(); $polygon->clear(); $polygon->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Draw polygon operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function text($string, AbstractFont $font, PointInterface $position, $angle = 0, $width = null) { try { $pixel = $this->getColor($font->getColor()); $text = new \ImagickDraw(); $text->setFont($font->getFile()); /** * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 * * ensure font resolution is the same as GD's hard-coded 96 */ if (version_compare(phpversion("imagick"), "3.0.2", ">=")) { $text->setResolution(96, 96); $text->setFontSize($font->getSize()); } else { $text->setFontSize((int) ($font->getSize() * (96 / 72))); } $text->setFillColor($pixel); $text->setTextAntialias(true); $info = $this->imagick->queryFontMetrics($text, $string); $rad = deg2rad($angle); $cos = cos($rad); $sin = sin($rad); // round(0 * $cos - 0 * $sin) $x1 = 0; $x2 = round($info['characterWidth'] * $cos - $info['characterHeight'] * $sin); // round(0 * $sin + 0 * $cos) $y1 = 0; $y2 = round($info['characterWidth'] * $sin + $info['characterHeight'] * $cos); $xdiff = 0 - min($x1, $x2); $ydiff = 0 - min($y1, $y2); if ($width !== null) { $string = $this->wrapText($string, $text, $angle, $width); } $this->imagick->annotateImage( $text, $position->getX() + $x1 + $xdiff, $position->getY() + $y2 + $ydiff, $angle, $string ); $pixel->clear(); $pixel->destroy(); $text->clear(); $text->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Draw text operation failed', $e->getCode(), $e); } return $this; } /** * Gets specifically formatted color string from ColorInterface instance * * @param ColorInterface $color * * @return string */ private function getColor(ColorInterface $color) { $pixel = new \ImagickPixel((string) $color); $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); return $pixel; } /** * Internal * * Fits a string into box with given width */ private function wrapText($string, $text, $angle, $width) { $result = ''; $words = explode(' ', $string); foreach ($words as $word) { $teststring = $result . ' ' . $word; $testbox = $this->imagick->queryFontMetrics($text, $teststring, true); if ($testbox['textWidth'] > $width) { $result .= ($result == '' ? '' : "\n") . $word; } else { $result .= ($result == '' ? '' : ' ') . $word; } } return $result; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Imagick/Effects.php000066400000000000000000000047401361462701300273320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Imagick; use Imagine\Effects\EffectsInterface; use Imagine\Exception\RuntimeException; use Imagine\Image\Palette\Color\ColorInterface; /** * Effects implementation using the Imagick PHP extension */ class Effects implements EffectsInterface { private $imagick; public function __construct(\Imagick $imagick) { $this->imagick = $imagick; } /** * {@inheritdoc} */ public function gamma($correction) { try { $this->imagick->gammaImage($correction, \Imagick::CHANNEL_ALL); } catch (\ImagickException $e) { throw new RuntimeException('Failed to apply gamma correction to the image'); } return $this; } /** * {@inheritdoc} */ public function negative() { try { $this->imagick->negateImage(false, \Imagick::CHANNEL_ALL); } catch (\ImagickException $e) { throw new RuntimeException('Failed to negate the image'); } return $this; } /** * {@inheritdoc} */ public function grayscale() { try { $this->imagick->setImageType(\Imagick::IMGTYPE_GRAYSCALE); } catch (\ImagickException $e) { throw new RuntimeException('Failed to grayscale the image'); } return $this; } /** * {@inheritdoc} */ public function colorize(ColorInterface $color) { try { $this->imagick->colorizeImage((string) $color, 1); } catch (\ImagickException $e) { throw new RuntimeException('Failed to colorize the image'); } return $this; } /** * {@inheritdoc} */ public function sharpen() { try { $this->imagick->sharpenImage(2, 1); } catch (\ImagickException $e) { throw new RuntimeException('Failed to sharpen the image'); } return $this; } /** * {@inheritdoc} */ public function blur($sigma = 1) { try { $this->imagick->gaussianBlurImage(0, $sigma); } catch (\ImagickException $e) { throw new RuntimeException('Failed to blur the image', $e->getCode(), $e); } return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Imagick/Font.php000066400000000000000000000031531361462701300266560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Imagick; use Imagine\Image\AbstractFont; use Imagine\Image\Box; use Imagine\Image\Palette\Color\ColorInterface; /** * Font implementation using the Imagick PHP extension */ final class Font extends AbstractFont { /** * @var \Imagick */ private $imagick; /** * @param \Imagick $imagick * @param string $file * @param integer $size * @param ColorInterface $color */ public function __construct(\Imagick $imagick, $file, $size, ColorInterface $color) { $this->imagick = $imagick; parent::__construct($file, $size, $color); } /** * {@inheritdoc} */ public function box($string, $angle = 0) { $text = new \ImagickDraw(); $text->setFont($this->file); /** * @see http://www.php.net/manual/en/imagick.queryfontmetrics.php#101027 * * ensure font resolution is the same as GD's hard-coded 96 */ if (version_compare(phpversion("imagick"), "3.0.2", ">=")) { $text->setResolution(96, 96); $text->setFontSize($this->size); } else { $text->setFontSize((int) ($this->size * (96 / 72))); } $info = $this->imagick->queryFontMetrics($text, $string); $box = new Box($info['textWidth'], $info['textHeight']); return $box; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Imagick/Image.php000066400000000000000000000661631361462701300270040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Imagick; use Imagine\Exception\OutOfBoundsException; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; use Imagine\Image\AbstractImage; use Imagine\Image\Box; use Imagine\Image\BoxInterface; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Image\Fill\FillInterface; use Imagine\Image\Fill\Gradient\Horizontal; use Imagine\Image\Fill\Gradient\Linear; use Imagine\Image\Point; use Imagine\Image\PointInterface; use Imagine\Image\ProfileInterface; use Imagine\Image\ImageInterface; use Imagine\Image\Palette\PaletteInterface; /** * Image implementation using the Imagick PHP extension */ final class Image extends AbstractImage { /** * @var \Imagick */ private $imagick; /** * @var Layers */ private $layers; /** * @var PaletteInterface */ private $palette; /** * @var Boolean */ private static $supportsColorspaceConversion; private static $colorspaceMapping = array( PaletteInterface::PALETTE_CMYK => \Imagick::COLORSPACE_CMYK, PaletteInterface::PALETTE_RGB => \Imagick::COLORSPACE_RGB, PaletteInterface::PALETTE_GRAYSCALE => \Imagick::COLORSPACE_GRAY, ); /** * Constructs a new Image instance * * @param \Imagick $imagick * @param PaletteInterface $palette * @param MetadataBag $metadata */ public function __construct(\Imagick $imagick, PaletteInterface $palette, MetadataBag $metadata) { $this->metadata = $metadata; $this->detectColorspaceConversionSupport(); $this->imagick = $imagick; if (static::$supportsColorspaceConversion) { $this->setColorspace($palette); } $this->palette = $palette; $this->layers = new Layers($this, $this->palette, $this->imagick); } /** * Destroys allocated imagick resources */ public function __destruct() { if ($this->imagick instanceof \Imagick) { $this->imagick->clear(); $this->imagick->destroy(); } } /** * Returns the underlying \Imagick instance * * @return \Imagick */ public function getImagick() { return $this->imagick; } /** * {@inheritdoc} * * @return ImageInterface */ public function copy() { try { if (version_compare(phpversion("imagick"), "3.1.0b1", ">=") || defined("HHVM_VERSION")) { $clone = clone $this->imagick; } else { $clone = $this->imagick->clone(); } } catch (\ImagickException $e) { throw new RuntimeException('Copy operation failed', $e->getCode(), $e); } return new self($clone, $this->palette, clone $this->metadata); } /** * {@inheritdoc} * * @return ImageInterface */ public function crop(PointInterface $start, BoxInterface $size) { if (!$start->in($this->getSize())) { throw new OutOfBoundsException('Crop coordinates must start at minimum 0, 0 position from top left corner, crop height and width must be positive integers and must not exceed the current image borders'); } try { $this->imagick->cropImage($size->getWidth(), $size->getHeight(), $start->getX(), $start->getY()); // Reset canvas for gif format $this->imagick->setImagePage(0, 0, 0, 0); } catch (\ImagickException $e) { throw new RuntimeException('Crop operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function flipHorizontally() { try { $this->imagick->flopImage(); } catch (\ImagickException $e) { throw new RuntimeException('Horizontal Flip operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function flipVertically() { try { $this->imagick->flipImage(); } catch (\ImagickException $e) { throw new RuntimeException('Vertical flip operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function strip() { try { try { $this->profile($this->palette->profile()); } catch (\Exception $e) { // here we discard setting the profile as the previous incorporated profile // is corrupted, let's now strip the image } $this->imagick->stripImage(); } catch (\ImagickException $e) { throw new RuntimeException('Strip operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function paste(ImageInterface $image, PointInterface $start) { if (!$image instanceof self) { throw new InvalidArgumentException(sprintf('Imagick\Image can only paste() Imagick\Image instances, %s given', get_class($image))); } if (!$this->getSize()->contains($image->getSize(), $start)) { throw new OutOfBoundsException('Cannot paste image of the given size at the specified position, as it moves outside of the current image\'s box'); } try { $this->imagick->compositeImage($image->imagick, \Imagick::COMPOSITE_DEFAULT, $start->getX(), $start->getY()); } catch (\ImagickException $e) { throw new RuntimeException('Paste operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function resize(BoxInterface $size, $filter = ImageInterface::FILTER_UNDEFINED) { try { $this->imagick->resizeImage($size->getWidth(), $size->getHeight(), $this->getFilter($filter), 1); } catch (\ImagickException $e) { throw new RuntimeException('Resize operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function rotate($angle, ColorInterface $background = null) { $color = $background ? $background : $this->palette->color('fff'); try { $pixel = $this->getColor($color); $this->imagick->rotateimage($pixel, $angle); $pixel->clear(); $pixel->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Rotate operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function save($path = null, array $options = array()) { $path = null === $path ? $this->imagick->getImageFilename() : $path; if (null === $path) { throw new RuntimeException('You can omit save path only if image has been open from a file'); } try { $this->prepareOutput($options, $path); $this->imagick->writeImages($path, true); } catch (\ImagickException $e) { throw new RuntimeException('Save operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} * * @return ImageInterface */ public function show($format, array $options = array()) { header('Content-type: '.$this->getMimeType($format)); echo $this->get($format, $options); return $this; } /** * {@inheritdoc} */ public function get($format, array $options = array()) { try { $options['format'] = $format; $this->prepareOutput($options); } catch (\ImagickException $e) { throw new RuntimeException('Get operation failed', $e->getCode(), $e); } return $this->imagick->getImagesBlob(); } /** * {@inheritdoc} */ public function interlace($scheme) { static $supportedInterlaceSchemes = array( ImageInterface::INTERLACE_NONE => \Imagick::INTERLACE_NO, ImageInterface::INTERLACE_LINE => \Imagick::INTERLACE_LINE, ImageInterface::INTERLACE_PLANE => \Imagick::INTERLACE_PLANE, ImageInterface::INTERLACE_PARTITION => \Imagick::INTERLACE_PARTITION, ); if (!array_key_exists($scheme, $supportedInterlaceSchemes)) { throw new InvalidArgumentException('Unsupported interlace type'); } $this->imagick->setInterlaceScheme($supportedInterlaceSchemes[$scheme]); return $this; } /** * @param array $options * @param string $path */ private function prepareOutput(array $options, $path = null) { if (isset($options['format'])) { $this->imagick->setImageFormat($options['format']); } if (isset($options['animated']) && true === $options['animated']) { $format = isset($options['format']) ? $options['format'] : 'gif'; $delay = isset($options['animated.delay']) ? $options['animated.delay'] : null; $loops = isset($options['animated.loops']) ? $options['animated.loops'] : 0; $options['flatten'] = false; $this->layers->animate($format, $delay, $loops); } else { $this->layers->merge(); } $this->applyImageOptions($this->imagick, $options, $path); // flatten only if image has multiple layers if ((!isset($options['flatten']) || $options['flatten'] === true) && count($this->layers) > 1) { $this->flatten(); } } /** * {@inheritdoc} */ public function __toString() { return $this->get('png'); } /** * {@inheritdoc} */ public function draw() { return new Drawer($this->imagick); } /** * {@inheritdoc} */ public function effects() { return new Effects($this->imagick); } /** * {@inheritdoc} */ public function getSize() { try { $i = $this->imagick->getIteratorIndex(); $this->imagick->rewind(); $width = $this->imagick->getImageWidth(); $height = $this->imagick->getImageHeight(); $this->imagick->setIteratorIndex($i); } catch (\ImagickException $e) { throw new RuntimeException('Could not get size', $e->getCode(), $e); } return new Box($width, $height); } /** * {@inheritdoc} * * @return ImageInterface */ public function applyMask(ImageInterface $mask) { if (!$mask instanceof self) { throw new InvalidArgumentException('Can only apply instances of Imagine\Imagick\Image as masks'); } $size = $this->getSize(); $maskSize = $mask->getSize(); if ($size != $maskSize) { throw new InvalidArgumentException(sprintf('The given mask doesn\'t match current image\'s size, Current mask\'s dimensions are %s, while image\'s dimensions are %s', $maskSize, $size)); } $mask = $mask->mask(); $mask->imagick->negateImage(true); try { // remove transparent areas of the original from the mask $mask->imagick->compositeImage($this->imagick, \Imagick::COMPOSITE_DSTIN, 0, 0); $this->imagick->compositeImage($mask->imagick, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); $mask->imagick->clear(); $mask->imagick->destroy(); } catch (\ImagickException $e) { throw new RuntimeException('Apply mask operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function mask() { $mask = $this->copy(); try { $mask->imagick->modulateImage(100, 0, 100); $mask->imagick->setImageMatte(false); } catch (\ImagickException $e) { throw new RuntimeException('Mask operation failed', $e->getCode(), $e); } return $mask; } /** * {@inheritdoc} * * @return ImageInterface */ public function fill(FillInterface $fill) { try { if ($this->isLinearOpaque($fill)) { $this->applyFastLinear($fill); } else { $iterator = $this->imagick->getPixelIterator(); foreach ($iterator as $y => $pixels) { foreach ($pixels as $x => $pixel) { $color = $fill->getColor(new Point($x, $y)); $pixel->setColor((string) $color); $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); } $iterator->syncIterator(); } } } catch (\ImagickException $e) { throw new RuntimeException('Fill operation failed', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function histogram() { try { $pixels = $this->imagick->getImageHistogram(); } catch (\ImagickException $e) { throw new RuntimeException('Error while fetching histogram', $e->getCode(), $e); } $image = $this; return array_map(function (\ImagickPixel $pixel) use ($image) { return $image->pixelToColor($pixel); },$pixels); } /** * {@inheritdoc} */ public function getColorAt(PointInterface $point) { if (!$point->in($this->getSize())) { throw new RuntimeException(sprintf('Error getting color at point [%s,%s]. The point must be inside the image of size [%s,%s]', $point->getX(), $point->getY(), $this->getSize()->getWidth(), $this->getSize()->getHeight())); } try { $pixel = $this->imagick->getImagePixelColor($point->getX(), $point->getY()); } catch (\ImagickException $e) { throw new RuntimeException('Error while getting image pixel color', $e->getCode(), $e); } return $this->pixelToColor($pixel); } /** * Returns a color given a pixel, depending the Palette context * * Note : this method is public for PHP 5.3 compatibility * * @param \ImagickPixel $pixel * * @return ColorInterface * * @throws InvalidArgumentException In case a unknown color is requested */ public function pixelToColor(\ImagickPixel $pixel) { static $colorMapping = array( ColorInterface::COLOR_RED => \Imagick::COLOR_RED, ColorInterface::COLOR_GREEN => \Imagick::COLOR_GREEN, ColorInterface::COLOR_BLUE => \Imagick::COLOR_BLUE, ColorInterface::COLOR_CYAN => \Imagick::COLOR_CYAN, ColorInterface::COLOR_MAGENTA => \Imagick::COLOR_MAGENTA, ColorInterface::COLOR_YELLOW => \Imagick::COLOR_YELLOW, ColorInterface::COLOR_KEYLINE => \Imagick::COLOR_BLACK, // There is no gray component in \Imagick, let's use one of the RGB comp ColorInterface::COLOR_GRAY => \Imagick::COLOR_RED, ); $alpha = $this->palette->supportsAlpha() ? (int) round($pixel->getColorValue(\Imagick::COLOR_ALPHA) * 100) : null; $palette = $this->palette(); return $this->palette->color(array_map(function ($color) use ($palette, $pixel, $colorMapping) { if (!isset($colorMapping[$color])) { throw new InvalidArgumentException(sprintf('Color %s is not mapped in Imagick', $color)); } $multiplier = 255; if ($palette->name() === PaletteInterface::PALETTE_CMYK) { $multiplier = 100; } return $pixel->getColorValue($colorMapping[$color]) * $multiplier; }, $this->palette->pixelDefinition()), $alpha); } /** * {@inheritdoc} */ public function layers() { return $this->layers; } /** * {@inheritdoc} */ public function usePalette(PaletteInterface $palette) { if (!isset(static::$colorspaceMapping[$palette->name()])) { throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); } if ($this->palette->name() === $palette->name()) { return $this; } if (!static::$supportsColorspaceConversion) { throw new RuntimeException('Your version of Imagick does not support colorspace conversions.'); } try { try { $hasICCProfile = (Boolean) $this->imagick->getImageProfile('icc'); } catch (\ImagickException $e) { $hasICCProfile = false; } if (!$hasICCProfile) { $this->profile($this->palette->profile()); } $this->profile($palette->profile()); $this->setColorspace($palette); } catch (\ImagickException $e) { throw new RuntimeException('Failed to set colorspace', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function palette() { return $this->palette; } /** * {@inheritdoc} */ public function profile(ProfileInterface $profile) { try { $this->imagick->profileImage('icc', $profile->data()); } catch (\ImagickException $e) { throw new RuntimeException(sprintf('Unable to add profile %s to image', $profile->name()), $e->getCode(), $e); } return $this; } /** * Internal * * Flatten the image. */ private function flatten() { /** * @see https://github.com/mkoppanen/imagick/issues/45 */ try { if (method_exists($this->imagick, 'mergeImageLayers') && defined('Imagick::LAYERMETHOD_UNDEFINED')) { $this->imagick = $this->imagick->mergeImageLayers(\Imagick::LAYERMETHOD_UNDEFINED); } elseif (method_exists($this->imagick, 'flattenImages')) { $this->imagick = $this->imagick->flattenImages(); } } catch (\ImagickException $e) { throw new RuntimeException('Flatten operation failed', $e->getCode(), $e); } } /** * Internal * * Applies options before save or output * * @param \Imagick $image * @param array $options * @param string $path * * @throws InvalidArgumentException * @throws RuntimeException */ private function applyImageOptions(\Imagick $image, array $options, $path) { if (isset($options['format'])) { $format = $options['format']; } elseif ('' !== $extension = pathinfo($path, \PATHINFO_EXTENSION)) { $format = $extension; } else { $format = pathinfo($image->getImageFilename(), \PATHINFO_EXTENSION); } $format = strtolower($format); $options = $this->updateSaveOptions($options); if (isset($options['jpeg_quality']) && in_array($format, array('jpeg', 'jpg', 'pjpeg'))) { $image->setImageCompressionQuality($options['jpeg_quality']); } if ((isset($options['png_compression_level']) || isset($options['png_compression_filter'])) && $format === 'png') { // first digit: compression level (default: 7) if (isset($options['png_compression_level'])) { if ($options['png_compression_level'] < 0 || $options['png_compression_level'] > 9) { throw new InvalidArgumentException('png_compression_level option should be an integer from 0 to 9'); } $compression = $options['png_compression_level'] * 10; } else { $compression = 70; } // second digit: compression filter (default: 5) if (isset($options['png_compression_filter'])) { if ($options['png_compression_filter'] < 0 || $options['png_compression_filter'] > 9) { throw new InvalidArgumentException('png_compression_filter option should be an integer from 0 to 9'); } $compression += $options['png_compression_filter']; } else { $compression += 5; } $image->setImageCompressionQuality($compression); } if (isset($options['resolution-units']) && isset($options['resolution-x']) && isset($options['resolution-y'])) { if ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { $image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERCENTIMETER); } elseif ($options['resolution-units'] == ImageInterface::RESOLUTION_PIXELSPERINCH) { $image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERINCH); } else { throw new RuntimeException('Unsupported image unit format'); } $filter = ImageInterface::FILTER_UNDEFINED; if (!empty($options['resampling-filter'])) { $filter = $options['resampling-filter']; } $image->setImageResolution($options['resolution-x'], $options['resolution-y']); $image->resampleImage($options['resolution-x'], $options['resolution-y'], $this->getFilter($filter), 0); } } /** * Gets specifically formatted color string from Color instance * * @param ColorInterface $color * * @return \ImagickPixel */ private function getColor(ColorInterface $color) { $pixel = new \ImagickPixel((string) $color); $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); return $pixel; } /** * Checks whether given $fill is linear and opaque * * @param FillInterface $fill * * @return Boolean */ private function isLinearOpaque(FillInterface $fill) { return $fill instanceof Linear && $fill->getStart()->isOpaque() && $fill->getEnd()->isOpaque(); } /** * Performs optimized gradient fill for non-opaque linear gradients * * @param Linear $fill */ private function applyFastLinear(Linear $fill) { $gradient = new \Imagick(); $size = $this->getSize(); $color = sprintf('gradient:%s-%s', (string) $fill->getStart(), (string) $fill->getEnd()); if ($fill instanceof Horizontal) { $gradient->newPseudoImage($size->getHeight(), $size->getWidth(), $color); $gradient->rotateImage(new \ImagickPixel(), 90); } else { $gradient->newPseudoImage($size->getWidth(), $size->getHeight(), $color); } $this->imagick->compositeImage($gradient, \Imagick::COMPOSITE_OVER, 0, 0); $gradient->clear(); $gradient->destroy(); } /** * Internal * * Get the mime type based on format. * * @param string $format * * @return string mime-type * * @throws RuntimeException */ private function getMimeType($format) { static $mimeTypes = array( 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'wbmp' => 'image/vnd.wap.wbmp', 'xbm' => 'image/xbm', ); if (!isset($mimeTypes[$format])) { throw new RuntimeException(sprintf('Unsupported format given. Only %s are supported, %s given', implode(", ", array_keys($mimeTypes)), $format)); } return $mimeTypes[$format]; } /** * Sets colorspace and image type, assigns the palette. * * @param PaletteInterface $palette * * @throws InvalidArgumentException */ private function setColorspace(PaletteInterface $palette) { static $typeMapping = array( // We use Matte variants to preserve alpha PaletteInterface::PALETTE_CMYK => \Imagick::IMGTYPE_TRUECOLORMATTE, PaletteInterface::PALETTE_RGB => \Imagick::IMGTYPE_TRUECOLORMATTE, PaletteInterface::PALETTE_GRAYSCALE => \Imagick::IMGTYPE_GRAYSCALEMATTE, ); if (!isset(static::$colorspaceMapping[$palette->name()])) { throw new InvalidArgumentException(sprintf('The palette %s is not supported by Imagick driver', $palette->name())); } $this->imagick->setType($typeMapping[$palette->name()]); $this->imagick->setColorspace(static::$colorspaceMapping[$palette->name()]); $this->palette = $palette; } /** * Older imagemagick versions does not support colorspace conversions. * Let's detect if it is supported. * * @return Boolean */ private function detectColorspaceConversionSupport() { if (null !== static::$supportsColorspaceConversion) { return static::$supportsColorspaceConversion; } return static::$supportsColorspaceConversion = method_exists('Imagick', 'setColorspace'); } /** * Returns the filter if it's supported. * * @param string $filter * * @return string * * @throws InvalidArgumentException If the filter is unsupported. */ private function getFilter($filter = ImageInterface::FILTER_UNDEFINED) { static $supportedFilters = array( ImageInterface::FILTER_UNDEFINED => \Imagick::FILTER_UNDEFINED, ImageInterface::FILTER_BESSEL => \Imagick::FILTER_BESSEL, ImageInterface::FILTER_BLACKMAN => \Imagick::FILTER_BLACKMAN, ImageInterface::FILTER_BOX => \Imagick::FILTER_BOX, ImageInterface::FILTER_CATROM => \Imagick::FILTER_CATROM, ImageInterface::FILTER_CUBIC => \Imagick::FILTER_CUBIC, ImageInterface::FILTER_GAUSSIAN => \Imagick::FILTER_GAUSSIAN, ImageInterface::FILTER_HANNING => \Imagick::FILTER_HANNING, ImageInterface::FILTER_HAMMING => \Imagick::FILTER_HAMMING, ImageInterface::FILTER_HERMITE => \Imagick::FILTER_HERMITE, ImageInterface::FILTER_LANCZOS => \Imagick::FILTER_LANCZOS, ImageInterface::FILTER_MITCHELL => \Imagick::FILTER_MITCHELL, ImageInterface::FILTER_POINT => \Imagick::FILTER_POINT, ImageInterface::FILTER_QUADRATIC => \Imagick::FILTER_QUADRATIC, ImageInterface::FILTER_SINC => \Imagick::FILTER_SINC, ImageInterface::FILTER_TRIANGLE => \Imagick::FILTER_TRIANGLE ); if (!array_key_exists($filter, $supportedFilters)) { throw new InvalidArgumentException(sprintf( 'The resampling filter "%s" is not supported by Imagick driver.', $filter )); } return $supportedFilters[$filter]; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Imagick/Imagine.php000066400000000000000000000120251361462701300273170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Imagick; use Imagine\Exception\NotSupportedException; use Imagine\Image\AbstractImagine; use Imagine\Image\BoxInterface; use Imagine\Image\Metadata\MetadataBag; use Imagine\Image\Palette\Color\ColorInterface; use Imagine\Exception\InvalidArgumentException; use Imagine\Exception\RuntimeException; use Imagine\Image\Palette\CMYK; use Imagine\Image\Palette\RGB; use Imagine\Image\Palette\Grayscale; /** * Imagine implementation using the Imagick PHP extension */ final class Imagine extends AbstractImagine { /** * @throws RuntimeException */ public function __construct() { if (!class_exists('Imagick')) { throw new RuntimeException('Imagick not installed'); } if (version_compare('6.2.9', $this->getVersion(new \Imagick())) > 0) { throw new RuntimeException('ImageMagick version 6.2.9 or higher is required'); } } /** * {@inheritdoc} */ public function open($path) { $path = $this->checkPath($path); try { $imagick = new \Imagick($path); $image = new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readFile($path)); } catch (\Exception $e) { throw new RuntimeException(sprintf('Unable to open image %s', $path), $e->getCode(), $e); } return $image; } /** * {@inheritdoc} */ public function create(BoxInterface $size, ColorInterface $color = null) { $width = $size->getWidth(); $height = $size->getHeight(); $palette = null !== $color ? $color->getPalette() : new RGB(); $color = null !== $color ? $color : $palette->color('fff'); try { $pixel = new \ImagickPixel((string) $color); $pixel->setColorValue(\Imagick::COLOR_ALPHA, $color->getAlpha() / 100); $imagick = new \Imagick(); $imagick->newImage($width, $height, $pixel); $imagick->setImageMatte(true); $imagick->setImageBackgroundColor($pixel); if (version_compare('6.3.1', $this->getVersion($imagick)) < 0) { $imagick->setImageOpacity($pixel->getColorValue(\Imagick::COLOR_ALPHA)); } $pixel->clear(); $pixel->destroy(); return new Image($imagick, $palette, new MetadataBag()); } catch (\ImagickException $e) { throw new RuntimeException('Could not create empty image', $e->getCode(), $e); } } /** * {@inheritdoc} */ public function load($string) { try { $imagick = new \Imagick(); $imagick->readImageBlob($string); $imagick->setImageMatte(true); return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readData($string)); } catch (\ImagickException $e) { throw new RuntimeException('Could not load image from string', $e->getCode(), $e); } } /** * {@inheritdoc} */ public function read($resource) { if (!is_resource($resource)) { throw new InvalidArgumentException('Variable does not contain a stream resource'); } try { $imagick = new \Imagick(); $imagick->readImageFile($resource); } catch (\ImagickException $e) { throw new RuntimeException('Could not read image from resource', $e->getCode(), $e); } return new Image($imagick, $this->createPalette($imagick), $this->getMetadataReader()->readStream($resource)); } /** * {@inheritdoc} */ public function font($file, $size, ColorInterface $color) { return new Font(new \Imagick(), $file, $size, $color); } /** * Returns the palette corresponding to an \Imagick resource colorspace * * @param \Imagick $imagick * * @return CMYK|Grayscale|RGB * * @throws NotSupportedException */ private function createPalette(\Imagick $imagick) { switch ($imagick->getImageColorspace()) { case \Imagick::COLORSPACE_RGB: case \Imagick::COLORSPACE_SRGB: return new RGB(); case \Imagick::COLORSPACE_CMYK: return new CMYK(); case \Imagick::COLORSPACE_GRAY: return new Grayscale(); default: throw new NotSupportedException('Only RGB and CMYK colorspace are currently supported'); } } /** * Returns ImageMagick version * * @param \Imagick $imagick * * @return string */ private function getVersion(\Imagick $imagick) { $v = $imagick->getVersion(); list($version) = sscanf($v['versionString'], 'ImageMagick %s %04d-%02d-%02d %s %s'); return $version; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Imagine/Imagick/Layers.php000066400000000000000000000156051361462701300272140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Imagine\Imagick; use Imagine\Image\AbstractLayers; use Imagine\Image\Metadata\MetadataBag; use Imagine\Exception\RuntimeException; use Imagine\Exception\OutOfBoundsException; use Imagine\Exception\InvalidArgumentException; use Imagine\Image\Palette\PaletteInterface; class Layers extends AbstractLayers { /** * @var Image */ private $image; /** * @var \Imagick */ private $resource; /** * @var integer */ private $offset = 0; /** * @var array */ private $layers = array(); private $palette; public function __construct(Image $image, PaletteInterface $palette, \Imagick $resource) { $this->image = $image; $this->resource = $resource; $this->palette = $palette; } /** * {@inheritdoc} */ public function merge() { foreach ($this->layers as $offset => $image) { try { $this->resource->setIteratorIndex($offset); $this->resource->setImage($image->getImagick()); } catch (\ImagickException $e) { throw new RuntimeException('Failed to substitute layer', $e->getCode(), $e); } } } /** * {@inheritdoc} */ public function animate($format, $delay, $loops) { if ('gif' !== strtolower($format)) { throw new InvalidArgumentException('Animated picture is currently only supported on gif'); } if (!is_int($loops) || $loops < 0) { throw new InvalidArgumentException('Loops must be a positive integer.'); } if (null !== $delay && (!is_int($delay) || $delay < 0)) { throw new InvalidArgumentException('Delay must be either null or a positive integer.'); } try { foreach ($this as $offset => $layer) { $this->resource->setIteratorIndex($offset); $this->resource->setFormat($format); if (null !== $delay) { $layer->getImagick()->setImageDelay($delay / 10); $layer->getImagick()->setImageTicksPerSecond(100); } $layer->getImagick()->setImageIterations($loops); $this->resource->setImage($layer->getImagick()); } } catch (\ImagickException $e) { throw new RuntimeException('Failed to animate layers', $e->getCode(), $e); } return $this; } /** * {@inheritdoc} */ public function coalesce() { try { $coalescedResource = $this->resource->coalesceImages(); } catch (\ImagickException $e) { throw new RuntimeException('Failed to coalesce layers', $e->getCode(), $e); } $count = $coalescedResource->getNumberImages(); for ($offset = 0; $offset < $count; $offset++) { try { $coalescedResource->setIteratorIndex($offset); $this->layers[$offset] = new Image($coalescedResource->getImage(), $this->palette, new MetadataBag()); } catch (\ImagickException $e) { throw new RuntimeException('Failed to retrieve layer', $e->getCode(), $e); } } } /** * {@inheritdoc} */ public function current() { return $this->extractAt($this->offset); } /** * Tries to extract layer at given offset * * @param integer $offset * * @return Image * @throws RuntimeException */ private function extractAt($offset) { if (!isset($this->layers[$offset])) { try { $this->resource->setIteratorIndex($offset); $this->layers[$offset] = new Image($this->resource->getImage(), $this->palette, new MetadataBag()); } catch (\ImagickException $e) { throw new RuntimeException(sprintf('Failed to extract layer %d', $offset), $e->getCode(), $e); } } return $this->layers[$offset]; } /** * {@inheritdoc} */ public function key() { return $this->offset; } /** * {@inheritdoc} */ public function next() { ++$this->offset; } /** * {@inheritdoc} */ public function rewind() { $this->offset = 0; } /** * {@inheritdoc} */ public function valid() { return $this->offset < count($this); } /** * {@inheritdoc} */ public function count() { try { return $this->resource->getNumberImages(); } catch (\ImagickException $e) { throw new RuntimeException('Failed to count the number of layers', $e->getCode(), $e); } } /** * {@inheritdoc} */ public function offsetExists($offset) { return is_int($offset) && $offset >= 0 && $offset < count($this); } /** * {@inheritdoc} */ public function offsetGet($offset) { return $this->extractAt($offset); } /** * {@inheritdoc} */ public function offsetSet($offset, $image) { if (!$image instanceof Image) { throw new InvalidArgumentException('Only an Imagick Image can be used as layer'); } if (null === $offset) { $offset = count($this) - 1; } else { if (!is_int($offset)) { throw new InvalidArgumentException('Invalid offset for layer, it must be an integer'); } if (count($this) < $offset || 0 > $offset) { throw new OutOfBoundsException(sprintf('Invalid offset for layer, it must be a value between 0 and %d, %d given', count($this), $offset)); } if (isset($this[$offset])) { unset($this[$offset]); $offset = $offset - 1; } } $frame = $image->getImagick(); try { if (count($this) > 0) { $this->resource->setIteratorIndex($offset); } $this->resource->addImage($frame); } catch (\ImagickException $e) { throw new RuntimeException('Unable to set the layer', $e->getCode(), $e); } $this->layers = array(); } /** * {@inheritdoc} */ public function offsetUnset($offset) { try { $this->extractAt($offset); } catch (RuntimeException $e) { return; } try { $this->resource->setIteratorIndex($offset); $this->resource->removeImage(); } catch (\ImagickException $e) { throw new RuntimeException('Unable to remove layer', $e->getCode(), $e); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/000077500000000000000000000000001361462701300235045ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/000077500000000000000000000000001361462701300243565ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Collection.php000066400000000000000000000053301361462701300271630ustar00rootroot00000000000000aItems = array(); } /** * @param mixed $mItem * @param bool $bToTop = false * @return self */ public function Add($mItem, $bToTop = false) { if ($bToTop) { \array_unshift($this->aItems, $mItem); } else { \array_push($this->aItems, $mItem); } return $this; } /** * @param array $aItems * @return self * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function AddArray($aItems) { if (!\is_array($aItems)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } foreach ($aItems as $mItem) { $this->Add($mItem); } return $this; } /** * @return self */ public function Clear() { $this->aItems = array(); return $this; } /** * @return array */ public function CloneAsArray() { return $this->aItems; } /** * @return int */ public function Count() { return \count($this->aItems); } /** * @return array */ public function &GetAsArray() { return $this->aItems; } /** * @param mixed $mCallback */ public function MapList($mCallback) { $aResult = array(); if (\is_callable($mCallback)) { foreach ($this->aItems as $oItem) { $aResult[] = \call_user_func($mCallback, $oItem); } } return $aResult; } /** * @param mixed $mCallback * @return array */ public function FilterList($mCallback) { $aResult = array(); if (\is_callable($mCallback)) { foreach ($this->aItems as $oItem) { if (\call_user_func($mCallback, $oItem)) { $aResult[] = $oItem; } } } return $aResult; } /** * @param mixed $mCallback * @return void */ public function ForeachList($mCallback) { if (\is_callable($mCallback)) { foreach ($this->aItems as $oItem) { \call_user_func($mCallback, $oItem); } } } /** * @return mixed | null * @return mixed */ public function &GetByIndex($iIndex) { $mResult = null; if (\key_exists($iIndex, $this->aItems)) { $mResult = $this->aItems[$iIndex]; } return $mResult; } /** * @param array $aItems * @return self * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetAsArray($aItems) { if (!\is_array($aItems)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->aItems = $aItems; return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Crypt.php000066400000000000000000000076611361462701300262020ustar00rootroot00000000000000> 2 & 3; for ($iPIndex = 0; $iPIndex < $iN; $iPIndex++) { $iY = $aV[$iPIndex + 1]; $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); $iZ = $aV[$iPIndex] = self::int32($aV[$iPIndex] + $iMx); } $iY = $aV[0]; $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); $iZ = $aV[$iN] = self::int32($aV[$iN] + $iMx); } return self::long2str($aV, false); } /** * @param string $sEncriptedString * @param string $sKey * * @return string */ public static function XxteaDecrypt($sEncriptedString, $sKey) { if (0 === \strlen($sEncriptedString)) { return ''; } $aV = self::str2long($sEncriptedString, false); $aK = self::str2long($sKey, false); if (\count($aK) < 4) { for ($iIndex = \count($aK); $iIndex < 4; $iIndex++) { $aK[$iIndex] = 0; } } $iN = \count($aV) - 1; $iZ = $aV[$iN]; $iY = $aV[0]; $iDelta = 0x9E3779B9; $iQ = \floor(6 + 52 / ($iN + 1)); $iSum = self::int32($iQ * $iDelta); while ($iSum != 0) { $iE = $iSum >> 2 & 3; for ($iPIndex = $iN; $iPIndex > 0; $iPIndex--) { $iZ = $aV[$iPIndex - 1]; $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); $iY = $aV[$iPIndex] = self::int32($aV[$iPIndex] - $iMx); } $iZ = $aV[$iN]; $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) + (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ)); $iY = $aV[0] = self::int32($aV[0] - $iMx); $iSum = self::int32($iSum - $iDelta); } return self::long2str($aV, true); } /** * @param array $aV * @param array $aW * * @return string */ private static function long2str($aV, $aW) { $iLen = \count($aV); $iN = ($iLen - 1) << 2; if ($aW) { $iM = $aV[$iLen - 1]; if (($iM < $iN - 3) || ($iM > $iN)) { return false; } $iN = $iM; } $aS = array(); for ($iIndex = 0; $iIndex < $iLen; $iIndex++) { $aS[$iIndex] = \pack('V', $aV[$iIndex]); } if ($aW) { return \substr(\join('', $aS), 0, $iN); } else { return \join('', $aS); } } /** * @param string $sS * @param string $sW * * @return array */ private static function str2long($sS, $sW) { $aV = \unpack('V*', $sS . \str_repeat("\0", (4 - \strlen($sS) % 4) & 3)); $aV = \array_values($aV); if ($sW) { $aV[\count($aV)] = \strlen($sS); } return $aV; } /** * @param int $iN * * @return int */ private static function int32($iN) { while ($iN >= 2147483648) { $iN -= 4294967296; } while ($iN <= -2147483649) { $iN += 4294967296; } return (int) $iN; } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php000066400000000000000000000070741361462701300277330ustar00rootroot00000000000000getTimestamp() : 0; } /** * Parse date string formated as "10-Jan-2012 01:58:17 -0800" * IMAP INTERNALDATE Format * * @param string $sDateTime * * @return int */ public static function ParseInternalDateString($sDateTime) { $sDateTime = \trim($sDateTime); if (empty($sDateTime)) { return 0; } if (\preg_match('/^[a-z]{2,4}, /i', $sDateTime)) // RFC2822 ~ "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)" { return \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sDateTime); } $oDateTime = \DateTime::createFromFormat('d-M-Y H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); return $oDateTime ? $oDateTime->getTimestamp() : 0; } /** * Parse date string formated as "2011-06-14 23:59:59 +0400" * * @param string $sDateTime * * @return int */ public static function ParseDateStringType1($sDateTime) { $sDateTime = \trim($sDateTime); if (empty($sDateTime)) { return 0; } $oDateTime = \DateTime::createFromFormat('Y-m-d H:i:s O', $sDateTime, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); return $oDateTime ? $oDateTime->getTimestamp() : 0; } /** * Parse date string formated as "2015-05-08T14:32:18.483-07:00" * * @param string $sDateTime * * @return int */ public static function TryToParseSpecEtagFormat($sDateTime) { $sDateTime = \trim(\preg_replace('/ \([a-zA-Z0-9]+\)$/', '', \trim($sDateTime))); $sDateTime = \trim(\preg_replace('/(:[\d]{2})\.[\d]{3}/', '$1', \trim($sDateTime))); $sDateTime = \trim(\preg_replace('/(-[\d]{2})T([\d]{2}:)/', '$1 $2', \trim($sDateTime))); $sDateTime = \trim(\preg_replace('/([\-+][\d]{2}):([\d]{2})$/', ' $1$2', \trim($sDateTime))); return \MailSo\Base\DateTimeHelper::ParseDateStringType1($sDateTime); } /** * @param string $sTime * * @return int */ public static function TimeToSec($sTime) { $iMod = 1; $sTime = \trim($sTime); if ('-' === \substr($sTime, 0, 1)) { $iMod = -1; $sTime = \substr($sTime, 1); } $aParts = \preg_split('/[:.,]/', (string) $sTime); $iResult = 0; if (isset($aParts[0]) && \is_numeric($aParts[0])) { $iResult += 3600 * ((int) $aParts[0]); } if (isset($aParts[1]) && \is_numeric($aParts[1])) { $iResult += 60 * ((int) $aParts[1]); } return $iResult * $iMod; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Enumerations/000077500000000000000000000000001361462701300270275ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Enumerations/Charset.php000066400000000000000000000015661361462701300311410ustar00rootroot00000000000000getFile()).' ~ '.$this->getLine().')' : $sMessage; parent::__construct($sMessage, $iCode, $oPrevious); } } InvalidArgumentException.php000066400000000000000000000006031361462701300341000ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/ExceptionshasAttributes() && isset($oElement->attributes) && $oElement->attributes) { foreach ($oElement->attributes as $oAttr) { if ($oAttr && !empty($oAttr->nodeName)) { $sAttrName = \trim(\strtolower($oAttr->nodeName)); $aResult[$sAttrName] = $oAttr->nodeValue; } } } } return $aResult; } /** * @param string $sText * * @return \DOMDocument|bool */ public static function GetDomFromText($sText) { $bState = true; if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_use_internal_errors')) { $bState = \libxml_use_internal_errors(true); } $sHtmlAttrs = $sBodyAttrs = ''; $sText = \MailSo\Base\HtmlUtils::FixSchemas($sText); $sText = \MailSo\Base\HtmlUtils::ClearFastTags($sText); $sText = \MailSo\Base\HtmlUtils::ClearBodyAndHtmlTag($sText, $sHtmlAttrs, $sBodyAttrs); $oDom = self::createDOMDocument(); @$oDom->loadHTML('<'.'?xml version="1.0" encoding="utf-8"?'.'>'. ''. ''. ''.\MailSo\Base\Utils::Utf8Clear($sText).''); @$oDom->normalizeDocument(); if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_clear_errors')) { @\libxml_clear_errors(); } if (\MailSo\Base\Utils::FunctionExistsAndEnabled('libxml_use_internal_errors')) { \libxml_use_internal_errors($bState); } return $oDom; } /** * @return \DOMDocument */ private static function createDOMDocument() { $oDoc = new \DOMDocument('1.0', 'UTF-8'); $oDoc->encoding = 'UTF-8'; $oDoc->strictErrorChecking = false; $oDoc->formatOutput = false; $oDoc->preserveWhiteSpace = false; return $oDoc; } /** * @return boolean */ private static function comparedVersion() { return \version_compare(PHP_VERSION, '5.3.6') >= 0; } /** * @param \DOMDocument|\DOMElement $oElem * * @return string */ private static function domToString($oElem, $oDom = null) { $sResult = ''; if ($oElem instanceof \DOMDocument) { if (isset($oElem->documentElement) && self::comparedVersion()) { $sResult = $oElem->saveHTML($oElem->documentElement); } else { $sResult = $oElem->saveHTML(); } } else if ($oElem) { if ($oDom && self::comparedVersion()) { $sResult = $oDom->saveHTML($oElem); } else { $oTempDoc = self::createDOMDocument(); $oTempDoc->appendChild($oTempDoc->importNode($oElem->cloneNode(true), true)); $sResult = $oTempDoc->saveHTML(); } } return \trim($sResult); } /** * @param \DOMDocument $oDom * @param bool $bWrapByFakeHtmlAndBodyDiv = true * * @return string */ public static function GetTextFromDom_($oDom, $bWrapByFakeHtmlAndBodyDiv = true) { $sResult = ''; $aHtmlAttrs = $aBodylAttrs = array(); if ($bWrapByFakeHtmlAndBodyDiv) { $oHtml = $oDom->getElementsByTagName('html')->item(0); $oBody = $oDom->getElementsByTagName('body')->item(0); $aHtmlAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oHtml); $aBodylAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oBody); } $oDiv = $oDom->getElementsByTagName('div')->item(0); if ($oDiv && $oDiv->hasAttribute('data-wrp') && 'rainloop' === $oDiv->getAttribute('data-wrp')) { $oDiv->removeAttribute('data-wrp'); if ($bWrapByFakeHtmlAndBodyDiv) { $oWrap = $oDom->createElement('div'); $oWrap->setAttribute('data-x-div-type', 'html'); foreach ($aHtmlAttrs as $sKey => $sValue) { $oWrap->setAttribute($sKey, $sValue); } $oDiv->setAttribute('data-x-div-type', 'body'); foreach ($aBodylAttrs as $sKey => $sValue) { $oDiv->setAttribute($sKey, $sValue); } $oWrap->appendChild($oDiv); $sResult = self::domToString($oWrap, $oDom); } else { $sResult = self::domToString($oDiv, $oDom); } } else { $sResult = self::domToString($oDom); } $sResult = \str_replace(\MailSo\Base\HtmlUtils::$KOS, ':', $sResult); $sResult = \MailSo\Base\Utils::StripSpaces($sResult); return $sResult; } /** * @param \DOMDocument $oDom * @param bool $bWrapByFakeHtmlAndBodyDiv = true * * @return string */ public static function GetTextFromDom($oDom, $bWrapByFakeHtmlAndBodyDiv = true) { $sResult = ''; $oHtml = $oDom->getElementsByTagName('html')->item(0); $oBody = $oDom->getElementsByTagName('body')->item(0); foreach ($oBody->childNodes as $oChild) { $sResult .= $oDom->saveHTML($oChild); } if ($bWrapByFakeHtmlAndBodyDiv) { $aHtmlAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oHtml); $aBodylAttrs = \MailSo\Base\HtmlUtils::GetElementAttributesAsArray($oBody); $oWrapHtml = $oDom->createElement('div'); $oWrapHtml->setAttribute('data-x-div-type', 'html'); foreach ($aHtmlAttrs as $sKey => $sValue) { $oWrapHtml->setAttribute($sKey, $sValue); } $oWrapDom = $oDom->createElement('div', '___xxx___'); $oWrapDom->setAttribute('data-x-div-type', 'body'); foreach ($aBodylAttrs as $sKey => $sValue) { $oWrapDom->setAttribute($sKey, $sValue); } $oWrapHtml->appendChild($oWrapDom); $sWrp = $oDom->saveHTML($oWrapHtml); $sResult = \str_replace('___xxx___', $sResult, $sWrp); } $sResult = \str_replace(\MailSo\Base\HtmlUtils::$KOS, ':', $sResult); $sResult = \MailSo\Base\Utils::StripSpaces($sResult); return $sResult; } /** * @param string $sHtml * @param string $sHtmlAttrs = '' * @param string $sBodyAttrs = '' * * @return string */ public static function ClearBodyAndHtmlTag($sHtml, &$sHtmlAttrs = '', &$sBodyAttrs = '') { $aMatch = array(); if (\preg_match('/]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1])) { $sHtmlAttrs = $aMatch[1]; } $aMatch = array(); if (\preg_match('/]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1])) { $sBodyAttrs = $aMatch[1]; } $sHtml = \preg_replace('/]*)>/si', '', $sHtml); $sHtml = \preg_replace('/]*)>/si', '', $sHtml); $sHtml = \preg_replace('/<\/body>/i', '', $sHtml); $sHtml = \preg_replace('/]*)>/i', '', $sHtml); $sHtml = \preg_replace('/<\/html>/i', '', $sHtml); $sHtmlAttrs = \preg_replace('/xmlns:[a-z]="[^"]*"/i', '', $sHtmlAttrs); $sHtmlAttrs = \preg_replace('/xmlns:[a-z]=\'[^\']*\'/i', '', $sHtmlAttrs); $sHtmlAttrs = \preg_replace('/xmlns="[^"]*"/i', '', $sHtmlAttrs); $sHtmlAttrs = \preg_replace('/xmlns=\'[^\']*\'/i', '', $sHtmlAttrs); $sBodyAttrs = \preg_replace('/xmlns:[a-z]="[^"]*"/i', '', $sBodyAttrs); $sBodyAttrs = \preg_replace('/xmlns:[a-z]=\'[^\']*\'/i', '', $sBodyAttrs); $sHtmlAttrs = trim($sHtmlAttrs); $sBodyAttrs = trim($sBodyAttrs); return $sHtml; } /** * @param string $sHtml * @param bool $bClearEmpty = true * * @return string */ public static function FixSchemas($sHtml, $bClearEmpty = true) { if ($bClearEmpty) { $sHtml = \str_replace('', '', $sHtml); } $sHtml = \str_replace('', '', $sHtml); $sHtml = \str_replace('', '', $sHtml); return $sHtml; } /** * @param string $sHtml * * @return string */ public static function ClearFastTags($sHtml) { return \preg_replace(array( '/]*><\/p>/i', '/]*>/i', '/<\?xml [^>]*\?>/i' ), '', $sHtml); } /** * @param mixed $oDom */ public static function ClearComments(&$oDom) { $aRemove = array(); $oXpath = new \DOMXpath($oDom); $oComments = $oXpath->query('//comment()'); if ($oComments) { foreach ($oComments as $oComment) { $aRemove[] = $oComment; } } unset($oXpath, $oComments); foreach ($aRemove as /* @var $oElement \DOMElement */ $oElement) { if (isset($oElement->parentNode)) { @$oElement->parentNode->removeChild($oElement); } } } /** * @param mixed $oDom * @param bool $bClearStyleAndHead = true */ public static function ClearTags(&$oDom, $bClearStyleAndHead = true) { $aRemoveTags = array( 'svg', 'link', 'base', 'meta', 'title', 'x-script', 'script', 'bgsound', 'keygen', 'source', 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio', 'area', 'map' ); if ($bClearStyleAndHead) { $aRemoveTags[] = 'head'; $aRemoveTags[] = 'style'; } $aHtmlAllowedTags = isset(\MailSo\Config::$HtmlStrictAllowedTags) && \is_array(\MailSo\Config::$HtmlStrictAllowedTags) && 0 < \count(\MailSo\Config::$HtmlStrictAllowedTags) ? \MailSo\Config::$HtmlStrictAllowedTags : null; $aRemove = array(); $aNodes = $oDom->getElementsByTagName('*'); foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) { if ($oElement) { $sTagNameLower = \trim(\strtolower($oElement->tagName)); if ('' !== $sTagNameLower) { if (\in_array($sTagNameLower, $aRemoveTags) || ($aHtmlAllowedTags && !\in_array($sTagNameLower, $aHtmlAllowedTags))) { $aRemove[] = @$oElement; } } } } foreach ($aRemove as /* @var $oElement \DOMElement */ $oElement) { if (isset($oElement->parentNode)) { @$oElement->parentNode->removeChild($oElement); } } } /* // public static function ClearStyleUrlValueParserHelper($oUrlValue, $oRule, $oRuleSet, // $oElem = null, // &$bHasExternals = false, &$aFoundCIDs = array(), // $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), // $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null // ) // { // if ($oUrlValue instanceof \Sabberworm\CSS\Value\URL) // { // $oNewRule = new \Sabberworm\CSS\Rule\Rule('x-rl-orig-'.$oRule->getRule()); // $oNewRule->setValue((string) $oRule->getValue()); // $oNewRule->setIsImportant($oRule->getIsImportant()); // // $oRuleSet->addRule($oNewRule); // // $oUrl = $oUrlValue->getURL(); // $sUrl = $oUrl ? $oUrl->getString() : ''; // // if ('cid:' === \strtolower(\substr($sUrl, 0, 4))) // { // $aFoundCIDs[] = \substr($sUrl, 4); // // $oRule->setRule('x-rl-mod-'.$oRule->getRule()); // // if ($oElem) // { // $oElem->setAttribute('data-x-style-mod', '1'); // } // } // else // { // if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) // { // $oRule->setRule('x-rl-mod-'.$oRule->getRule()); // // if (\in_array($sUrl, $aContentLocationUrls)) // { // $aFoundedContentLocationUrls[] = $sUrl; // } // else // { // $bHasExternals = true; // if (!$bDoNotReplaceExternalUrl) // { // if ($fAdditionalExternalFilter) // { // $sAdditionalResult = \call_user_func($fAdditionalExternalFilter, $sUrl); // if (0 < \strlen($sAdditionalResult) && $oUrl) // { // $oUrl->setString($sAdditionalResult); // } // } // } // } // // if ($oElem) // { // $oElem->setAttribute('data-x-style-mod', '1'); // } // } // else if ('data:image/' !== \strtolower(\substr(\trim($sUrl), 0, 11))) // { // $oRuleSet->removeRule($oRule); // } // } // } // else if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) // { // if ('x-rl-' !== \substr($oRule->getRule(), 0, 5)) // { // $oValue = $oRule->getValue(); // if ($oValue instanceof \Sabberworm\CSS\Value\URL) // { // \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, // $bHasExternals, $aFoundCIDs, // $aContentLocationUrls, $aFoundedContentLocationUrls, // $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); // } // else if ($oValue instanceof \Sabberworm\CSS\Value\RuleValueList) // { // $aComps = $oValue->getListComponents(); // foreach ($aComps as $oValue) // { // if ($oValue instanceof \Sabberworm\CSS\Value\URL) // { // \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, // $bHasExternals, $aFoundCIDs, // $aContentLocationUrls, $aFoundedContentLocationUrls, // $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); // } // } // } // } // } // } // // public static function ClearStyleSmart($sStyle, $oElement = null, // &$bHasExternals = false, &$aFoundCIDs = array(), // $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), // $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null, // $sSelectorPrefix = '') // { // $mResult = false; // $oCss = null; // // if (!\class_exists('Sabberworm\CSS\Parser')) // { // return $mResult; // } // // $sStyle = \trim($sStyle); // if (empty($sStyle)) // { // return ''; // } // // $sStyle = \trim(\preg_replace('/[\r\n\t\s]+/', ' ', $sStyle)); // // try // { // $oSettings = \Sabberworm\CSS\Settings::create(); // $oSettings->beStrict(); // $oSettings->withMultibyteSupport(false); // // $oCssParser = new \Sabberworm\CSS\Parser($sStyle, $oSettings); // $oCss = $oCssParser->parse(); // } // catch (\Exception $oEception) // { // unset($oEception); // $mResult = false; // } // // if ($oCss) // { // foreach ($oCss->getAllDeclarationBlocks() as $oBlock) // { // foreach($oBlock->getSelectors() as $oSelector) // { // $sS = ' '.\trim($oSelector->getSelector()).' '; // $sS = \preg_replace('/ body([\.# ])/i', ' [data-x-div-type="body"]$1', $sS); // $sS = \preg_replace('/ html([\.# ])/i', ' [data-x-div-type="html"]$1', $sS); // // if (0 < \strlen($sSelectorPrefix)) // { // $sS = \trim($sSelectorPrefix.' '.\trim($sS)); // } // // $oSelector->setSelector(\trim($sS)); // } // } // // $aRulesToRemove = array( // 'pointer-events', 'content', 'behavior', 'cursor', // ); // // foreach($oCss->getAllRuleSets() as $oRuleSet) // { // foreach ($aRulesToRemove as $sRuleToRemove) // { // $oRuleSet->removeRule($sRuleToRemove); // } // // // position: fixed -> position: fixed -> absolute // $aRules = $oRuleSet->getRules('position'); // if (\is_array($aRules)) // { // foreach ($aRules as $oRule) // { // $mValue = $oRule->getValue(); // if (\is_string($mValue) && 'fixed' === \trim(\strtolower($mValue))) // { // $oRule->setValue('absolute'); // } // } // } // } // // foreach($oCss->getAllDeclarationBlocks() as $oRuleSet) // { // if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\RuleSet) // { // if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\DeclarationBlock) // { // $oRuleSet->expandBackgroundShorthand(); // $oRuleSet->expandListStyleShorthand(); // } // // $aRules = $oRuleSet->getRules(); // if (\is_array($aRules) && 0 < \count($aRules)) // { // foreach ($aRules as $oRule) // { // if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) // { // \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper(null, $oRule, $oRuleSet, // $oElement, // $bHasExternals, $aFoundCIDs, // $aContentLocationUrls, $aFoundedContentLocationUrls, // $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter // ); // } // } // } // } // } // // try // { // $mResult = $oCss->render(\Sabberworm\CSS\OutputFormat::createCompact()); // } // catch (\Exception $oEception) // { // unset($oEception); // $mResult = false; // } // } // // return $mResult; // } */ /** * * @param string $sStyle * @param \DOMElement $oElement * @param bool $bHasExternals * @param array $aFoundCIDs * @param array $aContentLocationUrls * @param array $aFoundedContentLocationUrls * @param bool $bDoNotReplaceExternalUrl = false * @param callback|null $fAdditionalExternalFilter = null * * @return string */ public static function ClearStyle($sStyle, $oElement, &$bHasExternals, &$aFoundCIDs, $aContentLocationUrls, &$aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null) { $sStyle = \trim($sStyle); $aOutStyles = array(); $aStyles = \explode(';', $sStyle); if ($fAdditionalExternalFilter && !\is_callable($fAdditionalExternalFilter)) { $fAdditionalExternalFilter = null; } $aMatch = array(); foreach ($aStyles as $sStyleItem) { $aStyleValue = \explode(':', $sStyleItem, 2); $sName = \trim(\strtolower($aStyleValue[0])); $sValue = isset($aStyleValue[1]) ? \trim($aStyleValue[1]) : ''; if ('position' === $sName && 'fixed' === \strtolower($sValue)) { $sValue = 'absolute'; } if (0 === \strlen($sName) || 0 === \strlen($sValue)) { continue; } $sStyleItem = $sName.': '.$sValue; $aStyleValue = array($sName, $sValue); /*if (\in_array($sName, array('position', 'left', 'right', 'top', 'bottom', 'behavior', 'cursor'))) { // skip } else */if (\in_array($sName, array('behavior', 'pointer-events')) || ('cursor' === $sName && !\in_array(\strtolower($sValue), array('none', 'cursor'))) || ('display' === $sName && 'none' === \strtolower($sValue)) || \preg_match('/expression/i', $sValue) || ('text-indent' === $sName && '-' === \substr(trim($sValue), 0, 1)) ) { // skip } else if (\in_array($sName, array('background-image', 'background', 'list-style', 'list-style-image', 'content')) && \preg_match('/url[\s]?\(([^)]+)\)/im', $sValue, $aMatch) && !empty($aMatch[1])) { $sFullUrl = \trim($aMatch[0], '"\' '); $sUrl = \trim($aMatch[1], '"\' '); $sStyleValue = \trim(\preg_replace('/[\s]+/', ' ', \str_replace($sFullUrl, '', $sValue))); $sStyleItem = empty($sStyleValue) ? '' : $sName.': '.$sStyleValue; if ('cid:' === \strtolower(\substr($sUrl, 0, 4))) { if ($oElement) { $oElement->setAttribute('data-x-style-cid-name', 'background' === $sName ? 'background-image' : $sName); $oElement->setAttribute('data-x-style-cid', \substr($sUrl, 4)); $aFoundCIDs[] = \substr($sUrl, 4); } } else { if ($oElement) { if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) { $bHasExternals = true; if (!$bDoNotReplaceExternalUrl) { if (\in_array($sName, array('background-image', 'list-style-image', 'content'))) { $sStyleItem = ''; } $sTemp = ''; if ($oElement->hasAttribute('data-x-style-url')) { $sTemp = \trim($oElement->getAttribute('data-x-style-url')); } $sTemp = empty($sTemp) ? '' : (';' === \substr($sTemp, -1) ? $sTemp.' ' : $sTemp.'; '); $oElement->setAttribute('data-x-style-url', \trim($sTemp. ('background' === $sName ? 'background-image' : $sName).': '.$sFullUrl, ' ;')); if ($fAdditionalExternalFilter) { $sAdditionalResult = \call_user_func($fAdditionalExternalFilter, $sUrl); if (0 < \strlen($sAdditionalResult)) { $oElement->setAttribute('data-x-additional-style-url', ('background' === $sName ? 'background-image' : $sName).': url('.$sAdditionalResult.')'); } } } } else if ('data:image/' !== \strtolower(\substr(\trim($sUrl), 0, 11))) { $oElement->setAttribute('data-x-broken-style-src', $sFullUrl); } } } if (!empty($sStyleItem)) { $aOutStyles[] = $sStyleItem; } } else if ('height' === $sName) { // $aOutStyles[] = 'min-'.ltrim($sStyleItem); $aOutStyles[] = $sStyleItem; } else { $aOutStyles[] = $sStyleItem; } } return \implode(';', $aOutStyles); } /** * @param \DOMDocument $oDom */ public static function FindLinksInDOM(&$oDom) { $aNodes = $oDom->getElementsByTagName('*'); foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) { $sTagNameLower = \strtolower($oElement->tagName); $sParentTagNameLower = isset($oElement->parentNode) && isset($oElement->parentNode->tagName) ? \strtolower($oElement->parentNode->tagName) : ''; if (!\in_array($sTagNameLower, array('html', 'meta', 'head', 'style', 'script', 'img', 'button', 'input', 'textarea', 'a')) && 'a' !== $sParentTagNameLower && $oElement->childNodes && 0 < $oElement->childNodes->length) { $oSubItem = null; $aTextNodes = array(); $iIndex = $oElement->childNodes->length - 1; while ($iIndex > -1) { $oSubItem = $oElement->childNodes->item($iIndex); if ($oSubItem && XML_TEXT_NODE === $oSubItem->nodeType) { $aTextNodes[] = $oSubItem; } $iIndex--; } unset($oSubItem); foreach ($aTextNodes as $oTextNode) { if ($oTextNode && 0 < \strlen($oTextNode->wholeText)/* && \preg_match('/http[s]?:\/\//i', $oTextNode->wholeText)*/) { $sText = \MailSo\Base\LinkFinder::NewInstance() ->Text($oTextNode->wholeText) ->UseDefaultWrappers(true) ->CompileText() ; $oSubDom = \MailSo\Base\HtmlUtils::GetDomFromText($sText); if ($oSubDom) { $oBodyNodes = $oSubDom->getElementsByTagName('body'); if ($oBodyNodes && 0 < $oBodyNodes->length) { $oBodyChildNodes = $oBodyNodes->item(0)->childNodes; if ($oBodyChildNodes && $oBodyChildNodes->length) { for ($iIndex = 0, $iLen = $oBodyChildNodes->length; $iIndex < $iLen; $iIndex++) { $oSubItem = $oBodyChildNodes->item($iIndex); if ($oSubItem) { if (XML_ELEMENT_NODE === $oSubItem->nodeType && 'a' === \strtolower($oSubItem->tagName)) { $oLink = $oDom->createElement('a', \str_replace(':', \MailSo\Base\HtmlUtils::$KOS, \htmlspecialchars($oSubItem->nodeValue))); $sHref = $oSubItem->getAttribute('href'); if ($sHref) { $oLink->setAttribute('href', $sHref); } $oElement->insertBefore($oLink, $oTextNode); } else { $oElement->insertBefore($oDom->importNode($oSubItem), $oTextNode); } } } $oElement->removeChild($oTextNode); } } unset($oBodyNodes); } unset($oSubDom, $sText); } } } } unset($aNodes); } /** * @param string $sHtml * @param bool $bDoNotReplaceExternalUrl = false * @param bool $bFindLinksInHtml = false * @param bool $bWrapByFakeHtmlAndBodyDiv = true * * @return string */ public static function ClearHtmlSimple($sHtml, $bDoNotReplaceExternalUrl = false, $bFindLinksInHtml = false, $bWrapByFakeHtmlAndBodyDiv = true) { $bHasExternals = false; $aFoundCIDs = array(); $aContentLocationUrls = array(); $aFoundedContentLocationUrls = array(); $fAdditionalExternalFilter = null; $fAdditionalDomReader = null; $bTryToDetectHiddenImages = false; return \MailSo\Base\HtmlUtils::ClearHtml($sHtml, $bHasExternals, $aFoundCIDs, $aContentLocationUrls, $aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl, $bFindLinksInHtml, $fAdditionalExternalFilter, $fAdditionalDomReader, $bTryToDetectHiddenImages, $bWrapByFakeHtmlAndBodyDiv); } /** * @param string $sHtml * @param bool $bHasExternals = false * @param array $aFoundCIDs = array() * @param array $aContentLocationUrls = array() * @param array $aFoundedContentLocationUrls = array() * @param bool $bDoNotReplaceExternalUrl = false * @param bool $bFindLinksInHtml = false * @param callback|null $fAdditionalExternalFilter = null * @param callback|null $fAdditionalDomReader = null * @param bool $bTryToDetectHiddenImages = false * @param bool $bWrapByFakeHtmlAndBodyDiv = true * * @return string */ public static function ClearHtml($sHtml, &$bHasExternals = false, &$aFoundCIDs = array(), $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), $bDoNotReplaceExternalUrl = false, $bFindLinksInHtml = false, $fAdditionalExternalFilter = null, $fAdditionalDomReader = false, $bTryToDetectHiddenImages = false, $bWrapByFakeHtmlAndBodyDiv = true) { $sResult = ''; $sHtml = null === $sHtml ? '' : (string) $sHtml; $sHtml = \trim($sHtml); if (0 === \strlen($sHtml)) { return ''; } if ($fAdditionalExternalFilter && !\is_callable($fAdditionalExternalFilter)) { $fAdditionalExternalFilter = null; } if ($fAdditionalDomReader && !\is_callable($fAdditionalDomReader)) { $fAdditionalDomReader = null; } $bHasExternals = false; // Dom Part $oDom = \MailSo\Base\HtmlUtils::GetDomFromText($sHtml); unset($sHtml); if (!$oDom) { return ''; } if ($fAdditionalDomReader) { $oResDom = \call_user_func($fAdditionalDomReader, $oDom); if ($oResDom) { $oDom = $oResDom; } unset($oResDom); } if ($bFindLinksInHtml) { \MailSo\Base\HtmlUtils::FindLinksInDOM($oDom); } \MailSo\Base\HtmlUtils::ClearComments($oDom); \MailSo\Base\HtmlUtils::ClearTags($oDom); $sLinkColor = ''; $aNodes = $oDom->getElementsByTagName('*'); foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) { $aRemovedAttrs = array(); $sTagNameLower = \strtolower($oElement->tagName); // convert body attributes to styles if ('body' === $sTagNameLower) { $aAttrs = array( 'link' => '', 'text' => '', 'topmargin' => '', 'leftmargin' => '', 'bottommargin' => '', 'rightmargin' => '' ); if (isset($oElement->attributes)) { foreach ($oElement->attributes as $sAttrName => /* @var $oAttributeNode \DOMNode */ $oAttributeNode) { if ($oAttributeNode && isset($oAttributeNode->nodeValue)) { $sAttrNameLower = \trim(\strtolower($sAttrName)); if (isset($aAttrs[$sAttrNameLower]) && '' === $aAttrs[$sAttrNameLower]) { $aAttrs[$sAttrNameLower] = array($sAttrName, \trim($oAttributeNode->nodeValue)); } } } } $aStyles = array(); foreach ($aAttrs as $sIndex => $aItem) { if (\is_array($aItem)) { $oElement->removeAttribute($aItem[0]); switch ($sIndex) { case 'link': $sLinkColor = \trim($aItem[1]); if (!\preg_match('/^#[abcdef0-9]{3,6}$/i', $sLinkColor)) { $sLinkColor = ''; } break; case 'text': $aStyles[] = 'color: '.$aItem[1]; break; case 'topmargin': $aStyles[] = 'margin-top: '.((int) $aItem[1]).'px'; break; case 'leftmargin': $aStyles[] = 'margin-left: '.((int) $aItem[1]).'px'; break; case 'bottommargin': $aStyles[] = 'margin-bottom: '.((int) $aItem[1]).'px'; break; case 'rightmargin': $aStyles[] = 'margin-right: '.((int) $aItem[1]).'px'; break; } } } if (0 < \count($aStyles)) { $sStyles = $oElement->hasAttribute('style') ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').\implode('; ', $aStyles)); } } if ('iframe' === $sTagNameLower || 'frame' === $sTagNameLower) { $oElement->setAttribute('src', 'javascript:false'); } if ('a' === $sTagNameLower && !empty($sLinkColor)) { $sStyles = $oElement->hasAttribute('style') ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; $oElement->setAttribute('style', 'color: '.$sLinkColor.\trim((empty($sStyles) ? '' : '; '.$sStyles))); } if ($oElement->hasAttributes() && isset($oElement->attributes) && $oElement->attributes) { $aHtmlAllowedAttributes = isset(\MailSo\Config::$HtmlStrictAllowedAttributes) && \is_array(\MailSo\Config::$HtmlStrictAllowedAttributes) && 0 < \count(\MailSo\Config::$HtmlStrictAllowedAttributes) ? \MailSo\Config::$HtmlStrictAllowedAttributes : null; $sAttrsForRemove = array(); foreach ($oElement->attributes as $sAttrName => $oAttr) { if ($sAttrName && $oAttr) { $sAttrNameLower = \trim(\strtolower($sAttrName)); if ($aHtmlAllowedAttributes && !\in_array($sAttrNameLower, $aHtmlAllowedAttributes)) { $sAttrsForRemove[] = $sAttrName; } else if ('on' === \substr($sAttrNameLower, 0, 2) || in_array($sAttrNameLower, array( 'id', 'class', 'contenteditable', 'designmode', 'formaction', 'manifest', 'action', 'data-bind', 'data-reactid', 'xmlns', 'srcset', 'data-x-skip-style', 'fscommand', 'seeksegmenttime' ))) { $sAttrsForRemove[] = $sAttrName; } } } if (0 < \count($sAttrsForRemove)) { foreach ($sAttrsForRemove as $sName) { @$oElement->removeAttribute($sName); $aRemovedAttrs[\trim(\strtolower($sName))] = true; } } unset($sAttrsForRemove); } if ($oElement->hasAttribute('href')) { $sHref = \trim($oElement->getAttribute('href')); if (!\preg_match('/^(http[s]?|ftp|skype|mailto):/i', $sHref) && '//' !== \substr($sHref, 0, 2)) { $oElement->setAttribute('data-x-broken-href', $sHref); $oElement->setAttribute('href', 'javascript:false'); } if ('a' === $sTagNameLower) { $oElement->setAttribute('rel', 'external nofollow noopener noreferrer'); } } $sLinkHref = \trim($oElement->getAttribute('xlink:href')); if ($sLinkHref && !\preg_match('/^(http[s]?):/i', $sLinkHref) && '//' !== \substr($sLinkHref, 0, 2)) { $oElement->setAttribute('data-x-blocked-xlink-href', $sLinkHref); $oElement->removeAttribute('xlink:href'); } if (\in_array($sTagNameLower, array('a', 'form', 'area'))) { $oElement->setAttribute('target', '_blank'); } if (\in_array($sTagNameLower, array('a', 'form', 'area', 'input', 'button', 'textarea'))) { $oElement->setAttribute('tabindex', '-1'); } if ($bTryToDetectHiddenImages && 'img' === $sTagNameLower) { $sAlt = $oElement->hasAttribute('alt') ? \trim($oElement->getAttribute('alt')) : ''; if ($oElement->hasAttribute('src') && '' === $sAlt) { $aH = array( 'email.microsoftemail.com/open', 'github.com/notifications/beacon/', 'mandrillapp.com/track/open', 'list-manage.com/track/open' ); $sH = $oElement->hasAttribute('height') ? \trim($oElement->getAttribute('height')) : ''; // $sW = $oElement->hasAttribute('width') // ? \trim($oElement->getAttribute('width')) : ''; $sStyles = $oElement->hasAttribute('style') ? \preg_replace('/[\s]+/', '', \trim(\trim(\trim($oElement->getAttribute('style')), ';'))) : ''; $sSrc = \trim($oElement->getAttribute('src')); $bC = \in_array($sH, array('1', '0', '1px', '0px')) || \preg_match('/(display:none|visibility:hidden|height:0|height:[01][a-z][a-z])/i', $sStyles); if (!$bC) { $sSrcLower = \strtolower($sSrc); foreach ($aH as $sLine) { if (false !== \strpos($sSrcLower, $sLine)) { $bC = true; break; } } } if ($bC) { $oElement->setAttribute('style', 'display:none'); $oElement->setAttribute('data-x-skip-style', 'true'); $oElement->setAttribute('data-x-hidden-src', $sSrc); $oElement->removeAttribute('src'); } } } if ($oElement->hasAttribute('src')) { $sSrc = \trim($oElement->getAttribute('src')); $oElement->removeAttribute('src'); if (\in_array($sSrc, $aContentLocationUrls)) { $oElement->setAttribute('data-x-src-location', $sSrc); $aFoundedContentLocationUrls[] = $sSrc; } else if ('cid:' === \strtolower(\substr($sSrc, 0, 4))) { $oElement->setAttribute('data-x-src-cid', \substr($sSrc, 4)); $aFoundCIDs[] = \substr($sSrc, 4); } else { if (\preg_match('/^http[s]?:\/\//i', $sSrc) || '//' === \substr($sSrc, 0, 2)) { if ($bDoNotReplaceExternalUrl) { $oElement->setAttribute('src', $sSrc); } else { $oElement->setAttribute('data-x-src', $sSrc); if ($fAdditionalExternalFilter) { $sCallResult = \call_user_func($fAdditionalExternalFilter, $sSrc); if (0 < \strlen($sCallResult)) { $oElement->setAttribute('data-x-additional-src', $sCallResult); } } } $bHasExternals = true; } else if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) { $oElement->setAttribute('src', $sSrc); } else { $oElement->setAttribute('data-x-broken-src', $sSrc); } } } $sBackground = $oElement->hasAttribute('background') ? \trim($oElement->getAttribute('background')) : ''; $sBackgroundColor = $oElement->hasAttribute('bgcolor') ? \trim($oElement->getAttribute('bgcolor')) : ''; if (!empty($sBackground) || !empty($sBackgroundColor)) { $aStyles = array(); $sStyles = $oElement->hasAttribute('style') ? \trim(\trim(\trim($oElement->getAttribute('style')), ';')) : ''; if (!empty($sBackground)) { $aStyles[] = 'background-image: url(\''.$sBackground.'\')'; $oElement->removeAttribute('background'); } if (!empty($sBackgroundColor)) { $aStyles[] = 'background-color: '.$sBackgroundColor; $oElement->removeAttribute('bgcolor'); } $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').\implode('; ', $aStyles)); } if ($oElement->hasAttribute('style') && !$oElement->hasAttribute('data-x-skip-style')) { $oElement->setAttribute('style', \MailSo\Base\HtmlUtils::ClearStyle($oElement->getAttribute('style'), $oElement, $bHasExternals, $aFoundCIDs, $aContentLocationUrls, $aFoundedContentLocationUrls, $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter)); } $oElement->removeAttribute('data-x-skip-style'); if (\MailSo\Config::$HtmlStrictDebug && 0 < \count($aRemovedAttrs)) { unset($aRemovedAttrs['class'], $aRemovedAttrs['target'], $aRemovedAttrs['id'], $aRemovedAttrs['name'], $aRemovedAttrs['itemprop'], $aRemovedAttrs['itemscope'], $aRemovedAttrs['itemtype']); $aRemovedAttrs = \array_keys($aRemovedAttrs); if (0 < \count($aRemovedAttrs)) { $oElement->setAttribute('data-removed-attrs', \implode(',', $aRemovedAttrs)); } } } $sResult = \MailSo\Base\HtmlUtils::GetTextFromDom($oDom, $bWrapByFakeHtmlAndBodyDiv); unset($oDom); return $sResult; } /** * @param string $sHtml * @param array $aFoundCids = array() * @param array|null $mFoundDataURL = null * @param array $aFoundedContentLocationUrls = array() * * @return string */ public static function BuildHtml($sHtml, &$aFoundCids = array(), &$mFoundDataURL = null, &$aFoundedContentLocationUrls = array()) { $oDom = \MailSo\Base\HtmlUtils::GetDomFromText($sHtml); \MailSo\Base\HtmlUtils::ClearTags($oDom); unset($sHtml); $aNodes = $oDom->getElementsByTagName('*'); foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) { $sTagNameLower = \strtolower($oElement->tagName); if ($oElement->hasAttribute('data-x-src-cid')) { $sCid = $oElement->getAttribute('data-x-src-cid'); $oElement->removeAttribute('data-x-src-cid'); if (!empty($sCid)) { $aFoundCids[] = $sCid; @$oElement->removeAttribute('src'); $oElement->setAttribute('src', 'cid:'.$sCid); } } if ($oElement->hasAttribute('data-x-src-location')) { $sSrc = $oElement->getAttribute('data-x-src-location'); $oElement->removeAttribute('data-x-src-location'); if (!empty($sSrc)) { $aFoundedContentLocationUrls[] = $sSrc; @$oElement->removeAttribute('src'); $oElement->setAttribute('src', $sSrc); } } if ($oElement->hasAttribute('data-x-broken-src')) { $oElement->setAttribute('src', $oElement->getAttribute('data-x-broken-src')); $oElement->removeAttribute('data-x-broken-src'); } if ($oElement->hasAttribute('data-x-src')) { $oElement->setAttribute('src', $oElement->getAttribute('data-x-src')); $oElement->removeAttribute('data-x-src'); } if ($oElement->hasAttribute('data-x-href')) { $oElement->setAttribute('href', $oElement->getAttribute('data-x-href')); $oElement->removeAttribute('data-x-href'); } if ($oElement->hasAttribute('data-x-style-cid-name') && $oElement->hasAttribute('data-x-style-cid')) { $sCidName = $oElement->getAttribute('data-x-style-cid-name'); $sCid = $oElement->getAttribute('data-x-style-cid'); $oElement->removeAttribute('data-x-style-cid-name'); $oElement->removeAttribute('data-x-style-cid'); if (!empty($sCidName) && !empty($sCid) && \in_array($sCidName, array('background-image', 'background', 'list-style-image', 'content'))) { $sStyles = ''; if ($oElement->hasAttribute('style')) { $sStyles = \trim(\trim($oElement->getAttribute('style')), ';'); } $sBack = $sCidName.': url(cid:'.$sCid.')'; $sStyles = \preg_replace('/'.\preg_quote($sCidName, '/').':\s?[^;]+/i', $sBack, $sStyles); if (false === \strpos($sStyles, $sBack)) { $sStyles .= empty($sStyles) ? '': '; '; $sStyles .= $sBack; } $oElement->setAttribute('style', $sStyles); $aFoundCids[] = $sCid; } } foreach (array( 'data-x-additional-src', 'data-x-additional-style-url', 'data-removed-attrs', 'data-original', 'data-x-div-type', 'data-wrp', 'data-bind' ) as $sName) { if ($oElement->hasAttribute($sName)) { $oElement->removeAttribute($sName); } } if ($oElement->hasAttribute('data-x-style-url')) { $sAddStyles = $oElement->getAttribute('data-x-style-url'); $oElement->removeAttribute('data-x-style-url'); if (!empty($sAddStyles)) { $sStyles = ''; if ($oElement->hasAttribute('style')) { $sStyles = \trim(\trim($oElement->getAttribute('style')), ';'); } $oElement->setAttribute('style', (empty($sStyles) ? '' : $sStyles.'; ').$sAddStyles); } } if ('img' === $sTagNameLower && \is_array($mFoundDataURL)) { $sSrc = $oElement->getAttribute('src'); if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) { $sHash = \md5($sSrc); $mFoundDataURL[$sHash] = $sSrc; $oElement->setAttribute('src', 'cid:'.$sHash); } } } $sResult = \MailSo\Base\HtmlUtils::GetTextFromDom($oDom, false); unset($oDom); return ''. ''.$sResult.''; } /** * @param string $sText * @param bool $bLinksWithTargetBlank = true * * @return string */ public static function ConvertPlainToHtml($sText, $bLinksWithTargetBlank = true) { $sText = \trim($sText); if (0 === \strlen($sText)) { return ''; } $sText = \MailSo\Base\LinkFinder::NewInstance() ->Text($sText) ->UseDefaultWrappers($bLinksWithTargetBlank) ->CompileText() ; $sText = \str_replace("\r", '', $sText); $aText = \explode("\n", $sText); unset($sText); $bIn = false; $bDo = true; do { $bDo = false; $aNextText = array(); foreach ($aText as $sTextLine) { $bStart = 0 === \strpos(\ltrim($sTextLine), '>'); if ($bStart && !$bIn) { $bDo = true; $bIn = true; $aNextText[] = '
'; $aNextText[] = \substr(\ltrim($sTextLine), 4); } else if (!$bStart && $bIn) { $bIn = false; $aNextText[] = '
'; $aNextText[] = $sTextLine; } else if ($bStart && $bIn) { $aNextText[] = \substr(\ltrim($sTextLine), 4); } else { $aNextText[] = $sTextLine; } } if ($bIn) { $bIn = false; $aNextText[] = ''; } $aText = $aNextText; } while ($bDo); $sText = \join("\n", $aText); unset($aText); $sText = \preg_replace('/[\n][ ]+/', "\n", $sText); // $sText = \preg_replace('/[\s]+([\s])/', '\\1', $sText); $sText = \preg_replace('/
[\s]+/i', '
', $sText); $sText = \preg_replace('/[\s]+<\/blockquote>/i', '
', $sText); $sText = \preg_replace('/<\/blockquote>([\n]{0,2})
/i', '\\1', $sText); $sText = \preg_replace('/[\n]{3,}/', "\n\n", $sText); $sText = \strtr($sText, array( "\n" => "
", "\t" => '   ', ' ' => '  ' )); return $sText; } /** * @param string $sText * * @return string */ public static function ConvertHtmlToPlain($sText) { $sText = \trim(\stripslashes($sText)); $sText = \MailSo\Base\Utils::StripSpaces($sText); $sText = \preg_replace(array( "/\r/", "/[\n\t]+/", '/]*>.*?<\/script>/i', '/]*>.*?<\/style>/i', '/]*>.*?<\/title>/i', '/]*>(.+?)<\/h[123]>/i', '/]*>(.+?)<\/h[456]>/i', '/]*>/i', '/]*>/i', '/]*>(.+?)<\/b>/i', '/]*>(.+?)<\/i>/i', '/(]*>|<\/ul>)/i', '/(]*>|<\/ol>)/i', '/]*>/i', '/]*href="([^"]+)"[^>]*>(.+?)<\/a>/i', '/]*>/i', '/(]*>|<\/table>)/i', '/(]*>|<\/tr>)/i', '/]*>(.+?)<\/td>/i', '/]*>(.+?)<\/th>/i', '/ /i', '/"/i', '/&/i', '/©/i', '/™/i', '/“/', '/”/', '/–/', '/’/', '/&/', '/©/', '/™/', '/—/', '/“/', '/”/', '/•/', '/®/i', '/•/i', '/&[&;]+;/i', '/'/', '/ /' ), array( '', ' ', '', '', '', "\n\n\\1\n\n", "\n\n\\1\n\n", "\n\n\t", "\n", '\\1', '\\1', "\n\n", "\n\n", "\n\t* ", '\\2 (\\1)', "\n------------------------------------\n", "\n", "\n", "\t\\1\n", "\t\\1\n", ' ', '"', '&', '(c)', '(tm)', '"', '"', '-', "'", '&', '(c)', '(tm)', '--', '"', '"', '*', '(R)', '*', '', '\'', '' ), $sText); $sText = \str_ireplace('
',"\n
", $sText); $sText = \strip_tags($sText, ''); $sText = \preg_replace("/\n\\s+\n/", "\n", $sText); $sText = \preg_replace("/[\n]{3,}/", "\n\n", $sText); $sText = \preg_replace(array( '/>/i', '/</i' ), array( '>', '<' ), $sText); return \trim($sText); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php000066400000000000000000000451401361462701300260120ustar00rootroot00000000000000bIsMagicQuotesOn = (bool) @\ini_get('magic_quotes_gpc'); } /** * @return \MailSo\Base\Http */ public static function NewInstance() { return new self(); } /** * @staticvar \MailSo\Base\Http $oInstance; * * @return \MailSo\Base\Http */ public static function SingletonInstance() { static $oInstance = null; if (null === $oInstance) { $oInstance = self::NewInstance(); } return $oInstance; } /** * @param string $sKey * * @return bool */ public function HasQuery($sKey) { return isset($_GET[$sKey]); } /** * @param string $sKey * @param mixed $mDefault = null * @param bool $bClearPercZeroZero = true * * @return mixed */ public function GetQuery($sKey, $mDefault = null, $bClearPercZeroZero = true) { return isset($_GET[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_GET[$sKey], $bClearPercZeroZero) : $mDefault; } /** * @return array|null */ public function GetQueryAsArray() { return isset($_GET) && \is_array($_GET) ? \MailSo\Base\Utils::StripSlashesValue($_GET, true) : null; } /** * @param string $sKey * * @return bool */ public function HasPost($sKey) { return isset($_POST[$sKey]); } /** * @param string $sKey * @param mixed $mDefault = null * @param bool $bClearPercZeroZero = false * * @return mixed */ public function GetPost($sKey, $mDefault = null, $bClearPercZeroZero = false) { return isset($_POST[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_POST[$sKey], $bClearPercZeroZero) : $mDefault; } /** * @return array|null */ public function GetPostAsArray() { return isset($_POST) && \is_array($_POST) ? \MailSo\Base\Utils::StripSlashesValue($_POST, false) : null; } /** * @param string $sKey * * @return bool */ public function HasRequest($sKey) { return isset($_REQUEST[$sKey]); } /** * @param string $sKey * @param mixed $mDefault = null * * @return mixed */ public function GetRequest($sKey, $mDefault = null) { return isset($_REQUEST[$sKey]) ? \MailSo\Base\Utils::StripSlashesValue($_REQUEST[$sKey]) : $mDefault; } /** * @param string $sKey * * @return bool */ public function HasServer($sKey) { return isset($_SERVER[$sKey]); } /** * @param string $sKey * @param mixed $mDefault = null * * @return mixed */ public function GetServer($sKey, $mDefault = null) { return isset($_SERVER[$sKey]) ? $_SERVER[$sKey] : $mDefault; } /** * @param string $sKey * * @return bool */ public function HasEnv($sKey) { return isset($_ENV[$sKey]); } /** * @param string $sKey * @param mixed $mDefault = null * * @return mixed */ public function GetEnv($sKey, $mDefault = null) { return isset($_ENV[$sKey]) ? $_ENV[$sKey] : $mDefault; } /** * @return string */ public function ServerProtocol() { return $this->GetServer('SERVER_PROTOCOL', 'HTTP/1.0'); } /** * @return string */ public function GetMethod() { return $this->GetServer('REQUEST_METHOD', ''); } /** * @return bool */ public function IsPost() { return ('POST' === $this->GetMethod()); } /** * @return bool */ public function IsGet() { return ('GET' === $this->GetMethod()); } /** * @return string */ public function GetQueryString() { return $this->GetServer('QUERY_STRING', ''); } /** * @return bool */ public function CheckLocalhost($sServer) { return \in_array(\strtolower(\trim($sServer)), array( 'localhost', '127.0.0.1', '::1', '::1/128', '0:0:0:0:0:0:0:1' )); } /** * @param string $sValueToCheck = '' * * @return bool */ public function IsLocalhost($sValueToCheck = '') { if (empty($sValueToCheck)) { $sValueToCheck = $this->GetServer('REMOTE_ADDR', ''); } return $this->CheckLocalhost($sValueToCheck); } /** * @return string */ public function GetRawBody() { static $sRawBody = null; if (null === $sRawBody) { $sBody = @\file_get_contents('php://input'); $sRawBody = (false !== $sBody) ? $sBody : ''; } return $sRawBody; } /** * @param string $sHeader * * @return string */ public function GetHeader($sHeader) { $sServerKey = 'HTTP_'.\strtoupper(\str_replace('-', '_', $sHeader)); $sResultHeader = $this->GetServer($sServerKey, ''); if (0 === \strlen($sResultHeader) && \MailSo\Base\Utils::FunctionExistsAndEnabled('apache_request_headers')) { $sHeaders = \apache_request_headers(); if (isset($sHeaders[$sHeader])) { $sResultHeader = $sHeaders[$sHeader]; } } return $sResultHeader; } /** * @param bool $bCheckProxy = true * * @return string */ public function GetScheme($bCheckProxy = true) { return $this->IsSecure($bCheckProxy) ? 'https' : 'http'; } /** * @param bool $bCheckProxy = true * * @return bool */ public function IsSecure($bCheckProxy = true) { $sHttps = \strtolower($this->GetServer('HTTPS', '')); if ('on' === $sHttps || ('' === $sHttps && '443' === (string) $this->GetServer('SERVER_PORT', ''))) { return true; } if ($bCheckProxy && ( ('https' === \strtolower($this->GetServer('HTTP_X_FORWARDED_PROTO', ''))) || ('on' === \strtolower($this->GetServer('HTTP_X_FORWARDED_SSL', ''))) )) { return true; } return false; } /** * @param bool $bWithRemoteUserData = false * @param bool $bWithoutWWW = true * @param bool $bWithoutPort = false * * @return string */ public function GetHost($bWithRemoteUserData = false, $bWithoutWWW = true, $bWithoutPort = false) { $sHost = $this->GetServer('HTTP_HOST', ''); if (0 === \strlen($sHost)) { $sName = $this->GetServer('SERVER_NAME'); $iPort = (int) $this->GetServer('SERVER_PORT', 80); $sHost = (\in_array($iPort, array(80, 433))) ? $sName : $sName.':'.$iPort; } if ($bWithoutWWW) { $sHost = 'www.' === \substr(\strtolower($sHost), 0, 4) ? \substr($sHost, 4) : $sHost; } if ($bWithRemoteUserData) { $sUser = \trim($this->HasServer('REMOTE_USER') ? $this->GetServer('REMOTE_USER', '') : ''); $sHost = (0 < \strlen($sUser) ? $sUser.'@' : '').$sHost; } if ($bWithoutPort) { $sHost = \preg_replace('/:[\d]+$/', '', $sHost); } return $sHost; } /** * @param bool $bCheckProxy = false * * @return string */ public function GetClientIp($bCheckProxy = false) { $sIp = ''; if ($bCheckProxy && null !== $this->GetServer('HTTP_CLIENT_IP', null)) { $sIp = $this->GetServer('HTTP_CLIENT_IP', ''); } else if ($bCheckProxy && null !== $this->GetServer('HTTP_X_FORWARDED_FOR', null)) { $sIp = $this->GetServer('HTTP_X_FORWARDED_FOR', ''); } else { $sIp = $this->GetServer('REMOTE_ADDR', ''); } return $sIp; } /** * @param string $sUrl * @param array $aPost = array() * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' * @param int $iCode = 0 * @param \MailSo\Log\Logger $oLogger = null * @param int $iTimeout = 20 * @param string $sProxy = '' * @param string $sProxyAuth = '' * * @return string|bool */ public function SendPostRequest($sUrl, $aPost = array(), $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$iCode = 0, $oLogger = null, $iTimeout = 20, $sProxy = '', $sProxyAuth = '') { $aOptions = array( CURLOPT_URL => $sUrl, CURLOPT_HEADER => false, CURLOPT_FAILONERROR => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), CURLOPT_TIMEOUT => (int) $iTimeout ); if (0 < \strlen($sCustomUserAgent)) { $aOptions[CURLOPT_USERAGENT] = $sCustomUserAgent; } if (0 < \strlen($sProxy)) { $aOptions[CURLOPT_PROXY] = $sProxy; if (0 < \strlen($sProxyAuth)) { $aOptions[CURLOPT_PROXYUSERPWD] = $sProxyAuth; } } $oCurl = \curl_init(); \curl_setopt_array($oCurl, $aOptions); if ($oLogger) { $oLogger->Write('cURL: Send post request: '.$sUrl); } $mResult = \curl_exec($oCurl); $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); if ($oLogger) { $oLogger->Write('cURL: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); if (false === $mResult || 200 !== $iCode) { $oLogger->Write('cURL: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); } } if (\is_resource($oCurl)) { \curl_close($oCurl); } return $mResult; } /** * @param string $sUrl * @param array $aOptions * @param \MailSo\Log\Logger $oLogger = null * * @return string */ static public function DetectAndHackFollowLocationUrl($sUrl, &$aOptions, $oLogger = null) { $sSafeMode = \strtolower(\trim(@\ini_get('safe_mode'))); $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode; $sNewUrl = null; $sUrl = isset($aOptions[CURLOPT_URL]) ? $aOptions[CURLOPT_URL] : $sUrl; if (isset($aOptions[CURLOPT_FOLLOWLOCATION]) && $aOptions[CURLOPT_FOLLOWLOCATION] && 0 < \strlen($sUrl) && ($bSafeMode || \ini_get('open_basedir') !== '')) { $aOptions[CURLOPT_FOLLOWLOCATION] = false; $iMaxRedirects = isset($aOptions[CURLOPT_MAXREDIRS]) ? $aOptions[CURLOPT_MAXREDIRS] : 5; $iRedirectLimit = $iMaxRedirects; if ($iRedirectLimit > 0) { $sNewUrl = $sUrl; $oCurl = \curl_init($sUrl); $aAddOptions = array( CURLOPT_URL => $sUrl, CURLOPT_HEADER => true, CURLOPT_NOBODY => true, CURLOPT_FAILONERROR => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_FOLLOWLOCATION => false, CURLOPT_FORBID_REUSE => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5 ); if (isset($aOptions[CURLOPT_HTTPHEADER]) && \is_array($aOptions[CURLOPT_HTTPHEADER]) && 0 < \count($aOptions[CURLOPT_HTTPHEADER])) { $aAddOptions[CURLOPT_HTTPHEADER] = $aOptions[CURLOPT_HTTPHEADER]; } \curl_setopt_array($oCurl, $aAddOptions); do { \curl_setopt($oCurl, CURLOPT_URL, $sNewUrl); $sHeader = \curl_exec($oCurl); if (\curl_errno($oCurl)) { $iCode = 0; } else { $iCode = \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); if ($iCode === 301 || $iCode === 302) { $aMatches = array(); \preg_match('/Location:(.*?)\n/', $sHeader, $aMatches); $sNewUrl = \trim(\array_pop($aMatches)); if ($oLogger) { $oLogger->Write('cUrl: Location URL: '.$sNewUrl); } } else { $iCode = 0; } } } while ($iCode && --$iRedirectLimit); \curl_close($oCurl); if ($iRedirectLimit > 0 && 0 < \strlen($sNewUrl)) { $aOptions[CURLOPT_URL] = $sNewUrl; } } } return null === $sNewUrl ? $sUrl : $sNewUrl; } /** * @param string $sUrl * @param resource $rFile * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' * @param string $sContentType = '' * @param int $iCode = 0 * @param \MailSo\Log\Logger $oLogger = null * @param int $iTimeout = 10 * @param string $sProxy = '' * @param string $sProxyAuth = '' * @param array $aHttpHeaders = array() * @param bool $bFollowLocation = true * * @return bool */ public function SaveUrlToFile($sUrl, $rFile, $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$sContentType = '', &$iCode = 0, $oLogger = null, $iTimeout = 10, $sProxy = '', $sProxyAuth = '', $aHttpHeaders = array(), $bFollowLocation = true) { if (null === $sCustomUserAgent) { $sCustomUserAgent = 'MailSo Http User Agent (v1)'; } if (!is_resource($rFile)) { if ($oLogger) { $oLogger->Write('cURL: input resource invalid.', \MailSo\Log\Enumerations\Type::WARNING); } return false; } $sUrl = \trim($sUrl); if ('//' === substr($sUrl, 0, 2)) { $sUrl = 'http:'.$sUrl; } $aOptions = array( CURLOPT_URL => $sUrl, CURLOPT_HEADER => false, CURLOPT_FAILONERROR => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => !!$bFollowLocation, CURLOPT_MAXREDIRS => 7, CURLOPT_FILE => $rFile, CURLOPT_TIMEOUT => (int) $iTimeout ); if (0 < \strlen($sCustomUserAgent)) { $aOptions[CURLOPT_USERAGENT] = $sCustomUserAgent; } if (0 < \strlen($sProxy)) { $aOptions[CURLOPT_PROXY] = $sProxy; if (0 < \strlen($sProxyAuth)) { $aOptions[CURLOPT_PROXYUSERPWD] = $sProxyAuth; } } if (\is_array($aHttpHeaders) && 0 < \count($aHttpHeaders)) { $aOptions[CURLOPT_HTTPHEADER] = $aHttpHeaders; } if ($oLogger) { $oLogger->Write('cUrl: URL: '.$sUrl); // if (isset($aOptions[CURLOPT_HTTPHEADER]) && \is_array($aOptions[CURLOPT_HTTPHEADER]) && 0 < \count($aOptions[CURLOPT_HTTPHEADER])) // { // $oLogger->Write('cUrl: Headers: '.\print_r($aOptions[CURLOPT_HTTPHEADER], true)); // } } \MailSo\Base\Http::DetectAndHackFollowLocationUrl($sUrl, $aOptions, $oLogger); $oCurl = \curl_init(); \curl_setopt_array($oCurl, $aOptions); $bResult = \curl_exec($oCurl); $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); if ($oLogger) { $oLogger->Write('cUrl: Request result: '.($bResult ? 'true' : 'false').' (Status: '.$iCode.', ContentType: '.$sContentType.')'); if (!$bResult || 200 !== $iCode) { $oLogger->Write('cUrl: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); } } if (\is_resource($oCurl)) { \curl_close($oCurl); } return $bResult; } /** * @param string $sUrl * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' * @param string $sContentType = '' * @param int $iCode = 0 * @param \MailSo\Log\Logger $oLogger = null * @param int $iTimeout = 10 * @param string $sProxy = '' * @param string $sProxyAuth = '' * @param array $aHttpHeaders = array() * @param bool $bFollowLocation = true * * @return string|bool */ public function GetUrlAsString($sUrl, $sCustomUserAgent = 'MailSo Http User Agent (v1)', &$sContentType = '', &$iCode = 0, $oLogger = null, $iTimeout = 10, $sProxy = '', $sProxyAuth = '', $aHttpHeaders = array(), $bFollowLocation = true) { $rMemFile = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); if ($this->SaveUrlToFile($sUrl, $rMemFile, $sCustomUserAgent, $sContentType, $iCode, $oLogger, $iTimeout, $sProxy, $sProxyAuth, $aHttpHeaders, $bFollowLocation) && \is_resource($rMemFile)) { \rewind($rMemFile); return \stream_get_contents($rMemFile); } return false; } /** * @param int $iExpireTime * @param bool $bSetCacheHeader = true * @param string $sEtag = '' * * @return bool */ public function ServerNotModifiedCache($iExpireTime, $bSetCacheHeader = true, $sEtag = '') { $bResult = false; if (0 < $iExpireTime) { $iUtcTimeStamp = \time(); $sIfModifiedSince = $this->GetHeader('If-Modified-Since', ''); if (0 === \strlen($sIfModifiedSince)) { if ($bSetCacheHeader) { @\header('Cache-Control: public', true); @\header('Pragma: public', true); @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iUtcTimeStamp - $iExpireTime).' UTC', true); @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iUtcTimeStamp + $iExpireTime).' UTC', true); if (0 < strlen($sEtag)) { \header('Etag: '.$sEtag, true); } } } else { $this->StatusHeader(304); $bResult = true; } } return $bResult; } /** * @staticvar boolean $bCache */ public function ServerNoCache() { static $bCache = false; if (false === $bCache) { $bCache = true; @\header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s').' GMT'); @\header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); @\header('Cache-Control: post-check=0, pre-check=0', false); @\header('Pragma: no-cache'); } } /** * @staticvar boolean $bCache * @param string $sEtag * @param int $iLastModified * @param int $iExpires */ public function ServerUseCache($sEtag, $iLastModified, $iExpires) { static $bCache = false; if (false === $bCache) { $bCache = true; @\header('Cache-Control: private', true); @\header('ETag: '.$sEtag, true); @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iLastModified).' UTC', true); @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iExpires).' UTC', true); } } /** * @param int $iStatus * * @return void */ public function StatusHeader($iStatus, $sCustomStatusText = '') { $iStatus = (int) $iStatus; if (99 < $iStatus) { $aStatus = array( 200 => 'OK', 206 => 'Partial Content', 301 => 'Moved Permanently', 304 => 'Not Modified', 400 => 'Bad Request', 401 => 'Unauthorized', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 416 => 'Requested range not satisfiable' ); $sCustomStatusText = \trim($sCustomStatusText); $sHeaderHead = \ini_get('cgi.rfc2616_headers') && false !== \strpos(\strtolower(\php_sapi_name()), 'cgi') ? 'Status:' : $this->ServerProtocol(); $sHeaderText = (0 === \strlen($sCustomStatusText) && isset($aStatus[$iStatus]) ? $aStatus[$iStatus] : $sCustomStatusText); \header(\trim($sHeaderHead.' '.$iStatus.' '.$sHeaderText), true, $iStatus); } } /** * @return string */ public function GetPath() { $sUrl = \ltrim(\substr($this->GetServer('SCRIPT_NAME', ''), 0, \strrpos($this->GetServer('SCRIPT_NAME', ''), '/')), '/'); return '' === $sUrl ? '/' : '/'.$sUrl.'/'; } /** * @return string */ public function GetUrl() { return $this->GetServer('REQUEST_URI', ''); } /** * @return string */ public function GetFullUrl() { return $this->GetScheme().'://'.$this->GetHost(true, false).$this->GetPath(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/LinkFinder.php000066400000000000000000000151021361462701300271130ustar00rootroot00000000000000iHtmlSpecialCharsFlags = (\defined('ENT_QUOTES') && \defined('ENT_SUBSTITUTE') && \defined('ENT_HTML401')) ? ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 : ENT_QUOTES; if (\defined('ENT_IGNORE')) { $this->iHtmlSpecialCharsFlags |= ENT_IGNORE; } $this->iOptimizationLimit = 300000; $this->Clear(); } /** * @return \MailSo\Base\LinkFinder */ public static function NewInstance() { return new self(); } /** * @return \MailSo\Base\LinkFinder */ public function Clear() { $this->aPrepearPlainStringUrls = array(); $this->fLinkWrapper = null; $this->fMailWrapper = null; $this->sText = ''; return $this; } /** * @param string $sText * * @return \MailSo\Base\LinkFinder */ public function Text($sText) { $this->sText = $sText; return $this; } /** * @param mixed $fLinkWrapper * * @return \MailSo\Base\LinkFinder */ public function LinkWrapper($fLinkWrapper) { $this->fLinkWrapper = $fLinkWrapper; return $this; } /** * @param mixed $fMailWrapper * * @return \MailSo\Base\LinkFinder */ public function MailWrapper($fMailWrapper) { $this->fMailWrapper = $fMailWrapper; return $this; } /** * @param bool $bAddTargetBlank = false * * @return \MailSo\Base\LinkFinder */ public function UseDefaultWrappers($bAddTargetBlank = false) { $this->fLinkWrapper = function ($sLink) use ($bAddTargetBlank) { $sNameLink = $sLink; if (!\preg_match('/^[a-z]{3,5}\:\/\//i', \ltrim($sLink))) { $sLink = 'http://'.\ltrim($sLink); } return ''.$sNameLink.''; }; $this->fMailWrapper = function ($sEmail) use ($bAddTargetBlank) { return ''.$sEmail.''; }; return $this; } /** * @param bool $bUseHtmlSpecialChars = true * * @return string */ public function CompileText($bUseHtmlSpecialChars = true) { $sText = \substr($this->sText, 0, $this->iOptimizationLimit); $sSubText = \substr($this->sText, $this->iOptimizationLimit); $this->aPrepearPlainStringUrls = array(); if (null !== $this->fLinkWrapper && \is_callable($this->fLinkWrapper)) { $sText = $this->findLinks($sText, $this->fLinkWrapper); } if (null !== $this->fMailWrapper && \is_callable($this->fMailWrapper)) { $sText = $this->findMails($sText, $this->fMailWrapper); } $sResult = ''; if ($bUseHtmlSpecialChars) { $sResult = @\htmlentities($sText.$sSubText, $this->iHtmlSpecialCharsFlags, 'UTF-8'); } else { $sResult = $sText.$sSubText; } unset($sText, $sSubText); if (0 < \count($this->aPrepearPlainStringUrls)) { $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; $sResult = \preg_replace_callback('/'.\preg_quote(\MailSo\Base\LinkFinder::OPEN_LINK, '/'). '([\d]+)'.\preg_quote(\MailSo\Base\LinkFinder::CLOSE_LINK, '/').'/', function ($aMatches) use ($aPrepearPlainStringUrls) { $iIndex = (int) $aMatches[1]; return isset($aPrepearPlainStringUrls[$iIndex]) ? $aPrepearPlainStringUrls[$iIndex] : ''; }, $sResult); $this->aPrepearPlainStringUrls = array(); } return $sResult; } /** * @param string $sText * @param mixed $fWrapper * * @return string */ private function findLinks($sText, $fWrapper) { $sPattern = '/([\W]|^)((?:https?:\/\/)|(?:svn:\/\/)|(?:git:\/\/)|(?:s?ftps?:\/\/)|(?:www\.))'. '((\S+?)(\\/)?)((?:>)?|[^\w\=\\/;\(\)\[\]]*?)(?=<|\s|$)/imu'; $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; $sText = \preg_replace_callback($sPattern, function ($aMatch) use ($fWrapper, &$aPrepearPlainStringUrls) { if (\is_array($aMatch) && 6 < \count($aMatch)) { while (\in_array($sChar = \substr($aMatch[3], -1), array(']', ')'))) { if (\substr_count($aMatch[3], ']' === $sChar ? '[': '(') - \substr_count($aMatch[3], $sChar) < 0) { $aMatch[3] = \substr($aMatch[3], 0, -1); $aMatch[6] = (']' === $sChar ? ']': ')').$aMatch[6]; } else { break; } } $sLinkWithWrap = \call_user_func($fWrapper, $aMatch[2].$aMatch[3]); if (\is_string($sLinkWithWrap) && 0 < \strlen($sLinkWithWrap)) { $aPrepearPlainStringUrls[] = \stripslashes($sLinkWithWrap); return $aMatch[1]. \MailSo\Base\LinkFinder::OPEN_LINK. (\count($aPrepearPlainStringUrls) - 1). \MailSo\Base\LinkFinder::CLOSE_LINK. $aMatch[6]; } return $aMatch[0]; } return ''; }, $sText); if (0 < \count($aPrepearPlainStringUrls)) { $this->aPrepearPlainStringUrls = $aPrepearPlainStringUrls; } return $sText; } /** * @param string $sText * @param mixed $fWrapper * * @return string */ private function findMails($sText, $fWrapper) { $sPattern = '/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/'; $aPrepearPlainStringUrls = $this->aPrepearPlainStringUrls; $sText = \preg_replace_callback($sPattern, function ($aMatch) use ($fWrapper, &$aPrepearPlainStringUrls) { if (\is_array($aMatch) && isset($aMatch[1])) { $sMailWithWrap = \call_user_func($fWrapper, $aMatch[1]); if (\is_string($sMailWithWrap) && 0 < \strlen($sMailWithWrap)) { $aPrepearPlainStringUrls[] = \stripslashes($sMailWithWrap); return \MailSo\Base\LinkFinder::OPEN_LINK. (\count($aPrepearPlainStringUrls) - 1). \MailSo\Base\LinkFinder::CLOSE_LINK; } return $aMatch[1]; } return ''; }, $sText); if (0 < \count($aPrepearPlainStringUrls)) { $this->aPrepearPlainStringUrls = $aPrepearPlainStringUrls; } return $sText; } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Loader.php000066400000000000000000000051131361462701300262750ustar00rootroot00000000000000 array( 'phpversion' => PHP_VERSION, 'ssl' => (int) \function_exists('openssl_open'), 'iconv' => (int) \function_exists('iconv') )); if (\MailSo\Base\Utils::FunctionExistsAndEnabled('memory_get_usage') && \MailSo\Base\Utils::FunctionExistsAndEnabled('memory_get_peak_usage')) { $aResult['php']['memory_get_usage'] = Utils::FormatFileSize(\memory_get_usage(true), 2); $aResult['php']['memory_get_peak_usage'] = Utils::FormatFileSize(\memory_get_peak_usage(true), 2); } $iTimeDelta = \microtime(true) - self::GetStatistic('Inited'); self::SetStatistic('TimeDelta', $iTimeDelta); $aResult['statistic'] = self::$aSetStatistic; $aResult['counts'] = self::$aIncStatistic; $aResult['time'] = $iTimeDelta; } return $aResult; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/ResourceRegistry.php000066400000000000000000000050211361462701300304050ustar00rootroot00000000000000 \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, 'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF )); return \is_resource($rFilter) ? $rStream : false; } self::$aStreams[$sHashName] = array($rStream, $sUtilsDecodeOrEncodeFunctionName, $sFromEncoding, $sToEncoding); \MailSo\Base\Loader::IncStatistic('CreateStream/Binary'); return \fopen(self::STREAM_NAME.'://'.$sHashName, 'rb'); } /** * @param string $sPath * * @return bool */ public function stream_open($sPath) { $this->iPos = 0; $this->sBuffer = ''; $this->sReadEndBuffer = ''; $this->rStream = false; $this->sFromEncoding = null; $this->sToEncoding = null; $this->sFunctionName = null; $bResult = false; $aPath = parse_url($sPath); if (isset($aPath['host']) && isset($aPath['scheme']) && 0 < strlen($aPath['host']) && 0 < strlen($aPath['scheme']) && self::STREAM_NAME === $aPath['scheme']) { $sHashName = $aPath['host']; if (isset(self::$aStreams[$sHashName]) && is_array(self::$aStreams[$sHashName]) && 4 === count(self::$aStreams[$sHashName])) { $this->rStream = self::$aStreams[$sHashName][0]; $this->sFunctionName = self::$aStreams[$sHashName][1]; $this->sFromEncoding = self::$aStreams[$sHashName][2]; $this->sToEncoding = self::$aStreams[$sHashName][3]; } $bResult = is_resource($this->rStream); } return $bResult; } /** * @param int $iCount * * @return string */ public function stream_read($iCount) { $sReturn = ''; $sFunctionName = $this->sFunctionName; if ($iCount > 0) { if ($iCount < strlen($this->sBuffer)) { $sReturn = substr($this->sBuffer, 0, $iCount); $this->sBuffer = substr($this->sBuffer, $iCount); } else { $sReturn = $this->sBuffer; while ($iCount > 0) { if (feof($this->rStream)) { if (0 === strlen($this->sBuffer.$sReturn)) { return false; } if (0 < strlen($this->sReadEndBuffer)) { $sReturn .= self::$sFunctionName($this->sReadEndBuffer, $this->sReadEndBuffer, $this->sFromEncoding, $this->sToEncoding); $iDecodeLen = strlen($sReturn); } $iCount = 0; $this->sBuffer = ''; } else { $sReadResult = fread($this->rStream, 8192); if (false === $sReadResult) { return false; } $sReturn .= self::$sFunctionName($this->sReadEndBuffer.$sReadResult, $this->sReadEndBuffer, $this->sFromEncoding, $this->sToEncoding); $iDecodeLen = strlen($sReturn); if ($iCount < $iDecodeLen) { $this->sBuffer = substr($sReturn, $iCount); $sReturn = substr($sReturn, 0, $iCount); $iCount = 0; } else { $iCount -= $iDecodeLen; } } } } $this->iPos += strlen($sReturn); return $sReturn; } return false; } /** * @return int */ public function stream_write() { return 0; } /** * @return int */ public function stream_tell() { return $this->iPos; } /** * @return bool */ public function stream_eof() { return 0 === strlen($this->sBuffer) && feof($this->rStream); } /** * * @return array */ public function stream_stat() { return array( 'dev' => 2, 'ino' => 0, 'mode' => 33206, 'nlink' => 1, 'uid' => 0, 'gid' => 0, 'rdev' => 2, 'size' => 0, 'atime' => 1061067181, 'mtime' => 1056136526, 'ctime' => 1056136526, 'blksize' => -1, 'blocks' => -1 ); } /** * @return bool */ public function stream_seek() { return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php000066400000000000000000000062201361462701300314420ustar00rootroot00000000000000iPos = 0; $this->iSize = 0; $this->rStream = false; $bResult = false; $aPath = parse_url($sPath); if (isset($aPath['host']) && isset($aPath['scheme']) && 0 < strlen($aPath['host']) && 0 < strlen($aPath['scheme']) && self::STREAM_NAME === $aPath['scheme']) { $sHashName = $aPath['host']; if (isset(self::$aStreams[$sHashName]) && is_array(self::$aStreams[$sHashName]) && 2 === count(self::$aStreams[$sHashName])) { $this->rStream = self::$aStreams[$sHashName][0]; $this->iSize = self::$aStreams[$sHashName][1]; } $bResult = is_resource($this->rStream); } return $bResult; } /** * @param int $iCount * * @return string */ public function stream_read($iCount) { $sResult = false; if ($this->iSize < $this->iPos + $iCount) { $iCount = $this->iSize - $this->iPos; } if ($iCount > 0) { $sReadResult = ''; $iRead = $iCount; while (0 < $iRead) { $sAddRead = @fread($this->rStream, $iRead); if (false === $sAddRead) { $sReadResult = false; break; } $sReadResult .= $sAddRead; $iRead -= strlen($sAddRead); $this->iPos += strlen($sAddRead); } if (false !== $sReadResult) { $sResult = $sReadResult; } } return $sResult; } /** * @return int */ public function stream_write() { return 0; } /** * @return int */ public function stream_tell() { return $this->iPos; } /** * @return bool */ public function stream_eof() { return $this->iPos >= $this->iSize; } /** * @return array */ public function stream_stat() { return array( 'dev' => 2, 'ino' => 0, 'mode' => 33206, 'nlink' => 1, 'uid' => 0, 'gid' => 0, 'rdev' => 2, 'size' => $this->iSize, 'atime' => 1061067181, 'mtime' => 1056136526, 'ctime' => 1056136526, 'blksize' => -1, 'blocks' => -1 ); } /** * @return bool */ public function stream_seek() { return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php000066400000000000000000000101561361462701300321410ustar00rootroot00000000000000aSubStreams[$this->iIndex])) { return $this->aSubStreams[$this->iIndex]; } return $nNull; } /** * @param string $sPath * * @return bool */ public function stream_open($sPath) { $this->aSubStreams = array(); $bResult = false; $aPath = \parse_url($sPath); if (isset($aPath['host'], $aPath['scheme']) && 0 < \strlen($aPath['host']) && 0 < \strlen($aPath['scheme']) && self::STREAM_NAME === $aPath['scheme']) { $sHashName = $aPath['host']; if (isset(self::$aStreams[$sHashName]) && \is_array(self::$aStreams[$sHashName]) && 0 < \count(self::$aStreams[$sHashName])) { $this->iIndex = 0; $this->iPos = 0; $this->bIsEnd = false; $this->sBuffer = ''; $this->aSubStreams = self::$aStreams[$sHashName]; } $bResult = 0 < \count($this->aSubStreams); } return $bResult; } /** * @param int $iCount * * @return string */ public function stream_read($iCount) { $sReturn = ''; $mCurrentPart = null; if ($iCount > 0) { if ($iCount < \strlen($this->sBuffer)) { $sReturn = \substr($this->sBuffer, 0, $iCount); $this->sBuffer = \substr($this->sBuffer, $iCount); } else { $sReturn = $this->sBuffer; while ($iCount > 0) { $mCurrentPart =& $this->getPart(); if (null === $mCurrentPart) { $this->bIsEnd = true; $this->sBuffer = ''; $iCount = 0; break; } if (\is_resource($mCurrentPart)) { if (!\feof($mCurrentPart)) { $sReadResult = @\fread($mCurrentPart, 8192); if (false === $sReadResult) { return false; } $sReturn .= $sReadResult; $iLen = \strlen($sReturn); if ($iCount < $iLen) { $this->sBuffer = \substr($sReturn, $iCount); $sReturn = \substr($sReturn, 0, $iCount); $iCount = 0; } else { $iCount -= $iLen; } } else { $this->iIndex++; } } } } $this->iPos += \strlen($sReturn); return $sReturn; } return false; } /** * @return int */ public function stream_write() { return 0; } /** * @return int */ public function stream_tell() { return $this->iPos; } /** * @return bool */ public function stream_eof() { return $this->bIsEnd; } /** * @return array */ public function stream_stat() { return array( 'dev' => 2, 'ino' => 0, 'mode' => 33206, 'nlink' => 1, 'uid' => 0, 'gid' => 0, 'rdev' => 2, 'size' => 0, 'atime' => 1061067181, 'mtime' => 1056136526, 'ctime' => 1056136526, 'blksize' => -1, 'blocks' => -1 ); } /** * @return bool */ public function stream_seek() { return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/TempFile.php000066400000000000000000000052341361462701300315570ustar00rootroot00000000000000rSream = self::$aStreams[$sHashName]; \fseek($this->rSream, 0); $bResult = true; } else { $this->rSream = fopen('php://memory', 'r+b'); self::$aStreams[$sHashName] = $this->rSream; $bResult = true; \MailSo\Base\Loader::IncStatistic('CreateStream/TempFile'); } } return $bResult; } /** * @return bool */ public function stream_close() { return true; } /** * @return bool */ public function stream_flush() { return fflush($this->rSream); } /** * @param int $iLen * * @return string */ public function stream_read($iLen) { return fread($this->rSream, $iLen); } /** * @param string $sInputString * * @return int */ public function stream_write($sInputString) { return fwrite($this->rSream, $sInputString); } /** * @return int */ public function stream_tell() { return ftell($this->rSream); } /** * @return bool */ public function stream_eof() { return feof($this->rSream); } /** * @return array */ public function stream_stat() { return fstat($this->rSream); } /** * @param int $iOffset * @param int $iWhence = SEEK_SET * * @return int */ public function stream_seek($iOffset, $iWhence = SEEK_SET) { return fseek($this->rSream, $iOffset, $iWhence); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Test.php000066400000000000000000000044361361462701300307740ustar00rootroot00000000000000rReadSream = self::$aStreams[$sHashName]; $bResult = true; } } return $bResult; } /** * @param int $iCount * * @return string */ public function stream_read($iCount) { return fread($this->rReadSream, $iCount); } /** * @param string $sInputString * * @return int */ public function stream_write($sInputString) { return strlen($sInputString); } /** * @return int */ public function stream_tell() { return ftell($this->rReadSream); } /** * @return bool */ public function stream_eof() { return feof($this->rReadSream); } /** * @return array */ public function stream_stat() { return fstat($this->rReadSream); } /** * @return bool */ public function stream_seek() { return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php000066400000000000000000001751351361462701300262030ustar00rootroot00000000000000 'utf-8', '.20127' => 'iso-8859-1', '.1250' => 'windows-1250', '.cp1250' => 'windows-1250', '.cp-1250' => 'windows-1250', '.1251' => 'windows-1251', '.cp1251' => 'windows-1251', '.cp-1251' => 'windows-1251', '.1252' => 'windows-1252', '.cp1252' => 'windows-1252', '.cp-1252' => 'windows-1252', '.1253' => 'windows-1253', '.cp1253' => 'windows-1253', '.cp-1253' => 'windows-1253', '.1254' => 'windows-1254', '.cp1254' => 'windows-1254', '.cp-1254' => 'windows-1254', '.1255' => 'windows-1255', '.cp1255' => 'windows-1255', '.cp-1255' => 'windows-1255', '.1256' => 'windows-1256', '.cp1256' => 'windows-1256', '.cp-1256' => 'windows-1256', '.1257' => 'windows-1257', '.cp1257' => 'windows-1257', '.cp-1257' => 'windows-1257', '.1258' => 'windows-1258', '.cp1258' => 'windows-1258', '.cp-1258' => 'windows-1258', '.28591' => 'iso-8859-1', '.28592' => 'iso-8859-2', '.28593' => 'iso-8859-3', '.28594' => 'iso-8859-4', '.28595' => 'iso-8859-5', '.28596' => 'iso-8859-6', '.28597' => 'iso-8859-7', '.28598' => 'iso-8859-8', '.28599' => 'iso-8859-9', '.28603' => 'iso-8859-13', '.28605' => 'iso-8859-15', '.1125' => 'cp1125', '.20866' => 'koi8-r', '.21866' => 'koi8-u', '.950' => 'big5', '.936' => 'euc-cn', '.20932' => 'euc-js', '.949' => 'euc-kr', ); /** * @access private */ private function __construct() { } /** * @return string */ public static function DetectSystemCharset() { $sResult = ''; $sLocale = @\setlocale(LC_ALL, ''); $sLocaleLower = \strtolower(\trim($sLocale)); foreach (\MailSo\Base\Utils::$aLocaleMapping as $sKey => $sValue) { if (false !== \strpos($sLocaleLower, $sKey) || false !== \strpos($sLocaleLower, '.'.$sValue)) { $sResult = $sValue; break; } } return $sResult; } /** * @return string */ public static function ConvertSystemString($sSrt) { $sSrt = \trim($sSrt); if (!empty($sSrt) && !\MailSo\Base\Utils::IsUtf8($sSrt)) { $sCharset = \MailSo\Base\Utils::DetectSystemCharset(); if (!empty($sCharset)) { $sSrt = \MailSo\Base\Utils::ConvertEncoding( $sSrt, $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); } else { $sSrt = @\utf8_encode($sSrt); } } return $sSrt; } /** * @param string $sEncoding * @param bool $bAsciAsUtf8 = false * * @return string */ public static function NormalizeCharset($sEncoding, $bAsciAsUtf8 = false) { $sEncoding = \strtolower($sEncoding); $sEncoding = \preg_replace('/^iso8/', 'iso-8', $sEncoding); $sEncoding = \preg_replace('/^cp-([\d])/', 'cp$1', $sEncoding); $sEncoding = \preg_replace('/^windows?12/', 'windows-12', $sEncoding); switch ($sEncoding) { case 'asci': case 'ascii': case 'us-asci': case 'us-ascii': $sEncoding = $bAsciAsUtf8 ? \MailSo\Base\Enumerations\Charset::UTF_8 : \MailSo\Base\Enumerations\Charset::ISO_8859_1; break; case 'unicode-1-1-utf-7': case 'unicode-1-utf-7': case 'unicode-utf-7': $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_7; break; case 'utf8': case 'utf-8': $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_8; break; case 'utf7imap': case 'utf-7imap': case 'utf7-imap': case 'utf-7-imap': $sEncoding = \MailSo\Base\Enumerations\Charset::UTF_7_IMAP; break; case 'ks-c-5601-1987': case 'ks_c_5601-1987': case 'ks_c_5601_1987': $sEncoding = 'euc-kr'; break; case 'x-gbk': $sEncoding = 'gb2312'; break; case 'iso-8859-i': case 'iso-8859-8-i': $sEncoding = \MailSo\Base\Enumerations\Charset::ISO_8859_8; break; } return $sEncoding; } /** * @param string $sCharset * @param string $sValue * * @return string */ public static function NormalizeCharsetByValue($sCharset, $sValue) { $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); if (\MailSo\Base\Enumerations\Charset::UTF_8 !== $sCharset && \MailSo\Base\Utils::IsUtf8($sValue) && false === \strpos($sCharset, \MailSo\Base\Enumerations\Charset::ISO_2022_JP) ) { $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; } return $sCharset; } /** * @param string $sFilePath * @param function $fFileExistsCallback = null * * @return string */ public static function SmartFileExists($sFilePath, $fFileExistsCallback = null) { $sFilePath = \str_replace('\\', '/', \trim($sFilePath)); if (!$fFileExistsCallback) { $fFileExistsCallback = function ($sPath) { return \file_exists($sPath); }; } if (!\call_user_func($fFileExistsCallback, $sFilePath)) { return $sFilePath; } $aFileInfo = \pathinfo($sFilePath); $iIndex = 0; do { $iIndex++; $sFilePathNew = $aFileInfo['dirname'].'/'. \preg_replace('/\(\d{1,2}\)$/', '', $aFileInfo['filename']). ' ('.$iIndex.')'. (empty($aFileInfo['extension']) ? '' : '.'.$aFileInfo['extension']) ; if (!\call_user_func($fFileExistsCallback, $sFilePathNew)) { $sFilePath = $sFilePathNew; break; } else if (10 < $iIndex) { break; } } while (true); return $sFilePath; } /** * @return bool */ public static function IsMbStringSupported() { return \MailSo\Config::$MBSTRING && \MailSo\Base\Utils::FunctionExistsAndEnabled('mb_convert_encoding'); } /** * @return bool */ public static function IsIconvSupported() { return \MailSo\Config::$ICONV && \MailSo\Base\Utils::FunctionExistsAndEnabled('iconv'); } /** * @return bool */ public static function IsIconvIgnoreSupported() { static $bCache = null; if (null !== $bCache) { return $bCache; } $bCache = false; if (\MailSo\Base\Utils::IsIconvSupported()) { if (false !== @\iconv('', '//IGNORE', '')) { $bCache = true; } } return $bCache; } /** * @return bool */ public static function IsIconvTranslitSupported() { static $bCache = null; if (null !== $bCache) { return $bCache; } $bCache = false; if (\MailSo\Base\Utils::IsIconvSupported()) { if (false !== @\iconv('', '//TRANSLIT', '')) { $bCache = true; } } return $bCache; } /** * @param string $sCharset * * @return bool */ public static function ValidateCharsetName($sCharset) { $sCharset = \strtolower(\MailSo\Base\Utils::NormalizeCharset($sCharset)); return 0 < \strlen($sCharset) && (\in_array($sCharset, array(\MailSo\Base\Enumerations\Charset::UTF_7_IMAP)) || \in_array($sCharset, \MailSo\Base\Utils::$SuppostedCharsets)); } /** * @param string $sInputString * @param string $sInputFromEncoding * @param string $sInputToEncoding * * @return string|bool */ public static function IconvConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) { $sIconvOptions = ''; if (\MailSo\Base\Utils::IsIconvIgnoreSupported()) { $sIconvOptions .= '//IGNORE'; } // if (\MailSo\Base\Utils::IsIconvTranslitSupported()) // { // $sIconvOptions .= '//TRANSLIT'; // } $mResult = @\iconv(\strtoupper($sInputFromEncoding), \strtoupper($sInputToEncoding).$sIconvOptions, $sInputString); if (false === $mResult) { if (\MailSo\Log\Logger::IsSystemEnabled()) { \MailSo\Log\Logger::SystemLog(array( 'inc' => \strtoupper($sInputFromEncoding), 'out' => \strtoupper($sInputToEncoding).$sIconvOptions, 'val' => 500 < \strlen($sInputString) ? \substr($sInputString, 0, 500) : $sInputString, 'hex' => 500 < \strlen($sInputString) ? '-- to long --' : \bin2hex($sInputString) ), \MailSo\Log\Enumerations\Type::NOTICE); } if (\MailSo\Config::$FixIconvByMbstring && \MailSo\Base\Utils::IsMbStringSupported()) { $mResult = \MailSo\Base\Utils::MbConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding); } } return $mResult; } /** * @param string $sInputString * @param string $sInputFromEncoding * @param string $sInputToEncoding * * @return string|bool */ public static function MbConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) { static $sMbstringSubCh = null; if (null === $sMbstringSubCh) { $sMbstringSubCh = \mb_substitute_character(); } \mb_substitute_character('none'); $sResult = @\mb_convert_encoding($sInputString, \strtoupper($sInputToEncoding), \strtoupper($sInputFromEncoding)); \mb_substitute_character($sMbstringSubCh); return $sResult; } /** * @param string $sInputString * @param string $sInputFromEncoding * @param string $sInputToEncoding * * @return string */ public static function ConvertEncoding($sInputString, $sInputFromEncoding, $sInputToEncoding) { $sResult = $sInputString; $sFromEncoding = \MailSo\Base\Utils::NormalizeCharset($sInputFromEncoding); $sToEncoding = \MailSo\Base\Utils::NormalizeCharset($sInputToEncoding); if ('' === \trim($sResult) || ($sFromEncoding === $sToEncoding && \MailSo\Base\Enumerations\Charset::UTF_8 !== $sFromEncoding)) { return $sResult; } $bUnknown = false; switch (true) { default: $bUnknown = true; break; case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::ISO_8859_1 && $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && \function_exists('utf8_encode')): $sResult = \utf8_encode($sResult); break; case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && $sToEncoding === \MailSo\Base\Enumerations\Charset::ISO_8859_1 && \function_exists('utf8_decode')): $sResult = \utf8_decode($sResult); break; case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP && $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_8): $sResult = \MailSo\Base\Utils::Utf7ModifiedToUtf8($sResult); if (false === $sResult) { $sResult = $sInputString; } break; case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_8 && $sToEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP): $sResult = \MailSo\Base\Utils::Utf8ToUtf7Modified($sResult); if (false === $sResult) { $sResult = $sInputString; } break; case ($sFromEncoding === \MailSo\Base\Enumerations\Charset::UTF_7_IMAP): $sResult = \MailSo\Base\Utils::ConvertEncoding( \MailSo\Base\Utils::ModifiedToPlainUtf7($sResult), \MailSo\Base\Enumerations\Charset::UTF_7, $sToEncoding ); break; case (\in_array(\strtolower($sFromEncoding), \MailSo\Base\Utils::$SuppostedCharsets)): if (\MailSo\Base\Utils::IsIconvSupported()) { $sResult = \MailSo\Base\Utils::IconvConvertEncoding($sResult, $sFromEncoding, $sToEncoding); } else if (\MailSo\Base\Utils::IsMbStringSupported()) { $sResult = \MailSo\Base\Utils::MbConvertEncoding($sResult, $sFromEncoding, $sToEncoding); } $sResult = (false !== $sResult) ? $sResult : $sInputString; break; } if ($bUnknown && \MailSo\Base\Utils::IsMbStringSupported()) { $sResult = @\mb_convert_encoding($sResult, $sToEncoding); } return $sResult; } /** * @param string $sValue * * @return bool */ public static function IsAscii($sValue) { if ('' === \trim($sValue)) { return true; } return !\preg_match('/[^\x09\x10\x13\x0A\x0D\x20-\x7E]/', $sValue); } /** * @param string $sValue * * @return string */ public static function StrToLowerIfAscii($sValue) { return \MailSo\Base\Utils::IsAscii($sValue) ? \strtolower($sValue) : $sValue; } /** * @param string $sValue * * @return string */ public static function StrToUpperIfAscii($sValue) { return \MailSo\Base\Utils::IsAscii($sValue) ? \strtoupper($sValue) : $sValue; } /** * @param string $sValue * * @return string */ public static function StrMailDomainToLowerIfAscii($sValue) { $aParts = \explode('@', $sValue, 2); if (!empty($aParts[1])) { $aParts[1] = \MailSo\Base\Utils::IsAscii($aParts[1]) ? \strtolower($aParts[1]) : $aParts[1]; } return \implode('@', $aParts); } /** * @param string $sValue * * @return string */ public static function StripSpaces($sValue) { return \MailSo\Base\Utils::Trim( \preg_replace('/[\s]+/u', ' ', $sValue)); } /** * @param string $sValue * * @return bool */ public static function IsUtf8($sValue) { return (bool) (\function_exists('mb_check_encoding') ? \mb_check_encoding($sValue, 'UTF-8') : \preg_match('//u', $sValue)); } /** * @param int $iSize * @param int $iRound * * @return string */ public static function FormatFileSize($iSize, $iRound = 0) { $aSizes = array('B', 'KB', 'MB'); for ($iIndex = 0; $iSize > 1024 && isset($aSizes[$iIndex + 1]); $iIndex++) { $iSize /= 1024; } return \round($iSize, $iRound).$aSizes[$iIndex]; } /** * @param string $sEncodedValue * @param string $sEncodeingType * * @return string */ public static function DecodeEncodingValue($sEncodedValue, $sEncodeingType) { $sResult = $sEncodedValue; switch (\strtolower($sEncodeingType)) { case 'q': case 'quoted_printable': case 'quoted-printable': $sResult = \quoted_printable_decode($sResult); break; case 'b': case 'base64': $sResult = \MailSo\Base\Utils::Base64Decode($sResult); break; } return $sResult; } /** * @param string $sInputValue * * @return string */ public static function DecodeFlowedFormat($sInputValue) { return \preg_replace('/ ([\r]?[\n])/m', ' ', $sInputValue); } /** * @param string $sEncodedValue * @param string $sIncomingCharset = '' * @param string $sForcedIncomingCharset = '' * * @return string */ public static function DecodeHeaderValue($sEncodedValue, $sIncomingCharset = '', $sForcedIncomingCharset = '') { $sValue = $sEncodedValue; if (0 < \strlen($sIncomingCharset)) { $sIncomingCharset = \MailSo\Base\Utils::NormalizeCharsetByValue($sIncomingCharset, $sValue); $sValue = \MailSo\Base\Utils::ConvertEncoding($sValue, $sIncomingCharset, \MailSo\Base\Enumerations\Charset::UTF_8); } $sValue = \preg_replace('/\?=[\n\r\t\s]{1,5}=\?/m', '?==?', $sValue); $sValue = \preg_replace('/[\r\n\t]+/m', ' ', $sValue); $aEncodeArray = array(''); $aMatch = array(); // \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?[^\?]*?\?=/', $sValue, $aMatch); \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?.*?\?=/', $sValue, $aMatch); if (isset($aMatch[0]) && \is_array($aMatch[0])) { for ($iIndex = 0, $iLen = \count($aMatch[0]); $iIndex < $iLen; $iIndex++) { if (isset($aMatch[0][$iIndex])) { $iPos = @\strpos($aMatch[0][$iIndex], '*'); if (false !== $iPos) { $aMatch[0][$iIndex][0] = \substr($aMatch[0][$iIndex][0], 0, $iPos); } } } $aEncodeArray = $aMatch[0]; } $aParts = array(); $sMainCharset = ''; $bOneCharset = true; for ($iIndex = 0, $iLen = \count($aEncodeArray); $iIndex < $iLen; $iIndex++) { $aTempArr = array('', $aEncodeArray[$iIndex]); if ('=?' === \substr(\trim($aTempArr[1]), 0, 2)) { $iPos = \strpos($aTempArr[1], '?', 2); $aTempArr[0] = \substr($aTempArr[1], 2, $iPos - 2); $sEncType = \strtoupper($aTempArr[1]{$iPos + 1}); switch ($sEncType) { case 'Q': $sHeaderValuePart = \str_replace('_', ' ', $aTempArr[1]); $aTempArr[1] = \quoted_printable_decode(\substr( $sHeaderValuePart, $iPos + 3, \strlen($sHeaderValuePart) - $iPos - 5)); break; case 'B': $sHeaderValuePart = $aTempArr[1]; $aTempArr[1] = \MailSo\Base\Utils::Base64Decode(\substr( $sHeaderValuePart, $iPos + 3, \strlen($sHeaderValuePart) - $iPos - 5)); break; } } if (0 < \strlen($aTempArr[0])) { $sCharset = 0 === \strlen($sForcedIncomingCharset) ? $aTempArr[0] : $sForcedIncomingCharset; $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset, true); if ('' === $sMainCharset) { $sMainCharset = $sCharset; } else if ($sMainCharset !== $sCharset) { $bOneCharset = false; } } $aParts[] = array( $aEncodeArray[$iIndex], $aTempArr[1], $sCharset ); unset($aTempArr); } for ($iIndex = 0, $iLen = \count($aParts); $iIndex < $iLen; $iIndex++) { if ($bOneCharset) { $sValue = \str_replace($aParts[$iIndex][0], $aParts[$iIndex][1], $sValue); } else { $aParts[$iIndex][2] = \MailSo\Base\Utils::NormalizeCharsetByValue($aParts[$iIndex][2], $aParts[$iIndex][1]); $sValue = \str_replace($aParts[$iIndex][0], \MailSo\Base\Utils::ConvertEncoding($aParts[$iIndex][1], $aParts[$iIndex][2], \MailSo\Base\Enumerations\Charset::UTF_8), $sValue); } } if ($bOneCharset && 0 < \strlen($sMainCharset)) { $sMainCharset = \MailSo\Base\Utils::NormalizeCharsetByValue($sMainCharset, $sValue); $sValue = \MailSo\Base\Utils::ConvertEncoding($sValue, $sMainCharset, \MailSo\Base\Enumerations\Charset::UTF_8); } return $sValue; } /** * @param string $sIncHeaders * @param string $aHeadersToRemove = array() * * @return string */ public static function RemoveHeaderFromHeaders($sIncHeaders, $aHeadersToRemove = array()) { $sResultHeaders = $sIncHeaders; if (\is_array($aHeadersToRemove) && 0 < \count($aHeadersToRemove)) { $aHeadersToRemove = \array_map('strtolower', $aHeadersToRemove); $sIncHeaders = \preg_replace('/[\r\n]+/', "\n", $sIncHeaders); $aHeaders = \explode("\n", $sIncHeaders); $bSkip = false; $aResult = array(); foreach ($aHeaders as $sLine) { if (0 < \strlen($sLine)) { $sFirst = \substr($sLine,0,1); if (' ' === $sFirst || "\t" === $sFirst) { if (!$bSkip) { $aResult[] = $sLine; } } else { $bSkip = false; $aParts = \explode(':', $sLine, 2); if (!empty($aParts) && !empty($aParts[0])) { if (\in_array(\strtolower(\trim($aParts[0])), $aHeadersToRemove)) { $bSkip = true; } else { $aResult[] = $sLine; } } } } } $sResultHeaders = \implode("\r\n", $aResult); } return $sResultHeaders; } /** * @param string $sEncodeType * @param string $sValue * * @return string */ public static function EncodeUnencodedValue($sEncodeType, $sValue) { $sValue = \trim($sValue); if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) { switch (\strtoupper($sEncodeType)) { case 'B': $sValue = '=?'.\strtolower(\MailSo\Base\Enumerations\Charset::UTF_8). '?B?'.\base64_encode($sValue).'?='; break; case 'Q': $sValue = '=?'.\strtolower(\MailSo\Base\Enumerations\Charset::UTF_8). '?Q?'.\str_replace(array('?', ' ', '_'), array('=3F', '_', '=5F'), \quoted_printable_encode($sValue)).'?='; break; } } return $sValue; } /** * @unused * * @param string $sEncodeType * @param string $sEncodeCharset * @param string $sValue * * @return string */ public static function EncodeHeaderValue($sEncodeType, $sEncodeCharset, $sValue) { $sValue = \trim($sValue); if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) { switch (\strtoupper($sEncodeType)) { case 'B': $sValue = '=?'.\strtolower($sEncodeCharset).'?B?'.\base64_encode($sValue).'?='; break; case 'Q': $sValue = '=?'.\strtolower($sEncodeCharset).'?Q?'.\str_replace( array('?', ' ', '_'), array('=3F', '_', '=5F'), \quoted_printable_encode($sValue)).'?='; break; } } return \trim($sValue); } /** * @param string $sAttrName * @param string $sValue = 'utf-8' * @param string $sCharset = '' * @param string $sLang = '' * @param int $iLen = 78 * * @return string|bool */ public static function AttributeRfc2231Encode($sAttrName, $sValue, $sCharset = 'utf-8', $sLang = '', $iLen = 1000) { $sValue = \strtoupper($sCharset).'\''.$sLang.'\''. \preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function ($match) { return \rawurlencode($match[0]); }, $sValue); $iNlen = \strlen($sAttrName); $iVlen = \strlen($sValue); if (\strlen($sAttrName) + $iVlen > $iLen - 3) { $sections = array(); $section = 0; for ($i = 0, $j = 0; $i < $iVlen; $i += $j) { $j = $iLen - $iNlen - \strlen($section) - 4; $sections[$section++] = \substr($sValue, $i, $j); } for ($i = 0, $n = $section; $i < $n; $i++) { $sections[$i] = ' '.$sAttrName.'*'.$i.'*='.$sections[$i]; } return \implode(";\r\n", $sections); } else { return $sAttrName.'*='.$sValue; } } /** * @param string $sAttrName * @param string $sValue * * @return string */ public static function EncodeHeaderUtf8AttributeValue($sAttrName, $sValue) { $sAttrName = \trim($sAttrName); $sValue = \trim($sValue); if (0 < \strlen($sValue) && !\MailSo\Base\Utils::IsAscii($sValue)) { if (!empty($_SERVER['HTTP_USER_AGENT']) && 0 < \strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) { $sValue = $sAttrName.'="'.\preg_replace('/[+\s]+/', '%20', \urlencode($sValue)).'"'; } else { $sValue = \MailSo\Base\Utils::AttributeRfc2231Encode($sAttrName, $sValue); } } else { $sValue = $sAttrName.'="'.\str_replace('"', '\\"', $sValue).'"'; } return \trim($sValue); } /** * @param string $sEmail * * @return string */ public static function GetAccountNameFromEmail($sEmail) { $sResult = ''; if (0 < \strlen($sEmail)) { $iPos = \strrpos($sEmail, '@'); $sResult = (false === $iPos) ? $sEmail : \substr($sEmail, 0, $iPos); } return $sResult; } /** * @param string $sEmail * * @return string */ public static function GetDomainFromEmail($sEmail) { $sResult = ''; if (0 < \strlen($sEmail)) { $iPos = \strrpos($sEmail, '@'); if (false !== $iPos && 0 < $iPos) { $sResult = \substr($sEmail, $iPos + 1); } } return $sResult; } /** * @param string $sDomain * * @return string */ public static function GetClearDomainName($sDomain) { $sResultDomain = \preg_replace( '/^(webmail|email|mail|www|imap4|pop3|imap|pop|demo|client|ssl|secure|test|cloud|box|m)\./i', '', $sDomain); return false === \strpos($sResultDomain, '.') ? $sDomain : $sResultDomain; } /** * @param string $sFileName * * @return string */ public static function GetFileExtension($sFileName) { $iLast = \strrpos($sFileName, '.'); return false === $iLast ? '' : \strtolower(\substr($sFileName, $iLast + 1)); } /** * @param string $sFileName * * @return string */ public static function MimeContentType($sFileName) { $sResult = 'application/octet-stream'; $sFileName = \trim(\strtolower($sFileName)); if ('winmail.dat' === $sFileName) { return 'application/ms-tnef'; } $aMimeTypes = array( 'eml' => 'message/rfc822', 'mime' => 'message/rfc822', 'txt' => 'text/plain', 'text' => 'text/plain', 'def' => 'text/plain', 'list' => 'text/plain', 'in' => 'text/plain', 'ini' => 'text/plain', 'log' => 'text/plain', 'sql' => 'text/plain', 'cfg' => 'text/plain', 'conf' => 'text/plain', 'asc' => 'text/plain', 'rtx' => 'text/richtext', 'vcard' => 'text/vcard', 'vcf' => 'text/vcard', 'htm' => 'text/html', 'html' => 'text/html', 'csv' => 'text/csv', 'ics' => 'text/calendar', 'ifb' => 'text/calendar', 'xml' => 'text/xml', 'json' => 'application/json', 'swf' => 'application/x-shockwave-flash', 'hlp' => 'application/winhlp', 'wgt' => 'application/widget', 'chm' => 'application/vnd.ms-htmlhelp', 'p10' => 'application/pkcs10', 'p7c' => 'application/pkcs7-mime', 'p7m' => 'application/pkcs7-mime', 'p7s' => 'application/pkcs7-signature', 'torrent' => 'application/x-bittorrent', // scripts 'js' => 'application/javascript', 'pl' => 'text/perl', 'css' => 'text/css', 'asp' => 'text/asp', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', 'php5' => 'application/x-httpd-php', 'phtml' => 'application/x-httpd-php', // images 'png' => 'image/png', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'jfif' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'cgm' => 'image/cgm', 'ief' => 'image/ief', 'ico' => 'image/x-icon', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', 'djv' => 'image/vnd.djvu', 'djvu' => 'image/vnd.djvu', 'webp' => 'image/webp', // archives 'zip' => 'application/zip', '7z' => 'application/x-7z-compressed', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'dll' => 'application/x-msdownload', 'scr' => 'application/x-msdownload', 'com' => 'application/x-msdownload', 'bat' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', 'gz' => 'application/x-gzip', 'tgz' => 'application/x-gzip', 'bz' => 'application/x-bzip', 'bz2' => 'application/x-bzip2', 'deb' => 'application/x-debian-package', // fonts 'psf' => 'application/x-font-linux-psf', 'otf' => 'application/x-font-otf', 'pcf' => 'application/x-font-pcf', 'snf' => 'application/x-font-snf', 'ttf' => 'application/x-font-ttf', 'ttc' => 'application/x-font-ttf', // audio 'mp3' => 'audio/mpeg', 'amr' => 'audio/amr', 'aac' => 'audio/x-aac', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'wav' => 'audio/x-wav', 'wma' => 'audio/x-ms-wma', 'wax' => 'audio/x-ms-wax', 'midi' => 'audio/midi', 'mp4a' => 'audio/mp4', 'ogg' => 'audio/ogg', 'weba' => 'audio/webm', 'ra' => 'audio/x-pn-realaudio', 'ram' => 'audio/x-pn-realaudio', 'rmp' => 'audio/x-pn-realaudio-plugin', 'm3u' => 'audio/x-mpegurl', // video 'flv' => 'video/x-flv', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'avi' => 'video/x-msvideo', 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'm1v' => 'video/mpeg', 'm2v' => 'video/mpeg', '3gp' => 'video/3gpp', '3g2' => 'video/3gpp2', 'h261' => 'video/h261', 'h263' => 'video/h263', 'h264' => 'video/h264', 'jpgv' => 'video/jpgv', 'mp4' => 'video/mp4', 'mp4v' => 'video/mp4', 'mpg4' => 'video/mp4', 'ogv' => 'video/ogg', 'webm' => 'video/webm', 'm4v' => 'video/x-m4v', 'asf' => 'video/x-ms-asf', 'asx' => 'video/x-ms-asf', 'wm' => 'video/x-ms-wm', 'wmv' => 'video/x-ms-wmv', 'wmx' => 'video/x-ms-wmx', 'wvx' => 'video/x-ms-wvx', 'movie' => 'video/x-sgi-movie', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // ms office 'doc' => 'application/msword', 'dot' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // open office 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet' ); $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); if (0 < \strlen($sExt) && isset($aMimeTypes[$sExt])) { $sResult = $aMimeTypes[$sExt]; } return $sResult; } /** * @param string $sContentType * @param string $sFileName * * @return string */ public static function ContentTypeType($sContentType, $sFileName) { $sResult = ''; $sContentType = \strtolower($sContentType); if (0 === \strpos($sContentType, 'image/')) { $sResult = 'image'; } else { switch ($sContentType) { case 'application/zip': case 'application/x-7z-compressed': case 'application/x-rar-compressed': case 'application/x-msdownload': case 'application/vnd.ms-cab-compressed': case 'application/x-gzip': case 'application/x-bzip': case 'application/x-bzip2': case 'application/x-debian-package': $sResult = 'archive'; break; case 'application/msword': case 'application/rtf': case 'application/vnd.ms-excel': case 'application/vnd.ms-powerpoint': case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': case 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': case 'application/vnd.oasis.opendocument.text': case 'application/vnd.oasis.opendocument.spreadsheet': $sResult = 'doc'; break; case 'application/pdf': case 'application/x-pdf': $sResult = 'pdf'; break; } if ('' === $sResult) { switch (\strtolower(\MailSo\Base\Utils::GetFileExtension($sFileName))) { case 'zip': case '7z': case 'rar': $sResult = 'archive'; break; } } } return $sResult; } /** * @staticvar bool $bValidateAction * * @param int $iTimeToReset = 15 * @param int $iTimeToAdd = 120 * * @return bool */ public static function ResetTimeLimit($iTimeToReset = 15, $iTimeToAdd = 120) { $iTime = \time(); if ($iTime < \MailSo\Base\Loader::$InitTime + 5) { // do nothing first 5s return true; } static $bValidateAction = null; static $iResetTimer = null; if (null === $bValidateAction) { $iResetTimer = 0; $sSafeMode = \strtolower(\trim(@\ini_get('safe_mode'))); $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode || 'true' === $sSafeMode; $bValidateAction = !$bSafeMode && \MailSo\Base\Utils::FunctionExistsAndEnabled('set_time_limit'); } if ($bValidateAction && $iTimeToReset < $iTime - $iResetTimer) { $iResetTimer = $iTime; if (!@\set_time_limit($iTimeToAdd)) { $bValidateAction = false; return false; } return true; } return false; } /** * @param string $sText * * @return string */ public static function InlineRebuildStringToJsString($sText) { static $aJsonReplaces = array( array('\\', "\n", "\t", "\r", '\b', "\f", '"'), array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"') ); return \str_replace('', '<\/script>', \str_replace($aJsonReplaces[0], $aJsonReplaces[1], $sText)); } /** * @param array $aInput */ public static function ClearArrayUtf8Values(&$aInput) { if (\is_array($aInput)) { foreach ($aInput as $mKey => $mItem) { if (\is_string($mItem)) { $aInput[$mKey] = \MailSo\Base\Utils::Utf8Clear($mItem); } else if (\is_array($mItem)) { \MailSo\Base\Utils::ClearArrayUtf8Values($mItem); $aInput[$mKey] = $mItem; } } } } /** * @param mixed $mInput * @param \MailSo\Log\Logger|null $oLogger = null * * @return string */ public static function Php2js($mInput, $oLogger = null) { static $iOpt = null; if (null === $iOpt) { $iOpt = \defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0; } $sResult = @\json_encode($mInput, $iOpt); if (!\is_string($sResult) || '' === $sResult) { if (!$oLogger && \MailSo\Log\Logger::IsSystemEnabled()) { $oLogger = \MailSo\Config::$SystemLogger; } if (!($oLogger instanceof \MailSo\Log\Logger)) { $oLogger = null; } if ($oLogger) { $oLogger->Write('json_encode: '.\trim( (\MailSo\Base\Utils::FunctionExistsAndEnabled('json_last_error') ? ' [Error Code: '.\json_last_error().']' : ''). (\MailSo\Base\Utils::FunctionExistsAndEnabled('json_last_error_msg') ? ' [Error Message: '.\json_last_error_msg().']' : '') ), \MailSo\Log\Enumerations\Type::WARNING, 'JSON' ); } if (\is_array($mInput)) { if ($oLogger) { $oLogger->WriteDump($mInput, \MailSo\Log\Enumerations\Type::INFO, 'JSON'); $oLogger->Write('Trying to clear Utf8 before json_encode', \MailSo\Log\Enumerations\Type::INFO, 'JSON'); } \MailSo\Base\Utils::ClearArrayUtf8Values($mInput); $sResult = @\json_encode($mInput, $iOpt); } } return $sResult; } /** * @param string $sFileName * * @return string */ public static function ClearFileName($sFileName) { return \MailSo\Base\Utils::Trim(\MailSo\Base\Utils::ClearNullBite( \MailSo\Base\Utils::StripSpaces( \str_replace(array('"', '/', '\\', '*', '?', '<', '>', '|', ':'), ' ', $sFileName)))); } /** * @param string $sValue * * @return string */ public static function ClearXss($sValue) { return \MailSo\Base\Utils::Trim(\MailSo\Base\Utils::ClearNullBite( \str_replace(array('"', '/', '\\', '*', '?', '<', '>', '|', ':'), ' ', $sValue))); } /** * @param string $sValue * * @return string */ public static function Trim($sValue) { return \trim(\preg_replace('/^[\x00-\x1F]+/u', '', \preg_replace('/[\x00-\x1F]+$/u', '', \trim($sValue)))); } /** * @param string $sDir * * @return bool */ public static function RecRmDir($sDir) { if (@\is_dir($sDir)) { $aObjects = \scandir($sDir); foreach ($aObjects as $sObject) { if ('.' !== $sObject && '..' !== $sObject) { // if ('dir' === \filetype($sDir.'/'.$sObject)) if (\is_dir($sDir.'/'.$sObject)) { self::RecRmDir($sDir.'/'.$sObject); } else { @\unlink($sDir.'/'.$sObject); } } } return @\rmdir($sDir); } return false; } /** * @param string $sSource * @param string $sDestination */ public static function CopyDir($sSource, $sDestination) { if (\is_dir($sSource)) { if (!\is_dir($sDestination)) { \mkdir($sDestination); } $oDirectory = \dir($sSource); if ($oDirectory) { while (false !== ($sRead = $oDirectory->read())) { if ('.' === $sRead || '..' === $sRead) { continue; } $sPathDir = $sSource.'/'.$sRead; if (\is_dir($sPathDir)) { \MailSo\Base\Utils::CopyDir($sPathDir, $sDestination.'/'.$sRead); continue; } \copy($sPathDir, $sDestination.'/'.$sRead); } $oDirectory->close(); } } } /** * @param string $sTempPath * @param int $iTime2Kill * @param int $iNow * * @return bool */ public static function RecTimeDirRemove($sTempPath, $iTime2Kill, $iNow) { $iFileCount = 0; $sTempPath = rtrim($sTempPath, '\\/'); if (@\is_dir($sTempPath)) { $rDirH = @\opendir($sTempPath); if ($rDirH) { $bRemoveAllDirs = true; while (($sFile = @\readdir($rDirH)) !== false) { if ('.' !== $sFile && '..' !== $sFile) { if (@\is_dir($sTempPath.'/'.$sFile)) { if (!\MailSo\Base\Utils::RecTimeDirRemove($sTempPath.'/'.$sFile, $iTime2Kill, $iNow)) { $bRemoveAllDirs = false; } } else { $iFileCount++; } } } @\closedir($rDirH); } if ($iFileCount > 0) { if (\MailSo\Base\Utils::TimeFilesRemove($sTempPath, $iTime2Kill, $iNow)) { return @\rmdir($sTempPath); } } else { return $bRemoveAllDirs ? @\rmdir($sTempPath) : false; } return false; } return true; } /** * @param string $sTempPath * @param int $iTime2Kill * @param int $iNow */ public static function TimeFilesRemove($sTempPath, $iTime2Kill, $iNow) { $bResult = true; $sTempPath = rtrim($sTempPath, '\\/'); if (@\is_dir($sTempPath)) { $rDirH = @\opendir($sTempPath); if ($rDirH) { while (($sFile = @\readdir($rDirH)) !== false) { if ($sFile !== '.' && $sFile !== '..') { if ($iNow - \filemtime($sTempPath.'/'.$sFile) > $iTime2Kill) { @\unlink($sTempPath.'/'.$sFile); } else { $bResult = false; } } } @\closedir($rDirH); } } return $bResult; } /** * @param string $sUtfString * @param int $iLength * * @return string */ public static function Utf8Truncate($sUtfString, $iLength) { if (\strlen($sUtfString) <= $iLength) { return $sUtfString; } while ($iLength >= 0) { if ((\ord($sUtfString[$iLength]) < 0x80) || (\ord($sUtfString[$iLength]) >= 0xC0)) { return \substr($sUtfString, 0, $iLength); } $iLength--; } return ''; } /** * @param string $sUtfString * @param string $sReplaceOn = '' * * @return string */ public static function Utf8Clear($sUtfString, $sReplaceOn = '') { if ('' === $sUtfString) { return $sUtfString; } $sUtfString = \preg_replace(\MailSo\Base\Utils::$sValidUtf8Regexp, '$1', $sUtfString); $sUtfString = \preg_replace( '/\xE0[\x80-\x9F][\x80-\xBF]'. '|\xEF\xBF\xBF'. '|\xED[\xA0-\xBF][\x80-\xBF]/S', $sReplaceOn, $sUtfString); $sUtfString = \preg_replace('/\xEF\xBF\xBD/', '?', $sUtfString); $sNewUtfString = false; if (false === $sNewUtfString && \MailSo\Base\Utils::IsMbStringSupported()) { $sNewUtfString = \MailSo\Base\Utils::MbConvertEncoding($sUtfString, 'UTF-8', 'UTF-8'); } if (false === $sNewUtfString && \MailSo\Base\Utils::IsIconvSupported()) { $sNewUtfString = \MailSo\Base\Utils::IconvConvertEncoding($sUtfString, 'UTF-8', 'UTF-8'); } if (false !== $sNewUtfString) { $sUtfString = $sNewUtfString; } return $sUtfString; } /** * @param string $sUtfString * * @return bool */ public static function IsRTL($sUtfString) { // \x{0591}-\x{05F4} - Hebrew // \x{0600}-\x{068F} - Arabic // \x{0750}-\x{077F} - Arabic // \x{08A0}-\x{08FF} - Arabic // \x{103A0}-\x{103DF} - Old Persian return 0 < (int) preg_match('/[\x{0591}-\x{05F4}\x{0600}-\x{068F}\x{0750}-\x{077F}\x{08A0}-\x{08FF}\x{103A0}-\x{103DF}]/u', $sUtfString); } /** * @param string $sString * * @return string */ public static function Base64Decode($sString) { $sResultString = \base64_decode($sString, true); if (false === $sResultString) { $sString = \str_replace(array(' ', "\r", "\n", "\t"), '', $sString); $sString = \preg_replace('/[^a-zA-Z0-9=+\/](.*)$/', '', $sString); if (false !== \strpos(\trim(\trim($sString), '='), '=')) { $sString = \preg_replace('/=([^=])/', '= $1', $sString); $aStrings = \explode(' ', $sString); foreach ($aStrings as $iIndex => $sParts) { $aStrings[$iIndex] = \base64_decode($sParts); } $sResultString = \implode('', $aStrings); } else { $sResultString = \base64_decode($sString); } } return $sResultString; } /** * @param string $sValue * * @return string */ public static function UrlSafeBase64Encode($sValue) { return \rtrim(\strtr(\base64_encode($sValue), '+/', '-_'), '='); } /** * @param string $sValue * * @return string */ public static function UrlSafeBase64Decode($sValue) { $sValue = \rtrim(\strtr($sValue, '-_.', '+/='), '='); return \MailSo\Base\Utils::Base64Decode(\str_pad($sValue, \strlen($sValue) + (\strlen($sValue) % 4), '=', STR_PAD_RIGHT)); } /** * @param string $sSequence * * @return array */ public static function ParseFetchSequence($sSequence) { $aResult = array(); $sSequence = \trim($sSequence); if (0 < \strlen($sSequence)) { $aSequence = \explode(',', $sSequence); foreach ($aSequence as $sItem) { if (false === \strpos($sItem, ':')) { $aResult[] = (int) $sItem; } else { $aItems = \explode(':', $sItem); $iMax = \max($aItems[0], $aItems[1]); for ($iIndex = $aItems[0]; $iIndex <= $iMax; $iIndex++) { $aResult[] = (int) $iIndex; } } } } return $aResult; } /** * @param array $aSequence * * @return string */ public static function PrepearFetchSequence($aSequence) { $aResult = array(); if (\is_array($aSequence) && 0 < \count($aSequence)) { $iStart = null; $iPrev = null; foreach ($aSequence as $sItem) { // simple protection if (false !== \strpos($sItem, ':')) { $aResult[] = $sItem; continue; } $iItem = (int) $sItem; if (null === $iStart || null === $iPrev) { $iStart = $iItem; $iPrev = $iItem; continue; } if ($iPrev === $iItem - 1) { $iPrev = $iItem; } else { $aResult[] = $iStart === $iPrev ? $iStart : $iStart.':'.$iPrev; $iStart = $iItem; $iPrev = $iItem; } } if (null !== $iStart && null !== $iPrev) { $aResult[] = $iStart === $iPrev ? $iStart : $iStart.':'.$iPrev; } } return \implode(',', $aResult); } /** * * @param resource $fResource * @param int $iBufferLen = 8192 * * @return bool */ public static function FpassthruWithTimeLimitReset($fResource, $iBufferLen = 8192) { $bResult = false; if (\is_resource($fResource)) { while (!\feof($fResource)) { $sBuffer = @\fread($fResource, $iBufferLen); if (false !== $sBuffer) { echo $sBuffer; \MailSo\Base\Utils::ResetTimeLimit(); continue; } break; } $bResult = true; } return $bResult; } /** * @param resource $rRead * @param array $aWrite * @param int $iBufferLen = 8192 * @param bool $bResetTimeLimit = true * @param bool $bFixCrLf = false * @param bool $bRewindOnComplete = false * * @return int|bool */ public static function MultipleStreamWriter($rRead, $aWrite, $iBufferLen = 8192, $bResetTimeLimit = true, $bFixCrLf = false, $bRewindOnComplete = false) { $mResult = false; if ($rRead && \is_array($aWrite) && 0 < \count($aWrite)) { $mResult = 0; while (!\feof($rRead)) { $sBuffer = \fread($rRead, $iBufferLen); if (false === $sBuffer) { $mResult = false; break; } if (0 === $iBufferLen || '' === $sBuffer) { break; } if ($bFixCrLf) { $sBuffer = \str_replace("\n", "\r\n", \str_replace("\r", '', $sBuffer)); } $mResult += \strlen($sBuffer); foreach ($aWrite as $rWriteStream) { $mWriteResult = \fwrite($rWriteStream, $sBuffer); if (false === $mWriteResult) { $mResult = false; break 2; } } if ($bResetTimeLimit) { \MailSo\Base\Utils::ResetTimeLimit(); } } } if ($mResult && $bRewindOnComplete) { foreach ($aWrite as $rWriteStream) { if (\is_resource($rWriteStream)) { @\rewind($rWriteStream); } } } return $mResult; } /** * @param string $sUtfModifiedString * * @return string */ public static function ModifiedToPlainUtf7($sUtfModifiedString) { $sUtf = ''; $bBase = false; for ($iIndex = 0, $iLen = \strlen($sUtfModifiedString); $iIndex < $iLen; $iIndex++) { if ('&' === $sUtfModifiedString[$iIndex]) { if (isset($sUtfModifiedString[$iIndex+1]) && '-' === $sUtfModifiedString[$iIndex + 1]) { $sUtf .= '&'; $iIndex++; } else { $sUtf .= '+'; $bBase = true; } } else if ($sUtfModifiedString[$iIndex] == '-' && $bBase) { $bBase = false; } else { if ($bBase && ',' === $sUtfModifiedString[$iIndex]) { $sUtf .= '/'; } else if (!$bBase && '+' === $sUtfModifiedString[$iIndex]) { $sUtf .= '+-'; } else { $sUtf .= $sUtfModifiedString[$iIndex]; } } } return $sUtf; } /** * @param string $sStr * * @return string|bool */ public static function Utf7ModifiedToUtf8($sStr) { $aArray = array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,62, 63,-1,-1,-1,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1); $sResult = ''; $bError = false; $iLen = \strlen($sStr); for ($iIndex = 0; $iLen > 0; $iIndex++, $iLen--) { $sChar = $sStr{$iIndex}; if ($sChar == '&') { $iIndex++; $iLen--; $sChar = isset($sStr{$iIndex}) ? $sStr{$iIndex} : null; if ($sChar === null) { break; } if ($iLen && $sChar == '-') { $sResult .= '&'; continue; } $iCh = 0; $iK = 10; for (; $iLen > 0; $iIndex++, $iLen--) { $sChar = $sStr{$iIndex}; $iB = $aArray[\ord($sChar)]; if ((\ord($sChar) & 0x80) || $iB == -1) { break; } if ($iK > 0) { $iCh |= $iB << $iK; $iK -= 6; } else { $iCh |= $iB >> (-$iK); if ($iCh < 0x80) { if (0x20 <= $iCh && $iCh < 0x7f) { return $bError; } $sResult .= \chr($iCh); } else if ($iCh < 0x800) { $sResult .= \chr(0xc0 | ($iCh >> 6)); $sResult .= \chr(0x80 | ($iCh & 0x3f)); } else { $sResult .= \chr(0xe0 | ($iCh >> 12)); $sResult .= \chr(0x80 | (($iCh >> 6) & 0x3f)); $sResult .= \chr(0x80 | ($iCh & 0x3f)); } $iCh = ($iB << (16 + $iK)) & 0xffff; $iK += 10; } } if (($iCh || $iK < 6) || (!$iLen || $sChar != '-') || ($iLen > 2 && '&' === $sStr{$iIndex+1} && '-' !== $sStr{$iIndex+2})) { return $bError; } } else if (\ord($sChar) < 0x20 || \ord($sChar) >= 0x7f) { return $bError; } else { $sResult .= $sChar; } } return $sResult; } /** * @param string $sStr * * @return string|bool */ public static function Utf8ToUtf7Modified($sStr) { $sArray = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S', 'T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', 'p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+',','); $sLen = \strlen($sStr); $bIsB = false; $iIndex = $iN = 0; $sReturn = ''; $bError = false; $iCh = $iB = $iK = 0; while ($sLen) { $iC = \ord($sStr{$iIndex}); if ($iC < 0x80) { $iCh = $iC; $iN = 0; } else if ($iC < 0xc2) { return $bError; } else if ($iC < 0xe0) { $iCh = $iC & 0x1f; $iN = 1; } else if ($iC < 0xf0) { $iCh = $iC & 0x0f; $iN = 2; } else if ($iC < 0xf8) { $iCh = $iC & 0x07; $iN = 3; } else if ($iC < 0xfc) { $iCh = $iC & 0x03; $iN = 4; } else if ($iC < 0xfe) { $iCh = $iC & 0x01; $iN = 5; } else { return $bError; } $iIndex++; $sLen--; if ($iN > $sLen) { return $bError; } for ($iJ = 0; $iJ < $iN; $iJ++) { $iO = \ord($sStr{$iIndex+$iJ}); if (($iO & 0xc0) != 0x80) { return $bError; } $iCh = ($iCh << 6) | ($iO & 0x3f); } if ($iN > 1 && !($iCh >> ($iN * 5 + 1))) { return $bError; } $iIndex += $iN; $sLen -= $iN; if ($iCh < 0x20 || $iCh >= 0x7f) { if (!$bIsB) { $sReturn .= '&'; $bIsB = true; $iB = 0; $iK = 10; } if ($iCh & ~0xffff) { $iCh = 0xfffe; } $sReturn .= $sArray[($iB | $iCh >> $iK)]; $iK -= 6; for (; $iK >= 0; $iK -= 6) { $sReturn .= $sArray[(($iCh >> $iK) & 0x3f)]; } $iB = ($iCh << (-$iK)) & 0x3f; $iK += 16; } else { if ($bIsB) { if ($iK > 10) { $sReturn .= $sArray[$iB]; } $sReturn .= '-'; $bIsB = false; } $sReturn .= \chr($iCh); if ('&' === \chr($iCh)) { $sReturn .= '-'; } } } if ($bIsB) { if ($iK > 10) { $sReturn .= $sArray[$iB]; } $sReturn .= '-'; } return $sReturn; } /** * @param string|array $mFunctionNameOrNames * * @return bool */ public static function FunctionExistsAndEnabled($mFunctionNameOrNames) { static $aCache = null; if (\is_array($mFunctionNameOrNames)) { foreach ($mFunctionNameOrNames as $sFunctionName) { if (!\MailSo\Base\Utils::FunctionExistsAndEnabled($sFunctionName)) { return false; } } return true; } if (empty($mFunctionNameOrNames) || !\function_exists($mFunctionNameOrNames) || !\is_callable($mFunctionNameOrNames)) { return false; } if (null === $aCache) { $sDisableFunctions = @\ini_get('disable_functions'); $sDisableFunctions = \is_string($sDisableFunctions) && 0 < \strlen($sDisableFunctions) ? $sDisableFunctions : ''; $aCache = \explode(',', $sDisableFunctions); $aCache = \is_array($aCache) && 0 < \count($aCache) ? $aCache : array(); if (\extension_loaded('suhosin')) { $sSuhosin = @\ini_get('suhosin.executor.func.blacklist'); $sSuhosin = \is_string($sSuhosin) && 0 < \strlen($sSuhosin) ? $sSuhosin : ''; $aSuhosinCache = \explode(',', $sSuhosin); $aSuhosinCache = \is_array($aSuhosinCache) && 0 < \count($aSuhosinCache) ? $aSuhosinCache : array(); if (0 < \count($aSuhosinCache)) { $aCache = \array_merge($aCache, $aSuhosinCache); $aCache = \array_unique($aCache); } } } return !\in_array($mFunctionNameOrNames, $aCache); } /** * @param string $mValue * * @return string */ public static function ClearNullBite($mValue) { return \str_replace('%00', '', $mValue); } /** * @param mixed $mValue * @param bool $bClearNullBite = false * * @return mixed */ public static function StripSlashesValue($mValue, $bClearNullBite = false) { static $bIsMagicQuotesOn = null; if (null === $bIsMagicQuotesOn) { $bIsMagicQuotesOn = (bool) @\ini_get('magic_quotes_gpc'); } if (!$bIsMagicQuotesOn) { return $bClearNullBite && \is_string($mValue) ? \MailSo\Base\Utils::ClearNullBite($mValue) : $mValue; } $sType = \gettype($mValue); if ('string' === $sType) { return \stripslashes($bClearNullBite ? \MailSo\Base\Utils::ClearNullBite($mValue) : $mValue); } else if ('array' === $sType) { $aReturnValue = array(); $mValueKeys = \array_keys($mValue); foreach ($mValueKeys as $sKey) { $aReturnValue[$sKey] = \MailSo\Base\Utils::StripSlashesValue($mValue[$sKey], $bClearNullBite); } return $aReturnValue; } return $mValue; } /** * @param string $sStr * * @return string */ public static function CharsetDetect($sStr) { $mResult = ''; if (!\MailSo\Base\Utils::IsAscii($sStr)) { $mResult = \MailSo\Base\Utils::IsMbStringSupported() && \MailSo\Base\Utils::FunctionExistsAndEnabled('mb_detect_encoding') ? @\mb_detect_encoding($sStr, 'auto', true) : false; if (false === $mResult && \MailSo\Base\Utils::IsIconvSupported()) { $mResult = \md5(@\iconv('utf-8', 'utf-8//IGNORE', $sStr)) === \md5($sStr) ? 'utf-8' : ''; } } return \is_string($mResult) && 0 < \strlen($mResult) ? $mResult : ''; } /** * @param string $sAdditionalSalt = '' * * @return string */ public static function Md5Rand($sAdditionalSalt = '') { return \md5(\microtime(true).\rand(10000, 99999). \md5($sAdditionalSalt).\rand(10000, 99999).\microtime(true)); } /** * @param string $sAdditionalSalt = '' * * @return string */ public static function Sha1Rand($sAdditionalSalt = '') { return \sha1(\microtime(true).\rand(10000, 99999). \sha1($sAdditionalSalt).\rand(10000, 99999).\microtime(true)); } /** * @param string $sData * @param string $sKey * * @return string */ public static function Hmac($sData, $sKey) { if (\function_exists('hash_hmac')) { return \hash_hmac('md5', $sData, $sKey); } $iLen = 64; if ($iLen < \strlen($sKey)) { $sKey = \pack('H*', \md5($sKey)); } $sKey = \str_pad($sKey, $iLen, \chr(0x00)); $sIpad = \str_pad('', $iLen, \chr(0x36)); $sOpad = \str_pad('', $iLen, \chr(0x5c)); return \md5(($sKey ^ $sOpad).\pack('H*', \md5(($sKey ^ $sIpad).$sData))); } /** * @param string $sDomain * @param bool $bSimple = false * * @return bool */ public static function ValidateDomain($sDomain, $bSimple = false) { $aMatch = array(); if ($bSimple) { return \preg_match('/.+(\.[a-zA-Z]+)$/', $sDomain, $aMatch) && !empty($aMatch[1]); } return \preg_match('/.+(\.[a-zA-Z]+)$/', $sDomain, $aMatch) && !empty($aMatch[1]) && \in_array($aMatch[1], \explode(' ', '.academy .actor .agency .audio .bar .beer .bike .blue .boutique .cab .camera .camp .capital .cards .careers .cash .catering .center .cheap .city .cleaning .clinic .clothing .club .coffee .community .company .computer .construction .consulting .contractors .cool .credit .dance .dating .democrat .dental .diamonds .digital .direct .directory .discount .domains .education .email .energy .equipment .estate .events .expert .exposed .fail .farm .fish .fitness .florist .fund .futbol .gallery .gift .glass .graphics .guru .help .holdings .holiday .host .hosting .house .institute .international .kitchen .land .life .lighting .limo .link .management .market .marketing .media .menu .moda .partners .parts .photo .photography .photos .pics .pink .press .productions .pub .red .rentals .repair .report .rest .sexy .shoes .social .solar .solutions .space .support .systems .tattoo .tax .technology .tips .today .tools .town .toys .trade .training .university .uno .vacations .vision .vodka .voyage .watch .webcam .wiki .work .works .wtf .zone .aero .asia .biz .cat .com .coop .edu .gov .info .int .jobs .mil .mobi .museum .name .net .org .pro .tel .travel .xxx .xyz '. '.ac .ad .ae .af .ag .ai .al .am .an .ao .aq .ar .as .at .au .aw .ax .az .ba .bb .bd .be .bf .bg .bh .bi .bj .bm .bn .bo .br .bs .bt .bv .bw .by .bz .ca .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .cr .cs .cu .cv .cx .cy .cz .dd .de .dj .dk .dm .do .dz .ec .ee .eg .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gn .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .io .iq .ir .is .it .je .jm .jo .jp .ke .kg .kh .ki .km .kn .kp .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .me .mg .mh .mk .ml .mm .mn .mo .mp .mq .mr .ms .mt .mu .mv .mw .mx .my .mz .na .nc .ne .nf .ng .ni .nl .no .np .nr .nu .nz .om .pa .pe .pf .pg .ph .pk .pl .pm .pn .pr .ps .pt .pw .py .qa .re .ro .rs .ru . .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .tt .tv .tw .tz .ua .ug .uk .us .uy .uz .va .vc .ve .vg .vi .vn .vu .wf .ws .ye .yt .za .zm .zw' )); } /** * @param string $sIp * * @return bool */ public static function ValidateIP($sIp) { return !empty($sIp) && $sIp === @\filter_var($sIp, FILTER_VALIDATE_IP); } /** * @return \Net_IDNA2 */ private static function idn() { static $oIdn = null; if (null === $oIdn) { include_once MAILSO_LIBRARY_ROOT_PATH.'Vendors/Net/IDNA2.php'; $oIdn = new \Net_IDNA2(); $oIdn->setParams('utf8', true); } return $oIdn; } /** * @param string $sStr * @param bool $bLowerIfAscii = false * * @return string */ public static function IdnToUtf8($sStr, $bLowerIfAscii = false) { if (0 < \strlen($sStr) && \preg_match('/(^|\.|@)xn--/i', $sStr)) { try { $sStr = self::idn()->decode($sStr); } catch (\Exception $oException) {} } return $bLowerIfAscii ? \MailSo\Base\Utils::StrMailDomainToLowerIfAscii($sStr) : $sStr; } /** * @param string $sStr * @param bool $bLowerIfAscii = false * * @return string */ public static function IdnToAscii($sStr, $bLowerIfAscii = false) { $sStr = $bLowerIfAscii ? \MailSo\Base\Utils::StrMailDomainToLowerIfAscii($sStr) : $sStr; $sUser = ''; $sDomain = $sStr; if (false !== \strpos($sStr, '@')) { $sUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sStr); $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($sStr); } if (0 < \strlen($sDomain) && \preg_match('/[^\x20-\x7E]/', $sDomain)) { try { $sDomain = self::idn()->encode($sDomain); } catch (\Exception $oException) {} } return ('' === $sUser ? '' : $sUser.'@').$sDomain; } /** * @param string $sHash * @param string $sSalt * * @return int */ public static function HashToId($sHash, $sSalt = '') { $sData = $sHash ? @\MailSo\Base\Crypt::XxteaDecrypt(\hex2bin($sHash), \md5($sSalt)) : null; $aMatch = array(); if ($sData && preg_match('/^id:(\d+)$/', $sData, $aMatch) && isset($aMatch[1])) { return is_numeric($aMatch[1]) ? (int) $aMatch[1] : null; } return null; } /** * @param int $iID * @param string $sSalt * * @return string */ public static function IdToHash($iID, $sSalt = '') { return is_int($iID) ? \bin2hex(\MailSo\Base\Crypt::XxteaEncrypt('id:'.$iID, \md5($sSalt))) : null ; } /** * @param string $sPassword * * @return bool */ public static function PasswordWeaknessCheck($sPassword) { $sPassword = \trim($sPassword); if (6 > \strlen($sPassword)) { return false; } $sLine = 'password 123.456 12345678 abc123 qwerty monkey letmein dragon 111.111 baseball iloveyou trustno1 1234567 sunshine master 123.123 welcome shadow ashley football jesus michael ninja mustang password1 123456 123456789 qwerty 111111 1234567 666666 12345678 7777777 123321 654321 1234567890 123123 555555 vkontakte gfhjkm 159753 777777 temppassword qazwsx 1q2w3e 1234 112233 121212 qwertyuiop qq18ww899 987654321 12345 zxcvbn zxcvbnm 999999 samsung ghbdtn 1q2w3e4r 1111111 123654 159357 131313 qazwsxedc 123qwe 222222 asdfgh 333333 9379992 asdfghjkl 4815162342 12344321 88888888 11111111 knopka 789456 qwertyu 1q2w3e4r5t iloveyou vfhbyf marina password qweasdzxc 10203 987654 yfnfif cjkysirj nikita 888888 vfrcbv k.,jdm qwertyuiop[] qwe123 qweasd natasha 123123123 fylhtq q1w2e3 stalker 1111111111 q1w2e3r4 nastya 147258369 147258 fyfcnfcbz 1234554321 1qaz2wsx andrey 111222 147852 genius sergey 7654321 232323 123789 fktrcfylh spartak admin test 123 azerty abc123 lol123 easytocrack1 hello saravn holysh!t test123 tundra_cool2 456 dragon thomas killer root 1111 pass master aaaaaa a monkey daniel asdasd e10adc3949ba59abbe56e057f20f883e changeme computer jessica letmein mirage loulou lol superman shadow admin123 secret administrator sophie kikugalanetroot doudou liverpool hallo sunshine charlie parola 100827092 michael andrew password1 fuckyou matrix cjmasterinf internet hallo123 eminem demo gewinner pokemon abcd1234 guest ngockhoa martin sandra asdf hejsan george qweqwe lollipop lovers q1q1q1 tecktonik naruto 12 password12 password123 password1234 password12345 password123456 password1234567 password12345678 password123456789 000000 maximius 123abc baseball1 football1 soccer princess slipknot 11111 nokia super star 666999 12341234 1234321 135790 159951 212121 zzzzzz 121314 134679 142536 19921992 753951 7007 1111114 124578 19951995 258456 qwaszx zaqwsx 55555 77777 54321 qwert 22222 33333 99999 88888 66666'; return false === \strpos($sLine, \strtolower($sPassword)); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Base/Validator.php000066400000000000000000000041121361462701300270120ustar00rootroot00000000000000= $iMin || null === $iMin) && (null !== $iMax && $iNumber <= $iMax || null === $iMax); } /** * @param int $iPort * * @return bool */ public static function PortInt($iPort) { return \MailSo\Base\Validator::RangeInt($iPort, 0, 65535); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Cache/000077500000000000000000000000001361462701300245075ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Cache/CacheClient.php000066400000000000000000000064231361462701300273670ustar00rootroot00000000000000oDriver = null; $this->sCacheIndex = ''; } /** * @return \MailSo\Cache\CacheClient */ public static function NewInstance() { return new self(); } /** * @param string $sKey * @param string $sValue * * @return bool */ public function Set($sKey, $sValue) { return $this->oDriver ? $this->oDriver->Set($sKey.$this->sCacheIndex, $sValue) : false; } /** * @param string $sKey * * @return bool */ public function SetTimer($sKey) { return $this->Set($sKey.'/TIMER', time()); } /** * @param string $sKey * * @return bool */ public function SetLock($sKey) { return $this->Set($sKey.'/LOCK', '1'); } /** * @param string $sKey * * @return bool */ public function RemoveLock($sKey) { return $this->Set($sKey.'/LOCK', '0'); } /** * @param string $sKey * * @return bool */ public function GetLock($sKey) { return '1' === $this->Get($sKey.'/LOCK'); } /** * @param string $sKey * @param string $bClearAfterGet = false * * @return string */ public function Get($sKey, $bClearAfterGet = false) { $sValue = ''; if ($this->oDriver) { $sValue = $this->oDriver->Get($sKey.$this->sCacheIndex); } if ($bClearAfterGet) { $this->Delete($sKey); } return $sValue; } /** * @param string $sKey * * @return int */ public function GetTimer($sKey) { $iTimer = 0; $sValue = $this->Get($sKey.'/TIMER'); if (0 < strlen($sValue) && is_numeric($sValue)) { $iTimer = (int) $sValue; } return $iTimer; } /** * @param string $sKey * * @return \MailSo\Cache\CacheClient */ public function Delete($sKey) { if ($this->oDriver) { $this->oDriver->Delete($sKey.$this->sCacheIndex); } return $this; } /** * @param \MailSo\Cache\DriverInterface $oDriver * * @return \MailSo\Cache\CacheClient */ public function SetDriver(\MailSo\Cache\DriverInterface $oDriver) { $this->oDriver = $oDriver; return $this; } /** * @param int $iTimeToClearInHours = 24 * * @return bool */ public function GC($iTimeToClearInHours = 24) { return $this->oDriver ? $this->oDriver->GC($iTimeToClearInHours) : false; } /** * @return bool */ public function IsInited() { return $this->oDriver instanceof \MailSo\Cache\DriverInterface; } /** * @param string $sCacheIndex * * @return \MailSo\Cache\CacheClient */ public function SetCacheIndex($sCacheIndex) { $this->sCacheIndex = 0 < \strlen($sCacheIndex) ? "\x0".$sCacheIndex : ''; return $this; } /** * @param bool $bCache = false * * @return bool */ public function Verify($bCache = false) { if ($this->oDriver) { $sCacheData = \gmdate('Y-m-d-H'); if ($bCache && $sCacheData === $this->Get('__verify_key__')) { return true; } return $this->Set('__verify_key__', $sCacheData); } return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Cache/DriverInterface.php000066400000000000000000000014011361462701300302700ustar00rootroot00000000000000sKeyPrefix = $sKeyPrefix; if (!empty($this->sKeyPrefix)) { $this->sKeyPrefix = \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; } } /** * @param string $sKeyPrefix = '' * * @return \MailSo\Cache\Drivers\APC */ public static function NewInstance($sKeyPrefix = '') { return new self($sKeyPrefix); } /** * @param string $sKey * @param string $sValue * * @return bool */ public function Set($sKey, $sValue) { return \apc_store($this->generateCachedKey($sKey), (string) $sValue); } /** * @param string $sKey * * @return string */ public function Get($sKey) { $sValue = \apc_fetch($this->generateCachedKey($sKey)); return \is_string($sValue) ? $sValue : ''; } /** * @param string $sKey * * @return void */ public function Delete($sKey) { \apc_delete($this->generateCachedKey($sKey)); } /** * @param int $iTimeToClearInHours = 24 * * @return bool */ public function GC($iTimeToClearInHours = 24) { if (0 === $iTimeToClearInHours) { return \apc_clear_cache('user'); } return false; } /** * @param string $sKey * * @return string */ private function generateCachedKey($sKey) { return $this->sKeyPrefix.\sha1($sKey); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/File.php000066400000000000000000000057201361462701300275210ustar00rootroot00000000000000sCacheFolder = $sCacheFolder; $this->sCacheFolder = rtrim(trim($this->sCacheFolder), '\\/').'/'; $this->sKeyPrefix = $sKeyPrefix; if (!empty($this->sKeyPrefix)) { $this->sKeyPrefix = \str_pad(\preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')), 5, '_'); $this->sKeyPrefix = '__/'. \substr($this->sKeyPrefix, 0, 2).'/'.\substr($this->sKeyPrefix, 2, 2).'/'. $this->sKeyPrefix.'/'; } } /** * @param string $sCacheFolder * @param string $sKeyPrefix = '' * * @return \MailSo\Cache\Drivers\File */ public static function NewInstance($sCacheFolder, $sKeyPrefix = '') { return new self($sCacheFolder, $sKeyPrefix); } /** * @param string $sKey * @param string $sValue * * @return bool */ public function Set($sKey, $sValue) { $sPath = $this->generateCachedFileName($sKey, true); return '' === $sPath ? false : false !== \file_put_contents($sPath, $sValue); } /** * @param string $sKey * * @return string */ public function Get($sKey) { $sValue = ''; $sPath = $this->generateCachedFileName($sKey); if ('' !== $sPath && \file_exists($sPath)) { $sValue = \file_get_contents($sPath); } return \is_string($sValue) ? $sValue : ''; } /** * @param string $sKey * * @return void */ public function Delete($sKey) { $sPath = $this->generateCachedFileName($sKey); if ('' !== $sPath && \file_exists($sPath)) { \unlink($sPath); } } /** * @param int $iTimeToClearInHours = 24 * * @return bool */ public function GC($iTimeToClearInHours = 24) { if (0 < $iTimeToClearInHours) { \MailSo\Base\Utils::RecTimeDirRemove($this->sCacheFolder, 60 * 60 * $iTimeToClearInHours, \time()); return true; } return false; } /** * @param string $sKey * @param bool $bMkDir = false * * @return string */ private function generateCachedFileName($sKey, $bMkDir = false) { $sFilePath = ''; if (3 < \strlen($sKey)) { $sKeyPath = \sha1($sKey); $sKeyPath = \substr($sKeyPath, 0, 2).'/'.\substr($sKeyPath, 2, 2).'/'.$sKeyPath; $sFilePath = $this->sCacheFolder.$this->sKeyPrefix.$sKeyPath; if ($bMkDir && !\is_dir(\dirname($sFilePath))) { if (!@\mkdir(\dirname($sFilePath), 0755, true)) { if (!@\mkdir(\dirname($sFilePath), 0755, true)) { $sFilePath = ''; } } } } return $sFilePath; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/Memcache.php000066400000000000000000000051131361462701300303400ustar00rootroot00000000000000sHost = $sHost; $this->iPost = $iPost; $this->iExpire = 0 < $iExpire ? $iExpire : 43200; $this->oMem = new \Memcache(); if (!$this->oMem->connect($this->sHost, $this->iPost)) { $this->oMem = null; } $this->sKeyPrefix = $sKeyPrefix; if (!empty($this->sKeyPrefix)) { $this->sKeyPrefix = \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; } } /** * @param string $sHost = '127.0.0.1' * @param int $iPost = 11211 * @param int $iExpire = 43200 * @param string $sKeyPrefix = '' * * @return \MailSo\Cache\Drivers\APC */ public static function NewInstance($sHost = '127.0.0.1', $iPost = 11211, $iExpire = 43200, $sKeyPrefix = '') { return new self($sHost, $iPost, $iExpire, $sKeyPrefix); } /** * @param string $sKey * @param string $sValue * * @return bool */ public function Set($sKey, $sValue) { return $this->oMem ? $this->oMem->set($this->generateCachedKey($sKey), $sValue, 0, $this->iExpire) : false; } /** * @param string $sKey * * @return string */ public function Get($sKey) { $sValue = $this->oMem ? $this->oMem->get($this->generateCachedKey($sKey)) : ''; return \is_string($sValue) ? $sValue : ''; } /** * @param string $sKey * * @return void */ public function Delete($sKey) { if ($this->oMem) { $this->oMem->delete($this->generateCachedKey($sKey)); } } /** * @param int $iTimeToClearInHours = 24 * * @return bool */ public function GC($iTimeToClearInHours = 24) { if (0 === $iTimeToClearInHours && $this->oMem) { return $this->oMem->flush(); } return false; } /** * @param string $sKey * * @return string */ private function generateCachedKey($sKey) { return $this->sKeyPrefix.\sha1($sKey); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/Redis.php000066400000000000000000000055041361462701300277100ustar00rootroot00000000000000sHost = $sHost; $this->iPost = $iPost; $this->iExpire = 0 < $iExpire ? $iExpire : 43200; $this->oRedis = null; try { $this->oRedis = new \Predis\Client('unix:' === substr($sHost, 0, 5) ? $sHost : array( 'host' => $sHost, 'port' => $iPost )); $this->oRedis->connect(); if (!$this->oRedis->isConnected()) { $this->oRedis = null; } } catch (\Exception $oExc) { $this->oRedis = null; unset($oExc); } $this->sKeyPrefix = $sKeyPrefix; if (!empty($this->sKeyPrefix)) { $this->sKeyPrefix = \preg_replace('/[^a-zA-Z0-9_]/', '_', rtrim(trim($this->sKeyPrefix), '\\/')).'/'; } } /** * @param string $sHost = '127.0.0.1' * @param int $iPost = 11211 * @param int $iExpire = 43200 * @param string $sKeyPrefix = '' * * @return \MailSo\Cache\Drivers\APC */ public static function NewInstance($sHost = '127.0.0.1', $iPost = 6379, $iExpire = 43200, $sKeyPrefix = '') { return new self($sHost, $iPost, $iExpire, $sKeyPrefix); } /** * @param string $sKey * @param string $sValue * * @return bool */ public function Set($sKey, $sValue) { return $this->oRedis ? $this->oRedis->setex($this->generateCachedKey($sKey), $this->iExpire, $sValue) : false; } /** * @param string $sKey * * @return string */ public function Get($sKey) { $sValue = $this->oRedis ? $this->oRedis->get($this->generateCachedKey($sKey)) : ''; return \is_string($sValue) ? $sValue : ''; } /** * @param string $sKey * * @return void */ public function Delete($sKey) { if ($this->oRedis) { $this->oRedis->del($this->generateCachedKey($sKey)); } } /** * @param int $iTimeToClearInHours = 24 * * @return bool */ public function GC($iTimeToClearInHours = 24) { if (0 === $iTimeToClearInHours && $this->oRedis) { return $this->oRedis->flushdb(); } return false; } /** * @param string $sKey * * @return string */ private function generateCachedKey($sKey) { return $this->sKeyPrefix.\sha1($sKey); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Config.php000066400000000000000000000032551361462701300254270ustar00rootroot00000000000000sContentType = $sContentType; $this->sCharset = $sCharset; $this->aBodyParams = $aBodyParams; $this->sContentID = $sContentID; $this->sDescription = $sDescription; $this->sMailEncodingName = $sMailEncodingName; $this->sDisposition = $sDisposition; $this->aDispositionParams = $aDispositionParams; $this->sFileName = $sFileName; $this->sLanguage = $sLanguage; $this->sLocation = $sLocation; $this->iSize = $iSize; $this->iTextLineCount = $iTextLineCount; $this->sPartID = $sPartID; $this->aSubParts = $aSubParts; } /** * return string */ public function MailEncodingName() { return $this->sMailEncodingName; } /** * return string */ public function PartID() { return (string) $this->sPartID; } /** * return string */ public function FileName() { return $this->sFileName; } /** * return string */ public function ContentType() { return $this->sContentType; } /** * return int */ public function Size() { return (int) $this->iSize; } /** * return int */ public function EstimatedSize() { $fCoefficient = 1; switch (\strtolower($this->MailEncodingName())) { case 'base64': $fCoefficient = 0.75; break; case 'quoted-printable': $fCoefficient = 0.44; break; } return (int) ($this->Size() * $fCoefficient); } /** * return string */ public function Charset() { return $this->sCharset; } /** * return string */ public function ContentID() { return (null === $this->sContentID) ? '' : $this->sContentID; } /** * return string */ public function ContentLocation() { return (null === $this->sLocation) ? '' : $this->sLocation; } /** * return bool */ public function IsInline() { return (null === $this->sDisposition) ? (0 < \strlen($this->ContentID())) : ('inline' === strtolower($this->sDisposition)); } /** * return bool */ public function IsImage() { return 'image' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * return bool */ public function IsArchive() { return 'archive' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * @return bool */ public function IsPdf() { return 'pdf' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * @return bool */ public function IsDoc() { return 'doc' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * @return bool */ public function IsPgpSignature() { return \in_array(\strtolower($this->ContentType()), array('application/pgp-signature', 'application/pkcs7-signature')); } /** * @return bool */ public function IsAttachBodyPart() { $bResult = ( (null !== $this->sDisposition && 'attachment' === \strtolower($this->sDisposition)) ); if (!$bResult && null !== $this->sContentType) { $sContentType = \strtolower($this->sContentType); $bResult = false === \strpos($sContentType, 'multipart/') && 'text/html' !== $sContentType && 'text/plain' !== $sContentType; } return $bResult; } /** * @return bool */ public function IsFlowedFormat() { $bResult = !empty($this->aBodyParams['format']) && 'flowed' === \strtolower(\trim($this->aBodyParams['format'])); if ($bResult && \in_array(\strtolower($this->MailEncodingName()), array('base64', 'quoted-printable'))) { $bResult = false; } return $bResult; } /** * @return array|null */ public function SearchPlainParts() { $aReturn = array(); $aParts = $this->SearchByContentType('text/plain'); foreach ($aParts as $oPart) { if (!$oPart->IsAttachBodyPart()) { $aReturn[] = $oPart; } } return $aReturn; } /** * @return array|null */ public function SearchHtmlParts() { $aReturn = array(); $aParts = $this->SearchByContentType('text/html'); foreach ($aParts as $oPart) { if (!$oPart->IsAttachBodyPart()) { $aReturn[] = $oPart; } } return $aReturn; } /** * @return \MailSo\Imap\BodyStructure|null */ public function SearchInlineEncryptedPart() { if ('multipart/encrypted' === \strtolower($this->ContentType())) { $aSearchParts = $this->SearchByCallback(function ($oItem) { return $oItem->IsInline(); }); if (is_array($aSearchParts) && 1 === \count($aSearchParts) && isset($aSearchParts[0])) { return $aSearchParts[0]; } } return null; } /** * @return array|null */ public function SearchHtmlOrPlainParts() { $mResult = $this->SearchHtmlParts(); if (null === $mResult || (\is_array($mResult) && 0 === count($mResult))) { $mResult = $this->SearchPlainParts(); } if (null === $mResult || (\is_array($mResult) && 0 === count($mResult))) { $oPart = $this->SearchInlineEncryptedPart(); if ($oPart instanceof \MailSo\Imap\BodyStructure) { $mResult = array($oPart); } } return $mResult; } /** * @return string */ public function SearchCharset() { $sResult = ''; $mParts = array(); $mHtmlParts = $this->SearchHtmlParts(); $mPlainParts = $this->SearchPlainParts(); if (\is_array($mHtmlParts) && 0 < \count($mHtmlParts)) { $mParts = \array_merge($mParts, $mHtmlParts); } if (\is_array($mPlainParts) && 0 < \count($mPlainParts)) { $mParts = \array_merge($mParts, $mPlainParts); } foreach ($mParts as $oPart) { $sResult = $oPart ? $oPart->Charset() : ''; if (!empty($sResult)) { break; } } if (0 === strlen($sResult)) { $aParts = $this->SearchAttachmentsParts(); foreach ($aParts as $oPart) { if (0 === \strlen($sResult)) { $sResult = $oPart ? $oPart->Charset() : ''; } else { break; } } } return $sResult; } /** * @param mixed $fCallback * * @return array */ public function SearchByCallback($fCallback) { $aReturn = array(); if (\call_user_func($fCallback, $this)) { $aReturn[] = $this; } if (\is_array($this->aSubParts) && 0 < \count($this->aSubParts)) { foreach ($this->aSubParts as /* @var $oSubPart \MailSo\Imap\BodyStructure */ &$oSubPart) { $aReturn = \array_merge($aReturn, $oSubPart->SearchByCallback($fCallback)); } } return $aReturn; } /** * @return array */ public function SearchAttachmentsParts() { return $this->SearchByCallback(function ($oItem) { return $oItem->IsAttachBodyPart(); }); } /** * @param string $sContentType * * @return array */ public function SearchByContentType($sContentType) { $sContentType = \strtolower($sContentType); return $this->SearchByCallback(function ($oItem) use ($sContentType) { return $sContentType === $oItem->ContentType(); }); } /** * @param string $sMimeIndex * * @return \MailSo\Imap\BodyStructure */ public function GetPartByMimeIndex($sMimeIndex) { $oPart = null; if (0 < \strlen($sMimeIndex)) { if ($sMimeIndex === $this->sPartID) { $oPart = $this; } if (null === $oPart && is_array($this->aSubParts) && 0 < count($this->aSubParts)) { foreach ($this->aSubParts as /* @var $oSubPart \MailSo\Imap\BodyStructure */ &$oSubPart) { $oPart = $oSubPart->GetPartByMimeIndex($sMimeIndex); if (null !== $oPart) { break; } } } } return $oPart; } /** * @param array $aParams * @param string $sParamName * @param string $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8 * * @return string */ private static function decodeAttrParamenter($aParams, $sParamName, $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8) { $sResult = ''; if (isset($aParams[$sParamName])) { $sResult = \MailSo\Base\Utils::DecodeHeaderValue($aParams[$sParamName], $sCharset); } else if (isset($aParams[$sParamName.'*'])) { $aValueParts = \explode("''", $aParams[$sParamName.'*'], 2); if (\is_array($aValueParts) && 2 === \count($aValueParts)) { $sCharset = isset($aValueParts[0]) ? $aValueParts[0] : \MailSo\Base\Enumerations\Charset::UTF_8; $sResult = \MailSo\Base\Utils::ConvertEncoding( \urldecode($aValueParts[1]), $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); } else { $sResult = \urldecode($aParams[$sParamName.'*']); } } else { $sCharset = ''; $sCharsetIndex = -1; $aFileNames = array(); foreach ($aParams as $sName => $sValue) { $aMatches = array(); if (\preg_match('/^'.\preg_quote($sParamName, '/').'\*([0-9]+)\*$/i', $sName, $aMatches)) { $iIndex = (int) $aMatches[1]; if ($sCharsetIndex < $iIndex && false !== \strpos($sValue, "''")) { $aValueParts = \explode("''", $sValue, 2); if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[0])) { $sCharsetIndex = $iIndex; $sCharset = $aValueParts[0]; $sValue = $aValueParts[1]; } } $aFileNames[$iIndex] = $sValue; } } if (0 < \count($aFileNames)) { \ksort($aFileNames, SORT_NUMERIC); $sResult = \implode(\array_values($aFileNames)); $sResult = \urldecode($sResult); if (0 < \strlen($sCharset)) { $sResult = \MailSo\Base\Utils::ConvertEncoding($sResult, $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); } } } return $sResult; } /** * @param array $aBodyStructure * @param string $sPartID = '' * * @return \MailSo\Imap\BodyStructure */ public static function NewInstance(array $aBodyStructure, $sPartID = '') { if (!\is_array($aBodyStructure) || 2 > \count($aBodyStructure)) { return null; } else { $sBodyMainType = null; if (\is_string($aBodyStructure[0]) && 'NIL' !== $aBodyStructure[0]) { $sBodyMainType = $aBodyStructure[0]; } $sBodySubType = null; $sContentType = ''; $aSubParts = null; $aBodyParams = array(); $sName = null; $sCharset = null; $sContentID = null; $sDescription = null; $sMailEncodingName = null; $iSize = 0; $iTextLineCount = 0; // valid for rfc822/message and text parts $iExtraItemPos = 0; // list index of items which have no well-established position (such as 0, 1, 5, etc). if (null === $sBodyMainType) { // Process multipart body structure if (!\is_array($aBodyStructure[0])) { return null; } else { $sBodyMainType = 'multipart'; $sSubPartIDPrefix = ''; if (0 === \strlen($sPartID) || '.' === $sPartID[\strlen($sPartID) - 1]) { // This multi-part is root part of message. $sSubPartIDPrefix = $sPartID; $sPartID .= 'TEXT'; } else if (0 < \strlen($sPartID)) { // This multi-part is a part of another multi-part. $sSubPartIDPrefix = $sPartID.'.'; } $aSubParts = array(); $iIndex = 1; while ($iExtraItemPos < \count($aBodyStructure) && \is_array($aBodyStructure[$iExtraItemPos])) { $oPart = self::NewInstance($aBodyStructure[$iExtraItemPos], $sSubPartIDPrefix.$iIndex); if (null === $oPart) { return null; } else { // For multipart, we have no charset info in the part itself. Thus, // obtain charset from nested parts. if ($sCharset == null) { $sCharset = $oPart->Charset(); } $aSubParts[] = $oPart; $iExtraItemPos++; $iIndex++; } } } if ($iExtraItemPos < \count($aBodyStructure)) { if (!\is_string($aBodyStructure[$iExtraItemPos]) || 'NIL' === $aBodyStructure[$iExtraItemPos]) { return null; } $sBodySubType = \strtolower($aBodyStructure[$iExtraItemPos]); $iExtraItemPos++; } if ($iExtraItemPos < \count($aBodyStructure)) { $sBodyParamList = $aBodyStructure[$iExtraItemPos]; if (\is_array($sBodyParamList)) { $aBodyParams = self::getKeyValueListFromArrayList($sBodyParamList); } } $iExtraItemPos++; } else { // Process simple (singlepart) body structure if (7 > \count($aBodyStructure)) { return null; } $sBodyMainType = \strtolower($sBodyMainType); if (!\is_string($aBodyStructure[1]) || 'NIL' === $aBodyStructure[1]) { return null; } $sBodySubType = \strtolower($aBodyStructure[1]); $aBodyParamList = $aBodyStructure[2]; if (\is_array($aBodyParamList)) { $aBodyParams = self::getKeyValueListFromArrayList($aBodyParamList); if (isset($aBodyParams['charset'])) { $sCharset = $aBodyParams['charset']; } if (\is_array($aBodyParams)) { $sName = self::decodeAttrParamenter($aBodyParams, 'name', $sContentType); } } if (null !== $aBodyStructure[3] && 'NIL' !== $aBodyStructure[3]) { if (!\is_string($aBodyStructure[3])) { return null; } $sContentID = $aBodyStructure[3]; } if (null !== $aBodyStructure[4] && 'NIL' !== $aBodyStructure[4]) { if (!\is_string($aBodyStructure[4])) { return null; } $sDescription = $aBodyStructure[4]; } if (null !== $aBodyStructure[5] && 'NIL' !== $aBodyStructure[5]) { if (!\is_string($aBodyStructure[5])) { return null; } $sMailEncodingName = $aBodyStructure[5]; } if (\is_numeric($aBodyStructure[6])) { $iSize = (int) $aBodyStructure[6]; } else { $iSize = -1; } if (0 === \strlen($sPartID) || '.' === $sPartID[\strlen($sPartID) - 1]) { // This is the only sub-part of the message (otherwise, it would be // one of sub-parts of a multi-part, and partID would already be fully set up). $sPartID .= '1'; } $iExtraItemPos = 7; if ('text' === $sBodyMainType) { if ($iExtraItemPos < \count($aBodyStructure)) { if (\is_numeric($aBodyStructure[$iExtraItemPos])) { $iTextLineCount = (int) $aBodyStructure[$iExtraItemPos]; } else { $iTextLineCount = -1; } } else { $iTextLineCount = -1; } $iExtraItemPos++; } else if ('message' === $sBodyMainType && 'rfc822' === $sBodySubType) { if ($iExtraItemPos + 2 < \count($aBodyStructure)) { if (\is_numeric($aBodyStructure[$iExtraItemPos + 2])) { $iTextLineCount = (int) $aBodyStructure[$iExtraItemPos + 2]; } else { $iTextLineCount = -1; } } else { $iTextLineCount = -1; } $iExtraItemPos += 3; } $iExtraItemPos++; // skip MD5 digest of the body because most mail servers leave it NIL anyway } $sContentType = $sBodyMainType.'/'.$sBodySubType; $sDisposition = null; $aDispositionParams = null; $sFileName = null; if ($iExtraItemPos < \count($aBodyStructure)) { $aDispList = $aBodyStructure[$iExtraItemPos]; if (\is_array($aDispList) && 1 < \count($aDispList)) { if (null !== $aDispList[0]) { if (\is_string($aDispList[0]) && 'NIL' !== $aDispList[0]) { $sDisposition = $aDispList[0]; } else { return null; } } } $aDispParamList = $aDispList[1]; if (\is_array($aDispParamList)) { $aDispositionParams = self::getKeyValueListFromArrayList($aDispParamList); if (\is_array($aDispositionParams)) { $sFileName = self::decodeAttrParamenter($aDispositionParams, 'filename', $sCharset); } } } $iExtraItemPos++; $sLanguage = null; if ($iExtraItemPos < count($aBodyStructure)) { if (null !== $aBodyStructure[$iExtraItemPos] && 'NIL' !== $aBodyStructure[$iExtraItemPos]) { if (\is_array($aBodyStructure[$iExtraItemPos])) { $sLanguage = \implode(',', $aBodyStructure[$iExtraItemPos]); } else if (\is_string($aBodyStructure[$iExtraItemPos])) { $sLanguage = $aBodyStructure[$iExtraItemPos]; } } $iExtraItemPos++; } $sLocation = null; if ($iExtraItemPos < \count($aBodyStructure)) { if (null !== $aBodyStructure[$iExtraItemPos] && 'NIL' !== $aBodyStructure[$iExtraItemPos]) { if (\is_string($aBodyStructure[$iExtraItemPos])) { $sLocation = $aBodyStructure[$iExtraItemPos]; } } $iExtraItemPos++; } return new self( $sContentType, $sCharset, $aBodyParams, $sContentID, $sDescription, $sMailEncodingName, $sDisposition, $aDispositionParams, \MailSo\Base\Utils::Utf8Clear((null === $sFileName || 0 === \strlen($sFileName)) ? $sName : $sFileName), $sLanguage, $sLocation, $iSize, $iTextLineCount, $sPartID, $aSubParts ); } } /** * @param array $aBodyStructure * @param string $sSubPartID * * @return \MailSo\Imap\BodyStructure|null */ public static function NewInstanceFromRfc822SubPart(array $aBodyStructure, $sSubPartID) { $oBody = null; $aBodySubStructure = self::findPartByIndexInArray($aBodyStructure, $sSubPartID); if ($aBodySubStructure && \is_array($aBodySubStructure) && isset($aBodySubStructure[8])) { $oBody = self::NewInstance($aBodySubStructure[8], $sSubPartID); } return $oBody; } /** * @param array $aList * @param string $sPartID * * @return array|null */ private static function findPartByIndexInArray(array $aList, $sPartID) { $bFind = false; $aPath = \explode('.', ''.$sPartID); $aCurrentPart = $aList; foreach ($aPath as $iPos => $iNum) { $iIndex = \intval($iNum) - 1; if (0 <= $iIndex && 0 < $iPos ? isset($aCurrentPart[8][$iIndex]) : isset($aCurrentPart[$iIndex])) { $aCurrentPart = 0 < $iPos ? $aCurrentPart[8][$iIndex] : $aCurrentPart[$iIndex]; $bFind = true; } } return $bFind ? $aCurrentPart : null; } /** * Returns dict with key="charset" and value="US-ASCII" for array ("CHARSET" "US-ASCII"). * Keys are lowercased (StringDictionary itself does this), values are not altered. * * @param array $aList * * @return array */ private static function getKeyValueListFromArrayList(array $aList) { $aDict = null; if (0 === \count($aList) % 2) { $aDict = array(); for ($iIndex = 0, $iLen = \count($aList); $iIndex < $iLen; $iIndex += 2) { if (\is_string($aList[$iIndex]) && isset($aList[$iIndex + 1]) && \is_string($aList[$iIndex + 1])) { $aDict[\strtolower($aList[$iIndex])] = $aList[$iIndex + 1]; } } } return $aDict; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/000077500000000000000000000000001361462701300270435ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php000066400000000000000000000055011361462701300314500ustar00rootroot00000000000000GetLastResponse(); if ($oResponse && $oResponse->IsStatusResponse && !empty($oResponse->HumanReadable) && isset($oResponse->OptionalResponse[0]) && 'ALERT' === $oResponse->OptionalResponse[0]) { $sResult = $oResponse->HumanReadable; } return $sResult; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php000066400000000000000000000021021361462701300326740ustar00rootroot00000000000000aResponses = $aResponses; } } /** * @return array */ public function GetResponses() { return $this->aResponses; } /** * @return \MailSo\Imap\Response|null */ public function GetLastResponse() { return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; } } ResponseNotFoundException.php000066400000000000000000000006041361462701300342770ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ExceptionsoImapResponse = $oImapResponse; $this->aEnvelopeCache = null; } /** * @param \MailSo\Imap\Response $oImapResponse * @return \MailSo\Imap\FetchResponse */ public static function NewInstance($oImapResponse) { return new self($oImapResponse); } /** * @param bool $bForce = false * * @return array|null */ public function GetEnvelope($bForce = false) { if (null === $this->aEnvelopeCache || $bForce) { $this->aEnvelopeCache = $this->GetFetchValue(Enumerations\FetchType::ENVELOPE); } return $this->aEnvelopeCache; } /** * @param int $iIndex * @param mixed $mNullResult = null * * @return mixed */ public function GetFetchEnvelopeValue($iIndex, $mNullResult) { return self::findEnvelopeIndex($this->GetEnvelope(), $iIndex, $mNullResult); } /** * @param int $iIndex * @param string $sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1 * * @return \MailSo\Mime\EmailCollection|null */ public function GetFetchEnvelopeEmailCollection($iIndex, $sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1) { $oResult = null; $aEmails = $this->GetFetchEnvelopeValue($iIndex, null); if (is_array($aEmails) && 0 < count($aEmails)) { $oResult = \MailSo\Mime\EmailCollection::NewInstance(); foreach ($aEmails as $aEmailItem) { if (is_array($aEmailItem) && 4 === count($aEmailItem)) { $sDisplayName = \MailSo\Base\Utils::DecodeHeaderValue( self::findEnvelopeIndex($aEmailItem, 0, ''), $sParentCharset); // $sRemark = \MailSo\Base\Utils::DecodeHeaderValue( // self::findEnvelopeIndex($aEmailItem, 1, ''), $sParentCharset); $sLocalPart = self::findEnvelopeIndex($aEmailItem, 2, ''); $sDomainPart = self::findEnvelopeIndex($aEmailItem, 3, ''); if (0 < strlen($sLocalPart) && 0 < strlen($sDomainPart)) { $oResult->Add( \MailSo\Mime\Email::NewInstance($sLocalPart.'@'.$sDomainPart, $sDisplayName) ); } } } } return $oResult; } /** * @param string $sRfc822SubMimeIndex = '' * * @return \MailSo\Imap\BodyStructure|null */ public function GetFetchBodyStructure($sRfc822SubMimeIndex = '') { $oBodyStructure = null; $aBodyStructureArray = $this->GetFetchValue(Enumerations\FetchType::BODYSTRUCTURE); if (is_array($aBodyStructureArray)) { if (0 < strlen($sRfc822SubMimeIndex)) { $oBodyStructure = BodyStructure::NewInstanceFromRfc822SubPart($aBodyStructureArray, $sRfc822SubMimeIndex); } else { $oBodyStructure = BodyStructure::NewInstance($aBodyStructureArray); } } return $oBodyStructure; } /** * @param string $sFetchItemName * * @return mixed */ public function GetFetchValue($sFetchItemName) { $mReturn = null; $bNextIsValue = false; if (Enumerations\FetchType::INDEX === $sFetchItemName) { $mReturn = $this->oImapResponse->ResponseList[1]; } else if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3])) { foreach ($this->oImapResponse->ResponseList[3] as $mItem) { if ($bNextIsValue) { $mReturn = $mItem; break; } if ($sFetchItemName === $mItem) { $bNextIsValue = true; } } } return $mReturn; } /** * @param string $sRfc822SubMimeIndex = '' * * @return string */ public function GetHeaderFieldsValue($sRfc822SubMimeIndex = '') { $sReturn = ''; $bNextIsValue = false; $sRfc822SubMimeIndex = 0 < \strlen($sRfc822SubMimeIndex) ? ''.$sRfc822SubMimeIndex.'.' : ''; if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3])) { foreach ($this->oImapResponse->ResponseList[3] as $mItem) { if ($bNextIsValue) { $sReturn = (string) $mItem; break; } if (\is_string($mItem) && ( $mItem === 'BODY['.$sRfc822SubMimeIndex.'HEADER]' || 0 === \strpos($mItem, 'BODY['.$sRfc822SubMimeIndex.'HEADER.FIELDS') || $mItem === 'BODY['.$sRfc822SubMimeIndex.'MIME]')) { $bNextIsValue = true; } } } return $sReturn; } private static function findFetchUidAndSize($aList) { $bUid = false; $bSize = false; if (is_array($aList)) { foreach ($aList as $mItem) { if (\MailSo\Imap\Enumerations\FetchType::UID === $mItem) { $bUid = true; } else if (\MailSo\Imap\Enumerations\FetchType::RFC822_SIZE === $mItem) { $bSize = true; } } } return $bUid && $bSize; } /** * @param \MailSo\Imap\Response $oImapResponse * * @return bool */ public static function IsValidFetchImapResponse($oImapResponse) { return ( $oImapResponse && true !== $oImapResponse->IsStatusResponse && \MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && 3 < count($oImapResponse->ResponseList) && 'FETCH' === $oImapResponse->ResponseList[2] && is_array($oImapResponse->ResponseList[3]) ); } /** * @param \MailSo\Imap\Response $oImapResponse * * @return bool */ public static function IsNotEmptyFetchImapResponse($oImapResponse) { return ( $oImapResponse && self::IsValidFetchImapResponse($oImapResponse) && isset($oImapResponse->ResponseList[3]) && self::findFetchUidAndSize($oImapResponse->ResponseList[3]) ); } /** * @param array $aEnvelope * @param int $iIndex * @param mixed $mNullResult = null * * @return mixed */ private static function findEnvelopeIndex($aEnvelope, $iIndex, $mNullResult) { return (isset($aEnvelope[$iIndex]) && 'NIL' !== $aEnvelope[$iIndex] && '' !== $aEnvelope[$iIndex]) ? $aEnvelope[$iIndex] : $mNullResult; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Folder.php000066400000000000000000000067341361462701300263300ustar00rootroot00000000000000sNameRaw = ''; $this->sFullNameRaw = ''; $this->sDelimiter = ''; $this->aFlags = array(); $this->aExtended = array(); $sDelimiter = 'NIL' === \strtoupper($sDelimiter) ? '' : $sDelimiter; if (empty($sDelimiter)) { $sDelimiter = '.'; // default delimiter } if (!\is_array($aFlags) || !\is_string($sDelimiter) || 1 < \strlen($sDelimiter) || !\is_string($sFullNameRaw) || 0 === \strlen($sFullNameRaw)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->sFullNameRaw = $sFullNameRaw; $this->sDelimiter = $sDelimiter; $this->aFlags = $aFlags; $this->aFlagsLowerCase = \array_map('strtolower', $this->aFlags); $this->sFullNameRaw = 'INBOX'.$this->sDelimiter === \substr(\strtoupper($this->sFullNameRaw), 0, 5 + \strlen($this->sDelimiter)) ? 'INBOX'.\substr($this->sFullNameRaw, 5) : $this->sFullNameRaw; if ($this->IsInbox()) { $this->sFullNameRaw = 'INBOX'; } $this->sNameRaw = $this->sFullNameRaw; if (0 < \strlen($this->sDelimiter)) { $aNames = \explode($this->sDelimiter, $this->sFullNameRaw); if (false !== \array_search('', $aNames)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->sNameRaw = \end($aNames); } } /** * @param string $sFullNameRaw * @param string $sDelimiter = '.' * @param array $aFlags = array() * * @return \MailSo\Imap\Folder * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public static function NewInstance($sFullNameRaw, $sDelimiter = '.', $aFlags = array()) { return new self($sFullNameRaw, $sDelimiter, $aFlags); } /** * @return string */ public function NameRaw() { return $this->sNameRaw; } /** * @return string */ public function FullNameRaw() { return $this->sFullNameRaw; } /** * @return string | null */ public function Delimiter() { return $this->sDelimiter; } /** * @return array */ public function Flags() { return $this->aFlags; } /** * @return array */ public function FlagsLowerCase() { return $this->aFlagsLowerCase; } /** * @return bool */ public function IsSelectable() { return !\in_array('\noselect', $this->aFlagsLowerCase); } /** * @return bool */ public function IsInbox() { return 'INBOX' === \strtoupper($this->sFullNameRaw) || \in_array('\inbox', $this->aFlagsLowerCase); } /** * @param string $sName * @param mixed $mData */ public function SetExtended($sName, $mData) { $this->aExtended[$sName] = $mData; } /** * @param string $sName * @return mixed */ public function GetExtended($sName) { return isset($this->aExtended[$sName]) ? $this->aExtended[$sName] : null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/FolderInformation.php000066400000000000000000000033431361462701300305270ustar00rootroot00000000000000FolderName = $sFolderName; $this->IsWritable = $bIsWritable; $this->Exists = null; $this->Recent = null; $this->Flags = array(); $this->PermanentFlags = array(); $this->Unread = null; $this->Uidnext = null; $this->HighestModSeq = null; } /** * @param string $sFolderName * @param bool $bIsWritable * * @return \MailSo\Imap\FolderInformation */ public static function NewInstance($sFolderName, $bIsWritable) { return new self($sFolderName, $bIsWritable); } /** * @param string $sFlag * * @return bool */ public function IsFlagSupported($sFlag) { return \in_array('\\*', $this->PermanentFlags) || \in_array($sFlag, $this->PermanentFlags) || \in_array($sFlag, $this->Flags); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php000066400000000000000000002143371361462701300271420ustar00rootroot00000000000000iTagCount = 0; $this->aCapabilityItems = null; $this->oCurrentFolderInfo = null; $this->aFetchCallbacks = null; $this->iResponseBufParsedPos = 0; $this->aLastResponse = array(); $this->bNeedNext = true; $this->aPartialResponses = array(); $this->aTagTimeouts = array(); $this->bIsLoggined = false; $this->bIsSelected = false; $this->sLogginedUser = ''; $this->__FORCE_SELECT_ON_EXAMINE__ = false; @\ini_set('xdebug.max_nesting_level', 500); } /** * @return \MailSo\Imap\ImapClient */ public static function NewInstance() { return new self(); } /** * @return string */ public function GetLogginedUser() { return $this->sLogginedUser; } /** * @param string $sServerName * @param int $iPort = 143 * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * @param bool $bVerifySsl = false * @param bool $bAllowSelfSigned = true * @param string $sClientCert = '' * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Connect($sServerName, $iPort = 143, $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false, $bAllowSelfSigned = true, $sClientCert = '') { $this->aTagTimeouts['*'] = \microtime(true); parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned, $sClientCert); $this->parseResponseWithValidation('*', true); if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( $this->IsSupported('STARTTLS'), $this->iSecurityType)) { $this->SendRequestWithCheck('STARTTLS'); $this->EnableCrypto(); $this->aCapabilityItems = null; } else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) { $this->writeLogException( new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), \MailSo\Log\Enumerations\Type::ERROR, true); } return $this; } protected function _xor($string, $string2) { $result = ''; $size = strlen($string); for ($i=0; $i<$size; $i++) { $result .= chr(ord($string[$i]) ^ ord($string2[$i])); } return $result; } /** * @param string $sLogin * @param string $sPassword * @param string $sProxyAuthUser = '' * @param bool $bUseAuthPlainIfSupported = true * @param bool $bUseAuthCramMd5IfSupported = true * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Login($sLogin, $sPassword, $sProxyAuthUser = '', $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) { if (!\MailSo\Base\Validator::NotEmptyString($sLogin, true) || !\MailSo\Base\Validator::NotEmptyString($sPassword, true)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); $sPassword = $sPassword; $this->sLogginedUser = $sLogin; try { if ($bUseAuthCramMd5IfSupported && $this->IsSupported('AUTH=CRAM-MD5')) { $this->SendRequest('AUTHENTICATE', array('CRAM-MD5')); $aResponse = $this->parseResponseWithValidation(); if ($aResponse && \is_array($aResponse) && 0 < \count($aResponse) && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $aResponse[\count($aResponse) - 1]->ResponseType) { $oContinuationResponse = null; foreach ($aResponse as $oResponse) { if ($oResponse && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oResponse->ResponseType) { $oContinuationResponse = $oResponse; } } if ($oContinuationResponse && !empty($oContinuationResponse->ResponseList[1])) { $sTicket = @\base64_decode($oContinuationResponse->ResponseList[1]); $this->oLogger->Write('ticket: '.$sTicket); $sToken = \base64_encode($sLogin.' '.\MailSo\Base\Utils::Hmac($sTicket, $sPassword)); if ($this->oLogger) { $this->oLogger->AddSecret($sToken); } $this->sendRaw($sToken, true, '*******'); $this->parseResponseWithValidation(); } else { $this->writeLogException( new \MailSo\Imap\Exceptions\LoginException(), \MailSo\Log\Enumerations\Type::NOTICE, true); } } else { $this->writeLogException( new \MailSo\Imap\Exceptions\LoginException(), \MailSo\Log\Enumerations\Type::NOTICE, true); } } else if ($bUseAuthPlainIfSupported && $this->IsSupported('AUTH=PLAIN')) { $sToken = \base64_encode("\0".$sLogin."\0".$sPassword); if ($this->oLogger) { $this->oLogger->AddSecret($sToken); } if ($this->IsSupported('AUTH=SASL-IR') && false) { $this->SendRequestWithCheck('AUTHENTICATE', array('PLAIN', $sToken)); } else { $this->SendRequest('AUTHENTICATE', array('PLAIN')); $this->parseResponseWithValidation(); $this->sendRaw($sToken, true, '*******'); $this->parseResponseWithValidation(); } } else { if ($this->oLogger) { $this->oLogger->AddSecret($this->EscapeString($sPassword)); } $this->SendRequestWithCheck('LOGIN', array( $this->EscapeString($sLogin), $this->EscapeString($sPassword) )); } // else // { // $this->writeLogException( // new \MailSo\Imap\Exceptions\LoginBadMethodException(), // \MailSo\Log\Enumerations\Type::NOTICE, true); // } if (0 < \strlen($sProxyAuthUser)) { $this->SendRequestWithCheck('PROXYAUTH', array($this->EscapeString($sProxyAuthUser))); } } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Imap\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), '', 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } $this->bIsLoggined = true; $this->aCapabilityItems = null; return $this; } /** * @param string $sXOAuth2Token * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function LoginWithXOauth2($sXOAuth2Token) { if (!\MailSo\Base\Validator::NotEmptyString($sXOAuth2Token, true)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } if (!$this->IsSupported('AUTH=XOAUTH2')) { $this->writeLogException( new \MailSo\Imap\Exceptions\LoginBadMethodException(), \MailSo\Log\Enumerations\Type::NOTICE, true); } try { $this->SendRequest('AUTHENTICATE', array('XOAUTH2', \trim($sXOAuth2Token))); $aR = $this->parseResponseWithValidation(); if (\is_array($aR) && 0 < \count($aR) && isset($aR[\count($aR) - 1])) { $oR = $aR[\count($aR) - 1]; if (\MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oR->ResponseType) { if (!empty($oR->ResponseList[1]) && preg_match('/^[a-zA-Z0-9=+\/]+$/', $oR->ResponseList[1])) { $this->Logger()->Write(\base64_decode($oR->ResponseList[1]), \MailSo\Log\Enumerations\Type::WARNING); } $this->sendRaw(''); $this->parseResponseWithValidation(); } } } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Imap\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), '', 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } $this->bIsLoggined = true; $this->aCapabilityItems = null; return $this; } /** * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Net\Exceptions\Exception */ public function Logout() { if ($this->bIsLoggined) { $this->bIsLoggined = false; $this->SendRequestWithCheck('LOGOUT', array()); } return $this; } /** * @return \MailSo\Imap\ImapClient */ public function ForceCloseConnection() { $this->Disconnect(); return $this; } /** * @return bool */ public function IsLoggined() { return $this->IsConnected() && $this->bIsLoggined; } /** * @return bool */ public function IsSelected() { return $this->IsLoggined() && $this->bIsSelected; } /** * @return array|null * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Capability() { $this->SendRequestWithCheck('CAPABILITY', array(), true); return $this->aCapabilityItems; } /** * @param string $sExtentionName * @return bool * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function IsSupported($sExtentionName) { $bResult = \MailSo\Base\Validator::NotEmptyString($sExtentionName, true); if ($bResult && null === $this->aCapabilityItems) { $this->aCapabilityItems = $this->Capability(); } return $bResult && \is_array($this->aCapabilityItems) && \in_array(\strtoupper($sExtentionName), $this->aCapabilityItems); } /** * @return \MailSo\Imap\NamespaceResult|null * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function GetNamespace() { if (!$this->IsSupported('NAMESPACE')) { return null; } $oReturn = false; $this->SendRequest('NAMESPACE'); $aResult = $this->parseResponseWithValidation(); $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && 'NAMESPACE' === $oImapResponse->StatusOrIndex) { $oReturn = NamespaceResult::NewInstance(); $oReturn->InitByImapResponse($oImapResponse); break; } } if (false === $oReturn) { $this->writeLogException( new \MailSo\Imap\Exceptions\ResponseException(), \MailSo\Log\Enumerations\Type::ERROR, true); } return $oReturn; } /** * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Noop() { return $this->SendRequestWithCheck('NOOP'); } /** * @param string $sFolderName * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderCreate($sFolderName) { return $this->SendRequestWithCheck('CREATE', array($this->EscapeString($sFolderName))); } /** * @param string $sFolderName * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderDelete($sFolderName) { return $this->SendRequestWithCheck('DELETE', array($this->EscapeString($sFolderName))); } /** * @param string $sFolderName * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderSubscribe($sFolderName) { return $this->SendRequestWithCheck('SUBSCRIBE', array($this->EscapeString($sFolderName))); } /** * @param string $sFolderName * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderUnSubscribe($sFolderName) { return $this->SendRequestWithCheck('UNSUBSCRIBE', array($this->EscapeString($sFolderName))); } /** * @param string $sOldFolderName * @param string $sNewFolderName * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderRename($sOldFolderName, $sNewFolderName) { return $this->SendRequestWithCheck('RENAME', array( $this->EscapeString($sOldFolderName), $this->EscapeString($sNewFolderName))); } /** * @param array $aResult * * @return array */ protected function getStatusFolderInformation($aResult) { $aReturn = array(); if (\is_array($aResult)) { $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && 'STATUS' === $oImapResponse->StatusOrIndex && isset($oImapResponse->ResponseList[3]) && \is_array($oImapResponse->ResponseList[3])) { $sName = null; foreach ($oImapResponse->ResponseList[3] as $sArrayItem) { if (null === $sName) { $sName = $sArrayItem; } else { $aReturn[$sName] = $sArrayItem; $sName = null; } } } } } return $aReturn; } /** * @param string $sFolderName * @param array $aStatusItems * * @return array|bool * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderStatus($sFolderName, array $aStatusItems) { $aResult = false; if (\count($aStatusItems) > 0) { $this->SendRequest('STATUS', array($this->EscapeString($sFolderName), $aStatusItems)); $aResult = $this->getStatusFolderInformation( $this->parseResponseWithValidation()); } return $aResult; } /** * @param array $aResult * @param string $sStatus * @param bool $bUseListStatus = false * * @return array */ private function getFoldersFromResult(array $aResult, $sStatus, $bUseListStatus = false) { $aReturn = array(); $sDelimiter = ''; $bInbox = false; $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && $sStatus === $oImapResponse->StatusOrIndex && 5 === count($oImapResponse->ResponseList)) { try { $oFolder = Folder::NewInstance($oImapResponse->ResponseList[4], $oImapResponse->ResponseList[3], $oImapResponse->ResponseList[2]); if ($oFolder->IsInbox()) { $bInbox = true; } if (empty($sDelimiter)) { $sDelimiter = $oFolder->Delimiter(); } $aReturn[] = $oFolder; } catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) { $this->writeLogException($oException, \MailSo\Log\Enumerations\Type::WARNING, false); } } } if (!$bInbox && !empty($sDelimiter)) { $aReturn[] = Folder::NewInstance('INBOX', $sDelimiter); } if ($bUseListStatus) { foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && 'STATUS' === $oImapResponse->StatusOrIndex && isset($oImapResponse->ResponseList[2]) && isset($oImapResponse->ResponseList[3]) && \is_array($oImapResponse->ResponseList[3])) { $sFolderNameRaw = $oImapResponse->ResponseList[2]; $oCurrentFolder = null; foreach ($aReturn as &$oFolder) { if ($oFolder && $sFolderNameRaw === $oFolder->FullNameRaw()) { $oCurrentFolder =& $oFolder; break; } } if (null !== $oCurrentFolder) { $sName = null; $aStatus = array(); foreach ($oImapResponse->ResponseList[3] as $sArrayItem) { if (null === $sName) { $sName = $sArrayItem; } else { $aStatus[$sName] = $sArrayItem; $sName = null; } } if (0 < count($aStatus)) { $oCurrentFolder->SetExtended('STATUS', $aStatus); } } unset($oCurrentFolder); } } } return $aReturn; } /** * @param bool $bIsSubscribeList * @param string $sParentFolderName = '' * @param string $sListPattern = '*' * @param bool $bUseListStatus = false * * @return array * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ private function specificFolderList($bIsSubscribeList, $sParentFolderName = '', $sListPattern = '*', $bUseListStatus = false) { $sCmd = 'LSUB'; if (!$bIsSubscribeList) { $sCmd = 'LIST'; } $sListPattern = 0 === strlen(trim($sListPattern)) ? '*' : $sListPattern; $aParameters = array( $this->EscapeString($sParentFolderName), $this->EscapeString($sListPattern) ); if ($bUseListStatus && !$bIsSubscribeList && $this->IsSupported('LIST-STATUS')) { $aL = array( \MailSo\Imap\Enumerations\FolderStatus::MESSAGES, \MailSo\Imap\Enumerations\FolderStatus::UNSEEN, \MailSo\Imap\Enumerations\FolderStatus::UIDNEXT ); // if ($this->IsSupported('CONDSTORE')) // { // $aL[] = \MailSo\Imap\Enumerations\FolderStatus::HIGHESTMODSEQ; // } $aParameters[] = 'RETURN'; $aParameters[] = array('STATUS', $aL); } else { $bUseListStatus = false; } $this->SendRequest($sCmd, $aParameters); return $this->getFoldersFromResult( $this->parseResponseWithValidation(), $sCmd, $bUseListStatus); } /** * @param string $sParentFolderName = '' * @param string $sListPattern = '*' * * @return array * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderList($sParentFolderName = '', $sListPattern = '*') { return $this->specificFolderList(false, $sParentFolderName, $sListPattern); } /** * @param string $sParentFolderName = '' * @param string $sListPattern = '*' * * @return array * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderSubscribeList($sParentFolderName = '', $sListPattern = '*') { return $this->specificFolderList(true, $sParentFolderName, $sListPattern); } /** * @param string $sParentFolderName = '' * @param string $sListPattern = '*' * * @return array * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderStatusList($sParentFolderName = '', $sListPattern = '*') { return $this->specificFolderList(false, $sParentFolderName, $sListPattern, true); } /** * @param array $aResult * @param string $sFolderName * @param bool $bIsWritable * * @return void */ protected function initCurrentFolderInformation($aResult, $sFolderName, $bIsWritable) { if (\is_array($aResult)) { $oImapResponse = null; $oResult = FolderInformation::NewInstance($sFolderName, $bIsWritable); foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType) { if (\count($oImapResponse->ResponseList) > 2 && 'FLAGS' === $oImapResponse->ResponseList[1] && \is_array($oImapResponse->ResponseList[2])) { $oResult->Flags = $oImapResponse->ResponseList[2]; } if (is_array($oImapResponse->OptionalResponse) && \count($oImapResponse->OptionalResponse) > 1) { if ('PERMANENTFLAGS' === $oImapResponse->OptionalResponse[0] && is_array($oImapResponse->OptionalResponse[1])) { $oResult->PermanentFlags = $oImapResponse->OptionalResponse[1]; } else if ('UIDVALIDITY' === $oImapResponse->OptionalResponse[0] && isset($oImapResponse->OptionalResponse[1])) { $oResult->Uidvalidity = $oImapResponse->OptionalResponse[1]; } else if ('UNSEEN' === $oImapResponse->OptionalResponse[0] && isset($oImapResponse->OptionalResponse[1]) && is_numeric($oImapResponse->OptionalResponse[1])) { $oResult->Unread = (int) $oImapResponse->OptionalResponse[1]; } else if ('UIDNEXT' === $oImapResponse->OptionalResponse[0] && isset($oImapResponse->OptionalResponse[1])) { $oResult->Uidnext = $oImapResponse->OptionalResponse[1]; } else if ('HIGHESTMODSEQ' === $oImapResponse->OptionalResponse[0] && isset($oImapResponse->OptionalResponse[1]) && \is_numeric($oImapResponse->OptionalResponse[1])) { $oResult->HighestModSeq = \trim($oImapResponse->OptionalResponse[1]); } } if (\count($oImapResponse->ResponseList) > 2 && \is_string($oImapResponse->ResponseList[2]) && \is_numeric($oImapResponse->ResponseList[1])) { switch($oImapResponse->ResponseList[2]) { case 'EXISTS': $oResult->Exists = (int) $oImapResponse->ResponseList[1]; break; case 'RECENT': $oResult->Recent = (int) $oImapResponse->ResponseList[1]; break; } } } } $this->oCurrentFolderInfo = $oResult; } } /** * @param string $sFolderName * @param bool $bIsWritable * @param bool $bReSelectSameFolders * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ protected function selectOrExamineFolder($sFolderName, $bIsWritable, $bReSelectSameFolders) { if (!$bReSelectSameFolders) { if ($this->oCurrentFolderInfo && $sFolderName === $this->oCurrentFolderInfo->FolderName && $bIsWritable === $this->oCurrentFolderInfo->IsWritable) { return $this; } } if (!\MailSo\Base\Validator::NotEmptyString($sFolderName, true)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->SendRequest(($bIsWritable) ? 'SELECT' : 'EXAMINE', array($this->EscapeString($sFolderName))); $this->initCurrentFolderInformation( $this->parseResponseWithValidation(), $sFolderName, $bIsWritable); $this->bIsSelected = true; return $this; } /** * @param string $sFolderName * @param bool $bReSelectSameFolders = false * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderSelect($sFolderName, $bReSelectSameFolders = false) { return $this->selectOrExamineFolder($sFolderName, true, $bReSelectSameFolders); } /** * @param string $sFolderName * @param bool $bReSelectSameFolders = false * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderExamine($sFolderName, $bReSelectSameFolders = false) { return $this->selectOrExamineFolder($sFolderName, $this->__FORCE_SELECT_ON_EXAMINE__, $bReSelectSameFolders); } /** * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderUnSelect() { if ($this->IsSelected() && $this->IsSupported('UNSELECT')) { $this->SendRequestWithCheck('UNSELECT'); $this->bIsSelected = false; } return $this; } /** * @param array $aInputFetchItems * @param string $sIndexRange * @param bool $bIndexIsUid * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Fetch(array $aInputFetchItems, $sIndexRange, $bIndexIsUid) { $sIndexRange = (string) $sIndexRange; if (!\MailSo\Base\Validator::NotEmptyString($sIndexRange, true)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $aFetchItems = \MailSo\Imap\Enumerations\FetchType::ChangeFetchItemsBefourRequest($aInputFetchItems); foreach ($aFetchItems as $sName => $mItem) { if (0 < \strlen($sName) && '' !== $mItem) { if (null === $this->aFetchCallbacks) { $this->aFetchCallbacks = array(); } $this->aFetchCallbacks[$sName] = $mItem; } } $this->SendRequest((($bIndexIsUid) ? 'UID ' : '').'FETCH', array($sIndexRange, \array_keys($aFetchItems))); $aResult = $this->validateResponse($this->parseResponse()); $this->aFetchCallbacks = null; $aReturn = array(); $oImapResponse = null; foreach ($aResult as $oImapResponse) { if (FetchResponse::IsValidFetchImapResponse($oImapResponse)) { if (FetchResponse::IsNotEmptyFetchImapResponse($oImapResponse)) { $aReturn[] = FetchResponse::NewInstance($oImapResponse); } else { if ($this->oLogger) { $this->oLogger->Write('Skipped Imap Response! ['.$oImapResponse->ToLine().']', \MailSo\Log\Enumerations\Type::NOTICE); } } } } return $aReturn; } /** * @return array|false * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Quota() { $aReturn = false; if ($this->IsSupported('QUOTA')) { $this->SendRequest('GETQUOTAROOT "INBOX"'); $aResult = $this->parseResponseWithValidation(); $aReturn = array(0, 0); $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && 'QUOTA' === $oImapResponse->StatusOrIndex && \is_array($oImapResponse->ResponseList) && isset($oImapResponse->ResponseList[3]) && \is_array($oImapResponse->ResponseList[3]) && 2 < \count($oImapResponse->ResponseList[3]) && 'STORAGE' === \strtoupper($oImapResponse->ResponseList[3][0]) && \is_numeric($oImapResponse->ResponseList[3][1]) && \is_numeric($oImapResponse->ResponseList[3][2]) ) { $aReturn = array( (int) $oImapResponse->ResponseList[3][1], (int) $oImapResponse->ResponseList[3][2], 0, 0 ); if (5 < \count($oImapResponse->ResponseList[3]) && 'MESSAGE' === \strtoupper($oImapResponse->ResponseList[3][3]) && \is_numeric($oImapResponse->ResponseList[3][4]) && \is_numeric($oImapResponse->ResponseList[3][5]) ) { $aReturn[2] = (int) $oImapResponse->ResponseList[3][4]; $aReturn[3] = (int) $oImapResponse->ResponseList[3][5]; } } } } return $aReturn; } /** * @param array $aSortTypes * @param string $sSearchCriterias * @param bool $bReturnUid * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSimpleSort($aSortTypes, $sSearchCriterias = 'ALL', $bReturnUid = true) { $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; $sSearchCriterias = !\MailSo\Base\Validator::NotEmptyString($sSearchCriterias, true) || '*' === $sSearchCriterias ? 'ALL' : $sSearchCriterias; if (!\is_array($aSortTypes) || 0 === \count($aSortTypes)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } else if (!$this->IsSupported('SORT')) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $aRequest = array(); $aRequest[] = $aSortTypes; $aRequest[] = \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? 'US-ASCII' : 'UTF-8'; $aRequest[] = $sSearchCriterias; $sCmd = 'SORT'; $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); $aResult = $this->parseResponseWithValidation(); $aReturn = array(); $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && ($sCmd === $oImapResponse->StatusOrIndex || ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && $sCmd === $oImapResponse->ResponseList[2]) && \is_array($oImapResponse->ResponseList) && 2 < \count($oImapResponse->ResponseList)) { $iStart = 2; if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && !empty($oImapResponse->ResponseList[2]) && $sCmd === $oImapResponse->ResponseList[2]) { $iStart = 3; } for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) { $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; } } } return $aReturn; } /** * @param bool $bSort = false * @param string $sSearchCriterias = 'ALL' * @param array $aSearchOrSortReturn = null * @param bool $bReturnUid = true * @param string $sLimit = '' * @param string $sCharset = '' * @param array $aSortTypes = null * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ private function simpleESearchOrESortHelper($bSort = false, $sSearchCriterias = 'ALL', $aSearchOrSortReturn = null, $bReturnUid = true, $sLimit = '', $sCharset = '', $aSortTypes = null) { $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; $sSearchCriterias = 0 === \strlen($sSearchCriterias) || '*' === $sSearchCriterias ? 'ALL' : $sSearchCriterias; $sCmd = $bSort ? 'SORT': 'SEARCH'; if ($bSort && (!\is_array($aSortTypes) || 0 === \count($aSortTypes) || !$this->IsSupported('SORT'))) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } if (!$this->IsSupported($bSort ? 'ESORT' : 'ESEARCH')) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } if (!\is_array($aSearchOrSortReturn) || 0 === \count($aSearchOrSortReturn)) { $aSearchOrSortReturn = array('ALL'); } $aRequest = array(); if ($bSort) { $aRequest[] = 'RETURN'; $aRequest[] = $aSearchOrSortReturn; $aRequest[] = $aSortTypes; $aRequest[] = \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? 'US-ASCII' : 'UTF-8'; } else { if (0 < \strlen($sCharset)) { $aRequest[] = 'CHARSET'; $aRequest[] = \strtoupper($sCharset); } $aRequest[] = 'RETURN'; $aRequest[] = $aSearchOrSortReturn; } $aRequest[] = $sSearchCriterias; if (0 < \strlen($sLimit)) { $aRequest[] = $sLimit; } $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); $sRequestTag = $this->getCurrentTag(); $aResult = array(); $aResponse = $this->parseResponseWithValidation(); if (\is_array($aResponse)) { $oImapResponse = null; foreach ($aResponse as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && ('ESEARCH' === $oImapResponse->StatusOrIndex || 'ESORT' === $oImapResponse->StatusOrIndex) && \is_array($oImapResponse->ResponseList) && isset($oImapResponse->ResponseList[2], $oImapResponse->ResponseList[2][0], $oImapResponse->ResponseList[2][1]) && 'TAG' === $oImapResponse->ResponseList[2][0] && $sRequestTag === $oImapResponse->ResponseList[2][1] && (!$bReturnUid || ($bReturnUid && !empty($oImapResponse->ResponseList[3]) && 'UID' === $oImapResponse->ResponseList[3])) ) { $iStart = 3; foreach ($oImapResponse->ResponseList as $iIndex => $mItem) { if ($iIndex >= $iStart) { switch ($mItem) { case 'ALL': case 'MAX': case 'MIN': case 'COUNT': if (isset($oImapResponse->ResponseList[$iIndex + 1])) { $aResult[$mItem] = $oImapResponse->ResponseList[$iIndex + 1]; } break; } } } } } } return $aResult; } /** * @param string $sSearchCriterias = 'ALL' * @param array $aSearchReturn = null * @param bool $bReturnUid = true * @param string $sLimit = '' * @param string $sCharset = '' * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSimpleESearch($sSearchCriterias = 'ALL', $aSearchReturn = null, $bReturnUid = true, $sLimit = '', $sCharset = '') { return $this->simpleESearchOrESortHelper(false, $sSearchCriterias, $aSearchReturn, $bReturnUid, $sLimit, $sCharset); } /** * @param array $aSortTypes * @param string $sSearchCriterias = 'ALL' * @param array $aSearchReturn = null * @param bool $bReturnUid = true * @param string $sLimit = '' * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSimpleESort($aSortTypes, $sSearchCriterias = 'ALL', $aSearchReturn = null, $bReturnUid = true, $sLimit = '') { return $this->simpleESearchOrESortHelper(true, $sSearchCriterias, $aSearchReturn, $bReturnUid, $sLimit, '', $aSortTypes); } /** * @param array $aResult * @return \MailSo\Imap\Response */ private function findLastResponse($aResult) { $oResult = null; if (\is_array($aResult) && 0 < \count($aResult)) { $oResult = $aResult[\count($aResult) - 1]; if (!($oResult instanceof \MailSo\Imap\Response)) { $oResult = null; } } return $oResult; } /** * @param string $sSearchCriterias * @param bool $bReturnUid = true * @param string $sCharset = '' * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSimpleSearch($sSearchCriterias = 'ALL', $bReturnUid = true, $sCharset = '') { $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; $sSearchCriterias = 0 === \strlen($sSearchCriterias) || '*' === $sSearchCriterias ? 'ALL' : $sSearchCriterias; $aRequest = array(); if (0 < \strlen($sCharset)) { $aRequest[] = 'CHARSET'; $aRequest[] = \strtoupper($sCharset); } $aRequest[] = $sSearchCriterias; $sCmd = 'SEARCH'; $sCont = $this->SendRequest($sCommandPrefix.$sCmd, $aRequest, true); if ('' !== $sCont) { $aResult = $this->parseResponseWithValidation(); $oItem = $this->findLastResponse($aResult); if ($oItem && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oItem->ResponseType) { $aParts = explode("\r\n", $sCont); foreach ($aParts as $sLine) { $this->sendRaw($sLine); $aResult = $this->parseResponseWithValidation(); $oItem = $this->findLastResponse($aResult); if ($oItem && \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oItem->ResponseType) { continue; } } } } else { $aResult = $this->parseResponseWithValidation(); } $aReturn = array(); $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && ($sCmd === $oImapResponse->StatusOrIndex || ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && $sCmd === $oImapResponse->ResponseList[2]) && \is_array($oImapResponse->ResponseList) && 2 < count($oImapResponse->ResponseList)) { $iStart = 2; if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && !empty($oImapResponse->ResponseList[2]) && $sCmd === $oImapResponse->ResponseList[2]) { $iStart = 3; } for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) { $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; } } } $aReturn = \array_reverse($aReturn); return $aReturn; } /** * @param mixed $aValue * * @return mixed */ private function validateThreadItem($aValue) { $mResult = false; if (\is_numeric($aValue)) { $mResult = (int) $aValue; if (0 >= $mResult) { $mResult = false; } } else if (\is_array($aValue)) { if (1 === \count($aValue) && \is_numeric($aValue[0])) { $mResult = (int) $aValue[0]; if (0 >= $mResult) { $mResult = false; } } else { $mResult = array(); foreach ($aValue as $aValueItem) { $mTemp = $this->validateThreadItem($aValueItem); if (false !== $mTemp) { $mResult[] = $mTemp; } } } } return $mResult; } /** * @param string $sSearchCriterias = 'ALL' * @param bool $bReturnUid = true * @param string $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8 * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSimpleThread($sSearchCriterias = 'ALL', $bReturnUid = true, $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8) { $sCommandPrefix = ($bReturnUid) ? 'UID ' : ''; $sSearchCriterias = !\MailSo\Base\Validator::NotEmptyString($sSearchCriterias, true) || '*' === $sSearchCriterias ? 'ALL' : $sSearchCriterias; $sThreadType = ''; switch (true) { case $this->IsSupported('THREAD=REFS'): $sThreadType = 'REFS'; break; case $this->IsSupported('THREAD=REFERENCES'): $sThreadType = 'REFERENCES'; break; case $this->IsSupported('THREAD=ORDEREDSUBJECT'): $sThreadType = 'ORDEREDSUBJECT'; break; default: $this->writeLogException( new Exceptions\RuntimeException('Thread is not supported'), \MailSo\Log\Enumerations\Type::ERROR, true); break; } $aRequest = array(); $aRequest[] = $sThreadType; $aRequest[] = \strtoupper($sCharset); $aRequest[] = $sSearchCriterias; $sCmd = 'THREAD'; $this->SendRequest($sCommandPrefix.$sCmd, $aRequest); $aResult = $this->parseResponseWithValidation(); $aReturn = array(); $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && ($sCmd === $oImapResponse->StatusOrIndex || ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && $sCmd === $oImapResponse->ResponseList[2]) && \is_array($oImapResponse->ResponseList) && 2 < \count($oImapResponse->ResponseList)) { $iStart = 2; if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && !empty($oImapResponse->ResponseList[2]) && $sCmd === $oImapResponse->ResponseList[2]) { $iStart = 3; } for ($iIndex = $iStart, $iLen = \count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) { $aNewValue = $this->validateThreadItem($oImapResponse->ResponseList[$iIndex]); if (false !== $aNewValue) { $aReturn[] = $aNewValue; } } } } return $aReturn; } /** * @param string $sToFolder * @param string $sIndexRange * @param bool $bIndexIsUid * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageCopy($sToFolder, $sIndexRange, $bIndexIsUid) { if (0 === \strlen($sIndexRange)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $sCommandPrefix = ($bIndexIsUid) ? 'UID ' : ''; return $this->SendRequestWithCheck($sCommandPrefix.'COPY', array($sIndexRange, $this->EscapeString($sToFolder))); } /** * @param string $sToFolder * @param string $sIndexRange * @param bool $bIndexIsUid * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageMove($sToFolder, $sIndexRange, $bIndexIsUid) { if (0 === \strlen($sIndexRange)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } if (!$this->IsSupported('MOVE')) { $this->writeLogException( new Exceptions\RuntimeException('Move is not supported'), \MailSo\Log\Enumerations\Type::ERROR, true); } $sCommandPrefix = ($bIndexIsUid) ? 'UID ' : ''; return $this->SendRequestWithCheck($sCommandPrefix.'MOVE', array($sIndexRange, $this->EscapeString($sToFolder))); } /** * @param string $sUidRangeIfSupported = '' * @param bool $bForceUidExpunge = false * @param bool $bExpungeAll = false * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageExpunge($sUidRangeIfSupported = '', $bForceUidExpunge = false, $bExpungeAll = false) { $sUidRangeIfSupported = \trim($sUidRangeIfSupported); $sCmd = 'EXPUNGE'; $aArguments = array(); if (!$bExpungeAll && $bForceUidExpunge && 0 < \strlen($sUidRangeIfSupported) && $this->IsSupported('UIDPLUS')) { $sCmd = 'UID '.$sCmd; $aArguments = array($sUidRangeIfSupported); } return $this->SendRequestWithCheck($sCmd, $aArguments); } /** * @param string $sIndexRange * @param bool $bIndexIsUid * @param array $aInputStoreItems * @param string $sStoreAction * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageStoreFlag($sIndexRange, $bIndexIsUid, $aInputStoreItems, $sStoreAction) { if (!\MailSo\Base\Validator::NotEmptyString($sIndexRange, true) || !\MailSo\Base\Validator::NotEmptyString($sStoreAction, true) || 0 === \count($aInputStoreItems)) { return false; } $sCmd = ($bIndexIsUid) ? 'UID STORE' : 'STORE'; return $this->SendRequestWithCheck($sCmd, array($sIndexRange, $sStoreAction, $aInputStoreItems)); } /** * @param string $sFolderName * @param resource $rMessageAppendStream * @param int $iStreamSize * @param array $aAppendFlags = null * @param int $iUid = null * @param int $sDateTime = 0 * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageAppendStream($sFolderName, $rMessageAppendStream, $iStreamSize, $aAppendFlags = null, &$iUid = null, $sDateTime = 0) { $aData = array($this->EscapeString($sFolderName), $aAppendFlags); if (0 < $sDateTime) { $aData[] = $this->EscapeString(\gmdate('d-M-Y H:i:s', $sDateTime).' +0000'); } $aData[] = '{'.$iStreamSize.'}'; $this->SendRequest('APPEND', $aData); $this->parseResponseWithValidation(); $this->writeLog('Write to connection stream', \MailSo\Log\Enumerations\Type::NOTE); \MailSo\Base\Utils::MultipleStreamWriter($rMessageAppendStream, array($this->rConnect)); $this->sendRaw(''); $this->parseResponseWithValidation(); if (null !== $iUid) { $aLastResponse = $this->GetLastResponse(); if (\is_array($aLastResponse) && 0 < \count($aLastResponse) && $aLastResponse[\count($aLastResponse) - 1]) { $oLast = $aLastResponse[count($aLastResponse) - 1]; if ($oLast && \MailSo\Imap\Enumerations\ResponseType::TAGGED === $oLast->ResponseType && \is_array($oLast->OptionalResponse)) { if (0 < \strlen($oLast->OptionalResponse[0]) && 0 < \strlen($oLast->OptionalResponse[2]) && 'APPENDUID' === strtoupper($oLast->OptionalResponse[0]) && \is_numeric($oLast->OptionalResponse[2]) ) { $iUid = (int) $oLast->OptionalResponse[2]; } } } } return $this; } /** * @return \MailSo\Imap\FolderInformation */ public function FolderCurrentInformation() { return $this->oCurrentFolderInfo; } /** * @param string $sCommand * @param array $aParams = array() * @param bool $bBreakOnLiteral = false * * @return string * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception */ public function SendRequest($sCommand, $aParams = array(), $bBreakOnLiteral = false) { if (!\MailSo\Base\Validator::NotEmptyString($sCommand, true) || !\is_array($aParams)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->IsConnected(true); $sTag = $this->getNewTag(); $sCommand = \trim($sCommand); $sRealCommand = $sTag.' '.$sCommand.$this->prepearParamLine($aParams); $sFakeCommand = ''; $aFakeParams = $this->secureRequestParams($sCommand, $aParams); if (null !== $aFakeParams) { $sFakeCommand = $sTag.' '.$sCommand.$this->prepearParamLine($aFakeParams); } $this->aTagTimeouts[$sTag] = \microtime(true); if ($bBreakOnLiteral && !\preg_match('/\d\+\}\r\n/', $sRealCommand)) { $iPos = \strpos($sRealCommand, "}\r\n"); if (false !== $iPos) { $iFakePos = \strpos($sFakeCommand, "}\r\n"); $this->sendRaw(\substr($sRealCommand, 0, $iPos + 1), true, false !== $iFakePos ? \substr($sFakeCommand, 0, $iFakePos + 3) : ''); return \substr($sRealCommand, $iPos + 3); } } $this->sendRaw($sRealCommand, true, $sFakeCommand); return ''; } /** * @param string $sCommand * @param array $aParams * * @return array|null */ private function secureRequestParams($sCommand, $aParams) { $aResult = null; switch ($sCommand) { case 'LOGIN': $aResult = $aParams; if (\is_array($aResult) && 2 === count($aResult)) { $aResult[1] = '"********"'; } break; } return $aResult; } /** * @param string $sCommand * @param array $aParams = array() * @param bool $bFindCapa = false * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function SendRequestWithCheck($sCommand, $aParams = array(), $bFindCapa = false) { $this->SendRequest($sCommand, $aParams); $this->parseResponseWithValidation(null, $bFindCapa); return $this; } /** * @return array */ public function GetLastResponse() { return $this->aLastResponse; } /** * @param mixed $aResult * * @return array * * @throws \MailSo\Imap\Exceptions\ResponseNotFoundException * @throws \MailSo\Imap\Exceptions\InvalidResponseException * @throws \MailSo\Imap\Exceptions\NegativeResponseException */ private function validateResponse($aResult) { if (!\is_array($aResult) || 0 === $iCnt = \count($aResult)) { $this->writeLogException( new Exceptions\ResponseNotFoundException(), \MailSo\Log\Enumerations\Type::WARNING, true); } if ($aResult[$iCnt - 1]->ResponseType !== \MailSo\Imap\Enumerations\ResponseType::CONTINUATION) { if (!$aResult[$iCnt - 1]->IsStatusResponse) { $this->writeLogException( new Exceptions\InvalidResponseException($aResult), \MailSo\Log\Enumerations\Type::WARNING, true); } if (\MailSo\Imap\Enumerations\ResponseStatus::OK !== $aResult[$iCnt - 1]->StatusOrIndex) { $this->writeLogException( new Exceptions\NegativeResponseException($aResult), \MailSo\Log\Enumerations\Type::WARNING, true); } } return $aResult; } /** * @param string $sEndTag = null * @param bool $bFindCapa = false * * @return array|bool */ protected function parseResponse($sEndTag = null, $bFindCapa = false) { if (\is_resource($this->rConnect)) { $oImapResponse = null; $sEndTag = (null === $sEndTag) ? $this->getCurrentTag() : $sEndTag; while (true) { $oImapResponse = Response::NewInstance(); $this->partialParseResponseBranch($oImapResponse); if ($oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNKNOWN === $oImapResponse->ResponseType) { return false; } if ($bFindCapa) { $this->initCapabilityImapResponse($oImapResponse); } $this->aPartialResponses[] = $oImapResponse; if ($sEndTag === $oImapResponse->Tag || \MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oImapResponse->ResponseType) { if (isset($this->aTagTimeouts[$sEndTag])) { $this->writeLog((\microtime(true) - $this->aTagTimeouts[$sEndTag]).' ('.$sEndTag.')', \MailSo\Log\Enumerations\Type::TIME); unset($this->aTagTimeouts[$sEndTag]); } break; } } else { return false; } unset($oImapResponse); } } $this->iResponseBufParsedPos = 0; $this->aLastResponse = $this->aPartialResponses; $this->aPartialResponses = array(); return $this->aLastResponse; } /** * @param string $sEndTag = null * @param bool $bFindCapa = false * * @return array */ private function parseResponseWithValidation($sEndTag = null, $bFindCapa = false) { return $this->validateResponse($this->parseResponse($sEndTag, $bFindCapa)); } /** * @param \MailSo\Imap\Response $oImapResponse * * @return void */ private function initCapabilityImapResponse($oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType && \is_array($oImapResponse->ResponseList)) { $aList = null; if (isset($oImapResponse->ResponseList[1]) && \is_string($oImapResponse->ResponseList[1]) && 'CAPABILITY' === \strtoupper($oImapResponse->ResponseList[1])) { $aList = \array_slice($oImapResponse->ResponseList, 2); } else if ($oImapResponse->OptionalResponse && \is_array($oImapResponse->OptionalResponse) && 1 < \count($oImapResponse->OptionalResponse) && \is_string($oImapResponse->OptionalResponse[0]) && 'CAPABILITY' === \strtoupper($oImapResponse->OptionalResponse[0])) { $aList = \array_slice($oImapResponse->OptionalResponse, 1); } if (\is_array($aList) && 0 < \count($aList)) { $this->aCapabilityItems = \array_map('strtoupper', $aList); } } } /** * @return array|string * * @throws \MailSo\Net\Exceptions\Exception */ private function partialParseResponseBranch(&$oImapResponse, $iStackIndex = -1, $bTreatAsAtom = false, $sParentToken = '', $sOpenBracket = '') { $mNull = null; $iStackIndex++; $iPos = $this->iResponseBufParsedPos; $sPreviousAtomUpperCase = null; $bIsEndOfList = false; $bIsClosingBracketSquare = false; $iLiteralLen = 0; $iBufferEndIndex = 0; $iDebugCount = 0; $rImapLiteralStream = null; $bIsGotoDefault = false; $bIsGotoLiteral = false; $bIsGotoLiteralEnd = false; $bIsGotoAtomBracket = false; $bIsGotoNotAtomBracket = false; $bCountOneInited = false; $bCountTwoInited = false; $sAtomBuilder = $bTreatAsAtom ? '' : null; $aList = array(); if (null !== $oImapResponse) { $aList =& $oImapResponse->ResponseList; } while (!$bIsEndOfList) { $iDebugCount++; if (100000 === $iDebugCount) { $this->Logger()->Write('PartialParseOver: '.$iDebugCount, \MailSo\Log\Enumerations\Type::ERROR); } if ($this->bNeedNext) { $iPos = 0; $this->getNextBuffer(); $this->iResponseBufParsedPos = $iPos; $this->bNeedNext = false; } $sChar = null; if ($bIsGotoDefault) { $sChar = 'GOTO_DEFAULT'; $bIsGotoDefault = false; } else if ($bIsGotoLiteral) { $bIsGotoLiteral = false; $bIsGotoLiteralEnd = true; if ($this->partialResponseLiteralCallbackCallable( $sParentToken, null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $this->rConnect, $iLiteralLen)) { if (!$bTreatAsAtom) { $aList[] = ''; } } else { $sLiteral = ''; $iRead = $iLiteralLen; while (0 < $iRead) { $sAddRead = \fread($this->rConnect, $iRead); if (false === $sAddRead) { $sLiteral = false; break; } $sLiteral .= $sAddRead; $iRead -= \strlen($sAddRead); \MailSo\Base\Utils::ResetTimeLimit(); } if (false !== $sLiteral) { $iLiteralSize = \strlen($sLiteral); \MailSo\Base\Loader::IncStatistic('NetRead', $iLiteralSize); if ($iLiteralLen !== $iLiteralSize) { $this->writeLog('Literal stream read warning "read '.$iLiteralSize.' of '. $iLiteralLen.'" bytes', \MailSo\Log\Enumerations\Type::WARNING); } if (!$bTreatAsAtom) { $aList[] = $sLiteral; if (\MailSo\Config::$LogSimpleLiterals) { $this->writeLog('{'.\strlen($sLiteral).'} '.$sLiteral, \MailSo\Log\Enumerations\Type::INFO); } } } else { $this->writeLog('Can\'t read imap stream', \MailSo\Log\Enumerations\Type::NOTE); } unset($sLiteral); } continue; } else if ($bIsGotoLiteralEnd) { $rImapLiteralStream = null; $sPreviousAtomUpperCase = null; $this->bNeedNext = true; $bIsGotoLiteralEnd = false; continue; } else if ($bIsGotoAtomBracket) { if ($bTreatAsAtom) { $sAtomBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); $sAtomBuilder .= $sAtomBlock; $iPos = $this->iResponseBufParsedPos; $sAtomBuilder .= ($bIsClosingBracketSquare) ? ']' : ')'; } $sPreviousAtomUpperCase = null; $bIsGotoAtomBracket = false; continue; } else if ($bIsGotoNotAtomBracket) { $aSubItems = $this->partialParseResponseBranch($mNull, $iStackIndex, false, null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), $sOpenBracket); $aList[] = $aSubItems; $iPos = $this->iResponseBufParsedPos; $sPreviousAtomUpperCase = null; if (null !== $oImapResponse && $oImapResponse->IsStatusResponse) { $oImapResponse->OptionalResponse = $aSubItems; $bIsGotoDefault = true; $bIsGotoNotAtomBracket = false; continue; } $bIsGotoNotAtomBracket = false; continue; } else { $iBufferEndIndex = \strlen($this->sResponseBuffer) - 3; $this->bResponseBufferChanged = false; if ($iPos > $iBufferEndIndex) { break; } $sChar = $this->sResponseBuffer[$iPos]; } switch (true) { case ']' === $sChar: $iPos++; $sPreviousAtomUpperCase = null; $bIsEndOfList = true; break; case ')' === $sChar: $iPos++; $sPreviousAtomUpperCase = null; $bIsEndOfList = true; break; case ' ' === $sChar: if ($bTreatAsAtom) { $sAtomBuilder .= ' '; } $iPos++; break; case '[' === $sChar: $bIsClosingBracketSquare = true; case '(' === $sChar: if ('(' === $sChar) { $bIsClosingBracketSquare = false; } if ($bTreatAsAtom) { $sAtomBuilder .= $bIsClosingBracketSquare ? '[' : '('; } $iPos++; $this->iResponseBufParsedPos = $iPos; if ($bTreatAsAtom) { $bIsGotoAtomBracket = true; $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; } else { $bIsGotoNotAtomBracket = true; $sOpenBracket = $bIsClosingBracketSquare ? '[' : '('; } break; case '{' === $sChar: $bIsLiteralParsed = false; $mLiteralEndPos = \strpos($this->sResponseBuffer, '}', $iPos); if (false !== $mLiteralEndPos && $mLiteralEndPos > $iPos) { $sLiteralLenAsString = \substr($this->sResponseBuffer, $iPos + 1, $mLiteralEndPos - $iPos - 1); if (\is_numeric($sLiteralLenAsString)) { $iLiteralLen = (int) $sLiteralLenAsString; $bIsLiteralParsed = true; $iPos = $mLiteralEndPos + 3; $bIsGotoLiteral = true; break; } } if (!$bIsLiteralParsed) { $iPos = $iBufferEndIndex; } $sPreviousAtomUpperCase = null; break; case '"' === $sChar: $bIsQuotedParsed = false; while (true) { $iClosingPos = $iPos + 1; if ($iClosingPos > $iBufferEndIndex) { break; } while (true) { $iClosingPos = \strpos($this->sResponseBuffer, '"', $iClosingPos); if (false === $iClosingPos) { break; } // TODO $iClosingPosNext = $iClosingPos + 1; if ( isset($this->sResponseBuffer[$iClosingPosNext]) && ' ' !== $this->sResponseBuffer[$iClosingPosNext] && "\r" !== $this->sResponseBuffer[$iClosingPosNext] && "\n" !== $this->sResponseBuffer[$iClosingPosNext] && ']' !== $this->sResponseBuffer[$iClosingPosNext] && ')' !== $this->sResponseBuffer[$iClosingPosNext] ) { $iClosingPos++; continue; } $iSlashCount = 0; while ('\\' === $this->sResponseBuffer[$iClosingPos - $iSlashCount - 1]) { $iSlashCount++; } if ($iSlashCount % 2 == 1) { $iClosingPos++; continue; } else { break; } } if (false === $iClosingPos) { break; } else { // $iSkipClosingPos = 0; $bIsQuotedParsed = true; if ($bTreatAsAtom) { $sAtomBuilder .= \strtr( \substr($this->sResponseBuffer, $iPos, $iClosingPos - $iPos + 1), array('\\\\' => '\\', '\\"' => '"') ); } else { $aList[] = \strtr( \substr($this->sResponseBuffer, $iPos + 1, $iClosingPos - $iPos - 1), array('\\\\' => '\\', '\\"' => '"') ); } $iPos = $iClosingPos + 1; break; } } if (!$bIsQuotedParsed) { $iPos = $iBufferEndIndex; } $sPreviousAtomUpperCase = null; break; case 'GOTO_DEFAULT' === $sChar: default: $iCharBlockStartPos = $iPos; if (null !== $oImapResponse && $oImapResponse->IsStatusResponse) { $iPos = $iBufferEndIndex; while ($iPos > $iCharBlockStartPos && $this->sResponseBuffer[$iCharBlockStartPos] === ' ') { $iCharBlockStartPos++; } } $bIsAtomDone = false; while (!$bIsAtomDone && ($iPos <= $iBufferEndIndex)) { $sCharDef = $this->sResponseBuffer[$iPos]; switch (true) { case '[' === $sCharDef: if (null === $sAtomBuilder) { $sAtomBuilder = ''; } $sAtomBuilder .= \substr($this->sResponseBuffer, $iCharBlockStartPos, $iPos - $iCharBlockStartPos + 1); $iPos++; $this->iResponseBufParsedPos = $iPos; $sListBlock = $this->partialParseResponseBranch($mNull, $iStackIndex, true, null === $sPreviousAtomUpperCase ? '' : \strtoupper($sPreviousAtomUpperCase), '['); if (null !== $sListBlock) { $sAtomBuilder .= $sListBlock.']'; } $iPos = $this->iResponseBufParsedPos; $iCharBlockStartPos = $iPos; break; case ' ' === $sCharDef: case ')' === $sCharDef && '(' === $sOpenBracket: case ']' === $sCharDef && '[' === $sOpenBracket: $bIsAtomDone = true; break; default: $iPos++; break; } } if ($iPos > $iCharBlockStartPos || null !== $sAtomBuilder) { $sLastCharBlock = \substr($this->sResponseBuffer, $iCharBlockStartPos, $iPos - $iCharBlockStartPos); if (null === $sAtomBuilder) { $aList[] = $sLastCharBlock; $sPreviousAtomUpperCase = $sLastCharBlock; } else { $sAtomBuilder .= $sLastCharBlock; if (!$bTreatAsAtom) { $aList[] = $sAtomBuilder; $sPreviousAtomUpperCase = $sAtomBuilder; $sAtomBuilder = null; } } if (null !== $oImapResponse) { // if (1 === \count($aList)) if (!$bCountOneInited && 1 === \count($aList)) // if (isset($aList[0]) && !isset($aList[1])) // fast 1 === \count($aList) { $bCountOneInited = true; $oImapResponse->Tag = $aList[0]; if ('+' === $oImapResponse->Tag) { $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::CONTINUATION; } else if ('*' === $oImapResponse->Tag) { $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNTAGGED; } else if ($this->getCurrentTag() === $oImapResponse->Tag) { $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::TAGGED; } else { $oImapResponse->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNKNOWN; } } // else if (2 === \count($aList)) else if (!$bCountTwoInited && 2 === \count($aList)) // else if (isset($aList[1]) && !isset($aList[2])) // fast 2 === \count($aList) { $bCountTwoInited = true; $oImapResponse->StatusOrIndex = strtoupper($aList[1]); if ($oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::OK || $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::NO || $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::BAD || $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::BYE || $oImapResponse->StatusOrIndex == \MailSo\Imap\Enumerations\ResponseStatus::PREAUTH) { $oImapResponse->IsStatusResponse = true; } } else if (\MailSo\Imap\Enumerations\ResponseType::CONTINUATION === $oImapResponse->ResponseType) { $oImapResponse->HumanReadable = $sLastCharBlock; } else if ($oImapResponse->IsStatusResponse) { $oImapResponse->HumanReadable = $sLastCharBlock; } } } } } $this->iResponseBufParsedPos = $iPos; if (null !== $oImapResponse) { $this->bNeedNext = true; $this->iResponseBufParsedPos = 0; } if (100000 < $iDebugCount) { $this->Logger()->Write('PartialParseOverResult: '.$iDebugCount, \MailSo\Log\Enumerations\Type::ERROR); } return $bTreatAsAtom ? $sAtomBuilder : $aList; } /** * @param string $sParent * @param string $sLiteralAtomUpperCase * @param resource $rImapStream * @param int $iLiteralLen * * @return bool */ private function partialResponseLiteralCallbackCallable($sParent, $sLiteralAtomUpperCase, $rImapStream, $iLiteralLen) { $sLiteralAtomUpperCasePeek = ''; if (0 === \strpos($sLiteralAtomUpperCase, 'BODY')) { $sLiteralAtomUpperCasePeek = \str_replace('BODY', 'BODY.PEEK', $sLiteralAtomUpperCase); } $sFetchKey = ''; if (\is_array($this->aFetchCallbacks)) { if (0 < \strlen($sLiteralAtomUpperCasePeek) && isset($this->aFetchCallbacks[$sLiteralAtomUpperCasePeek])) { $sFetchKey = $sLiteralAtomUpperCasePeek; } else if (0 < \strlen($sLiteralAtomUpperCase) && isset($this->aFetchCallbacks[$sLiteralAtomUpperCase])) { $sFetchKey = $sLiteralAtomUpperCase; } } $bResult = false; if (0 < \strlen($sFetchKey) && '' !== $this->aFetchCallbacks[$sFetchKey] && \is_callable($this->aFetchCallbacks[$sFetchKey])) { $rImapLiteralStream = \MailSo\Base\StreamWrappers\Literal::CreateStream($rImapStream, $iLiteralLen); $bResult = true; $this->writeLog('Start Callback for '.$sParent.' / '.$sLiteralAtomUpperCase. ' - try to read '.$iLiteralLen.' bytes.', \MailSo\Log\Enumerations\Type::NOTE); $this->bRunningCallback = true; try { \call_user_func($this->aFetchCallbacks[$sFetchKey], $sParent, $sLiteralAtomUpperCase, $rImapLiteralStream); } catch (\Exception $oException) { $this->writeLog('Callback Exception', \MailSo\Log\Enumerations\Type::NOTICE); $this->writeLogException($oException); } if (\is_resource($rImapLiteralStream)) { $iNotReadLiteralLen = 0; $bFeof = \feof($rImapLiteralStream); $this->writeLog('End Callback for '.$sParent.' / '.$sLiteralAtomUpperCase. ' - feof = '.($bFeof ? 'good' : 'BAD'), $bFeof ? \MailSo\Log\Enumerations\Type::NOTE : \MailSo\Log\Enumerations\Type::WARNING); if (!$bFeof) { while (!@\feof($rImapLiteralStream)) { $sBuf = @\fread($rImapLiteralStream, 1024 * 1024); if (false === $sBuf || 0 === \strlen($sBuf) || null === $sBuf) { break; } \MailSo\Base\Utils::ResetTimeLimit(); $iNotReadLiteralLen += \strlen($sBuf); } if (\is_resource($rImapLiteralStream) && !@\feof($rImapLiteralStream)) { @\stream_get_contents($rImapLiteralStream); } } if (\is_resource($rImapLiteralStream)) { @\fclose($rImapLiteralStream); } if ($iNotReadLiteralLen > 0) { $this->writeLog('Not read literal size is '.$iNotReadLiteralLen.' bytes.', \MailSo\Log\Enumerations\Type::WARNING); } } else { $this->writeLog('Literal stream is not resource after callback.', \MailSo\Log\Enumerations\Type::WARNING); } \MailSo\Base\Loader::IncStatistic('NetRead', $iLiteralLen); $this->bRunningCallback = false; } return $bResult; } /** * @param array $aParams = null * * @return string */ private function prepearParamLine($aParams = array()) { $sReturn = ''; if (\is_array($aParams) && 0 < \count($aParams)) { foreach ($aParams as $mParamItem) { if (\is_array($mParamItem) && 0 < \count($mParamItem)) { $sReturn .= ' ('.\trim($this->prepearParamLine($mParamItem)).')'; } else if (\is_string($mParamItem)) { $sReturn .= ' '.$mParamItem; } } } return $sReturn; } /** * @return string */ private function getNewTag() { $this->iTagCount++; return $this->getCurrentTag(); } /** * @return string */ private function getCurrentTag() { return self::TAG_PREFIX.$this->iTagCount; } /** * @param string $sStringForEscape * * @return string */ public function EscapeString($sStringForEscape) { return '"'.\str_replace(array('\\', '"'), array('\\\\', '\\"'), $sStringForEscape).'"'; } /** * @return string */ protected function getLogName() { return 'IMAP'; } /** * @param \MailSo\Log\Logger $oLogger * * @return \MailSo\Imap\ImapClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetLogger($oLogger) { parent::SetLogger($oLogger); return $this; } /** * @param resource $rConnect * @param array $aCapabilityItems = array() * * @return \MailSo\Imap\ImapClient */ public function TestSetValues($rConnect, $aCapabilityItems = array()) { $this->rConnect = $rConnect; $this->aCapabilityItems = $aCapabilityItems; return $this; } /** * @param string $sEndTag = null * @param string $bFindCapa = false * * @return array */ public function TestParseResponseWithValidationProxy($sEndTag = null, $bFindCapa = false) { return $this->parseResponseWithValidation($sEndTag, $bFindCapa); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/NamespaceResult.php000066400000000000000000000060051361462701300301770ustar00rootroot00000000000000sPersonal = ''; $this->sPersonalDelimiter = ''; $this->sOtherUser = ''; $this->sOtherUserDelimiter = ''; $this->sShared = ''; $this->sSharedDelimiter = ''; } /** * @return \MailSo\Imap\NamespaceResult */ public static function NewInstance() { return new self(); } /** * @param \MailSo\Imap\Response $oImapResponse * * @return \MailSo\Imap\NamespaceResult */ public function InitByImapResponse($oImapResponse) { if ($oImapResponse && $oImapResponse instanceof \MailSo\Imap\Response) { if (isset($oImapResponse->ResponseList[2][0]) && \is_array($oImapResponse->ResponseList[2][0]) && 2 <= \count($oImapResponse->ResponseList[2][0])) { $this->sPersonal = $oImapResponse->ResponseList[2][0][0]; $this->sPersonalDelimiter = $oImapResponse->ResponseList[2][0][1]; $this->sPersonal = 'INBOX'.$this->sPersonalDelimiter === \substr(\strtoupper($this->sPersonal), 0, 6) ? 'INBOX'.$this->sPersonalDelimiter.\substr($this->sPersonal, 6) : $this->sPersonal; } if (isset($oImapResponse->ResponseList[3][0]) && \is_array($oImapResponse->ResponseList[3][0]) && 2 <= \count($oImapResponse->ResponseList[3][0])) { $this->sOtherUser = $oImapResponse->ResponseList[3][0][0]; $this->sOtherUserDelimiter = $oImapResponse->ResponseList[3][0][1]; $this->sOtherUser = 'INBOX'.$this->sOtherUserDelimiter === \substr(\strtoupper($this->sOtherUser), 0, 6) ? 'INBOX'.$this->sOtherUserDelimiter.\substr($this->sOtherUser, 6) : $this->sOtherUser; } if (isset($oImapResponse->ResponseList[4][0]) && \is_array($oImapResponse->ResponseList[4][0]) && 2 <= \count($oImapResponse->ResponseList[4][0])) { $this->sShared = $oImapResponse->ResponseList[4][0][0]; $this->sSharedDelimiter = $oImapResponse->ResponseList[4][0][1]; $this->sShared = 'INBOX'.$this->sSharedDelimiter === \substr(\strtoupper($this->sShared), 0, 6) ? 'INBOX'.$this->sSharedDelimiter.\substr($this->sShared, 6) : $this->sShared; } } return $this; } /** * @return string */ public function GetPersonalNamespace() { return $this->sPersonal; } /** * @return string */ public function GetPersonalNamespaceDelimiter() { return $this->sPersonalDelimiter; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Response.php000066400000000000000000000027461361462701300267120ustar00rootroot00000000000000ResponseList = array(); $this->OptionalResponse = null; $this->StatusOrIndex = ''; $this->HumanReadable = ''; $this->IsStatusResponse = false; $this->ResponseType = \MailSo\Imap\Enumerations\ResponseType::UNKNOWN; $this->Tag = ''; } /** * @return \MailSo\Imap\Response */ public static function NewInstance() { return new self(); } /** * @param string $aList * * @return string */ private function recToLine($aList) { $aResult = array(); if (\is_array($aList)) { foreach ($aList as $mItem) { $aResult[] = \is_array($mItem) ? '('.$this->recToLine($mItem).')' : (string) $mItem; } } return \implode(' ', $aResult); } /** * @return string */ public function ToLine() { return $this->recToLine($this->ResponseList); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/LICENSE000066400000000000000000000020661361462701300245150ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 Usenko Timur Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/000077500000000000000000000000001361462701300242255ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php000066400000000000000000000215051361462701300261740ustar00rootroot00000000000000sDatePattern = 'H:i:s'; $this->sName = 'INFO'; $this->sNewLine = "\r\n"; $this->bTimePrefix = true; $this->bTypedPrefix = true; $this->bGuidPrefix = true; $this->sTimeOffset = '0'; $this->iWriteOnTimeoutOnly = 0; $this->bWriteOnErrorOnly = false; $this->bWriteOnPhpErrorOnly = false; $this->bFlushCache = false; $this->aCache = array(); $this->aPrefixes = array( \MailSo\Log\Enumerations\Type::INFO => '[DATA]', \MailSo\Log\Enumerations\Type::SECURE => '[SECURE]', \MailSo\Log\Enumerations\Type::NOTE => '[NOTE]', \MailSo\Log\Enumerations\Type::TIME => '[TIME]', \MailSo\Log\Enumerations\Type::TIME_DELTA => '[TIME]', \MailSo\Log\Enumerations\Type::MEMORY => '[MEMORY]', \MailSo\Log\Enumerations\Type::NOTICE => '[NOTICE]', \MailSo\Log\Enumerations\Type::WARNING => '[WARNING]', \MailSo\Log\Enumerations\Type::ERROR => '[ERROR]', \MailSo\Log\Enumerations\Type::NOTICE_PHP => '[NOTICE]', \MailSo\Log\Enumerations\Type::WARNING_PHP => '[WARNING]', \MailSo\Log\Enumerations\Type::ERROR_PHP => '[ERROR]', ); } /** * @param string $sTimeOffset * * @return \MailSo\Log\Driver */ public function SetTimeOffset($sTimeOffset) { $this->sTimeOffset = (string) $sTimeOffset; return $this; } /** * @return \MailSo\Log\Driver */ public function DisableGuidPrefix() { $this->bGuidPrefix = false; return $this; } /** * @return \MailSo\Log\Driver */ public function DisableTimePrefix() { $this->bTimePrefix = false; return $this; } /** * @param bool $bValue * * @return \MailSo\Log\Driver */ public function WriteOnErrorOnly($bValue) { $this->bWriteOnErrorOnly = !!$bValue; return $this; } /** * @param bool $bValue * * @return \MailSo\Log\Driver */ public function WriteOnPhpErrorOnly($bValue) { $this->bWriteOnPhpErrorOnly = !!$bValue; return $this; } /** * @param int $iTimeout * * @return \MailSo\Log\Driver */ public function WriteOnTimeoutOnly($iTimeout) { $this->iWriteOnTimeoutOnly = (int) $iTimeout; if (0 > $this->iWriteOnTimeoutOnly) { $this->iWriteOnTimeoutOnly = 0; } return $this; } /** * @return \MailSo\Log\Driver */ public function DisableTypedPrefix() { $this->bTypedPrefix = false; return $this; } /** * @param string|array $mDesc * @return bool */ abstract protected function writeImplementation($mDesc); /** * @return bool */ protected function writeEmptyLineImplementation() { return $this->writeImplementation(''); } /** * @param string $sTimePrefix * @param string $sDesc * @param int $iType = \MailSo\Log\Enumerations\Type::INFO * @param array $sName = '' * * @return string */ protected function loggerLineImplementation($sTimePrefix, $sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '') { return \ltrim( ($this->bTimePrefix ? '['.$sTimePrefix.']' : ''). ($this->bGuidPrefix ? '['.\MailSo\Log\Logger::Guid().']' : ''). ($this->bTypedPrefix ? ' '.$this->getTypedPrefix($iType, $sName) : '') ).$sDesc; } /** * @return bool */ protected function clearImplementation() { return true; } /** * @return string */ protected function getTimeWithMicroSec() { $aMicroTimeItems = \explode(' ', \microtime()); return \MailSo\Log\Logger::DateHelper($this->sDatePattern, $this->sTimeOffset, $aMicroTimeItems[1]).'.'. \str_pad((int) ($aMicroTimeItems[0] * 1000), 3, '0', STR_PAD_LEFT); } /** * @param int $iType * @param string $sName = '' * * @return string */ protected function getTypedPrefix($iType, $sName = '') { $sName = 0 < \strlen($sName) ? $sName : $this->sName; return isset($this->aPrefixes[$iType]) ? $sName.$this->aPrefixes[$iType].': ' : ''; } /** * @param string|array $mDesc * @param bool $bDiplayCrLf = false * * @return string */ protected function localWriteImplementation($mDesc, $bDiplayCrLf = false) { if ($bDiplayCrLf) { if (\is_array($mDesc)) { foreach ($mDesc as &$sLine) { $sLine = \strtr($sLine, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); $sLine = \rtrim($sLine); } } else { $mDesc = \strtr($mDesc, array("\r" => '\r', "\n" => '\n'.$this->sNewLine)); $mDesc = \rtrim($mDesc); } } return $this->writeImplementation($mDesc); } /** * @final * @param string $sDesc * @param int $iType = \MailSo\Log\Enumerations\Type::INFO * @param string $sName = '' * @param bool $bDiplayCrLf = false * * @return bool */ final public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', $bDiplayCrLf = false) { $bResult = true; if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) { $bErrorPhp = false; $bError = $this->bWriteOnErrorOnly && \in_array($iType, array( \MailSo\Log\Enumerations\Type::NOTICE, \MailSo\Log\Enumerations\Type::NOTICE_PHP, \MailSo\Log\Enumerations\Type::WARNING, \MailSo\Log\Enumerations\Type::WARNING_PHP, \MailSo\Log\Enumerations\Type::ERROR, \MailSo\Log\Enumerations\Type::ERROR_PHP )); if (!$bError) { $bErrorPhp = $this->bWriteOnPhpErrorOnly && \in_array($iType, array( \MailSo\Log\Enumerations\Type::NOTICE_PHP, \MailSo\Log\Enumerations\Type::WARNING_PHP, \MailSo\Log\Enumerations\Type::ERROR_PHP )); } if ($bError || $bErrorPhp) { $sFlush = '--- FlushLogCache: '.($bError ? 'WriteOnErrorOnly' : 'WriteOnPhpErrorOnly'); if (isset($this->aCache[0]) && empty($this->aCache[0])) { $this->aCache[0] = $sFlush; \array_unshift($this->aCache, ''); } else { \array_unshift($this->aCache, $sFlush); } $this->aCache[] = '--- FlushLogCache: Trigger'; $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); $this->bFlushCache = true; $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); $this->aCache = array(); } else if (0 < $this->iWriteOnTimeoutOnly && \time() - APP_START_TIME > $this->iWriteOnTimeoutOnly) { $sFlush = '--- FlushLogCache: WriteOnTimeoutOnly ['.(\time() - APP_START_TIME).'sec]'; if (isset($this->aCache[0]) && empty($this->aCache[0])) { $this->aCache[0] = $sFlush; \array_unshift($this->aCache, ''); } else { \array_unshift($this->aCache, $sFlush); } $this->aCache[] = '--- FlushLogCache: Trigger'; $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); $this->bFlushCache = true; $bResult = $this->localWriteImplementation($this->aCache, $bDiplayCrLf); $this->aCache = array(); } else { $this->aCache[] = $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName); } } else { $bResult = $this->localWriteImplementation( $this->loggerLineImplementation($this->getTimeWithMicroSec(), $sDesc, $iType, $sName), $bDiplayCrLf); } return $bResult; } /** * @return string */ public function GetNewLine() { return $this->sNewLine; } /** * @final * @return bool */ final public function Clear() { return $this->clearImplementation(); } /** * @final * @return void */ final public function WriteEmptyLine() { if (!$this->bFlushCache && ($this->bWriteOnErrorOnly || $this->bWriteOnPhpErrorOnly || 0 < $this->iWriteOnTimeoutOnly)) { $this->aCache[] = ''; } else { $this->writeEmptyLineImplementation(); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/000077500000000000000000000000001361462701300256435ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Callback.php000066400000000000000000000030441361462701300300510ustar00rootroot00000000000000fWriteCallback = \is_callable($fWriteCallback) ? $fWriteCallback : null; $this->fClearCallback = \is_callable($fClearCallback) ? $fClearCallback : null; } /** * @param mixed $fWriteCallback * @param mixed $fClearCallback = null * * @return \MailSo\Log\Drivers\Callback */ public static function NewInstance($fWriteCallback, $fClearCallback = null) { return new self($fWriteCallback, $fClearCallback); } /** * @param string|array $mDesc * * @return bool */ protected function writeImplementation($mDesc) { if ($this->fWriteCallback) { \call_user_func_array($this->fWriteCallback, array($mDesc)); } return true; } /** * @return bool */ protected function clearImplementation() { if ($this->fClearCallback) { \call_user_func($this->fClearCallback); } return true; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/File.php000066400000000000000000000031311361462701300272310ustar00rootroot00000000000000sLoggerFileName = $sLoggerFileName; $this->sNewLine = $sNewLine; } /** * @param string $sLoggerFileName */ public function SetLoggerFileName($sLoggerFileName) { $this->sLoggerFileName = $sLoggerFileName; } /** * @param string $sLoggerFileName * @param string $sNewLine = "\r\n" * * @return \MailSo\Log\Drivers\File */ public static function NewInstance($sLoggerFileName, $sNewLine = "\r\n") { return new self($sLoggerFileName, $sNewLine); } /** * @param string|array $mDesc * * @return bool */ protected function writeImplementation($mDesc) { return $this->writeToLogFile($mDesc); } /** * @return bool */ protected function clearImplementation() { return \unlink($this->sLoggerFileName); } /** * @param string|array $mDesc * * @return bool */ private function writeToLogFile($mDesc) { if (\is_array($mDesc)) { $mDesc = \implode($this->sNewLine, $mDesc); } return \error_log($mDesc.$this->sNewLine, 3, $this->sLoggerFileName); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Inline.php000066400000000000000000000033161361462701300275750ustar00rootroot00000000000000sNewLine = $sNewLine; $this->bHtmlEncodeSpecialChars = $bHtmlEncodeSpecialChars; } /** * @param string $sNewLine = "\r\n" * @param bool $bHtmlEncodeSpecialChars = false * * @return \MailSo\Log\Drivers\Inline */ public static function NewInstance($sNewLine = "\r\n", $bHtmlEncodeSpecialChars = false) { return new self($sNewLine, $bHtmlEncodeSpecialChars); } /** * @param string $mDesc * * @return bool */ protected function writeImplementation($mDesc) { if (\is_array($mDesc)) { if ($this->bHtmlEncodeSpecialChars) { $mDesc = \array_map(function ($sItem) { return \htmlspecialchars($sItem); }, $mDesc); } $mDesc = \implode($this->sNewLine, $mDesc); } else { echo ($this->bHtmlEncodeSpecialChars) ? \htmlspecialchars($mDesc).$this->sNewLine : $mDesc.$this->sNewLine; } return true; } /** * @return bool */ protected function clearImplementation() { if (\defined('PHP_SAPI') && 'cli' === PHP_SAPI && \MailSo\Base\Utils::FunctionExistsAndEnabled('system')) { \system('clear'); } return true; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Syslog.php000066400000000000000000000024471361462701300276430ustar00rootroot00000000000000iLogLevel = \defined('LOG_INFO') ? LOG_INFO : 6; if (\function_exists('openlog') && \function_exists('closelog') && \defined('LOG_ODELAY') && \defined('LOG_USER')) { \openlog('rainloop', LOG_ODELAY, LOG_USER); \register_shutdown_function(function () { @\closelog(); }); } else { $this->iLogLevel = null; } } /** * @return \MailSo\Log\Drivers\Syslog */ public static function NewInstance() { return new self(); } /** * @param string|array $mDesc * * @return bool */ protected function writeImplementation($mDesc) { if (null === $this->iLogLevel) { return false; } if (\is_array($mDesc)) { $mDesc = \implode($this->sNewLine, $mDesc); } return \syslog($this->iLogLevel, $mDesc); } /** * @return bool */ protected function clearImplementation() { return true; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/000077500000000000000000000000001361462701300266765ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/Type.php000066400000000000000000000010721361462701300303300ustar00rootroot00000000000000bUsed = false; $this->aForbiddenTypes = array(); $this->aSecretWords = array(); $this->bShowSecter = false; $this->bHideErrorNotices = false; if ($bRegPhpErrorHandler) { \set_error_handler(array(&$this, '__phpErrorHandler')); } \register_shutdown_function(array(&$this, '__loggerShutDown')); } /** * @param bool $bRegPhpErrorHandler = false * * @return \MailSo\Log\Logger */ public static function NewInstance($bRegPhpErrorHandler = false) { return new self($bRegPhpErrorHandler); } /** * @staticvar \MailSo\Log\Logger $oInstance; * * @return \MailSo\Log\Logger */ public static function SingletonInstance() { static $oInstance = null; if (null === $oInstance) { $oInstance = self::NewInstance(); } return $oInstance; } /** * @param string $sFormat * @param string $sTimeOffset = '0' * @param int $iTimestamp = 0 * * @return string */ public static function DateHelper($sFormat, $sTimeOffset = '0', $iTimestamp = null) { $iTimestamp = null === $iTimestamp ? \time() : (int) $iTimestamp; return \gmdate($sFormat, $iTimestamp + \MailSo\Base\DateTimeHelper::TimeToSec((string) $sTimeOffset)); } /** * @return bool */ public static function IsSystemEnabled() { return !!(\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger); } /** * @param mixed $mData * @param int $iType = \MailSo\Log\Enumerations\Type::INFO */ public static function SystemLog($mData, $iType = \MailSo\Log\Enumerations\Type::INFO) { if (\MailSo\Config::$SystemLogger instanceof \MailSo\Log\Logger) { \MailSo\Config::$SystemLogger->WriteMixed($mData, $iType); } } /** * @staticvar string $sCache; * * @return string */ public static function Guid() { static $sCache = null; if (null === $sCache) { $sCache = \substr(\MailSo\Base\Utils::Md5Rand(), -8); } return $sCache; } /** * @return bool */ public function Ping() { return true; } /** * @return bool */ public function IsEnabled() { return 0 < $this->Count(); } /** * @param string $sWord * * @return bool */ public function AddSecret($sWord) { if (\is_string($sWord) && 0 < \strlen(\trim($sWord))) { $this->aSecretWords[] = $sWord; $this->aSecretWords = \array_unique($this->aSecretWords); } } /** * @param bool $bShow * * @return \MailSo\Log\Logger */ public function SetShowSecter($bShow) { $this->bShowSecter = !!$bShow; return $this; } /** * @param bool $bValue * * @return \MailSo\Log\Logger */ public function HideErrorNotices($bValue) { $this->bHideErrorNotices = !!$bValue; return $this; } /** * @return bool */ public function IsShowSecter() { return $this->bShowSecter; } /** * @param int $iType * * @return \MailSo\Log\Logger */ public function AddForbiddenType($iType) { $this->aForbiddenTypes[$iType] = true; return $this; } /** * @param int $iType * * @return \MailSo\Log\Logger */ public function RemoveForbiddenType($iType) { $this->aForbiddenTypes[$iType] = false; return $this; } /** * @param int $iErrNo * @param string $sErrStr * @param string $sErrFile * @param int $iErrLine * * @return bool */ public function __phpErrorHandler($iErrNo, $sErrStr, $sErrFile, $iErrLine) { $iType = \MailSo\Log\Enumerations\Type::NOTICE_PHP; switch ($iErrNo) { case E_USER_ERROR: $iType = \MailSo\Log\Enumerations\Type::ERROR_PHP; break; case E_USER_WARNING: $iType = \MailSo\Log\Enumerations\Type::WARNING_PHP; break; } $this->Write($sErrFile.' [line:'.$iErrLine.', code:'.$iErrNo.']', $iType, 'PHP'); $this->Write('Error: '.$sErrStr, $iType, 'PHP'); return !!(\MailSo\Log\Enumerations\Type::NOTICE === $iType && $this->bHideErrorNotices); } /** * @return void */ public function __loggerShutDown() { if ($this->bUsed) { $aStatistic = \MailSo\Base\Loader::Statistic(); if (\is_array($aStatistic)) { if (isset($aStatistic['php']['memory_get_peak_usage'])) { $this->Write('Memory peak usage: '.$aStatistic['php']['memory_get_peak_usage'], \MailSo\Log\Enumerations\Type::MEMORY); } if (isset($aStatistic['time'])) { $this->Write('Time delta: '.$aStatistic['time'], \MailSo\Log\Enumerations\Type::TIME_DELTA); } } } } /** * @return bool */ public function WriteEmptyLine() { $iResult = 1; $aLoggers =& $this->GetAsArray(); foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ &$oLogger) { $iResult &= $oLogger->WriteEmptyLine(); } return (bool) $iResult; } /** * @param string $sDesc * @param int $iType = \MailSo\Log\Enumerations\Type::INFO * @param string $sName = '' * @param bool $bSearchSecretWords = true * @param bool $bDiplayCrLf = false * * @return bool */ public function Write($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) { if (isset($this->aForbiddenTypes[$iType]) && true === $this->aForbiddenTypes[$iType]) { return true; } $this->bUsed = true; $oLogger = null; $aLoggers = array(); $iResult = 1; if ($bSearchSecretWords && !$this->bShowSecter && 0 < \count($this->aSecretWords)) { $sDesc = \str_replace($this->aSecretWords, '*******', $sDesc); } $aLoggers =& $this->GetAsArray(); foreach ($aLoggers as /* @var $oLogger \MailSo\Log\Driver */ $oLogger) { $iResult &= $oLogger->Write($sDesc, $iType, $sName, $bDiplayCrLf); } return (bool) $iResult; } /** * @param mixed $oValue * @param int $iType = \MailSo\Log\Enumerations\Type::INFO * @param string $sName = '' * @param bool $bSearchSecretWords = false * @param bool $bDiplayCrLf = false * * @return bool */ public function WriteDump($oValue, $iType = \MailSo\Log\Enumerations\Type::INFO, $sName = '', $bSearchSecretWords = false, $bDiplayCrLf = false) { return $this->Write(\print_r($oValue, true), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); } /** * @param \Exception $oException * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE * @param string $sName = '' * @param bool $bSearchSecretWords = true * @param bool $bDiplayCrLf = false * * @return bool */ public function WriteException($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) { if ($oException instanceof \Exception) { if (isset($oException->__LOGINNED__)) { return true; } $oException->__LOGINNED__ = true; return $this->Write((string) $oException, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); } return false; } /** * @param \Exception $oException * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE * @param string $sName = '' * @param bool $bSearchSecretWords = true * @param bool $bDiplayCrLf = false * * @return bool */ public function WriteExceptionShort($oException, $iType = \MailSo\Log\Enumerations\Type::NOTICE, $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) { if ($oException instanceof \Exception) { if (isset($oException->__LOGINNED__)) { return true; } $oException->__LOGINNED__ = true; return $this->Write($oException->getMessage(), $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); } return false; } /** * @param mixed $mData * @param int $iType = \MailSo\Log\Enumerations\Type::NOTICE * @param string $sName = '' * @param bool $bSearchSecretWords = true * @param bool $bDiplayCrLf = false * * @return bool */ public function WriteMixed($mData, $iType = null, $sName = '', $bSearchSecretWords = true, $bDiplayCrLf = false) { $iType = null === $iType ? \MailSo\Log\Enumerations\Type::INFO : $iType; if (\is_array($mData) || \is_object($mData)) { if ($mData instanceof \Exception) { $iType = null === $iType ? \MailSo\Log\Enumerations\Type::NOTICE : $iType; return $this->WriteException($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); } else { return $this->WriteDump($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); } } else { return $this->Write($mData, $iType, $sName, $bSearchSecretWords, $bDiplayCrLf); } return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/000077500000000000000000000000001361462701300243665ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Attachment.php000066400000000000000000000101571361462701300271730ustar00rootroot00000000000000Clear(); } /** * @return \MailSo\Mail\Attachment */ public function Clear() { $this->sFolder = ''; $this->iUid = 0; $this->oBodyStructure = null; return $this; } /** * @return string */ public function Folder() { return $this->sFolder; } /** * @return int */ public function Uid() { return $this->iUid; } /** * @return string */ public function MimeIndex() { return $this->oBodyStructure ? $this->oBodyStructure->PartID() : ''; } /** * @param bool $bCalculateOnEmpty = false * * @return string */ public function FileName($bCalculateOnEmpty = false) { $sFileName = ''; if ($this->oBodyStructure) { $sFileName = $this->oBodyStructure->FileName(); if ($bCalculateOnEmpty && 0 === \strlen(trim($sFileName))) { $sMimeType = \strtolower(\trim($this->MimeType())); if ('message/rfc822' === $sMimeType) { $sFileName = 'message'.$this->MimeIndex().'.eml'; } else if ('text/calendar' === $sMimeType) { $sFileName = 'calendar'.$this->MimeIndex().'.ics'; } else if (0 < \strlen($sMimeType)) { $sFileName = \str_replace('/', $this->MimeIndex().'.', $sMimeType); } } } return $sFileName; } /** * @return string */ public function MimeType() { return $this->oBodyStructure ? $this->oBodyStructure->ContentType() : ''; } /** * @return string */ public function ContentTransferEncoding() { return $this->oBodyStructure ? $this->oBodyStructure->MailEncodingName() : ''; } /** * @return int */ public function EncodedSize() { return $this->oBodyStructure ? $this->oBodyStructure->Size() : 0; } /** * @return int */ public function EstimatedSize() { return $this->oBodyStructure ? $this->oBodyStructure->EstimatedSize() : 0; } /** * @return string */ public function Cid() { return $this->oBodyStructure ? $this->oBodyStructure->ContentID() : ''; } /** * @return string */ public function ContentLocation() { return $this->oBodyStructure ? $this->oBodyStructure->ContentLocation() : ''; } /** * @return bool */ public function IsInline() { return $this->oBodyStructure ? $this->oBodyStructure->IsInline() : false; } /** * @return bool */ public function IsImage() { return $this->oBodyStructure ? $this->oBodyStructure->IsImage() : false; } /** * @return bool */ public function IsArchive() { return $this->oBodyStructure ? $this->oBodyStructure->IsArchive() : false; } /** * @return bool */ public function IsPdf() { return $this->oBodyStructure ? $this->oBodyStructure->IsPdf() : false; } /** * @return bool */ public function IsDoc() { return $this->oBodyStructure ? $this->oBodyStructure->IsDoc() : false; } /** * @return bool */ public function IsPgpSignature() { return $this->oBodyStructure ? $this->oBodyStructure->IsPgpSignature() : false; } /** * @return \MailSo\Mail\Attachment */ public static function NewInstance() { return new self(); } /** * @param string $sFolder * @param int $iUid * @param \MailSo\Imap\BodyStructure $oBodyStructure * @return \MailSo\Mail\Attachment */ public static function NewBodyStructureInstance($sFolder, $iUid, $oBodyStructure) { return self::NewInstance()->InitByBodyStructure($sFolder, $iUid, $oBodyStructure); } /** * @param string $sFolder * @param int $iUid * @param \MailSo\Imap\BodyStructure $oBodyStructure * @return \MailSo\Mail\Attachment */ public function InitByBodyStructure($sFolder, $iUid, $oBodyStructure) { $this->sFolder = $sFolder; $this->iUid = $iUid; $this->oBodyStructure = $oBodyStructure; return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/AttachmentCollection.php000066400000000000000000000023471361462701300312110ustar00rootroot00000000000000FilterList(function ($oAttachment) { return $oAttachment && $oAttachment->IsInline(); }); return \is_array($aList) ? \count($aList) : 0; } /** * @return int */ public function NonInlineCount() { $aList = $this->FilterList(function ($oAttachment) { return $oAttachment && !$oAttachment->IsInline(); }); return \is_array($aList) ? \count($aList) : 0; } /** * @return array */ public function SpecData() { return $this->MapList(function ($oAttachment) { if ($oAttachment) { return array($oAttachment->FileName(true), $oAttachment->MimeType()); } return null; }); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/000077500000000000000000000000001361462701300265075ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/Exception.php000066400000000000000000000005641361462701300311630ustar00rootroot00000000000000oImapFolder = $oImapFolder; $this->oSubFolders = null; $aNames = \explode($this->oImapFolder->Delimiter(), $this->oImapFolder->FullNameRaw()); $this->iNestingLevel = \count($aNames); $this->sParentFullNameRaw = ''; if (1 < $this->iNestingLevel) { \array_pop($aNames); $this->sParentFullNameRaw = \implode($this->oImapFolder->Delimiter(), $aNames); } $this->bSubscribed = $bSubscribed; $this->bExisten = $bExisten; } else { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } } /** * @param \MailSo\Imap\Folder $oImapFolder * @param bool $bSubscribed = true * @param bool $bExisten = true * * @return \MailSo\Mail\Folder * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public static function NewInstance($oImapFolder, $bSubscribed = true, $bExisten = true) { return new self($oImapFolder, $bSubscribed, $bExisten); } /** * @param string $sFullNameRaw * @param string $sDelimiter * * @return \MailSo\Mail\Folder * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public static function NewNonExistenInstance($sFullNameRaw, $sDelimiter) { return self::NewInstance( \MailSo\Imap\Folder::NewInstance($sFullNameRaw, $sDelimiter, array('\NoSelect')), true, false); } /** * @return string */ public function Name() { return \MailSo\Base\Utils::ConvertEncoding($this->NameRaw(), \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, \MailSo\Base\Enumerations\Charset::UTF_8); } /** * @return string */ public function FullName() { return \MailSo\Base\Utils::ConvertEncoding($this->FullNameRaw(), \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, \MailSo\Base\Enumerations\Charset::UTF_8); } /** * @return string */ public function NameRaw() { return $this->oImapFolder->NameRaw(); } /** * @return string */ public function FullNameRaw() { return $this->oImapFolder->FullNameRaw(); } /** * @return string */ public function ParentFullName() { return \MailSo\Base\Utils::ConvertEncoding($this->sParentFullNameRaw, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, \MailSo\Base\Enumerations\Charset::UTF_8); } /** * @return string */ public function ParentFullNameRaw() { return $this->sParentFullNameRaw; } /** * @return string */ public function Delimiter() { return $this->oImapFolder->Delimiter(); } /** * @return array */ public function Flags() { return $this->oImapFolder->Flags(); } /** * @return array */ public function FlagsLowerCase() { return $this->oImapFolder->FlagsLowerCase(); } /** * @param bool $bCreateIfNull = false * @return \MailSo\Mail\FolderCollection */ public function SubFolders($bCreateIfNull = false) { if ($bCreateIfNull && !$this->oSubFolders) { $this->oSubFolders = FolderCollection::NewInstance(); } return $this->oSubFolders; } /** * @return bool */ public function HasSubFolders() { return $this->oSubFolders && 0 < $this->oSubFolders->Count(); } /** * @return bool */ public function HasVisibleSubFolders() { $sList = array(); if ($this->oSubFolders) { $sList = $this->oSubFolders->FilterList(function (\MailSo\Mail\Folder $oFolder) { return $oFolder->IsSubscribed(); }); } return 0 < \count($sList); } /** * @return bool */ public function IsSubscribed() { return $this->bSubscribed; } /** * @return bool */ public function IsExists() { return $this->bExisten; } /** * @return bool */ public function IsSelectable() { return $this->IsExists() && $this->oImapFolder->IsSelectable(); } /** * @return mixed */ public function Status() { return $this->oImapFolder->GetExtended('STATUS'); } /** * @return bool */ public function IsInbox() { return $this->oImapFolder->IsInbox(); } /** * @return int */ public function GetFolderListType() { $aFlags = $this->oImapFolder->FlagsLowerCase(); $iListType = \MailSo\Imap\Enumerations\FolderType::USER; if (\is_array($aFlags)) { switch (true) { case \in_array('\inbox', $aFlags) || 'INBOX' === \strtoupper($this->FullNameRaw()): $iListType = \MailSo\Imap\Enumerations\FolderType::INBOX; break; case \in_array('\sent', $aFlags): case \in_array('\sentmail', $aFlags): $iListType = \MailSo\Imap\Enumerations\FolderType::SENT; break; case \in_array('\drafts', $aFlags): $iListType = \MailSo\Imap\Enumerations\FolderType::DRAFTS; break; case \in_array('\junk', $aFlags): case \in_array('\spam', $aFlags): $iListType = \MailSo\Imap\Enumerations\FolderType::JUNK; break; case \in_array('\trash', $aFlags): case \in_array('\bin', $aFlags): $iListType = \MailSo\Imap\Enumerations\FolderType::TRASH; break; case \in_array('\important', $aFlags): $iListType = \MailSo\Imap\Enumerations\FolderType::IMPORTANT; break; case \in_array('\flagged', $aFlags): case \in_array('\starred', $aFlags): $iListType = \MailSo\Imap\Enumerations\FolderType::FLAGGED; break; case \in_array('\all', $aFlags): case \in_array('\allmail', $aFlags): case \in_array('\archive', $aFlags): $iListType = \MailSo\Imap\Enumerations\FolderType::ALL; break; } } return $iListType; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php000066400000000000000000000123121361462701300303250ustar00rootroot00000000000000Namespace = ''; $this->FoldersHash = ''; $this->SystemFolders = array(); $this->IsThreadsSupported = false; $this->Optimized = false; } /** * @return \MailSo\Mail\FolderCollection */ public static function NewInstance() { return new self(); } /** * @param string $sFullNameRaw * * @return \MailSo\Mail\Folder|null */ public function GetByFullNameRaw($sFullNameRaw) { $mResult = null; foreach ($this->aItems as /* @var $oFolder \MailSo\Mail\Folder */ $oFolder) { if ($oFolder->FullNameRaw() === $sFullNameRaw) { $mResult = $oFolder; break; } else if ($oFolder->HasSubFolders()) { $mResult = $oFolder->SubFolders(true)->GetByFullNameRaw($sFullNameRaw); if ($mResult) { break; } else { $mResult = null; } } } return $mResult; } /** * @return int */ public function CountRec() { $iResult = $this->Count(); foreach ($this->aItems as /* @var $oFolder \MailSo\Mail\Folder */ $oFolder) { if ($oFolder) { $oSub = $oFolder->SubFolders(); $iResult += $oSub ? $oSub->CountRec() : 0; } } return $iResult; } /** * @return string */ public function GetNamespace() { return $this->Namespace; } /** * @return string */ public function FindDelimiter() { $sDelimiter = '/'; $oFolder = $this->GetByFullNameRaw('INBOX'); if (!$oFolder) { $oFolder = $this->GetByIndex(0); } if ($oFolder) { $sDelimiter = $oFolder->Delimiter(); } return $sDelimiter; } /** * @param string $sNamespace * * @return \MailSo\Mail\FolderCollection */ public function SetNamespace($sNamespace) { $this->Namespace = $sNamespace; return $this; } /** * @param array $aUnsortedMailFolders * * @return void */ public function InitByUnsortedMailFolderArray($aUnsortedMailFolders) { $this->Clear(); $aSortedByLenImapFolders = array(); foreach ($aUnsortedMailFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ &$oMailFolder) { $aSortedByLenImapFolders[$oMailFolder->FullNameRaw()] =& $oMailFolder; unset($oMailFolder); } unset($aUnsortedMailFolders); $aAddedFolders = array(); foreach ($aSortedByLenImapFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ $oMailFolder) { $sDelimiter = $oMailFolder->Delimiter(); $aFolderExplode = \explode($sDelimiter, $oMailFolder->FullNameRaw()); if (1 < \count($aFolderExplode)) { \array_pop($aFolderExplode); $sNonExistenFolderFullNameRaw = ''; foreach ($aFolderExplode as $sFolderExplodeItem) { $sNonExistenFolderFullNameRaw .= (0 < \strlen($sNonExistenFolderFullNameRaw)) ? $sDelimiter.$sFolderExplodeItem : $sFolderExplodeItem; if (!isset($aSortedByLenImapFolders[$sNonExistenFolderFullNameRaw])) { try { $aAddedFolders[$sNonExistenFolderFullNameRaw] = Folder::NewNonExistenInstance($sNonExistenFolderFullNameRaw, $sDelimiter); } catch (\Exception $oExc) { unset($oExc); } } } } } $aSortedByLenImapFolders = \array_merge($aSortedByLenImapFolders, $aAddedFolders); unset($aAddedFolders); \uasort($aSortedByLenImapFolders, function ($oFolderA, $oFolderB) { return \strnatcmp($oFolderA->FullNameRaw(), $oFolderB->FullNameRaw()); }); foreach ($aSortedByLenImapFolders as /* @var $oMailFolder \MailSo\Mail\Folder */ &$oMailFolder) { $this->AddWithPositionSearch($oMailFolder); unset($oMailFolder); } unset($aSortedByLenImapFolders); } /** * @param \MailSo\Mail\Folder $oMailFolder * * @return bool */ public function AddWithPositionSearch($oMailFolder) { $oItemFolder = null; $bIsAdded = false; $aList =& $this->GetAsArray(); foreach ($aList as /* @var $oItemFolder \MailSo\Mail\Folder */ $oItemFolder) { if ($oMailFolder instanceof \MailSo\Mail\Folder && 0 === \strpos($oMailFolder->FullNameRaw(), $oItemFolder->FullNameRaw().$oItemFolder->Delimiter())) { if ($oItemFolder->SubFolders(true)->AddWithPositionSearch($oMailFolder)) { $bIsAdded = true; } break; } } if (!$bIsAdded && $oMailFolder instanceof \MailSo\Mail\Folder) { $bIsAdded = true; $this->Add($oMailFolder); } return $bIsAdded; } /** * @param callable $fCallback * * @return void */ public function SortByCallback($fCallback) { if (\is_callable($fCallback)) { $aList =& $this->GetAsArray(); \usort($aList, $fCallback); foreach ($aList as &$oItemFolder) { if ($oItemFolder->HasSubFolders()) { $oItemFolder->SubFolders()->SortByCallback($fCallback); } } } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php000066400000000000000000002266341361462701300271350ustar00rootroot00000000000000oLogger = null; $this->oImapClient = \MailSo\Imap\ImapClient::NewInstance(); $this->oImapClient->SetTimeOuts(10, \MailSo\Config::$ImapTimeout); } /** * @return \MailSo\Mail\MailClient */ public static function NewInstance() { return new self(); } /** * @return \MailSo\Imap\ImapClient */ public function ImapClient() { return $this->oImapClient; } /** * @param string $sServerName * @param int $iPort = 143 * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * @param bool $bVerifySsl = false * @param string $sClientCert = "" * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Connect($sServerName, $iPort = 143, $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false, $bAllowSelfSigned = false, $sClientCert = '') { $this->oImapClient->Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned, $sClientCert); return $this; } /** * @param string $sLogin * @param string $sPassword * @param string $sProxyAuthUser = '' * @param bool $bUseAuthPlainIfSupported = true * @param bool $bUseAuthCramMd5IfSupported = true * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\LoginException */ public function Login($sLogin, $sPassword, $sProxyAuthUser = '', $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) { $this->oImapClient->Login($sLogin, $sPassword, $sProxyAuthUser, $bUseAuthPlainIfSupported, $bUseAuthCramMd5IfSupported); return $this; } /** * @param string $sXOAuth2Token * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\LoginException */ public function LoginWithXOauth2($sXOAuth2Token) { $this->oImapClient->LoginWithXOauth2($sXOAuth2Token); return $this; } /** * @return \MailSo\Mail\MailClient * * @throws \MailSo\Net\Exceptions\Exception */ public function Logout() { $this->oImapClient->Logout(); return $this; } /** * @return \MailSo\Mail\MailClient * * @throws \MailSo\Net\Exceptions\Exception */ public function Disconnect() { $this->oImapClient->Disconnect(); return $this; } /** * @return \MailSo\Mail\MailClient * * @throws \MailSo\Net\Exceptions\Exception */ public function LogoutAndDisconnect() { return $this->Logout()->Disconnect(); } /** * @return bool */ public function IsConnected() { return $this->oImapClient->IsConnected(); } /** * @return bool */ public function IsLoggined() { return $this->oImapClient->IsLoggined(); } /** * @return string */ private function getEnvelopeOrHeadersRequestStringForSimpleList() { return \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( \MailSo\Mime\Enumerations\Header::RETURN_PATH, \MailSo\Mime\Enumerations\Header::RECEIVED, \MailSo\Mime\Enumerations\Header::MIME_VERSION, \MailSo\Mime\Enumerations\Header::FROM_, \MailSo\Mime\Enumerations\Header::TO_, \MailSo\Mime\Enumerations\Header::CC, \MailSo\Mime\Enumerations\Header::SENDER, \MailSo\Mime\Enumerations\Header::REPLY_TO, \MailSo\Mime\Enumerations\Header::DATE, \MailSo\Mime\Enumerations\Header::SUBJECT, \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE, ), true); } /** * @return string */ private function getEnvelopeOrHeadersRequestString() { if (\MailSo\Config::$MessageAllHeaders) { return \MailSo\Imap\Enumerations\FetchType::BODY_HEADER_PEEK; } return \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( \MailSo\Mime\Enumerations\Header::RETURN_PATH, \MailSo\Mime\Enumerations\Header::RECEIVED, \MailSo\Mime\Enumerations\Header::MIME_VERSION, \MailSo\Mime\Enumerations\Header::MESSAGE_ID, \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Header::FROM_, \MailSo\Mime\Enumerations\Header::TO_, \MailSo\Mime\Enumerations\Header::CC, \MailSo\Mime\Enumerations\Header::BCC, \MailSo\Mime\Enumerations\Header::SENDER, \MailSo\Mime\Enumerations\Header::REPLY_TO, \MailSo\Mime\Enumerations\Header::DELIVERED_TO, \MailSo\Mime\Enumerations\Header::IN_REPLY_TO, \MailSo\Mime\Enumerations\Header::REFERENCES, \MailSo\Mime\Enumerations\Header::DATE, \MailSo\Mime\Enumerations\Header::SUBJECT, \MailSo\Mime\Enumerations\Header::SENSITIVITY, \MailSo\Mime\Enumerations\Header::X_MSMAIL_PRIORITY, \MailSo\Mime\Enumerations\Header::IMPORTANCE, \MailSo\Mime\Enumerations\Header::X_PRIORITY, \MailSo\Mime\Enumerations\Header::X_DRAFT_INFO, \MailSo\Mime\Enumerations\Header::RETURN_RECEIPT_TO, \MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO, \MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO, \MailSo\Mime\Enumerations\Header::AUTHENTICATION_RESULTS, \MailSo\Mime\Enumerations\Header::X_DKIM_AUTHENTICATION_RESULTS, \MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE, ), true); // // return \MailSo\Imap\Enumerations\FetchType::ENVELOPE; } /** * @param string $sFolderName * @param string $sMessageFlag * @param bool $bSetAction = true * @param bool $sSkipUnsupportedFlag = false * @param array $aCustomUids = null * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception * @throws \MailSo\Mail\Exceptions\Exception */ public function MessageSetFlagToAll($sFolderName, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false, $aCustomUids = null) { $this->oImapClient->FolderSelect($sFolderName); $oFolderInfo = $this->oImapClient->FolderCurrentInformation(); if (!$oFolderInfo || !$oFolderInfo->IsFlagSupported($sMessageFlag)) { if (!$sSkipUnsupportedFlag) { throw new \MailSo\Mail\Exceptions\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.'); } } if ($oFolderInfo && 0 < $oFolderInfo->Exists) { $sStoreAction = $bSetAction ? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT : \MailSo\Imap\Enumerations\StoreAction::REMOVE_FLAGS_SILENT ; if (is_array($aCustomUids)) { if (0 < count($aCustomUids)) { $this->oImapClient->MessageStoreFlag(implode(',', $aCustomUids), true, array($sMessageFlag), $sStoreAction); } } else { $this->oImapClient->MessageStoreFlag('1:*', false, array($sMessageFlag), $sStoreAction); } } } /** * @param string $sFolderName * @param array $aIndexRange * @param bool $bIndexIsUid * @param string $sMessageFlag * @param bool $bSetAction = true * @param bool $sSkipUnsupportedFlag = false * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception * @throws \MailSo\Mail\Exceptions\Exception */ public function MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false) { $this->oImapClient->FolderSelect($sFolderName); $oFolderInfo = $this->oImapClient->FolderCurrentInformation(); if (!$oFolderInfo || !$oFolderInfo->IsFlagSupported($sMessageFlag)) { if (!$sSkipUnsupportedFlag) { throw new \MailSo\Mail\Exceptions\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.'); } } else { $sStoreAction = $bSetAction ? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT : \MailSo\Imap\Enumerations\StoreAction::REMOVE_FLAGS_SILENT ; $this->oImapClient->MessageStoreFlag(\MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid, array($sMessageFlag), $sStoreAction); } } /** * @param string $sFolderName * @param array $aIndexRange * @param bool $bIndexIsUid * @param bool $bSetAction = true * @param bool $sSkipUnsupportedFlag = false * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSetFlagged($sFolderName, $aIndexRange, $bIndexIsUid, $bSetAction = true, $sSkipUnsupportedFlag = false) { $this->MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, \MailSo\Imap\Enumerations\MessageFlag::FLAGGED, $bSetAction, $sSkipUnsupportedFlag); } /** * @param string $sFolderName * @param bool $bSetAction = true * @param array $aCustomUids = null * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSetSeenToAll($sFolderName, $bSetAction = true, $aCustomUids = null) { $this->MessageSetFlagToAll($sFolderName, \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true, $aCustomUids); } /** * @param string $sFolderName * @param array $aIndexRange * @param bool $bIndexIsUid * @param bool $bSetAction = true * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageSetSeen($sFolderName, $aIndexRange, $bIndexIsUid, $bSetAction = true) { $this->MessageSetFlag($sFolderName, $aIndexRange, $bIndexIsUid, \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true); } /** * @param string $sFolderName * @param int $iIndex * @param bool $bIndexIsUid = true * @param \MailSo\Cache\CacheClient $oCacher = null * @param int $iBodyTextLimit = null * * @return \MailSo\Mail\Message|false * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function Message($sFolderName, $iIndex, $bIndexIsUid = true, $oCacher = null, $iBodyTextLimit = null) { if (!\MailSo\Base\Validator::RangeInt($iIndex, 1)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderSelect($sFolderName); $oBodyStructure = null; $oMessage = false; $aBodyPeekMimeIndexes = array(); $aSignatureMimeIndexes = array(); $aFetchResponse = $this->oImapClient->Fetch(array(\MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE), $iIndex, $bIndexIsUid); if (0 < \count($aFetchResponse) && isset($aFetchResponse[0])) { $oBodyStructure = $aFetchResponse[0]->GetFetchBodyStructure(); if ($oBodyStructure) { $aTextParts = $oBodyStructure->SearchHtmlOrPlainParts(); if (is_array($aTextParts) && 0 < \count($aTextParts)) { foreach ($aTextParts as $oPart) { $aBodyPeekMimeIndexes[] = array($oPart->PartID(), $oPart->Size()); } } $aSignatureParts = $oBodyStructure->SearchByContentType('application/pgp-signature'); if (is_array($aSignatureParts) && 0 < \count($aSignatureParts)) { foreach ($aSignatureParts as $oPart) { $aSignatureMimeIndexes[] = $oPart->PartID(); } } } } $aFetchItems = array( \MailSo\Imap\Enumerations\FetchType::INDEX, \MailSo\Imap\Enumerations\FetchType::UID, \MailSo\Imap\Enumerations\FetchType::RFC822_SIZE, \MailSo\Imap\Enumerations\FetchType::INTERNALDATE, \MailSo\Imap\Enumerations\FetchType::FLAGS, $this->getEnvelopeOrHeadersRequestString() ); if (0 < \count($aBodyPeekMimeIndexes)) { foreach ($aBodyPeekMimeIndexes as $aTextMimeData) { $sLine = \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$aTextMimeData[0].']'; if (\is_numeric($iBodyTextLimit) && 0 < $iBodyTextLimit && $iBodyTextLimit < $aTextMimeData[1]) { $sLine .= '<0.'.((int) $iBodyTextLimit).'>'; } $aFetchItems[] = $sLine; } } if (0 < \count($aSignatureMimeIndexes)) { foreach ($aSignatureMimeIndexes as $sTextMimeIndex) { $aFetchItems[] = \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sTextMimeIndex.']'; } } if (!$oBodyStructure) { $aFetchItems[] = \MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE; } $aFetchResponse = $this->oImapClient->Fetch($aFetchItems, $iIndex, $bIndexIsUid); if (0 < \count($aFetchResponse)) { $oMessage = \MailSo\Mail\Message::NewFetchResponseInstance( $sFolderName, $aFetchResponse[0], $oBodyStructure); } return $oMessage; } /** * @param mixed $mCallback * @param string $sFolderName * @param int $iIndex * @param bool $bIndexIsUid = true, * @param string $sMimeIndex = '' * * @return bool * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageMimeStream($mCallback, $sFolderName, $iIndex, $bIndexIsUid = true, $sMimeIndex = '') { if (!is_callable($mCallback)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderSelect($sFolderName); $sFileName = ''; $sContentType = ''; $sMailEncodingName = ''; $sMimeIndex = trim($sMimeIndex); $aFetchResponse = $this->oImapClient->Fetch(array( 0 === \strlen($sMimeIndex) ? \MailSo\Imap\Enumerations\FetchType::BODY_HEADER_PEEK : \MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sMimeIndex.'.MIME]' ), $iIndex, $bIndexIsUid); if (0 < \count($aFetchResponse)) { $sMime = $aFetchResponse[0]->GetFetchValue( 0 === \strlen($sMimeIndex) ? \MailSo\Imap\Enumerations\FetchType::BODY_HEADER : \MailSo\Imap\Enumerations\FetchType::BODY.'['.$sMimeIndex.'.MIME]' ); if (0 < \strlen($sMime)) { $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sMime); if (0 < \strlen($sMimeIndex)) { $sFileName = $oHeaders->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, \MailSo\Mime\Enumerations\Parameter::FILENAME); if (0 === \strlen($sFileName)) { $sFileName = $oHeaders->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Parameter::NAME); } $sMailEncodingName = $oHeaders->ValueByName( \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING); $sContentType = $oHeaders->ValueByName( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE); } else { $sSubject = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT); $sFileName = 0 === \strlen($sSubject) ? (string) $iIndex : $sSubject; $sFileName .= '.eml'; $sContentType = 'message/rfc822'; } } } $aFetchResponse = $this->oImapClient->Fetch(array( array(\MailSo\Imap\Enumerations\FetchType::BODY_PEEK.'['.$sMimeIndex.']', function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) use ($mCallback, $sMimeIndex, $sMailEncodingName, $sContentType, $sFileName) { if (0 < \strlen($sLiteralAtomUpperCase)) { if (is_resource($rImapLiteralStream) && 'FETCH' === $sParent) { $rMessageMimeIndexStream = (0 === \strlen($sMailEncodingName)) ? $rImapLiteralStream : \MailSo\Base\StreamWrappers\Binary::CreateStream($rImapLiteralStream, \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( $sMailEncodingName, true)); \call_user_func($mCallback, $rMessageMimeIndexStream, $sContentType, $sFileName, $sMimeIndex); } } } )), $iIndex, $bIndexIsUid); return ($aFetchResponse && 1 === \count($aFetchResponse)); } /** * @param string $sFolder * @param array $aIndexRange * @param bool $bIndexIsUid * @param bool $bUseExpunge = true * @param bool $bExpungeAll = false * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageDelete($sFolder, $aIndexRange, $bIndexIsUid, $bUseExpunge = true, $bExpungeAll = false) { if (0 === \strlen($sFolder) || !\is_array($aIndexRange) || 0 === \count($aIndexRange)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderSelect($sFolder); $sIndexRange = \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange); $this->oImapClient->MessageStoreFlag($sIndexRange, $bIndexIsUid, array(\MailSo\Imap\Enumerations\MessageFlag::DELETED), \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT ); if ($bUseExpunge) { $this->oImapClient->MessageExpunge($bIndexIsUid ? $sIndexRange : '', $bIndexIsUid, $bExpungeAll); } return $this; } /** * @param string $sFromFolder * @param string $sToFolder * @param array $aIndexRange * @param bool $bIndexIsUid * @param bool $bUseMoveSupported = false * @param bool $bExpungeAll = false * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageMove($sFromFolder, $sToFolder, $aIndexRange, $bIndexIsUid, $bUseMoveSupported = false, $bExpungeAll = false) { if (0 === \strlen($sFromFolder) || 0 === \strlen($sToFolder) || !\is_array($aIndexRange) || 0 === \count($aIndexRange)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderSelect($sFromFolder); if ($bUseMoveSupported && $this->oImapClient->IsSupported('MOVE')) { $this->oImapClient->MessageMove($sToFolder, \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); } else { $this->oImapClient->MessageCopy($sToFolder, \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); $this->MessageDelete($sFromFolder, $aIndexRange, $bIndexIsUid, true, $bExpungeAll); } return $this; } /** * @param string $sFromFolder * @param string $sToFolder * @param array $aIndexRange * @param bool $bIndexIsUid * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageCopy($sFromFolder, $sToFolder, $aIndexRange, $bIndexIsUid) { if (0 === \strlen($sFromFolder) || 0 === \strlen($sToFolder) || !\is_array($aIndexRange) || 0 === \count($aIndexRange)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderSelect($sFromFolder); $this->oImapClient->MessageCopy($sToFolder, \MailSo\Base\Utils::PrepearFetchSequence($aIndexRange), $bIndexIsUid); return $this; } /** * @return \MailSo\Mail\MailClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderUnSelect() { if ($this->oImapClient->IsSelected()) { $this->oImapClient->FolderUnSelect(); } return $this; } /** * @param resource $rMessageStream * @param int $iMessageStreamSize * @param string $sFolderToSave * @param array $aAppendFlags = null * @param int $iUid = null * * @return \MailSo\Mail\MailClient */ public function MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderToSave, $aAppendFlags = null, &$iUid = null) { if (!\is_resource($rMessageStream) || 0 === \strlen($sFolderToSave)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->MessageAppendStream( $sFolderToSave, $rMessageStream, $iMessageStreamSize, $aAppendFlags, $iUid); return $this; } /** * @param string $sMessageFileName * @param string $sFolderToSave * @param array $aAppendFlags = null * @param int &$iUid = null * * @return \MailSo\Mail\MailClient */ public function MessageAppendFile($sMessageFileName, $sFolderToSave, $aAppendFlags = null, &$iUid = null) { if (!@\is_file($sMessageFileName) || !@\is_readable($sMessageFileName)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $iMessageStreamSize = \filesize($sMessageFileName); $rMessageStream = \fopen($sMessageFileName, 'rb'); $this->MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderToSave, $aAppendFlags, $iUid); if (\is_resource($rMessageStream)) { @fclose($rMessageStream); } return $this; } /** * @param string $sFolderName * @param int $iCount * @param int $iUnseenCount * @param string $sUidNext * @param string $sHighestModSeq * * @return void */ protected function initFolderValues($sFolderName, &$iCount, &$iUnseenCount, &$sUidNext, &$sHighestModSeq = '') { $aTypes = array( \MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES, \MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN, \MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT ); if ($this->oImapClient->IsSupported('CONDSTORE')) { $aTypes[] = \MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ; } $aFolderStatus = $this->oImapClient->FolderStatus($sFolderName, $aTypes); $iCount = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES]) ? (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::MESSAGES] : 0; $iUnseenCount = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN]) ? (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN] : 0; $sUidNext = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT]) ? (string) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UIDNEXT] : '0'; $sHighestModSeq = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ]) ? (string) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::HIGHESTMODSEQ] : ''; if ($this->IsGmail() && ('INBOX' === $sFolderName || '[gmail]' === \strtolower(\substr($sFolderName, 0, 7)))) { $oFolder = $this->oImapClient->FolderCurrentInformation(); if ($oFolder && null !== $oFolder->Exists && $oFolder->FolderName === $sFolderName) { $iSubCount = (int) $oFolder->Exists; if (0 < $iSubCount && $iSubCount < $iCount) { $iCount = $iSubCount; } } } } /** * @return string */ public function GenerateImapClientHash() { return \md5('ImapClientHash/'. $this->oImapClient->GetLogginedUser().'@'. $this->oImapClient->GetConnectedHost().':'. $this->oImapClient->GetConnectedPort() ); } /** * @param string $sFolder * @param int $iCount * @param int $iUnseenCount * @param string $sUidNext * @param string $sHighestModSeq = '' * * @return string */ public function GenerateFolderHash($sFolder, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq = '') { $iUnseenCount = 0; // unneccessery return \md5('FolderHash/'.$sFolder.'-'.$iCount.'-'.$iUnseenCount.'-'.$sUidNext.'-'. $sHighestModSeq.'-'.$this->GenerateImapClientHash().'-'. \MailSo\Config::$MessageListPermanentFilter ); } /** * @param string $sFolderName * @param string $sPrevUidNext * @param string $sCurrentUidNext * * @return array */ private function getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sCurrentUidNext) { $aNewMessages = array(); if (0 < \strlen($sPrevUidNext) && (string) $sPrevUidNext !== (string) $sCurrentUidNext) { $this->oImapClient->FolderSelect($sFolderName); $aFetchResponse = $this->oImapClient->Fetch(array( \MailSo\Imap\Enumerations\FetchType::INDEX, \MailSo\Imap\Enumerations\FetchType::UID, \MailSo\Imap\Enumerations\FetchType::FLAGS, \MailSo\Imap\Enumerations\FetchType::BuildBodyCustomHeaderRequest(array( \MailSo\Mime\Enumerations\Header::FROM_, \MailSo\Mime\Enumerations\Header::SUBJECT, \MailSo\Mime\Enumerations\Header::CONTENT_TYPE )) ), $sPrevUidNext.':*', true); if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) { foreach ($aFetchResponse as /* @var $oFetchResponse \MailSo\Imap\FetchResponse */ $oFetchResponse) { $aFlags = \array_map('strtolower', $oFetchResponse->GetFetchValue( \MailSo\Imap\Enumerations\FetchType::FLAGS)); if (!\in_array(\strtolower(\MailSo\Imap\Enumerations\MessageFlag::SEEN), $aFlags)) { $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); $sHeaders = $oFetchResponse->GetHeaderFieldsValue(); $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sHeaders); $sContentTypeCharset = $oHeaders->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Parameter::CHARSET ); $sCharset = ''; if (0 < \strlen($sContentTypeCharset)) { $sCharset = $sContentTypeCharset; } if (0 < \strlen($sCharset)) { $oHeaders->SetParentCharset($sCharset); } $aNewMessages[] = array( 'Folder' => $sFolderName, 'Uid' => $sUid, 'Subject' => $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, 0 === \strlen($sCharset)), 'From' => $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, 0 === \strlen($sCharset)) ); } } } } return $aNewMessages; } /** * @param string $sFolderName * @param string $sPrevUidNext = '' * @param array $aUids = '' * * @return string * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderInformation($sFolderName, $sPrevUidNext = '', $aUids = array()) { $aFlags = array(); $bSelect = false; if ($this->IsGmail() && ('INBOX' === $sFolderName || '[gmail]' === \strtolower(\substr($sFolderName, 0, 7)))) { $this->oImapClient->FolderSelect($sFolderName); $bSelect = true; } if (\is_array($aUids) && 0 < \count($aUids)) { if (!$bSelect) { $this->oImapClient->FolderSelect($sFolderName); } $aFetchResponse = $this->oImapClient->Fetch(array( \MailSo\Imap\Enumerations\FetchType::INDEX, \MailSo\Imap\Enumerations\FetchType::UID, \MailSo\Imap\Enumerations\FetchType::FLAGS ), \MailSo\Base\Utils::PrepearFetchSequence($aUids), true); if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) { foreach ($aFetchResponse as $oFetchResponse) { $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); $aFlags[(\is_numeric($sUid) ? (int) $sUid : 0)] = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::FLAGS); } } } $iCount = 0; $iUnseenCount = 0; $sUidNext = '0'; $sHighestModSeq = ''; $this->initFolderValues($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); $aResult = array( 'Folder' => $sFolderName, 'Hash' => $this->GenerateFolderHash($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq), 'MessageCount' => $iCount, 'MessageUnseenCount' => $iUnseenCount, 'UidNext' => $sUidNext, 'Flags' => $aFlags, 'HighestModSeq' => $sHighestModSeq, 'NewMessages' => 'INBOX' === $sFolderName && \MailSo\Config::$CheckNewMessages ? $this->getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sUidNext) : array() ); return $aResult; } /** * @param string $sFolderName * * @return string * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function FolderHash($sFolderName) { $iCount = 0; $iUnseenCount = 0; $sUidNext = '0'; $sHighestModSeq = ''; $this->initFolderValues($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); return $this->GenerateFolderHash($sFolderName, $iCount, $iUnseenCount, $sUidNext, $sHighestModSeq); } /** * @return int * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function InboxUnreadCount() { $aFolderStatus = $this->oImapClient->FolderStatus('INBOX', array( \MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN )); $iResult = isset($aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN]) ? (int) $aFolderStatus[\MailSo\Imap\Enumerations\FolderResponseStatus::UNSEEN] : 0; return 0 < $iResult ? $iResult : 0; } /** * @return bool */ public function IsGmail() { return 'ssl://imap.gmail.com' === \strtolower($this->oImapClient->GetConnectedHost()); } /** * @param string $sSearch * @param bool $bDetectGmail = true * * @return string */ private function escapeSearchString($sSearch, $bDetectGmail = true) { return !\MailSo\Base\Utils::IsAscii($sSearch) ? '{'.\strlen($sSearch).'}'."\r\n".$sSearch : $this->oImapClient->EscapeString($sSearch); // return ($bDetectGmail && !\MailSo\Base\Utils::IsAscii($sSearch) && $this->IsGmail()) // ? '{'.\strlen($sSearch).'+}'."\r\n".$sSearch : $this->oImapClient->EscapeString($sSearch); } /** * @param string $sDate * @param int $iTimeZoneOffset * * @return int */ private function parseSearchDate($sDate, $iTimeZoneOffset) { $iResult = 0; if (0 < \strlen($sDate)) { $oDateTime = \DateTime::createFromFormat('Y.m.d', $sDate, \MailSo\Base\DateTimeHelper::GetUtcTimeZoneObject()); return $oDateTime ? $oDateTime->getTimestamp() - $iTimeZoneOffset : 0; } return $iResult; } /** * @param string $sSize * * @return int */ private function parseFriendlySize($sSize) { $sSize = preg_replace('/[^0-9bBkKmM]/', '', $sSize); $iResult = 0; $aMatch = array(); if (\preg_match('/([\d]+)(B|KB|M|MB|G|GB)$/i', $sSize, $aMatch) && isset($aMatch[1], $aMatch[2])) { $iResult = (int) $aMatch[1]; switch (\strtoupper($aMatch[2])) { case 'K': case 'KB': $iResult *= 1024; case 'M': case 'MB': $iResult *= 1024; case 'G': case 'GB': $iResult *= 1024; } } else { $iResult = (int) $sSize; } return $iResult; } /** * @param string $sSearch * * @return array */ private function parseSearchString($sSearch) { $aResult = array( 'OTHER' => '' ); $aCache = array(); $sReg = 'e?mail|from|to|subject|has|is|date|text|body|size|larger|bigger|smaller|maxsize|minsize'; $sSearch = \MailSo\Base\Utils::StripSpaces($sSearch); $sSearch = \trim(\preg_replace('/('.$sReg.'): /i', '\\1:', $sSearch)); $mMatch = array(); \preg_match_all('/".*?(? $sName) { if (isset($mMatch[2][$iIndex]) && 0 < \strlen($mMatch[2][$iIndex])) { $sName = \strtoupper($sName); $sValue = $mMatch[2][$iIndex]; switch ($sName) { case 'TEXT': case 'BODY': case 'EMAIL': case 'MAIL': case 'FROM': case 'TO': case 'SUBJECT': case 'IS': case 'HAS': case 'SIZE': case 'SMALLER': case 'LARGER': case 'BIGGER': case 'MAXSIZE': case 'MINSIZE': case 'DATE': if ('MAIL' === $sName) { $sName = 'EMAIL'; } if ('BODY' === $sName) { $sName = 'TEXT'; } if ('SIZE' === $sName || 'BIGGER' === $sName || 'MINSIZE' === $sName) { $sName = 'LARGER'; } if ('MAXSIZE' === $sName) { $sName = 'SMALLER'; } $aResult[$sName] = $sValue; break; } } } } $aResult['OTHER'] = $sSearch; foreach ($aResult as $sName => $sValue) { if (isset($aCache[$sValue])) { $aResult[$sName] = \trim($aCache[$sValue], '"\' '); } } return $aResult; } /** * @param string $sSearch * @param string $sFilter * @param int $iTimeZoneOffset = 0 * @param bool $bUseCache = true * * @return string */ private function getImapSearchCriterias($sSearch, $sFilter, $iTimeZoneOffset = 0, &$bUseCache = true) { $bUseCache = true; $iTimeFilter = 0; $aCriteriasResult = array(); if (0 < \MailSo\Config::$MessageListDateFilter) { $iD = \time() - 3600 * 24 * 30 * \MailSo\Config::$MessageListDateFilter; $iTimeFilter = \gmmktime(1, 1, 1, \gmdate('n', $iD), 1, \gmdate('Y', $iD)); } if (0 < \strlen(\trim($sSearch))) { $sGmailRawSearch = ''; $sResultBodyTextSearch = ''; $aLines = $this->parseSearchString($sSearch); $bIsGmail = $this->oImapClient->IsSupported('X-GM-EXT-1'); if (1 === \count($aLines) && isset($aLines['OTHER'])) { $sValue = $this->escapeSearchString($aLines['OTHER']); if (\MailSo\Config::$MessageListFastSimpleSearch) { $aCriteriasResult[] = 'OR OR OR'; $aCriteriasResult[] = 'FROM'; $aCriteriasResult[] = $sValue; $aCriteriasResult[] = 'TO'; $aCriteriasResult[] = $sValue; $aCriteriasResult[] = 'CC'; $aCriteriasResult[] = $sValue; $aCriteriasResult[] = 'SUBJECT'; $aCriteriasResult[] = $sValue; } else { $aCriteriasResult[] = 'TEXT'; $aCriteriasResult[] = $sValue; } } else { if (isset($aLines['EMAIL'])) { $sValue = $this->escapeSearchString($aLines['EMAIL']); $aCriteriasResult[] = 'OR OR'; $aCriteriasResult[] = 'FROM'; $aCriteriasResult[] = $sValue; $aCriteriasResult[] = 'TO'; $aCriteriasResult[] = $sValue; $aCriteriasResult[] = 'CC'; $aCriteriasResult[] = $sValue; unset($aLines['EMAIL']); } if (isset($aLines['TO'])) { $sValue = $this->escapeSearchString($aLines['TO']); $aCriteriasResult[] = 'OR'; $aCriteriasResult[] = 'TO'; $aCriteriasResult[] = $sValue; $aCriteriasResult[] = 'CC'; $aCriteriasResult[] = $sValue; unset($aLines['TO']); } $sMainText = ''; foreach ($aLines as $sName => $sRawValue) { if ('' === \trim($sRawValue)) { continue; } $sValue = $this->escapeSearchString($sRawValue); switch ($sName) { case 'FROM': $aCriteriasResult[] = 'FROM'; $aCriteriasResult[] = $sValue; break; case 'SUBJECT': $aCriteriasResult[] = 'SUBJECT'; $aCriteriasResult[] = $sValue; break; case 'OTHER': case 'TEXT': $sMainText .= ' '.$sRawValue; break; case 'HAS': $aValue = \explode(',', \strtolower($sRawValue)); $aValue = \array_map('trim', $aValue); $aCompareArray = array('file', 'files', 'attach', 'attachs', 'attachment', 'attachments'); if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) { if ($bIsGmail) { $sGmailRawSearch .= ' has:attachment'; } else { // Simple, is not detailed search (Sometimes doesn't work) $aCriteriasResult[] = 'OR OR OR'; $aCriteriasResult[] = 'HEADER Content-Type application/'; $aCriteriasResult[] = 'HEADER Content-Type multipart/m'; $aCriteriasResult[] = 'HEADER Content-Type multipart/signed'; $aCriteriasResult[] = 'HEADER Content-Type multipart/report'; } } case 'IS': $aValue = \explode(',', \strtolower($sRawValue)); $aValue = \array_map('trim', $aValue); $aCompareArray = array('flag', 'flagged', 'star', 'starred', 'pinned'); $aCompareArray2 = array('unflag', 'unflagged', 'unstar', 'unstarred', 'unpinned'); if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) { $aCriteriasResult[] = 'FLAGGED'; $bUseCache = false; } else if (\count($aCompareArray2) > \count(\array_diff($aCompareArray2, $aValue))) { $aCriteriasResult[] = 'UNFLAGGED'; $bUseCache = false; } $aCompareArray = array('unread', 'unseen'); $aCompareArray2 = array('read', 'seen'); if (\count($aCompareArray) > \count(\array_diff($aCompareArray, $aValue))) { $aCriteriasResult[] = 'UNSEEN'; $bUseCache = false; } else if (\count($aCompareArray2) > \count(\array_diff($aCompareArray2, $aValue))) { $aCriteriasResult[] = 'SEEN'; $bUseCache = false; } break; case 'LARGER': $aCriteriasResult[] = 'LARGER'; $aCriteriasResult[] = $this->parseFriendlySize($sRawValue); break; case 'SMALLER': $aCriteriasResult[] = 'SMALLER'; $aCriteriasResult[] = $this->parseFriendlySize($sRawValue); break; case 'DATE': $iDateStampFrom = $iDateStampTo = 0; $sDate = $sRawValue; $aDate = \explode('/', $sDate); if (\is_array($aDate) && 2 === \count($aDate)) { if (0 < \strlen($aDate[0])) { $iDateStampFrom = $this->parseSearchDate($aDate[0], $iTimeZoneOffset); } if (0 < \strlen($aDate[1])) { $iDateStampTo = $this->parseSearchDate($aDate[1], $iTimeZoneOffset); $iDateStampTo += 60 * 60 * 24; } } else { if (0 < \strlen($sDate)) { $iDateStampFrom = $this->parseSearchDate($sDate, $iTimeZoneOffset); $iDateStampTo = $iDateStampFrom + 60 * 60 * 24; } } if (0 < $iDateStampFrom) { $aCriteriasResult[] = 'SINCE'; $aCriteriasResult[] = \gmdate('j-M-Y', $iTimeFilter > $iDateStampFrom ? $iTimeFilter : $iDateStampFrom); $iTimeFilter = 0; } if (0 < $iDateStampTo) { $aCriteriasResult[] = 'BEFORE'; $aCriteriasResult[] = \gmdate('j-M-Y', $iDateStampTo); } break; } } if ('' !== \trim($sMainText)) { $sMainText = \trim(\MailSo\Base\Utils::StripSpaces($sMainText), '"'); if ($bIsGmail) { $sGmailRawSearch .= ' '.$sMainText; } else { $sResultBodyTextSearch .= ' '.$sMainText; } } } $sGmailRawSearch = \trim($sGmailRawSearch); if ($bIsGmail && 0 < \strlen($sGmailRawSearch)) { $aCriteriasResult[] = 'X-GM-RAW'; $aCriteriasResult[] = $this->escapeSearchString($sGmailRawSearch, false); } $sResultBodyTextSearch = \trim($sResultBodyTextSearch); if (0 < \strlen($sResultBodyTextSearch)) { $aCriteriasResult[] = 'BODY'; $aCriteriasResult[] = $this->escapeSearchString($sResultBodyTextSearch); } } $sCriteriasResult = \trim(\implode(' ', $aCriteriasResult)); if (0 < $iTimeFilter) { $sCriteriasResult .= ' SINCE '.\gmdate('j-M-Y', $iTimeFilter); } $sCriteriasResult = \trim($sCriteriasResult); if (\MailSo\Config::$MessageListUndeletedOnly) { $sCriteriasResult = \trim($sCriteriasResult.' UNDELETED'); } $sFilter = \trim($sFilter); if ('' !== $sFilter) { $sCriteriasResult .= ' '.$sFilter; } $sCriteriasResult = \trim($sCriteriasResult); if ('' !== \MailSo\Config::$MessageListPermanentFilter) { $sCriteriasResult = \trim($sCriteriasResult.' '.\MailSo\Config::$MessageListPermanentFilter); } $sCriteriasResult = \trim($sCriteriasResult); if ('' === $sCriteriasResult) { $sCriteriasResult = 'ALL'; } return $sCriteriasResult; } /** * @param array $aThreads * @return array */ private function threadArrayMap($aThreads) { $aNew = array(); foreach ($aThreads as $mItem) { if (!\is_array($mItem)) { $aNew[] = $mItem; } else { $mMap = $this->threadArrayMap($mItem); if (\is_array($mMap) && 0 < \count($mMap)) { $aNew = \array_merge($aNew, $mMap); } } } return $aNew; } /** * @param array $aThreads * * @return array */ private function compileThreadArray($aThreads) { $aResult = array(); foreach ($aThreads as $mItem) { if (\is_array($mItem)) { $aMap = $this->threadArrayMap($mItem); if (\is_array($aMap)) { if (1 < \count($aMap)) { $aResult[] = $aMap; } else if (0 < \count($aMap)) { $aResult[] = $aMap[0]; } } } else { $aResult[] = $mItem; } } return $aResult; } /** * @param string $sFolderName * @param string $sFolderHash * @param array $aIndexOrUids * @param \MailSo\Cache\CacheClient $oCacher * @param bool $bCacheOnly = false * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageListThreadsMap($sFolderName, $sFolderHash, $aIndexOrUids, $oCacher, $bCacheOnly = false) { $iThreadLimit = \MailSo\Config::$LargeThreadLimit; $sSearchHash = ''; if (0 < \MailSo\Config::$MessageListDateFilter) { $iD = \time() - 3600 * 24 * 30 * \MailSo\Config::$MessageListDateFilter; $iTimeFilter = \gmmktime(1, 1, 1, \gmdate('n', $iD), 1, \gmdate('Y', $iD)); $sSearchHash .= ' SINCE '.\gmdate('j-M-Y', $iTimeFilter); } if ('' === \trim($sSearchHash)) { $sSearchHash = 'ALL'; } if ($oCacher && $oCacher->IsInited()) { $sSerializedHashKey = 'ThreadsMapSorted/'.$sSearchHash.'/'. 'Limit='.$iThreadLimit.'/'.$sFolderName.'/'.$sFolderHash; if ($this->oLogger) { $this->oLogger->Write($sSerializedHashKey); } $sSerializedUids = $oCacher->Get($sSerializedHashKey); if (!empty($sSerializedUids)) { $aSerializedUids = @\json_decode($sSerializedUids, true); if (isset($aSerializedUids['ThreadsUids']) && \is_array($aSerializedUids['ThreadsUids'])) { if ($this->oLogger) { $this->oLogger->Write('Get Serialized Thread UIDS from cache ("'.$sFolderName.'" / '.$sSearchHash.') [count:'.\count($aSerializedUids['ThreadsUids']).']'); } return $aSerializedUids['ThreadsUids']; } } } if ($bCacheOnly) { return null; } $this->oImapClient->FolderExamine($sFolderName); $aThreadUids = array(); try { $aThreadUids = $this->oImapClient->MessageSimpleThread($sSearchHash); } catch (\MailSo\Imap\Exceptions\RuntimeException $oException) { unset($oException); $aThreadUids = array(); } $aResult = array(); $aCompiledThreads = $this->compileThreadArray($aThreadUids); foreach ($aCompiledThreads as $mData) { if (\is_array($mData)) { foreach ($mData as $mSubData) { $aResult[(int) $mSubData] = \array_diff($mData, array((int) $mSubData)); } } else if (\is_int($mData) || \is_string($mData)) { $aResult[(int) $mData] = (int) $mData; } } $aParentsMap = array(); foreach ($aIndexOrUids as $iUid) { if (isset($aResult[$iUid]) && \is_array($aResult[$iUid])) { foreach ($aResult[$iUid] as $iTempUid) { $aParentsMap[$iTempUid] = $iUid; if (isset($aResult[$iTempUid])) { unset($aResult[$iTempUid]); } } } } $aSortedThreads = array(); foreach ($aIndexOrUids as $iUid) { if (isset($aResult[$iUid])) { $aSortedThreads[$iUid] = $iUid; } } foreach ($aIndexOrUids as $iUid) { if (!isset($aSortedThreads[$iUid]) && isset($aParentsMap[$iUid]) && isset($aSortedThreads[$aParentsMap[$iUid]])) { if (!\is_array($aSortedThreads[$aParentsMap[$iUid]])) { $aSortedThreads[$aParentsMap[$iUid]] = array(); } $aSortedThreads[$aParentsMap[$iUid]][] = $iUid; } } $aResult = $aSortedThreads; unset($aParentsMap, $aSortedThreads); $aTemp = array(); foreach ($aResult as $iUid => $mValue) { if (0 < $iThreadLimit && \is_array($mValue) && $iThreadLimit < \count($mValue)) { $aParts = \array_chunk($mValue, $iThreadLimit); if (0 < count($aParts)) { foreach ($aParts as $iIndex => $aItem) { if (0 === $iIndex) { $aResult[$iUid] = $aItem; } else if (0 < $iIndex && \is_array($aItem)) { $mFirst = \array_shift($aItem); if (!empty($mFirst)) { $aTemp[$mFirst] = 0 < \count($aItem) ? $aItem : $mFirst; } } } } } } foreach ($aTemp as $iUid => $mValue) { $aResult[$iUid] = $mValue; } unset($aTemp); $aLastResult = array(); foreach ($aIndexOrUids as $iUid) { if (isset($aResult[$iUid])) { $aLastResult[$iUid] = $aResult[$iUid]; } } $aResult = $aLastResult; unset($aLastResult); if ($oCacher && $oCacher->IsInited() && !empty($sSerializedHashKey)) { $oCacher->Set($sSerializedHashKey, @\json_encode(array( 'ThreadsUids' => $aResult ))); if ($this->oLogger) { $this->oLogger->Write('Save Serialized Thread UIDS to cache ("'.$sFolderName.'" / '.$sSearchHash.') [count:'.\count($aResult).']'); } } return $aResult; } /** * @param \MailSo\Mail\MessageCollection &$oMessageCollection * @param array $aRequestIndexOrUids * @param bool $bIndexAsUid * @param bool $bSimple = false * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageListByRequestIndexOrUids(&$oMessageCollection, $aRequestIndexOrUids, $bIndexAsUid, $bSimple = false) { if (\is_array($aRequestIndexOrUids) && 0 < \count($aRequestIndexOrUids)) { $aFetchResponse = $this->oImapClient->Fetch(array( \MailSo\Imap\Enumerations\FetchType::INDEX, \MailSo\Imap\Enumerations\FetchType::UID, \MailSo\Imap\Enumerations\FetchType::RFC822_SIZE, \MailSo\Imap\Enumerations\FetchType::INTERNALDATE, \MailSo\Imap\Enumerations\FetchType::FLAGS, \MailSo\Imap\Enumerations\FetchType::BODYSTRUCTURE, $bSimple ? $this->getEnvelopeOrHeadersRequestStringForSimpleList() : $this->getEnvelopeOrHeadersRequestString() ), \MailSo\Base\Utils::PrepearFetchSequence($aRequestIndexOrUids), $bIndexAsUid); if (\is_array($aFetchResponse) && 0 < \count($aFetchResponse)) { $aFetchIndexArray = array(); $oFetchResponseItem = null; foreach ($aFetchResponse as /* @var $oFetchResponseItem \MailSo\Imap\FetchResponse */ &$oFetchResponseItem) { $aFetchIndexArray[($bIndexAsUid) ? $oFetchResponseItem->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID) : $oFetchResponseItem->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::INDEX)] =& $oFetchResponseItem; unset($oFetchResponseItem); } foreach ($aRequestIndexOrUids as $iFUid) { if (isset($aFetchIndexArray[$iFUid])) { $oMessageCollection->Add( Message::NewFetchResponseInstance( $oMessageCollection->FolderName, $aFetchIndexArray[$iFUid])); } } } } } /** * @return bool * * @throws \MailSo\Net\Exceptions\Exception */ public function IsThreadsSupported() { return $this->oImapClient->IsSupported('THREAD=REFS') || $this->oImapClient->IsSupported('THREAD=REFERENCES') || $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT'); } /** * @param string $sFolderName * @param array $aUids * * @return \MailSo\Mail\MessageCollection * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageListSimple($sFolderName, $aUids) { if (0 === \strlen($sFolderName) || !\MailSo\Base\Validator::NotEmptyArray($aUids)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderExamine($sFolderName); $oMessageCollection = \MailSo\Mail\MessageCollection::NewInstance(); $oMessageCollection->FolderName = $sFolderName; $this->MessageListByRequestIndexOrUids($oMessageCollection, $aUids, true, true); return $oMessageCollection->GetAsArray(); } /** * @param \MailSo\Cache\CacheClient|null $oCacher * @param string $sSearch * @param string $sFilter * @param string $sFolderName * @param string $sFolderHash * @param bool $bUseSortIfSupported = false * * @return array * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function GetUids($oCacher, $sSearch, $sFilter, $sFolderName, $sFolderHash, $bUseSortIfSupported = false) { $aResultUids = false; $bUidsFromCacher = false; $bUseCacheAfterSearch = true; $sSerializedHash = ''; $sSerializedLog = ''; $bUseSortIfSupported = $bUseSortIfSupported ? !!$this->oImapClient->IsSupported('SORT') : false; if (0 < \strlen($sSearch)) { $bUseSortIfSupported = false; } $sSearchCriterias = $this->getImapSearchCriterias($sSearch, $sFilter, 0, $bUseCacheAfterSearch); if ($bUseCacheAfterSearch && $oCacher && $oCacher->IsInited()) { $sSerializedHash = 'GetUids/'. ($bUseSortIfSupported ? 'S': 'N').'/'. $this->GenerateImapClientHash().'/'. $sFolderName.'/'.$sSearchCriterias; $sSerializedLog = '"'.$sFolderName.'" / '.$sSearchCriterias.''; $sSerialized = $oCacher->Get($sSerializedHash); if (!empty($sSerialized)) { $aSerialized = @\json_decode($sSerialized, true); if (\is_array($aSerialized) && isset($aSerialized['FolderHash'], $aSerialized['Uids']) && $sFolderHash === $aSerialized['FolderHash'] && \is_array($aSerialized['Uids']) ) { if ($this->oLogger) { $this->oLogger->Write('Get Serialized UIDS from cache ('.$sSerializedLog.') [count:'.\count($aSerialized['Uids']).']'); } $aResultUids = $aSerialized['Uids']; $bUidsFromCacher = true; } } } if (!\is_array($aResultUids)) { $aResultUids = $bUseSortIfSupported ? $this->oImapClient->MessageSimpleSort(array('REVERSE ARRIVAL'), $sSearchCriterias, true) : $this->oImapClient->MessageSimpleSearch($sSearchCriterias, true, \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? '' : 'UTF-8') ; if (!$bUidsFromCacher && $bUseCacheAfterSearch && \is_array($aResultUids) && $oCacher && $oCacher->IsInited() && 0 < \strlen($sSerializedHash)) { $oCacher->Set($sSerializedHash, @\json_encode(array( 'FolderHash' => $sFolderHash, 'Uids' => $aResultUids ))); if ($this->oLogger) { $this->oLogger->Write('Save Serialized UIDS to cache ('.$sSerializedLog.') [count:'.\count($aResultUids).']'); } } } return \is_array($aResultUids) ? $aResultUids : array(); } /** * @param string $sFolderName * @param int $iOffset = 0 * @param int $iLimit = 10 * @param string $sSearch = '' * @param string $sPrevUidNext = '' * @param \MailSo\Cache\CacheClient|null $oCacher = null * @param bool $bUseSortIfSupported = false * @param bool $bUseThreadSortIfSupported = false * @param bool $bUseESearchOrESortRequest = false * @param string $sThreadUid = '' * @param string $sFilter = '' * * @return \MailSo\Mail\MessageCollection * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ public function MessageList($sFolderName, $iOffset = 0, $iLimit = 10, $sSearch = '', $sPrevUidNext = '', $oCacher = null, $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $sThreadUid = '', $sFilter = '') { $sFilter = \trim($sFilter); $sSearch = \trim($sSearch); if (!\MailSo\Base\Validator::RangeInt($iOffset, 0) || !\MailSo\Base\Validator::RangeInt($iLimit, 0, 999)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $bUseFilter = '' !== $sFilter; $this->oImapClient->FolderSelect($sFolderName); $oMessageCollection = MessageCollection::NewInstance(); $oMessageCollection->FolderName = $sFolderName; $oMessageCollection->Offset = $iOffset; $oMessageCollection->Limit = $iLimit; $oMessageCollection->Search = $sSearch; $oMessageCollection->ThreadUid = $sThreadUid; $oMessageCollection->Filtered = '' !== \MailSo\Config::$MessageListPermanentFilter; $aUids = array(); $mAllSortedUids = null; $mAllThreads = null; $iThreadUid = empty($sThreadUid) ? 0 : (int) $sThreadUid; $iMessageRealCount = 0; $iMessageUnseenCount = 0; $sUidNext = '0'; $sHighestModSeq = ''; $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false; $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? ($this->oImapClient->IsSupported('THREAD=REFS') || $this->oImapClient->IsSupported('THREAD=REFERENCES') || $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT')) : false; if (!empty($sThreadUid) && !$bUseThreadSortIfSupported) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } if (!$oCacher || !($oCacher instanceof \MailSo\Cache\CacheClient)) { $oCacher = null; } $this->initFolderValues($sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext, $sHighestModSeq); if ($bUseFilter) { $iMessageUnseenCount = 0; } $oMessageCollection->FolderHash = $this->GenerateFolderHash( $sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext, $sHighestModSeq); $oMessageCollection->UidNext = $sUidNext; if (empty($sThreadUid) && 0 < \strlen($sPrevUidNext) && 'INBOX' === $sFolderName) { $oMessageCollection->NewMessages = $this->getFolderNextMessageInformation( $sFolderName, $sPrevUidNext, $sUidNext); } $bSearch = false; $bMessageListOptimization = 0 < \MailSo\Config::$MessageListCountLimitTrigger && \MailSo\Config::$MessageListCountLimitTrigger < $iMessageRealCount; if ($bMessageListOptimization) { $bUseSortIfSupported = false; $bUseThreadSortIfSupported = false; } if (0 < $iMessageRealCount && !$bMessageListOptimization) { $mAllSortedUids = $this->GetUids($oCacher, '', $sFilter, $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); $mAllThreads = $bUseThreadSortIfSupported ? $this->MessageListThreadsMap( $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $mAllSortedUids, $oCacher) : null; if ($bUseThreadSortIfSupported && 0 < $iThreadUid && \is_array($mAllThreads)) { $aUids = array(); $iResultRootUid = 0; if (isset($mAllThreads[$iThreadUid])) { $iResultRootUid = $iThreadUid; if (\is_array($mAllThreads[$iThreadUid])) { $aUids = $mAllThreads[$iThreadUid]; } } else { foreach ($mAllThreads as $iRootUid => $mSubUids) { if (\is_array($mSubUids) && \in_array($iThreadUid, $mSubUids)) { $iResultRootUid = $iRootUid; $aUids = $mSubUids; continue; } } } if (0 < $iResultRootUid && \in_array($iResultRootUid, $mAllSortedUids)) { \array_unshift($aUids, $iResultRootUid); } } else if ($bUseThreadSortIfSupported && \is_array($mAllThreads)) { $aUids = \array_keys($mAllThreads); } else { $bUseThreadSortIfSupported = false; $aUids = $mAllSortedUids; } if (0 < \strlen($sSearch) && \is_array($aUids)) { $aSearchedUids = $this->GetUids($oCacher, $sSearch, $sFilter, $oMessageCollection->FolderName, $oMessageCollection->FolderHash); if (\is_array($aSearchedUids) && 0 < \count($aSearchedUids)) { $aFlippedSearchedUids = \array_flip($aSearchedUids); $bSearch = true; $aNewUids = array(); foreach ($aUids as $iUid) { if (isset($aFlippedSearchedUids[$iUid])) { $aNewUids[] = $iUid; } else if ($bUseThreadSortIfSupported && 0 === $iThreadUid && isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid])) { foreach ($mAllThreads[$iUid] as $iSubUid) { if (isset($aFlippedSearchedUids[$iSubUid])) { $aNewUids[] = $iUid; continue; } } } } $aUids = \array_unique($aNewUids); unset($aNewUids); } else { $aUids = array(); } } if (\is_array($aUids)) { $oMessageCollection->MessageCount = $iMessageRealCount; $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount; $oMessageCollection->MessageResultCount = \count($aUids); if (0 < \count($aUids)) { $aRequestUids = \array_slice($aUids, $iOffset, $iLimit); $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true); } } } else if (0 < $iMessageRealCount) { if ($this->oLogger) { $this->oLogger->Write('List optimization (count: '.$iMessageRealCount. ', limit:'.\MailSo\Config::$MessageListCountLimitTrigger.')'); } $oMessageCollection->MessageCount = $iMessageRealCount; $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount; if (0 < \strlen($sSearch) || $bUseFilter) { $aUids = $this->GetUids($oCacher, $sSearch, $sFilter, $oMessageCollection->FolderName, $oMessageCollection->FolderHash); if (0 < \count($aUids)) { $oMessageCollection->MessageResultCount = \count($aUids); $aRequestUids = \array_slice($aUids, $iOffset, $iLimit); $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestUids, true); } else { $oMessageCollection->MessageResultCount = 0; } } else { $oMessageCollection->MessageResultCount = $iMessageRealCount; if (1 < $iMessageRealCount) { $aRequestIndexes = \array_slice(array_reverse(range(1, $iMessageRealCount)), $iOffset, $iLimit); } else { $aRequestIndexes = \array_slice(array(1), $iOffset, $iLimit); } $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestIndexes, false); } } if ($bUseThreadSortIfSupported && 0 === $iThreadUid && \is_array($mAllThreads) && 0 < \count($mAllThreads)) { $oMessageCollection->ForeachList(function (/* @var $oMessage \MailSo\Mail\Message */ $oMessage) use ($mAllThreads) { $iUid = $oMessage->Uid(); if (isset($mAllThreads[$iUid]) && \is_array($mAllThreads[$iUid]) && 0 < \count($mAllThreads[$iUid])) { $aSubThreads = $mAllThreads[$iUid]; \array_unshift($aSubThreads, $iUid); $oMessage->SetThreads(\array_map('trim', $aSubThreads)); unset($aSubThreads); } }); } return $oMessageCollection; } /** * @return array|false */ public function Quota() { return $this->oImapClient->Quota(); } /** * @param string $sFolderName * @param string $sMessageId * * @return int|null */ public function FindMessageUidByMessageId($sFolderName, $sMessageId) { if (0 === \strlen($sMessageId)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderExamine($sFolderName); $aUids = $this->oImapClient->MessageSimpleSearch( 'HEADER Message-ID '.$sMessageId, true); return \is_array($aUids) && 1 === \count($aUids) && \is_numeric($aUids[0]) ? (int) $aUids[0] : null; } /** * @param array $aMailFoldersHelper * @param int $iOptimizationLimit = 0 * * @return array */ public function folderListOptimization($aMailFoldersHelper, $iOptimizationLimit = 0) { // optimization if (10 < $iOptimizationLimit && \is_array($aMailFoldersHelper) && $iOptimizationLimit < \count($aMailFoldersHelper)) { if ($this->oLogger) { $this->oLogger->Write('Start optimization (limit:'.$iOptimizationLimit.') for '.\count($aMailFoldersHelper).' folders'); } $iForeachLimit = 1; $aFilteredNames = array( 'inbox', 'sent', 'send', 'outbox', 'sentmail', 'sendmail', 'drafts', 'draft', 'junk', 'spam', 'spambucket', 'trash', 'bin', 'deleted', 'archives', 'archive', 'allmail', 'all', 'starred', 'flagged', 'important', 'contacts', 'chats' ); $aNewMailFoldersHelper = array(); $iCountLimit = $iForeachLimit; foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) { // mandatory folders if ($oFolder && \in_array(\str_replace(' ', '', \strtolower($oFolder->NameRaw())), $aFilteredNames)) { $aNewMailFoldersHelper[] = $oFolder; $aMailFoldersHelper[$iIndex] = null; } } foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) { // subscribed folders if ($oFolder && $oFolder->IsSubscribed()) { $aNewMailFoldersHelper[] = $oFolder; $aMailFoldersHelper[$iIndex] = null; $iCountLimit--; } if (0 > $iCountLimit) { if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) { break; } else { $iCountLimit = $iForeachLimit; } } } $iCountLimit = $iForeachLimit; if ($iOptimizationLimit >= \count($aNewMailFoldersHelper)) { // name filter foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) { if ($oFolder && !\preg_match('/[{}\[\]]/', $oFolder->NameRaw())) { $aNewMailFoldersHelper[] = $oFolder; $aMailFoldersHelper[$iIndex] = null; $iCountLimit--; } if (0 > $iCountLimit) { if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) { break; } else { $iCountLimit = $iForeachLimit; } } } } $iCountLimit = $iForeachLimit; if ($iOptimizationLimit >= \count($aNewMailFoldersHelper)) { // other foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) { if ($oFolder) { $aNewMailFoldersHelper[] = $oFolder; $aMailFoldersHelper[$iIndex] = null; $iCountLimit--; } if (0 > $iCountLimit) { if ($iOptimizationLimit < \count($aNewMailFoldersHelper)) { break; } else { $iCountLimit = $iForeachLimit; } } } } $aMailFoldersHelper = $aNewMailFoldersHelper; if ($this->oLogger) { $this->oLogger->Write('Result optimization: '.\count($aMailFoldersHelper).' folders'); } } return $aMailFoldersHelper; } /** * @param string $sParent = '' * @param string $sListPattern = '*' * @param bool $bUseListSubscribeStatus = false * @param int $iOptimizationLimit = 0 * * @return \MailSo\Mail\FolderCollection|false */ public function Folders($sParent = '', $sListPattern = '*', $bUseListSubscribeStatus = true, $iOptimizationLimit = 0) { $oFolderCollection = false; $aSubscribedFolders = null; if ($bUseListSubscribeStatus) { try { $aSubscribedFolders = $this->oImapClient->FolderSubscribeList($sParent, $sListPattern); } catch (\Exception $oException) { unset($oException); } } $aImapSubscribedFoldersHelper = null; if (\is_array($aSubscribedFolders)) { $aImapSubscribedFoldersHelper = array(); foreach ($aSubscribedFolders as /* @var $oImapFolder \MailSo\Imap\Folder */ $oImapFolder) { $aImapSubscribedFoldersHelper[] = $oImapFolder->FullNameRaw(); } } $aFolders = $this->oImapClient->FolderList($sParent, $sListPattern); $bOptimized = false; $aMailFoldersHelper = null; if (\is_array($aFolders)) { $aMailFoldersHelper = array(); foreach ($aFolders as /* @var $oImapFolder \MailSo\Imap\Folder */ $oImapFolder) { $aMailFoldersHelper[] = Folder::NewInstance($oImapFolder, (null === $aImapSubscribedFoldersHelper || \in_array($oImapFolder->FullNameRaw(), $aImapSubscribedFoldersHelper)) || $oImapFolder->IsInbox() ); } $iCount = \count($aMailFoldersHelper); $aMailFoldersHelper = $this->folderListOptimization($aMailFoldersHelper, $iOptimizationLimit); $bOptimized = $iCount !== \count($aMailFoldersHelper); } if (\is_array($aMailFoldersHelper)) { $oFolderCollection = FolderCollection::NewInstance(); $oFolderCollection->InitByUnsortedMailFolderArray($aMailFoldersHelper); $oFolderCollection->Optimized = $bOptimized; } if ($oFolderCollection) { $oFolderCollection->SortByCallback(function ($oFolderA, $oFolderB) { $sA = \strtoupper($oFolderA->FullNameRaw()); $sB = \strtoupper($oFolderB->FullNameRaw()); switch (true) { case 'INBOX' === $sA: return -1; case 'INBOX' === $sB: return 1; case '[GMAIL]' === $sA: return -1; case '[GMAIL]' === $sB: return 1; } return \strnatcasecmp($oFolderA->FullName(), $oFolderB->FullName()); }); $oNamespace = $this->oImapClient->GetNamespace(); if ($oNamespace) { $oFolderCollection->SetNamespace($oNamespace->GetPersonalNamespace()); } $oFolderCollection->IsThreadsSupported = $this->IsThreadsSupported(); } return $oFolderCollection; } /** * @param string $sFolderNameInUtf8 * @param string $sFolderParentFullNameRaw = '' * @param bool $bSubscribeOnCreation = true * @param string $sDelimiter = '' * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function FolderCreate($sFolderNameInUtf8, $sFolderParentFullNameRaw = '', $bSubscribeOnCreation = true, $sDelimiter = '') { if (!\MailSo\Base\Validator::NotEmptyString($sFolderNameInUtf8, true) || !\is_string($sFolderParentFullNameRaw)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $sFolderNameInUtf8 = \trim($sFolderNameInUtf8); if (0 === \strlen($sDelimiter) || 0 < \strlen(\trim($sFolderParentFullNameRaw))) { $aFolders = $this->oImapClient->FolderList('', 0 === \strlen(\trim($sFolderParentFullNameRaw)) ? 'INBOX' : $sFolderParentFullNameRaw); if (!\is_array($aFolders) || !isset($aFolders[0])) { // TODO throw new \MailSo\Mail\Exceptions\RuntimeException( 0 === \strlen(trim($sFolderParentFullNameRaw)) ? 'Cannot get folder delimiter' : 'Cannot create folder in non-existen parent folder'); } $sDelimiter = $aFolders[0]->Delimiter(); if (0 < \strlen($sDelimiter) && 0 < \strlen(\trim($sFolderParentFullNameRaw))) { $sFolderParentFullNameRaw .= $sDelimiter; } } $sFullNameRawToCreate = \MailSo\Base\Utils::ConvertEncoding($sFolderNameInUtf8, \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); if (0 < \strlen($sDelimiter) && false !== \strpos($sFullNameRawToCreate, $sDelimiter)) { // TODO throw new \MailSo\Mail\Exceptions\RuntimeException( 'New folder name contains delimiter'); } $sFullNameRawToCreate = $sFolderParentFullNameRaw.$sFullNameRawToCreate; $this->oImapClient->FolderCreate($sFullNameRawToCreate); if ($bSubscribeOnCreation) { $this->oImapClient->FolderSubscribe($sFullNameRawToCreate); } return $this; } /** * @param string $sPrevFolderFullNameRaw * @param string $sNextFolderFullNameInUtf * @param bool $bSubscribeOnMove = true * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function FolderMove($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, $bSubscribeOnMove = true) { return $this->folderModify($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, false, $bSubscribeOnMove); } /** * @param string $sPrevFolderFullNameRaw * @param string $sNewTopFolderNameInUtf * @param bool $bSubscribeOnRename = true * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function FolderRename($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, $bSubscribeOnRename = true) { return $this->folderModify($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, true, $bSubscribeOnRename); } /** * @param string $sPrevFolderFullNameRaw * @param string $sNextFolderNameInUtf * @param bool $bRenameOrMove * @param bool $bSubscribeOnModify * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function folderModify($sPrevFolderFullNameRaw, $sNextFolderNameInUtf, $bRenameOrMove, $bSubscribeOnModify) { if (0 === \strlen($sPrevFolderFullNameRaw) || 0 === \strlen($sNextFolderNameInUtf)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $aFolders = $this->oImapClient->FolderList('', $sPrevFolderFullNameRaw); if (!\is_array($aFolders) || !isset($aFolders[0])) { // TODO throw new \MailSo\Mail\Exceptions\RuntimeException('Cannot rename non-existen folder'); } $sDelimiter = $aFolders[0]->Delimiter(); $iLast = \strrpos($sPrevFolderFullNameRaw, $sDelimiter); $mSubscribeFolders = null; if ($bSubscribeOnModify) { $mSubscribeFolders = $this->oImapClient->FolderSubscribeList($sPrevFolderFullNameRaw, '*'); if (\is_array($mSubscribeFolders) && 0 < count($mSubscribeFolders)) { foreach ($mSubscribeFolders as /* @var $oFolder \MailSo\Imap\Folder */ $oFolder) { $this->oImapClient->FolderUnSubscribe($oFolder->FullNameRaw()); } } } $sNewFolderFullNameRaw = \MailSo\Base\Utils::ConvertEncoding($sNextFolderNameInUtf, \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); if($bRenameOrMove) { if (0 < \strlen($sDelimiter) && false !== \strpos($sNewFolderFullNameRaw, $sDelimiter)) { // TODO throw new \MailSo\Mail\Exceptions\RuntimeException('New folder name contains delimiter'); } $sFolderParentFullNameRaw = false === $iLast ? '' : \substr($sPrevFolderFullNameRaw, 0, $iLast + 1); $sNewFolderFullNameRaw = $sFolderParentFullNameRaw.$sNewFolderFullNameRaw; } $this->oImapClient->FolderRename($sPrevFolderFullNameRaw, $sNewFolderFullNameRaw); if (\is_array($mSubscribeFolders) && 0 < count($mSubscribeFolders)) { foreach ($mSubscribeFolders as /* @var $oFolder \MailSo\Imap\Folder */ $oFolder) { $sFolderFullNameRawForResubscrine = $oFolder->FullNameRaw(); if (0 === \strpos($sFolderFullNameRawForResubscrine, $sPrevFolderFullNameRaw)) { $sNewFolderFullNameRawForResubscrine = $sNewFolderFullNameRaw. \substr($sFolderFullNameRawForResubscrine, \strlen($sPrevFolderFullNameRaw)); $this->oImapClient->FolderSubscribe($sNewFolderFullNameRawForResubscrine); } } } return $this; } /** * @param string $sFolderFullNameRaw * @param bool $bUnsubscribeOnDeletion = true * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Mail\Exceptions\RuntimeException */ public function FolderDelete($sFolderFullNameRaw, $bUnsubscribeOnDeletion = true) { if (0 === \strlen($sFolderFullNameRaw) || 'INBOX' === $sFolderFullNameRaw) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->FolderExamine($sFolderFullNameRaw); $aIndexOrUids = $this->oImapClient->MessageSimpleSearch('ALL'); if (0 < \count($aIndexOrUids)) { throw new \MailSo\Mail\Exceptions\NonEmptyFolder(); } $this->oImapClient->FolderExamine('INBOX'); if ($bUnsubscribeOnDeletion) { $this->oImapClient->FolderUnSubscribe($sFolderFullNameRaw); } $this->oImapClient->FolderDelete($sFolderFullNameRaw); return $this; } /** * @param string $sFolderFullNameRaw * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function FolderClear($sFolderFullNameRaw) { $this->oImapClient->FolderSelect($sFolderFullNameRaw); $oFolderInformation = $this->oImapClient->FolderCurrentInformation(); if ($oFolderInformation && $oFolderInformation->Exists && 0 < $oFolderInformation->Exists) // STATUS? { $this->oImapClient->MessageStoreFlag('1:*', false, array(\MailSo\Imap\Enumerations\MessageFlag::DELETED), \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT ); $this->oImapClient->MessageExpunge(); } return $this; } /** * @param string $sFolderFullNameRaw * @param bool $bSubscribe * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function FolderSubscribe($sFolderFullNameRaw, $bSubscribe) { if (0 === \strlen($sFolderFullNameRaw)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oImapClient->{($bSubscribe) ? 'FolderSubscribe' : 'FolderUnSubscribe'}($sFolderFullNameRaw); return $this; } /** * @param \MailSo\Log\Logger $oLogger * * @return \MailSo\Mail\MailClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetLogger($oLogger) { if (!($oLogger instanceof \MailSo\Log\Logger)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oLogger = $oLogger; $this->oImapClient->SetLogger($this->oLogger); return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Message.php000066400000000000000000000450121361462701300264650ustar00rootroot00000000000000Clear(); } /** * @return \MailSo\Mail\Message */ public function Clear() { $this->sFolder = ''; $this->iUid = 0; $this->sSubject = ''; $this->sMessageId = ''; $this->sContentType = ''; $this->iSize = 0; $this->iInternalTimeStampInUTC = 0; $this->iHeaderTimeStampInUTC = 0; $this->sHeaderDate = ''; $this->aFlags = array(); $this->aFlagsLowerCase = array(); $this->oFrom = null; $this->oSender = null; $this->oReplyTo = null; $this->oDeliveredTo = null; $this->oTo = null; $this->oCc = null; $this->oBcc = null; $this->sPlain = ''; $this->sHtml = ''; $this->oAttachments = null; $this->aDraftInfo = null; $this->sInReplyTo = ''; $this->sReferences = ''; $this->aUnsubsribeLinks = array(); $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::NOTHING; $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::NORMAL; $this->sDeliveryReceipt = ''; $this->sReadReceipt = ''; $this->aThreads = array(); $this->bTextPartIsTrimmed = false; $this->sPgpSignature = ''; $this->bPgpSigned = false; $this->bPgpEncrypted = false; return $this; } /** * @return \MailSo\Mail\Message */ public static function NewInstance() { return new self(); } /** * @return string */ public function Plain() { return $this->sPlain; } /** * @return string */ public function Html() { return $this->sHtml; } /** * @return string */ public function PgpSignature() { return $this->sPgpSignature; } /** * @return bool */ public function PgpSigned() { return $this->bPgpSigned; } /** * @return bool */ public function PgpEncrypted() { return $this->bPgpEncrypted; } /** * @param string $sHtml * * @retun void */ public function SetHtml($sHtml) { $this->sHtml = $sHtml; } /** * @return string */ public function Folder() { return $this->sFolder; } /** * @return int */ public function Uid() { return $this->iUid; } /** * @return string */ public function MessageId() { return $this->sMessageId; } /** * @return string */ public function Subject() { return $this->sSubject; } /** * @return string */ public function ContentType() { return $this->sContentType; } /** * @return int */ public function Size() { return $this->iSize; } /** * @return int */ public function InternalTimeStampInUTC() { return $this->iInternalTimeStampInUTC; } /** * @return int */ public function HeaderTimeStampInUTC() { return $this->iHeaderTimeStampInUTC; } /** * @return string */ public function HeaderDate() { return $this->sHeaderDate; } /** * @return array */ public function Flags() { return $this->aFlags; } /** * @return array */ public function FlagsLowerCase() { return $this->aFlagsLowerCase; } /** * @return \MailSo\Mime\EmailCollection */ public function From() { return $this->oFrom; } /** * @return int */ public function Sensitivity() { return $this->iSensitivity; } /** * @return int */ public function Priority() { return $this->iPriority; } /** * @return \MailSo\Mime\EmailCollection */ public function Sender() { return $this->oSender; } /** * @return \MailSo\Mime\EmailCollection */ public function ReplyTo() { return $this->oReplyTo; } /** * @return \MailSo\Mime\EmailCollection */ public function DeliveredTo() { return $this->oDeliveredTo; } /** * @return \MailSo\Mime\EmailCollection */ public function To() { return $this->oTo; } /** * @return \MailSo\Mime\EmailCollection */ public function Cc() { return $this->oCc; } /** * @return \MailSo\Mime\EmailCollection */ public function Bcc() { return $this->oBcc; } /** * @return \MailSo\Mail\AttachmentCollection */ public function Attachments() { return $this->oAttachments; } /** * @return string */ public function InReplyTo() { return $this->sInReplyTo; } /** * @return string */ public function References() { return $this->sReferences; } /** * @return string */ public function DeliveryReceipt() { return $this->sDeliveryReceipt; } /** * @return string */ public function ReadReceipt() { return $this->sReadReceipt; } /** * @return array */ public function UnsubsribeLinks() { return $this->aUnsubsribeLinks; } /** * @return string */ public function ReadingConfirmation() { return $this->ReadReceipt(); } /** * @return array | null */ public function DraftInfo() { return $this->aDraftInfo; } /** * @return array */ public function Threads() { return $this->aThreads; } /** * @param array $aThreads */ public function SetThreads($aThreads) { $this->aThreads = \is_array($aThreads) ? $aThreads : array(); } /** * @return boole */ public function TextPartIsTrimmed() { return $this->bTextPartIsTrimmed; } /** * @param string $sFolder * @param \MailSo\Imap\FetchResponse $oFetchResponse * @param \MailSo\Imap\BodyStructure $oBodyStructure = null * * @return \MailSo\Mail\Message */ public static function NewFetchResponseInstance($sFolder, $oFetchResponse, $oBodyStructure = null) { return self::NewInstance()->InitByFetchResponse($sFolder, $oFetchResponse, $oBodyStructure); } /** * @param string $sFolder * @param \MailSo\Imap\FetchResponse $oFetchResponse * @param \MailSo\Imap\BodyStructure $oBodyStructure = null * * @return \MailSo\Mail\Message */ public function InitByFetchResponse($sFolder, $oFetchResponse, $oBodyStructure = null) { if (!$oBodyStructure) { $oBodyStructure = $oFetchResponse->GetFetchBodyStructure(); } $sUid = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::UID); $sSize = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::RFC822_SIZE); $sInternalDate = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::INTERNALDATE); $aFlags = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::FLAGS); $this->sFolder = $sFolder; $this->iUid = \is_numeric($sUid) ? (int) $sUid : 0; $this->iSize = \is_numeric($sSize) ? (int) $sSize : 0; $this->aFlags = \is_array($aFlags) ? $aFlags : array(); $this->aFlagsLowerCase = \array_map('strtolower', $this->aFlags); $this->iInternalTimeStampInUTC = \MailSo\Base\DateTimeHelper::ParseInternalDateString($sInternalDate); $sCharset = $oBodyStructure ? $oBodyStructure->SearchCharset() : ''; $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); $sHeaders = $oFetchResponse->GetHeaderFieldsValue(); if (0 < \strlen($sHeaders)) { $oHeaders = \MailSo\Mime\HeaderCollection::NewInstance()->Parse($sHeaders, false, $sCharset); $sContentTypeCharset = $oHeaders->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Parameter::CHARSET ); if (0 < \strlen($sContentTypeCharset)) { $sCharset = $sContentTypeCharset; $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); } if (0 < \strlen($sCharset)) { $oHeaders->SetParentCharset($sCharset); } $bCharsetAutoDetect = 0 === \strlen($sCharset); $this->sSubject = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SUBJECT, $bCharsetAutoDetect); $this->sMessageId = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID); $this->sContentType = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE); $this->oFrom = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::FROM_, $bCharsetAutoDetect); $this->oTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::TO_, $bCharsetAutoDetect); $this->oCc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::CC, $bCharsetAutoDetect); $this->oBcc = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::BCC, $bCharsetAutoDetect); $oHeaders->PopulateEmailColectionByDkim($this->oFrom); $this->oSender = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::SENDER, $bCharsetAutoDetect); $this->oReplyTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::REPLY_TO, $bCharsetAutoDetect); $this->oDeliveredTo = $oHeaders->GetAsEmailCollection(\MailSo\Mime\Enumerations\Header::DELIVERED_TO, $bCharsetAutoDetect); $this->sInReplyTo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IN_REPLY_TO); $this->sReferences = \MailSo\Base\Utils::StripSpaces( $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::REFERENCES)); $sHeaderDate = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DATE); $this->sHeaderDate = $sHeaderDate; $this->iHeaderTimeStampInUTC = \MailSo\Base\DateTimeHelper::ParseRFC2822DateString($sHeaderDate); // Sensitivity $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::NOTHING; $sSensitivity = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::SENSITIVITY); switch (\strtolower($sSensitivity)) { case 'personal': $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::PERSONAL; break; case 'private': $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::PRIVATE_; break; case 'company-confidential': $this->iSensitivity = \MailSo\Mime\Enumerations\Sensitivity::CONFIDENTIAL; break; } // Priority $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::NORMAL; $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_MSMAIL_PRIORITY); if (0 === \strlen($sPriority)) { $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::IMPORTANCE); } if (0 === \strlen($sPriority)) { $sPriority = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_PRIORITY); } if (0 < \strlen($sPriority)) { switch (\str_replace(' ', '', \strtolower($sPriority))) { case 'high': case '1(highest)': case '2(high)': case '1': case '2': $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::HIGH; break; case 'low': case '4(low)': case '5(lowest)': case '4': case '5': $this->iPriority = \MailSo\Mime\Enumerations\MessagePriority::LOW; break; } } // Delivery Receipt $this->sDeliveryReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::RETURN_RECEIPT_TO)); // Read Receipt $this->sReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO)); if (empty($this->sReadReceipt)) { $this->sReadReceipt = \trim($oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO)); } //Unsubscribe links $this->aUnsubsribeLinks = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::LIST_UNSUBSCRIBE); if (empty($this->aUnsubsribeLinks)) { $this->aUnsubsribeLinks = array(); } else { $this->aUnsubsribeLinks = explode(',', $this->aUnsubsribeLinks); $this->aUnsubsribeLinks = array_map( function ($link) { return trim($link, ' <>'); }, $this->aUnsubsribeLinks ); } $sDraftInfo = $oHeaders->ValueByName(\MailSo\Mime\Enumerations\Header::X_DRAFT_INFO); if (0 < \strlen($sDraftInfo)) { $sType = ''; $sFolder = ''; $sUid = ''; \MailSo\Mime\ParameterCollection::NewInstance($sDraftInfo) ->ForeachList(function ($oParameter) use (&$sType, &$sFolder, &$sUid) { switch (\strtolower($oParameter->Name())) { case 'type': $sType = $oParameter->Value(); break; case 'uid': $sUid = $oParameter->Value(); break; case 'folder': $sFolder = \base64_decode($oParameter->Value()); break; } }) ; if (0 < \strlen($sType) && 0 < \strlen($sFolder) && 0 < \strlen($sUid)) { $this->aDraftInfo = array($sType, $sUid, $sFolder); } } } else if ($oFetchResponse->GetEnvelope()) { if (0 === \strlen($sCharset) && $oBodyStructure) { $sCharset = $oBodyStructure->SearchCharset(); $sCharset = \MailSo\Base\Utils::NormalizeCharset($sCharset); } if (0 === \strlen($sCharset)) { $sCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; } // date, subject, from, sender, reply-to, to, cc, bcc, in-reply-to, message-id $this->sMessageId = $oFetchResponse->GetFetchEnvelopeValue(9, ''); $this->sSubject = \MailSo\Base\Utils::DecodeHeaderValue($oFetchResponse->GetFetchEnvelopeValue(1, ''), $sCharset); $this->oFrom = $oFetchResponse->GetFetchEnvelopeEmailCollection(2, $sCharset); $this->oSender = $oFetchResponse->GetFetchEnvelopeEmailCollection(3, $sCharset); $this->oReplyTo = $oFetchResponse->GetFetchEnvelopeEmailCollection(4, $sCharset); $this->oTo = $oFetchResponse->GetFetchEnvelopeEmailCollection(5, $sCharset); $this->oCc = $oFetchResponse->GetFetchEnvelopeEmailCollection(6, $sCharset); $this->oBcc = $oFetchResponse->GetFetchEnvelopeEmailCollection(7, $sCharset); $this->sInReplyTo = $oFetchResponse->GetFetchEnvelopeValue(8, ''); } $aTextParts = $oBodyStructure ? $oBodyStructure->SearchHtmlOrPlainParts() : null; if (\is_array($aTextParts) && 0 < \count($aTextParts)) { if (0 === \strlen($sCharset)) { $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; } $aHtmlParts = array(); $aPlainParts = array(); foreach ($aTextParts as $oPart) { $sText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$oPart->PartID().']'); if (null === $sText) { $sText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$oPart->PartID().']<0>'); if (\is_string($sText) && 0 < \strlen($sText)) { $this->bTextPartIsTrimmed = true; } } if (\is_string($sText) && 0 < \strlen($sText)) { $sTextCharset = $oPart->Charset(); if (empty($sTextCharset)) { $sTextCharset = $sCharset; } $sTextCharset = \MailSo\Base\Utils::NormalizeCharset($sTextCharset, true); $sText = \MailSo\Base\Utils::DecodeEncodingValue($sText, $oPart->MailEncodingName()); $sText = \MailSo\Base\Utils::ConvertEncoding($sText, $sTextCharset, \MailSo\Base\Enumerations\Charset::UTF_8); $sText = \MailSo\Base\Utils::Utf8Clear($sText); if ('text/html' === $oPart->ContentType()) { $aHtmlParts[] = $sText; } else { if ($oPart->IsFlowedFormat()) { $sText = \MailSo\Base\Utils::DecodeFlowedFormat($sText); } $aPlainParts[] = $sText; } } } if (0 < \count($aHtmlParts)) { $this->sHtml = \implode('
', $aHtmlParts); } else { $this->sPlain = \trim(\implode("\n", $aPlainParts)); } $aMatch = array(); if (\preg_match('/-----BEGIN PGP SIGNATURE-----(.+)-----END PGP SIGNATURE-----/ism', $this->sPlain, $aMatch) && !empty($aMatch[0])) { $this->sPgpSignature = \trim($aMatch[0]); $this->bPgpSigned = true; } $aMatch = array(); if (\preg_match('/-----BEGIN PGP MESSAGE-----/ism', $this->sPlain, $aMatch) && !empty($aMatch[0])) { $this->bPgpEncrypted = true; } unset($aHtmlParts, $aPlainParts, $aMatch); } // if (empty($this->sPgpSignature) && 'multipart/signed' === \strtolower($this->sContentType) && // 'application/pgp-signature' === \strtolower($oHeaders->ParameterValue( // \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, // \MailSo\Mime\Enumerations\Parameter::PROTOCOL // ))) // { // $aPgpSignatureParts = $oBodyStructure ? $oBodyStructure->SearchByContentType('application/pgp-signature') : null; // if (\is_array($aPgpSignatureParts) && 0 < \count($aPgpSignatureParts) && isset($aPgpSignatureParts[0])) // { // $sPgpSignatureText = $oFetchResponse->GetFetchValue(\MailSo\Imap\Enumerations\FetchType::BODY.'['.$aPgpSignatureParts[0]->PartID().']'); // if (\is_string($sPgpSignatureText) && 0 < \strlen($sPgpSignatureText) && 0 < \strpos($sPgpSignatureText, 'BEGIN PGP SIGNATURE')) // { // $this->sPgpSignature = \trim($sPgpSignatureText); // $this->bPgpSigned = true; // } // } // } if ($oBodyStructure) { $aAttachmentsParts = $oBodyStructure->SearchAttachmentsParts(); if ($aAttachmentsParts && 0 < count($aAttachmentsParts)) { $this->oAttachments = AttachmentCollection::NewInstance(); foreach ($aAttachmentsParts as /* @var $oAttachmentItem \MailSo\Imap\BodyStructure */ $oAttachmentItem) { $this->oAttachments->Add( \MailSo\Mail\Attachment::NewBodyStructureInstance($this->sFolder, $this->iUid, $oAttachmentItem) ); } } } return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MessageCollection.php000066400000000000000000000030371361462701300305020ustar00rootroot00000000000000Clear(); } /** * @return \MailSo\Mail\MessageCollection */ public static function NewInstance() { return new self(); } /** * @return \MailSo\Mail\MessageCollection */ public function Clear() { parent::Clear(); $this->FolderHash = ''; $this->MessageCount = 0; $this->MessageUnseenCount = 0; $this->MessageResultCount = 0; $this->FolderName = ''; $this->Offset = 0; $this->Limit = 0; $this->Search = ''; $this->UidNext = ''; $this->ThreadUid = ''; $this->NewMessages = array(); $this->Filtered = false; return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/MailSo.php000066400000000000000000000017111361462701300254010ustar00rootroot00000000000000rResource = $rResource; $this->sFileName = $sFileName; $this->iFileSize = $iFileSize; $this->bIsInline = $bIsInline; $this->bIsLinked = $bIsLinked; $this->sCID = $sCID; $this->aCustomContentTypeParams = $aCustomContentTypeParams; $this->sContentLocation = $sContentLocation; } /** * @param resource $rResource * @param string $sFileName = '' * @param int $iFileSize = 0 * @param bool $bIsInline = false * @param bool $bIsLinked = false * @param string $sCID = '' * @param array $aCustomContentTypeParams = array() * @param string $sContentLocation = '' * * @return \MailSo\Mime\Attachment */ public static function NewInstance($rResource, $sFileName = '', $iFileSize = 0, $bIsInline = false, $bIsLinked = false, $sCID = '', $aCustomContentTypeParams = array(), $sContentLocation = '') { return new self($rResource, $sFileName, $iFileSize, $bIsInline, $bIsLinked, $sCID, $aCustomContentTypeParams, $sContentLocation); } /** * @return resource */ public function Resource() { return $this->rResource; } /** * @return string */ public function ContentType() { return \MailSo\Base\Utils::MimeContentType($this->sFileName); } /** * @return array */ public function CustomContentTypeParams() { return $this->aCustomContentTypeParams; } /** * @return string */ public function CID() { return $this->sCID; } /** * @return string */ public function ContentLocation() { return $this->sContentLocation; } /** * @return string */ public function FileName() { return $this->sFileName; } /** * @return int */ public function FileSize() { return $this->iFileSize; } /** * @return bool */ public function IsInline() { return $this->bIsInline; } /** * @return bool */ public function IsImage() { return 'image' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * @return bool */ public function IsArchive() { return 'archive' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * @return bool */ public function IsPdf() { return 'pdf' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * @return bool */ public function IsDoc() { return 'doc' === \MailSo\Base\Utils::ContentTypeType($this->ContentType(), $this->FileName()); } /** * @return bool */ public function IsLinked() { return $this->bIsLinked && 0 < \strlen($this->sCID); } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/AttachmentCollection.php000066400000000000000000000021371361462701300312130ustar00rootroot00000000000000FilterList(function ($oItem) { return $oItem && $oItem->IsLinked(); }); } /** * @return array */ public function UnlinkedAttachments() { return $this->FilterList(function ($oItem) { return $oItem && !$oItem->IsLinked(); }); } /** * @return int */ public function SizeOfAttachments() { $iResult = 0; $this->ForeachList(function ($oItem) use (&$iResult) { if ($oItem) { $iResult += $oItem->FileSize(); } }); return $iResult; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php000066400000000000000000000161561361462701300261440ustar00rootroot00000000000000sEmail = \MailSo\Base\Utils::IdnToAscii( \MailSo\Base\Utils::Trim($sEmail), true); $this->sDisplayName = \MailSo\Base\Utils::Trim($sDisplayName); $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::NONE; $this->sDkimValue = ''; } /** * @param string $sEmail * @param string $sDisplayName = '' * * @return \MailSo\Mime\Email * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public static function NewInstance($sEmail, $sDisplayName = '') { return new self($sEmail, $sDisplayName); } /** * @param string $sEmailAddress * @return \MailSo\Mime\Email * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public static function Parse($sEmailAddress) { $sEmailAddress = \MailSo\Base\Utils::Trim($sEmailAddress); if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $sName = ''; $sEmail = ''; $sComment = ''; $bInName = false; $bInAddress = false; $bInComment = false; $iStartIndex = 0; $iEndIndex = 0; $iCurrentIndex = 0; while ($iCurrentIndex < \strlen($sEmailAddress)) { switch ($sEmailAddress{$iCurrentIndex}) { // case '\'': case '"': // $sQuoteChar = $sEmailAddress{$iCurrentIndex}; if ((!$bInName) && (!$bInAddress) && (!$bInComment)) { $bInName = true; $iStartIndex = $iCurrentIndex; } else if ((!$bInAddress) && (!$bInComment)) { $iEndIndex = $iCurrentIndex; $sName = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); $iEndIndex = 0; $iCurrentIndex = 0; $iStartIndex = 0; $bInName = false; } break; case '<': if ((!$bInName) && (!$bInAddress) && (!$bInComment)) { if ($iCurrentIndex > 0 && \strlen($sName) === 0) { $sName = \substr($sEmailAddress, 0, $iCurrentIndex); } $bInAddress = true; $iStartIndex = $iCurrentIndex; } break; case '>': if ($bInAddress) { $iEndIndex = $iCurrentIndex; $sEmail = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); $iEndIndex = 0; $iCurrentIndex = 0; $iStartIndex = 0; $bInAddress = false; } break; case '(': if ((!$bInName) && (!$bInAddress) && (!$bInComment)) { $bInComment = true; $iStartIndex = $iCurrentIndex; } break; case ')': if ($bInComment) { $iEndIndex = $iCurrentIndex; $sComment = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); $iEndIndex = 0; $iCurrentIndex = 0; $iStartIndex = 0; $bInComment = false; } break; case '\\': $iCurrentIndex++; break; } $iCurrentIndex++; } if (\strlen($sEmail) === 0) { $aRegs = array(''); if (\preg_match('/[^@\s]+@\S+/i', $sEmailAddress, $aRegs) && isset($aRegs[0])) { $sEmail = $aRegs[0]; } else { $sName = $sEmailAddress; } } if ((\strlen($sEmail) > 0) && (\strlen($sName) == 0) && (\strlen($sComment) == 0)) { $sName = \str_replace($sEmail, '', $sEmailAddress); } $sEmail = \trim(\trim($sEmail), '<>'); $sEmail = \rtrim(\trim($sEmail), '.'); $sEmail = \trim($sEmail); $sName = \trim(\trim($sName), '"'); $sName = \trim($sName, '\''); $sComment = \trim(\trim($sComment), '()'); // Remove backslash $sName = \preg_replace('/\\\\(.)/s', '$1', $sName); $sComment = \preg_replace('/\\\\(.)/s', '$1', $sComment); return Email::NewInstance($sEmail, $sName); } /** * @param bool $bIdn = false * * @return string */ public function GetEmail($bIdn = false) { return $bIdn ? \MailSo\Base\Utils::IdnToUtf8($this->sEmail) : $this->sEmail; } /** * @return string */ public function GetDisplayName() { return $this->sDisplayName; } /** * @return string */ public function GetDkimStatus() { return $this->sDkimStatus; } /** * @return string */ public function GetDkimValue() { return $this->sDkimValue; } /** * @return string */ public function GetAccountName() { return \MailSo\Base\Utils::GetAccountNameFromEmail($this->GetEmail(false)); } /** * @param bool $bIdn = false * * @return string */ public function GetDomain($bIdn = false) { return \MailSo\Base\Utils::GetDomainFromEmail($this->GetEmail($bIdn)); } /** * @param string $sDkimStatus * @param string $sDkimValue = '' */ public function SetDkimStatusAndValue($sDkimStatus, $sDkimValue = '') { $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::normalizeValue($sDkimStatus); $this->sDkimValue = $sDkimValue; } /** * @param bool $bIdn = false * @param bool $bDkim = true * * @return array */ public function ToArray($bIdn = false, $bDkim = true) { return $bDkim ? array($this->sDisplayName, $this->GetEmail($bIdn), $this->sDkimStatus, $this->sDkimValue) : array($this->sDisplayName, $this->GetEmail($bIdn)); } /** * @param bool $bConvertSpecialsName = false * @param bool $bIdn = false * * @return string */ public function ToString($bConvertSpecialsName = false, $bIdn = false) { $sReturn = ''; $sDisplayName = \str_replace('"', '\"', $this->sDisplayName); if ($bConvertSpecialsName) { $sDisplayName = 0 === \strlen($sDisplayName) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, $sDisplayName); } $sDisplayName = 0 === \strlen($sDisplayName) ? '' : '"'.$sDisplayName.'"'; if (0 < \strlen($this->sEmail)) { $sReturn = $this->GetEmail($bIdn); if (0 < \strlen($sDisplayName)) { $sReturn = $sDisplayName.' <'.$sReturn.'>'; } } return \trim($sReturn); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailCollection.php000066400000000000000000000110311361462701300301430ustar00rootroot00000000000000parseEmailAddresses($sEmailAddresses); } } /** * @param string $sEmailAddresses = '' * * @return \MailSo\Mime\EmailCollection */ public static function NewInstance($sEmailAddresses = '') { return new self($sEmailAddresses); } /** * @param string $sEmailAddresses * * @return \MailSo\Mime\EmailCollection */ public static function Parse($sEmailAddresses) { return self::NewInstance($sEmailAddresses); } /** * @return array */ public function ToArray() { $aReturn = $aEmails = array(); $aEmails =& $this->GetAsArray(); foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) { $aReturn[] = $oEmail->ToArray(); } return $aReturn; } /** * @param \MailSo\Mime\EmailCollection $oEmails * * @return \MailSo\Mime\EmailCollection */ public function MergeWithOtherCollection(\MailSo\Mime\EmailCollection $oEmails) { $aEmails =& $oEmails->GetAsArray(); foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) { $this->Add($oEmail); } return $this; } /** * @return \MailSo\Mime\EmailCollection */ public function Unique() { $aCache = array(); $aReturn = array(); $aEmails =& $this->GetAsArray(); foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) { $sEmail = $oEmail->GetEmail(); if (!isset($aCache[$sEmail])) { $aCache[$sEmail] = true; $aReturn[] = $oEmail; } } $this->SetAsArray($aReturn); return $this; } /** * @param bool $bConvertSpecialsName = false * @param bool $bIdn = false * * @return string */ public function ToString($bConvertSpecialsName = false, $bIdn = false) { $aReturn = $aEmails = array(); $aEmails =& $this->GetAsArray(); foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) { $aReturn[] = $oEmail->ToString($bConvertSpecialsName, $bIdn); } return \implode(', ', $aReturn); } /** * @param string $sRawEmails * * @return \MailSo\Mime\EmailCollection */ private function parseEmailAddresses($sRawEmails) { $this->Clear(); $sWorkingRecipients = \trim($sRawEmails); if (0 === \strlen($sWorkingRecipients)) { return $this; } $iEmailStartPos = 0; $iEmailEndPos = 0; $bIsInQuotes = false; $sChQuote = '"'; $bIsInAngleBrackets = false; $bIsInBrackets = false; $iCurrentPos = 0; $sWorkingRecipientsLen = \strlen($sWorkingRecipients); while ($iCurrentPos < $sWorkingRecipientsLen) { switch ($sWorkingRecipients{$iCurrentPos}) { case '\'': case '"': if (!$bIsInQuotes) { $sChQuote = $sWorkingRecipients{$iCurrentPos}; $bIsInQuotes = true; } else if ($sChQuote == $sWorkingRecipients{$iCurrentPos}) { $bIsInQuotes = false; } break; case '<': if (!$bIsInAngleBrackets) { $bIsInAngleBrackets = true; if ($bIsInQuotes) { $bIsInQuotes = false; } } break; case '>': if ($bIsInAngleBrackets) { $bIsInAngleBrackets = false; } break; case '(': if (!$bIsInBrackets) { $bIsInBrackets = true; } break; case ')': if ($bIsInBrackets) { $bIsInBrackets = false; } break; case ',': case ';': if (!$bIsInAngleBrackets && !$bIsInBrackets && !$bIsInQuotes) { $iEmailEndPos = $iCurrentPos; try { $this->Add( \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iEmailEndPos - $iEmailStartPos)) ); $iEmailStartPos = $iCurrentPos + 1; } catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) { } } break; } $iCurrentPos++; } if ($iEmailStartPos < $iCurrentPos) { try { $this->Add( \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iCurrentPos - $iEmailStartPos)) ); } catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) {} } return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailDep.php000066400000000000000000000174151361462701300265740ustar00rootroot00000000000000sEmail = \MailSo\Base\Utils::IdnToAscii( \MailSo\Base\Utils::Trim($sEmail), true); $this->sDisplayName = \MailSo\Base\Utils::Trim($sDisplayName); $this->sRemark = \MailSo\Base\Utils::Trim($sRemark); $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::NONE; $this->sDkimValue = ''; } /** * @param string $sEmail * @param string $sDisplayName = '' * @param string $sRemark = '' * * @return \MailSo\Mime\Email * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public static function NewInstance($sEmail, $sDisplayName = '', $sRemark = '') { return new self($sEmail, $sDisplayName, $sRemark); } /** * @param string $sEmailAddress * @return \MailSo\Mime\Email * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public static function Parse($sEmailAddress) { $sEmailAddress = \MailSo\Base\Utils::Trim($sEmailAddress); if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $sName = ''; $sEmail = ''; $sComment = ''; $bInName = false; $bInAddress = false; $bInComment = false; $iStartIndex = 0; $iEndIndex = 0; $iCurrentIndex = 0; while ($iCurrentIndex < \strlen($sEmailAddress)) { switch ($sEmailAddress{$iCurrentIndex}) { // case '\'': case '"': // $sQuoteChar = $sEmailAddress{$iCurrentIndex}; if ((!$bInName) && (!$bInAddress) && (!$bInComment)) { $bInName = true; $iStartIndex = $iCurrentIndex; } else if ((!$bInAddress) && (!$bInComment)) { $iEndIndex = $iCurrentIndex; $sName = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); $iEndIndex = 0; $iCurrentIndex = 0; $iStartIndex = 0; $bInName = false; } break; case '<': if ((!$bInName) && (!$bInAddress) && (!$bInComment)) { if ($iCurrentIndex > 0 && \strlen($sName) === 0) { $sName = \substr($sEmailAddress, 0, $iCurrentIndex); } $bInAddress = true; $iStartIndex = $iCurrentIndex; } break; case '>': if ($bInAddress) { $iEndIndex = $iCurrentIndex; $sEmail = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); $iEndIndex = 0; $iCurrentIndex = 0; $iStartIndex = 0; $bInAddress = false; } break; case '(': if ((!$bInName) && (!$bInAddress) && (!$bInComment)) { $bInComment = true; $iStartIndex = $iCurrentIndex; } break; case ')': if ($bInComment) { $iEndIndex = $iCurrentIndex; $sComment = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1); $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1); $iEndIndex = 0; $iCurrentIndex = 0; $iStartIndex = 0; $bInComment = false; } break; case '\\': $iCurrentIndex++; break; } $iCurrentIndex++; } if (\strlen($sEmail) === 0) { $aRegs = array(''); if (\preg_match('/[^@\s]+@\S+/i', $sEmailAddress, $aRegs) && isset($aRegs[0])) { $sEmail = $aRegs[0]; } else { $sName = $sEmailAddress; } } if ((\strlen($sEmail) > 0) && (\strlen($sName) == 0) && (\strlen($sComment) == 0)) { $sName = \str_replace($sEmail, '', $sEmailAddress); } $sEmail = \trim(\trim($sEmail), '<>'); $sEmail = \rtrim(\trim($sEmail), '.'); $sEmail = \trim($sEmail); $sName = \trim(\trim($sName), '"'); $sName = \trim($sName, '\''); $sComment = \trim(\trim($sComment), '()'); // Remove backslash $sName = \preg_replace('/\\\\(.)/s', '$1', $sName); $sComment = \preg_replace('/\\\\(.)/s', '$1', $sComment); return Email::NewInstance($sEmail, $sName, $sComment); } /** * @param bool $bIdn = false * * @return string */ public function GetEmail($bIdn = false) { return $bIdn ? \MailSo\Base\Utils::IdnToUtf8($this->sEmail) : $this->sEmail; } /** * @return string */ public function GetDisplayName() { return $this->sDisplayName; } /** * @return string */ public function GetRemark() { return $this->sRemark; } /** * @return string */ public function GetDkimStatus() { return $this->sDkimStatus; } /** * @return string */ public function GetDkimValue() { return $this->sDkimValue; } /** * @return string */ public function GetAccountName() { return \MailSo\Base\Utils::GetAccountNameFromEmail($this->GetEmail(false)); } /** * @param bool $bIdn = false * * @return string */ public function GetDomain($bIdn = false) { return \MailSo\Base\Utils::GetDomainFromEmail($this->GetEmail($bIdn)); } /** * @param string $sDkimStatus * @param string $sDkimValue = '' */ public function SetDkimStatusAndValue($sDkimStatus, $sDkimValue = '') { $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::normalizeValue($sDkimStatus); $this->sDkimValue = $sDkimValue; } /** * @param bool $bIdn = false * @param bool $bDkim = true * * @return array */ public function ToArray($bIdn = false, $bDkim = true) { return $bDkim ? array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark, $this->sDkimStatus, $this->sDkimValue) : array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark); } /** * @param bool $bConvertSpecialsName = false * @param bool $bIdn = false * * @return string */ public function ToString($bConvertSpecialsName = false, $bIdn = false) { $sReturn = ''; $sRemark = \str_replace(')', '\)', $this->sRemark); $sDisplayName = \str_replace('"', '\"', $this->sDisplayName); if ($bConvertSpecialsName) { $sDisplayName = 0 === \strlen($sDisplayName) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, $sDisplayName); $sRemark = 0 === \strlen($sRemark) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, $sRemark); } $sDisplayName = 0 === \strlen($sDisplayName) ? '' : '"'.$sDisplayName.'"'; $sRemark = 0 === \strlen($sRemark) ? '' : '('.$sRemark.')'; if (0 < \strlen($this->sEmail)) { $sReturn = $this->GetEmail($bIdn); if (0 < \strlen($sDisplayName.$sRemark)) { $sReturn = $sDisplayName.' <'.$sReturn.'> '.$sRemark; } } return \trim($sReturn); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/000077500000000000000000000000001361462701300270445ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Constants.php000066400000000000000000000006541361462701300315360ustar00rootroot00000000000000sParentCharset = $sParentCharset; $this->initInputData($sName, $sValue, $sEncodedValueForReparse); } /** * @param string $sName * @param string $sValue * @param string $sEncodedValueForReparse * * @return void */ private function initInputData($sName, $sValue, $sEncodedValueForReparse) { $this->sName = trim($sName); $this->sFullValue = trim($sValue); $this->sEncodedValueForReparse = ''; $this->oParameters = null; if (0 < \strlen($sEncodedValueForReparse) && $this->IsReparsed()) { $this->sEncodedValueForReparse = \trim($sEncodedValueForReparse); } if (0 < \strlen($this->sFullValue) && $this->IsParameterized()) { $aRawExplode = \explode(';', $this->sFullValue, 2); if (2 === \count($aRawExplode)) { $this->sValue = $aRawExplode[0]; $this->oParameters = \MailSo\Mime\ParameterCollection::NewInstance($aRawExplode[1]); } else { $this->sValue = $this->sFullValue; } } else { $this->sValue = $this->sFullValue; } } /** * @param string $sName * @param string $sValue = '' * @param string $sEncodedValueForReparse = '' * @param string $sParentCharset = '' * * @return \MailSo\Mime\Header */ public static function NewInstance($sName, $sValue = '', $sEncodedValueForReparse = '', $sParentCharset = '') { return new self($sName, $sValue, $sEncodedValueForReparse, $sParentCharset); } /** * @param string $sEncodedLines * @param string $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1 * * @return \MailSo\Mime\Header | false */ public static function NewInstanceFromEncodedString($sEncodedLines, $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1) { if (empty($sIncomingCharset)) { $sIncomingCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; } $aParts = \explode(':', \str_replace("\r", '', $sEncodedLines), 2); if (isset($aParts[0]) && isset($aParts[1]) && 0 < \strlen($aParts[0]) && 0 < \strlen($aParts[1])) { return self::NewInstance( \trim($aParts[0]), \trim(\MailSo\Base\Utils::DecodeHeaderValue(\trim($aParts[1]), $sIncomingCharset)), \trim($aParts[1]), $sIncomingCharset ); } return false; } /** * @return string */ public function Name() { return $this->sName; } /** * @return string */ public function NameWithDelimitrom() { return $this->Name().': '; } /** * @return string */ public function Value() { return $this->sValue; } /** * @return string */ public function FullValue() { return $this->sFullValue; } /** * @param string $sParentCharset * @return \MailSo\Mime\Header */ public function SetParentCharset($sParentCharset) { if ($this->sParentCharset !== $sParentCharset && $this->IsReparsed() && 0 < \strlen($this->sEncodedValueForReparse)) { $this->initInputData( $this->sName, \trim(\MailSo\Base\Utils::DecodeHeaderValue($this->sEncodedValueForReparse, $sParentCharset)), $this->sEncodedValueForReparse ); } $this->sParentCharset = $sParentCharset; return $this; } /** * @return \MailSo\Mime\ParameterCollection | null */ public function Parameters() { return $this->oParameters; } /** * @param string $sValue * @return string */ private function wordWrapHelper($sValue, $sGlue = "\r\n ") { return \trim(substr(wordwrap($this->NameWithDelimitrom().$sValue, \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, $sGlue ), \strlen($this->NameWithDelimitrom()))); } /** * @return string */ public function EncodedValue() { $sResult = $this->sFullValue; if ($this->IsSubject()) { if (!\MailSo\Base\Utils::IsAscii($sResult) && \MailSo\Base\Utils::IsIconvSupported() && \function_exists('iconv_mime_encode')) { $aPreferences = array( // 'scheme' => \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_SHORT, 'scheme' => \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, 'input-charset' => \MailSo\Base\Enumerations\Charset::UTF_8, 'output-charset' => \MailSo\Base\Enumerations\Charset::UTF_8, 'line-length' => \MailSo\Mime\Enumerations\Constants::LINE_LENGTH, 'line-break-chars' => \MailSo\Mime\Enumerations\Constants::CRLF ); return \iconv_mime_encode($this->Name(), $sResult, $aPreferences); } } else if ($this->IsParameterized() && $this->oParameters && 0 < $this->oParameters->Count()) { $sResult = $this->sValue.'; '.$this->oParameters->ToString(true); } else if ($this->IsEmail()) { $oEmailCollection = \MailSo\Mime\EmailCollection::NewInstance($this->sFullValue); if ($oEmailCollection && 0 < $oEmailCollection->Count()) { $sResult = $oEmailCollection->ToString(true, false); } } return $this->NameWithDelimitrom().$this->wordWrapHelper($sResult); } /** * @return bool */ public function IsSubject() { return \strtolower(\MailSo\Mime\Enumerations\Header::SUBJECT) === \strtolower($this->Name()); } /** * @return bool */ public function IsParameterized() { return \in_array(\strtolower($this->sName), array( \strtolower(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE), \strtolower(\MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION) )); } /** * @return bool */ public function IsEmail() { return \in_array(\strtolower($this->sName), array( \strtolower(\MailSo\Mime\Enumerations\Header::FROM_), \strtolower(\MailSo\Mime\Enumerations\Header::TO_), \strtolower(\MailSo\Mime\Enumerations\Header::CC), \strtolower(\MailSo\Mime\Enumerations\Header::BCC), \strtolower(\MailSo\Mime\Enumerations\Header::REPLY_TO), \strtolower(\MailSo\Mime\Enumerations\Header::RETURN_PATH), \strtolower(\MailSo\Mime\Enumerations\Header::SENDER) )); } /** * @return string */ public function ValueWithCharsetAutoDetect() { $sValue = $this->Value(); if (!\MailSo\Base\Utils::IsAscii($sValue) && 0 < \strlen($this->sEncodedValueForReparse) && !\MailSo\Base\Utils::IsAscii($this->sEncodedValueForReparse)) { $sValueCharset = \MailSo\Base\Utils::CharsetDetect($this->sEncodedValueForReparse); if (0 < \strlen($sValueCharset)) { $this->SetParentCharset($sValueCharset); $sValue = $this->Value(); } } return $sValue; } /** * @return bool */ public function IsReparsed() { return $this->IsEmail() || $this->IsSubject() || $this->IsParameterized(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/HeaderCollection.php000066400000000000000000000256761361462701300303300ustar00rootroot00000000000000sRawHeaders = ''; $this->sParentCharset = ''; if (0 < \strlen($sRawHeaders)) { $this->Parse($sRawHeaders, $bStoreRawHeaders); } } /** * @param string $sRawHeaders = '' * @param bool $bStoreRawHeaders = true * * @return \MailSo\Mime\HeaderCollection */ public static function NewInstance($sRawHeaders = '', $bStoreRawHeaders = true) { return new self($sRawHeaders, $bStoreRawHeaders); } /** * @param string $sName * @param string $sValue * @param bool $bToTop = false * * @return \MailSo\Mime\HeaderCollection * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function AddByName($sName, $sValue, $bToTop = false) { return $this->Add(Header::NewInstance($sName, $sValue), $bToTop); } /** * @param string $sName * @param string $sValue * @param bool $bToTop = false * * @return \MailSo\Mime\HeaderCollection * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetByName($sName, $sValue, $bToTop = false) { return $this->RemoveByName($sName)->Add(Header::NewInstance($sName, $sValue), $bToTop); } /** * @return \MailSo\Mime\Header | null */ public function &GetByIndex($iIndex) { $mResult = null; $mResult =& parent::GetByIndex($iIndex); return $mResult; } /** * @param string $sHeaderName * @param bool $bCharsetAutoDetect = false * @return string */ public function ValueByName($sHeaderName, $bCharsetAutoDetect = false) { $oHeader = null; $oHeader =& $this->GetByName($sHeaderName); return (null !== $oHeader) ? ($bCharsetAutoDetect ? $oHeader->ValueWithCharsetAutoDetect() : $oHeader->Value()) : ''; } /** * @param string $sHeaderName * @param bool $bCharsetAutoDetect = false * @return array */ public function ValuesByName($sHeaderName, $bCharsetAutoDetect = false) { $aResult = array(); $oHeader = null; $sHeaderNameLower = \strtolower($sHeaderName); $aHeaders =& $this->GetAsArray(); foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) { if ($sHeaderNameLower === \strtolower($oHeader->Name())) { $aResult[] = $bCharsetAutoDetect ? $oHeader->ValueWithCharsetAutoDetect() : $oHeader->Value(); } } return $aResult; } /** * @param string $sHeaderName * * @return \MailSo\Mime\HeaderCollection */ public function RemoveByName($sHeaderName) { $aResult = $this->FilterList(function ($oHeader) use ($sHeaderName) { return $oHeader && \strtolower($oHeader->Name()) !== \strtolower($sHeaderName); }); return $this->SetAsArray($aResult); } /** * @param string $sHeaderName * @param bool $bCharsetAutoDetect = false * * @return \MailSo\Mime\EmailCollection|null */ public function GetAsEmailCollection($sHeaderName, $bCharsetAutoDetect = false) { $oResult = null; $sValue = $this->ValueByName($sHeaderName, $bCharsetAutoDetect); if (0 < \strlen($sValue)) { $oResult = \MailSo\Mime\EmailCollection::NewInstance($sValue); } return $oResult && 0 < $oResult->Count() ? $oResult : null; } /** * @param string $sHeaderName * @return \MailSo\Mime\ParameterCollection|null */ public function ParametersByName($sHeaderName) { $oParameters = $oHeader = null; $oHeader =& $this->GetByName($sHeaderName); if ($oHeader) { $oParameters = $oHeader->Parameters(); } return $oParameters; } /** * @param string $sHeaderName * @param string $sParamName * @return string */ public function ParameterValue($sHeaderName, $sParamName) { $oParameters = $this->ParametersByName($sHeaderName); return (null !== $oParameters) ? $oParameters->ParameterValueByName($sParamName) : ''; } /** * @param string $sHeaderName * @return \MailSo\Mime\Header | false */ public function &GetByName($sHeaderName) { $oResult = $oHeader = null; $sHeaderNameLower = \strtolower($sHeaderName); $aHeaders =& $this->GetAsArray(); foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) { if ($sHeaderNameLower === \strtolower($oHeader->Name())) { $oResult =& $oHeader; break; } } return $oResult; } /** * @param array $aList * @return \MailSo\Mime\HeaderCollection * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetAsArray($aList) { parent::SetAsArray($aList); return $this; } /** * @param string $sParentCharset * @return \MailSo\Mime\HeaderCollection */ public function SetParentCharset($sParentCharset) { if (0 < \strlen($sParentCharset)) { if ($this->sParentCharset !== $sParentCharset) { $oHeader = null; $aHeaders =& $this->GetAsArray(); foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) { $oHeader->SetParentCharset($sParentCharset); } $this->sParentCharset = $sParentCharset; } } return $this; } /** * @return void */ public function Clear() { parent::Clear(); $this->sRawHeaders = ''; } /** * @param string $sRawHeaders * @param bool $bStoreRawHeaders = false * @param string $sParentCharset = '' * * @return \MailSo\Mime\HeaderCollection */ public function Parse($sRawHeaders, $bStoreRawHeaders = false, $sParentCharset = '') { $this->Clear(); if ($bStoreRawHeaders) { $this->sRawHeaders = $sRawHeaders; } if (0 === \strlen($this->sParentCharset)) { $this->sParentCharset = $sParentCharset; } $aHeaders = \explode("\n", \str_replace("\r", '', $sRawHeaders)); $sName = null; $sValue = null; foreach ($aHeaders as $sHeadersValue) { if (0 === strlen($sHeadersValue)) { continue; } $sFirstChar = \substr($sHeadersValue, 0, 1); if ($sFirstChar !== ' ' && $sFirstChar !== "\t" && false === \strpos($sHeadersValue, ':')) { continue; } else if (null !== $sName && ($sFirstChar === ' ' || $sFirstChar === "\t")) { $sValue = \is_null($sValue) ? '' : $sValue; if ('?=' === \substr(\rtrim($sHeadersValue), -2)) { $sHeadersValue = \rtrim($sHeadersValue); } if ('=?' === \substr(\ltrim($sHeadersValue), 0, 2)) { $sHeadersValue = \ltrim($sHeadersValue); } if ('=?' === \substr($sHeadersValue, 0, 2)) { $sValue .= $sHeadersValue; } else { $sValue .= "\n".$sHeadersValue; } } else { if (null !== $sName) { $oHeader = Header::NewInstanceFromEncodedString($sName.': '.$sValue, $this->sParentCharset); if ($oHeader) { $this->Add($oHeader); } $sName = null; $sValue = null; } $aHeaderParts = \explode(':', $sHeadersValue, 2); $sName = $aHeaderParts[0]; $sValue = isset($aHeaderParts[1]) ? $aHeaderParts[1] : ''; if ('?=' === \substr(\rtrim($sValue), -2)) { $sValue = \rtrim($sValue); } } } if (null !== $sName) { $oHeader = Header::NewInstanceFromEncodedString($sName.': '.$sValue, $this->sParentCharset); if ($oHeader) { $this->Add($oHeader); } } return $this; } /** * @return int */ public function DkimStatuses() { $aResult = array(); $aHeaders = $this->ValuesByName(\MailSo\Mime\Enumerations\Header::AUTHENTICATION_RESULTS); if (\is_array($aHeaders) && 0 < \count($aHeaders)) { foreach ($aHeaders as $sHeaderValue) { $sStatus = ''; $sHeader = ''; $sDkimLine = ''; $aMatch = array(); $sHeaderValue = \preg_replace('/[\r\n\t\s]+/', ' ', $sHeaderValue); if (\preg_match('/dkim=.+/i', $sHeaderValue, $aMatch) && !empty($aMatch[0])) { $sDkimLine = $aMatch[0]; $aMatch = array(); if (\preg_match('/dkim=([a-zA-Z0-9]+)/i', $sDkimLine, $aMatch) && !empty($aMatch[1])) { $sStatus = $aMatch[1]; } $aMatch = array(); if (\preg_match('/header\.(d|i|from)=([^\s;]+)/i', $sDkimLine, $aMatch) && !empty($aMatch[2])) { $sHeader = \trim($aMatch[2]); } if (!empty($sStatus) && !empty($sHeader)) { $aResult[] = array($sStatus, $sHeader, $sDkimLine); } } } } else { // X-DKIM-Authentication-Results: signer="hostinger.com" status="pass" $aHeaders = $this->ValuesByName(\MailSo\Mime\Enumerations\Header::X_DKIM_AUTHENTICATION_RESULTS); if (\is_array($aHeaders) && 0 < \count($aHeaders)) { foreach ($aHeaders as $sHeaderValue) { $sStatus = ''; $sHeader = ''; $aMatch = array(); $sHeaderValue = \preg_replace('/[\r\n\t\s]+/', ' ', $sHeaderValue); if (\preg_match('/status[\s]?=[\s]?"([a-zA-Z0-9]+)"/i', $sHeaderValue, $aMatch) && !empty($aMatch[1])) { $sStatus = $aMatch[1]; } if (\preg_match('/signer[\s]?=[\s]?"([^";]+)"/i', $sHeaderValue, $aMatch) && !empty($aMatch[1])) { $sHeader = \trim($aMatch[1]); } if (!empty($sStatus) && !empty($sHeader)) { $aResult[] = array($sStatus, $sHeader, $sHeaderValue); } } } } return $aResult; } /** * @return int */ public function PopulateEmailColectionByDkim($oEmails) { if ($oEmails && $oEmails instanceof \MailSo\Mime\EmailCollection) { $aDkimStatuses = $this->DkimStatuses(); if (\is_array($aDkimStatuses) && 0 < \count($aDkimStatuses)) { $oEmails->ForeachList(function (/* @var $oItem \MailSo\Mime\Email */ $oItem) use ($aDkimStatuses) { if ($oItem && $oItem instanceof \MailSo\Mime\Email) { $sEmail = $oItem->GetEmail(); foreach ($aDkimStatuses as $aDkimData) { if (isset($aDkimData[0], $aDkimData[1]) && $aDkimData[1] === \strstr($sEmail, $aDkimData[1])) { $oItem->SetDkimStatusAndValue($aDkimData[0], empty($aDkimData[2]) ? '' : $aDkimData[2]); } } } }); } } } /** * @return string */ public function ToEncodedString() { $aResult = array(); $aHeaders =& $this->GetAsArray(); foreach ($aHeaders as /* @var $oHeader \MailSo\Mime\Header */ &$oHeader) { $aResult[] = $oHeader->EncodedValue(); } return \implode(\MailSo\Mime\Enumerations\Constants::CRLF, $aResult); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php000066400000000000000000000542541361462701300265020ustar00rootroot00000000000000aHeadersValue = array(); $this->aAlternativeParts = array(); $this->oAttachmentCollection = AttachmentCollection::NewInstance(); $this->bAddEmptyTextPart = true; $this->bAddDefaultXMailer = true; } /** * @return \MailSo\Mime\Message */ public static function NewInstance() { return new self(); } /** * @return \MailSo\Mime\Message */ public function DoesNotCreateEmptyTextPart() { $this->bAddEmptyTextPart = false; return $this; } /** * @return \MailSo\Mime\Message */ public function DoesNotAddDefaultXMailer() { $this->bAddDefaultXMailer = false; return $this; } /** * @return string */ public function MessageId() { $sResult = ''; if (!empty($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID])) { $sResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID]; } return $sResult; } /** * @param string $sMessageId * * @return void */ public function SetMessageId($sMessageId) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID] = $sMessageId; } /** * @param string $sHostName = '' * * @return void */ public function RegenerateMessageId($sHostName = '') { $this->SetMessageId($this->generateNewMessageId($sHostName)); } /** * @return \MailSo\Mime\AttachmentCollection */ public function Attachments() { return $this->oAttachmentCollection; } /** * @return string */ public function GetSubject() { return isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT]) ? $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT] : ''; } /** * @return \MailSo\Mime\Email|null */ public function GetFrom() { $oResult = null; if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]) && $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_] instanceof \MailSo\Mime\Email) { $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]; } return $oResult; } /** * @return \MailSo\Mime\EmailCollection */ public function GetTo() { $oResult = \MailSo\Mime\EmailCollection::NewInstance(); if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]) && $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] instanceof \MailSo\Mime\EmailCollection) { $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]); } return $oResult->Unique(); } /** * @return \MailSo\Mime\EmailCollection|null */ public function GetBcc() { $oResult = null; if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]) && $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] instanceof \MailSo\Mime\EmailCollection) { $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]; } return $oResult ? $oResult->Unique() : null; } /** * @return \MailSo\Mime\EmailCollection */ public function GetRcpt() { $oResult = \MailSo\Mime\EmailCollection::NewInstance(); if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]) && $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] instanceof \MailSo\Mime\EmailCollection) { $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_]); } if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC]) && $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC] instanceof \MailSo\Mime\EmailCollection) { $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC]); } if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]) && $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] instanceof \MailSo\Mime\EmailCollection) { $oResult->MergeWithOtherCollection($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]); } return $oResult->Unique(); } /** * @param string $sHeaderName * @param string $sValue * * @return \MailSo\Mime\Message */ public function SetCustomHeader($sHeaderName, $sValue) { $sHeaderName = \trim($sHeaderName); if (0 < \strlen($sHeaderName)) { $this->aHeadersValue[$sHeaderName] = $sValue; } return $this; } /** * @param string $sSubject * * @return \MailSo\Mime\Message */ public function SetSubject($sSubject) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SUBJECT] = $sSubject; return $this; } /** * @param string $sInReplyTo * * @return \MailSo\Mime\Message */ public function SetInReplyTo($sInReplyTo) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::IN_REPLY_TO] = $sInReplyTo; return $this; } /** * @param string $sReferences * * @return \MailSo\Mime\Message */ public function SetReferences($sReferences) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::REFERENCES] = \MailSo\Base\Utils::StripSpaces($sReferences); return $this; } /** * @param string $sEmail * * @return \MailSo\Mime\Message */ public function SetReadReceipt($sEmail) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DISPOSITION_NOTIFICATION_TO] = $sEmail; $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_CONFIRM_READING_TO] = $sEmail; return $this; } /** * @param string $sEmail * * @return \MailSo\Mime\Message */ public function SetReadConfirmation($sEmail) { return $this->SetReadReceipt($sEmail); } /** * @param int $iValue * * @return \MailSo\Mime\Message */ public function SetPriority($iValue) { $sResult = ''; switch ($iValue) { case \MailSo\Mime\Enumerations\MessagePriority::HIGH: $sResult = \MailSo\Mime\Enumerations\MessagePriority::HIGH.' (Highest)'; break; case \MailSo\Mime\Enumerations\MessagePriority::NORMAL: $sResult = \MailSo\Mime\Enumerations\MessagePriority::NORMAL.' (Normal)'; break; case \MailSo\Mime\Enumerations\MessagePriority::LOW: $sResult = \MailSo\Mime\Enumerations\MessagePriority::LOW.' (Lowest)'; break; } if (0 < \strlen($sResult)) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_PRIORITY] = $sResult; } return $this; } /** * @param int $iValue * * @return \MailSo\Mime\Message */ public function SetSensitivity($iValue) { $sResult = ''; switch ($iValue) { case \MailSo\Mime\Enumerations\Sensitivity::CONFIDENTIAL: $sResult = 'Company-Confidential'; break; case \MailSo\Mime\Enumerations\Sensitivity::PERSONAL: $sResult = 'Personal'; break; case \MailSo\Mime\Enumerations\Sensitivity::PRIVATE_: $sResult = 'Private'; break; } if (0 < \strlen($sResult)) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SENSITIVITY] = $sResult; } return $this; } /** * @param string $sXMailer * * @return \MailSo\Mime\Message */ public function SetXMailer($sXMailer) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER] = $sXMailer; return $this; } /** * @param \MailSo\Mime\Email $oEmail * * @return \MailSo\Mime\Message */ public function SetFrom(\MailSo\Mime\Email $oEmail) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_] = $oEmail; return $this; } /** * @param \MailSo\Mime\EmailCollection $oEmails * * @return \MailSo\Mime\Message */ public function SetTo(\MailSo\Mime\EmailCollection $oEmails) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::TO_] = $oEmails; return $this; } /** * @param int $iDateTime * * @return \MailSo\Mime\Message */ public function SetDate($iDateTime) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE] = gmdate('r', $iDateTime); return $this; } /** * @param \MailSo\Mime\EmailCollection $oEmails * * @return \MailSo\Mime\Message */ public function SetReplyTo(\MailSo\Mime\EmailCollection $oEmails) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::REPLY_TO] = $oEmails; return $this; } /** * @param \MailSo\Mime\EmailCollection $oEmails * * @return \MailSo\Mime\Message */ public function SetCc(\MailSo\Mime\EmailCollection $oEmails) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::CC] = $oEmails; return $this; } /** * @param \MailSo\Mime\EmailCollection $oEmails * * @return \MailSo\Mime\Message */ public function SetBcc(\MailSo\Mime\EmailCollection $oEmails) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] = $oEmails; return $this; } /** * @param \MailSo\Mime\EmailCollection $oEmails * * @return \MailSo\Mime\Message */ public function SetSender(\MailSo\Mime\EmailCollection $oEmails) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::SENDER] = $oEmails; return $this; } /** * @param string $sType * @param string $sUid * @param string $sFolder * * @return \MailSo\Mime\Message */ public function SetDraftInfo($sType, $sUid, $sFolder) { $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_DRAFT_INFO] = \MailSo\Mime\ParameterCollection::NewInstance() ->Add(\MailSo\Mime\Parameter::NewInstance('type', $sType)) ->Add(\MailSo\Mime\Parameter::NewInstance('uid', $sUid)) ->Add(\MailSo\Mime\Parameter::NewInstance('folder', base64_encode($sFolder))) ; return $this; } /** * @param string $sPlain * * @return \MailSo\Mime\Message */ public function AddPlain($sPlain) { return $this->AddAlternative( \MailSo\Mime\Enumerations\MimeType::TEXT_PLAIN, trim($sPlain), \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_LOWER); } /** * @param string $sHtml * * @return \MailSo\Mime\Message */ public function AddHtml($sHtml) { return $this->AddAlternative( \MailSo\Mime\Enumerations\MimeType::TEXT_HTML, trim($sHtml), \MailSo\Base\Enumerations\Encoding::QUOTED_PRINTABLE_LOWER); } /** * @param string $sHtmlOrPlainText * @param bool $bIsHtml = false * * @return \MailSo\Mime\Message */ public function AddText($sHtmlOrPlainText, $bIsHtml = false) { return $bIsHtml ? $this->AddHtml($sHtmlOrPlainText) : $this->AddPlain($sHtmlOrPlainText); } /** * @param string $sContentType * @param string|resource $mData * @param string $sContentTransferEncoding = '' * @param array $aCustomContentTypeParams = array() * * @return \MailSo\Mime\Message */ public function AddAlternative($sContentType, $mData, $sContentTransferEncoding = '', $aCustomContentTypeParams = array()) { $this->aAlternativeParts[] = array($sContentType, $mData, $sContentTransferEncoding, $aCustomContentTypeParams); return $this; } /** * @return string */ private function generateNewBoundary() { return '--='.\MailSo\Config::$BoundaryPrefix. \rand(100, 999).'_'.rand(100000000, 999999999).'.'.\time(); } /** * @param string $sHostName = '' * * @return string */ private function generateNewMessageId($sHostName = '') { if (0 === \strlen($sHostName)) { $sHostName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : ''; } if (empty($sHostName) && \MailSo\Base\Utils::FunctionExistsAndEnabled('php_uname')) { $sHostName = \php_uname('n'); } if (empty($sHostName)) { $sHostName = 'localhost'; } return '<'. \MailSo\Base\Utils::Md5Rand($sHostName. (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? @\getmypid() : '')).'@'.$sHostName.'>'; } /** * @param \MailSo\Mime\Attachment $oAttachment * * @return \MailSo\Mime\Part */ private function createNewMessageAttachmentBody($oAttachment) { $oAttachmentPart = Part::NewInstance(); $sFileName = $oAttachment->FileName(); $sCID = $oAttachment->CID(); $sContentLocation = $oAttachment->ContentLocation(); $oContentTypeParameters = null; $oContentDispositionParameters = null; if (0 < strlen(trim($sFileName))) { $oContentTypeParameters = ParameterCollection::NewInstance()->Add(Parameter::NewInstance( \MailSo\Mime\Enumerations\Parameter::NAME, $sFileName)); $oContentDispositionParameters = ParameterCollection::NewInstance()->Add(Parameter::NewInstance( \MailSo\Mime\Enumerations\Parameter::FILENAME, $sFileName)); } $oAttachmentPart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, $oAttachment->ContentType().';'. (($oContentTypeParameters) ? ' '.$oContentTypeParameters->ToString() : '') ) ); $oAttachmentPart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, ($oAttachment->IsInline() ? 'inline' : 'attachment').';'. (($oContentDispositionParameters) ? ' '.$oContentDispositionParameters->ToString() : '') ) ); if (0 < strlen($sCID)) { $oAttachmentPart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_ID, $sCID) ); } if (0 < strlen($sContentLocation)) { $oAttachmentPart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_LOCATION, $sContentLocation) ); } $oAttachmentPart->Body = $oAttachment->Resource(); if ('message/rfc822' !== strtolower($oAttachment->ContentType())) { $oAttachmentPart->Headers->Add( Header::NewInstance( \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING, \MailSo\Base\Enumerations\Encoding::BASE64_LOWER ) ); if (is_resource($oAttachmentPart->Body)) { if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAttachmentPart->Body)) { $oAttachmentPart->Body = \MailSo\Base\StreamWrappers\Binary::CreateStream($oAttachmentPart->Body, \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( \MailSo\Base\Enumerations\Encoding::BASE64, false)); \MailSo\Base\StreamWrappers\Binary::RememberStream($oAttachmentPart->Body); } } } return $oAttachmentPart; } /** * @param array $aAlternativeData * * @return \MailSo\Mime\Part */ private function createNewMessageAlternativePartBody($aAlternativeData) { $oAlternativePart = null; if (is_array($aAlternativeData) && isset($aAlternativeData[0])) { $oAlternativePart = Part::NewInstance(); $oParameters = ParameterCollection::NewInstance(); $oParameters->Add( Parameter::NewInstance( \MailSo\Mime\Enumerations\Parameter::CHARSET, \MailSo\Base\Enumerations\Charset::UTF_8) ); if (isset($aAlternativeData[3]) && \is_array($aAlternativeData[3]) && 0 < \count($aAlternativeData[3])) { foreach ($aAlternativeData[3] as $sName => $sValue) { $oParameters->Add(Parameter::NewInstance($sName, $sValue)); } } $oAlternativePart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, $aAlternativeData[0].'; '.$oParameters->ToString()) ); $oAlternativePart->Body = null; if (isset($aAlternativeData[1])) { if (is_resource($aAlternativeData[1])) { $oAlternativePart->Body = $aAlternativeData[1]; } else if (is_string($aAlternativeData[1]) && 0 < strlen($aAlternativeData[1])) { $oAlternativePart->Body = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($aAlternativeData[1]); } } if (isset($aAlternativeData[2]) && 0 < strlen($aAlternativeData[2])) { $oAlternativePart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING, $aAlternativeData[2] ) ); if (is_resource($oAlternativePart->Body)) { if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAlternativePart->Body)) { $oAlternativePart->Body = \MailSo\Base\StreamWrappers\Binary::CreateStream($oAlternativePart->Body, \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( $aAlternativeData[2], false)); \MailSo\Base\StreamWrappers\Binary::RememberStream($oAlternativePart->Body); } } } if (!is_resource($oAlternativePart->Body)) { $oAlternativePart->Body = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString(''); } } return $oAlternativePart; } /** * @param \MailSo\Mime\Part $oPlainPart * @param \MailSo\Mime\Part $oHtmlPart * * @return \MailSo\Mime\Part */ private function createNewMessageSimpleOrAlternativeBody() { $oResultPart = null; if (1 < count($this->aAlternativeParts)) { $oResultPart = Part::NewInstance(); $oResultPart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\MimeType::MULTIPART_ALTERNATIVE.'; '. ParameterCollection::NewInstance()->Add( Parameter::NewInstance( \MailSo\Mime\Enumerations\Parameter::BOUNDARY, $this->generateNewBoundary()) )->ToString() ) ); foreach ($this->aAlternativeParts as $aAlternativeData) { $oAlternativePart = $this->createNewMessageAlternativePartBody($aAlternativeData); if ($oAlternativePart) { $oResultPart->SubParts->Add($oAlternativePart); } unset($oAlternativePart); } } else if (1 === count($this->aAlternativeParts)) { $oAlternativePart = $this->createNewMessageAlternativePartBody($this->aAlternativeParts[0]); if ($oAlternativePart) { $oResultPart = $oAlternativePart; } } if (!$oResultPart) { if ($this->bAddEmptyTextPart) { $oResultPart = $this->createNewMessageAlternativePartBody(array( \MailSo\Mime\Enumerations\MimeType::TEXT_PLAIN, null )); } else { $aAttachments = $this->oAttachmentCollection->CloneAsArray(); if (\is_array($aAttachments) && 1 === count($aAttachments) && isset($aAttachments[0])) { $this->oAttachmentCollection->Clear(); $oResultPart = $this->createNewMessageAlternativePartBody(array( $aAttachments[0]->ContentType(), $aAttachments[0]->Resource(), '', $aAttachments[0]->CustomContentTypeParams() )); } } } return $oResultPart; } /** * @param \MailSo\Mime\Part $oIncPart * * @return \MailSo\Mime\Part */ private function createNewMessageRelatedBody($oIncPart) { $oResultPart = null; $aAttachments = $this->oAttachmentCollection->LinkedAttachments(); if (0 < count($aAttachments)) { $oResultPart = Part::NewInstance(); $oResultPart->Headers->Add( Header::NewInstance(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\MimeType::MULTIPART_RELATED.'; '. ParameterCollection::NewInstance()->Add( Parameter::NewInstance( \MailSo\Mime\Enumerations\Parameter::BOUNDARY, $this->generateNewBoundary()) )->ToString() ) ); $oResultPart->SubParts->Add($oIncPart); foreach ($aAttachments as $oAttachment) { $oResultPart->SubParts->Add($this->createNewMessageAttachmentBody($oAttachment)); } } else { $oResultPart = $oIncPart; } return $oResultPart; } /** * @param \MailSo\Mime\Part $oIncPart * * @return \MailSo\Mime\Part */ private function createNewMessageMixedBody($oIncPart) { $oResultPart = null; $aAttachments = $this->oAttachmentCollection->UnlinkedAttachments(); if (0 < count($aAttachments)) { $oResultPart = Part::NewInstance(); $oResultPart->Headers->AddByName(\MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\MimeType::MULTIPART_MIXED.'; '. ParameterCollection::NewInstance()->Add( Parameter::NewInstance( \MailSo\Mime\Enumerations\Parameter::BOUNDARY, $this->generateNewBoundary()) )->ToString() ); $oResultPart->SubParts->Add($oIncPart); foreach ($aAttachments as $oAttachment) { $oResultPart->SubParts->Add($this->createNewMessageAttachmentBody($oAttachment)); } } else { $oResultPart = $oIncPart; } return $oResultPart; } /** * @param \MailSo\Mime\Part $oIncPart * @param bool $bWithoutBcc = false * * @return \MailSo\Mime\Part */ private function setDefaultHeaders($oIncPart, $bWithoutBcc = false) { if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE])) { $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::DATE, \gmdate('r'), true); } if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID])) { $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID, $this->generateNewMessageId(), true); } if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER]) && $this->bAddDefaultXMailer) { $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::X_MAILER, \MailSo\Version::XMailer(), true); } if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MIME_VERSION])) { $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MIME_VERSION, '1.0', true); } foreach ($this->aHeadersValue as $sName => $mValue) { if (\is_object($mValue)) { if ($mValue instanceof \MailSo\Mime\EmailCollection || $mValue instanceof \MailSo\Mime\Email || $mValue instanceof \MailSo\Mime\ParameterCollection) { $mValue = $mValue->ToString(); } } if (!($bWithoutBcc && \strtolower(\MailSo\Mime\Enumerations\Header::BCC) === \strtolower($sName))) { $oIncPart->Headers->SetByName($sName, (string) $mValue); } } return $oIncPart; } /** * @param bool $bWithoutBcc = false * * @return \MailSo\Mime\Part */ public function ToPart($bWithoutBcc = false) { $oPart = $this->createNewMessageSimpleOrAlternativeBody(); $oPart = $this->createNewMessageRelatedBody($oPart); $oPart = $this->createNewMessageMixedBody($oPart); $oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc); return $oPart; } /** * @param bool $bWithoutBcc = false * * @return resource */ public function ToStream($bWithoutBcc = false) { return $this->ToPart($bWithoutBcc)->ToStream(); } /** * @param bool $bWithoutBcc = false * * @return string */ public function ToString($bWithoutBcc = false) { return \stream_get_contents($this->ToStream($bWithoutBcc)); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parameter.php000066400000000000000000000045321361462701300270300ustar00rootroot00000000000000sName = $sName; $this->sValue = $sValue; } /** * @param string $sName * @param string $sValue = '' * * @return \MailSo\Mime\Parameter */ public static function NewInstance($sName, $sValue = '') { return new self($sName, $sValue); } /** * @param string $sName * @param string $sValue = '' * * @return \MailSo\Mime\Parameter */ public static function CreateFromParameterLine($sRawParam) { $oParameter = self::NewInstance(''); return $oParameter->Parse($sRawParam); } /** * @return \MailSo\Mime\Parameter */ public function Reset() { $this->sName = ''; $this->sValue = ''; return $this; } /** * @return string */ public function Name() { return $this->sName; } /** * @return string */ public function Value() { return $this->sValue; } /** * @param string $sRawParam * @param string $sSeparator = '=' * * @return \MailSo\Mime\Parameter */ public function Parse($sRawParam, $sSeparator = '=') { $this->Reset(); $aParts = explode($sSeparator, $sRawParam, 2); $this->sName = trim(trim($aParts[0]), '"\''); if (2 === count($aParts)) { $this->sValue = trim(trim($aParts[1]), '"\''); } return $this; } /** * @param bool $bConvertSpecialsName = false * * @return string */ public function ToString($bConvertSpecialsName = false) { $sResult = ''; if (0 < strlen($this->sName)) { $sResult = $this->sName.'='; if ($bConvertSpecialsName && in_array(strtolower($this->sName), array( strtolower(\MailSo\Mime\Enumerations\Parameter::NAME), strtolower(\MailSo\Mime\Enumerations\Parameter::FILENAME) ))) { $sResult .= '"'.\MailSo\Base\Utils::EncodeUnencodedValue( \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, $this->sValue).'"'; } else { $sResult .= '"'.$this->sValue.'"'; } } return $sResult; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/ParameterCollection.php000066400000000000000000000104041361462701300310370ustar00rootroot00000000000000Parse($sRawParams); } } /** * @param string $sRawParams = '' * * @return \MailSo\Mime\ParameterCollection */ public static function NewInstance($sRawParams = '') { return new self($sRawParams); } /** * @return \MailSo\Mime\Parameter|null */ public function &GetByIndex($iIndex) { $mResult = null; $mResult =& parent::GetByIndex($iIndex); return $mResult; } /** * @param array $aList * * @return \MailSo\Mime\ParameterCollection * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetAsArray($aList) { parent::SetAsArray($aList); return $this; } /** * @param string $sName * * @return string */ public function ParameterValueByName($sName) { $sResult = ''; $sName = \trim($sName); $aParams =& $this->GetAsArray(); foreach ($aParams as /* @var $oParam \MailSo\Mime\ParameterCollection */ $oParam) { if (\strtolower($sName) === \strtolower($oParam->Name())) { $sResult = $oParam->Value(); break; } } return $sResult; } /** * @param string $sRawParams * * @return \MailSo\Mime\ParameterCollection */ public function Parse($sRawParams) { $this->Clear(); $aDataToParse = \explode(';', $sRawParams); foreach ($aDataToParse as $sParam) { $this->Add(Parameter::CreateFromParameterLine($sParam)); } $this->reParseParameters(); return $this; } /** * @param bool $bConvertSpecialsName = false * * @return string */ public function ToString($bConvertSpecialsName = false) { $aResult = array(); $aParams =& $this->GetAsArray(); foreach ($aParams as /* @var $oParam \MailSo\Mime\Parameter */ $oParam) { $sLine = $oParam->ToString($bConvertSpecialsName); if (0 < \strlen($sLine)) { $aResult[] = $sLine; } } return 0 < \count($aResult) ? \implode('; ', $aResult) : ''; } /** * @return void */ private function reParseParameters() { $aDataToReParse = $this->CloneAsArray(); $sCharset = \MailSo\Base\Enumerations\Charset::UTF_8; $this->Clear(); $aPreParams = array(); foreach ($aDataToReParse as /* @var $oParam \MailSo\Mime\Parameter */ $oParam) { $aMatch = array(); $sParamName = $oParam->Name(); if (\preg_match('/([^\*]+)\*([\d]{1,2})\*/', $sParamName, $aMatch) && isset($aMatch[1], $aMatch[2]) && 0 < \strlen($aMatch[1]) && \is_numeric($aMatch[2])) { if (!isset($aPreParams[$aMatch[1]])) { $aPreParams[$aMatch[1]] = array(); } $sValue = $oParam->Value(); if (false !== \strpos($sValue, "''")) { $aValueParts = \explode("''", $sValue, 2); if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[1])) { $sCharset = $aValueParts[0]; $sValue = $aValueParts[1]; } } $aPreParams[$aMatch[1]][(int) $aMatch[2]] = $sValue; } else if (\preg_match('/([^\*]+)\*/', $sParamName, $aMatch) && isset($aMatch[1])) { if (!isset($aPreParams[$aMatch[1]])) { $aPreParams[$aMatch[1]] = array(); } $sValue = $oParam->Value(); if (false !== \strpos($sValue, "''")) { $aValueParts = \explode("''", $sValue, 2); if (\is_array($aValueParts) && 2 === \count($aValueParts) && 0 < \strlen($aValueParts[1])) { $sCharset = $aValueParts[0]; $sValue = $aValueParts[1]; } } $aPreParams[$aMatch[1]][0] = $sValue; } else { $this->Add($oParam); } } foreach ($aPreParams as $sName => $aValues) { ksort($aValues); $sResult = \implode(\array_values($aValues)); $sResult = \urldecode($sResult); if (0 < \strlen($sCharset)) { $sResult = \MailSo\Base\Utils::ConvertEncoding($sResult, $sCharset, \MailSo\Base\Enumerations\Charset::UTF_8); } $this->Add(Parameter::NewInstance($sName, $sResult)); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/000077500000000000000000000000001361462701300256275ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php000066400000000000000000000022101361462701300306060ustar00rootroot00000000000000oCurrentMime = $oPart; } /** * @param string $sBuffer * * @return void */ public function WriteBody($sBuffer) { if (null === $this->oCurrentMime->Body) { $this->oCurrentMime->Body = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); } if (\is_resource($this->oCurrentMime->Body)) { \fwrite($this->oCurrentMime->Body, $sBuffer); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php000066400000000000000000000336231361462701300260210ustar00rootroot00000000000000iParseBuffer = \MailSo\Mime\Part::DEFAUL_BUFFER; $this->Reset(); } /** * @return \MailSo\Mime\Part */ public static function NewInstance() { return new self(); } /** * @return \MailSo\Mime\Part */ public function Reset() { \MailSo\Base\ResourceRegistry::CloseMemoryResource($this->Body); $this->Body = null; $this->Headers = HeaderCollection::NewInstance(); $this->SubParts = PartCollection::NewInstance(); $this->LineParts = array(); $this->sBoundary = ''; $this->sParentCharset = \MailSo\Base\Enumerations\Charset::ISO_8859_1; return $this; } /** * @return string */ public function Boundary() { return $this->sBoundary; } /** * @return string */ public function ParentCharset() { return (0 < \strlen($this->sCharset)) ? $this->sParentCharset : self::$DefaultCharset; } /** * @param string $sParentCharset * @return \MailSo\Mime\Part */ public function SetParentCharset($sParentCharset) { $this->sParentCharset = $sParentCharset; return $this; } /** * @param string $sBoundary * @return \MailSo\Mime\Part */ public function SetBoundary($sBoundary) { $this->sBoundary = $sBoundary; return $this; } /** * @param int $iParseBuffer * @return \MailSo\Mime\Part */ public function SetParseBuffer($iParseBuffer) { $this->iParseBuffer = $iParseBuffer; return $this; } /** * @return string */ public function HeaderCharset() { return ($this->Headers) ? trim(strtolower($this->Headers->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Parameter::CHARSET))) : ''; } /** * @return string */ public function HeaderBoundary() { return ($this->Headers) ? trim($this->Headers->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Parameter::BOUNDARY)) : ''; } /** * @return string */ public function ContentType() { return ($this->Headers) ? trim(strtolower($this->Headers->ValueByName( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE))) : ''; } /** * @return string */ public function ContentTransferEncoding() { return ($this->Headers) ? trim(strtolower($this->Headers->ValueByName( \MailSo\Mime\Enumerations\Header::CONTENT_TRANSFER_ENCODING))) : ''; } /** * @return string */ public function ContentID() { return ($this->Headers) ? trim($this->Headers->ValueByName( \MailSo\Mime\Enumerations\Header::CONTENT_ID)) : ''; } /** * @return string */ public function ContentLocation() { return ($this->Headers) ? trim($this->Headers->ValueByName( \MailSo\Mime\Enumerations\Header::CONTENT_LOCATION)) : ''; } /** * @return bool */ public function IsFlowedFormat() { $bResult = false; if ($this->Headers) { $bResult = 'flowed' === \trim(\strtolower($this->Headers->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Parameter::FORMAT))); if ($bResult && \in_array(\strtolower($this->MailEncodingName()), array('base64', 'quoted-printable'))) { $bResult = false; } } return $bResult; } /** * @return string */ public function FileName() { $sResult = ''; if ($this->Headers) { $sResult = trim($this->Headers->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_DISPOSITION, \MailSo\Mime\Enumerations\Parameter::FILENAME)); if (0 === strlen($sResult)) { $sResult = trim($this->Headers->ParameterValue( \MailSo\Mime\Enumerations\Header::CONTENT_TYPE, \MailSo\Mime\Enumerations\Parameter::NAME)); } } return $sResult; } /** * @param string $sFileName * @return \MailSo\Mime\Part */ public function ParseFromFile($sFileName) { $rStreamHandle = (@file_exists($sFileName)) ? @fopen($sFileName, 'rb') : false; if (is_resource($rStreamHandle)) { $this->ParseFromStream($rStreamHandle); if (is_resource($rStreamHandle)) { fclose($rStreamHandle); } } return $this; } /** * @param string $sRawMessage * @return \MailSo\Mime\Part */ public function ParseFromString($sRawMessage) { $rStreamHandle = (0 < strlen($sRawMessage)) ? \MailSo\Base\ResourceRegistry::CreateMemoryResource() : false; if (is_resource($rStreamHandle)) { fwrite($rStreamHandle, $sRawMessage); unset($sRawMessage); fseek($rStreamHandle, 0); $this->ParseFromStream($rStreamHandle); \MailSo\Base\ResourceRegistry::CloseMemoryResource($rStreamHandle); } return $this; } /** * @param resource $rStreamHandle * @return \MailSo\Mime\Part */ public function ParseFromStream($rStreamHandle) { $this->Reset(); $oParserClass = new \MailSo\Mime\Parser\ParserMemory(); $oMimePart = null; $bIsOef = false; $iOffset = 0; $sBuffer = ''; $sPrevBuffer = ''; $aBoundaryStack = array(); $oParserClass->StartParse($this); $this->LineParts[] =& $this; $this->ParseFromStreamRecursion($rStreamHandle, $oParserClass, $iOffset, $sPrevBuffer, $sBuffer, $aBoundaryStack, $bIsOef); $sFirstNotNullCharset = null; foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) { $sCharset = $oMimePart->HeaderCharset(); if (0 < strlen($sCharset)) { $sFirstNotNullCharset = $sCharset; break; } } $sForceCharset = self::$ForceCharset; if (0 < strlen($sForceCharset)) { foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) { $oMimePart->SetParentCharset($sForceCharset); $oMimePart->Headers->SetParentCharset($sForceCharset); } } else { $sFirstNotNullCharset = (null !== $sFirstNotNullCharset) ? $sFirstNotNullCharset : self::$DefaultCharset; foreach ($this->LineParts as /* @var $oMimePart \MailSo\Mime\Part */ &$oMimePart) { $sHeaderCharset = $oMimePart->HeaderCharset(); $oMimePart->SetParentCharset((0 < strlen($sHeaderCharset)) ? $sHeaderCharset : $sFirstNotNullCharset); $oMimePart->Headers->SetParentCharset($sHeaderCharset); } } $oParserClass->EndParse($this); return $this; } /** * @param resource $rStreamHandle * @return \MailSo\Mime\Part */ public function ParseFromStreamRecursion($rStreamHandle, &$oCallbackClass, &$iOffset, &$sPrevBuffer, &$sBuffer, &$aBoundaryStack, &$bIsOef, $bNotFirstRead = false) { $oCallbackClass->StartParseMimePart($this); $iPos = 0; $iParsePosition = self::POS_HEADERS; $sCurrentBoundary = ''; $bIsBoundaryCheck = false; $aHeadersLines = array(); while (true) { if (!$bNotFirstRead) { $sPrevBuffer = $sBuffer; $sBuffer = ''; } if (!$bIsOef && !feof($rStreamHandle)) { if (!$bNotFirstRead) { $sBuffer = @fread($rStreamHandle, $this->iParseBuffer); if (false === $sBuffer) { break; } $oCallbackClass->ReadBuffer($sBuffer); } else { $bNotFirstRead = false; } } else if ($bIsOef && 0 === strlen($sBuffer)) { break; } else { $bIsOef = true; } while (true) { $sCurrentLine = $sPrevBuffer.$sBuffer; if (self::POS_HEADERS === $iParsePosition) { $iEndLen = 4; $iPos = strpos($sCurrentLine, "\r\n\r\n", $iOffset); if (false === $iPos) { $iEndLen = 2; $iPos = strpos($sCurrentLine, "\n\n", $iOffset); } if (false !== $iPos) { $aHeadersLines[] = substr($sCurrentLine, $iOffset, $iPos + $iEndLen - $iOffset); $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); $aHeadersLines = array(); $oCallbackClass->InitMimePartHeader(); $sBoundary = $this->HeaderBoundary(); if (0 < strlen($sBoundary)) { $sBoundary = '--'.$sBoundary; $sCurrentBoundary = $sBoundary; array_unshift($aBoundaryStack, $sBoundary); } $iOffset = $iPos + $iEndLen; $iParsePosition = self::POS_BODY; continue; } else { $iBufferLen = strlen($sPrevBuffer); if ($iBufferLen > $iOffset) { $aHeadersLines[] = substr($sPrevBuffer, $iOffset); $iOffset = 0; } else { $iOffset -= $iBufferLen; } break; } } else if (self::POS_BODY === $iParsePosition) { $iPos = false; $sBoundaryLen = 0; $bIsBoundaryEnd = false; $bCurrentPartBody = false; $bIsBoundaryCheck = 0 < count($aBoundaryStack); foreach ($aBoundaryStack as $sKey => $sBoundary) { if (false !== ($iPos = strpos($sCurrentLine, $sBoundary, $iOffset))) { if ($sCurrentBoundary === $sBoundary) { $bCurrentPartBody = true; } $sBoundaryLen = strlen($sBoundary); if ('--' === substr($sCurrentLine, $iPos + $sBoundaryLen, 2)) { $sBoundaryLen += 2; $bIsBoundaryEnd = true; unset($aBoundaryStack[$sKey]); $sCurrentBoundary = (isset($aBoundaryStack[$sKey + 1])) ? $aBoundaryStack[$sKey + 1] : ''; } break; } } if (false !== $iPos) { $oCallbackClass->WriteBody(substr($sCurrentLine, $iOffset, $iPos - $iOffset)); $iOffset = $iPos; if ($bCurrentPartBody) { $iParsePosition = self::POS_SUBPARTS; continue; } $oCallbackClass->EndParseMimePart($this); return true; } else { $iBufferLen = strlen($sPrevBuffer); if ($iBufferLen > $iOffset) { $oCallbackClass->WriteBody(substr($sPrevBuffer, $iOffset)); $iOffset = 0; } else { $iOffset -= $iBufferLen; } break; } } else if (self::POS_SUBPARTS === $iParsePosition) { $iPos = false; $sBoundaryLen = 0; $bIsBoundaryEnd = false; $bCurrentPartBody = false; $bIsBoundaryCheck = 0 < count($aBoundaryStack); foreach ($aBoundaryStack as $sKey => $sBoundary) { if (false !== ($iPos = strpos($sCurrentLine, $sBoundary, $iOffset))) { if ($sCurrentBoundary === $sBoundary) { $bCurrentPartBody = true; } $sBoundaryLen = strlen($sBoundary); if ('--' === substr($sCurrentLine, $iPos + $sBoundaryLen, 2)) { $sBoundaryLen += 2; $bIsBoundaryEnd = true; unset($aBoundaryStack[$sKey]); $sCurrentBoundary = (isset($aBoundaryStack[$sKey + 1])) ? $aBoundaryStack[$sKey + 1] : ''; } break; } } if (false !== $iPos && $bCurrentPartBody) { $iOffset = $iPos + $sBoundaryLen; $oSubPart = self::NewInstance(); $oSubPart ->SetParseBuffer($this->iParseBuffer) ->ParseFromStreamRecursion($rStreamHandle, $oCallbackClass, $iOffset, $sPrevBuffer, $sBuffer, $aBoundaryStack, $bIsOef, true); $this->SubParts->Add($oSubPart); $this->LineParts[] =& $oSubPart; //$iParsePosition = self::POS_HEADERS; unset($oSubPart); } else { $oCallbackClass->EndParseMimePart($this); return true; } } } } if (0 < strlen($sPrevBuffer)) { if (self::POS_HEADERS === $iParsePosition) { $aHeadersLines[] = ($iOffset < strlen($sPrevBuffer)) ? substr($sPrevBuffer, $iOffset) : $sPrevBuffer; $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); $aHeadersLines = array(); $oCallbackClass->InitMimePartHeader(); } else if (self::POS_BODY === $iParsePosition) { if (!$bIsBoundaryCheck) { $oCallbackClass->WriteBody(($iOffset < strlen($sPrevBuffer)) ? substr($sPrevBuffer, $iOffset) : $sPrevBuffer); } } } else { if (self::POS_HEADERS === $iParsePosition && 0 < count($aHeadersLines)) { $this->Headers->Parse(implode($aHeadersLines))->SetParentCharset($this->HeaderCharset()); $aHeadersLines = array(); $oCallbackClass->InitMimePartHeader(); } } $oCallbackClass->EndParseMimePart($this); return $this; } /** * @return resorce */ public function Rewind() { if ($this->Body && \is_resource($this->Body)) { $aMeta = \stream_get_meta_data($this->Body); if (isset($aMeta['seekable']) && $aMeta['seekable']) { \rewind($this->Body); } } } /** * @return resorce */ public function ToStream() { $this->Rewind(); $aSubStreams = array( $this->Headers->ToEncodedString(). \MailSo\Mime\Enumerations\Constants::CRLF. \MailSo\Mime\Enumerations\Constants::CRLF, null === $this->Body ? '' : $this->Body, \MailSo\Mime\Enumerations\Constants::CRLF ); if (0 < $this->SubParts->Count()) { $sBoundary = $this->HeaderBoundary(); if (0 < strlen($sBoundary)) { $aSubStreams[] = '--'.$sBoundary.\MailSo\Mime\Enumerations\Constants::CRLF; $rSubPartsStream = $this->SubParts->ToStream($sBoundary); if (is_resource($rSubPartsStream)) { $aSubStreams[] = $rSubPartsStream; } $aSubStreams[] = \MailSo\Mime\Enumerations\Constants::CRLF. '--'.$sBoundary.'--'.\MailSo\Mime\Enumerations\Constants::CRLF; } } return \MailSo\Base\StreamWrappers\SubStreams::CreateStream($aSubStreams); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Mime/PartCollection.php000066400000000000000000000021731361462701300300310ustar00rootroot00000000000000GetAsArray(); foreach ($aParts as /* @var $oPart \MailSo\Mime\Part */ &$oPart) { if (0 < count($aResult)) { $aResult[] = \MailSo\Mime\Enumerations\Constants::CRLF. '--'.$sBoundary.\MailSo\Mime\Enumerations\Constants::CRLF; } $aResult[] = $oPart->ToStream(); } return \MailSo\Base\StreamWrappers\SubStreams::CreateStream($aResult); } return $rResult; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Net/000077500000000000000000000000001361462701300242325ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Net/Enumerations/000077500000000000000000000000001361462701300267035ustar00rootroot00000000000000ConnectionSecurityType.php000066400000000000000000000027501361462701300340320ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Net/EnumerationssSocketMessage = $sSocketMessage; $this->iSocketCode = $iSocketCode; } /** * @return string */ public function getSocketMessage() { return $this->sSocketMessage; } /** * @return int */ public function getSocketCode() { return $this->iSocketCode; } } SocketConnectionDoesNotAvailableException.php000066400000000000000000000006331361462701300372330ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Net/ExceptionsrConnect = null; $this->bUnreadBuffer = false; $this->bRunningCallback = false; $this->oLogger = null; $this->__AUTOLOGOUT__ = true; $this->sResponseBuffer = ''; $this->iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::NONE; $this->sConnectedHost = ''; $this->iConnectedPort = 0; $this->bSecure = false; $this->iConnectTimeOut = 10; $this->iSocketTimeOut = 10; $this->Clear(); } /** * @return void */ public function __destruct() { try { if ($this->__AUTOLOGOUT__) { $this->LogoutAndDisconnect(); } else { $this->Disconnect(); } } catch (\Exception $oException) {} } /** * @return void */ public function Clear() { $this->sResponseBuffer = ''; $this->sConnectedHost = ''; $this->iConnectedPort = 0; $this->iStartConnectTime = 0; $this->bSecure = false; } /** * @return string */ public function GetConnectedHost() { return $this->sConnectedHost; } /** * @return int */ public function GetConnectedPort() { return $this->iConnectedPort; } /** * @param int $iConnectTimeOut = 10 * @param int $iSocketTimeOut = 10 * * @return void */ public function SetTimeOuts($iConnectTimeOut = 10, $iSocketTimeOut = 10) { $this->iConnectTimeOut = 5 < $iConnectTimeOut ? $iConnectTimeOut : 5; $this->iSocketTimeOut = 5 < $iSocketTimeOut ? $iSocketTimeOut : 5; } /** * @return resource|null */ public function ConnectionResource() { return $this->rConnect; } /** * @param int $iErrNo * @param string $sErrStr * @param string $sErrFile * @param int $iErrLine * * @return bool */ public function capturePhpErrorWithException($iErrNo, $sErrStr, $sErrFile, $iErrLine) { throw new \MailSo\Base\Exceptions\Exception($sErrStr, $iErrNo); } /** * @param string $sServerName * @param int $iPort * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * @param bool $bVerifySsl = false * @param bool $bAllowSelfSigned = true * @param string $sClientCert = '' * * @return void * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\SocketAlreadyConnectedException * @throws \MailSo\Net\Exceptions\SocketCanNotConnectToHostException */ public function Connect($sServerName, $iPort, $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false, $bAllowSelfSigned = true, $sClientCert = '') { if (!\MailSo\Base\Validator::NotEmptyString($sServerName, true) || !\MailSo\Base\Validator::PortInt($iPort)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } if ($this->IsConnected()) { $this->writeLogException( new Exceptions\SocketAlreadyConnectedException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $sServerName = \trim($sServerName); $sErrorStr = ''; $iErrorNo = 0; $this->sConnectedHost = $sServerName; $this->iConnectedPort = $iPort; $this->iSecurityType = $iSecurityType; $this->bSecure = \MailSo\Net\Enumerations\ConnectionSecurityType::UseSSL( $this->iConnectedPort, $this->iSecurityType); if (!\preg_match('/^[a-z0-9._]{2,8}:\/\//i', $this->sConnectedHost)) { $this->sConnectedHost = ($this->bSecure ? 'ssl://' : 'tcp://').$this->sConnectedHost; // $this->sConnectedHost = ($this->bSecure ? 'ssl://' : '').$this->sConnectedHost; } if (!$this->bSecure && \MailSo\Net\Enumerations\ConnectionSecurityType::SSL === $this->iSecurityType) { $this->writeLogException( new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('SSL isn\'t supported: ('.\implode(', ', \stream_get_transports()).')'), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->iStartConnectTime = \microtime(true); $this->writeLog('Start connection to "'.$this->sConnectedHost.':'.$this->iConnectedPort.'"', \MailSo\Log\Enumerations\Type::NOTE); // $this->rConnect = @\fsockopen($this->sConnectedHost, $this->iConnectedPort, // $iErrorNo, $sErrorStr, $this->iConnectTimeOut); $bVerifySsl = !!$bVerifySsl; $bAllowSelfSigned = $bVerifySsl ? !!$bAllowSelfSigned : true; $aStreamContextSettings = array( 'ssl' => array( 'verify_host' => $bVerifySsl, 'verify_peer' => $bVerifySsl, 'verify_peer_name' => $bVerifySsl, 'allow_self_signed' => $bAllowSelfSigned ) ); if (!empty($sClientCert)) { $aStreamContextSettings['ssl']['local_cert'] = $sClientCert; } \MailSo\Hooks::Run('Net.NetClient.StreamContextSettings/Filter', array(&$aStreamContextSettings)); $rStreamContext = \stream_context_create($aStreamContextSettings); \set_error_handler(array(&$this, 'capturePhpErrorWithException')); try { $this->rConnect = \stream_socket_client($this->sConnectedHost.':'.$this->iConnectedPort, $iErrorNo, $sErrorStr, $this->iConnectTimeOut, STREAM_CLIENT_CONNECT, $rStreamContext); } catch (\Exception $oExc) { $sErrorStr = $oExc->getMessage(); $iErrorNo = $oExc->getCode(); } \restore_error_handler(); $this->writeLog('Connected ('.(\is_resource($this->rConnect) ? 'success' : 'unsuccess').')', \MailSo\Log\Enumerations\Type::NOTE); if (!\is_resource($this->rConnect)) { $this->writeLogException( new Exceptions\SocketCanNotConnectToHostException( \MailSo\Base\Utils::ConvertSystemString($sErrorStr), (int) $iErrorNo, 'Can\'t connect to host "'.$this->sConnectedHost.':'.$this->iConnectedPort.'"' ), \MailSo\Log\Enumerations\Type::NOTICE, true); } $this->writeLog((\microtime(true) - $this->iStartConnectTime).' (raw connection)', \MailSo\Log\Enumerations\Type::TIME); if ($this->rConnect) { if (\MailSo\Base\Utils::FunctionExistsAndEnabled('stream_set_timeout')) { @\stream_set_timeout($this->rConnect, $this->iSocketTimeOut); } } } public function EnableCrypto() { $bError = true; if (\is_resource($this->rConnect) && \MailSo\Base\Utils::FunctionExistsAndEnabled('stream_socket_enable_crypto')) { switch (true) { case defined('STREAM_CRYPTO_METHOD_ANY_CLIENT') && @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_ANY_CLIENT): case defined('STREAM_CRYPTO_METHOD_TLS_CLIENT') && @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_TLS_CLIENT): case defined('STREAM_CRYPTO_METHOD_SSLv23_CLIENT') && @\stream_socket_enable_crypto($this->rConnect, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT): $bError = false; break; } } if ($bError) { $this->writeLogException( new \MailSo\Net\Exceptions\Exception('Cannot enable STARTTLS.'), \MailSo\Log\Enumerations\Type::ERROR, true); } } /** * @return void */ public function Disconnect() { if (\is_resource($this->rConnect)) { $bResult = \fclose($this->rConnect); $this->writeLog('Disconnected from "'.$this->sConnectedHost.':'.$this->iConnectedPort.'" ('. (($bResult) ? 'success' : 'unsuccess').')', \MailSo\Log\Enumerations\Type::NOTE); if (0 !== $this->iStartConnectTime) { $this->writeLog((\microtime(true) - $this->iStartConnectTime).' (net session)', \MailSo\Log\Enumerations\Type::TIME); $this->iStartConnectTime = 0; } $this->rConnect = null; } } /** * @retun void * * @throws \MailSo\Net\Exceptions\Exception */ public function LogoutAndDisconnect() { if (\method_exists($this, 'Logout') && !$this->bUnreadBuffer && !$this->bRunningCallback) { $this->Logout(); } $this->Disconnect(); } /** * @param bool $bThrowExceptionOnFalse = false * * @return bool */ public function IsConnected($bThrowExceptionOnFalse = false) { $bResult = \is_resource($this->rConnect); if (!$bResult && $bThrowExceptionOnFalse) { $this->writeLogException( new Exceptions\SocketConnectionDoesNotAvailableException(), \MailSo\Log\Enumerations\Type::ERROR, true); } return $bResult; } /** * @return void * * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException */ public function IsConnectedWithException() { $this->IsConnected(true); } /** * @return array|bool */ public function StreamContextParams() { return \is_resource($this->rConnect) && \MailSo\Base\Utils::FunctionExistsAndEnabled('stream_context_get_options') ? \stream_context_get_params($this->rConnect) : false; } /** * @param string $sRaw * @param bool $bWriteToLog = true * @param string $sFakeRaw = '' * * @return void * * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException * @throws \MailSo\Net\Exceptions\SocketWriteException */ protected function sendRaw($sRaw, $bWriteToLog = true, $sFakeRaw = '') { if ($this->bUnreadBuffer) { $this->writeLogException( new Exceptions\SocketUnreadBufferException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $bFake = 0 < \strlen($sFakeRaw); $sRaw .= "\r\n"; if ($this->oLogger && $this->oLogger->IsShowSecter()) { $bFake = false; } if ($bFake) { $sFakeRaw .= "\r\n"; } $mResult = @\fwrite($this->rConnect, $sRaw); if (false === $mResult) { $this->IsConnected(true); $this->writeLogException( new Exceptions\SocketWriteException(), \MailSo\Log\Enumerations\Type::ERROR, true); } else { \MailSo\Base\Loader::IncStatistic('NetWrite', $mResult); if ($bWriteToLog) { $this->writeLogWithCrlf('> '.($bFake ? $sFakeRaw : $sRaw), //.' ['.$iWriteSize.']', $bFake ? \MailSo\Log\Enumerations\Type::SECURE : \MailSo\Log\Enumerations\Type::INFO); } } } /** * @param mixed $mReadLen = null * @param bool $bForceLogin = false * * @return void * * @throws \MailSo\Net\Exceptions\SocketConnectionDoesNotAvailableException * @throws \MailSo\Net\Exceptions\SocketReadException */ protected function getNextBuffer($mReadLen = null, $bForceLogin = false) { if (null === $mReadLen) { $this->sResponseBuffer = @\fgets($this->rConnect); } else { $this->sResponseBuffer = ''; $iRead = $mReadLen; while (0 < $iRead) { $sAddRead = @\fread($this->rConnect, $iRead); if (false === $sAddRead) { $this->sResponseBuffer = false; break; } $this->sResponseBuffer .= $sAddRead; $iRead -= \strlen($sAddRead); } } if (false === $this->sResponseBuffer) { $this->IsConnected(true); $this->bUnreadBuffer = true; $aSocketStatus = @\stream_get_meta_data($this->rConnect); if (isset($aSocketStatus['timed_out']) && $aSocketStatus['timed_out']) { $this->writeLogException( new Exceptions\SocketReadTimeoutException(), \MailSo\Log\Enumerations\Type::ERROR, true); } else { $this->writeLog('Stream Meta: '. \print_r($aSocketStatus, true), \MailSo\Log\Enumerations\Type::ERROR); $this->writeLogException( new Exceptions\SocketReadException(), \MailSo\Log\Enumerations\Type::ERROR, true); } } else { $iReadedLen = \strlen($this->sResponseBuffer); if (null === $mReadLen || $bForceLogin) { $iLimit = 5000; // 5KB if ($iLimit < $iReadedLen) { $this->writeLogWithCrlf('[cutted:'.$iReadedLen.'] < '.\substr($this->sResponseBuffer, 0, $iLimit).'...', \MailSo\Log\Enumerations\Type::INFO); } else { $this->writeLogWithCrlf('< '.$this->sResponseBuffer, //.' ['.$iReadedLen.']', \MailSo\Log\Enumerations\Type::INFO); } } else { $this->writeLog('Received '.$iReadedLen.'/'.$mReadLen.' bytes.', \MailSo\Log\Enumerations\Type::INFO); } \MailSo\Base\Loader::IncStatistic('NetRead', $iReadedLen); } } /** * @return string */ protected function getLogName() { return 'NET'; } /** * @param string $sDesc * @param int $iDescType = \MailSo\Log\Enumerations\Type::INFO * * @return void */ protected function writeLog($sDesc, $iDescType = \MailSo\Log\Enumerations\Type::INFO, $bDiplayCrLf = false) { if ($this->oLogger) { $this->oLogger->Write($sDesc, $iDescType, $this->getLogName(), true, $bDiplayCrLf); } } /** * @param string $sDesc * @param int $iDescType = \MailSo\Log\Enumerations\Type::INFO * * @return void */ protected function writeLogWithCrlf($sDesc, $iDescType = \MailSo\Log\Enumerations\Type::INFO) { $this->writeLog($sDesc, $iDescType, true); } /** * @param \Exception $oException * @param int $iDescType = \MailSo\Log\Enumerations\Type::NOTICE * @param bool $bThrowException = false * * @return void */ protected function writeLogException($oException, $iDescType = \MailSo\Log\Enumerations\Type::NOTICE, $bThrowException = false) { if ($this->oLogger) { if ($oException instanceof Exceptions\SocketCanNotConnectToHostException) { $this->oLogger->Write('Socket: ['.$oException->getSocketCode().'] '.$oException->getSocketMessage(), $iDescType, $this->getLogName()); } $this->oLogger->WriteException($oException, $iDescType, $this->getLogName()); } if ($bThrowException) { throw $oException; } } /** * @param \MailSo\Log\Logger $oLogger * * @return void * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetLogger($oLogger) { if (!($oLogger instanceof \MailSo\Log\Logger)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $this->oLogger = $oLogger; } /** * @return \MailSo\Log\Logger|null */ public function Logger() { return $this->oLogger; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/000077500000000000000000000000001361462701300243255ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/000077500000000000000000000000001361462701300264465ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php000066400000000000000000000005641361462701300311220ustar00rootroot00000000000000aResponses = $aResponses; } } /** * @return array */ public function GetResponses() { return $this->aResponses; } /** * @return \MailSo\Pop3\Response | null */ public function GetLastResponse() { return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php000066400000000000000000000005731361462701300324660ustar00rootroot00000000000000bIsLoggined = false; $this->iRequestTime = 0; $this->aCapa = null; $this->sLastMessage = ''; } /** * @return \MailSo\Pop3\Pop3Client */ public static function NewInstance() { return new self(); } /** * @param string $sServerName * @param int $iPort = 110 * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * @param bool $bVerifySsl = false * @param bool $bAllowSelfSigned = null * * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\ResponseException */ public function Connect($sServerName, $iPort = 110, $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false, $bAllowSelfSigned = null) { $this->iRequestTime = microtime(true); parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); $this->validateResponse(); if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( in_array('STLS', $this->Capa()), $this->iSecurityType)) { $this->sendRequestWithCheck('STLS'); $this->EnableCrypto(); $this->aCapa = null; } else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) { $this->writeLogException( new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), \MailSo\Log\Enumerations\Type::ERROR, true); } return $this; } /** * @param string $sLogin = '' * @param string $sPassword = '' * * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\ResponseException */ public function Login($sLogin, $sPassword) { if ($this->bIsLoggined) { $this->writeLogException( new Exceptions\RuntimeException('Already authenticated for this session'), \MailSo\Log\Enumerations\Type::ERROR, true); } $sLogin = trim($sLogin); $sPassword = $sPassword; try { $this->sendRequestWithCheck('USER', $sLogin); $this->sendRequestWithCheck('PASS', $sPassword); } catch (\MailSo\Pop3\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Pop3\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), '', 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } $this->bIsLoggined = true; $this->aCapa = null; return $this; } /** * @return bool */ public function IsLoggined() { return $this->IsConnected() && $this->bIsLoggined; } /** * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\Exception */ public function Noop() { $this->sendRequestWithCheck('NOOP'); return $this; } /** * @return array [MessagesCount, Size] * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\Exception */ public function Status() { $this->sendRequestWithCheck('STAT'); $iMessageCount = $iSize = 0; sscanf($this->sLastMessage, '%d %d', $iMessageCount, $iSize); return array((int) $iMessageCount, (int) $iSize); } /** * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\Exception */ public function Capa() { if (null === $this->aCapa) { $this->sendRequestWithCheck('CAPA'); $this->aCapa = array_filter(explode("\n", $this->readMultilineResponse()), function (&$sCapa) { return 0 < strlen(trim($sCapa)); }); $this->aCapa = array_map('trim', $this->aCapa); } return $this->aCapa; } /** * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\Exception */ public function Logout() { if ($this->bIsLoggined) { $this->sendRequestWithCheck('QUIT'); } $this->bIsLoggined = false; return $this; } /** * @param string $sCommand * @param string $sAddToCommand = '' * * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception */ protected function sendRequest($sCommand, $sAddToCommand = '') { if (0 === strlen(trim($sCommand))) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->IsConnected(true); $sCommand = trim($sCommand); $sRealCommand = $sCommand.(0 === strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); $sFakeCommand = ''; $sFakeAddToCommand = $this->secureRequestParams($sCommand, $sAddToCommand); if (0 < strlen($sFakeAddToCommand)) { $sFakeCommand = $sCommand.' '.$sFakeAddToCommand; } $this->iRequestTime = microtime(true); $this->sendRaw($sRealCommand, true, $sFakeCommand); return $this; } /** * @param string $sCommand * @param string $sAddToCommand * * @return string */ private function secureRequestParams($sCommand, $sAddToCommand) { $sResult = null; if (0 < strlen($sAddToCommand)) { switch ($sCommand) { case 'PASS': $sResult = '********'; break; } } return $sResult; } /** * @param string $sCommand * @param string $sAddToCommand = '' * * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\Exception */ private function sendRequestWithCheck($sCommand, $sAddToCommand = '') { $this->sendRequest($sCommand, $sAddToCommand); return $this->validateResponse(); } /** * @return string * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Pop3\Exceptions\ResponseException */ private function validateResponse() { $this->getNextBuffer(); $this->sLastMessage = ''; $sStatus = $sMessage = ''; $sBuffer = trim($this->sResponseBuffer); $sStatus = $sBuffer; if (false !== strpos($sBuffer, ' ')) { list($sStatus, $sMessage) = explode(' ', $sBuffer, 2); } $this->sLastMessage = $sMessage; if ($sStatus != '+OK') { $this->writeLogException( new Exceptions\NegativeResponseException(), \MailSo\Log\Enumerations\Type::WARNING, true); } $this->writeLog((microtime(true) - $this->iRequestTime), \MailSo\Log\Enumerations\Type::TIME); } /** * @return string * * @throws \MailSo\Net\Exceptions\Exception */ private function readMultilineResponse() { $this->iRequestTime = microtime(true); $sResult = ''; do { $this->getNextBuffer(); if (0 === strpos($this->sResponseBuffer, '.')) { $sResult .= substr($this->sResponseBuffer, 1); } else { $sResult .= $this->sResponseBuffer; } } while ('.' !== rtrim($this->sResponseBuffer, "\r\n")); $this->writeLog((microtime(true) - $this->iRequestTime), \MailSo\Log\Enumerations\Type::TIME); return $sResult; } /** * @return string */ protected function getLogName() { return 'POP3'; } /** * @param \MailSo\Log\Logger $oLogger * @return \MailSo\Pop3\Pop3Client * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetLogger($oLogger) { parent::SetLogger($oLogger); return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/000077500000000000000000000000001361462701300252755ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/000077500000000000000000000000001361462701300274165ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php000066400000000000000000000005741361462701300320730ustar00rootroot00000000000000aResponses = $aResponses; } } /** * @return array */ public function GetResponses() { return $this->aResponses; } /** * @return \MailSo\Poppassd\Response | null */ public function GetLastResponse() { return 0 < \count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; } } RuntimeException.php000066400000000000000000000006071361462701300333550ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/ExceptionsbIsLoggined = false; $this->iRequestTime = 0; parent::__construct(); } /** * @return \MailSo\Poppassd\PoppassdClient */ public static function NewInstance() { return new self(); } /** * @param string $sServerName * @param int $iPort = 106 * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * @param bool $bVerifySsl = false * @param bool $bAllowSelfSigned = true * * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Poppassd\Exceptions\ResponseException */ public function Connect($sServerName, $iPort = 106, $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false, $bAllowSelfSigned = true) { $this->iRequestTime = \microtime(true); parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); $this->validateResponse(); return $this; } /** * @param string $sLogin = '' * @param string $sPassword = '' * * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Poppassd\Exceptions\ResponseException */ public function Login($sLogin, $sPassword) { if ($this->bIsLoggined) { $this->writeLogException( new Exceptions\RuntimeException('Already authenticated for this session'), \MailSo\Log\Enumerations\Type::ERROR, true); } $sLogin = \trim($sLogin); $sPassword = $sPassword; try { $this->sendRequestWithCheck('user', $sLogin, true); $this->sendRequestWithCheck('pass', $sPassword, true); } catch (\MailSo\Poppassd\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Poppassd\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), '', 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } $this->bIsLoggined = true; return $this; } /** * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Poppassd\Exceptions\Exception */ public function Logout() { if ($this->bIsLoggined) { $this->sendRequestWithCheck('quit'); } $this->bIsLoggined = false; return $this; } /** * @param string $sNewPassword * * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Poppassd\Exceptions\Exception */ public function NewPass($sNewPassword) { if ($this->bIsLoggined) { $this->sendRequestWithCheck('newpass', $sNewPassword); } else { $this->writeLogException( new \MailSo\Poppassd\Exceptions\RuntimeException('Required login'), \MailSo\Log\Enumerations\Type::ERROR, true); } return $this; } /** * @param string $sCommand * @param string $sAddToCommand * * @return string */ private function secureRequestParams($sCommand, $sAddToCommand) { $sResult = null; if (0 < \strlen($sAddToCommand)) { switch (\strtolower($sCommand)) { case 'pass': case 'newpass': $sResult = '********'; break; } } return $sResult; } /** * @param string $sCommand * @param string $sAddToCommand = '' * * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception */ private function sendRequest($sCommand, $sAddToCommand = '') { if (0 === \strlen(\trim($sCommand))) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->IsConnected(true); $sCommand = \trim($sCommand); $sRealCommand = $sCommand.(0 === \strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); $sFakeCommand = ''; $sFakeAddToCommand = $this->secureRequestParams($sCommand, $sAddToCommand); if (0 < \strlen($sFakeAddToCommand)) { $sFakeCommand = $sCommand.' '.$sFakeAddToCommand; } $this->iRequestTime = \microtime(true); $this->sendRaw($sRealCommand, true, $sFakeCommand); return $this; } /** * @param string $sCommand * @param string $sAddToCommand = '' * @param bool $bAuthRequestValidate = false * * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Poppassd\Exceptions\Exception */ private function sendRequestWithCheck($sCommand, $sAddToCommand = '', $bAuthRequestValidate = false) { $this->sendRequest($sCommand, $sAddToCommand); $this->validateResponse($bAuthRequestValidate); return $this; } /** * @param bool $bAuthRequestValidate = false * * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Poppassd\Exceptions\ResponseException */ private function validateResponse($bAuthRequestValidate = false) { $this->getNextBuffer(); $bResult = false; if ($bAuthRequestValidate) { $bResult = (bool) \preg_match('/^[23]\d\d/', trim($this->sResponseBuffer)); } else { $bResult = (bool) \preg_match('/^2\d\d/', \trim($this->sResponseBuffer)); } if (!$bResult) { // POP3 validation hack $bResult = '+OK ' === \substr(\trim($this->sResponseBuffer), 0, 4); } if (!$bResult) { $this->writeLogException( new Exceptions\NegativeResponseException(), \MailSo\Log\Enumerations\Type::WARNING, true); } $this->writeLog((\microtime(true) - $this->iRequestTime), \MailSo\Log\Enumerations\Type::TIME); return $this; } /** * @return string */ protected function getLogName() { return 'POPPASSD'; } /** * @param \MailSo\Log\Logger $oLogger * * @return \MailSo\Poppassd\PoppassdClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetLogger($oLogger) { parent::SetLogger($oLogger); return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/000077500000000000000000000000001361462701300245575ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/000077500000000000000000000000001361462701300267005ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php000066400000000000000000000005661361462701300313560ustar00rootroot00000000000000aResponses = $aResponses; } } /** * @return array */ public function GetResponses() { return $this->aResponses; } /** * @return \MailSo\Sieve\Response | null */ public function GetLastResponse() { return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php000066400000000000000000000005761361462701300327230ustar00rootroot00000000000000bIsLoggined = false; $this->iRequestTime = 0; $this->aCapa = array(); $this->aModules = array(); $this->__USE_INITIAL_AUTH_PLAIN_COMMAND = true; } /** * @return \MailSo\Sieve\ManageSieveClient */ public static function NewInstance() { return new self(); } /** * @param string $sCapa * * @return bool */ public function IsSupported($sCapa) { return isset($this->aCapa[\strtoupper($sCapa)]); } /** * @param string $sModule * * @return bool */ public function IsModuleSupported($sModule) { return $this->IsSupported('SIEVE') && \in_array(\strtolower(\trim($sModule)), $this->aModules); } /** * @return array */ public function Modules() { return $this->aModules; } /** * @param string $sAuth * * @return bool */ public function IsAuthSupported($sAuth) { return $this->IsSupported('SASL') && \in_array(\strtoupper($sAuth), $this->aAuth); } /** * @param string $sServerName * @param int $iPort * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * @param bool $bVerifySsl = false * @param bool $bAllowSelfSigned = true * * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Sieve\Exceptions\ResponseException */ public function Connect($sServerName, $iPort, $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false, $bAllowSelfSigned = true) { $this->iRequestTime = \microtime(true); parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); $mResponse = $this->parseResponse(); $this->validateResponse($mResponse); $this->parseStartupResponse($mResponse); if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( $this->IsSupported('STARTTLS'), $this->iSecurityType)) { $this->sendRequestWithCheck('STARTTLS'); $this->EnableCrypto(); $mResponse = $this->parseResponse(); $this->validateResponse($mResponse); $this->parseStartupResponse($mResponse); } else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) { $this->writeLogException( new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), \MailSo\Log\Enumerations\Type::ERROR, true); } return $this; } /** * @param string $sLogin * @param string $sPassword * @param string $sLoginAuthKey = '' * * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Sieve\Exceptions\LoginException */ public function Login($sLogin, $sPassword, $sLoginAuthKey = '') { if (!\MailSo\Base\Validator::NotEmptyString($sLogin, true) || !\MailSo\Base\Validator::NotEmptyString($sPassword, true)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } if ($this->IsSupported('SASL')) { $bAuth = false; try { if ($this->IsAuthSupported('PLAIN')) { $sAuth = \base64_encode($sLoginAuthKey."\0".$sLogin."\0".$sPassword); if ($this->__USE_INITIAL_AUTH_PLAIN_COMMAND) { $this->sendRequest('AUTHENTICATE "PLAIN" "'.$sAuth.'"'); } else { $this->sendRequest('AUTHENTICATE "PLAIN" {'.\strlen($sAuth).'+}'); $this->sendRequest($sAuth); } $mResponse = $this->parseResponse(); $this->validateResponse($mResponse); $this->parseStartupResponse($mResponse); $bAuth = true; } else if ($this->IsAuthSupported('LOGIN')) { $sLogin = \base64_encode($sLogin); $sPassword = \base64_encode($sPassword); $this->sendRequest('AUTHENTICATE "LOGIN"'); $this->sendRequest('{'.\strlen($sLogin).'+}'); $this->sendRequest($sLogin); $this->sendRequest('{'.\strlen($sPassword).'+}'); $this->sendRequest($sPassword); $mResponse = $this->parseResponse(); $this->validateResponse($mResponse); $this->parseStartupResponse($mResponse); $bAuth = true; } } catch (\MailSo\Sieve\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Sieve\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), '', 0, $oException), \MailSo\Log\Enumerations\Type::ERROR, true); } if (!$bAuth) { $this->writeLogException( new \MailSo\Sieve\Exceptions\LoginBadMethodException(), \MailSo\Log\Enumerations\Type::ERROR, true); } } else { $this->writeLogException( new \MailSo\Sieve\Exceptions\LoginException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->bIsLoggined = true; return $this; } /** * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function Logout() { if ($this->bIsLoggined) { $this->sendRequestWithCheck('LOGOUT'); $this->bIsLoggined = false; } return $this; } /** * @return array * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function ListScripts() { $this->sendRequest('LISTSCRIPTS'); $mResponse = $this->parseResponse(); $this->validateResponse($mResponse); $aResult = array(); if (\is_array($mResponse)) { foreach ($mResponse as $sLine) { $aTokens = $this->parseLine($sLine); if (false === $aTokens) { continue; } $aResult[$aTokens[0]] = 'ACTIVE' === substr($sLine, -6); } } return $aResult; } /** * @return array * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function Capability() { $this->sendRequest('CAPABILITY'); $mResponse = $this->parseResponse(); $this->validateResponse($mResponse); $this->parseStartupResponse($mResponse); return $this->aCapa; } /** * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function Noop() { $this->sendRequestWithCheck('NOOP'); return $this; } /** * @param string $sScriptName * * @return string * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function GetScript($sScriptName) { $this->sendRequest('GETSCRIPT "'.$sScriptName.'"'); $mResponse = $this->parseResponse(); $this->validateResponse($mResponse); $sScript = ''; if (\is_array($mResponse) && 0 < \count($mResponse)) { if ('{' === $mResponse[0]{0}) { \array_shift($mResponse); } if (\in_array(\substr($mResponse[\count($mResponse) - 1], 0, 2), array('OK', 'NO'))) { \array_pop($mResponse); } $sScript = \implode("\n", $mResponse); } return $sScript; } /** * @param string $sScriptName * @param string $sScriptSource * * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function PutScript($sScriptName, $sScriptSource) { $this->sendRequest('PUTSCRIPT "'.$sScriptName.'" {'.\strlen($sScriptSource).'+}'); $this->sendRequestWithCheck($sScriptSource); return $this; } /** * @param string $sScriptSource * * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function CheckScript($sScriptSource) { $this->sendRequest('CHECKSCRIPT {'.\strlen($sScriptSource).'+}'); $this->sendRequestWithCheck($sScriptSource); return $this; } /** * @param string $sScriptName * * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function SetActiveScript($sScriptName) { $this->sendRequestWithCheck('SETACTIVE "'.$sScriptName.'"'); return $this; } /** * @param string $sScriptName * * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function DeleteScript($sScriptName) { $this->sendRequestWithCheck('DELETESCRIPT "'.$sScriptName.'"'); return $this; } /** * @return string * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function GetActiveScriptName() { $aList = $this->ListScripts(); if (\is_array($aList) && 0 < \count($aList)) { foreach ($aList as $sName => $bIsActive) { if ($bIsActive) { return $sName; } } } return ''; } /** * @param string $sScriptName * * @return bool * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ public function IsActiveScript($sScriptName) { return $sScriptName === $this->GetActiveScriptName(); } /** * @param string $sLine * @return array|false */ private function parseLine($sLine) { if (false === $sLine || null === $sLine || \in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) { return false; } $iStart = -1; $iIndex = 0; $aResult = false; for ($iPos = 0; $iPos < \strlen($sLine); $iPos++) { if ('"' === $sLine[$iPos] && '\\' !== $sLine[$iPos]) { if (-1 === $iStart) { $iStart = $iPos; } else { $aResult = \is_array($aResult) ? $aResult : array(); $aResult[$iIndex++] = \substr($sLine, $iStart + 1, $iPos - $iStart - 1); $iStart = -1; } } } return \is_array($aResult) && isset($aResult[0]) ? $aResult : false; } /** * @param string $mResponse * * @return void * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception */ private function parseStartupResponse($mResponse) { foreach ($mResponse as $sLine) { $aTokens = $this->parseLine($sLine); if (false === $aTokens || !isset($aTokens[0]) || \in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) { continue; } $sToken = \strtoupper($aTokens[0]); $this->aCapa[$sToken] = isset($aTokens[1]) ? $aTokens[1] : ''; if (isset($aTokens[1])) { switch ($sToken) { case 'SASL': $this->aAuth = \explode(' ', \strtoupper($aTokens[1])); break; case 'SIEVE': $this->aModules = \explode(' ', \strtolower($aTokens[1])); break; } } } } /** * @param string $sRequest * * @return void * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception */ private function sendRequest($sRequest) { if (!\MailSo\Base\Validator::NotEmptyString($sRequest, true)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->IsConnected(true); $this->sendRaw($sRequest); } /** * @param string $sRequest * * @return void * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ private function sendRequestWithCheck($sRequest) { $this->sendRequest($sRequest); $this->validateResponse($this->parseResponse()); } /** * @param string $sLine * * @return string */ private function convertEndOfLine($sLine) { $sLine = \trim($sLine); if ('}' === \substr($sLine, -1)) { $iPos = \strrpos($sLine, '{'); if (false !== $iPos) { $sSunLine = \substr($sLine, $iPos + 1, -1); if (\is_numeric($sSunLine) && 0 < (int) $sSunLine) { $iLen = (int) $sSunLine; $this->getNextBuffer($iLen, true); if (\strlen($this->sResponseBuffer) === $iLen) { $sLine = \trim(\substr_replace($sLine, $this->sResponseBuffer, $iPos)); } } } } return $sLine; } /** * @return array|bool */ private function parseResponse() { $this->iRequestTime = \microtime(true); $aResult = array(); do { $this->getNextBuffer(); $sLine = $this->sResponseBuffer; if (false === $sLine) { break; } else if (\in_array(\substr($sLine, 0, 2), array('OK', 'NO'))) { $aResult[] = $this->convertEndOfLine($sLine); break; } else { $aResult[] = $this->convertEndOfLine($sLine); } } while (true); $this->writeLog((\microtime(true) - $this->iRequestTime), \MailSo\Log\Enumerations\Type::TIME); return $aResult; } /** * @throws \MailSo\Sieve\Exceptions\NegativeResponseException */ private function validateResponse($aResponse) { if (!\is_array($aResponse) || 0 === \count($aResponse) || 'OK' !== \substr($aResponse[\count($aResponse) - 1], 0, 2)) { $this->writeLogException( new \MailSo\Sieve\Exceptions\NegativeResponseException($aResponse), \MailSo\Log\Enumerations\Type::WARNING, true); } } /** * @return string */ protected function getLogName() { return 'SIEVE'; } /** * @param \MailSo\Log\Logger $oLogger * * @return \MailSo\Sieve\ManageSieveClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetLogger($oLogger) { parent::SetLogger($oLogger); return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/000077500000000000000000000000001361462701300244275ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/000077500000000000000000000000001361462701300265505ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php000066400000000000000000000005641361462701300312240ustar00rootroot00000000000000aResponses = $aResponses; } } /** * @return array */ public function GetResponses() { return $this->aResponses; } /** * @return \MailSo\Smtp\Response | null */ public function GetLastResponse() { return 0 < count($this->aResponses) ? $this->aResponses[count($this->aResponses) - 1] : null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php000066400000000000000000000005731361462701300325700ustar00rootroot00000000000000aAuthTypes = array(); $this->iRequestTime = 0; $this->iSizeCapaValue = 0; $this->aResults = array(); $this->aCapa = array(); $this->bHelo = false; $this->bRcpt = false; $this->bMail = false; $this->bData = false; } /** * @return \MailSo\Smtp\SmtpClient */ public static function NewInstance() { return new self(); } /** * @return bool */ public function IsSupported($sCapa) { return in_array(strtoupper($sCapa), $this->aCapa); } /** * @return bool */ public function IsAuthSupported($sAuth) { return in_array(strtoupper($sAuth), $this->aAuthTypes); } /** * @return bool */ public function HasSupportedAuth() { return $this->IsAuthSupported('PLAIN') || $this->IsAuthSupported('LOGIN'); } /** * @return string */ public static function EhloHelper() { $sEhloHost = empty($_SERVER['SERVER_NAME']) ? '' : \trim($_SERVER['SERVER_NAME']); if (empty($sEhloHost)) { $sEhloHost = empty($_SERVER['HTTP_HOST']) ? '' : \trim($_SERVER['HTTP_HOST']); } if (empty($sEhloHost)) { $sEhloHost = \function_exists('gethostname') ? \gethostname() : 'localhost'; } $sEhloHost = \trim(\preg_replace('/:\d+$/', '', \trim($sEhloHost))); if (\preg_match('/^\d+\.\d+\.\d+\.\d+$/', $sEhloHost)) { $sEhloHost = '['.$sEhloHost.']'; } return empty($sEhloHost) ? 'localhost' : $sEhloHost; } /** * @param string $sServerName * @param int $iPort = 25 * @param string $sEhloHost = '[127.0.0.1]' * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * @param bool $bVerifySsl = false * @param bool $bAllowSelfSigned = true * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\ResponseException */ public function Connect($sServerName, $iPort = 25, $sEhloHost = '[127.0.0.1]', $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT, $bVerifySsl = false, $bAllowSelfSigned = true) { $this->iRequestTime = microtime(true); parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned); $this->validateResponse(220); $this->preLoginStartTLSAndEhloProcess($sEhloHost); return $this; } /** * @param string $sLogin * @param string $sPassword * @param boolean $bUseAuthPlainIfSupported = true * @param boolean $bUseAuthCramMd5IfSupported = true * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function Login($sLogin, $sPassword, $bUseAuthPlainIfSupported = true, $bUseAuthCramMd5IfSupported = true) { $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); if ($bUseAuthCramMd5IfSupported && $this->IsAuthSupported('CRAM-MD5')) { try { $this->sendRequestWithCheck('AUTH', 334, 'CRAM-MD5'); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadMethodException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } $sTicket = ''; $sContinuationResponse = !empty($this->aResults[0]) ? \trim($this->aResults[0]) : ''; if ($sContinuationResponse && '334 ' === \substr($sContinuationResponse, 0, 4) && 0 < \strlen(\substr($sContinuationResponse, 4))) { $sTicket = @\base64_decode(\substr($sContinuationResponse, 4)); $this->writeLogWithCrlf('ticket: '.$sTicket); } if (empty($sTicket)) { $this->writeLogException( new \MailSo\Smtp\Exceptions\NegativeResponseException(), \MailSo\Log\Enumerations\Type::NOTICE, true ); } try { $this->sendRequestWithCheck(\base64_encode($sLogin.' '.\MailSo\Base\Utils::Hmac($sTicket, $sPassword)), 235, '', true); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } } else if ($bUseAuthPlainIfSupported && $this->IsAuthSupported('PLAIN')) { if ($this->__USE_SINGLE_LINE_AUTH_PLAIN_COMMAND) { try { $this->sendRequestWithCheck('AUTH', 235, 'PLAIN '.\base64_encode("\0".$sLogin."\0".$sPassword), true); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } } else { try { $this->sendRequestWithCheck('AUTH', 334, 'PLAIN'); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadMethodException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } try { $this->sendRequestWithCheck(\base64_encode("\0".$sLogin."\0".$sPassword), 235, '', true); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } } } else if ($this->IsAuthSupported('LOGIN')) { try { $this->sendRequestWithCheck('AUTH', 334, 'LOGIN'); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadMethodException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } try { $this->sendRequestWithCheck(\base64_encode($sLogin), 334, ''); $this->sendRequestWithCheck(\base64_encode($sPassword), 235, '', true); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } } else { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadMethodException(), \MailSo\Log\Enumerations\Type::NOTICE, true); } return $this; } /** * @param string $sXOAuth2Token * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function LoginWithXOauth2($sXOAuth2Token) { if ($this->IsAuthSupported('XOAUTH2')) { try { $this->sendRequestWithCheck('AUTH', 235, 'XOAUTH2 '.\trim($sXOAuth2Token)); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadCredentialsException( $oException->GetResponses(), $oException->getMessage(), 0, $oException), \MailSo\Log\Enumerations\Type::NOTICE, true); } } else { $this->writeLogException( new \MailSo\Smtp\Exceptions\LoginBadMethodException(), \MailSo\Log\Enumerations\Type::NOTICE, true); } return $this; } /** * @param string $sFrom * @param string $sSizeIfSupported = '' * @param bool $bDsn = false * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function MailFrom($sFrom, $sSizeIfSupported = '', $bDsn = false) { $sFrom = \MailSo\Base\Utils::IdnToAscii( \MailSo\Base\Utils::Trim($sFrom), true); $sCmd = 'FROM:<'.$sFrom.'>'; $sSizeIfSupported = (string) $sSizeIfSupported; if (0 < \strlen($sSizeIfSupported) && \is_numeric($sSizeIfSupported) && $this->IsSupported('SIZE')) { $sCmd .= ' SIZE='.$sSizeIfSupported; } if ($bDsn && $this->IsSupported('DSN')) { $sCmd .= ' RET=HDRS'; } $this->sendRequestWithCheck('MAIL', 250, $sCmd); $this->bMail = true; $this->bRcpt = false; $this->bData = false; return $this; } /** * @param string $sTo * @param bool $bDsn = false * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function Rcpt($sTo, $bDsn = false) { if (!$this->bMail) { $this->writeLogException( new Exceptions\RuntimeException('No sender reverse path has been supplied'), \MailSo\Log\Enumerations\Type::ERROR, true); } $sTo = \MailSo\Base\Utils::IdnToAscii( \MailSo\Base\Utils::Trim($sTo), true); $sCmd = 'TO:<'.$sTo.'>'; if ($bDsn && $this->IsSupported('DSN')) { $sCmd .= ' NOTIFY=SUCCESS,FAILURE'; } $this->sendRequestWithCheck( 'RCPT', array(250, 251), $sCmd, false, 'Failed to add recipient "'.$sTo.'"' ); $this->bRcpt = true; return $this; } /** * @param string $sTo * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function MailTo($sTo) { return $this->Rcpt($sTo); } /** * @param string $sData * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function Data($sData) { if (!\MailSo\Base\Validator::NotEmptyString($sData, true)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $rDataStream = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($sData); unset($sData); $this->DataWithStream($rDataStream); \MailSo\Base\ResourceRegistry::CloseMemoryResource($rDataStream); return $this; } /** * @param resource $rDataStream * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function DataWithStream($rDataStream) { if (!\is_resource($rDataStream)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } if (!$this->bRcpt) { $this->writeLogException( new Exceptions\RuntimeException('No recipient forward path has been supplied'), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->sendRequestWithCheck('DATA', 354); $this->writeLog('Message data.', \MailSo\Log\Enumerations\Type::NOTE); $this->bRunningCallback = true; while (!\feof($rDataStream)) { $sBuffer = \fgets($rDataStream); if (false !== $sBuffer) { if (0 === \strpos($sBuffer, '.')) { $sBuffer = '.'.$sBuffer; } $this->sendRaw(\rtrim($sBuffer, "\r\n"), false); \MailSo\Base\Utils::ResetTimeLimit(); continue; } else if (!\feof($rDataStream)) { $this->writeLogException( new Exceptions\RuntimeException('Cannot read input resource'), \MailSo\Log\Enumerations\Type::ERROR, true); } break; } $this->sendRequestWithCheck('.', 250); $this->bRunningCallback = false; $this->bData = true; return $this; } /** * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function Rset() { $this->sendRequestWithCheck('RSET', array(250, 220)); $this->bMail = false; $this->bRcpt = false; $this->bData = false; return $this; } /** * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function Vrfy($sUser) { $sUser = \MailSo\Base\Utils::IdnToAscii( \MailSo\Base\Utils::Trim($sUser)); $this->sendRequestWithCheck('VRFY', array(250, 251, 252), $sUser); return $this; } /** * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function Noop() { $this->sendRequestWithCheck('NOOP', 250); return $this; } /** * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ public function Logout() { if ($this->IsConnected()) { $this->sendRequestWithCheck('QUIT', 221); } $this->bHelo = false; $this->bMail = false; $this->bRcpt = false; $this->bData = false; return $this; } /** * @param string $sEhloHost * * @return void */ private function preLoginStartTLSAndEhloProcess($sEhloHost) { if ($this->bHelo) { $this->writeLogException( new Exceptions\RuntimeException('Cannot issue EHLO/HELO to existing session'), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->ehloOrHelo($sEhloHost); if (\MailSo\Net\Enumerations\ConnectionSecurityType::UseStartTLS( $this->IsSupported('STARTTLS'), $this->iSecurityType, $this->HasSupportedAuth())) { $this->sendRequestWithCheck('STARTTLS', 220); $this->EnableCrypto(); $this->ehloOrHelo($sEhloHost); } else if (\MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS === $this->iSecurityType) { $this->writeLogException( new \MailSo\Net\Exceptions\SocketUnsuppoterdSecureConnectionException('STARTTLS is not supported'), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->bHelo = true; } /** * @param string $sCommand * @param string $sAddToCommand = '' * @param bool $bSecureLog = false * * @return void * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception */ private function sendRequest($sCommand, $sAddToCommand = '', $bSecureLog = false) { if (!\MailSo\Base\Validator::NotEmptyString($sCommand, true)) { $this->writeLogException( new \MailSo\Base\Exceptions\InvalidArgumentException(), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->IsConnected(true); $sCommand = \trim($sCommand); $sRealCommand = $sCommand.(0 === \strlen($sAddToCommand) ? '' : ' '.$sAddToCommand); $sFakeCommand = ($bSecureLog) ? '********' : ''; $this->iRequestTime = \microtime(true); $this->sendRaw($sRealCommand, true, $sFakeCommand); return $this; } /** * @param string $sCommand * @param int|array $mExpectCode * @param string $sAddToCommand = '' * @param bool $bSecureLog = false * @param string $sErrorPrefix = '' * * @return void * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ private function sendRequestWithCheck($sCommand, $mExpectCode, $sAddToCommand = '', $bSecureLog = false, $sErrorPrefix = '') { $this->sendRequest($sCommand, $sAddToCommand, $bSecureLog); $this->validateResponse($mExpectCode, $sErrorPrefix); } /** * @param string $sHost * * @return void */ private function ehloOrHelo($sHost) { try { $this->ehlo($sHost); } catch (\Exception $oException) { try { $this->helo($sHost); } catch (\Exception $oException) { throw $oException; } } return $this; } /** * @param string $sHost * * @return void * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ private function ehlo($sHost) { $this->sendRequestWithCheck('EHLO', 250, $sHost); foreach ($this->aResults as $sLine) { $aMatch = array(); if (\preg_match('/[\d]+[ \-](.+)$/', $sLine, $aMatch) && isset($aMatch[1]) && 0 < \strlen($aMatch[1])) { $sLine = \trim($aMatch[1]); $aLine = \preg_split('/[ =]/', $sLine, 2); if (\is_array($aLine) && 0 < \count($aLine) && !empty($aLine[0])) { $sCapa = \strtoupper($aLine[0]); if (('AUTH' === $sCapa || 'SIZE' === $sCapa) && !empty($aLine[1])) { $sSubLine = \trim(\strtoupper($aLine[1])); if (0 < \strlen($sSubLine)) { if ('AUTH' === $sCapa) { $this->aAuthTypes = \explode(' ', $sSubLine); } else if ('SIZE' === $sCapa && \is_numeric($sSubLine)) { $this->iSizeCapaValue = (int) $sSubLine; } } } $this->aCapa[] = $sCapa; } } } } /** * @param string $sHost * * @return void * * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\Exception */ private function helo($sHost) { $this->sendRequestWithCheck('HELO', 250, $sHost); $this->aAuthTypes = array(); $this->iSizeCapaValue = 0; $this->aCapa = array(); } /** * @param int|array $mExpectCode * @param string $sErrorPrefix = '' * * @return void * * @throws \MailSo\Smtp\Exceptions\ResponseException */ private function validateResponse($mExpectCode, $sErrorPrefix = '') { if (!\is_array($mExpectCode)) { $mExpectCode = array((int) $mExpectCode); } else { $mExpectCode = \array_map('intval', $mExpectCode); } $aParts = array('', '', ''); $this->aResults = array(); do { $this->getNextBuffer(); $aParts = \preg_split('/([\s\-]+)/', $this->sResponseBuffer, 2, PREG_SPLIT_DELIM_CAPTURE); if (\is_array($aParts) && 3 === \count($aParts) && \is_numeric($aParts[0])) { if ('-' !== \substr($aParts[1], 0, 1) && !\in_array((int) $aParts[0], $mExpectCode)) { $this->writeLogException( new Exceptions\NegativeResponseException($this->aResults, ('' === $sErrorPrefix ? '' : $sErrorPrefix.': ').\trim( (0 < \count($this->aResults) ? \implode("\r\n", $this->aResults)."\r\n" : ''). $this->sResponseBuffer)), \MailSo\Log\Enumerations\Type::ERROR, true); } } else { $this->writeLogException( new Exceptions\ResponseException($this->aResults, ('' === $sErrorPrefix ? '' : $sErrorPrefix.': ').\trim( (0 < \count($this->aResults) ? \implode("\r\n", $this->aResults)."\r\n" : ''). $this->sResponseBuffer)), \MailSo\Log\Enumerations\Type::ERROR, true); } $this->aResults[] = $this->sResponseBuffer; } while ('-' === \substr($aParts[1], 0, 1)); $this->writeLog((microtime(true) - $this->iRequestTime), \MailSo\Log\Enumerations\Type::TIME); } /** * @return string */ protected function getLogName() { return 'SMTP'; } /** * @param \MailSo\Log\Logger $oLogger * * @return \MailSo\Smtp\SmtpClient * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ public function SetLogger($oLogger) { parent::SetLogger($oLogger); return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Vendors/000077500000000000000000000000001361462701300251245ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Vendors/Net/000077500000000000000000000000001361462701300256525ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Vendors/Net/IDNA2.php000066400000000000000000003134751361462701300271750ustar00rootroot00000000000000 * @author Matthias Sommerfeld * @author Stefan Neufeind * @version $Id: IDNA2.php 305344 2010-11-14 23:52:42Z neufeind $ */ class Net_IDNA2 { // {{{ npdata /** * These Unicode codepoints are * mapped to nothing, See RFC3454 for details * * @static * @var array * @access private */ private static $_np_map_nothing = array( 0xAD, 0x34F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B, 0x200C, 0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF ); /** * Prohibited codepints * * @static * @var array * @access private */ private static $_general_prohibited = array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2F, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x3002 ); /** * Codepints prohibited by Nameprep * @static * @var array * @access private */ private static $_np_prohibit = array( 0xA0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x202F, 0x205F, 0x3000, 0x6DD, 0x70F, 0x180E, 0x200C, 0x200D, 0x2028, 0x2029, 0xFEFF, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0x340, 0x341, 0x200E, 0x200F, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, 0x206A, 0x206B, 0x206C, 0x206D, 0x206E, 0x206F, 0xE0001 ); /** * Codepoint ranges prohibited by nameprep * * @static * @var array * @access private */ private static $_np_prohibit_ranges = array( array(0x80, 0x9F ), array(0x2060, 0x206F ), array(0x1D173, 0x1D17A ), array(0xE000, 0xF8FF ), array(0xF0000, 0xFFFFD ), array(0x100000, 0x10FFFD), array(0xFDD0, 0xFDEF ), array(0xD800, 0xDFFF ), array(0x2FF0, 0x2FFB ), array(0xE0020, 0xE007F ) ); /** * Replacement mappings (casemapping, replacement sequences, ...) * * @static * @var array * @access private */ private static $_np_replacemaps = array( 0x41 => array(0x61), 0x42 => array(0x62), 0x43 => array(0x63), 0x44 => array(0x64), 0x45 => array(0x65), 0x46 => array(0x66), 0x47 => array(0x67), 0x48 => array(0x68), 0x49 => array(0x69), 0x4A => array(0x6A), 0x4B => array(0x6B), 0x4C => array(0x6C), 0x4D => array(0x6D), 0x4E => array(0x6E), 0x4F => array(0x6F), 0x50 => array(0x70), 0x51 => array(0x71), 0x52 => array(0x72), 0x53 => array(0x73), 0x54 => array(0x74), 0x55 => array(0x75), 0x56 => array(0x76), 0x57 => array(0x77), 0x58 => array(0x78), 0x59 => array(0x79), 0x5A => array(0x7A), 0xB5 => array(0x3BC), 0xC0 => array(0xE0), 0xC1 => array(0xE1), 0xC2 => array(0xE2), 0xC3 => array(0xE3), 0xC4 => array(0xE4), 0xC5 => array(0xE5), 0xC6 => array(0xE6), 0xC7 => array(0xE7), 0xC8 => array(0xE8), 0xC9 => array(0xE9), 0xCA => array(0xEA), 0xCB => array(0xEB), 0xCC => array(0xEC), 0xCD => array(0xED), 0xCE => array(0xEE), 0xCF => array(0xEF), 0xD0 => array(0xF0), 0xD1 => array(0xF1), 0xD2 => array(0xF2), 0xD3 => array(0xF3), 0xD4 => array(0xF4), 0xD5 => array(0xF5), 0xD6 => array(0xF6), 0xD8 => array(0xF8), 0xD9 => array(0xF9), 0xDA => array(0xFA), 0xDB => array(0xFB), 0xDC => array(0xFC), 0xDD => array(0xFD), 0xDE => array(0xFE), 0xDF => array(0x73, 0x73), 0x100 => array(0x101), 0x102 => array(0x103), 0x104 => array(0x105), 0x106 => array(0x107), 0x108 => array(0x109), 0x10A => array(0x10B), 0x10C => array(0x10D), 0x10E => array(0x10F), 0x110 => array(0x111), 0x112 => array(0x113), 0x114 => array(0x115), 0x116 => array(0x117), 0x118 => array(0x119), 0x11A => array(0x11B), 0x11C => array(0x11D), 0x11E => array(0x11F), 0x120 => array(0x121), 0x122 => array(0x123), 0x124 => array(0x125), 0x126 => array(0x127), 0x128 => array(0x129), 0x12A => array(0x12B), 0x12C => array(0x12D), 0x12E => array(0x12F), 0x130 => array(0x69, 0x307), 0x132 => array(0x133), 0x134 => array(0x135), 0x136 => array(0x137), 0x139 => array(0x13A), 0x13B => array(0x13C), 0x13D => array(0x13E), 0x13F => array(0x140), 0x141 => array(0x142), 0x143 => array(0x144), 0x145 => array(0x146), 0x147 => array(0x148), 0x149 => array(0x2BC, 0x6E), 0x14A => array(0x14B), 0x14C => array(0x14D), 0x14E => array(0x14F), 0x150 => array(0x151), 0x152 => array(0x153), 0x154 => array(0x155), 0x156 => array(0x157), 0x158 => array(0x159), 0x15A => array(0x15B), 0x15C => array(0x15D), 0x15E => array(0x15F), 0x160 => array(0x161), 0x162 => array(0x163), 0x164 => array(0x165), 0x166 => array(0x167), 0x168 => array(0x169), 0x16A => array(0x16B), 0x16C => array(0x16D), 0x16E => array(0x16F), 0x170 => array(0x171), 0x172 => array(0x173), 0x174 => array(0x175), 0x176 => array(0x177), 0x178 => array(0xFF), 0x179 => array(0x17A), 0x17B => array(0x17C), 0x17D => array(0x17E), 0x17F => array(0x73), 0x181 => array(0x253), 0x182 => array(0x183), 0x184 => array(0x185), 0x186 => array(0x254), 0x187 => array(0x188), 0x189 => array(0x256), 0x18A => array(0x257), 0x18B => array(0x18C), 0x18E => array(0x1DD), 0x18F => array(0x259), 0x190 => array(0x25B), 0x191 => array(0x192), 0x193 => array(0x260), 0x194 => array(0x263), 0x196 => array(0x269), 0x197 => array(0x268), 0x198 => array(0x199), 0x19C => array(0x26F), 0x19D => array(0x272), 0x19F => array(0x275), 0x1A0 => array(0x1A1), 0x1A2 => array(0x1A3), 0x1A4 => array(0x1A5), 0x1A6 => array(0x280), 0x1A7 => array(0x1A8), 0x1A9 => array(0x283), 0x1AC => array(0x1AD), 0x1AE => array(0x288), 0x1AF => array(0x1B0), 0x1B1 => array(0x28A), 0x1B2 => array(0x28B), 0x1B3 => array(0x1B4), 0x1B5 => array(0x1B6), 0x1B7 => array(0x292), 0x1B8 => array(0x1B9), 0x1BC => array(0x1BD), 0x1C4 => array(0x1C6), 0x1C5 => array(0x1C6), 0x1C7 => array(0x1C9), 0x1C8 => array(0x1C9), 0x1CA => array(0x1CC), 0x1CB => array(0x1CC), 0x1CD => array(0x1CE), 0x1CF => array(0x1D0), 0x1D1 => array(0x1D2), 0x1D3 => array(0x1D4), 0x1D5 => array(0x1D6), 0x1D7 => array(0x1D8), 0x1D9 => array(0x1DA), 0x1DB => array(0x1DC), 0x1DE => array(0x1DF), 0x1E0 => array(0x1E1), 0x1E2 => array(0x1E3), 0x1E4 => array(0x1E5), 0x1E6 => array(0x1E7), 0x1E8 => array(0x1E9), 0x1EA => array(0x1EB), 0x1EC => array(0x1ED), 0x1EE => array(0x1EF), 0x1F0 => array(0x6A, 0x30C), 0x1F1 => array(0x1F3), 0x1F2 => array(0x1F3), 0x1F4 => array(0x1F5), 0x1F6 => array(0x195), 0x1F7 => array(0x1BF), 0x1F8 => array(0x1F9), 0x1FA => array(0x1FB), 0x1FC => array(0x1FD), 0x1FE => array(0x1FF), 0x200 => array(0x201), 0x202 => array(0x203), 0x204 => array(0x205), 0x206 => array(0x207), 0x208 => array(0x209), 0x20A => array(0x20B), 0x20C => array(0x20D), 0x20E => array(0x20F), 0x210 => array(0x211), 0x212 => array(0x213), 0x214 => array(0x215), 0x216 => array(0x217), 0x218 => array(0x219), 0x21A => array(0x21B), 0x21C => array(0x21D), 0x21E => array(0x21F), 0x220 => array(0x19E), 0x222 => array(0x223), 0x224 => array(0x225), 0x226 => array(0x227), 0x228 => array(0x229), 0x22A => array(0x22B), 0x22C => array(0x22D), 0x22E => array(0x22F), 0x230 => array(0x231), 0x232 => array(0x233), 0x345 => array(0x3B9), 0x37A => array(0x20, 0x3B9), 0x386 => array(0x3AC), 0x388 => array(0x3AD), 0x389 => array(0x3AE), 0x38A => array(0x3AF), 0x38C => array(0x3CC), 0x38E => array(0x3CD), 0x38F => array(0x3CE), 0x390 => array(0x3B9, 0x308, 0x301), 0x391 => array(0x3B1), 0x392 => array(0x3B2), 0x393 => array(0x3B3), 0x394 => array(0x3B4), 0x395 => array(0x3B5), 0x396 => array(0x3B6), 0x397 => array(0x3B7), 0x398 => array(0x3B8), 0x399 => array(0x3B9), 0x39A => array(0x3BA), 0x39B => array(0x3BB), 0x39C => array(0x3BC), 0x39D => array(0x3BD), 0x39E => array(0x3BE), 0x39F => array(0x3BF), 0x3A0 => array(0x3C0), 0x3A1 => array(0x3C1), 0x3A3 => array(0x3C3), 0x3A4 => array(0x3C4), 0x3A5 => array(0x3C5), 0x3A6 => array(0x3C6), 0x3A7 => array(0x3C7), 0x3A8 => array(0x3C8), 0x3A9 => array(0x3C9), 0x3AA => array(0x3CA), 0x3AB => array(0x3CB), 0x3B0 => array(0x3C5, 0x308, 0x301), 0x3C2 => array(0x3C3), 0x3D0 => array(0x3B2), 0x3D1 => array(0x3B8), 0x3D2 => array(0x3C5), 0x3D3 => array(0x3CD), 0x3D4 => array(0x3CB), 0x3D5 => array(0x3C6), 0x3D6 => array(0x3C0), 0x3D8 => array(0x3D9), 0x3DA => array(0x3DB), 0x3DC => array(0x3DD), 0x3DE => array(0x3DF), 0x3E0 => array(0x3E1), 0x3E2 => array(0x3E3), 0x3E4 => array(0x3E5), 0x3E6 => array(0x3E7), 0x3E8 => array(0x3E9), 0x3EA => array(0x3EB), 0x3EC => array(0x3ED), 0x3EE => array(0x3EF), 0x3F0 => array(0x3BA), 0x3F1 => array(0x3C1), 0x3F2 => array(0x3C3), 0x3F4 => array(0x3B8), 0x3F5 => array(0x3B5), 0x400 => array(0x450), 0x401 => array(0x451), 0x402 => array(0x452), 0x403 => array(0x453), 0x404 => array(0x454), 0x405 => array(0x455), 0x406 => array(0x456), 0x407 => array(0x457), 0x408 => array(0x458), 0x409 => array(0x459), 0x40A => array(0x45A), 0x40B => array(0x45B), 0x40C => array(0x45C), 0x40D => array(0x45D), 0x40E => array(0x45E), 0x40F => array(0x45F), 0x410 => array(0x430), 0x411 => array(0x431), 0x412 => array(0x432), 0x413 => array(0x433), 0x414 => array(0x434), 0x415 => array(0x435), 0x416 => array(0x436), 0x417 => array(0x437), 0x418 => array(0x438), 0x419 => array(0x439), 0x41A => array(0x43A), 0x41B => array(0x43B), 0x41C => array(0x43C), 0x41D => array(0x43D), 0x41E => array(0x43E), 0x41F => array(0x43F), 0x420 => array(0x440), 0x421 => array(0x441), 0x422 => array(0x442), 0x423 => array(0x443), 0x424 => array(0x444), 0x425 => array(0x445), 0x426 => array(0x446), 0x427 => array(0x447), 0x428 => array(0x448), 0x429 => array(0x449), 0x42A => array(0x44A), 0x42B => array(0x44B), 0x42C => array(0x44C), 0x42D => array(0x44D), 0x42E => array(0x44E), 0x42F => array(0x44F), 0x460 => array(0x461), 0x462 => array(0x463), 0x464 => array(0x465), 0x466 => array(0x467), 0x468 => array(0x469), 0x46A => array(0x46B), 0x46C => array(0x46D), 0x46E => array(0x46F), 0x470 => array(0x471), 0x472 => array(0x473), 0x474 => array(0x475), 0x476 => array(0x477), 0x478 => array(0x479), 0x47A => array(0x47B), 0x47C => array(0x47D), 0x47E => array(0x47F), 0x480 => array(0x481), 0x48A => array(0x48B), 0x48C => array(0x48D), 0x48E => array(0x48F), 0x490 => array(0x491), 0x492 => array(0x493), 0x494 => array(0x495), 0x496 => array(0x497), 0x498 => array(0x499), 0x49A => array(0x49B), 0x49C => array(0x49D), 0x49E => array(0x49F), 0x4A0 => array(0x4A1), 0x4A2 => array(0x4A3), 0x4A4 => array(0x4A5), 0x4A6 => array(0x4A7), 0x4A8 => array(0x4A9), 0x4AA => array(0x4AB), 0x4AC => array(0x4AD), 0x4AE => array(0x4AF), 0x4B0 => array(0x4B1), 0x4B2 => array(0x4B3), 0x4B4 => array(0x4B5), 0x4B6 => array(0x4B7), 0x4B8 => array(0x4B9), 0x4BA => array(0x4BB), 0x4BC => array(0x4BD), 0x4BE => array(0x4BF), 0x4C1 => array(0x4C2), 0x4C3 => array(0x4C4), 0x4C5 => array(0x4C6), 0x4C7 => array(0x4C8), 0x4C9 => array(0x4CA), 0x4CB => array(0x4CC), 0x4CD => array(0x4CE), 0x4D0 => array(0x4D1), 0x4D2 => array(0x4D3), 0x4D4 => array(0x4D5), 0x4D6 => array(0x4D7), 0x4D8 => array(0x4D9), 0x4DA => array(0x4DB), 0x4DC => array(0x4DD), 0x4DE => array(0x4DF), 0x4E0 => array(0x4E1), 0x4E2 => array(0x4E3), 0x4E4 => array(0x4E5), 0x4E6 => array(0x4E7), 0x4E8 => array(0x4E9), 0x4EA => array(0x4EB), 0x4EC => array(0x4ED), 0x4EE => array(0x4EF), 0x4F0 => array(0x4F1), 0x4F2 => array(0x4F3), 0x4F4 => array(0x4F5), 0x4F8 => array(0x4F9), 0x500 => array(0x501), 0x502 => array(0x503), 0x504 => array(0x505), 0x506 => array(0x507), 0x508 => array(0x509), 0x50A => array(0x50B), 0x50C => array(0x50D), 0x50E => array(0x50F), 0x531 => array(0x561), 0x532 => array(0x562), 0x533 => array(0x563), 0x534 => array(0x564), 0x535 => array(0x565), 0x536 => array(0x566), 0x537 => array(0x567), 0x538 => array(0x568), 0x539 => array(0x569), 0x53A => array(0x56A), 0x53B => array(0x56B), 0x53C => array(0x56C), 0x53D => array(0x56D), 0x53E => array(0x56E), 0x53F => array(0x56F), 0x540 => array(0x570), 0x541 => array(0x571), 0x542 => array(0x572), 0x543 => array(0x573), 0x544 => array(0x574), 0x545 => array(0x575), 0x546 => array(0x576), 0x547 => array(0x577), 0x548 => array(0x578), 0x549 => array(0x579), 0x54A => array(0x57A), 0x54B => array(0x57B), 0x54C => array(0x57C), 0x54D => array(0x57D), 0x54E => array(0x57E), 0x54F => array(0x57F), 0x550 => array(0x580), 0x551 => array(0x581), 0x552 => array(0x582), 0x553 => array(0x583), 0x554 => array(0x584), 0x555 => array(0x585), 0x556 => array(0x586), 0x587 => array(0x565, 0x582), 0x1E00 => array(0x1E01), 0x1E02 => array(0x1E03), 0x1E04 => array(0x1E05), 0x1E06 => array(0x1E07), 0x1E08 => array(0x1E09), 0x1E0A => array(0x1E0B), 0x1E0C => array(0x1E0D), 0x1E0E => array(0x1E0F), 0x1E10 => array(0x1E11), 0x1E12 => array(0x1E13), 0x1E14 => array(0x1E15), 0x1E16 => array(0x1E17), 0x1E18 => array(0x1E19), 0x1E1A => array(0x1E1B), 0x1E1C => array(0x1E1D), 0x1E1E => array(0x1E1F), 0x1E20 => array(0x1E21), 0x1E22 => array(0x1E23), 0x1E24 => array(0x1E25), 0x1E26 => array(0x1E27), 0x1E28 => array(0x1E29), 0x1E2A => array(0x1E2B), 0x1E2C => array(0x1E2D), 0x1E2E => array(0x1E2F), 0x1E30 => array(0x1E31), 0x1E32 => array(0x1E33), 0x1E34 => array(0x1E35), 0x1E36 => array(0x1E37), 0x1E38 => array(0x1E39), 0x1E3A => array(0x1E3B), 0x1E3C => array(0x1E3D), 0x1E3E => array(0x1E3F), 0x1E40 => array(0x1E41), 0x1E42 => array(0x1E43), 0x1E44 => array(0x1E45), 0x1E46 => array(0x1E47), 0x1E48 => array(0x1E49), 0x1E4A => array(0x1E4B), 0x1E4C => array(0x1E4D), 0x1E4E => array(0x1E4F), 0x1E50 => array(0x1E51), 0x1E52 => array(0x1E53), 0x1E54 => array(0x1E55), 0x1E56 => array(0x1E57), 0x1E58 => array(0x1E59), 0x1E5A => array(0x1E5B), 0x1E5C => array(0x1E5D), 0x1E5E => array(0x1E5F), 0x1E60 => array(0x1E61), 0x1E62 => array(0x1E63), 0x1E64 => array(0x1E65), 0x1E66 => array(0x1E67), 0x1E68 => array(0x1E69), 0x1E6A => array(0x1E6B), 0x1E6C => array(0x1E6D), 0x1E6E => array(0x1E6F), 0x1E70 => array(0x1E71), 0x1E72 => array(0x1E73), 0x1E74 => array(0x1E75), 0x1E76 => array(0x1E77), 0x1E78 => array(0x1E79), 0x1E7A => array(0x1E7B), 0x1E7C => array(0x1E7D), 0x1E7E => array(0x1E7F), 0x1E80 => array(0x1E81), 0x1E82 => array(0x1E83), 0x1E84 => array(0x1E85), 0x1E86 => array(0x1E87), 0x1E88 => array(0x1E89), 0x1E8A => array(0x1E8B), 0x1E8C => array(0x1E8D), 0x1E8E => array(0x1E8F), 0x1E90 => array(0x1E91), 0x1E92 => array(0x1E93), 0x1E94 => array(0x1E95), 0x1E96 => array(0x68, 0x331), 0x1E97 => array(0x74, 0x308), 0x1E98 => array(0x77, 0x30A), 0x1E99 => array(0x79, 0x30A), 0x1E9A => array(0x61, 0x2BE), 0x1E9B => array(0x1E61), 0x1EA0 => array(0x1EA1), 0x1EA2 => array(0x1EA3), 0x1EA4 => array(0x1EA5), 0x1EA6 => array(0x1EA7), 0x1EA8 => array(0x1EA9), 0x1EAA => array(0x1EAB), 0x1EAC => array(0x1EAD), 0x1EAE => array(0x1EAF), 0x1EB0 => array(0x1EB1), 0x1EB2 => array(0x1EB3), 0x1EB4 => array(0x1EB5), 0x1EB6 => array(0x1EB7), 0x1EB8 => array(0x1EB9), 0x1EBA => array(0x1EBB), 0x1EBC => array(0x1EBD), 0x1EBE => array(0x1EBF), 0x1EC0 => array(0x1EC1), 0x1EC2 => array(0x1EC3), 0x1EC4 => array(0x1EC5), 0x1EC6 => array(0x1EC7), 0x1EC8 => array(0x1EC9), 0x1ECA => array(0x1ECB), 0x1ECC => array(0x1ECD), 0x1ECE => array(0x1ECF), 0x1ED0 => array(0x1ED1), 0x1ED2 => array(0x1ED3), 0x1ED4 => array(0x1ED5), 0x1ED6 => array(0x1ED7), 0x1ED8 => array(0x1ED9), 0x1EDA => array(0x1EDB), 0x1EDC => array(0x1EDD), 0x1EDE => array(0x1EDF), 0x1EE0 => array(0x1EE1), 0x1EE2 => array(0x1EE3), 0x1EE4 => array(0x1EE5), 0x1EE6 => array(0x1EE7), 0x1EE8 => array(0x1EE9), 0x1EEA => array(0x1EEB), 0x1EEC => array(0x1EED), 0x1EEE => array(0x1EEF), 0x1EF0 => array(0x1EF1), 0x1EF2 => array(0x1EF3), 0x1EF4 => array(0x1EF5), 0x1EF6 => array(0x1EF7), 0x1EF8 => array(0x1EF9), 0x1F08 => array(0x1F00), 0x1F09 => array(0x1F01), 0x1F0A => array(0x1F02), 0x1F0B => array(0x1F03), 0x1F0C => array(0x1F04), 0x1F0D => array(0x1F05), 0x1F0E => array(0x1F06), 0x1F0F => array(0x1F07), 0x1F18 => array(0x1F10), 0x1F19 => array(0x1F11), 0x1F1A => array(0x1F12), 0x1F1B => array(0x1F13), 0x1F1C => array(0x1F14), 0x1F1D => array(0x1F15), 0x1F28 => array(0x1F20), 0x1F29 => array(0x1F21), 0x1F2A => array(0x1F22), 0x1F2B => array(0x1F23), 0x1F2C => array(0x1F24), 0x1F2D => array(0x1F25), 0x1F2E => array(0x1F26), 0x1F2F => array(0x1F27), 0x1F38 => array(0x1F30), 0x1F39 => array(0x1F31), 0x1F3A => array(0x1F32), 0x1F3B => array(0x1F33), 0x1F3C => array(0x1F34), 0x1F3D => array(0x1F35), 0x1F3E => array(0x1F36), 0x1F3F => array(0x1F37), 0x1F48 => array(0x1F40), 0x1F49 => array(0x1F41), 0x1F4A => array(0x1F42), 0x1F4B => array(0x1F43), 0x1F4C => array(0x1F44), 0x1F4D => array(0x1F45), 0x1F50 => array(0x3C5, 0x313), 0x1F52 => array(0x3C5, 0x313, 0x300), 0x1F54 => array(0x3C5, 0x313, 0x301), 0x1F56 => array(0x3C5, 0x313, 0x342), 0x1F59 => array(0x1F51), 0x1F5B => array(0x1F53), 0x1F5D => array(0x1F55), 0x1F5F => array(0x1F57), 0x1F68 => array(0x1F60), 0x1F69 => array(0x1F61), 0x1F6A => array(0x1F62), 0x1F6B => array(0x1F63), 0x1F6C => array(0x1F64), 0x1F6D => array(0x1F65), 0x1F6E => array(0x1F66), 0x1F6F => array(0x1F67), 0x1F80 => array(0x1F00, 0x3B9), 0x1F81 => array(0x1F01, 0x3B9), 0x1F82 => array(0x1F02, 0x3B9), 0x1F83 => array(0x1F03, 0x3B9), 0x1F84 => array(0x1F04, 0x3B9), 0x1F85 => array(0x1F05, 0x3B9), 0x1F86 => array(0x1F06, 0x3B9), 0x1F87 => array(0x1F07, 0x3B9), 0x1F88 => array(0x1F00, 0x3B9), 0x1F89 => array(0x1F01, 0x3B9), 0x1F8A => array(0x1F02, 0x3B9), 0x1F8B => array(0x1F03, 0x3B9), 0x1F8C => array(0x1F04, 0x3B9), 0x1F8D => array(0x1F05, 0x3B9), 0x1F8E => array(0x1F06, 0x3B9), 0x1F8F => array(0x1F07, 0x3B9), 0x1F90 => array(0x1F20, 0x3B9), 0x1F91 => array(0x1F21, 0x3B9), 0x1F92 => array(0x1F22, 0x3B9), 0x1F93 => array(0x1F23, 0x3B9), 0x1F94 => array(0x1F24, 0x3B9), 0x1F95 => array(0x1F25, 0x3B9), 0x1F96 => array(0x1F26, 0x3B9), 0x1F97 => array(0x1F27, 0x3B9), 0x1F98 => array(0x1F20, 0x3B9), 0x1F99 => array(0x1F21, 0x3B9), 0x1F9A => array(0x1F22, 0x3B9), 0x1F9B => array(0x1F23, 0x3B9), 0x1F9C => array(0x1F24, 0x3B9), 0x1F9D => array(0x1F25, 0x3B9), 0x1F9E => array(0x1F26, 0x3B9), 0x1F9F => array(0x1F27, 0x3B9), 0x1FA0 => array(0x1F60, 0x3B9), 0x1FA1 => array(0x1F61, 0x3B9), 0x1FA2 => array(0x1F62, 0x3B9), 0x1FA3 => array(0x1F63, 0x3B9), 0x1FA4 => array(0x1F64, 0x3B9), 0x1FA5 => array(0x1F65, 0x3B9), 0x1FA6 => array(0x1F66, 0x3B9), 0x1FA7 => array(0x1F67, 0x3B9), 0x1FA8 => array(0x1F60, 0x3B9), 0x1FA9 => array(0x1F61, 0x3B9), 0x1FAA => array(0x1F62, 0x3B9), 0x1FAB => array(0x1F63, 0x3B9), 0x1FAC => array(0x1F64, 0x3B9), 0x1FAD => array(0x1F65, 0x3B9), 0x1FAE => array(0x1F66, 0x3B9), 0x1FAF => array(0x1F67, 0x3B9), 0x1FB2 => array(0x1F70, 0x3B9), 0x1FB3 => array(0x3B1, 0x3B9), 0x1FB4 => array(0x3AC, 0x3B9), 0x1FB6 => array(0x3B1, 0x342), 0x1FB7 => array(0x3B1, 0x342, 0x3B9), 0x1FB8 => array(0x1FB0), 0x1FB9 => array(0x1FB1), 0x1FBA => array(0x1F70), 0x1FBB => array(0x1F71), 0x1FBC => array(0x3B1, 0x3B9), 0x1FBE => array(0x3B9), 0x1FC2 => array(0x1F74, 0x3B9), 0x1FC3 => array(0x3B7, 0x3B9), 0x1FC4 => array(0x3AE, 0x3B9), 0x1FC6 => array(0x3B7, 0x342), 0x1FC7 => array(0x3B7, 0x342, 0x3B9), 0x1FC8 => array(0x1F72), 0x1FC9 => array(0x1F73), 0x1FCA => array(0x1F74), 0x1FCB => array(0x1F75), 0x1FCC => array(0x3B7, 0x3B9), 0x1FD2 => array(0x3B9, 0x308, 0x300), 0x1FD3 => array(0x3B9, 0x308, 0x301), 0x1FD6 => array(0x3B9, 0x342), 0x1FD7 => array(0x3B9, 0x308, 0x342), 0x1FD8 => array(0x1FD0), 0x1FD9 => array(0x1FD1), 0x1FDA => array(0x1F76), 0x1FDB => array(0x1F77), 0x1FE2 => array(0x3C5, 0x308, 0x300), 0x1FE3 => array(0x3C5, 0x308, 0x301), 0x1FE4 => array(0x3C1, 0x313), 0x1FE6 => array(0x3C5, 0x342), 0x1FE7 => array(0x3C5, 0x308, 0x342), 0x1FE8 => array(0x1FE0), 0x1FE9 => array(0x1FE1), 0x1FEA => array(0x1F7A), 0x1FEB => array(0x1F7B), 0x1FEC => array(0x1FE5), 0x1FF2 => array(0x1F7C, 0x3B9), 0x1FF3 => array(0x3C9, 0x3B9), 0x1FF4 => array(0x3CE, 0x3B9), 0x1FF6 => array(0x3C9, 0x342), 0x1FF7 => array(0x3C9, 0x342, 0x3B9), 0x1FF8 => array(0x1F78), 0x1FF9 => array(0x1F79), 0x1FFA => array(0x1F7C), 0x1FFB => array(0x1F7D), 0x1FFC => array(0x3C9, 0x3B9), 0x20A8 => array(0x72, 0x73), 0x2102 => array(0x63), 0x2103 => array(0xB0, 0x63), 0x2107 => array(0x25B), 0x2109 => array(0xB0, 0x66), 0x210B => array(0x68), 0x210C => array(0x68), 0x210D => array(0x68), 0x2110 => array(0x69), 0x2111 => array(0x69), 0x2112 => array(0x6C), 0x2115 => array(0x6E), 0x2116 => array(0x6E, 0x6F), 0x2119 => array(0x70), 0x211A => array(0x71), 0x211B => array(0x72), 0x211C => array(0x72), 0x211D => array(0x72), 0x2120 => array(0x73, 0x6D), 0x2121 => array(0x74, 0x65, 0x6C), 0x2122 => array(0x74, 0x6D), 0x2124 => array(0x7A), 0x2126 => array(0x3C9), 0x2128 => array(0x7A), 0x212A => array(0x6B), 0x212B => array(0xE5), 0x212C => array(0x62), 0x212D => array(0x63), 0x2130 => array(0x65), 0x2131 => array(0x66), 0x2133 => array(0x6D), 0x213E => array(0x3B3), 0x213F => array(0x3C0), 0x2145 => array(0x64), 0x2160 => array(0x2170), 0x2161 => array(0x2171), 0x2162 => array(0x2172), 0x2163 => array(0x2173), 0x2164 => array(0x2174), 0x2165 => array(0x2175), 0x2166 => array(0x2176), 0x2167 => array(0x2177), 0x2168 => array(0x2178), 0x2169 => array(0x2179), 0x216A => array(0x217A), 0x216B => array(0x217B), 0x216C => array(0x217C), 0x216D => array(0x217D), 0x216E => array(0x217E), 0x216F => array(0x217F), 0x24B6 => array(0x24D0), 0x24B7 => array(0x24D1), 0x24B8 => array(0x24D2), 0x24B9 => array(0x24D3), 0x24BA => array(0x24D4), 0x24BB => array(0x24D5), 0x24BC => array(0x24D6), 0x24BD => array(0x24D7), 0x24BE => array(0x24D8), 0x24BF => array(0x24D9), 0x24C0 => array(0x24DA), 0x24C1 => array(0x24DB), 0x24C2 => array(0x24DC), 0x24C3 => array(0x24DD), 0x24C4 => array(0x24DE), 0x24C5 => array(0x24DF), 0x24C6 => array(0x24E0), 0x24C7 => array(0x24E1), 0x24C8 => array(0x24E2), 0x24C9 => array(0x24E3), 0x24CA => array(0x24E4), 0x24CB => array(0x24E5), 0x24CC => array(0x24E6), 0x24CD => array(0x24E7), 0x24CE => array(0x24E8), 0x24CF => array(0x24E9), 0x3371 => array(0x68, 0x70, 0x61), 0x3373 => array(0x61, 0x75), 0x3375 => array(0x6F, 0x76), 0x3380 => array(0x70, 0x61), 0x3381 => array(0x6E, 0x61), 0x3382 => array(0x3BC, 0x61), 0x3383 => array(0x6D, 0x61), 0x3384 => array(0x6B, 0x61), 0x3385 => array(0x6B, 0x62), 0x3386 => array(0x6D, 0x62), 0x3387 => array(0x67, 0x62), 0x338A => array(0x70, 0x66), 0x338B => array(0x6E, 0x66), 0x338C => array(0x3BC, 0x66), 0x3390 => array(0x68, 0x7A), 0x3391 => array(0x6B, 0x68, 0x7A), 0x3392 => array(0x6D, 0x68, 0x7A), 0x3393 => array(0x67, 0x68, 0x7A), 0x3394 => array(0x74, 0x68, 0x7A), 0x33A9 => array(0x70, 0x61), 0x33AA => array(0x6B, 0x70, 0x61), 0x33AB => array(0x6D, 0x70, 0x61), 0x33AC => array(0x67, 0x70, 0x61), 0x33B4 => array(0x70, 0x76), 0x33B5 => array(0x6E, 0x76), 0x33B6 => array(0x3BC, 0x76), 0x33B7 => array(0x6D, 0x76), 0x33B8 => array(0x6B, 0x76), 0x33B9 => array(0x6D, 0x76), 0x33BA => array(0x70, 0x77), 0x33BB => array(0x6E, 0x77), 0x33BC => array(0x3BC, 0x77), 0x33BD => array(0x6D, 0x77), 0x33BE => array(0x6B, 0x77), 0x33BF => array(0x6D, 0x77), 0x33C0 => array(0x6B, 0x3C9), 0x33C1 => array(0x6D, 0x3C9), /* 0x33C2 => array(0x61, 0x2E, 0x6D, 0x2E), */ 0x33C3 => array(0x62, 0x71), 0x33C6 => array(0x63, 0x2215, 0x6B, 0x67), 0x33C7 => array(0x63, 0x6F, 0x2E), 0x33C8 => array(0x64, 0x62), 0x33C9 => array(0x67, 0x79), 0x33CB => array(0x68, 0x70), 0x33CD => array(0x6B, 0x6B), 0x33CE => array(0x6B, 0x6D), 0x33D7 => array(0x70, 0x68), 0x33D9 => array(0x70, 0x70, 0x6D), 0x33DA => array(0x70, 0x72), 0x33DC => array(0x73, 0x76), 0x33DD => array(0x77, 0x62), 0xFB00 => array(0x66, 0x66), 0xFB01 => array(0x66, 0x69), 0xFB02 => array(0x66, 0x6C), 0xFB03 => array(0x66, 0x66, 0x69), 0xFB04 => array(0x66, 0x66, 0x6C), 0xFB05 => array(0x73, 0x74), 0xFB06 => array(0x73, 0x74), 0xFB13 => array(0x574, 0x576), 0xFB14 => array(0x574, 0x565), 0xFB15 => array(0x574, 0x56B), 0xFB16 => array(0x57E, 0x576), 0xFB17 => array(0x574, 0x56D), 0xFF21 => array(0xFF41), 0xFF22 => array(0xFF42), 0xFF23 => array(0xFF43), 0xFF24 => array(0xFF44), 0xFF25 => array(0xFF45), 0xFF26 => array(0xFF46), 0xFF27 => array(0xFF47), 0xFF28 => array(0xFF48), 0xFF29 => array(0xFF49), 0xFF2A => array(0xFF4A), 0xFF2B => array(0xFF4B), 0xFF2C => array(0xFF4C), 0xFF2D => array(0xFF4D), 0xFF2E => array(0xFF4E), 0xFF2F => array(0xFF4F), 0xFF30 => array(0xFF50), 0xFF31 => array(0xFF51), 0xFF32 => array(0xFF52), 0xFF33 => array(0xFF53), 0xFF34 => array(0xFF54), 0xFF35 => array(0xFF55), 0xFF36 => array(0xFF56), 0xFF37 => array(0xFF57), 0xFF38 => array(0xFF58), 0xFF39 => array(0xFF59), 0xFF3A => array(0xFF5A), 0x10400 => array(0x10428), 0x10401 => array(0x10429), 0x10402 => array(0x1042A), 0x10403 => array(0x1042B), 0x10404 => array(0x1042C), 0x10405 => array(0x1042D), 0x10406 => array(0x1042E), 0x10407 => array(0x1042F), 0x10408 => array(0x10430), 0x10409 => array(0x10431), 0x1040A => array(0x10432), 0x1040B => array(0x10433), 0x1040C => array(0x10434), 0x1040D => array(0x10435), 0x1040E => array(0x10436), 0x1040F => array(0x10437), 0x10410 => array(0x10438), 0x10411 => array(0x10439), 0x10412 => array(0x1043A), 0x10413 => array(0x1043B), 0x10414 => array(0x1043C), 0x10415 => array(0x1043D), 0x10416 => array(0x1043E), 0x10417 => array(0x1043F), 0x10418 => array(0x10440), 0x10419 => array(0x10441), 0x1041A => array(0x10442), 0x1041B => array(0x10443), 0x1041C => array(0x10444), 0x1041D => array(0x10445), 0x1041E => array(0x10446), 0x1041F => array(0x10447), 0x10420 => array(0x10448), 0x10421 => array(0x10449), 0x10422 => array(0x1044A), 0x10423 => array(0x1044B), 0x10424 => array(0x1044C), 0x10425 => array(0x1044D), 0x1D400 => array(0x61), 0x1D401 => array(0x62), 0x1D402 => array(0x63), 0x1D403 => array(0x64), 0x1D404 => array(0x65), 0x1D405 => array(0x66), 0x1D406 => array(0x67), 0x1D407 => array(0x68), 0x1D408 => array(0x69), 0x1D409 => array(0x6A), 0x1D40A => array(0x6B), 0x1D40B => array(0x6C), 0x1D40C => array(0x6D), 0x1D40D => array(0x6E), 0x1D40E => array(0x6F), 0x1D40F => array(0x70), 0x1D410 => array(0x71), 0x1D411 => array(0x72), 0x1D412 => array(0x73), 0x1D413 => array(0x74), 0x1D414 => array(0x75), 0x1D415 => array(0x76), 0x1D416 => array(0x77), 0x1D417 => array(0x78), 0x1D418 => array(0x79), 0x1D419 => array(0x7A), 0x1D434 => array(0x61), 0x1D435 => array(0x62), 0x1D436 => array(0x63), 0x1D437 => array(0x64), 0x1D438 => array(0x65), 0x1D439 => array(0x66), 0x1D43A => array(0x67), 0x1D43B => array(0x68), 0x1D43C => array(0x69), 0x1D43D => array(0x6A), 0x1D43E => array(0x6B), 0x1D43F => array(0x6C), 0x1D440 => array(0x6D), 0x1D441 => array(0x6E), 0x1D442 => array(0x6F), 0x1D443 => array(0x70), 0x1D444 => array(0x71), 0x1D445 => array(0x72), 0x1D446 => array(0x73), 0x1D447 => array(0x74), 0x1D448 => array(0x75), 0x1D449 => array(0x76), 0x1D44A => array(0x77), 0x1D44B => array(0x78), 0x1D44C => array(0x79), 0x1D44D => array(0x7A), 0x1D468 => array(0x61), 0x1D469 => array(0x62), 0x1D46A => array(0x63), 0x1D46B => array(0x64), 0x1D46C => array(0x65), 0x1D46D => array(0x66), 0x1D46E => array(0x67), 0x1D46F => array(0x68), 0x1D470 => array(0x69), 0x1D471 => array(0x6A), 0x1D472 => array(0x6B), 0x1D473 => array(0x6C), 0x1D474 => array(0x6D), 0x1D475 => array(0x6E), 0x1D476 => array(0x6F), 0x1D477 => array(0x70), 0x1D478 => array(0x71), 0x1D479 => array(0x72), 0x1D47A => array(0x73), 0x1D47B => array(0x74), 0x1D47C => array(0x75), 0x1D47D => array(0x76), 0x1D47E => array(0x77), 0x1D47F => array(0x78), 0x1D480 => array(0x79), 0x1D481 => array(0x7A), 0x1D49C => array(0x61), 0x1D49E => array(0x63), 0x1D49F => array(0x64), 0x1D4A2 => array(0x67), 0x1D4A5 => array(0x6A), 0x1D4A6 => array(0x6B), 0x1D4A9 => array(0x6E), 0x1D4AA => array(0x6F), 0x1D4AB => array(0x70), 0x1D4AC => array(0x71), 0x1D4AE => array(0x73), 0x1D4AF => array(0x74), 0x1D4B0 => array(0x75), 0x1D4B1 => array(0x76), 0x1D4B2 => array(0x77), 0x1D4B3 => array(0x78), 0x1D4B4 => array(0x79), 0x1D4B5 => array(0x7A), 0x1D4D0 => array(0x61), 0x1D4D1 => array(0x62), 0x1D4D2 => array(0x63), 0x1D4D3 => array(0x64), 0x1D4D4 => array(0x65), 0x1D4D5 => array(0x66), 0x1D4D6 => array(0x67), 0x1D4D7 => array(0x68), 0x1D4D8 => array(0x69), 0x1D4D9 => array(0x6A), 0x1D4DA => array(0x6B), 0x1D4DB => array(0x6C), 0x1D4DC => array(0x6D), 0x1D4DD => array(0x6E), 0x1D4DE => array(0x6F), 0x1D4DF => array(0x70), 0x1D4E0 => array(0x71), 0x1D4E1 => array(0x72), 0x1D4E2 => array(0x73), 0x1D4E3 => array(0x74), 0x1D4E4 => array(0x75), 0x1D4E5 => array(0x76), 0x1D4E6 => array(0x77), 0x1D4E7 => array(0x78), 0x1D4E8 => array(0x79), 0x1D4E9 => array(0x7A), 0x1D504 => array(0x61), 0x1D505 => array(0x62), 0x1D507 => array(0x64), 0x1D508 => array(0x65), 0x1D509 => array(0x66), 0x1D50A => array(0x67), 0x1D50D => array(0x6A), 0x1D50E => array(0x6B), 0x1D50F => array(0x6C), 0x1D510 => array(0x6D), 0x1D511 => array(0x6E), 0x1D512 => array(0x6F), 0x1D513 => array(0x70), 0x1D514 => array(0x71), 0x1D516 => array(0x73), 0x1D517 => array(0x74), 0x1D518 => array(0x75), 0x1D519 => array(0x76), 0x1D51A => array(0x77), 0x1D51B => array(0x78), 0x1D51C => array(0x79), 0x1D538 => array(0x61), 0x1D539 => array(0x62), 0x1D53B => array(0x64), 0x1D53C => array(0x65), 0x1D53D => array(0x66), 0x1D53E => array(0x67), 0x1D540 => array(0x69), 0x1D541 => array(0x6A), 0x1D542 => array(0x6B), 0x1D543 => array(0x6C), 0x1D544 => array(0x6D), 0x1D546 => array(0x6F), 0x1D54A => array(0x73), 0x1D54B => array(0x74), 0x1D54C => array(0x75), 0x1D54D => array(0x76), 0x1D54E => array(0x77), 0x1D54F => array(0x78), 0x1D550 => array(0x79), 0x1D56C => array(0x61), 0x1D56D => array(0x62), 0x1D56E => array(0x63), 0x1D56F => array(0x64), 0x1D570 => array(0x65), 0x1D571 => array(0x66), 0x1D572 => array(0x67), 0x1D573 => array(0x68), 0x1D574 => array(0x69), 0x1D575 => array(0x6A), 0x1D576 => array(0x6B), 0x1D577 => array(0x6C), 0x1D578 => array(0x6D), 0x1D579 => array(0x6E), 0x1D57A => array(0x6F), 0x1D57B => array(0x70), 0x1D57C => array(0x71), 0x1D57D => array(0x72), 0x1D57E => array(0x73), 0x1D57F => array(0x74), 0x1D580 => array(0x75), 0x1D581 => array(0x76), 0x1D582 => array(0x77), 0x1D583 => array(0x78), 0x1D584 => array(0x79), 0x1D585 => array(0x7A), 0x1D5A0 => array(0x61), 0x1D5A1 => array(0x62), 0x1D5A2 => array(0x63), 0x1D5A3 => array(0x64), 0x1D5A4 => array(0x65), 0x1D5A5 => array(0x66), 0x1D5A6 => array(0x67), 0x1D5A7 => array(0x68), 0x1D5A8 => array(0x69), 0x1D5A9 => array(0x6A), 0x1D5AA => array(0x6B), 0x1D5AB => array(0x6C), 0x1D5AC => array(0x6D), 0x1D5AD => array(0x6E), 0x1D5AE => array(0x6F), 0x1D5AF => array(0x70), 0x1D5B0 => array(0x71), 0x1D5B1 => array(0x72), 0x1D5B2 => array(0x73), 0x1D5B3 => array(0x74), 0x1D5B4 => array(0x75), 0x1D5B5 => array(0x76), 0x1D5B6 => array(0x77), 0x1D5B7 => array(0x78), 0x1D5B8 => array(0x79), 0x1D5B9 => array(0x7A), 0x1D5D4 => array(0x61), 0x1D5D5 => array(0x62), 0x1D5D6 => array(0x63), 0x1D5D7 => array(0x64), 0x1D5D8 => array(0x65), 0x1D5D9 => array(0x66), 0x1D5DA => array(0x67), 0x1D5DB => array(0x68), 0x1D5DC => array(0x69), 0x1D5DD => array(0x6A), 0x1D5DE => array(0x6B), 0x1D5DF => array(0x6C), 0x1D5E0 => array(0x6D), 0x1D5E1 => array(0x6E), 0x1D5E2 => array(0x6F), 0x1D5E3 => array(0x70), 0x1D5E4 => array(0x71), 0x1D5E5 => array(0x72), 0x1D5E6 => array(0x73), 0x1D5E7 => array(0x74), 0x1D5E8 => array(0x75), 0x1D5E9 => array(0x76), 0x1D5EA => array(0x77), 0x1D5EB => array(0x78), 0x1D5EC => array(0x79), 0x1D5ED => array(0x7A), 0x1D608 => array(0x61), 0x1D609 => array(0x62), 0x1D60A => array(0x63), 0x1D60B => array(0x64), 0x1D60C => array(0x65), 0x1D60D => array(0x66), 0x1D60E => array(0x67), 0x1D60F => array(0x68), 0x1D610 => array(0x69), 0x1D611 => array(0x6A), 0x1D612 => array(0x6B), 0x1D613 => array(0x6C), 0x1D614 => array(0x6D), 0x1D615 => array(0x6E), 0x1D616 => array(0x6F), 0x1D617 => array(0x70), 0x1D618 => array(0x71), 0x1D619 => array(0x72), 0x1D61A => array(0x73), 0x1D61B => array(0x74), 0x1D61C => array(0x75), 0x1D61D => array(0x76), 0x1D61E => array(0x77), 0x1D61F => array(0x78), 0x1D620 => array(0x79), 0x1D621 => array(0x7A), 0x1D63C => array(0x61), 0x1D63D => array(0x62), 0x1D63E => array(0x63), 0x1D63F => array(0x64), 0x1D640 => array(0x65), 0x1D641 => array(0x66), 0x1D642 => array(0x67), 0x1D643 => array(0x68), 0x1D644 => array(0x69), 0x1D645 => array(0x6A), 0x1D646 => array(0x6B), 0x1D647 => array(0x6C), 0x1D648 => array(0x6D), 0x1D649 => array(0x6E), 0x1D64A => array(0x6F), 0x1D64B => array(0x70), 0x1D64C => array(0x71), 0x1D64D => array(0x72), 0x1D64E => array(0x73), 0x1D64F => array(0x74), 0x1D650 => array(0x75), 0x1D651 => array(0x76), 0x1D652 => array(0x77), 0x1D653 => array(0x78), 0x1D654 => array(0x79), 0x1D655 => array(0x7A), 0x1D670 => array(0x61), 0x1D671 => array(0x62), 0x1D672 => array(0x63), 0x1D673 => array(0x64), 0x1D674 => array(0x65), 0x1D675 => array(0x66), 0x1D676 => array(0x67), 0x1D677 => array(0x68), 0x1D678 => array(0x69), 0x1D679 => array(0x6A), 0x1D67A => array(0x6B), 0x1D67B => array(0x6C), 0x1D67C => array(0x6D), 0x1D67D => array(0x6E), 0x1D67E => array(0x6F), 0x1D67F => array(0x70), 0x1D680 => array(0x71), 0x1D681 => array(0x72), 0x1D682 => array(0x73), 0x1D683 => array(0x74), 0x1D684 => array(0x75), 0x1D685 => array(0x76), 0x1D686 => array(0x77), 0x1D687 => array(0x78), 0x1D688 => array(0x79), 0x1D689 => array(0x7A), 0x1D6A8 => array(0x3B1), 0x1D6A9 => array(0x3B2), 0x1D6AA => array(0x3B3), 0x1D6AB => array(0x3B4), 0x1D6AC => array(0x3B5), 0x1D6AD => array(0x3B6), 0x1D6AE => array(0x3B7), 0x1D6AF => array(0x3B8), 0x1D6B0 => array(0x3B9), 0x1D6B1 => array(0x3BA), 0x1D6B2 => array(0x3BB), 0x1D6B3 => array(0x3BC), 0x1D6B4 => array(0x3BD), 0x1D6B5 => array(0x3BE), 0x1D6B6 => array(0x3BF), 0x1D6B7 => array(0x3C0), 0x1D6B8 => array(0x3C1), 0x1D6B9 => array(0x3B8), 0x1D6BA => array(0x3C3), 0x1D6BB => array(0x3C4), 0x1D6BC => array(0x3C5), 0x1D6BD => array(0x3C6), 0x1D6BE => array(0x3C7), 0x1D6BF => array(0x3C8), 0x1D6C0 => array(0x3C9), 0x1D6D3 => array(0x3C3), 0x1D6E2 => array(0x3B1), 0x1D6E3 => array(0x3B2), 0x1D6E4 => array(0x3B3), 0x1D6E5 => array(0x3B4), 0x1D6E6 => array(0x3B5), 0x1D6E7 => array(0x3B6), 0x1D6E8 => array(0x3B7), 0x1D6E9 => array(0x3B8), 0x1D6EA => array(0x3B9), 0x1D6EB => array(0x3BA), 0x1D6EC => array(0x3BB), 0x1D6ED => array(0x3BC), 0x1D6EE => array(0x3BD), 0x1D6EF => array(0x3BE), 0x1D6F0 => array(0x3BF), 0x1D6F1 => array(0x3C0), 0x1D6F2 => array(0x3C1), 0x1D6F3 => array(0x3B8), 0x1D6F4 => array(0x3C3), 0x1D6F5 => array(0x3C4), 0x1D6F6 => array(0x3C5), 0x1D6F7 => array(0x3C6), 0x1D6F8 => array(0x3C7), 0x1D6F9 => array(0x3C8), 0x1D6FA => array(0x3C9), 0x1D70D => array(0x3C3), 0x1D71C => array(0x3B1), 0x1D71D => array(0x3B2), 0x1D71E => array(0x3B3), 0x1D71F => array(0x3B4), 0x1D720 => array(0x3B5), 0x1D721 => array(0x3B6), 0x1D722 => array(0x3B7), 0x1D723 => array(0x3B8), 0x1D724 => array(0x3B9), 0x1D725 => array(0x3BA), 0x1D726 => array(0x3BB), 0x1D727 => array(0x3BC), 0x1D728 => array(0x3BD), 0x1D729 => array(0x3BE), 0x1D72A => array(0x3BF), 0x1D72B => array(0x3C0), 0x1D72C => array(0x3C1), 0x1D72D => array(0x3B8), 0x1D72E => array(0x3C3), 0x1D72F => array(0x3C4), 0x1D730 => array(0x3C5), 0x1D731 => array(0x3C6), 0x1D732 => array(0x3C7), 0x1D733 => array(0x3C8), 0x1D734 => array(0x3C9), 0x1D747 => array(0x3C3), 0x1D756 => array(0x3B1), 0x1D757 => array(0x3B2), 0x1D758 => array(0x3B3), 0x1D759 => array(0x3B4), 0x1D75A => array(0x3B5), 0x1D75B => array(0x3B6), 0x1D75C => array(0x3B7), 0x1D75D => array(0x3B8), 0x1D75E => array(0x3B9), 0x1D75F => array(0x3BA), 0x1D760 => array(0x3BB), 0x1D761 => array(0x3BC), 0x1D762 => array(0x3BD), 0x1D763 => array(0x3BE), 0x1D764 => array(0x3BF), 0x1D765 => array(0x3C0), 0x1D766 => array(0x3C1), 0x1D767 => array(0x3B8), 0x1D768 => array(0x3C3), 0x1D769 => array(0x3C4), 0x1D76A => array(0x3C5), 0x1D76B => array(0x3C6), 0x1D76C => array(0x3C7), 0x1D76D => array(0x3C8), 0x1D76E => array(0x3C9), 0x1D781 => array(0x3C3), 0x1D790 => array(0x3B1), 0x1D791 => array(0x3B2), 0x1D792 => array(0x3B3), 0x1D793 => array(0x3B4), 0x1D794 => array(0x3B5), 0x1D795 => array(0x3B6), 0x1D796 => array(0x3B7), 0x1D797 => array(0x3B8), 0x1D798 => array(0x3B9), 0x1D799 => array(0x3BA), 0x1D79A => array(0x3BB), 0x1D79B => array(0x3BC), 0x1D79C => array(0x3BD), 0x1D79D => array(0x3BE), 0x1D79E => array(0x3BF), 0x1D79F => array(0x3C0), 0x1D7A0 => array(0x3C1), 0x1D7A1 => array(0x3B8), 0x1D7A2 => array(0x3C3), 0x1D7A3 => array(0x3C4), 0x1D7A4 => array(0x3C5), 0x1D7A5 => array(0x3C6), 0x1D7A6 => array(0x3C7), 0x1D7A7 => array(0x3C8), 0x1D7A8 => array(0x3C9), 0x1D7BB => array(0x3C3), 0x3F9 => array(0x3C3), 0x1D2C => array(0x61), 0x1D2D => array(0xE6), 0x1D2E => array(0x62), 0x1D30 => array(0x64), 0x1D31 => array(0x65), 0x1D32 => array(0x1DD), 0x1D33 => array(0x67), 0x1D34 => array(0x68), 0x1D35 => array(0x69), 0x1D36 => array(0x6A), 0x1D37 => array(0x6B), 0x1D38 => array(0x6C), 0x1D39 => array(0x6D), 0x1D3A => array(0x6E), 0x1D3C => array(0x6F), 0x1D3D => array(0x223), 0x1D3E => array(0x70), 0x1D3F => array(0x72), 0x1D40 => array(0x74), 0x1D41 => array(0x75), 0x1D42 => array(0x77), 0x213B => array(0x66, 0x61, 0x78), 0x3250 => array(0x70, 0x74, 0x65), 0x32CC => array(0x68, 0x67), 0x32CE => array(0x65, 0x76), 0x32CF => array(0x6C, 0x74, 0x64), 0x337A => array(0x69, 0x75), 0x33DE => array(0x76, 0x2215, 0x6D), 0x33DF => array(0x61, 0x2215, 0x6D) ); /** * Normalization Combining Classes; Code Points not listed * got Combining Class 0. * * @static * @var array * @access private */ private static $_np_norm_combcls = array( 0x334 => 1, 0x335 => 1, 0x336 => 1, 0x337 => 1, 0x338 => 1, 0x93C => 7, 0x9BC => 7, 0xA3C => 7, 0xABC => 7, 0xB3C => 7, 0xCBC => 7, 0x1037 => 7, 0x3099 => 8, 0x309A => 8, 0x94D => 9, 0x9CD => 9, 0xA4D => 9, 0xACD => 9, 0xB4D => 9, 0xBCD => 9, 0xC4D => 9, 0xCCD => 9, 0xD4D => 9, 0xDCA => 9, 0xE3A => 9, 0xF84 => 9, 0x1039 => 9, 0x1714 => 9, 0x1734 => 9, 0x17D2 => 9, 0x5B0 => 10, 0x5B1 => 11, 0x5B2 => 12, 0x5B3 => 13, 0x5B4 => 14, 0x5B5 => 15, 0x5B6 => 16, 0x5B7 => 17, 0x5B8 => 18, 0x5B9 => 19, 0x5BB => 20, 0x5Bc => 21, 0x5BD => 22, 0x5BF => 23, 0x5C1 => 24, 0x5C2 => 25, 0xFB1E => 26, 0x64B => 27, 0x64C => 28, 0x64D => 29, 0x64E => 30, 0x64F => 31, 0x650 => 32, 0x651 => 33, 0x652 => 34, 0x670 => 35, 0x711 => 36, 0xC55 => 84, 0xC56 => 91, 0xE38 => 103, 0xE39 => 103, 0xE48 => 107, 0xE49 => 107, 0xE4A => 107, 0xE4B => 107, 0xEB8 => 118, 0xEB9 => 118, 0xEC8 => 122, 0xEC9 => 122, 0xECA => 122, 0xECB => 122, 0xF71 => 129, 0xF72 => 130, 0xF7A => 130, 0xF7B => 130, 0xF7C => 130, 0xF7D => 130, 0xF80 => 130, 0xF74 => 132, 0x321 => 202, 0x322 => 202, 0x327 => 202, 0x328 => 202, 0x31B => 216, 0xF39 => 216, 0x1D165 => 216, 0x1D166 => 216, 0x1D16E => 216, 0x1D16F => 216, 0x1D170 => 216, 0x1D171 => 216, 0x1D172 => 216, 0x302A => 218, 0x316 => 220, 0x317 => 220, 0x318 => 220, 0x319 => 220, 0x31C => 220, 0x31D => 220, 0x31E => 220, 0x31F => 220, 0x320 => 220, 0x323 => 220, 0x324 => 220, 0x325 => 220, 0x326 => 220, 0x329 => 220, 0x32A => 220, 0x32B => 220, 0x32C => 220, 0x32D => 220, 0x32E => 220, 0x32F => 220, 0x330 => 220, 0x331 => 220, 0x332 => 220, 0x333 => 220, 0x339 => 220, 0x33A => 220, 0x33B => 220, 0x33C => 220, 0x347 => 220, 0x348 => 220, 0x349 => 220, 0x34D => 220, 0x34E => 220, 0x353 => 220, 0x354 => 220, 0x355 => 220, 0x356 => 220, 0x591 => 220, 0x596 => 220, 0x59B => 220, 0x5A3 => 220, 0x5A4 => 220, 0x5A5 => 220, 0x5A6 => 220, 0x5A7 => 220, 0x5AA => 220, 0x655 => 220, 0x656 => 220, 0x6E3 => 220, 0x6EA => 220, 0x6ED => 220, 0x731 => 220, 0x734 => 220, 0x737 => 220, 0x738 => 220, 0x739 => 220, 0x73B => 220, 0x73C => 220, 0x73E => 220, 0x742 => 220, 0x744 => 220, 0x746 => 220, 0x748 => 220, 0x952 => 220, 0xF18 => 220, 0xF19 => 220, 0xF35 => 220, 0xF37 => 220, 0xFC6 => 220, 0x193B => 220, 0x20E8 => 220, 0x1D17B => 220, 0x1D17C => 220, 0x1D17D => 220, 0x1D17E => 220, 0x1D17F => 220, 0x1D180 => 220, 0x1D181 => 220, 0x1D182 => 220, 0x1D18A => 220, 0x1D18B => 220, 0x59A => 222, 0x5AD => 222, 0x1929 => 222, 0x302D => 222, 0x302E => 224, 0x302F => 224, 0x1D16D => 226, 0x5AE => 228, 0x18A9 => 228, 0x302B => 228, 0x300 => 230, 0x301 => 230, 0x302 => 230, 0x303 => 230, 0x304 => 230, 0x305 => 230, 0x306 => 230, 0x307 => 230, 0x308 => 230, 0x309 => 230, 0x30A => 230, 0x30B => 230, 0x30C => 230, 0x30D => 230, 0x30E => 230, 0x30F => 230, 0x310 => 230, 0x311 => 230, 0x312 => 230, 0x313 => 230, 0x314 => 230, 0x33D => 230, 0x33E => 230, 0x33F => 230, 0x340 => 230, 0x341 => 230, 0x342 => 230, 0x343 => 230, 0x344 => 230, 0x346 => 230, 0x34A => 230, 0x34B => 230, 0x34C => 230, 0x350 => 230, 0x351 => 230, 0x352 => 230, 0x357 => 230, 0x363 => 230, 0x364 => 230, 0x365 => 230, 0x366 => 230, 0x367 => 230, 0x368 => 230, 0x369 => 230, 0x36A => 230, 0x36B => 230, 0x36C => 230, 0x36D => 230, 0x36E => 230, 0x36F => 230, 0x483 => 230, 0x484 => 230, 0x485 => 230, 0x486 => 230, 0x592 => 230, 0x593 => 230, 0x594 => 230, 0x595 => 230, 0x597 => 230, 0x598 => 230, 0x599 => 230, 0x59C => 230, 0x59D => 230, 0x59E => 230, 0x59F => 230, 0x5A0 => 230, 0x5A1 => 230, 0x5A8 => 230, 0x5A9 => 230, 0x5AB => 230, 0x5AC => 230, 0x5AF => 230, 0x5C4 => 230, 0x610 => 230, 0x611 => 230, 0x612 => 230, 0x613 => 230, 0x614 => 230, 0x615 => 230, 0x653 => 230, 0x654 => 230, 0x657 => 230, 0x658 => 230, 0x6D6 => 230, 0x6D7 => 230, 0x6D8 => 230, 0x6D9 => 230, 0x6DA => 230, 0x6DB => 230, 0x6DC => 230, 0x6DF => 230, 0x6E0 => 230, 0x6E1 => 230, 0x6E2 => 230, 0x6E4 => 230, 0x6E7 => 230, 0x6E8 => 230, 0x6EB => 230, 0x6EC => 230, 0x730 => 230, 0x732 => 230, 0x733 => 230, 0x735 => 230, 0x736 => 230, 0x73A => 230, 0x73D => 230, 0x73F => 230, 0x740 => 230, 0x741 => 230, 0x743 => 230, 0x745 => 230, 0x747 => 230, 0x749 => 230, 0x74A => 230, 0x951 => 230, 0x953 => 230, 0x954 => 230, 0xF82 => 230, 0xF83 => 230, 0xF86 => 230, 0xF87 => 230, 0x170D => 230, 0x193A => 230, 0x20D0 => 230, 0x20D1 => 230, 0x20D4 => 230, 0x20D5 => 230, 0x20D6 => 230, 0x20D7 => 230, 0x20DB => 230, 0x20DC => 230, 0x20E1 => 230, 0x20E7 => 230, 0x20E9 => 230, 0xFE20 => 230, 0xFE21 => 230, 0xFE22 => 230, 0xFE23 => 230, 0x1D185 => 230, 0x1D186 => 230, 0x1D187 => 230, 0x1D189 => 230, 0x1D188 => 230, 0x1D1AA => 230, 0x1D1AB => 230, 0x1D1AC => 230, 0x1D1AD => 230, 0x315 => 232, 0x31A => 232, 0x302C => 232, 0x35F => 233, 0x362 => 233, 0x35D => 234, 0x35E => 234, 0x360 => 234, 0x361 => 234, 0x345 => 240 ); // }}} // {{{ properties /** * @var string * @access private */ private $_punycode_prefix = 'xn--'; /** * @access private */ private $_invalid_ucs = 0x80000000; /** * @access private */ private $_max_ucs = 0x10FFFF; /** * @var int * @access private */ private $_base = 36; /** * @var int * @access private */ private $_tmin = 1; /** * @var int * @access private */ private $_tmax = 26; /** * @var int * @access private */ private $_skew = 38; /** * @var int * @access private */ private $_damp = 700; /** * @var int * @access private */ private $_initial_bias = 72; /** * @var int * @access private */ private $_initial_n = 0x80; /** * @var int * @access private */ private $_slast; /** * @access private */ private $_sbase = 0xAC00; /** * @access private */ private $_lbase = 0x1100; /** * @access private */ private $_vbase = 0x1161; /** * @access private */ private $_tbase = 0x11a7; /** * @var int * @access private */ private $_lcount = 19; /** * @var int * @access private */ private $_vcount = 21; /** * @var int * @access private */ private $_tcount = 28; /** * vcount * tcount * * @var int * @access private */ private $_ncount = 588; /** * lcount * tcount * vcount * * @var int * @access private */ private $_scount = 11172; /** * Default encoding for encode()'s input and decode()'s output is UTF-8; * Other possible encodings are ucs4_string and ucs4_array * See {@link setParams()} for how to select these * * @var bool * @access private */ private $_api_encoding = 'utf8'; /** * Overlong UTF-8 encodings are forbidden * * @var bool * @access private */ private $_allow_overlong = false; /** * Behave strict or not * * @var bool * @access private */ private $_strict_mode = false; /** * IDNA-version to use * * Values are "2003" and "2008". * Defaults to "2003", since that was the original version and for * compatibility with previous versions of this library. * If you need to encode "new" characters like the German "Eszett", * please switch to 2008 first before encoding. * * @var bool * @access private */ private $_version = '2003'; /** * Cached value indicating whether or not mbstring function overloading is * on for strlen * * This is cached for optimal performance. * * @var boolean * @see Net_IDNA2::_byteLength() */ private static $_mb_string_overload = null; // }}} // {{{ constructor /** * Constructor * * @param array $options Options to initialise the object with * * @access public * @see setParams() */ public function __construct($options = null) { $this->_slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount; if (is_array($options)) { $this->setParams($options); } // populate mbstring overloading cache if not set if (self::$_mb_string_overload === null) { self::$_mb_string_overload = (extension_loaded('mbstring') && (ini_get('mbstring.func_overload') & 0x02) === 0x02); } } // }}} /** * Sets a new option value. Available options and values: * * [utf8 - Use either UTF-8 or ISO-8859-1 as input (true for UTF-8, false * otherwise); The output is always UTF-8] * [overlong - Unicode does not allow unnecessarily long encodings of chars, * to allow this, set this parameter to true, else to false; * default is false.] * [strict - true: strict mode, good for registration purposes - Causes errors * on failures; false: loose mode, ideal for "wildlife" applications * by silently ignoring errors and returning the original input instead] * * @param mixed $option Parameter to set (string: single parameter; array of Parameter => Value pairs) * @param string $value Value to use (if parameter 1 is a string) * * @return boolean true on success, false otherwise * @access public */ public function setParams($option, $value = false) { if (!is_array($option)) { $option = array($option => $value); } foreach ($option as $k => $v) { switch ($k) { case 'encoding': switch ($v) { case 'utf8': case 'ucs4_string': case 'ucs4_array': $this->_api_encoding = $v; break; default: throw new InvalidArgumentException('Set Parameter: Unknown parameter '.$v.' for option '.$k); } break; case 'overlong': $this->_allow_overlong = ($v) ? true : false; break; case 'strict': $this->_strict_mode = ($v) ? true : false; break; case 'version': if (in_array($v, array('2003', '2008'))) { $this->_version = $v; } else { throw new InvalidArgumentException('Set Parameter: Invalid parameter '.$v.' for option '.$k); } break; default: return false; } } return true; } /** * Encode a given UTF-8 domain name. * * @param string $decoded Domain name (UTF-8 or UCS-4) * @param string $one_time_encoding Desired input encoding, see {@link set_parameter} * If not given will use default-encoding * * @return string Encoded Domain name (ACE string) * @return mixed processed string * @throws Exception * @access public */ public function encode($decoded, $one_time_encoding = false) { // Forcing conversion of input to UCS4 array // If one time encoding is given, use this, else the objects property switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { case 'utf8': $decoded = $this->_utf8_to_ucs4($decoded); break; case 'ucs4_string': $decoded = $this->_ucs4_string_to_ucs4($decoded); case 'ucs4_array': // No break; before this line. Catch case, but do nothing break; default: throw new InvalidArgumentException('Unsupported input format'); } // No input, no output, what else did you expect? if (empty($decoded)) return ''; // Anchors for iteration $last_begin = 0; // Output string $output = ''; foreach ($decoded as $k => $v) { // Make sure to use just the plain dot switch($v) { case 0x3002: case 0xFF0E: case 0xFF61: $decoded[$k] = 0x2E; // It's right, no break here // The codepoints above have to be converted to dots anyway // Stumbling across an anchoring character case 0x2E: case 0x2F: case 0x3A: case 0x3F: case 0x40: // Neither email addresses nor URLs allowed in strict mode if ($this->_strict_mode) { throw new InvalidArgumentException('Neither email addresses nor URLs are allowed in strict mode.'); } // Skip first char if ($k) { $encoded = ''; $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin))); if ($encoded) { $output .= $encoded; } else { $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin))); } $output .= chr($decoded[$k]); } $last_begin = $k + 1; } } // Catch the rest of the string if ($last_begin) { $inp_len = sizeof($decoded); $encoded = ''; $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); if ($encoded) { $output .= $encoded; } else { $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin))); } return $output; } if ($output = $this->_encode($decoded)) { return $output; } return $this->_ucs4_to_utf8($decoded); } /** * Decode a given ACE domain name. * * @param string $input Domain name (ACE string) * @param string $one_time_encoding Desired output encoding, see {@link set_parameter} * * @return string Decoded Domain name (UTF-8 or UCS-4) * @throws Exception * @access public */ public function decode($input, $one_time_encoding = false) { // Optionally set if ($one_time_encoding) { switch ($one_time_encoding) { case 'utf8': case 'ucs4_string': case 'ucs4_array': break; default: throw new InvalidArgumentException('Unknown encoding '.$one_time_encoding); } } // Make sure to drop any newline characters around $input = trim($input); // Negotiate input and try to determine, wether it is a plain string, // an email address or something like a complete URL if (strpos($input, '@')) { // Maybe it is an email address // No no in strict mode if ($this->_strict_mode) { throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); } list($email_pref, $input) = explode('@', $input, 2); $arr = explode('.', $input); foreach ($arr as $k => $v) { $conv = $this->_decode($v); if ($conv) $arr[$k] = $conv; } $return = $email_pref . '@' . join('.', $arr); } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters) // No no in strict mode if ($this->_strict_mode) { throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode'); } $parsed = parse_url($input); if (isset($parsed['host'])) { $arr = explode('.', $parsed['host']); foreach ($arr as $k => $v) { $conv = $this->_decode($v); if ($conv) $arr[$k] = $conv; } $parsed['host'] = join('.', $arr); if (isset($parsed['scheme'])) { $parsed['scheme'] .= (strtolower($parsed['scheme']) == 'mailto') ? ':' : '://'; } $return = $this->_unparse_url($parsed); } else { // parse_url seems to have failed, try without it $arr = explode('.', $input); foreach ($arr as $k => $v) { $conv = $this->_decode($v); if ($conv) $arr[$k] = $conv; } $return = join('.', $arr); } } else { // Otherwise we consider it being a pure domain name string $return = $this->_decode($input); } // The output is UTF-8 by default, other output formats need conversion here // If one time encoding is given, use this, else the objects property switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) { case 'utf8': return $return; break; case 'ucs4_string': return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return)); break; case 'ucs4_array': return $this->_utf8_to_ucs4($return); break; default: throw new InvalidArgumentException('Unsupported output format'); } } // {{{ private /** * Opposite function to parse_url() * * Inspired by code from comments of php.net-documentation for parse_url() * * @param array $parts_arr parts (strings) as returned by parse_url() * * @return string * @access private */ private function _unparse_url($parts_arr) { if (!empty($parts_arr['scheme'])) { $ret_url = $parts_arr['scheme']; } if (!empty($parts_arr['user'])) { $ret_url .= $parts_arr['user']; if (!empty($parts_arr['pass'])) { $ret_url .= ':' . $parts_arr['pass']; } $ret_url .= '@'; } $ret_url .= $parts_arr['host']; if (!empty($parts_arr['port'])) { $ret_url .= ':' . $parts_arr['port']; } $ret_url .= $parts_arr['path']; if (!empty($parts_arr['query'])) { $ret_url .= '?' . $parts_arr['query']; } if (!empty($parts_arr['fragment'])) { $ret_url .= '#' . $parts_arr['fragment']; } return $ret_url; } /** * The actual encoding algorithm. * * @param string $decoded Decoded string which should be encoded * * @return string Encoded string * @throws Exception * @access private */ private function _encode($decoded) { // We cannot encode a domain name containing the Punycode prefix $extract = self::_byteLength($this->_punycode_prefix); $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix); $check_deco = array_slice($decoded, 0, $extract); if ($check_pref == $check_deco) { throw new InvalidArgumentException('This is already a punycode string'); } // We will not try to encode strings consisting of basic code points only $encodable = false; foreach ($decoded as $k => $v) { if ($v > 0x7a) { $encodable = true; break; } } if (!$encodable) { if ($this->_strict_mode) { throw new InvalidArgumentException('The given string does not contain encodable chars'); } return false; } // Do NAMEPREP $decoded = $this->_nameprep($decoded); $deco_len = count($decoded); // Empty array if (!$deco_len) { return false; } // How many chars have been consumed $codecount = 0; // Start with the prefix; copy it to output $encoded = $this->_punycode_prefix; $encoded = ''; // Copy all basic code points to output for ($i = 0; $i < $deco_len; ++$i) { $test = $decoded[$i]; // Will match [0-9a-zA-Z-] if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B) || (0x60 < $test && $test <= 0x7B) || (0x2D == $test) ) { $encoded .= chr($decoded[$i]); $codecount++; } } // All codepoints were basic ones if ($codecount == $deco_len) { return $encoded; } // Start with the prefix; copy it to output $encoded = $this->_punycode_prefix . $encoded; // If we have basic code points in output, add an hyphen to the end if ($codecount) { $encoded .= '-'; } // Now find and encode all non-basic code points $is_first = true; $cur_code = $this->_initial_n; $bias = $this->_initial_bias; $delta = 0; while ($codecount < $deco_len) { // Find the smallest code point >= the current code point and // remember the last ouccrence of it in the input for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) { if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) { $next_code = $decoded[$i]; } } $delta += ($next_code - $cur_code) * ($codecount + 1); $cur_code = $next_code; // Scan input again and encode all characters whose code point is $cur_code for ($i = 0; $i < $deco_len; $i++) { if ($decoded[$i] < $cur_code) { $delta++; } else if ($decoded[$i] == $cur_code) { for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) { $t = ($k <= $bias)? $this->_tmin : (($k >= $bias + $this->_tmax)? $this->_tmax : $k - $bias); if ($q < $t) { break; } $encoded .= $this->_encodeDigit(ceil($t + (($q - $t) % ($this->_base - $t)))); $q = ($q - $t) / ($this->_base - $t); } $encoded .= $this->_encodeDigit($q); $bias = $this->_adapt($delta, $codecount + 1, $is_first); $codecount++; $delta = 0; $is_first = false; } } $delta++; $cur_code++; } return $encoded; } /** * The actual decoding algorithm. * * @param string $encoded Encoded string which should be decoded * * @return string Decoded string * @throws Exception * @access private */ private function _decode($encoded) { // We do need to find the Punycode prefix if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) { return false; } $encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded); // If nothing left after removing the prefix, it is hopeless if (!$encode_test) { return false; } // Find last occurence of the delimiter $delim_pos = strrpos($encoded, '-'); if ($delim_pos > self::_byteLength($this->_punycode_prefix)) { for ($k = self::_byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) { $decoded[] = ord($encoded{$k}); } } else { $decoded = array(); } $deco_len = count($decoded); $enco_len = self::_byteLength($encoded); // Wandering through the strings; init $is_first = true; $bias = $this->_initial_bias; $idx = 0; $char = $this->_initial_n; for ($enco_idx = ($delim_pos)? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) { for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) { $digit = $this->_decodeDigit($encoded{$enco_idx++}); $idx += $digit * $w; $t = ($k <= $bias) ? $this->_tmin : (($k >= $bias + $this->_tmax)? $this->_tmax : ($k - $bias)); if ($digit < $t) { break; } $w = (int)($w * ($this->_base - $t)); } $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first); $is_first = false; $char += (int) ($idx / ($deco_len + 1)); $idx %= ($deco_len + 1); if ($deco_len > 0) { // Make room for the decoded char for ($i = $deco_len; $i > $idx; $i--) { $decoded[$i] = $decoded[($i - 1)]; } } $decoded[$idx++] = $char; } return $this->_ucs4_to_utf8($decoded); } /** * Adapt the bias according to the current code point and position. * * @param int $delta ... * @param int $npoints ... * @param boolean $is_first ... * * @return int * @access private */ private function _adapt($delta, $npoints, $is_first) { $delta = (int) ($is_first ? ($delta / $this->_damp) : ($delta / 2)); $delta += (int) ($delta / $npoints); for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) { $delta = (int) ($delta / ($this->_base - $this->_tmin)); } return (int) ($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew)); } /** * Encoding a certain digit. * * @param int $d One digit to encode * * @return char Encoded digit * @access private */ private function _encodeDigit($d) { return chr($d + 22 + 75 * ($d < 26)); } /** * Decode a certain digit. * * @param char $cp One digit (character) to decode * * @return int Decoded digit * @access private */ private function _decodeDigit($cp) { $cp = ord($cp); return ($cp - 48 < 10)? $cp - 22 : (($cp - 65 < 26)? $cp - 65 : (($cp - 97 < 26)? $cp - 97 : $this->_base)); } /** * Do Nameprep according to RFC3491 and RFC3454. * * @param array $input Unicode Characters * * @return string Unicode Characters, Nameprep'd * @throws Exception * @access private */ private function _nameprep($input) { $output = array(); // Walking through the input array, performing the required steps on each of // the input chars and putting the result into the output array // While mapping required chars we apply the cannonical ordering foreach ($input as $v) { // Map to nothing == skip that code point if (in_array($v, self::$_np_map_nothing)) { continue; } // Try to find prohibited input if (in_array($v, self::$_np_prohibit) || in_array($v, self::$_general_prohibited)) { throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); } foreach (self::$_np_prohibit_ranges as $range) { if ($range[0] <= $v && $v <= $range[1]) { throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v)); } } // Hangul syllable decomposition if (0xAC00 <= $v && $v <= 0xD7AF) { foreach ($this->_hangulDecompose($v) as $out) { $output[] = $out; } } else if (($this->_version == '2003') && isset(self::$_np_replacemaps[$v])) { // There's a decomposition mapping for that code point // Decompositions only in version 2003 (original) of IDNA foreach ($this->_applyCannonicalOrdering(self::$_np_replacemaps[$v]) as $out) { $output[] = $out; } } else { $output[] = $v; } } // Combine code points $last_class = 0; $last_starter = 0; $out_len = count($output); for ($i = 0; $i < $out_len; ++$i) { $class = $this->_getCombiningClass($output[$i]); if ((!$last_class || $last_class != $class) && $class) { // Try to match $seq_len = $i - $last_starter; $out = $this->_combine(array_slice($output, $last_starter, $seq_len)); // On match: Replace the last starter with the composed character and remove // the now redundant non-starter(s) if ($out) { $output[$last_starter] = $out; if (count($out) != $seq_len) { for ($j = $i + 1; $j < $out_len; ++$j) { $output[$j - 1] = $output[$j]; } unset($output[$out_len]); } // Rewind the for loop by one, since there can be more possible compositions $i--; $out_len--; $last_class = ($i == $last_starter)? 0 : $this->_getCombiningClass($output[$i - 1]); continue; } } // The current class is 0 if (!$class) { $last_starter = $i; } $last_class = $class; } return $output; } /** * Decomposes a Hangul syllable * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). * * @param integer $char 32bit UCS4 code point * * @return array Either Hangul Syllable decomposed or original 32bit * value as one value array * @access private */ private function _hangulDecompose($char) { $sindex = $char - $this->_sbase; if ($sindex < 0 || $sindex >= $this->_scount) { return array($char); } $result = array(); $T = $this->_tbase + $sindex % $this->_tcount; $result[] = (int)($this->_lbase + $sindex / $this->_ncount); $result[] = (int)($this->_vbase + ($sindex % $this->_ncount) / $this->_tcount); if ($T != $this->_tbase) { $result[] = $T; } return $result; } /** * Ccomposes a Hangul syllable * (see http://www.unicode.org/unicode/reports/tr15/#Hangul). * * @param array $input Decomposed UCS4 sequence * * @return array UCS4 sequence with syllables composed * @access private */ private function _hangulCompose($input) { $inp_len = count($input); if (!$inp_len) { return array(); } $result = array(); $last = $input[0]; $result[] = $last; // copy first char from input to output for ($i = 1; $i < $inp_len; ++$i) { $char = $input[$i]; // Find out, wether two current characters from L and V $lindex = $last - $this->_lbase; if (0 <= $lindex && $lindex < $this->_lcount) { $vindex = $char - $this->_vbase; if (0 <= $vindex && $vindex < $this->_vcount) { // create syllable of form LV $last = ($this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount); $out_off = count($result) - 1; $result[$out_off] = $last; // reset last // discard char continue; } } // Find out, wether two current characters are LV and T $sindex = $last - $this->_sbase; if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount) == 0) { $tindex = $char - $this->_tbase; if (0 <= $tindex && $tindex <= $this->_tcount) { // create syllable of form LVT $last += $tindex; $out_off = count($result) - 1; $result[$out_off] = $last; // reset last // discard char continue; } } // if neither case was true, just add the character $last = $char; $result[] = $char; } return $result; } /** * Returns the combining class of a certain wide char. * * @param integer $char Wide char to check (32bit integer) * * @return integer Combining class if found, else 0 * @access private */ private function _getCombiningClass($char) { return isset(self::$_np_norm_combcls[$char])? self::$_np_norm_combcls[$char] : 0; } /** * Apllies the cannonical ordering of a decomposed UCS4 sequence. * * @param array $input Decomposed UCS4 sequence * * @return array Ordered USC4 sequence * @access private */ private function _applyCannonicalOrdering($input) { $swap = true; $size = count($input); while ($swap) { $swap = false; $last = $this->_getCombiningClass($input[0]); for ($i = 0; $i < $size - 1; ++$i) { $next = $this->_getCombiningClass($input[$i + 1]); if ($next != 0 && $last > $next) { // Move item leftward until it fits for ($j = $i + 1; $j > 0; --$j) { if ($this->_getCombiningClass($input[$j - 1]) <= $next) { break; } $t = $input[$j]; $input[$j] = $input[$j - 1]; $input[$j - 1] = $t; $swap = 1; } // Reentering the loop looking at the old character again $next = $last; } $last = $next; } } return $input; } /** * Do composition of a sequence of starter and non-starter. * * @param array $input UCS4 Decomposed sequence * * @return array Ordered USC4 sequence * @access private */ private function _combine($input) { $inp_len = count($input); // Is it a Hangul syllable? if (1 != $inp_len) { $hangul = $this->_hangulCompose($input); // This place is probably wrong if (count($hangul) != $inp_len) { return $hangul; } } foreach (self::$_np_replacemaps as $np_src => $np_target) { if ($np_target[0] != $input[0]) { continue; } if (count($np_target) != $inp_len) { continue; } $hit = false; foreach ($input as $k2 => $v2) { if ($v2 == $np_target[$k2]) { $hit = true; } else { $hit = false; break; } } if ($hit) { return $np_src; } } return false; } /** * This converts an UTF-8 encoded string to its UCS-4 (array) representation * By talking about UCS-4 we mean arrays of 32bit integers representing * each of the "chars". This is due to PHP not being able to handle strings with * bit depth different from 8. This applies to the reverse method _ucs4_to_utf8(), too. * The following UTF-8 encodings are supported: * * bytes bits representation * 1 7 0xxxxxxx * 2 11 110xxxxx 10xxxxxx * 3 16 1110xxxx 10xxxxxx 10xxxxxx * 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx * 5 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * 6 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx * * Each x represents a bit that can be used to store character data. * * @param string $input utf8-encoded string * * @return array ucs4-encoded array * @throws Exception * @access private */ private function _utf8_to_ucs4($input) { $output = array(); $out_len = 0; $inp_len = self::_byteLength($input, '8bit'); $mode = 'next'; $test = 'none'; for ($k = 0; $k < $inp_len; ++$k) { $v = ord($input{$k}); // Extract byte from input string if ($v < 128) { // We found an ASCII char - put into stirng as is $output[$out_len] = $v; ++$out_len; if ('add' == $mode) { throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); } continue; } if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char $start_byte = $v; $mode = 'add'; $test = 'range'; if ($v >> 5 == 6) { // &110xxxxx 10xxxxx $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left $v = ($v - 192) << 6; } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx $next_byte = 1; $v = ($v - 224) << 12; } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx $next_byte = 2; $v = ($v - 240) << 18; } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx $next_byte = 3; $v = ($v - 248) << 24; } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx $next_byte = 4; $v = ($v - 252) << 30; } else { throw new UnexpectedValueException('This might be UTF-8, but I don\'t understand it at byte '.$k); } if ('add' == $mode) { $output[$out_len] = (int) $v; ++$out_len; continue; } } if ('add' == $mode) { if (!$this->_allow_overlong && $test == 'range') { $test = 'none'; if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) { throw new OutOfRangeException('Bogus UTF-8 character detected (out of legal range) at byte '.$k); } } if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx $v = ($v - 128) << ($next_byte * 6); $output[($out_len - 1)] += $v; --$next_byte; } else { throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); } if ($next_byte < 0) { $mode = 'next'; } } } // for return $output; } /** * Convert UCS-4 array into UTF-8 string * * @param array $input ucs4-encoded array * * @return string utf8-encoded string * @throws Exception * @access private */ private function _ucs4_to_utf8($input) { $output = ''; foreach ($input as $v) { // $v = ord($v); if ($v < 128) { // 7bit are transferred literally $output .= chr($v); } else if ($v < 1 << 11) { // 2 bytes $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63)); } else if ($v < 1 << 16) { // 3 bytes $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } else if ($v < 1 << 21) { // 4 bytes $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } else if ($v < 1 << 26) { // 5 bytes $output .= chr(248 + ($v >> 24)) . chr(128 + (($v >> 18) & 63)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } else if ($v < 1 << 31) { // 6 bytes $output .= chr(252 + ($v >> 30)) . chr(128 + (($v >> 24) & 63)) . chr(128 + (($v >> 18) & 63)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); } else { throw new UnexpectedValueException('Conversion from UCS-4 to UTF-8 failed: malformed input'); } } return $output; } /** * Convert UCS-4 array into UCS-4 string * * @param array $input ucs4-encoded array * * @return string ucs4-encoded string * @throws Exception * @access private */ private function _ucs4_to_ucs4_string($input) { $output = ''; // Take array values and split output to 4 bytes per value // The bit mask is 255, which reads &11111111 foreach ($input as $v) { $output .= ($v & (255 << 24) >> 24) . ($v & (255 << 16) >> 16) . ($v & (255 << 8) >> 8) . ($v & 255); } return $output; } /** * Convert UCS-4 string into UCS-4 array * * @param string $input ucs4-encoded string * * @return array ucs4-encoded array * @throws InvalidArgumentException * @access private */ private function _ucs4_string_to_ucs4($input) { $output = array(); $inp_len = self::_byteLength($input); // Input length must be dividable by 4 if ($inp_len % 4) { throw new InvalidArgumentException('Input UCS4 string is broken'); } // Empty input - return empty output if (!$inp_len) { return $output; } for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) { // Increment output position every 4 input bytes if (!$i % 4) { $out_len++; $output[$out_len] = 0; } $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) ); } return $output; } /** * Echo hex representation of UCS4 sequence. * * @param array $input UCS4 sequence * @param boolean $include_bit Include bitmask in output * * @return void * @static * @access private */ private static function _showHex($input, $include_bit = false) { foreach ($input as $k => $v) { echo '[', $k, '] => ', sprintf('%X', $v); if ($include_bit) { echo ' (', Net_IDNA2::_showBitmask($v), ')'; } echo "\n"; } } /** * Gives you a bit representation of given Byte (8 bits), Word (16 bits) or DWord (32 bits) * Output width is automagically determined * * @param int $octet ... * * @return string Bitmask-representation * @static * @access private */ private static function _showBitmask($octet) { if ($octet >= (1 << 16)) { $w = 31; } else if ($octet >= (1 << 8)) { $w = 15; } else { $w = 7; } $return = ''; for ($i = $w; $i > -1; $i--) { $return .= ($octet & (1 << $i))? '1' : '0'; } return $return; } /** * Gets the length of a string in bytes even if mbstring function * overloading is turned on * * @param string $string the string for which to get the length. * * @return integer the length of the string in bytes. * * @see Net_IDNA2::$_mb_string_overload */ private static function _byteLength($string) { if (self::$_mb_string_overload) { return mb_strlen($string, '8bit'); } return strlen((binary)$string); } // }}}} // {{{ factory /** * Attempts to return a concrete IDNA instance for either php4 or php5. * * @param array $params Set of paramaters * * @return Net_IDNA2 * @access public */ function getInstance($params = array()) { return new Net_IDNA2($params); } // }}} // {{{ singleton /** * Attempts to return a concrete IDNA instance for either php4 or php5, * only creating a new instance if no IDNA instance with the same * parameters currently exists. * * @param array $params Set of paramaters * * @return object Net_IDNA2 * @access public */ function singleton($params = array()) { static $instances; if (!isset($instances)) { $instances = array(); } $signature = serialize($params); if (!isset($instances[$signature])) { $instances[$signature] = Net_IDNA2::getInstance($params); } return $instances[$signature]; } // }}} } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/MailSo/Vendors/Net/IDNA2CustomExceptions.php000066400000000000000000000005011361462701300324110ustar00rootroot00000000000000getSignature(); } return $sSignature; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/000077500000000000000000000000001361462701300250175ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/LICENSE.txt000066400000000000000000000043001361462701300266370ustar00rootroot00000000000000MIT License Copyright (c) <2011-2015> Serban Ghita, Nick Ilyin and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Developer’s Certificate of Origin 1.1 By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I have the right to submit it under the open source license indicated in the file; or (b) The contribution is based upon previous work that, to the best of my knowledge, is covered under an appropriate open source license and I have the right under that license to submit that work with modifications, whether created in whole or in part by me, under the same open source license (unless I am permitted to submit under a different license), as indicated in the file; or (c) The contribution was provided directly to me by some other person who certified (a), (b) or (c) and I have not modified it. (d) I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/Mobile_Detect.json000066400000000000000000000712061361462701300304170ustar00rootroot00000000000000{"version":"2.8.26","headerMatch":{"HTTP_ACCEPT":{"matches":["application\/x-obml2d","application\/vnd.rim.html","text\/vnd.wap.wml","application\/vnd.wap.xhtml+xml"]},"HTTP_X_WAP_PROFILE":null,"HTTP_X_WAP_CLIENTID":null,"HTTP_WAP_CONNECTION":null,"HTTP_PROFILE":null,"HTTP_X_OPERAMINI_PHONE_UA":null,"HTTP_X_NOKIA_GATEWAY_ID":null,"HTTP_X_ORANGE_ID":null,"HTTP_X_VODAFONE_3GPDPCONTEXT":null,"HTTP_X_HUAWEI_USERID":null,"HTTP_UA_OS":null,"HTTP_X_MOBILE_GATEWAY":null,"HTTP_X_ATT_DEVICEID":null,"HTTP_UA_CPU":{"matches":["ARM"]}},"uaHttpHeaders":["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA"],"uaMatch":{"phones":{"iPhone":"\\biPhone\\b|\\biPod\\b","BlackBerry":"BlackBerry|\\bBB10\\b|rim[0-9]+","HTC":"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m","Nexus":"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6","Dell":"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b","Motorola":"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b","Samsung":"\\bSamsung\\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C","LG":"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)","Sony":"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533","Asus":"Asus.*Galaxy|PadFone.*Mobile","NokiaLumia":"Lumia [0-9]{3,4}","Micromax":"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b","Palm":"PalmSource|Palm","Vertu":"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature","Pantech":"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790","Fly":"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250","Wiko":"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM","iMobile":"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)","SimValley":"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b","Wolfgang":"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q","Alcatel":"Alcatel","Nintendo":"Nintendo 3DS","Amoi":"Amoi","INQ":"INQ","GenericPhone":"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},"tablets":{"iPad":"iPad|iPad.*Mobile","NexusTablet":"Android.*Nexus[\\s]+(7|9|10)","SamsungTablet":"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y","Kindle":"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\b|Android.*Silk\/[0-9.]+ like Chrome\/[0-9.]+ (?!Mobile)","SurfaceTablet":"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)","HPTablet":"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10","AsusTablet":"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\bP027\\b","BlackBerryTablet":"PlayBook|RIM Tablet","HTCtablet":"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410","MotorolaTablet":"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617","NookTablet":"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2","AcerTablet":"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b|\\bA3-A20\\b|\\bA3-A30","ToshibaTablet":"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO","LGTablet":"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b","FujitsuTablet":"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b","PrestigioTablet":"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002","LenovoTablet":"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)","DellTablet":"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7","YarvikTablet":"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b","MedionTablet":"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB","ArnovaTablet":"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2","IntensoTablet":"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004","IRUTablet":"M702pro","MegafonTablet":"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b","EbodaTablet":"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)","AllViewTablet":"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)","ArchosTablet":"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b","AinolTablet":"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark","NokiaLumiaTablet":"Lumia 2520","SonyTablet":"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31","PhilipsTablet":"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b","CubeTablet":"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT","CobyTablet":"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010","MIDTablet":"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10","MSITablet":"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b","SMiTTablet":"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)","RockChipTablet":"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A","FlyTablet":"IQ310|Fly Vision","bqTablet":"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus","HuaweiTablet":"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim","NecTablet":"\\bN-06D|\\bN-08D","PantechTablet":"Pantech.*P4100","BronchoTablet":"Broncho.*(N701|N708|N802|a710)","VersusTablet":"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b","ZyncTablet":"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900","PositivoTablet":"TB07STA|TB10STA|TB07FTA|TB10FTA","NabiTablet":"Android.*\\bNabi","KoboTablet":"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build","DanewTablet":"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b","TexetTablet":"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE","PlaystationTablet":"Playstation.*(Portable|Vita)","TrekstorTablet":"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab","PyleAudioTablet":"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b","AdvanTablet":"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ","DanyTechTablet":"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1","GalapadTablet":"Android.*\\bG1\\b","MicromaxTablet":"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b","KarbonnTablet":"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b","AllFineTablet":"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide","PROSCANTablet":"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b","YONESTablet":"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026","ChangJiaTablet":"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503","GUTablet":"TX-A1301|TX-M9002|Q702|kf026","PointOfViewTablet":"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10","OvermaxTablet":"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)","HCLTablet":"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync","DPSTablet":"DPS Dream 9|DPS Dual 7","VistureTablet":"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10","CrestaTablet":"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989","MediatekTablet":"\\bMT8125|MT8389|MT8135|MT8377\\b","ConcordeTablet":"Concorde([ ]+)?Tab|ConCorde ReadMan","GoCleverTablet":"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042","ModecomTablet":"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003","VoninoTablet":"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b","ECSTablet":"V07OT2|TM105A|S10OT1|TR10CS1","StorexTablet":"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab","VodafoneTablet":"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497","EssentielBTablet":"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2","RossMoorTablet":"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711","iMobileTablet":"i-mobile i-note","TolinoTablet":"tolino tab [0-9.]+|tolino shine","AudioSonicTablet":"\\bC-22Q|T7-QC|T-17B|T-17P\\b","AMPETablet":"Android.* A78 ","SkkTablet":"Android.* (SKYPAD|PHOENIX|CYCLOPS)","TecnoTablet":"TECNO P9","JXDTablet":"Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b","iJoyTablet":"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)","FX2Tablet":"FX2 PAD7|FX2 PAD10","XoroTablet":"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151","ViewsonicTablet":"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a","OdysTablet":"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10","CaptivaTablet":"CAPTIVA PAD","IconbitTablet":"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S","TeclastTablet":"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi","OndaTablet":"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+","JaytechTablet":"TPC-PA762","BlaupunktTablet":"Endeavour 800NG|Endeavour 1010","DigmaTablet":"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b","EvolioTablet":"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b","LavaTablet":"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b","AocTablet":"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712","MpmanTablet":"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010","CelkonTablet":"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b","WolderTablet":"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b","MiTablet":"\\bMI PAD\\b|\\bHM NOTE 1W\\b","NibiruTablet":"Nibiru M1|Nibiru Jupiter One","NexoTablet":"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI","LeaderTablet":"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100","UbislateTablet":"UbiSlate[\\s]?7C","PocketBookTablet":"Pocketbook","KocasoTablet":"\\b(TB-1207)\\b","HisenseTablet":"\\b(F5281|E2371)\\b","Hudl":"Hudl HT7S3|Hudl 2","TelstraTablet":"T-Hub2","GenericTablet":"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b|\\bQTAQZ3\\b"},"browsers":{"Chrome":"\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?","Dolfin":"\\bDolfin\\b","Opera":"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+","Skyfire":"Skyfire","Edge":"Mobile Safari\/[.0-9]* Edge","IE":"IEMobile|MSIEMobile","Firefox":"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS","Bolt":"bolt","TeaShark":"teashark","Blazer":"Blazer","Safari":"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari","UCBrowser":"UC.*Browser|UCWEB","baiduboxapp":"baiduboxapp","baidubrowser":"baidubrowser","DiigoBrowser":"DiigoBrowser","Puffin":"Puffin","Mercury":"\\bMercury\\b","ObigoBrowser":"Obigo","NetFront":"NF-Browser","GenericBrowser":"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger","PaleMoon":"Android.*PaleMoon|Mobile.*PaleMoon"},"os":{"AndroidOS":"Android","BlackBerryOS":"blackberry|\\bBB10\\b|rim tablet os","PalmOS":"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino","SymbianOS":"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b","WindowsMobileOS":"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;","WindowsPhoneOS":"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;","iOS":"\\biPhone.*Mobile|\\biPod|\\biPad","MeeGoOS":"MeeGo","MaemoOS":"Maemo","JavaOS":"J2ME\/|\\bMIDP\\b|\\bCLDC\\b","webOS":"webOS|hpwOS","badaOS":"\\bBada\\b","BREWOS":"BREW"},"utilities":{"Bot":"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom","MobileBot":"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2","DesktopMode":"WPDesktop","TV":"SonyDTV|HbbTV","WebKit":"(webkit)[ \/]([\\w.]+)","Console":"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b","Watch":"SM-V700"}}}rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/Mobile_Detect.php000066400000000000000000002367761361462701300302540ustar00rootroot00000000000000 * Nick Ilyin * * Original author: Victor Stanciu * * @license Code and contributions have 'MIT License' * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt * * @link Homepage: http://mobiledetect.net * GitHub Repo: https://github.com/serbanghita/Mobile-Detect * Google Code: http://code.google.com/p/php-mobile-detect/ * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples * * @version 2.8.26 */ class Mobile_Detect { /** * Mobile detection type. * * @deprecated since version 2.6.9 */ const DETECTION_TYPE_MOBILE = 'mobile'; /** * Extended detection type. * * @deprecated since version 2.6.9 */ const DETECTION_TYPE_EXTENDED = 'extended'; /** * A frequently used regular expression to extract version #s. * * @deprecated since version 2.6.9 */ const VER = '([\w._\+]+)'; /** * Top-level device. */ const MOBILE_GRADE_A = 'A'; /** * Mid-level device. */ const MOBILE_GRADE_B = 'B'; /** * Low-level device. */ const MOBILE_GRADE_C = 'C'; /** * Stores the version number of the current release. */ const VERSION = '2.8.26'; /** * A type for the version() method indicating a string return value. */ const VERSION_TYPE_STRING = 'text'; /** * A type for the version() method indicating a float return value. */ const VERSION_TYPE_FLOAT = 'float'; /** * A cache for resolved matches * @var array */ protected $cache = array(); /** * The User-Agent HTTP header is stored in here. * @var string */ protected $userAgent = null; /** * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE. * @var array */ protected $httpHeaders = array(); /** * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer. * @var array */ protected $cloudfrontHeaders = array(); /** * The matching Regex. * This is good for debug. * @var string */ protected $matchingRegex = null; /** * The matches extracted from the regex expression. * This is good for debug. * @var string */ protected $matchesArray = null; /** * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. * * @deprecated since version 2.6.9 * * @var string */ protected $detectionType = self::DETECTION_TYPE_MOBILE; /** * HTTP headers that trigger the 'isMobile' detection * to be true. * * @var array */ protected static $mobileHeaders = array( 'HTTP_ACCEPT' => array('matches' => array( // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ 'application/x-obml2d', // BlackBerry devices. 'application/vnd.rim.html', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml' )), 'HTTP_X_WAP_PROFILE' => null, 'HTTP_X_WAP_CLIENTID' => null, 'HTTP_WAP_CONNECTION' => null, 'HTTP_PROFILE' => null, // Reported by Opera on Nokia devices (eg. C3). 'HTTP_X_OPERAMINI_PHONE_UA' => null, 'HTTP_X_NOKIA_GATEWAY_ID' => null, 'HTTP_X_ORANGE_ID' => null, 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, 'HTTP_X_HUAWEI_USERID' => null, // Reported by Windows Smartphones. 'HTTP_UA_OS' => null, // Reported by Verizon, Vodafone proxy system. 'HTTP_X_MOBILE_GATEWAY' => null, // Seen this on HTC Sensation. SensationXE_Beats_Z715e. 'HTTP_X_ATT_DEVICEID' => null, // Seen this on a HTC. 'HTTP_UA_CPU' => array('matches' => array('ARM')), ); /** * List of mobile devices (phones). * * @var array */ protected static $phoneDevices = array( 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', // @todo: Is 'Dell Streak' a tablet or a phone? ;) 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b', 'Samsung' => '\bSamsung\b|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C', 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)', 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', 'NokiaLumia' => 'Lumia [0-9]{3,4}', // http://www.micromaxinfo.com/mobiles/smartphones // Added because the codes might conflict with Acer Tablets. 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', // @todo Complete the regex. 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', // http://fr.wikomobile.com 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', // Added simvalley mobile just for fun. They have some interesting devices. // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', // Wolfgang - a brand that is sold by Aldi supermarkets. // http://www.wolfgangmobile.com/ 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', 'Alcatel' => 'Alcatel', 'Nintendo' => 'Nintendo 3DS', // http://en.wikipedia.org/wiki/Amoi 'Amoi' => 'Amoi', // http://en.wikipedia.org/wiki/INQ 'INQ' => 'INQ', // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', ); /** * List of tablet devices. * * @var array */ protected static $tabletDevices = array( // @todo: check for mobile friendly emails topic. 'iPad' => 'iPad|iPad.*Mobile', // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$ // @see #442 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)', // Only the Surface tablets with Windows RT are considered mobile. // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', // Watch out for PadFone, see #132. // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b', 'BlackBerryTablet' => 'PlayBook|RIM Tablet', 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', // http://www.acer.ro/ac/ro/RO/content/drivers // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) // http://us.acer.com/ac/en/US/content/group/tablets // http://www.acer.de/ac/de/DE/content/models/tablets/ // Can conflict with Micromax and Motorola phones codes. 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30', // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ // http://us.toshiba.com/tablets/tablet-finder // http://www.toshiba.co.jp/regza/tablet/ 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html // http://www.lg.com/us/tablets 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', // Prestigio Tablets http://www.prestigio.com/support 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002', // http://support.lenovo.com/en_GB/downloads/default.page?# 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', // http://www.yarvik.com/en/matrix/tablets/ 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', // http://www.intenso.de/kategorie_en.php?kategorie=33 // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ 'IRUTablet' => 'M702pro', 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', // http://www.e-boda.ro/tablete-pc.html 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', // http://www.allview.ro/produse/droseries/lista-tablete-pc/ 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', // http://wiki.archosfans.com/index.php?title=Main_Page // @note Rewrite the regex format after we add more UAs. 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', // http://www.ainol.com/plugin.php?identifier=ainol&module=product 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', 'NokiaLumiaTablet' => 'Lumia 2520', // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser // http://www.sony.jp/support/tablet/ 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31', // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', // db + http://www.cube-tablet.com/buy-products.html 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', // http://www.cobyusa.com/?p=pcat&pcat_id=3001 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', // http://www.match.net.cn/products.asp 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10', // http://www.msi.com/support // @todo Research the Windows Tablets. 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', // @todo http://www.kyoceramobile.com/support/drivers/ // 'KyoceraTablet' => null, // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ // 'IntextTablet' => null, // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) // http://www.imp3.net/14/show.php?itemid=20454 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', // http://www.rock-chips.com/index.php?do=prod&pid=2 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ 'FlyTablet' => 'IQ310|Fly Vision', // http://www.bqreaders.com/gb/tablets-prices-sale.html 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris [E|M]10)|Maxwell.*Lite|Maxwell.*Plus', // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', // Nec or Medias Tab 'NecTablet' => '\bN-06D|\bN-08D', // Pantech Tablets: http://www.pantechusa.com/phones/ 'PantechTablet' => 'Pantech.*P4100', // Broncho Tablets: http://www.broncho.cn/ (hard to find) 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', // http://versusuk.com/support.html 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', // http://www.zync.in/index.php/our-products/tablet-phablets 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', // https://www.nabitablet.com/ 'NabiTablet' => 'Android.*\bNabi', 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', // French Danew Tablets http://www.danew.com/produits-tablette.php 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', // Texet Tablets and Readers http://www.texet.ru/tablet/ 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', // Avoid detecting 'PLAYSTATION 3' as mobile. 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', // http://www.trekstor.de/surftabs.html 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', // http://www.advandigital.com/index.php?link=content-product&jns=JP001 // because of the short codenames we have to include whitespaces to reduce the possible conflicts. 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', // http://www.danytech.com/category/tablet-pc 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', // http://www.galapad.net/product.html 'GalapadTablet' => 'Android.*\bG1\b', // http://www.micromaxinfo.com/tablet/funbook 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', // http://www.karbonnmobiles.com/products_tablet.php 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', // http://www.myallfine.com/Products.asp 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', // http://www.yonesnav.com/products/products.php 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', // http://www.gloryunion.cn/products.asp // http://www.allwinnertech.com/en/apply/mobile.html // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) // @todo: Softwiner tablets? // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ // @todo: add more tests. 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', // http://hclmetablet.com/India/index.php 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', // http://www.visture.com/index.asp 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', // http://www.mijncresta.nl/tablet 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', // Concorde tab 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', // Modecom Tablets - http://www.modecom.eu/tablets/portal/ 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', // Vonino Tablets - http://www.vonino.eu/tablets 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', // Storex Tablets - http://storex.fr/espace_client/support.html // @note: no need to add all the tablet codes since they are guided by the first regex. 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', // Generic Vodafone tablets. 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497', // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb // Aka: http://www.essentielb.fr/ 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', // Ross & Moor - http://ross-moor.ru/ 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', // i-mobile http://product.i-mobilephone.com/Mobile_Device 'iMobileTablet' => 'i-mobile i-note', // http://www.tolino.de/de/vergleichen/ 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', // AudioSonic - a Kmart brand // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ // @todo: add them gradually to avoid conflicts. 'AMPETablet' => 'Android.* A78 ', // Skk Mobile - http://skkmobile.com.ph/product_tablets.php 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 'TecnoTablet' => 'TECNO P9', // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', // http://www.intracon.eu/tablet 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', // http://www.xoro.de/produkte/ // @note: Might be the same brand with 'Simply tablets' 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', // http://www1.viewsonic.com/products/computing/tablets/ 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', // http://www.odys.de/web/internet-tablet_en.html 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', // http://www.captiva-power.de/products.html#tablets-en 'CaptivaTablet' => 'CAPTIVA PAD', // IconBIT - http://www.iconbit.com/products/tablets/ 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+', 'JaytechTablet' => 'TPC-PA762', 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', // http://www.digma.ru/support/download/ // @todo: Ebooks also (if requested) 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', // http://www.evolioshop.com/ro/tablete-pc.html // http://www.evolio.ro/support/downloads_static.html?cat=2 // @todo: Research some more 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', // @todo http://www.lavamobiles.com/tablets-data-cards 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b', // http://www.breezetablet.com/ 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712', // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/ 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010', // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b', // http://www.mi.com/en 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', // http://www.nbru.cn/index.html 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', // http://navroad.com/products/produkty/tablety/ // http://navroad.com/products/produkty/tablety/ 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', // http://leader-online.com/new_site/product-category/tablets/ // http://www.leader-online.net.au/List/Tablet 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100', // http://www.datawind.com/ubislate/ 'UbislateTablet' => 'UbiSlate[\s]?7C', // http://www.pocketbook-int.com/ru/support 'PocketBookTablet' => 'Pocketbook', // http://www.kocaso.com/product_tablet.html 'KocasoTablet' => '\b(TB-1207)\b', // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm 'HisenseTablet' => '\b(F5281|E2371)\b', // http://www.tesco.com/direct/hudl/ 'Hudl' => 'Hudl HT7S3|Hudl 2', // http://www.telstra.com.au/home-phone/thub-2/ 'TelstraTablet' => 'T-Hub2', 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b' ); /** * List of mobile Operating Systems. * * @var array */ protected static $operatingSystems = array( 'AndroidOS' => 'Android', 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', // @reference: http://en.wikipedia.org/wiki/Windows_Mobile 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', // @reference: http://en.wikipedia.org/wiki/Windows_Phone // http://wifeng.cn/?r=blog&a=view&id=106 // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx // http://msdn.microsoft.com/library/ms537503.aspx // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', // http://en.wikipedia.org/wiki/MeeGo // @todo: research MeeGo in UAs 'MeeGoOS' => 'MeeGo', // http://en.wikipedia.org/wiki/Maemo // @todo: research Maemo in UAs 'MaemoOS' => 'Maemo', 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 'webOS' => 'webOS|hpwOS', 'badaOS' => '\bBada\b', 'BREWOS' => 'BREW', ); /** * List of mobile User Agents. * * IMPORTANT: This is a list of only mobile browsers. * Mobile Detect 2.x supports only mobile browsers, * it was never designed to detect all browsers. * The change will come in 2017 in the 3.x release for PHP7. * * @var array */ protected static $browsers = array( //'Vivaldi' => 'Vivaldi', // @reference: https://developers.google.com/chrome/mobile/docs/user-agent 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', 'Dolfin' => '\bDolfin\b', 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', 'Skyfire' => 'Skyfire', 'Edge' => 'Mobile Safari/[.0-9]* Edge', 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS', 'Bolt' => 'bolt', 'TeaShark' => 'teashark', 'Blazer' => 'Blazer', // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', // http://en.wikipedia.org/wiki/Midori_(web_browser) //'Midori' => 'midori', //'Tizen' => 'Tizen', 'UCBrowser' => 'UC.*Browser|UCWEB', 'baiduboxapp' => 'baiduboxapp', 'baidubrowser' => 'baidubrowser', // https://github.com/serbanghita/Mobile-Detect/issues/7 'DiigoBrowser' => 'DiigoBrowser', // http://www.puffinbrowser.com/index.php 'Puffin' => 'Puffin', // http://mercury-browser.com/index.html 'Mercury' => '\bMercury\b', // http://en.wikipedia.org/wiki/Obigo_Browser 'ObigoBrowser' => 'Obigo', // http://en.wikipedia.org/wiki/NetFront 'NetFront' => 'NF-Browser', // @reference: http://en.wikipedia.org/wiki/Minimo // http://en.wikipedia.org/wiki/Vision_Mobile_Browser 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser) 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon', ); /** * Utilities. * * @var array */ protected static $utilities = array( // Experimental. When a mobile device wants to switch to 'Desktop Mode'. // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 // https://developers.facebook.com/docs/sharing/best-practices 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom', 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2', 'DesktopMode' => 'WPDesktop', 'TV' => 'SonyDTV|HbbTV', // experimental 'WebKit' => '(webkit)[ /]([\w.]+)', // @todo: Include JXD consoles. 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', 'Watch' => 'SM-V700', ); /** * All possible HTTP headers that represent the * User-Agent string. * * @var array */ protected static $uaHttpHeaders = array( // The default User-Agent string. 'HTTP_USER_AGENT', // Header can occur on devices using Opera Mini. 'HTTP_X_OPERAMINI_PHONE_UA', // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ 'HTTP_X_DEVICE_USER_AGENT', 'HTTP_X_ORIGINAL_USER_AGENT', 'HTTP_X_SKYFIRE_PHONE', 'HTTP_X_BOLT_PHONE_UA', 'HTTP_DEVICE_STOCK_UA', 'HTTP_X_UCBROWSER_DEVICE_UA' ); /** * The individual segments that could exist in a User-Agent string. VER refers to the regular * expression defined in the constant self::VER. * * @var array */ protected static $properties = array( // Build 'Mobile' => 'Mobile/[VER]', 'Build' => 'Build/[VER]', 'Version' => 'Version/[VER]', 'VendorID' => 'VendorID/[VER]', // Devices 'iPad' => 'iPad.*CPU[a-z ]+[VER]', 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', 'iPod' => 'iPod.*CPU[a-z ]+[VER]', //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), 'Kindle' => 'Kindle/[VER]', // Browser 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), 'Coast' => array('Coast/[VER]'), 'Dolfin' => 'Dolfin/[VER]', // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'), 'Fennec' => 'Fennec/[VER]', // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx 'Edge' => 'Edge/[VER]', 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'), // http://en.wikipedia.org/wiki/NetFront 'NetFront' => 'NetFront/[VER]', 'NokiaBrowser' => 'NokiaBrowser/[VER]', 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), 'Opera Mini' => 'Opera Mini/[VER]', 'Opera Mobi' => 'Version/[VER]', 'UC Browser' => 'UC Browser[VER]', 'MQQBrowser' => 'MQQBrowser/[VER]', 'MicroMessenger' => 'MicroMessenger/[VER]', 'baiduboxapp' => 'baiduboxapp/[VER]', 'baidubrowser' => 'baidubrowser/[VER]', 'SamsungBrowser' => 'SamsungBrowser/[VER]', 'Iron' => 'Iron/[VER]', // @note: Safari 7534.48.3 is actually Version 5.1. // @note: On BlackBerry the Version is overwriten by the OS. 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), 'Skyfire' => 'Skyfire/[VER]', 'Tizen' => 'Tizen/[VER]', 'Webkit' => 'webkit[ /][VER]', 'PaleMoon' => 'PaleMoon/[VER]', // Engine 'Gecko' => 'Gecko/[VER]', 'Trident' => 'Trident/[VER]', 'Presto' => 'Presto/[VER]', 'Goanna' => 'Goanna/[VER]', // OS 'iOS' => ' \bi?OS\b [VER][ ;]{1}', 'Android' => 'Android [VER]', 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), 'BREW' => 'BREW [VER]', 'Java' => 'Java/[VER]', // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), 'Windows Phone' => 'Windows Phone [VER]', 'Windows CE' => 'Windows CE/[VER]', // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd 'Windows NT' => 'Windows NT [VER]', 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), ); /** * Construct an instance of this class. * * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. * If left empty, will use the global _SERVER['HTTP_*'] vars instead. * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT * from the $headers array instead. */ public function __construct( array $headers = null, $userAgent = null ) { $this->setHttpHeaders($headers); $this->setUserAgent($userAgent); } /** * Get the current script version. * This is useful for the demo.php file, * so people can check on what version they are testing * for mobile devices. * * @return string The version number in semantic version format. */ public static function getScriptVersion() { return self::VERSION; } /** * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. * * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract * the headers. The default null is left for backwards compatibility. */ public function setHttpHeaders($httpHeaders = null) { // use global _SERVER if $httpHeaders aren't defined if (!is_array($httpHeaders) || !count($httpHeaders)) { $httpHeaders = $_SERVER; } // clear existing headers $this->httpHeaders = array(); // Only save HTTP headers. In PHP land, that means only _SERVER vars that // start with HTTP_. foreach ($httpHeaders as $key => $value) { if (substr($key, 0, 5) === 'HTTP_') { $this->httpHeaders[$key] = $value; } } // In case we're dealing with CloudFront, we need to know. $this->setCfHeaders($httpHeaders); } /** * Retrieves the HTTP headers. * * @return array */ public function getHttpHeaders() { return $this->httpHeaders; } /** * Retrieves a particular header. If it doesn't exist, no exception/error is caused. * Simply null is returned. * * @param string $header The name of the header to retrieve. Can be HTTP compliant such as * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the * all-caps, HTTP_ prefixed, underscore seperated awesomeness. * * @return string|null The value of the header. */ public function getHttpHeader($header) { // are we using PHP-flavored headers? if (strpos($header, '_') === false) { $header = str_replace('-', '_', $header); $header = strtoupper($header); } // test the alternate, too $altHeader = 'HTTP_' . $header; //Test both the regular and the HTTP_ prefix if (isset($this->httpHeaders[$header])) { return $this->httpHeaders[$header]; } elseif (isset($this->httpHeaders[$altHeader])) { return $this->httpHeaders[$altHeader]; } return null; } public function getMobileHeaders() { return self::$mobileHeaders; } /** * Get all possible HTTP headers that * can contain the User-Agent string. * * @return array List of HTTP headers. */ public function getUaHttpHeaders() { return self::$uaHttpHeaders; } /** * Set CloudFront headers * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device * * @param array $cfHeaders List of HTTP headers * * @return boolean If there were CloudFront headers to be set */ public function setCfHeaders($cfHeaders = null) { // use global _SERVER if $cfHeaders aren't defined if (!is_array($cfHeaders) || !count($cfHeaders)) { $cfHeaders = $_SERVER; } // clear existing headers $this->cloudfrontHeaders = array(); // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that // start with cloudfront-. $response = false; foreach ($cfHeaders as $key => $value) { if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') { $this->cloudfrontHeaders[strtoupper($key)] = $value; $response = true; } } return $response; } /** * Retrieves the cloudfront headers. * * @return array */ public function getCfHeaders() { return $this->cloudfrontHeaders; } /** * Set the User-Agent to be used. * * @param string $userAgent The user agent string to set. * * @return string|null */ public function setUserAgent($userAgent = null) { // Invalidate cache due to #375 $this->cache = array(); if (false === empty($userAgent)) { return $this->userAgent = $userAgent; } else { $this->userAgent = null; foreach ($this->getUaHttpHeaders() as $altHeader) { if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) $this->userAgent .= $this->httpHeaders[$altHeader] . " "; } } if (!empty($this->userAgent)) { return $this->userAgent = trim($this->userAgent); } } if (count($this->getCfHeaders()) > 0) { return $this->userAgent = 'Amazon CloudFront'; } return $this->userAgent = null; } /** * Retrieve the User-Agent. * * @return string|null The user agent if it's set. */ public function getUserAgent() { return $this->userAgent; } /** * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. * * @deprecated since version 2.6.9 * * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default * parameter is null which will default to self::DETECTION_TYPE_MOBILE. */ public function setDetectionType($type = null) { if ($type === null) { $type = self::DETECTION_TYPE_MOBILE; } if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) { return; } $this->detectionType = $type; } public function getMatchingRegex() { return $this->matchingRegex; } public function getMatchesArray() { return $this->matchesArray; } /** * Retrieve the list of known phone devices. * * @return array List of phone devices. */ public static function getPhoneDevices() { return self::$phoneDevices; } /** * Retrieve the list of known tablet devices. * * @return array List of tablet devices. */ public static function getTabletDevices() { return self::$tabletDevices; } /** * Alias for getBrowsers() method. * * @return array List of user agents. */ public static function getUserAgents() { return self::getBrowsers(); } /** * Retrieve the list of known browsers. Specifically, the user agents. * * @return array List of browsers / user agents. */ public static function getBrowsers() { return self::$browsers; } /** * Retrieve the list of known utilities. * * @return array List of utilities. */ public static function getUtilities() { return self::$utilities; } /** * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). * * @deprecated since version 2.6.9 * * @return array All the rules (but not extended). */ public static function getMobileDetectionRules() { static $rules; if (!$rules) { $rules = array_merge( self::$phoneDevices, self::$tabletDevices, self::$operatingSystems, self::$browsers ); } return $rules; } /** * Method gets the mobile detection rules + utilities. * The reason this is separate is because utilities rules * don't necessary imply mobile. This method is used inside * the new $detect->is('stuff') method. * * @deprecated since version 2.6.9 * * @return array All the rules + extended. */ public function getMobileDetectionRulesExtended() { static $rules; if (!$rules) { // Merge all rules together. $rules = array_merge( self::$phoneDevices, self::$tabletDevices, self::$operatingSystems, self::$browsers, self::$utilities ); } return $rules; } /** * Retrieve the current set of rules. * * @deprecated since version 2.6.9 * * @return array */ public function getRules() { if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { return self::getMobileDetectionRulesExtended(); } else { return self::getMobileDetectionRules(); } } /** * Retrieve the list of mobile operating systems. * * @return array The list of mobile operating systems. */ public static function getOperatingSystems() { return self::$operatingSystems; } /** * Check the HTTP headers for signs of mobile. * This is the fastest mobile check possible; it's used * inside isMobile() method. * * @return bool */ public function checkHttpHeadersForMobile() { foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { if (isset($this->httpHeaders[$mobileHeader])) { if (is_array($matchType['matches'])) { foreach ($matchType['matches'] as $_match) { if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) { return true; } } return false; } else { return true; } } } return false; } /** * Magic overloading method. * * @method boolean is[...]() * @param string $name * @param array $arguments * @return mixed * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' */ public function __call($name, $arguments) { // make sure the name starts with 'is', otherwise if (substr($name, 0, 2) !== 'is') { throw new BadMethodCallException("No such method exists: $name"); } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); $key = substr($name, 2); return $this->matchUAAgainstKey($key); } /** * Find a detection rule that matches the current User-agent. * * @param null $userAgent deprecated * @return boolean */ protected function matchDetectionRulesAgainstUA($userAgent = null) { // Begin general search. foreach ($this->getRules() as $_regex) { if (empty($_regex)) { continue; } if ($this->match($_regex, $userAgent)) { return true; } } return false; } /** * Search for a certain key in the rules array. * If the key is found then try to match the corresponding * regex against the User-Agent. * * @param string $key * * @return boolean */ protected function matchUAAgainstKey($key) { // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. $key = strtolower($key); if (false === isset($this->cache[$key])) { // change the keys to lower case $_rules = array_change_key_case($this->getRules()); if (false === empty($_rules[$key])) { $this->cache[$key] = $this->match($_rules[$key]); } if (false === isset($this->cache[$key])) { $this->cache[$key] = false; } } return $this->cache[$key]; } /** * Check if the device is mobile. * Returns true if any type of mobile device detected, including special ones * @param null $userAgent deprecated * @param null $httpHeaders deprecated * @return bool */ public function isMobile($userAgent = null, $httpHeaders = null) { if ($httpHeaders) { $this->setHttpHeaders($httpHeaders); } if ($userAgent) { $this->setUserAgent($userAgent); } // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' if ($this->getUserAgent() === 'Amazon CloudFront') { $cfHeaders = $this->getCfHeaders(); if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') { return true; } } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); if ($this->checkHttpHeadersForMobile()) { return true; } else { return $this->matchDetectionRulesAgainstUA(); } } /** * Check if the device is a tablet. * Return true if any type of tablet device is detected. * * @param string $userAgent deprecated * @param array $httpHeaders deprecated * @return bool */ public function isTablet($userAgent = null, $httpHeaders = null) { // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' if ($this->getUserAgent() === 'Amazon CloudFront') { $cfHeaders = $this->getCfHeaders(); if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') { return true; } } $this->setDetectionType(self::DETECTION_TYPE_MOBILE); foreach (self::$tabletDevices as $_regex) { if ($this->match($_regex, $userAgent)) { return true; } } return false; } /** * This method checks for a certain property in the * userAgent. * @todo: The httpHeaders part is not yet used. * * @param string $key * @param string $userAgent deprecated * @param string $httpHeaders deprecated * @return bool|int|null */ public function is($key, $userAgent = null, $httpHeaders = null) { // Set the UA and HTTP headers only if needed (eg. batch mode). if ($httpHeaders) { $this->setHttpHeaders($httpHeaders); } if ($userAgent) { $this->setUserAgent($userAgent); } $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); return $this->matchUAAgainstKey($key); } /** * Some detection rules are relative (not standard), * because of the diversity of devices, vendors and * their conventions in representing the User-Agent or * the HTTP headers. * * This method will be used to check custom regexes against * the User-Agent string. * * @param $regex * @param string $userAgent * @return bool * * @todo: search in the HTTP headers too. */ public function match($regex, $userAgent = null) { $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches); // If positive match is found, store the results for debug. if ($match) { $this->matchingRegex = $regex; $this->matchesArray = $matches; } return $match; } /** * Get the properties array. * * @return array */ public static function getProperties() { return self::$properties; } /** * Prepare the version number. * * @todo Remove the error supression from str_replace() call. * * @param string $ver The string version, like "2.6.21.2152"; * * @return float */ public function prepareVersionNo($ver) { $ver = str_replace(array('_', ' ', '/'), '.', $ver); $arrVer = explode('.', $ver, 2); if (isset($arrVer[1])) { $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. } return (float) implode('.', $arrVer); } /** * Check the version of the given property in the User-Agent. * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) * * @param string $propertyName The name of the property. See self::getProperties() array * keys for all possible properties. * @param string $type Either self::VERSION_TYPE_STRING to get a string value or * self::VERSION_TYPE_FLOAT indicating a float value. This parameter * is optional and defaults to self::VERSION_TYPE_STRING. Passing an * invalid parameter will default to the this type as well. * * @return string|float The version of the property we are trying to extract. */ public function version($propertyName, $type = self::VERSION_TYPE_STRING) { if (empty($propertyName)) { return false; } // set the $type to the default if we don't recognize the type if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) { $type = self::VERSION_TYPE_STRING; } $properties = self::getProperties(); // Check if the property exists in the properties array. if (true === isset($properties[$propertyName])) { // Prepare the pattern to be matched. // Make sure we always deal with an array (string is converted). $properties[$propertyName] = (array) $properties[$propertyName]; foreach ($properties[$propertyName] as $propertyMatchString) { $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); // Identify and extract the version. preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match); if (false === empty($match[1])) { $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]); return $version; } } } return false; } /** * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. * * @return string One of the self::MOBILE_GRADE_* constants. */ public function mobileGrade() { $isMobile = $this->isMobile(); if ( // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 || $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 || $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 || // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 || // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 || // Blackberry Playbook (1.0-2.0) - Tested on PlayBook $this->match('Playbook.*Tablet') || // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) || // Palm WebOS 3.0 - Tested on HP TouchPad $this->match('hp.*TouchPad') || // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) || // Chrome for Android - Tested on Android 4.0, 4.1 device ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) || // Skyfire 4.1 - Tested on Android 2.3 device ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || // Opera Mobile 11.5-12: Tested on Android 2.3 ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) || // Meego 1.2 - Tested on Nokia 950 and N9 $this->is('MeeGoOS') || // Tizen (pre-release) - Tested on early hardware $this->is('Tizen') || // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser // @todo: more tests here! $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 || // UC Browser - Tested on Android 2.3 device ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || // Kindle 3 and Fire - Tested on the built-in WebKit browser for each ( $this->match('Kindle Fire') || $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) || // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet $this->is('AndroidOS') && $this->is('NookTablet') || // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile || // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile || // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile || // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile || // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile ){ return self::MOBILE_GRADE_A; } if ( $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 && ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) || // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || // @todo: report this (tested on Nokia N71) $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS') ){ return self::MOBILE_GRADE_B; } if ( // Blackberry 4.x - Tested on the Curve 8330 $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 || // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 || // Tested on original iPhone (3.1), iPhone 3 (3.2) $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 || $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 || $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 || // Internet Explorer 7 and older - Tested on Windows XP $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile ){ return self::MOBILE_GRADE_C; } // All older smartphone platforms and featurephones - Any device that doesn't support media queries // will receive the basic, C grade experience. return self::MOBILE_GRADE_C; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/README.md000066400000000000000000000360141361462701300263020ustar00rootroot00000000000000![Mobile Detect](http://demo.mobiledetect.net/logo-github.png) > Motto: "Every business should have a mobile detection script to detect mobile readers." [![Build Status](https://travis-ci.org/serbanghita/Mobile-Detect.svg?branch=devel)](https://travis-ci.org/serbanghita/Mobile-Detect) [![Latest Stable Version](https://poser.pugx.org/mobiledetect/mobiledetectlib/v/stable.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![Total Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/downloads.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![Daily Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/d/daily.png)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![License](https://poser.pugx.org/mobiledetect/mobiledetectlib/license.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) *Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets). It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.* We're committed to make Mobile_Detect the best open-source mobile detection resource and this is why before each release we're running [unit tests](./tests), we also research and update the detection rules on **daily** and **weekly** basis. Your website's _content strategy_ is important! You need a complete toolkit to deliver an experience that is _optimized_, _fast_ and _relevant_ to your users. Mobile_Detect class is a [server-side detection](http://www.w3.org/TR/mwabp/#bp-devcap-detection) tool that can help you with your RWD strategy, it is not a replacement for CSS3 media queries or other forms of client-side feature detection. ##### Announcements For `2.x` branch we are no longer taking optimizations pull requests, but only new regexes and User-Agents for our tests. On `2.x` releases we are focusing on **new tablets only**. All the pull requests about TVs, bots or optimizations will be closed and analyzed after `3.0.0-beta` is released. Still working on `3.0.0` branch to provide you with device detection! We're really excited on this one! We would like to speed this up, but life and family gets in the way ;) Special thanks to **JetBrains** for providing licenses for **PHPStorm**. In case you never heard or tried PHPStorm, you're clearly missing out! [Check PHPStorm](https://www.jetbrains.com/phpstorm/) out! ##### Download and demo |Download|Docs|Examples| |-------------|-------------|-------------| |[Go to releases](../../tags)|[Become a contributor](../../wiki/Become-a-contributor)|[Code examples](../../wiki/Code-examples) |[Mobile_Detect.php](./Mobile_Detect.php)|[History](../../wiki/History)|[:iphone: Live demo!](http://is.gd/mobiletest) |[Composer package](https://packagist.org/packages/mobiledetect/mobiledetectlib)| #### Continuous updates You can use [composer](https://getcomposer.org/doc/00-intro.md) in your release and update process to make sure you have the latest Mobile_Detect version. ``` composer require mobiledetect/mobiledetectlib ``` ```json { "require": { "mobiledetect/mobiledetectlib": "^2.8" } } ``` ##### Help |Pledgie|Paypal| |-------|------| |[Donate :+1:](https://pledgie.com/campaigns/21856)|[Donate :beer:](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mobiledetectlib%40gmail%2ecom&lc=US&item_name=Mobile%20Detect¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)| I'm currently paying for hosting and spend a lot of my family time to maintain the project and planning the future releases. I would highly appreciate any money donations that will keep the research going. Special thanks to the community :+1: for donations, [BrowserStack](https://www.browserstack.com/) - for providing access to their great platform, [Zend](http://www.zend.com/) - for donating licenses, [Dragos Gavrila](https://twitter.com/grafician) who contributed with the logo. ##### 3rd party modules / [Submit new](../../issues/new?title=New%203rd%20party%20module&body=Name, Link and Description of the module.) :point_right: Keep `Mobile_Detect.php` class in a separate `module` and do NOT include it in your script core because of the high frequency of updates. :point_right: When including the class into you `web application` or `module` always use `include_once '../path/to/Mobile_Detect.php` to prevent conflicts. **JavaScript** * mobile-detect.js - A [JavaScript port](https://github.com/hgoebl/mobile-detect.js) of Mobile-Detect class. Made by [Heinrich Goebl](https://github.com/hgoebl). **Varnish Cache** * [Varnish Mobile Detect](https://github.com/willemk/varnish-mobiletranslate) - Drop-in varnish solution to mobile user detection based on the Mobile-Detect library. Made by [willemk](https://github.com/willemk). * [mobiledetect2vcl](https://github.com/carlosabalde/mobiledetect2vcl) - Python script to transform the Mobile Detect JSON database into an UA-based mobile detection VCL subroutine easily integrable in any Varnish Cache configuration. Made by [Carlos Abalde](https://github.com/carlosabalde). **LUA** * [mobile-detect.lua](https://github.com/yourpalmark/mobile-detect.lua) is a port of Mobile-Detect to Lua for NGINX HTTP servers. Follows closely to mobile-detect.js. Supports all methods that server-side mobile-detect.js supports. Fully unit-tested and synced with Travis CI (Build Passing badge included). Made by [Mark Walters](https://github.com/yourpalmark). **PHP** **WordPress** * [WordPress Mobile Detect](https://wordpress.org/plugins/wp-mobile-detect/) - Gives you the ability to wrap that infographic in a `[notdevice][/notdevice]` shortcode so at the server level WordPress will decide to show that content only if the user is NOT on a phone or tablet. Made by [Jesse Friedman](https://profiles.wordpress.org/professor44/). * [mobble](https://wordpress.org/plugins/mobble/) - provides mobile related conditional functions for your site. e.g. `is_iphone()`, `is_mobile()` and `is_tablet()`. Made by Scott Evans. * [WordPress Responsage](https://github.com/iamspacehead/responsage) - A small WordPress theme plugin that allows you to make your images responsive. Made by [Adrian Ciaschetti](https://github.com/iamspacehead). * [WP247 Body Classes](https://wordpress.org/plugins/wp247-body-classes/) - Add unique classes to the `body` tag for easy styling based on various attributes (archive, user, post, mobile) and various WordPress "is" functions. Mobile attributes include type of device, Operating System, Browser, etc. Examples: .is-mobile, .is-not-mobile, .is-tablet, .is-ios, .is-not-ios, .is-androidos, .is-chromebrowser. Made by [wescleveland56](https://github.com/wescleveland56). **Drupal** * [Drupal Mobile Switch](https://www.drupal.org/project/mobile_switch) - The Mobile Switch Drupal module provides a automatic theme switch functionality for mobile devices, detected by Browscap or Mobile Detect. Made by [Siegfried Neumann](https://www.drupal.org/user/45267). * [Drupal Context Mobile Detect](https://www.drupal.org/project/context_mobile_detect) - This is a Drupal context module which integrates Context and PHP Mobile Detect library. Created by [Artem Shymko](https://www.drupal.org/user/432492). * [Drupal Mobile Detect](https://www.drupal.org/project/mobile_detect) - Lightweight mobile detect module for Drupal created by [Matthew Donadio](https://www.drupal.org/user/325244). **Joomla** * [yagendoo Joomla! Mobile Detection Plugin](http://www.yagendoo.com/en/blog/free-mobile-detection-plugin-for-joomla.html) - Lightweight PHP plugin for Joomla! that detects a mobile browser using the Mobile Detect class. Made by yagendoo media. * [User Agent Detector plugin](https://github.com/renekreijveld/UserAgentDetector) - This system plugin detects the user agent of your website visitor and sets a session variable accordingly. Based on the user agent, the plugin detects if the site is running on a desktop pc, tablet or smartphone. It can also detect if the visitor is a spider bot (search engine). Session variable that is set: `ualayout`. Possible values: desktop, tablet, mobile, bot. Made by @ReneKreijveld. **Magento** * [Magento helper](http://www.magentocommerce.com/magento-connect/catalog/product/view/id/16835/) from Optimise Web enables the use of all functions provided by Mobile Detect. Made by [Kathir Vel](http://www.kathirvel.com). * [Magento 2 Mobile Detect Theme Change](https://github.com/EaDesgin/magento2-mobiledetect) is an extension for Magento 2 that will change the theme or redirect to a different URL. Also containing a helper to check for the device type. **PrestaShop** * [PrestaShop](https://www.prestashop.com) is a free, secure and open source shopping cart platform. Mobile_Detect is included in the default package since 1.5.x. **Laravel** * [Agent](https://github.com/jenssegers/agent) is a user agent class for Laravel based on Mobile Detect with some additional functionality. Made by [Jens Segers](https://github.com/jenssegers). * [BrowserDetect](https://github.com/hisorange/browser-detect) is a browser and mobile detection package, collects and wrap together the best user-agent identifiers for Laravel. Created by [Varga Zsolt](https://github.com/hisorange). **Zend Framework** * [ZF2 Mobile-Detect](https://github.com/neilime/zf2-mobile-detect.git) is a Zend Framework 2 module that provides Mobile-Detect features (Mobile_Detect class as a service, helper for views and plugin controllers). Made by [neilime](https://github.com/neilime). * [ZF2 MobileDetectModule](https://github.com/nikolaposa/MobileDetectModule) facilitates integration of a PHP MobileDetect class with some ZF2-based application. Has similar idea like the existing ZF2 Mobile-Detect module, but differs in initialization and provision routine of the actual Mobile_Detect class. Appropriate view helper and controller plugin also have different conceptions. Made by [Nikola Posa](https://github.com/nikolaposa). **Symfony** * [Symfony2 Mobile Detect Bundle](https://github.com/suncat2000/MobileDetectBundle) is a bundle for detecting mobile devices, manage mobile view and redirect to the mobile and tablet version. Made by [Nikolay Ivlev](https://github.com/suncat2000). * [Silex Mobile Detect Service Provider](https://github.com/jbinfo/MobileDetectServiceProvider) is a service provider to interact with Mobile detect class methods. Made by [Lhassan Baazzi](https://github.com/jbinfo). **Slim Framework** * [Slim_Mobile_Detect](https://github.com/zguillez/slim_mobile_detect) implements Mobile_Detect lib for different responses write on Slim Framework App. **ExpressionEngine** * [EE2 Detect Mobile](https://github.com/garethtdavies/detect-mobile) is a lightweight PHP plugin for EE2 that detects a mobile browser using the Mobile Detect class. Made by [Gareth Davies](https://github.com/garethtdavies). **Yii Framework** * [Yii Extension](https://github.com/iamsalnikov/MobileDetect) - Mobile detect plugin for Yii framework. Made by [Alexey Salnikov](https://github.com/iamsalnikov). * [Yii Extension](https://github.com/candasm/yii1-mobile-detect-component) - Mobile detect component for Yii framework 1.x version which supports composer package manager. Made by [Candas Minareci](https://github.com/candasm). * [Yii2 Device Detect](https://github.com/alexandernst/yii2-device-detect/) - Yii2 extension for Mobile-Detect library. Made by [Alexander Nestorov](https://github.com/alexandernst). **CakePHP** * [CakePHP MobileDetect](https://github.com/chronon/CakePHP-MobileDetectComponent-Plugin) is a plugin component for CakePHP 2.x. Made by [Gregory Gaskill](https://github.com/chronon). **FuelPHP** * [Special Agent](https://github.com/rob-bar/special_agent) is a FuelPHP package which uses php-mobile-detect to determine whether a device is mobile or not. It overrides the Fuelphp Agent class its methods. Made by [Robbie Bardjin](https://github.com/rob-bar). **TYPO3** * [px_mobiledetect](https://typo3.org/extensions/repository/view/px_mobiledetect) is an extension that helps to detect visitor's mobile device class (if that’s tablet or mobile device like smartphone). Made by Alexander Tretyak. **Other** * [PageCache](https://github.com/mmamedov/page-cache) is a lightweight PHP library for full page cache, with built-in Mobile-Detect support. Made by [Muhammed Mamedov](https://github.com/mmamedov). * [Statamic CMS Mobile Detect](https://github.com/haikulab/statamic-mobile-detect) is a plugin. Made by [Sergei Filippov](https://github.com/haikulab/statamic-mobile-detect) of Haiku Lab. * [Kohana Mobile Detect](https://github.com/madeinnordeste/kohana-mobile-detect) is an example of implementation of Mobile_Detect class with Kohana framework. Written by [Luiz Alberto S. Ribeiro](https://github.com/madeinnordeste). * [MemHT](https://www.memht.com) is a Free PHP CMS and Blog that permit the creation and the management online of websites with few and easy steps. Has the class included in the core. * [concrete5](https://www.concrete5.org) is a CMS that is free and open source. The library is included in the core. * [engine7](https://github.com/QOXCorp/exengine) is PHP Open Source Framework. The Mobile_Detect class is included in the engine. * [Zikula](http://zikula.org) is a free and open-source Content Management Framework, which allows you to run impressive websites and build powerful online applications. The core uses Mobile-Detect to switch to a special Mobile theme, using jQueryMobile. * [UserAgentInfo](https://github.com/quentin389/UserAgentInfo) is a PHP class for parsing user agent strings (HTTP_USER_AGENT). Includes mobile checks, bot checks, browser types/versions and more. Based on browscap, Mobile_Detect and ua-parser. Created for high traffic websites and fast batch processing. Made by [quentin389](https://github.com/quentin389). * [LJ Mobile Detect](https://github.com/lewisjenkins/craft-lj-mobiledetect) is a simple implementation of Mobile Detect for Craft CMS. Made by [Lewis Jenkins](https://github.com/lewisjenkins). * [Grav Plugin Mobile Detect](https://github.com/dimitrilongo/grav-plugin-mobile-detect/) is a simple implementation of Mobile Detect for Grav CMS. Made by [Dimitri Longo](https://github.com/dimitrilongo). **Perl** * [MobileDetect.pm](https://www.buzzerstar.com/development/) is a Perl module for Mobile Detect. Made by [Sebastian Enger](https://devop.tools/). **Python** * [pymobiledetect](https://pypi.python.org/pypi/pymobiledetect) - Mobile detect python package. Made by Bas van Oostveen. **Ruby** * [mobile_detect.rb](https://github.com/ktaragorn/mobile_detect) is a Ruby gem using the JSON data exposed by the php project and implementing a basic subset of the API (as much as can be done by the exposed data). Made by [Karthik T](https://github.com/ktaragorn). **Go** * [GoMobileDetect](https://github.com/Shaked/gomobiledetect) is a Go port of Mobile Detect class. Made by [https://github.com/Shaked](Shaked). **LUA** * [ua-lua](https://github.com/robinef/ua-lua) is a small lib written in LUA providing device type detection. ua-lua is detecting mobile or tablet devices based on user-agent inside nginx daemon. Made by [FrĂ©dĂ©ric Robinet](https://github.com/robinef). rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/composer.json000066400000000000000000000016201361462701300275400ustar00rootroot00000000000000{ "name": "mobiledetect/mobiledetectlib", "type": "library", "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", "keywords": ["mobile", "mobile detect", "mobile detector", "php mobile detect", "detect mobile devices"], "homepage": "https://github.com/serbanghita/Mobile-Detect", "license": "MIT", "authors": [ { "name": "Serban Ghita", "email": "serbanghita@gmail.com", "homepage": "http://mobiledetect.net", "role": "Developer" } ], "require": { "php": ">=5.0.0" }, "require-dev": { "phpunit/phpunit": "*" }, "autoload": { "classmap": ["Mobile_Detect.php"], "psr-0": { "Detection": "namespaced/" } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/namespaced/000077500000000000000000000000001361462701300271175ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/namespaced/Detection/000077500000000000000000000000001361462701300310355ustar00rootroot00000000000000MobileDetect.php000066400000000000000000000020051361462701300340240ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Mobile_Detect/namespaced/Detection The PSR-2 coding standard. 0 0 0 0 0 rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/000077500000000000000000000000001361462701300240475ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php000066400000000000000000000422501361462701300260010ustar00rootroot00000000000000 * @author Anis Berejeb * @version 1.2-dev */ namespace OAuth2; class Client { /** * Different AUTH method */ const AUTH_TYPE_URI = 0; const AUTH_TYPE_AUTHORIZATION_BASIC = 1; const AUTH_TYPE_FORM = 2; /** * Different Access token type */ const ACCESS_TOKEN_URI = 0; const ACCESS_TOKEN_BEARER = 1; const ACCESS_TOKEN_OAUTH = 2; const ACCESS_TOKEN_MAC = 3; /** * Different Grant types */ const GRANT_TYPE_AUTH_CODE = 'authorization_code'; const GRANT_TYPE_PASSWORD = 'password'; const GRANT_TYPE_CLIENT_CREDENTIALS = 'client_credentials'; const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token'; /** * HTTP Methods */ const HTTP_METHOD_GET = 'GET'; const HTTP_METHOD_POST = 'POST'; const HTTP_METHOD_PUT = 'PUT'; const HTTP_METHOD_DELETE = 'DELETE'; const HTTP_METHOD_HEAD = 'HEAD'; /** * HTTP Form content types */ const HTTP_FORM_CONTENT_TYPE_APPLICATION = 0; const HTTP_FORM_CONTENT_TYPE_MULTIPART = 1; /** * Client ID * * @var string */ protected $client_id = null; /** * Client Secret * * @var string */ protected $client_secret = null; /** * Client Authentication method * * @var int */ protected $client_auth = self::AUTH_TYPE_URI; /** * Access Token * * @var string */ protected $access_token = null; /** * Access Token Type * * @var int */ protected $access_token_type = self::ACCESS_TOKEN_URI; /** * Access Token Secret * * @var string */ protected $access_token_secret = null; /** * Access Token crypt algorithm * * @var string */ protected $access_token_algorithm = null; /** * Access Token Parameter name * * @var string */ protected $access_token_param_name = 'access_token'; /** * The path to the certificate file to use for https connections * * @var string Defaults to . */ protected $certificate_file = null; /** * cURL options * * @var array */ protected $curl_options = array(); /** * Construct * * @param string $client_id Client ID * @param string $client_secret Client Secret * @param int $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM) * @param string $certificate_file Indicates if we want to use a certificate file to trust the server. Optional, defaults to null. * @return void */ public function __construct($client_id, $client_secret, $client_auth = self::AUTH_TYPE_URI, $certificate_file = null) { if (!extension_loaded('curl')) { throw new Exception('The PHP extension curl must be installed to use this library.', Exception::CURL_NOT_FOUND); } $this->client_id = $client_id; $this->client_secret = $client_secret; $this->client_auth = $client_auth; $this->certificate_file = $certificate_file; if (!empty($this->certificate_file) && !is_file($this->certificate_file)) { throw new InvalidArgumentException('The certificate file was not found', InvalidArgumentException::CERTIFICATE_NOT_FOUND); } } /** * Get the client Id * * @return string Client ID */ public function getClientId() { return $this->client_id; } /** * Get the client Secret * * @return string Client Secret */ public function getClientSecret() { return $this->client_secret; } /** * getAuthenticationUrl * * @param string $auth_endpoint Url of the authentication endpoint * @param string $redirect_uri Redirection URI * @param array $extra_parameters Array of extra parameters like scope or state (Ex: array('scope' => null, 'state' => '')) * @return string URL used for authentication */ public function getAuthenticationUrl($auth_endpoint, $redirect_uri, array $extra_parameters = array()) { $parameters = array_merge(array( 'response_type' => 'code', 'client_id' => $this->client_id, 'redirect_uri' => $redirect_uri ), $extra_parameters); return $auth_endpoint . '?' . http_build_query($parameters, null, '&'); } /** * getAccessToken * * @param string $token_endpoint Url of the token endpoint * @param int $grant_type Grant Type ('authorization_code', 'password', 'client_credentials', 'refresh_token', or a custom code (@see GrantType Classes) * @param array $parameters Array sent to the server (depend on which grant type you're using) * @return array Array of parameters required by the grant_type (CF SPEC) */ public function getAccessToken($token_endpoint, $grant_type, array $parameters) { if (!$grant_type) { throw new InvalidArgumentException('The grant_type is mandatory.', InvalidArgumentException::INVALID_GRANT_TYPE); } $grantTypeClassName = $this->convertToCamelCase($grant_type); $grantTypeClass = __NAMESPACE__ . '\\GrantType\\' . $grantTypeClassName; if (!class_exists($grantTypeClass)) { throw new InvalidArgumentException('Unknown grant type \'' . $grant_type . '\'', InvalidArgumentException::INVALID_GRANT_TYPE); } $grantTypeObject = new $grantTypeClass(); $grantTypeObject->validateParameters($parameters); if (!defined($grantTypeClass . '::GRANT_TYPE')) { throw new Exception('Unknown constant GRANT_TYPE for class ' . $grantTypeClassName, Exception::GRANT_TYPE_ERROR); } $parameters['grant_type'] = $grantTypeClass::GRANT_TYPE; $http_headers = array(); switch ($this->client_auth) { case self::AUTH_TYPE_URI: case self::AUTH_TYPE_FORM: $parameters['client_id'] = $this->client_id; $parameters['client_secret'] = $this->client_secret; break; case self::AUTH_TYPE_AUTHORIZATION_BASIC: $parameters['client_id'] = $this->client_id; $http_headers['Authorization'] = 'Basic ' . base64_encode($this->client_id . ':' . $this->client_secret); break; default: throw new Exception('Unknown client auth type.', Exception::INVALID_CLIENT_AUTHENTICATION_TYPE); break; } return $this->executeRequest($token_endpoint, $parameters, self::HTTP_METHOD_POST, $http_headers, self::HTTP_FORM_CONTENT_TYPE_APPLICATION); } /** * setToken * * @param string $token Set the access token * @return void */ public function setAccessToken($token) { $this->access_token = $token; } /** * Set the client authentication type * * @param string $client_auth (AUTH_TYPE_URI, AUTH_TYPE_AUTHORIZATION_BASIC, AUTH_TYPE_FORM) * @return void */ public function setClientAuthType($client_auth) { $this->client_auth = $client_auth; } /** * Set an option for the curl transfer * * @param int $option The CURLOPT_XXX option to set * @param mixed $value The value to be set on option * @return void */ public function setCurlOption($option, $value) { $this->curl_options[$option] = $value; } /** * Set multiple options for a cURL transfer * * @param array $options An array specifying which options to set and their values * @return void */ public function setCurlOptions($options) { $this->curl_options = array_merge($this->curl_options, $options); } /** * Set the access token type * * @param int $type Access token type (ACCESS_TOKEN_BEARER, ACCESS_TOKEN_MAC, ACCESS_TOKEN_URI) * @param string $secret The secret key used to encrypt the MAC header * @param string $algorithm Algorithm used to encrypt the signature * @return void */ public function setAccessTokenType($type, $secret = null, $algorithm = null) { $this->access_token_type = $type; $this->access_token_secret = $secret; $this->access_token_algorithm = $algorithm; } /** * Fetch a protected ressource * * @param string $protected_ressource_url Protected resource URL * @param array $parameters Array of parameters * @param string $http_method HTTP Method to use (POST, PUT, GET, HEAD, DELETE) * @param array $http_headers HTTP headers * @param int $form_content_type HTTP form content type to use * @return array */ public function fetch($protected_resource_url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = array(), $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART) { if ($this->access_token) { switch ($this->access_token_type) { case self::ACCESS_TOKEN_URI: if (is_array($parameters)) { $parameters[$this->access_token_param_name] = $this->access_token; } else { throw new InvalidArgumentException( 'You need to give parameters as array if you want to give the token within the URI.', InvalidArgumentException::REQUIRE_PARAMS_AS_ARRAY ); } break; case self::ACCESS_TOKEN_BEARER: $http_headers['Authorization'] = 'Bearer ' . $this->access_token; break; case self::ACCESS_TOKEN_OAUTH: $http_headers['Authorization'] = 'OAuth ' . $this->access_token; break; case self::ACCESS_TOKEN_MAC: $http_headers['Authorization'] = 'MAC ' . $this->generateMACSignature($protected_resource_url, $parameters, $http_method); break; default: throw new Exception('Unknown access token type.', Exception::INVALID_ACCESS_TOKEN_TYPE); break; } } return $this->executeRequest($protected_resource_url, $parameters, $http_method, $http_headers, $form_content_type); } /** * Generate the MAC signature * * @param string $url Called URL * @param array $parameters Parameters * @param string $http_method Http Method * @return string */ private function generateMACSignature($url, $parameters, $http_method) { $timestamp = time(); $nonce = uniqid(); $parsed_url = parse_url($url); if (!isset($parsed_url['port'])) { $parsed_url['port'] = ($parsed_url['scheme'] == 'https') ? 443 : 80; } if ($http_method == self::HTTP_METHOD_GET) { if (is_array($parameters)) { $parsed_url['path'] .= '?' . http_build_query($parameters, null, '&'); } elseif ($parameters) { $parsed_url['path'] .= '?' . $parameters; } } $signature = base64_encode(hash_hmac($this->access_token_algorithm, $timestamp . "\n" . $nonce . "\n" . $http_method . "\n" . $parsed_url['path'] . "\n" . $parsed_url['host'] . "\n" . $parsed_url['port'] . "\n\n" , $this->access_token_secret, true)); return 'id="' . $this->access_token . '", ts="' . $timestamp . '", nonce="' . $nonce . '", mac="' . $signature . '"'; } /** * Execute a request (with curl) * * @param string $url URL * @param mixed $parameters Array of parameters * @param string $http_method HTTP Method * @param array $http_headers HTTP Headers * @param int $form_content_type HTTP form content type to use * @return array */ private function executeRequest($url, $parameters = array(), $http_method = self::HTTP_METHOD_GET, array $http_headers = null, $form_content_type = self::HTTP_FORM_CONTENT_TYPE_MULTIPART) { $curl_options = array( CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CUSTOMREQUEST => $http_method ); switch($http_method) { case self::HTTP_METHOD_POST: $curl_options[CURLOPT_POST] = true; /* No break */ case self::HTTP_METHOD_PUT: /** * Passing an array to CURLOPT_POSTFIELDS will encode the data as multipart/form-data, * while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded. * http://php.net/manual/en/function.curl-setopt.php */ if(is_array($parameters) && self::HTTP_FORM_CONTENT_TYPE_APPLICATION === $form_content_type) { $parameters = http_build_query($parameters, null, '&'); } $curl_options[CURLOPT_POSTFIELDS] = $parameters; break; case self::HTTP_METHOD_HEAD: $curl_options[CURLOPT_NOBODY] = true; /* No break */ case self::HTTP_METHOD_DELETE: case self::HTTP_METHOD_GET: if (is_array($parameters)) { $url .= '?' . http_build_query($parameters, null, '&'); } elseif ($parameters) { $url .= '?' . $parameters; } break; default: break; } $curl_options[CURLOPT_URL] = $url; if (is_array($http_headers)) { $header = array(); foreach($http_headers as $key => $parsed_urlvalue) { $header[] = "$key: $parsed_urlvalue"; } $curl_options[CURLOPT_HTTPHEADER] = $header; } $ch = curl_init(); curl_setopt_array($ch, $curl_options); // https handling if (!empty($this->certificate_file)) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_CAINFO, $this->certificate_file); } else { // bypass ssl verification curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } if (!empty($this->curl_options)) { curl_setopt_array($ch, $this->curl_options); } $result = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); if ($curl_error = curl_error($ch)) { throw new Exception($curl_error, Exception::CURL_ERROR); } else { $json_decode = json_decode($result, true); } curl_close($ch); return array( 'result' => (null === $json_decode) ? $result : $json_decode, 'code' => $http_code, 'content_type' => $content_type ); } /** * Set the name of the parameter that carry the access token * * @param string $name Token parameter name * @return void */ public function setAccessTokenParamName($name) { $this->access_token_param_name = $name; } /** * Converts the class name to camel case * * @param mixed $grant_type the grant type * @return string */ private function convertToCamelCase($grant_type) { $parts = explode('_', $grant_type); array_walk($parts, function(&$item) { $item = ucfirst($item);}); return implode('', $parts); } } class Exception extends \Exception { const CURL_NOT_FOUND = 0x01; const CURL_ERROR = 0x02; const GRANT_TYPE_ERROR = 0x03; const INVALID_CLIENT_AUTHENTICATION_TYPE = 0x04; const INVALID_ACCESS_TOKEN_TYPE = 0x05; } class InvalidArgumentException extends \InvalidArgumentException { const INVALID_GRANT_TYPE = 0x01; const CERTIFICATE_NOT_FOUND = 0x02; const REQUIRE_PARAMS_AS_ARRAY = 0x03; const MISSING_PARAMETER = 0x04; } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/000077500000000000000000000000001361462701300257645ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php000066400000000000000000000022331361462701300321300ustar00rootroot00000000000000getAuthenticationUrl(AUTHORIZATION_ENDPOINT, REDIRECT_URI); header('Location: ' . $auth_url); die('Redirect'); } else { $params = array('code' => $_GET['code'], 'redirect_uri' => REDIRECT_URI); $response = $client->getAccessToken(TOKEN_ENDPOINT, 'authorization_code', $params); parse_str($response['result'], $info); $client->setAccessToken($info['access_token']); $response = $client->fetch('https://graph.facebook.com/me'); var_dump($response, $response['result']); } How can I add a new Grant Type ? ================================ Simply write a new class in the namespace OAuth2\GrantType. You can place the class file under GrantType. Here is an example : namespace OAuth2\GrantType; /** * MyCustomGrantType Grant Type */ class MyCustomGrantType implements IGrantType { /** * Defines the Grant Type * * @var string Defaults to 'my_custom_grant_type'. */ const GRANT_TYPE = 'my_custom_grant_type'; /** * Adds a specific Handling of the parameters * * @return array of Specific parameters to be sent. * @param mixed $parameters the parameters array (passed by reference) */ public function validateParameters(&$parameters) { if (!isset($parameters['first_mandatory_parameter'])) { throw new \Exception('The \'first_mandatory_parameter\' parameter must be defined for the Password grant type'); } elseif (!isset($parameters['second_mandatory_parameter'])) { throw new \Exception('The \'seconde_mandatory_parameter\' parameter must be defined for the Password grant type'); } } } call the OAuth client getAccessToken with the grantType you defined in the GRANT_TYPE constant, As following : $response = $client->getAccessToken(TOKEN_ENDPOINT, 'my_custom_grant_type', $params); rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHPGangsta/000077500000000000000000000000001361462701300242545ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHPGangsta/GoogleAuthenticator.php000066400000000000000000000143441361462701300307420ustar00rootroot00000000000000_getBase32LookupTable(); unset($validChars[32]); $secret = ''; for ($i = 0; $i < $secretLength; $i++) { $secret .= $validChars[array_rand($validChars)]; } return $secret; } /** * Calculate the code, with given secret and point in time * * @param string $secret * @param int|null $timeSlice * @return string */ public function getCode($secret, $timeSlice = null) { if ($timeSlice === null) { $timeSlice = floor(time() / 30); } $secretkey = $this->_base32Decode($secret); // Pack time into binary string $time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice); // Hash it with users secret key $hm = hash_hmac('SHA1', $time, $secretkey, true); // Use last nipple of result as index/offset $offset = ord(substr($hm, -1)) & 0x0F; // grab 4 bytes of the result $hashpart = substr($hm, $offset, 4); // Unpak binary value $value = unpack('N', $hashpart); $value = $value[1]; // Only 32 bits $value = $value & 0x7FFFFFFF; $modulo = pow(10, $this->_codeLength); return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT); } /** * Get QR-Code URL for image, from google charts * * @param string $name * @param string $secret * @return string */ public function getQRCodeGoogleUrl($name, $secret) { $urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.''); return 'https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl='.$urlencoded.''; } /** * Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now * * @param string $secret * @param string $code * @param int $discrepancy This is the allowed time drift in 30 second units (8 means 4 minutes before or after) * @return bool */ public function verifyCode($secret, $code, $discrepancy = 1) { $currentTimeSlice = floor(time() / 30); for ($i = -$discrepancy; $i <= $discrepancy; $i++) { $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i); if ($calculatedCode == $code ) { return true; } } return false; } /** * Set the code length, should be >=6 * * @param int $length * @return PHPGangsta_GoogleAuthenticator */ public function setCodeLength($length) { $this->_codeLength = $length; return $this; } /** * Helper class to decode base32 * * @param $secret * @return bool|string */ protected function _base32Decode($secret) { if (empty($secret)) return ''; $base32chars = $this->_getBase32LookupTable(); $base32charsFlipped = array_flip($base32chars); $paddingCharCount = substr_count($secret, $base32chars[32]); $allowedValues = array(6, 4, 3, 1, 0); if (!in_array($paddingCharCount, $allowedValues)) return false; for ($i = 0; $i < 4; $i++){ if ($paddingCharCount == $allowedValues[$i] && substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) return false; } $secret = str_replace('=','', $secret); $secret = str_split($secret); $binaryString = ""; for ($i = 0; $i < count($secret); $i = $i+8) { $x = ""; if (!in_array($secret[$i], $base32chars)) return false; for ($j = 0; $j < 8; $j++) { $x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT); } $eightBits = str_split($x, 8); for ($z = 0; $z < count($eightBits); $z++) { $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:""; } } return $binaryString; } /** * Helper class to encode base32 * * @param string $secret * @param bool $padding * @return string */ protected function _base32Encode($secret, $padding = true) { if (empty($secret)) return ''; $base32chars = $this->_getBase32LookupTable(); $secret = str_split($secret); $binaryString = ""; for ($i = 0; $i < count($secret); $i++) { $binaryString .= str_pad(base_convert(ord($secret[$i]), 10, 2), 8, '0', STR_PAD_LEFT); } $fiveBitBinaryArray = str_split($binaryString, 5); $base32 = ""; $i = 0; while ($i < count($fiveBitBinaryArray)) { $base32 .= $base32chars[base_convert(str_pad($fiveBitBinaryArray[$i], 5, '0'), 2, 10)]; $i++; } if ($padding && ($x = strlen($binaryString) % 40) != 0) { if ($x == 8) $base32 .= str_repeat($base32chars[32], 6); elseif ($x == 16) $base32 .= str_repeat($base32chars[32], 4); elseif ($x == 24) $base32 .= str_repeat($base32chars[32], 3); elseif ($x == 32) $base32 .= $base32chars[32]; } return $base32; } /** * Get array with all 32 characters for decoding from/encoding to base32 * * @return array */ protected function _getBase32LookupTable() { return array( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23 'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31 '=' // padding char ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHPThumb/000077500000000000000000000000001361462701300237475ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHPThumb/GD.php000066400000000000000000001346401361462701300247620ustar00rootroot00000000000000 * Copyright (c) 2009, Ian Selby/Gen X Design * * Author(s): Ian Selby * * Licensed under the MIT License * Redistributions of files must retain the above copyright notice. * * @author Ian Selby * @copyright Copyright (c) 2009 Gen X Design * @link http://phpthumb.gxdlabs.com * @license http://www.opensource.org/licenses/mit-license.php The MIT License */ class GD extends PHPThumb { /** * The prior image (before manipulation) * * @var resource */ protected $oldImage; /** * The working image (used during manipulation) * * @var resource */ protected $workingImage; /** * The current dimensions of the image * * @var array */ protected $currentDimensions; /** * The new, calculated dimensions of the image * * @var array */ protected $newDimensions; /** * The options for this class * * This array contains various options that determine the behavior in * various functions throughout the class. Functions note which specific * option key / values are used in their documentation * * @var array */ protected $options; /** * The maximum width an image can be after resizing (in pixels) * * @var int */ protected $maxWidth; /** * The maximum height an image can be after resizing (in pixels) * * @var int */ protected $maxHeight; /** * The percentage to resize the image by * * @var int */ protected $percent; /** * @param string $fileName * @param array $options * @param array $plugins */ public function __construct($fileName, $options = array(), array $plugins = array()) { parent::__construct($fileName, $options, $plugins); $this->determineFormat(); $this->verifyFormatCompatiblity(); switch ($this->format) { case 'GIF': $this->oldImage = @imagecreatefromgif($this->fileName); break; case 'JPG': $this->oldImage = @imagecreatefromjpeg($this->fileName); break; case 'PNG': $this->oldImage = @imagecreatefrompng($this->fileName); break; case 'STRING': $this->oldImage = @imagecreatefromstring($this->fileName); break; } if (!is_resource($this->oldImage)) { throw new \Exception('Invalid image file'); } else { $this->currentDimensions = array ( 'width' => imagesx($this->oldImage), 'height' => imagesy($this->oldImage) ); } } public function __destruct() { if (is_resource($this->oldImage)) { imagedestroy($this->oldImage); } if (is_resource($this->workingImage)) { imagedestroy($this->workingImage); } } /** * Pad an image to desired dimensions. Moves the image into the center and fills the rest with $color. * @param $width * @param $height * @param array $color * @return GD */ public function pad($width, $height, $color = array(255, 255, 255)) { // no resize - woohoo! if ($width == $this->currentDimensions['width'] && $height == $this->currentDimensions['height']) { return $this; } // create the working image if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($width, $height); } else { $this->workingImage = imagecreate($width, $height); } // create the fill color $fillColor = imagecolorallocate( $this->workingImage, $color[0], $color[1], $color[2] ); // fill our working image with the fill color imagefill( $this->workingImage, 0, 0, $fillColor ); // copy the image into the center of our working image imagecopyresampled( $this->workingImage, $this->oldImage, intval(($width-$this->currentDimensions['width']) / 2), intval(($height-$this->currentDimensions['height']) / 2), 0, 0, $this->currentDimensions['width'], $this->currentDimensions['height'], $this->currentDimensions['width'], $this->currentDimensions['height'] ); // update all the variables and resources to be correct $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $width; $this->currentDimensions['height'] = $height; return $this; } /** * Resizes an image to be no larger than $maxWidth or $maxHeight * * If either param is set to zero, then that dimension will not be considered as a part of the resize. * Additionally, if $this->options['resizeUp'] is set to true (false by default), then this function will * also scale the image up to the maximum dimensions provided. * * @param int $maxWidth The maximum width of the image in pixels * @param int $maxHeight The maximum height of the image in pixels * @return \PHPThumb\GD */ public function resize($maxWidth = 0, $maxHeight = 0) { // make sure our arguments are valid if (!is_numeric($maxWidth)) { throw new \InvalidArgumentException('$maxWidth must be numeric'); } if (!is_numeric($maxHeight)) { throw new \InvalidArgumentException('$maxHeight must be numeric'); } // make sure we're not exceeding our image size if we're not supposed to if ($this->options['resizeUp'] === false) { $this->maxHeight = (intval($maxHeight) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $maxHeight; $this->maxWidth = (intval($maxWidth) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $maxWidth; } else { $this->maxHeight = intval($maxHeight); $this->maxWidth = intval($maxWidth); } // get the new dimensions... $this->calcImageSize($this->currentDimensions['width'], $this->currentDimensions['height']); // create the working image if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); } else { $this->workingImage = imagecreate($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); } $this->preserveAlpha(); // and create the newly sized image imagecopyresampled( $this->workingImage, $this->oldImage, 0, 0, 0, 0, $this->newDimensions['newWidth'], $this->newDimensions['newHeight'], $this->currentDimensions['width'], $this->currentDimensions['height'] ); // update all the variables and resources to be correct $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $this->newDimensions['newWidth']; $this->currentDimensions['height'] = $this->newDimensions['newHeight']; return $this; } /** * Adaptively Resizes the Image * * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the * remaining overflow (from the center) to get the image to be the size specified * * @param int $maxWidth * @param int $maxHeight * @return \PHPThumb\GD */ public function adaptiveResize($width, $height) { // make sure our arguments are valid if ((!is_numeric($width) || $width == 0) && (!is_numeric($height) || $height == 0)) { throw new \InvalidArgumentException('$width and $height must be numeric and greater than zero'); } if (!is_numeric($width) || $width == 0) { $width = ($height * $this->currentDimensions['width']) / $this->currentDimensions['height']; } if (!is_numeric($height) || $height == 0) { $height = ($width * $this->currentDimensions['height']) / $this->currentDimensions['width']; } // make sure we're not exceeding our image size if we're not supposed to if ($this->options['resizeUp'] === false) { $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; } else { $this->maxHeight = intval($height); $this->maxWidth = intval($width); } $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); // resize the image to be close to our desired dimensions $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); // reset the max dimensions... if ($this->options['resizeUp'] === false) { $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; } else { $this->maxHeight = intval($height); $this->maxWidth = intval($width); } // create the working image if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); } else { $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); } $this->preserveAlpha(); $cropWidth = $this->maxWidth; $cropHeight = $this->maxHeight; $cropX = 0; $cropY = 0; // now, figure out how to crop the rest of the image... if ($this->currentDimensions['width'] > $this->maxWidth) { $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth) / 2); } elseif ($this->currentDimensions['height'] > $this->maxHeight) { $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight) / 2); } imagecopyresampled( $this->workingImage, $this->oldImage, 0, 0, $cropX, $cropY, $cropWidth, $cropHeight, $cropWidth, $cropHeight ); // update all the variables and resources to be correct $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $this->maxWidth; $this->currentDimensions['height'] = $this->maxHeight; return $this; } /** * Adaptively Resizes the Image and Crops Using a Percentage * * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the * remaining overflow using a provided percentage to get the image to be the size specified. * * The percentage mean different things depending on the orientation of the original image. * * For Landscape images: * --------------------- * * A percentage of 1 would crop the image all the way to the left, which would be the same as * using adaptiveResizeQuadrant() with $quadrant = 'L' * * A percentage of 50 would crop the image to the center which would be the same as using * adaptiveResizeQuadrant() with $quadrant = 'C', or even the original adaptiveResize() * * A percentage of 100 would crop the image to the image all the way to the right, etc, etc. * Note that you can use any percentage between 1 and 100. * * For Portrait images: * -------------------- * * This works the same as for Landscape images except that a percentage of 1 means top and 100 means bottom * * @param int $maxWidth * @param int $maxHeight * @param int $percent * @return \PHPThumb\GD */ public function adaptiveResizePercent($width, $height, $percent = 50) { // make sure our arguments are valid if (!is_numeric($width) || $width == 0) { throw new \InvalidArgumentException('$width must be numeric and greater than zero'); } if (!is_numeric($height) || $height == 0) { throw new \InvalidArgumentException('$height must be numeric and greater than zero'); } // make sure we're not exceeding our image size if we're not supposed to if ($this->options['resizeUp'] === false) { $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; } else { $this->maxHeight = intval($height); $this->maxWidth = intval($width); } $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); // resize the image to be close to our desired dimensions $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); // reset the max dimensions... if ($this->options['resizeUp'] === false) { $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; } else { $this->maxHeight = intval($height); $this->maxWidth = intval($width); } // create the working image if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); } else { $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); } $this->preserveAlpha(); $cropWidth = $this->maxWidth; $cropHeight = $this->maxHeight; $cropX = 0; $cropY = 0; // Crop the rest of the image using the quadrant if ($percent > 100) { $percent = 100; } elseif ($percent < 1) { $percent = 1; } if ($this->currentDimensions['width'] > $this->maxWidth) { // Image is landscape $maxCropX = $this->currentDimensions['width'] - $this->maxWidth; $cropX = intval(($percent / 100) * $maxCropX); } elseif ($this->currentDimensions['height'] > $this->maxHeight) { // Image is portrait $maxCropY = $this->currentDimensions['height'] - $this->maxHeight; $cropY = intval(($percent / 100) * $maxCropY); } imagecopyresampled( $this->workingImage, $this->oldImage, 0, 0, $cropX, $cropY, $cropWidth, $cropHeight, $cropWidth, $cropHeight ); // update all the variables and resources to be correct $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $this->maxWidth; $this->currentDimensions['height'] = $this->maxHeight; return $this; } /** * Adaptively Resizes the Image and Crops Using a Quadrant * * This function attempts to get the image to as close to the provided dimensions as possible, and then crops the * remaining overflow using the quadrant to get the image to be the size specified. * * The quadrants available are Top, Bottom, Center, Left, and Right: * * * +---+---+---+ * | | T | | * +---+---+---+ * | L | C | R | * +---+---+---+ * | | B | | * +---+---+---+ * * Note that if your image is Landscape and you choose either of the Top or Bottom quadrants (which won't * make sence since only the Left and Right would be available, then the Center quadrant will be used * to crop. This would have exactly the same result as using adaptiveResize(). * The same goes if your image is portrait and you choose either the Left or Right quadrants. * * @param int $maxWidth * @param int $maxHeight * @param string $quadrant T, B, C, L, R * @return \PHPThumb\GD */ public function adaptiveResizeQuadrant($width, $height, $quadrant = 'C') { // make sure our arguments are valid if (!is_numeric($width) || $width == 0) { throw new \InvalidArgumentException('$width must be numeric and greater than zero'); } if (!is_numeric($height) || $height == 0) { throw new \InvalidArgumentException('$height must be numeric and greater than zero'); } // make sure we're not exceeding our image size if we're not supposed to if ($this->options['resizeUp'] === false) { $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; } else { $this->maxHeight = intval($height); $this->maxWidth = intval($width); } $this->calcImageSizeStrict($this->currentDimensions['width'], $this->currentDimensions['height']); // resize the image to be close to our desired dimensions $this->resize($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); // reset the max dimensions... if ($this->options['resizeUp'] === false) { $this->maxHeight = (intval($height) > $this->currentDimensions['height']) ? $this->currentDimensions['height'] : $height; $this->maxWidth = (intval($width) > $this->currentDimensions['width']) ? $this->currentDimensions['width'] : $width; } else { $this->maxHeight = intval($height); $this->maxWidth = intval($width); } // create the working image if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($this->maxWidth, $this->maxHeight); } else { $this->workingImage = imagecreate($this->maxWidth, $this->maxHeight); } $this->preserveAlpha(); $cropWidth = $this->maxWidth; $cropHeight = $this->maxHeight; $cropX = 0; $cropY = 0; // Crop the rest of the image using the quadrant if ($this->currentDimensions['width'] > $this->maxWidth) { // Image is landscape switch ($quadrant) { case 'L': $cropX = 0; break; case 'R': $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth)); break; case 'C': default: $cropX = intval(($this->currentDimensions['width'] - $this->maxWidth) / 2); break; } } elseif ($this->currentDimensions['height'] > $this->maxHeight) { // Image is portrait switch ($quadrant) { case 'T': $cropY = 0; break; case 'B': $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight)); break; case 'C': default: $cropY = intval(($this->currentDimensions['height'] - $this->maxHeight) / 2); break; } } imagecopyresampled( $this->workingImage, $this->oldImage, 0, 0, $cropX, $cropY, $cropWidth, $cropHeight, $cropWidth, $cropHeight ); // update all the variables and resources to be correct $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $this->maxWidth; $this->currentDimensions['height'] = $this->maxHeight; return $this; } /** * Resizes an image by a given percent uniformly, * Percentage should be whole number representation (i.e. 1-100) * * @param int $percent * @return GD * @throws \InvalidArgumentException */ public function resizePercent($percent = 0) { if (!is_numeric($percent)) { throw new \InvalidArgumentException ('$percent must be numeric'); } $this->percent = intval($percent); $this->calcImageSizePercent($this->currentDimensions['width'], $this->currentDimensions['height']); if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); } else { $this->workingImage = imagecreate($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); } $this->preserveAlpha(); imagecopyresampled( $this->workingImage, $this->oldImage, 0, 0, 0, 0, $this->newDimensions['newWidth'], $this->newDimensions['newHeight'], $this->currentDimensions['width'], $this->currentDimensions['height'] ); $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $this->newDimensions['newWidth']; $this->currentDimensions['height'] = $this->newDimensions['newHeight']; return $this; } /** * Crops an image from the center with provided dimensions * * If no height is given, the width will be used as a height, thus creating a square crop * * @param int $cropWidth * @param int $cropHeight * @return \PHPThumb\GD */ public function cropFromCenter($cropWidth, $cropHeight = null) { if (!is_numeric($cropWidth)) { throw new \InvalidArgumentException('$cropWidth must be numeric'); } if ($cropHeight !== null && !is_numeric($cropHeight)) { throw new \InvalidArgumentException('$cropHeight must be numeric'); } if ($cropHeight === null) { $cropHeight = $cropWidth; } $cropWidth = ($this->currentDimensions['width'] < $cropWidth) ? $this->currentDimensions['width'] : $cropWidth; $cropHeight = ($this->currentDimensions['height'] < $cropHeight) ? $this->currentDimensions['height'] : $cropHeight; $cropX = intval(($this->currentDimensions['width'] - $cropWidth) / 2); $cropY = intval(($this->currentDimensions['height'] - $cropHeight) / 2); $this->crop($cropX, $cropY, $cropWidth, $cropHeight); return $this; } /** * Vanilla Cropping - Crops from x,y with specified width and height * * @param int $startX * @param int $startY * @param int $cropWidth * @param int $cropHeight * @return \PHPThumb\GD */ public function crop($startX, $startY, $cropWidth, $cropHeight) { // validate input if (!is_numeric($startX)) { throw new \InvalidArgumentException('$startX must be numeric'); } if (!is_numeric($startY)) { throw new \InvalidArgumentException('$startY must be numeric'); } if (!is_numeric($cropWidth)) { throw new \InvalidArgumentException('$cropWidth must be numeric'); } if (!is_numeric($cropHeight)) { throw new \InvalidArgumentException('$cropHeight must be numeric'); } // do some calculations $cropWidth = ($this->currentDimensions['width'] < $cropWidth) ? $this->currentDimensions['width'] : $cropWidth; $cropHeight = ($this->currentDimensions['height'] < $cropHeight) ? $this->currentDimensions['height'] : $cropHeight; // ensure everything's in bounds if (($startX + $cropWidth) > $this->currentDimensions['width']) { $startX = ($this->currentDimensions['width'] - $cropWidth); } if (($startY + $cropHeight) > $this->currentDimensions['height']) { $startY = ($this->currentDimensions['height'] - $cropHeight); } if ($startX < 0) { $startX = 0; } if ($startY < 0) { $startY = 0; } // create the working image if (function_exists('imagecreatetruecolor')) { $this->workingImage = imagecreatetruecolor($cropWidth, $cropHeight); } else { $this->workingImage = imagecreate($cropWidth, $cropHeight); } $this->preserveAlpha(); imagecopyresampled( $this->workingImage, $this->oldImage, 0, 0, $startX, $startY, $cropWidth, $cropHeight, $cropWidth, $cropHeight ); $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $cropWidth; $this->currentDimensions['height'] = $cropHeight; return $this; } /** * Rotates image either 90 degrees clockwise or counter-clockwise * * @param string $direction * @retunrn \PHPThumb\GD */ public function rotateImage($direction = 'CW') { if ($direction == 'CW') { $this->rotateImageNDegrees(90); } else { $this->rotateImageNDegrees(-90); } return $this; } /** * Rotates image specified number of degrees * * @param int $degrees * @return \PHPThumb\GD */ public function rotateImageNDegrees($degrees) { if (!is_numeric($degrees)) { throw new \InvalidArgumentException('$degrees must be numeric'); } if (!function_exists('imagerotate')) { throw new \RuntimeException('Your version of GD does not support image rotation'); } $this->workingImage = imagerotate($this->oldImage, $degrees, 0); $newWidth = $this->currentDimensions['height']; $newHeight = $this->currentDimensions['width']; $this->oldImage = $this->workingImage; $this->currentDimensions['width'] = $newWidth; $this->currentDimensions['height'] = $newHeight; return $this; } /** * Applies a filter to the image * * @param int $filter * @return \PHPThumb\GD */ public function imageFilter($filter, $arg1 = false, $arg2 = false, $arg3 = false, $arg4 = false) { if (!is_numeric($filter)) { throw new \InvalidArgumentException('$filter must be numeric'); } if (!function_exists('imagefilter')) { throw new \RuntimeException('Your version of GD does not support image filters'); } $result = false; if ($arg1 === false) { $result = imagefilter($this->oldImage, $filter); } elseif ($arg2 === false) { $result = imagefilter($this->oldImage, $filter, $arg1); } elseif ($arg3 === false) { $result = imagefilter($this->oldImage, $filter, $arg1, $arg2); } elseif ($arg4 === false) { $result = imagefilter($this->oldImage, $filter, $arg1, $arg2, $arg3); } else { $result = imagefilter($this->oldImage, $filter, $arg1, $arg2, $arg3, $arg4); } if (!$result) { throw new \RuntimeException('GD imagefilter failed'); } $this->workingImage = $this->oldImage; return $this; } /** * Shows an image * * This function will show the current image by first sending the appropriate header * for the format, and then outputting the image data. If headers have already been sent, * a runtime exception will be thrown * * @param bool $rawData Whether or not the raw image stream should be output * @return \PHPThumb\GD */ public function show($rawData = false) { //Execute any plugins if ($this->plugins) { foreach ($this->plugins as $plugin) { /* @var $plugin \PHPThumb\PluginInterface */ $plugin->execute($this); } } if (headers_sent() && php_sapi_name() != 'cli') { throw new \RuntimeException('Cannot show image, headers have already been sent'); } // When the interlace option equals true or false call imageinterlace else leave it to default if ($this->options['interlace'] === true) { imageinterlace($this->oldImage, 1); } elseif ($this->options['interlace'] === false) { imageinterlace($this->oldImage, 0); } switch ($this->format) { case 'GIF': if ($rawData === false) { header('Content-type: image/gif'); } imagegif($this->oldImage); break; case 'JPG': if ($rawData === false) { header('Content-type: image/jpeg'); } imagejpeg($this->oldImage, null, $this->options['jpegQuality']); break; case 'PNG': case 'STRING': if ($rawData === false) { header('Content-type: image/png'); } imagepng($this->oldImage); break; } return $this; } /** * Returns the Working Image as a String * * This function is useful for getting the raw image data as a string for storage in * a database, or other similar things. * * @return string */ public function getImageAsString() { $data = null; ob_start(); $this->show(true); $data = ob_get_contents(); ob_end_clean(); return $data; } /** * Saves an image * * This function will make sure the target directory is writeable, and then save the image. * * If the target directory is not writeable, the function will try to correct the permissions (if allowed, this * is set as an option ($this->options['correctPermissions']). If the target cannot be made writeable, then a * \RuntimeException is thrown. * * @param string $fileName The full path and filename of the image to save * @param string $format The format to save the image in (optional, must be one of [GIF,JPG,PNG] * @return \PHPThumb\GD */ public function save($fileName, $format = null) { $validFormats = array('GIF', 'JPG', 'PNG'); $format = ($format !== null) ? strtoupper($format) : $this->format; if (!in_array($format, $validFormats)) { throw new \InvalidArgumentException("Invalid format type specified in save function: {$format}"); } // make sure the directory is writeable if (!is_writeable(dirname($fileName))) { // try to correct the permissions if ($this->options['correctPermissions'] === true) { @chmod(dirname($fileName), 0777); // throw an exception if not writeable if (!is_writeable(dirname($fileName))) { throw new \RuntimeException("File is not writeable, and could not correct permissions: {$fileName}"); } } else { // throw an exception if not writeable throw new \RuntimeException("File not writeable: {$fileName}"); } } // When the interlace option equals true or false call imageinterlace else leave it to default if ($this->options['interlace'] === true) { imageinterlace($this->oldImage, 1); } elseif ($this->options['interlace'] === false) { imageinterlace($this->oldImage, 0); } switch ($format) { case 'GIF': imagegif($this->oldImage, $fileName); break; case 'JPG': imagejpeg($this->oldImage, $fileName, $this->options['jpegQuality']); break; case 'PNG': imagepng($this->oldImage, $fileName); break; } return $this; } ################################# # ----- GETTERS / SETTERS ----- # ################################# /** * Sets options for all operations. * @param array $options * @return GD */ public function setOptions(array $options = array()) { // we've yet to init the default options, so create them here if (sizeof($this->options) == 0) { $defaultOptions = array( 'resizeUp' => false, 'jpegQuality' => 100, 'correctPermissions' => false, 'preserveAlpha' => true, 'alphaMaskColor' => array (255, 255, 255), 'preserveTransparency' => true, 'transparencyMaskColor' => array (0, 0, 0), 'interlace' => null ); } else { // otherwise, let's use what we've got already $defaultOptions = $this->options; } $this->options = array_merge($defaultOptions, $options); return $this; } /** * Returns $currentDimensions. * * @see \PHPThumb\GD::$currentDimensions */ public function getCurrentDimensions() { return $this->currentDimensions; } /** * @param $currentDimensions * @return GD */ public function setCurrentDimensions($currentDimensions) { $this->currentDimensions = $currentDimensions; return $this; } /** * @return int */ public function getMaxHeight() { return $this->maxHeight; } /** * @param $maxHeight * @return GD */ public function setMaxHeight($maxHeight) { $this->maxHeight = $maxHeight; return $this; } /** * @return int */ public function getMaxWidth() { return $this->maxWidth; } /** * @param $maxWidth * @return GD */ public function setMaxWidth($maxWidth) { $this->maxWidth = $maxWidth; return $this; } /** * Returns $newDimensions. * * @see \PHPThumb\GD::$newDimensions */ public function getNewDimensions() { return $this->newDimensions; } /** * Sets $newDimensions. * * @param object $newDimensions * @see \PHPThumb\GD::$newDimensions */ public function setNewDimensions($newDimensions) { $this->newDimensions = $newDimensions; return $this; } /** * Returns $options. * * @see \PHPThumb\GD::$options */ public function getOptions() { return $this->options; } /** * Returns $percent. * * @see \PHPThumb\GD::$percent */ public function getPercent() { return $this->percent; } /** * Sets $percent. * * @param object $percent * @see \PHPThumb\GD::$percent */ public function setPercent($percent) { $this->percent = $percent; return $this; } /** * Returns $oldImage. * * @see \PHPThumb\GD::$oldImage */ public function getOldImage() { return $this->oldImage; } /** * Sets $oldImage. * * @param object $oldImage * @see \PHPThumb\GD::$oldImage */ public function setOldImage($oldImage) { $this->oldImage = $oldImage; return $this; } /** * Returns $workingImage. * * @see \PHPThumb\GD::$workingImage */ public function getWorkingImage() { return $this->workingImage; } /** * Sets $workingImage. * * @param object $workingImage * @see \PHPThumb\GD::$workingImage */ public function setWorkingImage($workingImage) { $this->workingImage = $workingImage; return $this; } ################################# # ----- UTILITY FUNCTIONS ----- # ################################# /** * Calculates a new width and height for the image based on $this->maxWidth and the provided dimensions * * @return array * @param int $width * @param int $height */ protected function calcWidth($width, $height) { $newWidthPercentage = (100 * $this->maxWidth) / $width; $newHeight = ($height * $newWidthPercentage) / 100; return array( 'newWidth' => intval($this->maxWidth), 'newHeight' => intval($newHeight) ); } /** * Calculates a new width and height for the image based on $this->maxWidth and the provided dimensions * * @return array * @param int $width * @param int $height */ protected function calcHeight($width, $height) { $newHeightPercentage = (100 * $this->maxHeight) / $height; $newWidth = ($width * $newHeightPercentage) / 100; return array( 'newWidth' => ceil($newWidth), 'newHeight' => ceil($this->maxHeight) ); } /** * Calculates a new width and height for the image based on $this->percent and the provided dimensions * * @return array * @param int $width * @param int $height */ protected function calcPercent($width, $height) { $newWidth = ($width * $this->percent) / 100; $newHeight = ($height * $this->percent) / 100; return array( 'newWidth' => ceil($newWidth), 'newHeight' => ceil($newHeight) ); } /** * Calculates the new image dimensions * * These calculations are based on both the provided dimensions and $this->maxWidth and $this->maxHeight * * @param int $width * @param int $height */ protected function calcImageSize($width, $height) { $newSize = array( 'newWidth' => $width, 'newHeight' => $height ); if ($this->maxWidth > 0) { $newSize = $this->calcWidth($width, $height); if ($this->maxHeight > 0 && $newSize['newHeight'] > $this->maxHeight) { $newSize = $this->calcHeight($newSize['newWidth'], $newSize['newHeight']); } } if ($this->maxHeight > 0) { $newSize = $this->calcHeight($width, $height); if ($this->maxWidth > 0 && $newSize['newWidth'] > $this->maxWidth) { $newSize = $this->calcWidth($newSize['newWidth'], $newSize['newHeight']); } } $this->newDimensions = $newSize; } /** * Calculates new image dimensions, not allowing the width and height to be less than either the max width or height * * @param int $width * @param int $height */ protected function calcImageSizeStrict($width, $height) { // first, we need to determine what the longest resize dimension is.. if ($this->maxWidth >= $this->maxHeight) { // and determine the longest original dimension if ($width > $height) { $newDimensions = $this->calcHeight($width, $height); if ($newDimensions['newWidth'] < $this->maxWidth) { $newDimensions = $this->calcWidth($width, $height); } } elseif ($height >= $width) { $newDimensions = $this->calcWidth($width, $height); if ($newDimensions['newHeight'] < $this->maxHeight) { $newDimensions = $this->calcHeight($width, $height); } } } elseif ($this->maxHeight > $this->maxWidth) { if ($width >= $height) { $newDimensions = $this->calcWidth($width, $height); if ($newDimensions['newHeight'] < $this->maxHeight) { $newDimensions = $this->calcHeight($width, $height); } } elseif ($height > $width) { $newDimensions = $this->calcHeight($width, $height); if ($newDimensions['newWidth'] < $this->maxWidth) { $newDimensions = $this->calcWidth($width, $height); } } } $this->newDimensions = $newDimensions; } /** * Calculates new dimensions based on $this->percent and the provided dimensions * * @param int $width * @param int $height */ protected function calcImageSizePercent($width, $height) { if ($this->percent > 0) { $this->newDimensions = $this->calcPercent($width, $height); } } /** * Determines the file format by mime-type * * This function will throw exceptions for invalid images / mime-types * */ protected function determineFormat() { $formatInfo = getimagesize($this->fileName); // non-image files will return false if ($formatInfo === false) { if ($this->remoteImage) { throw new \Exception("Could not determine format of remote image: {$this->fileName}"); } else { throw new \Exception("File is not a valid image: {$this->fileName}"); } } $mimeType = isset($formatInfo['mime']) ? $formatInfo['mime'] : null; switch ($mimeType) { case 'image/gif': $this->format = 'GIF'; break; case 'image/jpeg': $this->format = 'JPG'; break; case 'image/png': $this->format = 'PNG'; break; default: throw new \Exception("Image format not supported: {$mimeType}"); } } /** * Makes sure the correct GD implementation exists for the file type * */ protected function verifyFormatCompatiblity() { $isCompatible = true; $gdInfo = gd_info(); switch ($this->format) { case 'GIF': $isCompatible = isset($gdInfo['GIF Create Support']); break; case 'JPG': $isCompatible = (isset($gdInfo['JPG Support']) || isset($gdInfo['JPEG Support'])) ? true : false; break; case 'PNG': $isCompatible = isset($gdInfo[$this->format . ' Support']); break; default: $isCompatible = false; } if (!$isCompatible) { // one last check for "JPEG" instead $isCompatible = isset($gdInfo['JPEG Support']); if (!$isCompatible) { throw new \Exception("Your GD installation does not support {$this->format} image types"); } } } /** * Preserves the alpha or transparency for PNG and GIF files * * Alpha / transparency will not be preserved if the appropriate options are set to false. * Also, the GIF transparency is pretty skunky (the results aren't awesome), but it works like a * champ... that's the nature of GIFs tho, so no huge surprise. * * This functionality was originally suggested by commenter Aimi (no links / site provided) - Thanks! :) * */ protected function preserveAlpha() { if ($this->format == 'PNG' && $this->options['preserveAlpha'] === true) { imagealphablending($this->workingImage, false); $colorTransparent = imagecolorallocatealpha( $this->workingImage, $this->options['alphaMaskColor'][0], $this->options['alphaMaskColor'][1], $this->options['alphaMaskColor'][2], 0 ); imagefill($this->workingImage, 0, 0, $colorTransparent); imagesavealpha($this->workingImage, true); } // preserve transparency in GIFs... this is usually pretty rough tho if ($this->format == 'GIF' && $this->options['preserveTransparency'] === true) { $colorTransparent = imagecolorallocate( $this->workingImage, $this->options['transparencyMaskColor'][0], $this->options['transparencyMaskColor'][1], $this->options['transparencyMaskColor'][2] ); imagecolortransparent($this->workingImage, $colorTransparent); imagetruecolortopalette($this->workingImage, true, 256); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHPThumb/PHPThumb.php000066400000000000000000000060161361462701300261120ustar00rootroot00000000000000 * Copyright (c) 2009, Ian Selby/Gen X Design * * Author(s): Ian Selby * * Licensed under the MIT License * Redistributions of files must retain the above copyright notice. * * @author Ian Selby * @copyright Copyright (c) 2009 Gen X Design * @link http://phpthumb.gxdlabs.com * @license http://www.opensource.org/licenses/mit-license.php The MIT License */ abstract class PHPThumb { /** * The name of the file we're manipulating * This must include the path to the file (absolute paths recommended) * * @var string */ protected $fileName; /** * What the file format is (mime-type) * * @var string */ protected $format; /** * Whether or not the image is hosted remotely * * @var bool */ protected $remoteImage; /** * An array of attached plugins to execute in order. * @var array */ protected $plugins; /** * @param $fileName * @param array $options * @param array $plugins */ public function __construct($fileName, array $options = array(), array $plugins = array()) { $this->fileName = $fileName; $this->remoteImage = false; if(!$this->validateRequestedResource($fileName)) { throw new \InvalidArgumentException("Image file not found: {$fileName}"); } $this->setOptions($options); $this->plugins = $plugins; } abstract public function setOptions(array $options = array()); /** * Check the provided filename/url. If it is a url, validate that it is properly * formatted. If it is a file, check to make sure that it actually exists on * the filesystem. * * @param $filename * @return bool */ protected function validateRequestedResource($filename) { if(false !== filter_var($filename, FILTER_VALIDATE_URL)) { $this->remoteImage = true; return true; } if (file_exists($filename)) { return true; } return false; } /** * Returns the filename. * @return string */ public function getFileName() { return $this->fileName; } /** * Sets the filename. * @param $fileName * @return PHPThumb */ public function setFileName($fileName) { $this->fileName = $fileName; return $this; } /** * Returns the format. * @return string */ public function getFormat() { return $this->format; } /** * Sets the format. * @param $format * @return PHPThumb */ public function setFormat($format) { $this->format = $format; return $this; } /** * Returns whether the image exists remotely, i.e. it was loaded via a URL. * @return bool */ public function getIsRemoteImage() { return $this->remoteImage; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/PHPThumb/PluginInterface.php000066400000000000000000000002541361462701300275400ustar00rootroot00000000000000 * Copyright (c) 2009, Ian Selby/Gen X Design * * Author(s): Ian Selby * * Licensed under the MIT License * Redistributions of files must retain the above copyright notice. * * @author Ian Selby * @copyright Copyright (c) 2009 Gen X Design * @link http://phpthumb.gxdlabs.com * @license http://www.opensource.org/licenses/mit-license.php The MIT License * @version 3.0 * @package PhpThumb * @filesource */ /** * GD Reflection Lib Plugin * * This plugin allows you to create those fun Apple(tm)-style reflections in your images * * @package PhpThumb * @subpackage Plugins */ class Reflection implements \PHPThumb\PluginInterface { protected $currentDimensions; protected $workingImage; protected $newImage; protected $options; protected $percent; protected $reflection; protected $white; protected $border; protected $borderColor; public function __construct($percent, $reflection, $white, $border, $borderColor) { $this->percent = $percent; $this->reflection = $reflection; $this->white = $white; $this->border = $border; $this->borderColor = $borderColor; } /** * @param \PHPThumb\PHPThumb $phpthumb * @return \PHPThumb\PHPThumb */ public function execute($phpthumb) { $this->currentDimensions = $phpthumb->getCurrentDimensions(); $this->workingImage = $phpthumb->getWorkingImage(); $this->newImage = $phpthumb->getOldImage(); $this->options = $phpthumb->getOptions(); $width = $this->currentDimensions['width']; $height = $this->currentDimensions['height']; $this->reflectionHeight = intval($height * ($this->reflection / 100)); $newHeight = $height + $this->reflectionHeight; $reflectedPart = $height * ($this->percent / 100); $this->workingImage = imagecreatetruecolor($width, $newHeight); imagealphablending($this->workingImage, true); $colorToPaint = imagecolorallocatealpha( $this->workingImage, 255, 255, 255, 0 ); imagefilledrectangle( $this->workingImage, 0, 0, $width, $newHeight, $colorToPaint ); imagecopyresampled( $this->workingImage, $this->newImage, 0, 0, 0, $reflectedPart, $width, $this->reflectionHeight, $width, ($height - $reflectedPart) ); $this->imageFlipVertical(); imagecopy( $this->workingImage, $this->newImage, 0, 0, 0, 0, $width, $height ); imagealphablending($this->workingImage, true); for ($i = 0; $i < $this->reflectionHeight; $i++) { $colorToPaint = imagecolorallocatealpha( $this->workingImage, 255, 255, 255, ($i / $this->reflectionHeight * -1 + 1) * $this->white ); imagefilledrectangle( $this->workingImage, 0, $height + $i, $width, $height + $i, $colorToPaint ); } if ($this->border == true) { $rgb = $this->hex2rgb($this->borderColor, false); $colorToPaint = imagecolorallocate($this->workingImage, $rgb[0], $rgb[1], $rgb[2]); //top line imageline( $this->workingImage, 0, 0, $width, 0, $colorToPaint ); //bottom line imageline( $this->workingImage, 0, $height, $width, $height, $colorToPaint ); //left line imageline( $this->workingImage, 0, 0, 0, $height, $colorToPaint ); //right line imageline( $this->workingImage, $width - 1, 0, $width - 1, $height, $colorToPaint ); } if ($phpthumb->getFormat() == 'PNG') { $colorTransparent = imagecolorallocatealpha( $this->workingImage, $this->options['alphaMaskColor'][0], $this->options['alphaMaskColor'][1], $this->options['alphaMaskColor'][2], 0 ); imagefill($this->workingImage, 0, 0, $colorTransparent); imagesavealpha($this->workingImage, true); } $phpthumb->setOldImage($this->workingImage); $this->currentDimensions['width'] = $width; $this->currentDimensions['height'] = $newHeight; $phpthumb->setCurrentDimensions($this->currentDimensions); return $phpthumb; } /** * Flips the image vertically * */ protected function imageFlipVertical () { $x_i = imagesx($this->workingImage); $y_i = imagesy($this->workingImage); for ($x = 0; $x < $x_i; $x++) { for ($y = 0; $y < $y_i; $y++) { imagecopy( $this->workingImage, $this->workingImage, $x, $y_i - $y - 1, $x, $y, 1, 1 ); } } } /** * Converts a hex color to rgb tuples * * @return mixed * @param string $hex * @param bool $asString */ protected function hex2rgb ($hex, $asString = false) { // strip off any leading # if (0 === strpos($hex, '#')) { $hex = substr($hex, 1); } elseif (0 === strpos($hex, '&H')) { $hex = substr($hex, 2); } // break into hex 3-tuple $cutpoint = ceil(strlen($hex) / 2)-1; $rgb = explode(':', wordwrap($hex, $cutpoint, ':', $cutpoint), 3); // convert each tuple to decimal $rgb[0] = (isset($rgb[0]) ? hexdec($rgb[0]) : 0); $rgb[1] = (isset($rgb[1]) ? hexdec($rgb[1]) : 0); $rgb[2] = (isset($rgb[2]) ? hexdec($rgb[2]) : 0); return ($asString ? "{$rgb[0]} {$rgb[1]} {$rgb[2]}" : $rgb); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/000077500000000000000000000000001361462701300235465ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Autoloader.php000066400000000000000000000032561361462701300263640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; /** * Implements a lightweight PSR-0 compliant autoloader for Predis. * * @author Eric Naeseth * @author Daniele Alessandri */ class Autoloader { private $directory; private $prefix; private $prefixLength; /** * @param string $baseDirectory Base directory where the source files are located. */ public function __construct($baseDirectory = __DIR__) { $this->directory = $baseDirectory; $this->prefix = __NAMESPACE__.'\\'; $this->prefixLength = strlen($this->prefix); } /** * Registers the autoloader class with the PHP SPL autoloader. * * @param bool $prepend Prepend the autoloader on the stack instead of appending it. */ public static function register($prepend = false) { spl_autoload_register(array(new self(), 'autoload'), true, $prepend); } /** * Loads a class from a file using its fully qualified name. * * @param string $className Fully qualified name of a class. */ public function autoload($className) { if (0 === strpos($className, $this->prefix)) { $parts = explode('\\', substr($className, $this->prefixLength)); $filepath = $this->directory.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts).'.php'; if (is_file($filepath)) { require $filepath; } } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Client.php000066400000000000000000000360261361462701300255040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; use Predis\Command\CommandInterface; use Predis\Command\RawCommand; use Predis\Command\ScriptCommand; use Predis\Configuration\Options; use Predis\Configuration\OptionsInterface; use Predis\Connection\AggregateConnectionInterface; use Predis\Connection\ConnectionInterface; use Predis\Connection\ParametersInterface; use Predis\Monitor\Consumer as MonitorConsumer; use Predis\Pipeline\Pipeline; use Predis\PubSub\Consumer as PubSubConsumer; use Predis\Response\ErrorInterface as ErrorResponseInterface; use Predis\Response\ResponseInterface; use Predis\Response\ServerException; use Predis\Transaction\MultiExec as MultiExecTransaction; /** * Client class used for connecting and executing commands on Redis. * * This is the main high-level abstraction of Predis upon which various other * abstractions are built. Internally it aggregates various other classes each * one with its own responsibility and scope. * * {@inheritdoc} * * @author Daniele Alessandri */ class Client implements ClientInterface { const VERSION = '1.0.3'; protected $connection; protected $options; private $profile; /** * @param mixed $parameters Connection parameters for one or more servers. * @param mixed $options Options to configure some behaviours of the client. */ public function __construct($parameters = null, $options = null) { $this->options = $this->createOptions($options ?: array()); $this->connection = $this->createConnection($parameters ?: array()); $this->profile = $this->options->profile; } /** * Creates a new instance of Predis\Configuration\Options from different * types of arguments or simply returns the passed argument if it is an * instance of Predis\Configuration\OptionsInterface. * * @param mixed $options Client options. * * @throws \InvalidArgumentException * * @return OptionsInterface */ protected function createOptions($options) { if (is_array($options)) { return new Options($options); } if ($options instanceof OptionsInterface) { return $options; } throw new \InvalidArgumentException('Invalid type for client options.'); } /** * Creates single or aggregate connections from different types of arguments * (string, array) or returns the passed argument if it is an instance of a * class implementing Predis\Connection\ConnectionInterface. * * Accepted types for connection parameters are: * * - Instance of Predis\Connection\ConnectionInterface. * - Instance of Predis\Connection\ParametersInterface. * - Array * - String * - Callable * * @param mixed $parameters Connection parameters or connection instance. * * @throws \InvalidArgumentException * * @return ConnectionInterface */ protected function createConnection($parameters) { if ($parameters instanceof ConnectionInterface) { return $parameters; } if ($parameters instanceof ParametersInterface || is_string($parameters)) { return $this->options->connections->create($parameters); } if (is_array($parameters)) { if (!isset($parameters[0])) { return $this->options->connections->create($parameters); } $options = $this->options; if ($options->defined('aggregate')) { $initializer = $this->getConnectionInitializerWrapper($options->aggregate); $connection = $initializer($parameters, $options); } else { if ($options->defined('replication') && $replication = $options->replication) { $connection = $replication; } else { $connection = $options->cluster; } $options->connections->aggregate($connection, $parameters); } return $connection; } if (is_callable($parameters)) { $initializer = $this->getConnectionInitializerWrapper($parameters); $connection = $initializer($this->options); return $connection; } throw new \InvalidArgumentException('Invalid type for connection parameters.'); } /** * Wraps a callable to make sure that its returned value represents a valid * connection type. * * @param mixed $callable * * @return \Closure */ protected function getConnectionInitializerWrapper($callable) { return function () use ($callable) { $connection = call_user_func_array($callable, func_get_args()); if (!$connection instanceof ConnectionInterface) { throw new \UnexpectedValueException( 'The callable connection initializer returned an invalid type.' ); } return $connection; }; } /** * {@inheritdoc} */ public function getProfile() { return $this->profile; } /** * {@inheritdoc} */ public function getOptions() { return $this->options; } /** * Creates a new client instance for the specified connection ID or alias, * only when working with an aggregate connection (cluster, replication). * The new client instances uses the same options of the original one. * * @param string $connectionID Identifier of a connection. * * @throws \InvalidArgumentException * * @return Client */ public function getClientFor($connectionID) { if (!$connection = $this->getConnectionById($connectionID)) { throw new \InvalidArgumentException("Invalid connection ID: $connectionID."); } return new static($connection, $this->options); } /** * Opens the underlying connection and connects to the server. */ public function connect() { $this->connection->connect(); } /** * Closes the underlying connection and disconnects from the server. */ public function disconnect() { $this->connection->disconnect(); } /** * Closes the underlying connection and disconnects from the server. * * This is the same as `Client::disconnect()` as it does not actually send * the `QUIT` command to Redis, but simply closes the connection. */ public function quit() { $this->disconnect(); } /** * Returns the current state of the underlying connection. * * @return bool */ public function isConnected() { return $this->connection->isConnected(); } /** * {@inheritdoc} */ public function getConnection() { return $this->connection; } /** * Retrieves the specified connection from the aggregate connection when the * client is in cluster or replication mode. * * @param string $connectionID Index or alias of the single connection. * * @throws NotSupportedException * * @return Connection\NodeConnectionInterface */ public function getConnectionById($connectionID) { if (!$this->connection instanceof AggregateConnectionInterface) { throw new NotSupportedException( 'Retrieving connections by ID is supported only by aggregate connections.' ); } return $this->connection->getConnectionById($connectionID); } /** * Executes a command without filtering its arguments, parsing the response, * applying any prefix to keys or throwing exceptions on Redis errors even * regardless of client options. * * It is possibile to indentify Redis error responses from normal responses * using the second optional argument which is populated by reference. * * @param array $arguments Command arguments as defined by the command signature. * @param bool $error Set to TRUE when Redis returned an error response. * * @return mixed */ public function executeRaw(array $arguments, &$error = null) { $error = false; $response = $this->connection->executeCommand( new RawCommand($arguments) ); if ($response instanceof ResponseInterface) { if ($response instanceof ErrorResponseInterface) { $error = true; } return (string) $response; } return $response; } /** * {@inheritdoc} */ public function __call($commandID, $arguments) { return $this->executeCommand( $this->createCommand($commandID, $arguments) ); } /** * {@inheritdoc} */ public function createCommand($commandID, $arguments = array()) { return $this->profile->createCommand($commandID, $arguments); } /** * {@inheritdoc} */ public function executeCommand(CommandInterface $command) { $response = $this->connection->executeCommand($command); if ($response instanceof ResponseInterface) { if ($response instanceof ErrorResponseInterface) { $response = $this->onErrorResponse($command, $response); } return $response; } return $command->parseResponse($response); } /** * Handles -ERR responses returned by Redis. * * @param CommandInterface $command Redis command that generated the error. * @param ErrorResponseInterface $response Instance of the error response. * * @throws ServerException * * @return mixed */ protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $response) { if ($command instanceof ScriptCommand && $response->getErrorType() === 'NOSCRIPT') { $eval = $this->createCommand('EVAL'); $eval->setRawArguments($command->getEvalArguments()); $response = $this->executeCommand($eval); if (!$response instanceof ResponseInterface) { $response = $command->parseResponse($response); } return $response; } if ($this->options->exceptions) { throw new ServerException($response->getMessage()); } return $response; } /** * Executes the specified initializer method on `$this` by adjusting the * actual invokation depending on the arity (0, 1 or 2 arguments). This is * simply an utility method to create Redis contexts instances since they * follow a common initialization path. * * @param string $initializer Method name. * @param array $argv Arguments for the method. * * @return mixed */ private function sharedContextFactory($initializer, $argv = null) { switch (count($argv)) { case 0: return $this->$initializer(); case 1: return is_array($argv[0]) ? $this->$initializer($argv[0]) : $this->$initializer(null, $argv[0]); case 2: list($arg0, $arg1) = $argv; return $this->$initializer($arg0, $arg1); default: return $this->$initializer($this, $argv); } } /** * Creates a new pipeline context and returns it, or returns the results of * a pipeline executed inside the optionally provided callable object. * * @param mixed ... Array of options, a callable for execution, or both. * * @return Pipeline|array */ public function pipeline(/* arguments */) { return $this->sharedContextFactory('createPipeline', func_get_args()); } /** * Actual pipeline context initializer method. * * @param array $options Options for the context. * @param mixed $callable Optional callable used to execute the context. * * @return Pipeline|array */ protected function createPipeline(array $options = null, $callable = null) { if (isset($options['atomic']) && $options['atomic']) { $class = 'Predis\Pipeline\Atomic'; } elseif (isset($options['fire-and-forget']) && $options['fire-and-forget']) { $class = 'Predis\Pipeline\FireAndForget'; } else { $class = 'Predis\Pipeline\Pipeline'; } /* * @var ClientContextInterface */ $pipeline = new $class($this); if (isset($callable)) { return $pipeline->execute($callable); } return $pipeline; } /** * Creates a new transaction context and returns it, or returns the results * of a transaction executed inside the optionally provided callable object. * * @param mixed ... Array of options, a callable for execution, or both. * * @return MultiExecTransaction|array */ public function transaction(/* arguments */) { return $this->sharedContextFactory('createTransaction', func_get_args()); } /** * Actual transaction context initializer method. * * @param array $options Options for the context. * @param mixed $callable Optional callable used to execute the context. * * @return MultiExecTransaction|array */ protected function createTransaction(array $options = null, $callable = null) { $transaction = new MultiExecTransaction($this, $options); if (isset($callable)) { return $transaction->execute($callable); } return $transaction; } /** * Creates a new publis/subscribe context and returns it, or starts its loop * inside the optionally provided callable object. * * @param mixed ... Array of options, a callable for execution, or both. * * @return PubSubConsumer|null */ public function pubSubLoop(/* arguments */) { return $this->sharedContextFactory('createPubSub', func_get_args()); } /** * Actual publish/subscribe context initializer method. * * @param array $options Options for the context. * @param mixed $callable Optional callable used to execute the context. * * @return PubSubConsumer|null */ protected function createPubSub(array $options = null, $callable = null) { $pubsub = new PubSubConsumer($this, $options); if (!isset($callable)) { return $pubsub; } foreach ($pubsub as $message) { if (call_user_func($callable, $pubsub, $message) === false) { $pubsub->stop(); } } } /** * Creates a new monitor consumer and returns it. * * @return MonitorConsumer */ public function monitor() { return new MonitorConsumer($this); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/ClientContextInterface.php000066400000000000000000000157431361462701300306750ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; use Predis\Command\CommandInterface; /** * Interface defining a client-side context such as a pipeline or transaction. * * @method $this del(array $keys) * @method $this dump($key) * @method $this exists($key) * @method $this expire($key, $seconds) * @method $this expireat($key, $timestamp) * @method $this keys($pattern) * @method $this move($key, $db) * @method $this object($subcommand, $key) * @method $this persist($key) * @method $this pexpire($key, $milliseconds) * @method $this pexpireat($key, $timestamp) * @method $this pttl($key) * @method $this randomkey() * @method $this rename($key, $target) * @method $this renamenx($key, $target) * @method $this scan($cursor, array $options = null) * @method $this sort($key, array $options = null) * @method $this ttl($key) * @method $this type($key) * @method $this append($key, $value) * @method $this bitcount($key, $start = null, $end = null) * @method $this bitop($operation, $destkey, $key) * @method $this decr($key) * @method $this decrby($key, $decrement) * @method $this get($key) * @method $this getbit($key, $offset) * @method $this getrange($key, $start, $end) * @method $this getset($key, $value) * @method $this incr($key) * @method $this incrby($key, $increment) * @method $this incrbyfloat($key, $increment) * @method $this mget(array $keys) * @method $this mset(array $dictionary) * @method $this msetnx(array $dictionary) * @method $this psetex($key, $milliseconds, $value) * @method $this set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) * @method $this setbit($key, $offset, $value) * @method $this setex($key, $seconds, $value) * @method $this setnx($key, $value) * @method $this setrange($key, $offset, $value) * @method $this strlen($key) * @method $this hdel($key, array $fields) * @method $this hexists($key, $field) * @method $this hget($key, $field) * @method $this hgetall($key) * @method $this hincrby($key, $field, $increment) * @method $this hincrbyfloat($key, $field, $increment) * @method $this hkeys($key) * @method $this hlen($key) * @method $this hmget($key, array $fields) * @method $this hmset($key, array $dictionary) * @method $this hscan($key, $cursor, array $options = null) * @method $this hset($key, $field, $value) * @method $this hsetnx($key, $field, $value) * @method $this hvals($key) * @method $this blpop(array $keys, $timeout) * @method $this brpop(array $keys, $timeout) * @method $this brpoplpush($source, $destination, $timeout) * @method $this lindex($key, $index) * @method $this linsert($key, $whence, $pivot, $value) * @method $this llen($key) * @method $this lpop($key) * @method $this lpush($key, array $values) * @method $this lpushx($key, $value) * @method $this lrange($key, $start, $stop) * @method $this lrem($key, $count, $value) * @method $this lset($key, $index, $value) * @method $this ltrim($key, $start, $stop) * @method $this rpop($key) * @method $this rpoplpush($source, $destination) * @method $this rpush($key, array $values) * @method $this rpushx($key, $value) * @method $this sadd($key, array $members) * @method $this scard($key) * @method $this sdiff(array $keys) * @method $this sdiffstore($destination, array $keys) * @method $this sinter(array $keys) * @method $this sinterstore($destination, array $keys) * @method $this sismember($key, $member) * @method $this smembers($key) * @method $this smove($source, $destination, $member) * @method $this spop($key) * @method $this srandmember($key, $count = null) * @method $this srem($key, $member) * @method $this sscan($key, $cursor, array $options = null) * @method $this sunion(array $keys) * @method $this sunionstore($destination, array $keys) * @method $this zadd($key, array $membersAndScoresDictionary) * @method $this zcard($key) * @method $this zcount($key, $min, $max) * @method $this zincrby($key, $increment, $member) * @method $this zinterstore($destination, array $keys, array $options = null) * @method $this zrange($key, $start, $stop, array $options = null) * @method $this zrangebyscore($key, $min, $max, array $options = null) * @method $this zrank($key, $member) * @method $this zrem($key, $member) * @method $this zremrangebyrank($key, $start, $stop) * @method $this zremrangebyscore($key, $min, $max) * @method $this zrevrange($key, $start, $stop, array $options = null) * @method $this zrevrangebyscore($key, $min, $max, array $options = null) * @method $this zrevrank($key, $member) * @method $this zunionstore($destination, array $keys, array $options = null) * @method $this zscore($key, $member) * @method $this zscan($key, $cursor, array $options = null) * @method $this zrangebylex($key, $start, $stop, array $options = null) * @method $this zremrangebylex($key, $min, $max) * @method $this zlexcount($key, $min, $max) * @method $this pfadd($key, array $elements) * @method $this pfmerge($destinationKey, array $sourceKeys) * @method $this pfcount(array $keys) * @method $this pubsub($subcommand, $argument) * @method $this publish($channel, $message) * @method $this discard() * @method $this exec() * @method $this multi() * @method $this unwatch() * @method $this watch($key) * @method $this eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) * @method $this evalsha($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) * @method $this script($subcommand, $argument = null) * @method $this auth($password) * @method $this echo($message) * @method $this ping($message = null) * @method $this select($database) * @method $this bgrewriteaof() * @method $this bgsave() * @method $this client($subcommand, $argument = null) * @method $this config($subcommand, $argument = null) * @method $this dbsize() * @method $this flushall() * @method $this flushdb() * @method $this info($section = null) * @method $this lastsave() * @method $this save() * @method $this slaveof($host, $port) * @method $this slowlog($subcommand, $argument = null) * @method $this time() * @method $this command() * * @author Daniele Alessandri */ interface ClientContextInterface { /** * Sends the specified command instance to Redis. * * @param CommandInterface $command Command instance. * * @return mixed */ public function executeCommand(CommandInterface $command); /** * Sends the specified command with its arguments to Redis. * * @param string $method Command ID. * @param array $arguments Arguments for the command. * * @return mixed */ public function __call($method, $arguments); /** * Starts the execution of the context. * * @param mixed $callable Optional callback for execution. * * @return array */ public function execute($callable = null); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/ClientException.php000066400000000000000000000006551361462701300273620ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; /** * Exception class that identifies client-side errors. * * @author Daniele Alessandri */ class ClientException extends PredisException { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/ClientInterface.php000066400000000000000000000203511361462701300273170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; use Predis\Command\CommandInterface; use Predis\Configuration\OptionsInterface; use Predis\Connection\ConnectionInterface; use Predis\Profile\ProfileInterface; /** * Interface defining a client able to execute commands against Redis. * * All the commands exposed by the client generally have the same signature as * described by the Redis documentation, but some of them offer an additional * and more friendly interface to ease programming which is described in the * following list of methods: * * @method int del(array $keys) * @method string dump($key) * @method int exists($key) * @method int expire($key, $seconds) * @method int expireat($key, $timestamp) * @method array keys($pattern) * @method int move($key, $db) * @method mixed object($subcommand, $key) * @method int persist($key) * @method int pexpire($key, $milliseconds) * @method int pexpireat($key, $timestamp) * @method int pttl($key) * @method string randomkey() * @method mixed rename($key, $target) * @method int renamenx($key, $target) * @method array scan($cursor, array $options = null) * @method array sort($key, array $options = null) * @method int ttl($key) * @method mixed type($key) * @method int append($key, $value) * @method int bitcount($key, $start = null, $end = null) * @method int bitop($operation, $destkey, $key) * @method int decr($key) * @method int decrby($key, $decrement) * @method string get($key) * @method int getbit($key, $offset) * @method string getrange($key, $start, $end) * @method string getset($key, $value) * @method int incr($key) * @method int incrby($key, $increment) * @method string incrbyfloat($key, $increment) * @method array mget(array $keys) * @method mixed mset(array $dictionary) * @method int msetnx(array $dictionary) * @method mixed psetex($key, $milliseconds, $value) * @method mixed set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) * @method int setbit($key, $offset, $value) * @method int setex($key, $seconds, $value) * @method int setnx($key, $value) * @method int setrange($key, $offset, $value) * @method int strlen($key) * @method int hdel($key, array $fields) * @method int hexists($key, $field) * @method string hget($key, $field) * @method array hgetall($key) * @method int hincrby($key, $field, $increment) * @method string hincrbyfloat($key, $field, $increment) * @method array hkeys($key) * @method int hlen($key) * @method array hmget($key, array $fields) * @method mixed hmset($key, array $dictionary) * @method array hscan($key, $cursor, array $options = null) * @method int hset($key, $field, $value) * @method int hsetnx($key, $field, $value) * @method array hvals($key) * @method array blpop(array $keys, $timeout) * @method array brpop(array $keys, $timeout) * @method array brpoplpush($source, $destination, $timeout) * @method string lindex($key, $index) * @method int linsert($key, $whence, $pivot, $value) * @method int llen($key) * @method string lpop($key) * @method int lpush($key, array $values) * @method int lpushx($key, $value) * @method array lrange($key, $start, $stop) * @method int lrem($key, $count, $value) * @method mixed lset($key, $index, $value) * @method mixed ltrim($key, $start, $stop) * @method string rpop($key) * @method string rpoplpush($source, $destination) * @method int rpush($key, array $values) * @method int rpushx($key, $value) * @method int sadd($key, array $members) * @method int scard($key) * @method array sdiff(array $keys) * @method int sdiffstore($destination, array $keys) * @method array sinter(array $keys) * @method int sinterstore($destination, array $keys) * @method int sismember($key, $member) * @method array smembers($key) * @method int smove($source, $destination, $member) * @method string spop($key) * @method string srandmember($key, $count = null) * @method int srem($key, $member) * @method array sscan($key, $cursor, array $options = null) * @method array sunion(array $keys) * @method int sunionstore($destination, array $keys) * @method int zadd($key, array $membersAndScoresDictionary) * @method int zcard($key) * @method string zcount($key, $min, $max) * @method string zincrby($key, $increment, $member) * @method int zinterstore($destination, array $keys, array $options = null) * @method array zrange($key, $start, $stop, array $options = null) * @method array zrangebyscore($key, $min, $max, array $options = null) * @method int zrank($key, $member) * @method int zrem($key, $member) * @method int zremrangebyrank($key, $start, $stop) * @method int zremrangebyscore($key, $min, $max) * @method array zrevrange($key, $start, $stop, array $options = null) * @method array zrevrangebyscore($key, $min, $max, array $options = null) * @method int zrevrank($key, $member) * @method int zunionstore($destination, array $keys, array $options = null) * @method string zscore($key, $member) * @method array zscan($key, $cursor, array $options = null) * @method array zrangebylex($key, $start, $stop, array $options = null) * @method int zremrangebylex($key, $min, $max) * @method int zlexcount($key, $min, $max) * @method int pfadd($key, array $elements) * @method mixed pfmerge($destinationKey, array $sourceKeys) * @method int pfcount(array $keys) * @method mixed pubsub($subcommand, $argument) * @method int publish($channel, $message) * @method mixed discard() * @method array exec() * @method mixed multi() * @method mixed unwatch() * @method mixed watch($key) * @method mixed eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) * @method mixed evalsha($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) * @method mixed script($subcommand, $argument = null) * @method mixed auth($password) * @method string echo($message) * @method mixed ping($message = null) * @method mixed select($database) * @method mixed bgrewriteaof() * @method mixed bgsave() * @method mixed client($subcommand, $argument = null) * @method mixed config($subcommand, $argument = null) * @method int dbsize() * @method mixed flushall() * @method mixed flushdb() * @method array info($section = null) * @method int lastsave() * @method mixed save() * @method mixed slaveof($host, $port) * @method mixed slowlog($subcommand, $argument = null) * @method array time() * @method array command() * * @author Daniele Alessandri */ interface ClientInterface { /** * Returns the server profile used by the client. * * @return ProfileInterface */ public function getProfile(); /** * Returns the client options specified upon initialization. * * @return OptionsInterface */ public function getOptions(); /** * Opens the underlying connection to the server. */ public function connect(); /** * Closes the underlying connection from the server. */ public function disconnect(); /** * Returns the underlying connection instance. * * @return ConnectionInterface */ public function getConnection(); /** * Creates a new instance of the specified Redis command. * * @param string $method Command ID. * @param array $arguments Arguments for the command. * * @return CommandInterface */ public function createCommand($method, $arguments = array()); /** * Executes the specified Redis command. * * @param CommandInterface $command Command instance. * * @return mixed */ public function executeCommand(CommandInterface $command); /** * Creates a Redis command with the specified arguments and sends a request * to the server. * * @param string $method Command ID. * @param array $arguments Arguments for the command. * * @return mixed */ public function __call($method, $arguments); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/000077500000000000000000000000001361462701300251675ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/ClusterStrategy.php000066400000000000000000000316211361462701300310470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster; use Predis\Command\CommandInterface; use Predis\Command\ScriptCommand; /** * Common class implementing the logic needed to support clustering strategies. * * @author Daniele Alessandri */ abstract class ClusterStrategy implements StrategyInterface { protected $commands; /** * */ public function __construct() { $this->commands = $this->getDefaultCommands(); } /** * Returns the default map of supported commands with their handlers. * * @return array */ protected function getDefaultCommands() { $getKeyFromFirstArgument = array($this, 'getKeyFromFirstArgument'); $getKeyFromAllArguments = array($this, 'getKeyFromAllArguments'); return array( /* commands operating on the key space */ 'EXISTS' => $getKeyFromFirstArgument, 'DEL' => $getKeyFromAllArguments, 'TYPE' => $getKeyFromFirstArgument, 'EXPIRE' => $getKeyFromFirstArgument, 'EXPIREAT' => $getKeyFromFirstArgument, 'PERSIST' => $getKeyFromFirstArgument, 'PEXPIRE' => $getKeyFromFirstArgument, 'PEXPIREAT' => $getKeyFromFirstArgument, 'TTL' => $getKeyFromFirstArgument, 'PTTL' => $getKeyFromFirstArgument, 'SORT' => $getKeyFromFirstArgument, // TODO 'DUMP' => $getKeyFromFirstArgument, 'RESTORE' => $getKeyFromFirstArgument, /* commands operating on string values */ 'APPEND' => $getKeyFromFirstArgument, 'DECR' => $getKeyFromFirstArgument, 'DECRBY' => $getKeyFromFirstArgument, 'GET' => $getKeyFromFirstArgument, 'GETBIT' => $getKeyFromFirstArgument, 'MGET' => $getKeyFromAllArguments, 'SET' => $getKeyFromFirstArgument, 'GETRANGE' => $getKeyFromFirstArgument, 'GETSET' => $getKeyFromFirstArgument, 'INCR' => $getKeyFromFirstArgument, 'INCRBY' => $getKeyFromFirstArgument, 'INCRBYFLOAT' => $getKeyFromFirstArgument, 'SETBIT' => $getKeyFromFirstArgument, 'SETEX' => $getKeyFromFirstArgument, 'MSET' => array($this, 'getKeyFromInterleavedArguments'), 'MSETNX' => array($this, 'getKeyFromInterleavedArguments'), 'SETNX' => $getKeyFromFirstArgument, 'SETRANGE' => $getKeyFromFirstArgument, 'STRLEN' => $getKeyFromFirstArgument, 'SUBSTR' => $getKeyFromFirstArgument, 'BITOP' => array($this, 'getKeyFromBitOp'), 'BITCOUNT' => $getKeyFromFirstArgument, /* commands operating on lists */ 'LINSERT' => $getKeyFromFirstArgument, 'LINDEX' => $getKeyFromFirstArgument, 'LLEN' => $getKeyFromFirstArgument, 'LPOP' => $getKeyFromFirstArgument, 'RPOP' => $getKeyFromFirstArgument, 'RPOPLPUSH' => $getKeyFromAllArguments, 'BLPOP' => array($this, 'getKeyFromBlockingListCommands'), 'BRPOP' => array($this, 'getKeyFromBlockingListCommands'), 'BRPOPLPUSH' => array($this, 'getKeyFromBlockingListCommands'), 'LPUSH' => $getKeyFromFirstArgument, 'LPUSHX' => $getKeyFromFirstArgument, 'RPUSH' => $getKeyFromFirstArgument, 'RPUSHX' => $getKeyFromFirstArgument, 'LRANGE' => $getKeyFromFirstArgument, 'LREM' => $getKeyFromFirstArgument, 'LSET' => $getKeyFromFirstArgument, 'LTRIM' => $getKeyFromFirstArgument, /* commands operating on sets */ 'SADD' => $getKeyFromFirstArgument, 'SCARD' => $getKeyFromFirstArgument, 'SDIFF' => $getKeyFromAllArguments, 'SDIFFSTORE' => $getKeyFromAllArguments, 'SINTER' => $getKeyFromAllArguments, 'SINTERSTORE' => $getKeyFromAllArguments, 'SUNION' => $getKeyFromAllArguments, 'SUNIONSTORE' => $getKeyFromAllArguments, 'SISMEMBER' => $getKeyFromFirstArgument, 'SMEMBERS' => $getKeyFromFirstArgument, 'SSCAN' => $getKeyFromFirstArgument, 'SPOP' => $getKeyFromFirstArgument, 'SRANDMEMBER' => $getKeyFromFirstArgument, 'SREM' => $getKeyFromFirstArgument, /* commands operating on sorted sets */ 'ZADD' => $getKeyFromFirstArgument, 'ZCARD' => $getKeyFromFirstArgument, 'ZCOUNT' => $getKeyFromFirstArgument, 'ZINCRBY' => $getKeyFromFirstArgument, 'ZINTERSTORE' => array($this, 'getKeyFromZsetAggregationCommands'), 'ZRANGE' => $getKeyFromFirstArgument, 'ZRANGEBYSCORE' => $getKeyFromFirstArgument, 'ZRANK' => $getKeyFromFirstArgument, 'ZREM' => $getKeyFromFirstArgument, 'ZREMRANGEBYRANK' => $getKeyFromFirstArgument, 'ZREMRANGEBYSCORE' => $getKeyFromFirstArgument, 'ZREVRANGE' => $getKeyFromFirstArgument, 'ZREVRANGEBYSCORE' => $getKeyFromFirstArgument, 'ZREVRANK' => $getKeyFromFirstArgument, 'ZSCORE' => $getKeyFromFirstArgument, 'ZUNIONSTORE' => array($this, 'getKeyFromZsetAggregationCommands'), 'ZSCAN' => $getKeyFromFirstArgument, 'ZLEXCOUNT' => $getKeyFromFirstArgument, 'ZRANGEBYLEX' => $getKeyFromFirstArgument, 'ZREMRANGEBYLEX' => $getKeyFromFirstArgument, 'ZREVRANGEBYLEX' => $getKeyFromFirstArgument, /* commands operating on hashes */ 'HDEL' => $getKeyFromFirstArgument, 'HEXISTS' => $getKeyFromFirstArgument, 'HGET' => $getKeyFromFirstArgument, 'HGETALL' => $getKeyFromFirstArgument, 'HMGET' => $getKeyFromFirstArgument, 'HMSET' => $getKeyFromFirstArgument, 'HINCRBY' => $getKeyFromFirstArgument, 'HINCRBYFLOAT' => $getKeyFromFirstArgument, 'HKEYS' => $getKeyFromFirstArgument, 'HLEN' => $getKeyFromFirstArgument, 'HSET' => $getKeyFromFirstArgument, 'HSETNX' => $getKeyFromFirstArgument, 'HVALS' => $getKeyFromFirstArgument, 'HSCAN' => $getKeyFromFirstArgument, 'HSTRLEN' => $getKeyFromFirstArgument, /* commands operating on HyperLogLog */ 'PFADD' => $getKeyFromFirstArgument, 'PFCOUNT' => $getKeyFromAllArguments, 'PFMERGE' => $getKeyFromAllArguments, /* scripting */ 'EVAL' => array($this, 'getKeyFromScriptingCommands'), 'EVALSHA' => array($this, 'getKeyFromScriptingCommands'), ); } /** * Returns the list of IDs for the supported commands. * * @return array */ public function getSupportedCommands() { return array_keys($this->commands); } /** * Sets an handler for the specified command ID. * * The signature of the callback must have a single parameter of type * Predis\Command\CommandInterface. * * When the callback argument is omitted or NULL, the previously associated * handler for the specified command ID is removed. * * @param string $commandID Command ID. * @param mixed $callback A valid callable object, or NULL to unset the handler. * * @throws \InvalidArgumentException */ public function setCommandHandler($commandID, $callback = null) { $commandID = strtoupper($commandID); if (!isset($callback)) { unset($this->commands[$commandID]); return; } if (!is_callable($callback)) { throw new \InvalidArgumentException( 'The argument must be a callable object or NULL.' ); } $this->commands[$commandID] = $callback; } /** * Extracts the key from the first argument of a command instance. * * @param CommandInterface $command Command instance. * * @return string */ protected function getKeyFromFirstArgument(CommandInterface $command) { return $command->getArgument(0); } /** * Extracts the key from a command with multiple keys only when all keys in * the arguments array produce the same hash. * * @param CommandInterface $command Command instance. * * @return string|null */ protected function getKeyFromAllArguments(CommandInterface $command) { $arguments = $command->getArguments(); if ($this->checkSameSlotForKeys($arguments)) { return $arguments[0]; } } /** * Extracts the key from a command with multiple keys only when all keys in * the arguments array produce the same hash. * * @param CommandInterface $command Command instance. * * @return string|null */ protected function getKeyFromInterleavedArguments(CommandInterface $command) { $arguments = $command->getArguments(); $keys = array(); for ($i = 0; $i < count($arguments); $i += 2) { $keys[] = $arguments[$i]; } if ($this->checkSameSlotForKeys($keys)) { return $arguments[0]; } } /** * Extracts the key from BLPOP and BRPOP commands. * * @param CommandInterface $command Command instance. * * @return string|null */ protected function getKeyFromBlockingListCommands(CommandInterface $command) { $arguments = $command->getArguments(); if ($this->checkSameSlotForKeys(array_slice($arguments, 0, count($arguments) - 1))) { return $arguments[0]; } } /** * Extracts the key from BITOP command. * * @param CommandInterface $command Command instance. * * @return string|null */ protected function getKeyFromBitOp(CommandInterface $command) { $arguments = $command->getArguments(); if ($this->checkSameSlotForKeys(array_slice($arguments, 1, count($arguments)))) { return $arguments[1]; } } /** * Extracts the key from ZINTERSTORE and ZUNIONSTORE commands. * * @param CommandInterface $command Command instance. * * @return string|null */ protected function getKeyFromZsetAggregationCommands(CommandInterface $command) { $arguments = $command->getArguments(); $keys = array_merge(array($arguments[0]), array_slice($arguments, 2, $arguments[1])); if ($this->checkSameSlotForKeys($keys)) { return $arguments[0]; } } /** * Extracts the key from EVAL and EVALSHA commands. * * @param CommandInterface $command Command instance. * * @return string|null */ protected function getKeyFromScriptingCommands(CommandInterface $command) { if ($command instanceof ScriptCommand) { $keys = $command->getKeys(); } else { $keys = array_slice($args = $command->getArguments(), 2, $args[1]); } if ($keys && $this->checkSameSlotForKeys($keys)) { return $keys[0]; } } /** * {@inheritdoc} */ public function getSlot(CommandInterface $command) { $slot = $command->getSlot(); if (!isset($slot) && isset($this->commands[$cmdID = $command->getId()])) { $key = call_user_func($this->commands[$cmdID], $command); if (isset($key)) { $slot = $this->getSlotByKey($key); $command->setSlot($slot); } } return $slot; } /** * Checks if the specified array of keys will generate the same hash. * * @param array $keys Array of keys. * * @return bool */ protected function checkSameSlotForKeys(array $keys) { if (!$count = count($keys)) { return false; } $currentSlot = $this->getSlotByKey($keys[0]); for ($i = 1; $i < $count; ++$i) { $nextSlot = $this->getSlotByKey($keys[$i]); if ($currentSlot !== $nextSlot) { return false; } $currentSlot = $nextSlot; } return true; } /** * Returns only the hashable part of a key (delimited by "{...}"), or the * whole key if a key tag is not found in the string. * * @param string $key A key. * * @return string */ protected function extractKeyTag($key) { if (false !== $start = strpos($key, '{')) { if (false !== ($end = strpos($key, '}', $start)) && $end !== ++$start) { $key = substr($key, $start, $end - $start); } } return $key; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Distributor/000077500000000000000000000000001361462701300275015ustar00rootroot00000000000000DistributorInterface.php000066400000000000000000000035141361462701300342710ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Distributor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster\Distributor; use Predis\Cluster\Hash\HashGeneratorInterface; /** * A distributor implements the logic to automatically distribute keys among * several nodes for client-side sharding. * * @author Daniele Alessandri */ interface DistributorInterface { /** * Adds a node to the distributor with an optional weight. * * @param mixed $node Node object. * @param int $weight Weight for the node. */ public function add($node, $weight = null); /** * Removes a node from the distributor. * * @param mixed $node Node object. */ public function remove($node); /** * Returns the corresponding slot of a node from the distributor using the * computed hash of a key. * * @param mixed $hash * * @return mixed */ public function getSlot($hash); /** * Returns a node from the distributor using its assigned slot ID. * * @param mixed $slot * * @return mixed|null */ public function getBySlot($slot); /** * Returns a node from the distributor using the computed hash of a key. * * @param mixed $hash * * @return mixed */ public function getByHash($hash); /** * Returns a node from the distributor mapping to the specified value. * * @param string $value * * @return mixed */ public function get($value); /** * Returns the underlying hash generator instance. * * @return HashGeneratorInterface */ public function getHashGenerator(); } EmptyRingException.php000066400000000000000000000006701361462701300337330ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Distributor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster\Distributor; /** * Exception class that identifies empty rings. * * @author Daniele Alessandri */ class EmptyRingException extends \Exception { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Distributor/HashRing.php000066400000000000000000000153331361462701300317220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster\Distributor; use Predis\Cluster\Hash\HashGeneratorInterface; /** * This class implements an hashring-based distributor that uses the same * algorithm of memcache to distribute keys in a cluster using client-side * sharding. * * @author Daniele Alessandri * @author Lorenzo Castelli */ class HashRing implements DistributorInterface, HashGeneratorInterface { const DEFAULT_REPLICAS = 128; const DEFAULT_WEIGHT = 100; private $ring; private $ringKeys; private $ringKeysCount; private $replicas; private $nodeHashCallback; private $nodes = array(); /** * @param int $replicas Number of replicas in the ring. * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. */ public function __construct($replicas = self::DEFAULT_REPLICAS, $nodeHashCallback = null) { $this->replicas = $replicas; $this->nodeHashCallback = $nodeHashCallback; } /** * Adds a node to the ring with an optional weight. * * @param mixed $node Node object. * @param int $weight Weight for the node. */ public function add($node, $weight = null) { // In case of collisions in the hashes of the nodes, the node added // last wins, thus the order in which nodes are added is significant. $this->nodes[] = array( 'object' => $node, 'weight' => (int) $weight ?: $this::DEFAULT_WEIGHT, ); $this->reset(); } /** * {@inheritdoc} */ public function remove($node) { // A node is removed by resetting the ring so that it's recreated from // scratch, in order to reassign possible hashes with collisions to the // right node according to the order in which they were added in the // first place. for ($i = 0; $i < count($this->nodes); ++$i) { if ($this->nodes[$i]['object'] === $node) { array_splice($this->nodes, $i, 1); $this->reset(); break; } } } /** * Resets the distributor. */ private function reset() { unset( $this->ring, $this->ringKeys, $this->ringKeysCount ); } /** * Returns the initialization status of the distributor. * * @return bool */ private function isInitialized() { return isset($this->ringKeys); } /** * Calculates the total weight of all the nodes in the distributor. * * @return int */ private function computeTotalWeight() { $totalWeight = 0; foreach ($this->nodes as $node) { $totalWeight += $node['weight']; } return $totalWeight; } /** * Initializes the distributor. */ private function initialize() { if ($this->isInitialized()) { return; } if (!$this->nodes) { throw new EmptyRingException('Cannot initialize an empty hashring.'); } $this->ring = array(); $totalWeight = $this->computeTotalWeight(); $nodesCount = count($this->nodes); foreach ($this->nodes as $node) { $weightRatio = $node['weight'] / $totalWeight; $this->addNodeToRing($this->ring, $node, $nodesCount, $this->replicas, $weightRatio); } ksort($this->ring, SORT_NUMERIC); $this->ringKeys = array_keys($this->ring); $this->ringKeysCount = count($this->ringKeys); } /** * Implements the logic needed to add a node to the hashring. * * @param array $ring Source hashring. * @param mixed $node Node object to be added. * @param int $totalNodes Total number of nodes. * @param int $replicas Number of replicas in the ring. * @param float $weightRatio Weight ratio for the node. */ protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) { $nodeObject = $node['object']; $nodeHash = $this->getNodeHash($nodeObject); $replicas = (int) round($weightRatio * $totalNodes * $replicas); for ($i = 0; $i < $replicas; ++$i) { $key = crc32("$nodeHash:$i"); $ring[$key] = $nodeObject; } } /** * {@inheritdoc} */ protected function getNodeHash($nodeObject) { if (!isset($this->nodeHashCallback)) { return (string) $nodeObject; } return call_user_func($this->nodeHashCallback, $nodeObject); } /** * {@inheritdoc} */ public function hash($value) { return crc32($value); } /** * {@inheritdoc} */ public function getByHash($hash) { return $this->ring[$this->getSlot($hash)]; } /** * {@inheritdoc} */ public function getBySlot($slot) { $this->initialize(); if (isset($this->ring[$slot])) { return $this->ring[$slot]; } } /** * {@inheritdoc} */ public function getSlot($hash) { $this->initialize(); $ringKeys = $this->ringKeys; $upper = $this->ringKeysCount - 1; $lower = 0; while ($lower <= $upper) { $index = ($lower + $upper) >> 1; $item = $ringKeys[$index]; if ($item > $hash) { $upper = $index - 1; } elseif ($item < $hash) { $lower = $index + 1; } else { return $item; } } return $ringKeys[$this->wrapAroundStrategy($upper, $lower, $this->ringKeysCount)]; } /** * {@inheritdoc} */ public function get($value) { $hash = $this->hash($value); $node = $this->getByHash($hash); return $node; } /** * Implements a strategy to deal with wrap-around errors during binary searches. * * @param int $upper * @param int $lower * @param int $ringKeysCount * * @return int */ protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) { // Binary search for the last item in ringkeys with a value less or // equal to the key. If no such item exists, return the last item. return $upper >= 0 ? $upper : $ringKeysCount - 1; } /** * {@inheritdoc} */ public function getHashGenerator() { return $this; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Distributor/KetamaRing.php000066400000000000000000000036061361462701300322410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster\Distributor; /** * This class implements an hashring-based distributor that uses the same * algorithm of libketama to distribute keys in a cluster using client-side * sharding. * * @author Daniele Alessandri * @author Lorenzo Castelli */ class KetamaRing extends HashRing { const DEFAULT_REPLICAS = 160; /** * @param mixed $nodeHashCallback Callback returning a string used to calculate the hash of nodes. */ public function __construct($nodeHashCallback = null) { parent::__construct($this::DEFAULT_REPLICAS, $nodeHashCallback); } /** * {@inheritdoc} */ protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio) { $nodeObject = $node['object']; $nodeHash = $this->getNodeHash($nodeObject); $replicas = (int) floor($weightRatio * $totalNodes * ($replicas / 4)); for ($i = 0; $i < $replicas; ++$i) { $unpackedDigest = unpack('V4', md5("$nodeHash-$i", true)); foreach ($unpackedDigest as $key) { $ring[$key] = $nodeObject; } } } /** * {@inheritdoc} */ public function hash($value) { $hash = unpack('V', md5($value, true)); return $hash[1]; } /** * {@inheritdoc} */ protected function wrapAroundStrategy($upper, $lower, $ringKeysCount) { // Binary search for the first item in ringkeys with a value greater // or equal to the key. If no such item exists, return the first item. return $lower < $ringKeysCount ? $lower : 0; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Hash/000077500000000000000000000000001361462701300260525ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Hash/CRC16.php000066400000000000000000000061611361462701300273450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster\Hash; /** * Hash generator implementing the CRC-CCITT-16 algorithm used by redis-cluster. * * @author Daniele Alessandri */ class CRC16 implements HashGeneratorInterface { private static $CCITT_16 = array( 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, ); /** * {@inheritdoc} */ public function hash($value) { // CRC-CCITT-16 algorithm $crc = 0; $CCITT_16 = self::$CCITT_16; $strlen = strlen($value); for ($i = 0; $i < $strlen; ++$i) { $crc = (($crc << 8) ^ $CCITT_16[($crc >> 8) ^ ord($value[$i])]) & 0xFFFF; } return $crc; } } HashGeneratorInterface.php000066400000000000000000000012641361462701300330620ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/Hash * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster\Hash; /** * An hash generator implements the logic used to calculate the hash of a key to * distribute operations among Redis nodes. * * @author Daniele Alessandri */ interface HashGeneratorInterface { /** * Generates an hash from a string to be used for distribution. * * @param string $value String value. * * @return int */ public function hash($value); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/PredisStrategy.php000066400000000000000000000032741361462701300306570ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster; use Predis\Cluster\Distributor\DistributorInterface; use Predis\Cluster\Distributor\HashRing; /** * Default cluster strategy used by Predis to handle client-side sharding. * * @author Daniele Alessandri */ class PredisStrategy extends ClusterStrategy { protected $distributor; /** * @param DistributorInterface $distributor Optional distributor instance. */ public function __construct(DistributorInterface $distributor = null) { parent::__construct(); $this->distributor = $distributor ?: new HashRing(); } /** * {@inheritdoc} */ public function getSlotByKey($key) { $key = $this->extractKeyTag($key); $hash = $this->distributor->hash($key); $slot = $this->distributor->getSlot($hash); return $slot; } /** * {@inheritdoc} */ protected function checkSameSlotForKeys(array $keys) { if (!$count = count($keys)) { return false; } $currentKey = $this->extractKeyTag($keys[0]); for ($i = 1; $i < $count; ++$i) { $nextKey = $this->extractKeyTag($keys[$i]); if ($currentKey !== $nextKey) { return false; } $currentKey = $nextKey; } return true; } /** * {@inheritdoc} */ public function getDistributor() { return $this->distributor; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/RedisStrategy.php000066400000000000000000000024731361462701300304770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster; use Predis\Cluster\Hash\CRC16; use Predis\Cluster\Hash\HashGeneratorInterface; use Predis\NotSupportedException; /** * Default class used by Predis to calculate hashes out of keys of * commands supported by redis-cluster. * * @author Daniele Alessandri */ class RedisStrategy extends ClusterStrategy { protected $hashGenerator; /** * @param HashGeneratorInterface $hashGenerator Hash generator instance. */ public function __construct(HashGeneratorInterface $hashGenerator = null) { parent::__construct(); $this->hashGenerator = $hashGenerator ?: new CRC16(); } /** * {@inheritdoc} */ public function getSlotByKey($key) { $key = $this->extractKeyTag($key); $slot = $this->hashGenerator->hash($key) & 0x3FFF; return $slot; } /** * {@inheritdoc} */ public function getDistributor() { throw new NotSupportedException( 'This cluster strategy does not provide an external distributor' ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Cluster/StrategyInterface.php000066400000000000000000000024761361462701300313340ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Cluster; use Predis\Cluster\Distributor\DistributorInterface; use Predis\Command\CommandInterface; /** * Interface for classes defining the strategy used to calculate an hash out of * keys extracted from supported commands. * * This is mostly useful to support clustering via client-side sharding. * * @author Daniele Alessandri */ interface StrategyInterface { /** * Returns a slot for the given command used for clustering distribution or * NULL when this is not possible. * * @param CommandInterface $command Command instance. * * @return int */ public function getSlot(CommandInterface $command); /** * Returns a slot for the given key used for clustering distribution or NULL * when this is not possible. * * @param string $key Key string. * * @return int */ public function getSlotByKey($key); /** * Returns a distributor instance to be used by the cluster. * * @return DistributorInterface */ public function getDistributor(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/000077500000000000000000000000001361462701300256415ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/Iterator/000077500000000000000000000000001361462701300274325ustar00rootroot00000000000000CursorBasedIterator.php000066400000000000000000000107341361462701300340170ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/Iterator * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Collection\Iterator; use Predis\ClientInterface; use Predis\NotSupportedException; /** * Provides the base implementation for a fully-rewindable PHP iterator that can * incrementally iterate over cursor-based collections stored on Redis using the * commands in the `SCAN` family. * * Given their incremental nature with multiple fetches, these kind of iterators * offer limited guarantees about the returned elements because the collection * can change several times during the iteration process. * * @see http://redis.io/commands/scan * * @author Daniele Alessandri */ abstract class CursorBasedIterator implements \Iterator { protected $client; protected $match; protected $count; protected $valid; protected $fetchmore; protected $elements; protected $cursor; protected $position; protected $current; /** * @param ClientInterface $client Client connected to Redis. * @param string $match Pattern to match during the server-side iteration. * @param int $count Hint used by Redis to compute the number of results per iteration. */ public function __construct(ClientInterface $client, $match = null, $count = null) { $this->client = $client; $this->match = $match; $this->count = $count; $this->reset(); } /** * Ensures that the client supports the specified Redis command required to * fetch elements from the server to perform the iteration. * * @param ClientInterface $client Client connected to Redis. * @param string $commandID Command ID. * * @throws NotSupportedException */ protected function requiredCommand(ClientInterface $client, $commandID) { if (!$client->getProfile()->supportsCommand($commandID)) { throw new NotSupportedException("The current profile does not support '$commandID'."); } } /** * Resets the inner state of the iterator. */ protected function reset() { $this->valid = true; $this->fetchmore = true; $this->elements = array(); $this->cursor = 0; $this->position = -1; $this->current = null; } /** * Returns an array of options for the `SCAN` command. * * @return array */ protected function getScanOptions() { $options = array(); if (strlen($this->match) > 0) { $options['MATCH'] = $this->match; } if ($this->count > 0) { $options['COUNT'] = $this->count; } return $options; } /** * Fetches a new set of elements from the remote collection, effectively * advancing the iteration process. * * @return array */ abstract protected function executeCommand(); /** * Populates the local buffer of elements fetched from the server during * the iteration. */ protected function fetch() { list($cursor, $elements) = $this->executeCommand(); if (!$cursor) { $this->fetchmore = false; } $this->cursor = $cursor; $this->elements = $elements; } /** * Extracts next values for key() and current(). */ protected function extractNext() { ++$this->position; $this->current = array_shift($this->elements); } /** * {@inheritdoc} */ public function rewind() { $this->reset(); $this->next(); } /** * {@inheritdoc} */ public function current() { return $this->current; } /** * {@inheritdoc} */ public function key() { return $this->position; } /** * {@inheritdoc} */ public function next() { tryFetch: { if (!$this->elements && $this->fetchmore) { $this->fetch(); } if ($this->elements) { $this->extractNext(); } elseif ($this->cursor) { goto tryFetch; } else { $this->valid = false; } } } /** * {@inheritdoc} */ public function valid() { return $this->valid; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/Iterator/HashKey.php000066400000000000000000000023771361462701300315100ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Collection\Iterator; use Predis\ClientInterface; /** * Abstracts the iteration of fields and values of an hash by leveraging the * HSCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. * * @author Daniele Alessandri * * @link http://redis.io/commands/scan */ class HashKey extends CursorBasedIterator { protected $key; /** * {@inheritdoc} */ public function __construct(ClientInterface $client, $key, $match = null, $count = null) { $this->requiredCommand($client, 'HSCAN'); parent::__construct($client, $match, $count); $this->key = $key; } /** * {@inheritdoc} */ protected function executeCommand() { return $this->client->hscan($this->key, $this->cursor, $this->getScanOptions()); } /** * {@inheritdoc} */ protected function extractNext() { $this->position = key($this->elements); $this->current = array_shift($this->elements); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/Iterator/Keyspace.php000066400000000000000000000020001361462701300316770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Collection\Iterator; use Predis\ClientInterface; /** * Abstracts the iteration of the keyspace on a Redis instance by leveraging the * SCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. * * @author Daniele Alessandri * * @link http://redis.io/commands/scan */ class Keyspace extends CursorBasedIterator { /** * {@inheritdoc} */ public function __construct(ClientInterface $client, $match = null, $count = null) { $this->requiredCommand($client, 'SCAN'); parent::__construct($client, $match, $count); } /** * {@inheritdoc} */ protected function executeCommand() { return $this->client->scan($this->cursor, $this->getScanOptions()); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/Iterator/ListKey.php000066400000000000000000000104651361462701300315350ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Collection\Iterator; use Predis\ClientInterface; use Predis\NotSupportedException; /** * Abstracts the iteration of items stored in a list by leveraging the LRANGE * command wrapped in a fully-rewindable PHP iterator. * * This iterator tries to emulate the behaviour of cursor-based iterators based * on the SCAN-family of commands introduced in Redis <= 2.8, meaning that due * to its incremental nature with multiple fetches it can only offer limited * guarantees on the returned elements because the collection can change several * times (trimmed, deleted, overwritten) during the iteration process. * * @author Daniele Alessandri * * @link http://redis.io/commands/lrange */ class ListKey implements \Iterator { protected $client; protected $count; protected $key; protected $valid; protected $fetchmore; protected $elements; protected $position; protected $current; /** * @param ClientInterface $client Client connected to Redis. * @param string $key Redis list key. * @param int $count Number of items retrieved on each fetch operation. * * @throws \InvalidArgumentException */ public function __construct(ClientInterface $client, $key, $count = 10) { $this->requiredCommand($client, 'LRANGE'); if ((false === $count = filter_var($count, FILTER_VALIDATE_INT)) || $count < 0) { throw new \InvalidArgumentException('The $count argument must be a positive integer.'); } $this->client = $client; $this->key = $key; $this->count = $count; $this->reset(); } /** * Ensures that the client instance supports the specified Redis command * required to fetch elements from the server to perform the iteration. * * @param ClientInterface $client Client connected to Redis. * @param string $commandID Command ID. * * @throws NotSupportedException */ protected function requiredCommand(ClientInterface $client, $commandID) { if (!$client->getProfile()->supportsCommand($commandID)) { throw new NotSupportedException("The current profile does not support '$commandID'."); } } /** * Resets the inner state of the iterator. */ protected function reset() { $this->valid = true; $this->fetchmore = true; $this->elements = array(); $this->position = -1; $this->current = null; } /** * Fetches a new set of elements from the remote collection, effectively * advancing the iteration process. * * @return array */ protected function executeCommand() { return $this->client->lrange($this->key, $this->position + 1, $this->position + $this->count); } /** * Populates the local buffer of elements fetched from the server during the * iteration. */ protected function fetch() { $elements = $this->executeCommand(); if (count($elements) < $this->count) { $this->fetchmore = false; } $this->elements = $elements; } /** * Extracts next values for key() and current(). */ protected function extractNext() { ++$this->position; $this->current = array_shift($this->elements); } /** * {@inheritdoc} */ public function rewind() { $this->reset(); $this->next(); } /** * {@inheritdoc} */ public function current() { return $this->current; } /** * {@inheritdoc} */ public function key() { return $this->position; } /** * {@inheritdoc} */ public function next() { if (!$this->elements && $this->fetchmore) { $this->fetch(); } if ($this->elements) { $this->extractNext(); } else { $this->valid = false; } } /** * {@inheritdoc} */ public function valid() { return $this->valid; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/Iterator/SetKey.php000066400000000000000000000020731361462701300313510ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Collection\Iterator; use Predis\ClientInterface; /** * Abstracts the iteration of members stored in a set by leveraging the SSCAN * command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. * * @author Daniele Alessandri * * @link http://redis.io/commands/scan */ class SetKey extends CursorBasedIterator { protected $key; /** * {@inheritdoc} */ public function __construct(ClientInterface $client, $key, $match = null, $count = null) { $this->requiredCommand($client, 'SSCAN'); parent::__construct($client, $match, $count); $this->key = $key; } /** * {@inheritdoc} */ protected function executeCommand() { return $this->client->sscan($this->key, $this->cursor, $this->getScanOptions()); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Collection/Iterator/SortedSetKey.php000066400000000000000000000025251361462701300325340ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Collection\Iterator; use Predis\ClientInterface; /** * Abstracts the iteration of members stored in a sorted set by leveraging the * ZSCAN command (Redis >= 2.8) wrapped in a fully-rewindable PHP iterator. * * @author Daniele Alessandri * * @link http://redis.io/commands/scan */ class SortedSetKey extends CursorBasedIterator { protected $key; /** * {@inheritdoc} */ public function __construct(ClientInterface $client, $key, $match = null, $count = null) { $this->requiredCommand($client, 'ZSCAN'); parent::__construct($client, $match, $count); $this->key = $key; } /** * {@inheritdoc} */ protected function executeCommand() { return $this->client->zscan($this->key, $this->cursor, $this->getScanOptions()); } /** * {@inheritdoc} */ protected function extractNext() { if ($kv = each($this->elements)) { $this->position = $kv[0]; $this->current = $kv[1]; unset($this->elements[$this->position]); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/000077500000000000000000000000001361462701300251245ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/Command.php000066400000000000000000000050431361462701300272150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * Base class for Redis commands. * * @author Daniele Alessandri */ abstract class Command implements CommandInterface { private $slot; private $arguments = array(); /** * Returns a filtered array of the arguments. * * @param array $arguments List of arguments. * * @return array */ protected function filterArguments(array $arguments) { return $arguments; } /** * {@inheritdoc} */ public function setArguments(array $arguments) { $this->arguments = $this->filterArguments($arguments); unset($this->slot); } /** * {@inheritdoc} */ public function setRawArguments(array $arguments) { $this->arguments = $arguments; unset($this->slot); } /** * {@inheritdoc} */ public function getArguments() { return $this->arguments; } /** * {@inheritdoc} */ public function getArgument($index) { if (isset($this->arguments[$index])) { return $this->arguments[$index]; } } /** * {@inheritdoc} */ public function setSlot($slot) { $this->slot = $slot; } /** * {@inheritdoc} */ public function getSlot() { if (isset($this->slot)) { return $this->slot; } } /** * {@inheritdoc} */ public function parseResponse($data) { return $data; } /** * Normalizes the arguments array passed to a Redis command. * * @param array $arguments Arguments for a command. * * @return array */ public static function normalizeArguments(array $arguments) { if (count($arguments) === 1 && is_array($arguments[0])) { return $arguments[0]; } return $arguments; } /** * Normalizes the arguments array passed to a variadic Redis command. * * @param array $arguments Arguments for a command. * * @return array */ public static function normalizeVariadic(array $arguments) { if (count($arguments) === 2 && is_array($arguments[1])) { return array_merge(array($arguments[0]), $arguments[1]); } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/CommandInterface.php000066400000000000000000000035061361462701300310400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * Defines an abstraction representing a Redis command. * * @author Daniele Alessandri */ interface CommandInterface { /** * Returns the ID of the Redis command. By convention, command identifiers * must always be uppercase. * * @return string */ public function getId(); /** * Assign the specified slot to the command for clustering distribution. * * @param int $slot Slot ID. */ public function setSlot($slot); /** * Returns the assigned slot of the command for clustering distribution. * * @return int|null */ public function getSlot(); /** * Sets the arguments for the command. * * @param array $arguments List of arguments. */ public function setArguments(array $arguments); /** * Sets the raw arguments for the command without processing them. * * @param array $arguments List of arguments. */ public function setRawArguments(array $arguments); /** * Gets the arguments of the command. * * @return array */ public function getArguments(); /** * Gets the argument of the command at the specified index. * * @param int $index Index of the desired argument. * * @return mixed|null */ public function getArgument($index); /** * Parses a raw response and returns a PHP object. * * @param string $data Binary string containing the whole response. * * @return mixed */ public function parseResponse($data); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ConnectionAuth.php000066400000000000000000000010001361462701300305450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/auth * * @author Daniele Alessandri */ class ConnectionAuth extends Command { /** * {@inheritdoc} */ public function getId() { return 'AUTH'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ConnectionEcho.php000066400000000000000000000010001361462701300305220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/echo * * @author Daniele Alessandri */ class ConnectionEcho extends Command { /** * {@inheritdoc} */ public function getId() { return 'ECHO'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ConnectionPing.php000066400000000000000000000010001361462701300305410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/ping * * @author Daniele Alessandri */ class ConnectionPing extends Command { /** * {@inheritdoc} */ public function getId() { return 'PING'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ConnectionQuit.php000066400000000000000000000010001361462701300305660ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/quit * * @author Daniele Alessandri */ class ConnectionQuit extends Command { /** * {@inheritdoc} */ public function getId() { return 'QUIT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ConnectionSelect.php000066400000000000000000000010061361462701300310710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/select * * @author Daniele Alessandri */ class ConnectionSelect extends Command { /** * {@inheritdoc} */ public function getId() { return 'SELECT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashDelete.php000066400000000000000000000012331361462701300276420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hdel * * @author Daniele Alessandri */ class HashDelete extends Command { /** * {@inheritdoc} */ public function getId() { return 'HDEL'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeVariadic($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashExists.php000066400000000000000000000011721361462701300277210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hexists * * @author Daniele Alessandri */ class HashExists extends Command { /** * {@inheritdoc} */ public function getId() { return 'HEXISTS'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashGet.php000066400000000000000000000007711361462701300271650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hget * * @author Daniele Alessandri */ class HashGet extends Command { /** * {@inheritdoc} */ public function getId() { return 'HGET'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashGetAll.php000066400000000000000000000013721361462701300276140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hgetall * * @author Daniele Alessandri */ class HashGetAll extends Command { /** * {@inheritdoc} */ public function getId() { return 'HGETALL'; } /** * {@inheritdoc} */ public function parseResponse($data) { $result = array(); for ($i = 0; $i < count($data); ++$i) { $result[$data[$i]] = $data[++$i]; } return $result; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashGetMultiple.php000066400000000000000000000012421361462701300306730ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hmget * * @author Daniele Alessandri */ class HashGetMultiple extends Command { /** * {@inheritdoc} */ public function getId() { return 'HMGET'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeVariadic($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashIncrementBy.php000066400000000000000000000010071361462701300306560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hincrby * * @author Daniele Alessandri */ class HashIncrementBy extends Command { /** * {@inheritdoc} */ public function getId() { return 'HINCRBY'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashIncrementByFloat.php000066400000000000000000000010261361462701300316450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hincrbyfloat * * @author Daniele Alessandri */ class HashIncrementByFloat extends Command { /** * {@inheritdoc} */ public function getId() { return 'HINCRBYFLOAT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashKeys.php000066400000000000000000000007741361462701300273640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hkeys * * @author Daniele Alessandri */ class HashKeys extends Command { /** * {@inheritdoc} */ public function getId() { return 'HKEYS'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashLength.php000066400000000000000000000007741361462701300276720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hlen * * @author Daniele Alessandri */ class HashLength extends Command { /** * {@inheritdoc} */ public function getId() { return 'HLEN'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashScan.php000066400000000000000000000034661361462701300273360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hscan * * @author Daniele Alessandri */ class HashScan extends Command { /** * {@inheritdoc} */ public function getId() { return 'HSCAN'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 3 && is_array($arguments[2])) { $options = $this->prepareOptions(array_pop($arguments)); $arguments = array_merge($arguments, $options); } return $arguments; } /** * Returns a list of options and modifiers compatible with Redis. * * @param array $options List of options. * * @return array */ protected function prepareOptions($options) { $options = array_change_key_case($options, CASE_UPPER); $normalized = array(); if (!empty($options['MATCH'])) { $normalized[] = 'MATCH'; $normalized[] = $options['MATCH']; } if (!empty($options['COUNT'])) { $normalized[] = 'COUNT'; $normalized[] = $options['COUNT']; } return $normalized; } /** * {@inheritdoc} */ public function parseResponse($data) { if (is_array($data)) { $fields = $data[1]; $result = array(); for ($i = 0; $i < count($fields); ++$i) { $result[$fields[$i]] = $fields[++$i]; } $data[1] = $result; } return $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashSet.php000066400000000000000000000011611361462701300271730ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hset * * @author Daniele Alessandri */ class HashSet extends Command { /** * {@inheritdoc} */ public function getId() { return 'HSET'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashSetMultiple.php000066400000000000000000000017231361462701300307130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hmset * * @author Daniele Alessandri */ class HashSetMultiple extends Command { /** * {@inheritdoc} */ public function getId() { return 'HMSET'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 2 && is_array($arguments[1])) { $flattenedKVs = array($arguments[0]); $args = $arguments[1]; foreach ($args as $k => $v) { $flattenedKVs[] = $k; $flattenedKVs[] = $v; } return $flattenedKVs; } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashSetPreserve.php000066400000000000000000000011751361462701300307140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hsetnx * * @author Daniele Alessandri */ class HashSetPreserve extends Command { /** * {@inheritdoc} */ public function getId() { return 'HSETNX'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashStringLength.php000066400000000000000000000010101361462701300310410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hstrlen * * @author Daniele Alessandri */ class HashStringLength extends Command { /** * {@inheritdoc} */ public function getId() { return 'HSTRLEN'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HashValues.php000066400000000000000000000007761361462701300277120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/hvals * * @author Daniele Alessandri */ class HashValues extends Command { /** * {@inheritdoc} */ public function getId() { return 'HVALS'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HyperLogLogAdd.php000066400000000000000000000014311361462701300304400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/pfadd * * @author Daniele Alessandri */ class HyperLogLogAdd extends Command { /** * {@inheritdoc} */ public function getId() { return 'PFADD'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeVariadic($arguments); } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HyperLogLogCount.php000066400000000000000000000012501361462701300310370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/pfcount * * @author Daniele Alessandri */ class HyperLogLogCount extends Command { /** * {@inheritdoc} */ public function getId() { return 'PFCOUNT'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeArguments($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/HyperLogLogMerge.php000066400000000000000000000012501361462701300310060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/pfmerge * * @author Daniele Alessandri */ class HyperLogLogMerge extends Command { /** * {@inheritdoc} */ public function getId() { return 'PFMERGE'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeArguments($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyDelete.php000066400000000000000000000012311361462701300275050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/del * * @author Daniele Alessandri */ class KeyDelete extends Command { /** * {@inheritdoc} */ public function getId() { return 'DEL'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeArguments($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyDump.php000066400000000000000000000007711361462701300272200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/dump * * @author Daniele Alessandri */ class KeyDump extends Command { /** * {@inheritdoc} */ public function getId() { return 'DUMP'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyExists.php000066400000000000000000000011671361462701300275720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/exists * * @author Daniele Alessandri */ class KeyExists extends Command { /** * {@inheritdoc} */ public function getId() { return 'EXISTS'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyExpire.php000066400000000000000000000011671361462701300275470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/expire * * @author Daniele Alessandri */ class KeyExpire extends Command { /** * {@inheritdoc} */ public function getId() { return 'EXPIRE'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyExpireAt.php000066400000000000000000000011751361462701300300330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/expireat * * @author Daniele Alessandri */ class KeyExpireAt extends Command { /** * {@inheritdoc} */ public function getId() { return 'EXPIREAT'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyKeys.php000066400000000000000000000007711361462701300272260ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/keys * * @author Daniele Alessandri */ class KeyKeys extends Command { /** * {@inheritdoc} */ public function getId() { return 'KEYS'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyMigrate.php000066400000000000000000000021031361462701300276720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/migrate * * @author Daniele Alessandri */ class KeyMigrate extends Command { /** * {@inheritdoc} */ public function getId() { return 'MIGRATE'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (is_array(end($arguments))) { foreach (array_pop($arguments) as $modifier => $value) { $modifier = strtoupper($modifier); if ($modifier === 'COPY' && $value == true) { $arguments[] = $modifier; } if ($modifier === 'REPLACE' && $value == true) { $arguments[] = $modifier; } } } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyMove.php000066400000000000000000000011611361462701300272130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/move * * @author Daniele Alessandri */ class KeyMove extends Command { /** * {@inheritdoc} */ public function getId() { return 'MOVE'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyPersist.php000066400000000000000000000011721361462701300277400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/persist * * @author Daniele Alessandri */ class KeyPersist extends Command { /** * {@inheritdoc} */ public function getId() { return 'PERSIST'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyPreciseExpire.php000066400000000000000000000010121361462701300310470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/pexpire * * @author Daniele Alessandri */ class KeyPreciseExpire extends KeyExpire { /** * {@inheritdoc} */ public function getId() { return 'PEXPIRE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyPreciseExpireAt.php000066400000000000000000000010221361462701300313350ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/pexpireat * * @author Daniele Alessandri */ class KeyPreciseExpireAt extends KeyExpireAt { /** * {@inheritdoc} */ public function getId() { return 'PEXPIREAT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyPreciseTimeToLive.php000066400000000000000000000010141361462701300316360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/pttl * * @author Daniele Alessandri */ class KeyPreciseTimeToLive extends KeyTimeToLive { /** * {@inheritdoc} */ public function getId() { return 'PTTL'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyRandom.php000066400000000000000000000012141361462701300275240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/randomkey * * @author Daniele Alessandri */ class KeyRandom extends Command { /** * {@inheritdoc} */ public function getId() { return 'RANDOMKEY'; } /** * {@inheritdoc} */ public function parseResponse($data) { return $data !== '' ? $data : null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyRename.php000066400000000000000000000007771361462701300275300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/rename * * @author Daniele Alessandri */ class KeyRename extends Command { /** * {@inheritdoc} */ public function getId() { return 'RENAME'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyRenamePreserve.php000066400000000000000000000012051361462701300312270ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/renamenx * * @author Daniele Alessandri */ class KeyRenamePreserve extends KeyRename { /** * {@inheritdoc} */ public function getId() { return 'RENAMENX'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyRestore.php000066400000000000000000000010021361462701300277220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/restore * * @author Daniele Alessandri */ class KeyRestore extends Command { /** * {@inheritdoc} */ public function getId() { return 'RESTORE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyScan.php000066400000000000000000000026751361462701300272040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/scan * * @author Daniele Alessandri */ class KeyScan extends Command { /** * {@inheritdoc} */ public function getId() { return 'SCAN'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 2 && is_array($arguments[1])) { $options = $this->prepareOptions(array_pop($arguments)); $arguments = array_merge($arguments, $options); } return $arguments; } /** * Returns a list of options and modifiers compatible with Redis. * * @param array $options List of options. * * @return array */ protected function prepareOptions($options) { $options = array_change_key_case($options, CASE_UPPER); $normalized = array(); if (!empty($options['MATCH'])) { $normalized[] = 'MATCH'; $normalized[] = $options['MATCH']; } if (!empty($options['COUNT'])) { $normalized[] = 'COUNT'; $normalized[] = $options['COUNT']; } return $normalized; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeySort.php000066400000000000000000000036601361462701300272420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sort * * @author Daniele Alessandri */ class KeySort extends Command { /** * {@inheritdoc} */ public function getId() { return 'SORT'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 1) { return $arguments; } $query = array($arguments[0]); $sortParams = array_change_key_case($arguments[1], CASE_UPPER); if (isset($sortParams['BY'])) { $query[] = 'BY'; $query[] = $sortParams['BY']; } if (isset($sortParams['GET'])) { $getargs = $sortParams['GET']; if (is_array($getargs)) { foreach ($getargs as $getarg) { $query[] = 'GET'; $query[] = $getarg; } } else { $query[] = 'GET'; $query[] = $getargs; } } if (isset($sortParams['LIMIT']) && is_array($sortParams['LIMIT']) && count($sortParams['LIMIT']) == 2) { $query[] = 'LIMIT'; $query[] = $sortParams['LIMIT'][0]; $query[] = $sortParams['LIMIT'][1]; } if (isset($sortParams['SORT'])) { $query[] = strtoupper($sortParams['SORT']); } if (isset($sortParams['ALPHA']) && $sortParams['ALPHA'] == true) { $query[] = 'ALPHA'; } if (isset($sortParams['STORE'])) { $query[] = 'STORE'; $query[] = $sortParams['STORE']; } return $query; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyTimeToLive.php000066400000000000000000000007751361462701300303400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/ttl * * @author Daniele Alessandri */ class KeyTimeToLive extends Command { /** * {@inheritdoc} */ public function getId() { return 'TTL'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/KeyType.php000066400000000000000000000007711361462701300272340ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/type * * @author Daniele Alessandri */ class KeyType extends Command { /** * {@inheritdoc} */ public function getId() { return 'TYPE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListIndex.php000066400000000000000000000007771361462701300275530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lindex * * @author Daniele Alessandri */ class ListIndex extends Command { /** * {@inheritdoc} */ public function getId() { return 'LINDEX'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListInsert.php000066400000000000000000000010021361462701300277260ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/linsert * * @author Daniele Alessandri */ class ListInsert extends Command { /** * {@inheritdoc} */ public function getId() { return 'LINSERT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListLength.php000066400000000000000000000007741361462701300277220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/llen * * @author Daniele Alessandri */ class ListLength extends Command { /** * {@inheritdoc} */ public function getId() { return 'LLEN'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPopFirst.php000066400000000000000000000007761361462701300302510ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lpop * * @author Daniele Alessandri */ class ListPopFirst extends Command { /** * {@inheritdoc} */ public function getId() { return 'LPOP'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPopFirstBlocking.php000066400000000000000000000014761361462701300317200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/blpop * * @author Daniele Alessandri */ class ListPopFirstBlocking extends Command { /** * {@inheritdoc} */ public function getId() { return 'BLPOP'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 2 && is_array($arguments[0])) { list($arguments, $timeout) = $arguments; array_push($arguments, $timeout); } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPopLast.php000066400000000000000000000007751361462701300300640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/rpop * * @author Daniele Alessandri */ class ListPopLast extends Command { /** * {@inheritdoc} */ public function getId() { return 'RPOP'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPopLastBlocking.php000066400000000000000000000010241361462701300315210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/brpop * * @author Daniele Alessandri */ class ListPopLastBlocking extends ListPopFirstBlocking { /** * {@inheritdoc} */ public function getId() { return 'BRPOP'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPopLastPushHead.php000066400000000000000000000010171361462701300314740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/rpoplpush * * @author Daniele Alessandri */ class ListPopLastPushHead extends Command { /** * {@inheritdoc} */ public function getId() { return 'RPOPLPUSH'; } } ListPopLastPushHeadBlocking.php000066400000000000000000000010311361462701300330620ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/brpoplpush * * @author Daniele Alessandri */ class ListPopLastPushHeadBlocking extends Command { /** * {@inheritdoc} */ public function getId() { return 'BRPOPLPUSH'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPushHead.php000066400000000000000000000010051361462701300301660ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lpush * * @author Daniele Alessandri */ class ListPushHead extends ListPushTail { /** * {@inheritdoc} */ public function getId() { return 'LPUSH'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPushHeadX.php000066400000000000000000000010031361462701300303140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lpushx * * @author Daniele Alessandri */ class ListPushHeadX extends Command { /** * {@inheritdoc} */ public function getId() { return 'LPUSHX'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPushTail.php000066400000000000000000000012371361462701300302250ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/rpush * * @author Daniele Alessandri */ class ListPushTail extends Command { /** * {@inheritdoc} */ public function getId() { return 'RPUSH'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeVariadic($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListPushTailX.php000066400000000000000000000010031361462701300303440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/rpushx * * @author Daniele Alessandri */ class ListPushTailX extends Command { /** * {@inheritdoc} */ public function getId() { return 'RPUSHX'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListRange.php000066400000000000000000000007771361462701300275400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lrange * * @author Daniele Alessandri */ class ListRange extends Command { /** * {@inheritdoc} */ public function getId() { return 'LRANGE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListRemove.php000066400000000000000000000007741361462701300277360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lrem * * @author Daniele Alessandri */ class ListRemove extends Command { /** * {@inheritdoc} */ public function getId() { return 'LREM'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListSet.php000066400000000000000000000007711361462701300272310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lset * * @author Daniele Alessandri */ class ListSet extends Command { /** * {@inheritdoc} */ public function getId() { return 'LSET'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ListTrim.php000066400000000000000000000007741361462701300274140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/ltrim * * @author Daniele Alessandri */ class ListTrim extends Command { /** * {@inheritdoc} */ public function getId() { return 'LTRIM'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/PrefixableCommandInterface.php000066400000000000000000000012001361462701300330270ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * Defines a command whose keys can be prefixed. * * @author Daniele Alessandri */ interface PrefixableCommandInterface extends CommandInterface { /** * Prefixes all the keys found in the arguments of the command. * * @param string $prefix String used to prefix the keys. */ public function prefixKeys($prefix); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/Processor/000077500000000000000000000000001361462701300271035ustar00rootroot00000000000000KeyPrefixProcessor.php000066400000000000000000000326051361462701300333510ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/Processor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command\Processor; use Predis\Command\CommandInterface; use Predis\Command\PrefixableCommandInterface; /** * Command processor capable of prefixing keys stored in the arguments of Redis * commands supported. * * @author Daniele Alessandri */ class KeyPrefixProcessor implements ProcessorInterface { private $prefix; private $commands; /** * @param string $prefix Prefix for the keys. */ public function __construct($prefix) { $this->prefix = $prefix; $this->commands = array( /* ---------------- Redis 1.2 ---------------- */ 'EXISTS' => 'static::first', 'DEL' => 'static::all', 'TYPE' => 'static::first', 'KEYS' => 'static::first', 'RENAME' => 'static::all', 'RENAMENX' => 'static::all', 'EXPIRE' => 'static::first', 'EXPIREAT' => 'static::first', 'TTL' => 'static::first', 'MOVE' => 'static::first', 'SORT' => 'static::sort', 'DUMP' => 'static::first', 'RESTORE' => 'static::first', 'SET' => 'static::first', 'SETNX' => 'static::first', 'MSET' => 'static::interleaved', 'MSETNX' => 'static::interleaved', 'GET' => 'static::first', 'MGET' => 'static::all', 'GETSET' => 'static::first', 'INCR' => 'static::first', 'INCRBY' => 'static::first', 'DECR' => 'static::first', 'DECRBY' => 'static::first', 'RPUSH' => 'static::first', 'LPUSH' => 'static::first', 'LLEN' => 'static::first', 'LRANGE' => 'static::first', 'LTRIM' => 'static::first', 'LINDEX' => 'static::first', 'LSET' => 'static::first', 'LREM' => 'static::first', 'LPOP' => 'static::first', 'RPOP' => 'static::first', 'RPOPLPUSH' => 'static::all', 'SADD' => 'static::first', 'SREM' => 'static::first', 'SPOP' => 'static::first', 'SMOVE' => 'static::skipLast', 'SCARD' => 'static::first', 'SISMEMBER' => 'static::first', 'SINTER' => 'static::all', 'SINTERSTORE' => 'static::all', 'SUNION' => 'static::all', 'SUNIONSTORE' => 'static::all', 'SDIFF' => 'static::all', 'SDIFFSTORE' => 'static::all', 'SMEMBERS' => 'static::first', 'SRANDMEMBER' => 'static::first', 'ZADD' => 'static::first', 'ZINCRBY' => 'static::first', 'ZREM' => 'static::first', 'ZRANGE' => 'static::first', 'ZREVRANGE' => 'static::first', 'ZRANGEBYSCORE' => 'static::first', 'ZCARD' => 'static::first', 'ZSCORE' => 'static::first', 'ZREMRANGEBYSCORE' => 'static::first', /* ---------------- Redis 2.0 ---------------- */ 'SETEX' => 'static::first', 'APPEND' => 'static::first', 'SUBSTR' => 'static::first', 'BLPOP' => 'static::skipLast', 'BRPOP' => 'static::skipLast', 'ZUNIONSTORE' => 'static::zsetStore', 'ZINTERSTORE' => 'static::zsetStore', 'ZCOUNT' => 'static::first', 'ZRANK' => 'static::first', 'ZREVRANK' => 'static::first', 'ZREMRANGEBYRANK' => 'static::first', 'HSET' => 'static::first', 'HSETNX' => 'static::first', 'HMSET' => 'static::first', 'HINCRBY' => 'static::first', 'HGET' => 'static::first', 'HMGET' => 'static::first', 'HDEL' => 'static::first', 'HEXISTS' => 'static::first', 'HLEN' => 'static::first', 'HKEYS' => 'static::first', 'HVALS' => 'static::first', 'HGETALL' => 'static::first', 'SUBSCRIBE' => 'static::all', 'UNSUBSCRIBE' => 'static::all', 'PSUBSCRIBE' => 'static::all', 'PUNSUBSCRIBE' => 'static::all', 'PUBLISH' => 'static::first', /* ---------------- Redis 2.2 ---------------- */ 'PERSIST' => 'static::first', 'STRLEN' => 'static::first', 'SETRANGE' => 'static::first', 'GETRANGE' => 'static::first', 'SETBIT' => 'static::first', 'GETBIT' => 'static::first', 'RPUSHX' => 'static::first', 'LPUSHX' => 'static::first', 'LINSERT' => 'static::first', 'BRPOPLPUSH' => 'static::skipLast', 'ZREVRANGEBYSCORE' => 'static::first', 'WATCH' => 'static::all', /* ---------------- Redis 2.6 ---------------- */ 'PTTL' => 'static::first', 'PEXPIRE' => 'static::first', 'PEXPIREAT' => 'static::first', 'PSETEX' => 'static::first', 'INCRBYFLOAT' => 'static::first', 'BITOP' => 'static::skipFirst', 'BITCOUNT' => 'static::first', 'HINCRBYFLOAT' => 'static::first', 'EVAL' => 'static::evalKeys', 'EVALSHA' => 'static::evalKeys', 'MIGRATE' => 'static::migrate', /* ---------------- Redis 2.8 ---------------- */ 'SSCAN' => 'static::first', 'ZSCAN' => 'static::first', 'HSCAN' => 'static::first', 'PFADD' => 'static::first', 'PFCOUNT' => 'static::all', 'PFMERGE' => 'static::all', 'ZLEXCOUNT' => 'static::first', 'ZRANGEBYLEX' => 'static::first', 'ZREMRANGEBYLEX' => 'static::first', 'ZREVRANGEBYLEX' => 'static::first', 'BITPOS' => 'static::first', /* ---------------- Redis 3.2 ---------------- */ 'HSTRLEN' => 'static::first', ); } /** * Sets a prefix that is applied to all the keys. * * @param string $prefix Prefix for the keys. */ public function setPrefix($prefix) { $this->prefix = $prefix; } /** * Gets the current prefix. * * @return string */ public function getPrefix() { return $this->prefix; } /** * {@inheritdoc} */ public function process(CommandInterface $command) { if ($command instanceof PrefixableCommandInterface) { $command->prefixKeys($this->prefix); } elseif (isset($this->commands[$commandID = strtoupper($command->getId())])) { call_user_func($this->commands[$commandID], $command, $this->prefix); } } /** * Sets an handler for the specified command ID. * * The callback signature must have 2 parameters of the following types: * * - Predis\Command\CommandInterface (command instance) * - String (prefix) * * When the callback argument is omitted or NULL, the previously * associated handler for the specified command ID is removed. * * @param string $commandID The ID of the command to be handled. * @param mixed $callback A valid callable object or NULL. * * @throws \InvalidArgumentException */ public function setCommandHandler($commandID, $callback = null) { $commandID = strtoupper($commandID); if (!isset($callback)) { unset($this->commands[$commandID]); return; } if (!is_callable($callback)) { throw new \InvalidArgumentException( 'Callback must be a valid callable object or NULL' ); } $this->commands[$commandID] = $callback; } /** * {@inheritdoc} */ public function __toString() { return $this->getPrefix(); } /** * Applies the specified prefix only the first argument. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function first(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { $arguments[0] = "$prefix{$arguments[0]}"; $command->setRawArguments($arguments); } } /** * Applies the specified prefix to all the arguments. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function all(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { foreach ($arguments as &$key) { $key = "$prefix$key"; } $command->setRawArguments($arguments); } } /** * Applies the specified prefix only to even arguments in the list. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function interleaved(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { $length = count($arguments); for ($i = 0; $i < $length; $i += 2) { $arguments[$i] = "$prefix{$arguments[$i]}"; } $command->setRawArguments($arguments); } } /** * Applies the specified prefix to all the arguments but the first one. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function skipFirst(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { $length = count($arguments); for ($i = 1; $i < $length; ++$i) { $arguments[$i] = "$prefix{$arguments[$i]}"; } $command->setRawArguments($arguments); } } /** * Applies the specified prefix to all the arguments but the last one. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function skipLast(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { $length = count($arguments); for ($i = 0; $i < $length - 1; ++$i) { $arguments[$i] = "$prefix{$arguments[$i]}"; } $command->setRawArguments($arguments); } } /** * Applies the specified prefix to the keys of a SORT command. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function sort(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { $arguments[0] = "$prefix{$arguments[0]}"; if (($count = count($arguments)) > 1) { for ($i = 1; $i < $count; ++$i) { switch ($arguments[$i]) { case 'BY': case 'STORE': $arguments[$i] = "$prefix{$arguments[++$i]}"; break; case 'GET': $value = $arguments[++$i]; if ($value !== '#') { $arguments[$i] = "$prefix$value"; } break; case 'LIMIT'; $i += 2; break; } } } $command->setRawArguments($arguments); } } /** * Applies the specified prefix to the keys of an EVAL-based command. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function evalKeys(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { for ($i = 2; $i < $arguments[1] + 2; ++$i) { $arguments[$i] = "$prefix{$arguments[$i]}"; } $command->setRawArguments($arguments); } } /** * Applies the specified prefix to the keys of Z[INTERSECTION|UNION]STORE. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function zsetStore(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { $arguments[0] = "$prefix{$arguments[0]}"; $length = ((int) $arguments[1]) + 2; for ($i = 2; $i < $length; ++$i) { $arguments[$i] = "$prefix{$arguments[$i]}"; } $command->setRawArguments($arguments); } } /** * Applies the specified prefix to the key of a MIGRATE command. * * @param CommandInterface $command Command instance. * @param string $prefix Prefix string. */ public static function migrate(CommandInterface $command, $prefix) { if ($arguments = $command->getArguments()) { $arguments[2] = "$prefix{$arguments[2]}"; $command->setRawArguments($arguments); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/Processor/ProcessorChain.php000066400000000000000000000054031361462701300325400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command\Processor; use Predis\Command\CommandInterface; /** * Default implementation of a command processors chain. * * @author Daniele Alessandri */ class ProcessorChain implements \ArrayAccess, ProcessorInterface { private $processors = array(); /** * @param array $processors List of instances of ProcessorInterface. */ public function __construct($processors = array()) { foreach ($processors as $processor) { $this->add($processor); } } /** * {@inheritdoc} */ public function add(ProcessorInterface $processor) { $this->processors[] = $processor; } /** * {@inheritdoc} */ public function remove(ProcessorInterface $processor) { if (false !== $index = array_search($processor, $this->processors, true)) { unset($this[$index]); } } /** * {@inheritdoc} */ public function process(CommandInterface $command) { for ($i = 0; $i < $count = count($this->processors); ++$i) { $this->processors[$i]->process($command); } } /** * {@inheritdoc} */ public function getProcessors() { return $this->processors; } /** * Returns an iterator over the list of command processor in the chain. * * @return \ArrayIterator */ public function getIterator() { return new \ArrayIterator($this->processors); } /** * Returns the number of command processors in the chain. * * @return int */ public function count() { return count($this->processors); } /** * {@inheritdoc} */ public function offsetExists($index) { return isset($this->processors[$index]); } /** * {@inheritdoc} */ public function offsetGet($index) { return $this->processors[$index]; } /** * {@inheritdoc} */ public function offsetSet($index, $processor) { if (!$processor instanceof ProcessorInterface) { throw new \InvalidArgumentException( 'A processor chain accepts only instances of '. "'Predis\Command\Processor\ProcessorInterface'." ); } $this->processors[$index] = $processor; } /** * {@inheritdoc} */ public function offsetUnset($index) { unset($this->processors[$index]); $this->processors = array_values($this->processors); } } ProcessorInterface.php000066400000000000000000000012371361462701300333400ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/Processor * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command\Processor; use Predis\Command\CommandInterface; /** * A command processor processes Redis commands before they are sent to Redis. * * @author Daniele Alessandri */ interface ProcessorInterface { /** * Processes the given Redis command. * * @param CommandInterface $command Command instance. */ public function process(CommandInterface $command); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/PubSubPublish.php000066400000000000000000000010051361462701300303600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/publish * * @author Daniele Alessandri */ class PubSubPublish extends Command { /** * {@inheritdoc} */ public function getId() { return 'PUBLISH'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/PubSubPubsub.php000066400000000000000000000023151361462701300302170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/pubsub * * @author Daniele Alessandri */ class PubSubPubsub extends Command { /** * {@inheritdoc} */ public function getId() { return 'PUBSUB'; } /** * {@inheritdoc} */ public function parseResponse($data) { switch (strtolower($this->getArgument(0))) { case 'numsub': return self::processNumsub($data); default: return $data; } } /** * Returns the processed response to PUBSUB NUMSUB. * * @param array $channels List of channels * * @return array */ protected static function processNumsub(array $channels) { $processed = array(); $count = count($channels); for ($i = 0; $i < $count; ++$i) { $processed[$channels[$i]] = $channels[++$i]; } return $processed; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/PubSubSubscribe.php000066400000000000000000000012531361462701300307000ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/subscribe * * @author Daniele Alessandri */ class PubSubSubscribe extends Command { /** * {@inheritdoc} */ public function getId() { return 'SUBSCRIBE'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeArguments($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/PubSubSubscribeByPattern.php000066400000000000000000000010361361462701300325300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/psubscribe * * @author Daniele Alessandri */ class PubSubSubscribeByPattern extends PubSubSubscribe { /** * {@inheritdoc} */ public function getId() { return 'PSUBSCRIBE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/PubSubUnsubscribe.php000066400000000000000000000012611361462701300312420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/unsubscribe * * @author Daniele Alessandri */ class PubSubUnsubscribe extends Command { /** * {@inheritdoc} */ public function getId() { return 'UNSUBSCRIBE'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeArguments($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/PubSubUnsubscribeByPattern.php000066400000000000000000000010461361462701300330740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/punsubscribe * * @author Daniele Alessandri */ class PubSubUnsubscribeByPattern extends PubSubUnsubscribe { /** * {@inheritdoc} */ public function getId() { return 'PUNSUBSCRIBE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/RawCommand.php000066400000000000000000000053271361462701300276740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * Class for generic "anonymous" Redis commands. * * This command class does not filter input arguments or parse responses, but * can be used to leverage the standard Predis API to execute any command simply * by providing the needed arguments following the command signature as defined * by Redis in its documentation. * * @author Daniele Alessandri */ class RawCommand implements CommandInterface { private $slot; private $commandID; private $arguments; /** * @param array $arguments Command ID and its arguments. * * @throws \InvalidArgumentException */ public function __construct(array $arguments) { if (!$arguments) { throw new \InvalidArgumentException( 'The arguments array must contain at least the command ID.' ); } $this->commandID = strtoupper(array_shift($arguments)); $this->arguments = $arguments; } /** * Creates a new raw command using a variadic method. * * @param string $commandID Redis command ID. * @param string ... Arguments list for the command. * * @return CommandInterface */ public static function create($commandID /* [ $arg, ... */) { $arguments = func_get_args(); $command = new self($arguments); return $command; } /** * {@inheritdoc} */ public function getId() { return $this->commandID; } /** * {@inheritdoc} */ public function setArguments(array $arguments) { $this->arguments = $arguments; unset($this->slot); } /** * {@inheritdoc} */ public function setRawArguments(array $arguments) { $this->setArguments($arguments); } /** * {@inheritdoc} */ public function getArguments() { return $this->arguments; } /** * {@inheritdoc} */ public function getArgument($index) { if (isset($this->arguments[$index])) { return $this->arguments[$index]; } } /** * {@inheritdoc} */ public function setSlot($slot) { $this->slot = $slot; } /** * {@inheritdoc} */ public function getSlot() { if (isset($this->slot)) { return $this->slot; } } /** * {@inheritdoc} */ public function parseResponse($data) { return $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ScriptCommand.php000066400000000000000000000035011361462701300303770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * Base class used to implement an higher level abstraction for commands based * on Lua scripting with EVAL and EVALSHA. * * @link http://redis.io/commands/eval * * @author Daniele Alessandri */ abstract class ScriptCommand extends ServerEvalSHA { /** * Gets the body of a Lua script. * * @return string */ abstract public function getScript(); /** * Specifies the number of arguments that should be considered as keys. * * The default behaviour for the base class is to return 0 to indicate that * all the elements of the arguments array should be considered as keys, but * subclasses can enforce a static number of keys. * * @return int */ protected function getKeysCount() { return 0; } /** * Returns the elements from the arguments that are identified as keys. * * @return array */ public function getKeys() { return array_slice($this->getArguments(), 2, $this->getKeysCount()); } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (($numkeys = $this->getKeysCount()) && $numkeys < 0) { $numkeys = count($arguments) + $numkeys; } return array_merge(array(sha1($this->getScript()), (int) $numkeys), $arguments); } /** * @return array */ public function getEvalArguments() { $arguments = $this->getArguments(); $arguments[0] = $this->getScript(); return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerBackgroundRewriteAOF.php000066400000000000000000000013001361462701300327650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/bgrewriteaof * * @author Daniele Alessandri */ class ServerBackgroundRewriteAOF extends Command { /** * {@inheritdoc} */ public function getId() { return 'BGREWRITEAOF'; } /** * {@inheritdoc} */ public function parseResponse($data) { return $data == 'Background append only file rewriting started'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerBackgroundSave.php000066400000000000000000000012521361462701300317220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/bgsave * * @author Daniele Alessandri */ class ServerBackgroundSave extends Command { /** * {@inheritdoc} */ public function getId() { return 'BGSAVE'; } /** * {@inheritdoc} */ public function parseResponse($data) { return $data === 'Background saving started' ? true : $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerClient.php000066400000000000000000000032011361462701300302360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/client-list * @link http://redis.io/commands/client-kill * @link http://redis.io/commands/client-getname * @link http://redis.io/commands/client-setname * * @author Daniele Alessandri */ class ServerClient extends Command { /** * {@inheritdoc} */ public function getId() { return 'CLIENT'; } /** * {@inheritdoc} */ public function parseResponse($data) { $args = array_change_key_case($this->getArguments(), CASE_UPPER); switch (strtoupper($args[0])) { case 'LIST': return $this->parseClientList($data); case 'KILL': case 'GETNAME': case 'SETNAME': default: return $data; } } /** * Parses the response to CLIENT LIST and returns a structured list. * * @param string $data Response buffer. * * @return array */ protected function parseClientList($data) { $clients = array(); foreach (explode("\n", $data, -1) as $clientData) { $client = array(); foreach (explode(' ', $clientData) as $kv) { @list($k, $v) = explode('=', $kv); $client[$k] = $v; } $clients[] = $client; } return $clients; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerCommand.php000066400000000000000000000010051361462701300303760ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/command * * @author Daniele Alessandri */ class ServerCommand extends Command { /** * {@inheritdoc} */ public function getId() { return 'COMMAND'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerConfig.php000066400000000000000000000017431361462701300302360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/config-set * @link http://redis.io/commands/config-get * @link http://redis.io/commands/config-resetstat * @link http://redis.io/commands/config-rewrite * * @author Daniele Alessandri */ class ServerConfig extends Command { /** * {@inheritdoc} */ public function getId() { return 'CONFIG'; } /** * {@inheritdoc} */ public function parseResponse($data) { if (is_array($data)) { $result = array(); for ($i = 0; $i < count($data); ++$i) { $result[$data[$i]] = $data[++$i]; } return $result; } return $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerDatabaseSize.php000066400000000000000000000010101361462701300313530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/dbsize * * @author Daniele Alessandri */ class ServerDatabaseSize extends Command { /** * {@inheritdoc} */ public function getId() { return 'DBSIZE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerEval.php000066400000000000000000000013141361462701300277120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/eval * * @author Daniele Alessandri */ class ServerEval extends Command { /** * {@inheritdoc} */ public function getId() { return 'EVAL'; } /** * Calculates the SHA1 hash of the body of the script. * * @return string SHA1 hash. */ public function getScriptHash() { return sha1($this->getArgument(0)); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerEvalSHA.php000066400000000000000000000013171361462701300302510ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/evalsha * * @author Daniele Alessandri */ class ServerEvalSHA extends ServerEval { /** * {@inheritdoc} */ public function getId() { return 'EVALSHA'; } /** * Returns the SHA1 hash of the body of the script. * * @return string SHA1 hash. */ public function getScriptHash() { return $this->getArgument(0); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerFlushAll.php000066400000000000000000000010101361462701300305260ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/flushall * * @author Daniele Alessandri */ class ServerFlushAll extends Command { /** * {@inheritdoc} */ public function getId() { return 'FLUSHALL'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerFlushDatabase.php000066400000000000000000000010131361462701300315250ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/flushdb * * @author Daniele Alessandri */ class ServerFlushDatabase extends Command { /** * {@inheritdoc} */ public function getId() { return 'FLUSHDB'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerInfo.php000066400000000000000000000045141361462701300277230ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/info * * @author Daniele Alessandri */ class ServerInfo extends Command { /** * {@inheritdoc} */ public function getId() { return 'INFO'; } /** * {@inheritdoc} */ public function parseResponse($data) { $info = array(); $infoLines = preg_split('/\r?\n/', $data); foreach ($infoLines as $row) { if (strpos($row, ':') === false) { continue; } list($k, $v) = $this->parseRow($row); $info[$k] = $v; } return $info; } /** * Parses a single row of the response and returns the key-value pair. * * @param string $row Single row of the response. * * @return array */ protected function parseRow($row) { list($k, $v) = explode(':', $row, 2); if (preg_match('/^db\d+$/', $k)) { $v = $this->parseDatabaseStats($v); } return array($k, $v); } /** * Extracts the statistics of each logical DB from the string buffer. * * @param string $str Response buffer. * * @return array */ protected function parseDatabaseStats($str) { $db = array(); foreach (explode(',', $str) as $dbvar) { list($dbvk, $dbvv) = explode('=', $dbvar); $db[trim($dbvk)] = $dbvv; } return $db; } /** * Parses the response and extracts the allocation statistics. * * @param string $str Response buffer. * * @return array */ protected function parseAllocationStats($str) { $stats = array(); foreach (explode(',', $str) as $kv) { @list($size, $objects, $extra) = explode('=', $kv); // hack to prevent incorrect values when parsing the >=256 key if (isset($extra)) { $size = ">=$objects"; $objects = $extra; } $stats[$size] = $objects; } return $stats; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerInfoV26x.php000066400000000000000000000023041361462701300304040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/info * * @author Daniele Alessandri */ class ServerInfoV26x extends ServerInfo { /** * {@inheritdoc} */ public function parseResponse($data) { if ($data === '') { return array(); } $info = array(); $current = null; $infoLines = preg_split('/\r?\n/', $data); if (isset($infoLines[0]) && $infoLines[0][0] !== '#') { return parent::parseResponse($data); } foreach ($infoLines as $row) { if ($row === '') { continue; } if (preg_match('/^# (\w+)$/', $row, $matches)) { $info[$matches[1]] = array(); $current = &$info[$matches[1]]; continue; } list($k, $v) = $this->parseRow($row); $current[$k] = $v; } return $info; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerLastSave.php000066400000000000000000000010101361462701300305360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/lastsave * * @author Daniele Alessandri */ class ServerLastSave extends Command { /** * {@inheritdoc} */ public function getId() { return 'LASTSAVE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerMonitor.php000066400000000000000000000010051361462701300304470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/monitor * * @author Daniele Alessandri */ class ServerMonitor extends Command { /** * {@inheritdoc} */ public function getId() { return 'MONITOR'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerObject.php000066400000000000000000000010021361462701300302230ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/object * * @author Daniele Alessandri */ class ServerObject extends Command { /** * {@inheritdoc} */ public function getId() { return 'OBJECT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerSave.php000066400000000000000000000007741361462701300277320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/save * * @author Daniele Alessandri */ class ServerSave extends Command { /** * {@inheritdoc} */ public function getId() { return 'SAVE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerScript.php000066400000000000000000000010021361462701300302610ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/script * * @author Daniele Alessandri */ class ServerScript extends Command { /** * {@inheritdoc} */ public function getId() { return 'SCRIPT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerSentinel.php000066400000000000000000000025771361462701300306200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/topics/sentinel * * @author Daniele Alessandri */ class ServerSentinel extends Command { /** * {@inheritdoc} */ public function getId() { return 'SENTINEL'; } /** * {@inheritdoc} */ public function parseResponse($data) { switch (strtolower($this->getArgument(0))) { case 'masters': case 'slaves': return self::processMastersOrSlaves($data); default: return $data; } } /** * Returns a processed response to SENTINEL MASTERS or SENTINEL SLAVES. * * @param array $servers List of Redis servers. * * @return array */ protected static function processMastersOrSlaves(array $servers) { foreach ($servers as $idx => $node) { $processed = array(); $count = count($node); for ($i = 0; $i < $count; ++$i) { $processed[$node[$i]] = $node[++$i]; } $servers[$idx] = $processed; } return $servers; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerShutdown.php000066400000000000000000000010101361462701300306270ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/shutdown * * @author Daniele Alessandri */ class ServerShutdown extends Command { /** * {@inheritdoc} */ public function getId() { return 'SHUTDOWN'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerSlaveOf.php000066400000000000000000000014021361462701300303600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/slaveof * * @author Daniele Alessandri */ class ServerSlaveOf extends Command { /** * {@inheritdoc} */ public function getId() { return 'SLAVEOF'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 0 || $arguments[0] === 'NO ONE') { return array('NO', 'ONE'); } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerSlowlog.php000066400000000000000000000017761361462701300304650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/slowlog * * @author Daniele Alessandri */ class ServerSlowlog extends Command { /** * {@inheritdoc} */ public function getId() { return 'SLOWLOG'; } /** * {@inheritdoc} */ public function parseResponse($data) { if (is_array($data)) { $log = array(); foreach ($data as $index => $entry) { $log[$index] = array( 'id' => $entry[0], 'timestamp' => $entry[1], 'duration' => $entry[2], 'command' => $entry[3], ); } return $log; } return $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ServerTime.php000066400000000000000000000007741361462701300277320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/time * * @author Daniele Alessandri */ class ServerTime extends Command { /** * {@inheritdoc} */ public function getId() { return 'TIME'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetAdd.php000066400000000000000000000012271361462701300270030ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sadd * * @author Daniele Alessandri */ class SetAdd extends Command { /** * {@inheritdoc} */ public function getId() { return 'SADD'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeVariadic($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetCardinality.php000066400000000000000000000010021361462701300305450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/scard * * @author Daniele Alessandri */ class SetCardinality extends Command { /** * {@inheritdoc} */ public function getId() { return 'SCARD'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetDifference.php000066400000000000000000000010111361462701300303340ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sdiff * * @author Daniele Alessandri */ class SetDifference extends SetIntersection { /** * {@inheritdoc} */ public function getId() { return 'SDIFF'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetDifferenceStore.php000066400000000000000000000010351361462701300313570ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sdiffstore * * @author Daniele Alessandri */ class SetDifferenceStore extends SetIntersectionStore { /** * {@inheritdoc} */ public function getId() { return 'SDIFFSTORE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetIntersection.php000066400000000000000000000012451361462701300307610ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sinter * * @author Daniele Alessandri */ class SetIntersection extends Command { /** * {@inheritdoc} */ public function getId() { return 'SINTER'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeArguments($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetIntersectionStore.php000066400000000000000000000014541361462701300320000ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sinterstore * * @author Daniele Alessandri */ class SetIntersectionStore extends Command { /** * {@inheritdoc} */ public function getId() { return 'SINTERSTORE'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 2 && is_array($arguments[1])) { return array_merge(array($arguments[0]), $arguments[1]); } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetIsMember.php000066400000000000000000000011771361462701300300220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sismember * * @author Daniele Alessandri */ class SetIsMember extends Command { /** * {@inheritdoc} */ public function getId() { return 'SISMEMBER'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetMembers.php000066400000000000000000000010041361462701300276760ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/smembers * * @author Daniele Alessandri */ class SetMembers extends Command { /** * {@inheritdoc} */ public function getId() { return 'SMEMBERS'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetMove.php000066400000000000000000000011631361462701300272200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/smove * * @author Daniele Alessandri */ class SetMove extends Command { /** * {@inheritdoc} */ public function getId() { return 'SMOVE'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetPop.php000066400000000000000000000007701361462701300270530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/spop * * @author Daniele Alessandri */ class SetPop extends Command { /** * {@inheritdoc} */ public function getId() { return 'SPOP'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetRandomMember.php000066400000000000000000000010171361462701300306600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/srandmember * * @author Daniele Alessandri */ class SetRandomMember extends Command { /** * {@inheritdoc} */ public function getId() { return 'SRANDMEMBER'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetRemove.php000066400000000000000000000012321361462701300275440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/srem * * @author Daniele Alessandri */ class SetRemove extends Command { /** * {@inheritdoc} */ public function getId() { return 'SREM'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeVariadic($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetScan.php000066400000000000000000000026771361462701300272110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sscan * * @author Daniele Alessandri */ class SetScan extends Command { /** * {@inheritdoc} */ public function getId() { return 'SSCAN'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 3 && is_array($arguments[2])) { $options = $this->prepareOptions(array_pop($arguments)); $arguments = array_merge($arguments, $options); } return $arguments; } /** * Returns a list of options and modifiers compatible with Redis. * * @param array $options List of options. * * @return array */ protected function prepareOptions($options) { $options = array_change_key_case($options, CASE_UPPER); $normalized = array(); if (!empty($options['MATCH'])) { $normalized[] = 'MATCH'; $normalized[] = $options['MATCH']; } if (!empty($options['COUNT'])) { $normalized[] = 'COUNT'; $normalized[] = $options['COUNT']; } return $normalized; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetUnion.php000066400000000000000000000010061361462701300273760ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sunion * * @author Daniele Alessandri */ class SetUnion extends SetIntersection { /** * {@inheritdoc} */ public function getId() { return 'SUNION'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/SetUnionStore.php000066400000000000000000000010321361462701300304120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/sunionstore * * @author Daniele Alessandri */ class SetUnionStore extends SetIntersectionStore { /** * {@inheritdoc} */ public function getId() { return 'SUNIONSTORE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringAppend.php000066400000000000000000000010021361462701300302240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/append * * @author Daniele Alessandri */ class StringAppend extends Command { /** * {@inheritdoc} */ public function getId() { return 'APPEND'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringBitCount.php000066400000000000000000000010101361462701300305430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/bitcount * * @author Daniele Alessandri */ class StringBitCount extends Command { /** * {@inheritdoc} */ public function getId() { return 'BITCOUNT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringBitOp.php000066400000000000000000000015641361462701300300470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/bitop * * @author Daniele Alessandri */ class StringBitOp extends Command { /** * {@inheritdoc} */ public function getId() { return 'BITOP'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 3 && is_array($arguments[2])) { list($operation, $destination) = $arguments; $arguments = $arguments[2]; array_unshift($arguments, $operation, $destination); } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringBitPos.php000066400000000000000000000010021361462701300302150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/bitpos * * @author Daniele Alessandri */ class StringBitPos extends Command { /** * {@inheritdoc} */ public function getId() { return 'BITPOS'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringDecrement.php000066400000000000000000000010011361462701300307220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/decr * * @author Daniele Alessandri */ class StringDecrement extends Command { /** * {@inheritdoc} */ public function getId() { return 'DECR'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringDecrementBy.php000066400000000000000000000010071361462701300312230ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/decrby * * @author Daniele Alessandri */ class StringDecrementBy extends Command { /** * {@inheritdoc} */ public function getId() { return 'DECRBY'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringGet.php000066400000000000000000000007711361462701300275500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/get * * @author Daniele Alessandri */ class StringGet extends Command { /** * {@inheritdoc} */ public function getId() { return 'GET'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringGetBit.php000066400000000000000000000010021361462701300301730ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/getbit * * @author Daniele Alessandri */ class StringGetBit extends Command { /** * {@inheritdoc} */ public function getId() { return 'GETBIT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringGetMultiple.php000066400000000000000000000012431361462701300312570ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/mget * * @author Daniele Alessandri */ class StringGetMultiple extends Command { /** * {@inheritdoc} */ public function getId() { return 'MGET'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeArguments($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringGetRange.php000066400000000000000000000010101361462701300305100ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/getrange * * @author Daniele Alessandri */ class StringGetRange extends Command { /** * {@inheritdoc} */ public function getId() { return 'GETRANGE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringGetSet.php000066400000000000000000000010021361462701300302100ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/getset * * @author Daniele Alessandri */ class StringGetSet extends Command { /** * {@inheritdoc} */ public function getId() { return 'GETSET'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringIncrement.php000066400000000000000000000010011361462701300307400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/incr * * @author Daniele Alessandri */ class StringIncrement extends Command { /** * {@inheritdoc} */ public function getId() { return 'INCR'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringIncrementBy.php000066400000000000000000000010071361462701300312410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/incrby * * @author Daniele Alessandri */ class StringIncrementBy extends Command { /** * {@inheritdoc} */ public function getId() { return 'INCRBY'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringIncrementByFloat.php000066400000000000000000000010261361462701300322300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/incrbyfloat * * @author Daniele Alessandri */ class StringIncrementByFloat extends Command { /** * {@inheritdoc} */ public function getId() { return 'INCRBYFLOAT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringPreciseSetExpire.php000066400000000000000000000010241361462701300322440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/psetex * * @author Daniele Alessandri */ class StringPreciseSetExpire extends StringSetExpire { /** * {@inheritdoc} */ public function getId() { return 'PSETEX'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSet.php000066400000000000000000000007711361462701300275640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/set * * @author Daniele Alessandri */ class StringSet extends Command { /** * {@inheritdoc} */ public function getId() { return 'SET'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSetBit.php000066400000000000000000000010021361462701300302070ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/setbit * * @author Daniele Alessandri */ class StringSetBit extends Command { /** * {@inheritdoc} */ public function getId() { return 'SETBIT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSetExpire.php000066400000000000000000000010031361462701300307260ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/setex * * @author Daniele Alessandri */ class StringSetExpire extends Command { /** * {@inheritdoc} */ public function getId() { return 'SETEX'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSetMultiple.php000066400000000000000000000017061361462701300312770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/mset * * @author Daniele Alessandri */ class StringSetMultiple extends Command { /** * {@inheritdoc} */ public function getId() { return 'MSET'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 1 && is_array($arguments[0])) { $flattenedKVs = array(); $args = $arguments[0]; foreach ($args as $k => $v) { $flattenedKVs[] = $k; $flattenedKVs[] = $v; } return $flattenedKVs; } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSetMultiplePreserve.php000066400000000000000000000012211361462701300330030ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/msetnx * * @author Daniele Alessandri */ class StringSetMultiplePreserve extends StringSetMultiple { /** * {@inheritdoc} */ public function getId() { return 'MSETNX'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSetPreserve.php000066400000000000000000000011751361462701300312770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/setnx * * @author Daniele Alessandri */ class StringSetPreserve extends Command { /** * {@inheritdoc} */ public function getId() { return 'SETNX'; } /** * {@inheritdoc} */ public function parseResponse($data) { return (bool) $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSetRange.php000066400000000000000000000010101361462701300305240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/setrange * * @author Daniele Alessandri */ class StringSetRange extends Command { /** * {@inheritdoc} */ public function getId() { return 'SETRANGE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringStrlen.php000066400000000000000000000010021361462701300302640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/strlen * * @author Daniele Alessandri */ class StringStrlen extends Command { /** * {@inheritdoc} */ public function getId() { return 'STRLEN'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/StringSubstr.php000066400000000000000000000010021361462701300302770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/substr * * @author Daniele Alessandri */ class StringSubstr extends Command { /** * {@inheritdoc} */ public function getId() { return 'SUBSTR'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/TransactionDiscard.php000066400000000000000000000010121361462701300314060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/discard * * @author Daniele Alessandri */ class TransactionDiscard extends Command { /** * {@inheritdoc} */ public function getId() { return 'DISCARD'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/TransactionExec.php000066400000000000000000000010011361462701300307170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/exec * * @author Daniele Alessandri */ class TransactionExec extends Command { /** * {@inheritdoc} */ public function getId() { return 'EXEC'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/TransactionMulti.php000066400000000000000000000010041361462701300311300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/multi * * @author Daniele Alessandri */ class TransactionMulti extends Command { /** * {@inheritdoc} */ public function getId() { return 'MULTI'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/TransactionUnwatch.php000066400000000000000000000010121361462701300314460ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/unwatch * * @author Daniele Alessandri */ class TransactionUnwatch extends Command { /** * {@inheritdoc} */ public function getId() { return 'UNWATCH'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/TransactionWatch.php000066400000000000000000000013661361462701300311170ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/watch * * @author Daniele Alessandri */ class TransactionWatch extends Command { /** * {@inheritdoc} */ public function getId() { return 'WATCH'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (isset($arguments[0]) && is_array($arguments[0])) { return $arguments[0]; } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetAdd.php000066400000000000000000000015231361462701300271340ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zadd * * @author Daniele Alessandri */ class ZSetAdd extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZADD'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (is_array(end($arguments))) { foreach (array_pop($arguments) as $member => $score) { $arguments[] = $score; $arguments[] = $member; } } return $arguments; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetCardinality.php000066400000000000000000000010031361462701300307000ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zcard * * @author Daniele Alessandri */ class ZSetCardinality extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZCARD'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetCount.php000066400000000000000000000007771361462701300275460ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zcount * * @author Daniele Alessandri */ class ZSetCount extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZCOUNT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetIncrementBy.php000066400000000000000000000010071361462701300306600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zincrby * * @author Daniele Alessandri */ class ZSetIncrementBy extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZINCRBY'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetIntersectionStore.php000066400000000000000000000010341361462701300321240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zinterstore * * @author Daniele Alessandri */ class ZSetIntersectionStore extends ZSetUnionStore { /** * {@inheritdoc} */ public function getId() { return 'ZINTERSTORE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetLexCount.php000066400000000000000000000010101361462701300301740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zlexcount * * @author Daniele Alessandri */ class ZSetLexCount extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZLEXCOUNT'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRange.php000066400000000000000000000044111361462701300274770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrange * * @author Daniele Alessandri */ class ZSetRange extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZRANGE'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 4) { $lastType = gettype($arguments[3]); if ($lastType === 'string' && strtoupper($arguments[3]) === 'WITHSCORES') { // Used for compatibility with older versions $arguments[3] = array('WITHSCORES' => true); $lastType = 'array'; } if ($lastType === 'array') { $options = $this->prepareOptions(array_pop($arguments)); return array_merge($arguments, $options); } } return $arguments; } /** * Returns a list of options and modifiers compatible with Redis. * * @param array $options List of options. * * @return array */ protected function prepareOptions($options) { $opts = array_change_key_case($options, CASE_UPPER); $finalizedOpts = array(); if (!empty($opts['WITHSCORES'])) { $finalizedOpts[] = 'WITHSCORES'; } return $finalizedOpts; } /** * Checks for the presence of the WITHSCORES modifier. * * @return bool */ protected function withScores() { $arguments = $this->getArguments(); if (count($arguments) < 4) { return false; } return strtoupper($arguments[3]) === 'WITHSCORES'; } /** * {@inheritdoc} */ public function parseResponse($data) { if ($this->withScores()) { $result = array(); for ($i = 0; $i < count($data); ++$i) { $result[$data[$i]] = $data[++$i]; } return $result; } return $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRangeByLex.php000066400000000000000000000023061361462701300304440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrangebylex * * @author Daniele Alessandri */ class ZSetRangeByLex extends ZSetRange { /** * {@inheritdoc} */ public function getId() { return 'ZRANGEBYLEX'; } /** * {@inheritdoc} */ protected function prepareOptions($options) { $opts = array_change_key_case($options, CASE_UPPER); $finalizedOpts = array(); if (isset($opts['LIMIT']) && is_array($opts['LIMIT'])) { $limit = array_change_key_case($opts['LIMIT'], CASE_UPPER); $finalizedOpts[] = 'LIMIT'; $finalizedOpts[] = isset($limit['OFFSET']) ? $limit['OFFSET'] : $limit[0]; $finalizedOpts[] = isset($limit['COUNT']) ? $limit['COUNT'] : $limit[1]; } return $finalizedOpts; } /** * {@inheritdoc} */ protected function withScores() { return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRangeByScore.php000066400000000000000000000031031361462701300307630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrangebyscore * * @author Daniele Alessandri */ class ZSetRangeByScore extends ZSetRange { /** * {@inheritdoc} */ public function getId() { return 'ZRANGEBYSCORE'; } /** * {@inheritdoc} */ protected function prepareOptions($options) { $opts = array_change_key_case($options, CASE_UPPER); $finalizedOpts = array(); if (isset($opts['LIMIT']) && is_array($opts['LIMIT'])) { $limit = array_change_key_case($opts['LIMIT'], CASE_UPPER); $finalizedOpts[] = 'LIMIT'; $finalizedOpts[] = isset($limit['OFFSET']) ? $limit['OFFSET'] : $limit[0]; $finalizedOpts[] = isset($limit['COUNT']) ? $limit['COUNT'] : $limit[1]; } return array_merge($finalizedOpts, parent::prepareOptions($options)); } /** * {@inheritdoc} */ protected function withScores() { $arguments = $this->getArguments(); for ($i = 3; $i < count($arguments); ++$i) { switch (strtoupper($arguments[$i])) { case 'WITHSCORES': return true; case 'LIMIT': $i += 2; break; } } return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRank.php000066400000000000000000000007741361462701300273460ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrank * * @author Daniele Alessandri */ class ZSetRank extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZRANK'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRemove.php000066400000000000000000000012331361462701300276770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrem * * @author Daniele Alessandri */ class ZSetRemove extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZREM'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { return self::normalizeVariadic($arguments); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRemoveRangeByLex.php000066400000000000000000000010321361462701300316150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zremrangebylex * * @author Daniele Alessandri */ class ZSetRemoveRangeByLex extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZREMRANGEBYLEX'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRemoveRangeByRank.php000066400000000000000000000010351361462701300317630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zremrangebyrank * * @author Daniele Alessandri */ class ZSetRemoveRangeByRank extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZREMRANGEBYRANK'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetRemoveRangeByScore.php000066400000000000000000000010401361462701300321370ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zremrangebyscore * * @author Daniele Alessandri */ class ZSetRemoveRangeByScore extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZREMRANGEBYSCORE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetReverseRange.php000066400000000000000000000010161361462701300310310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrevrange * * @author Daniele Alessandri */ class ZSetReverseRange extends ZSetRange { /** * {@inheritdoc} */ public function getId() { return 'ZREVRANGE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetReverseRangeByLex.php000066400000000000000000000006611361462701300320020ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; class ZSetReverseRangeByLex extends ZSetRangeByLex { /** * {@inheritdoc} */ public function getId() { return 'ZREVRANGEBYLEX'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetReverseRangeByScore.php000066400000000000000000000010521361462701300323200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrevrangebyscore * * @author Daniele Alessandri */ class ZSetReverseRangeByScore extends ZSetRangeByScore { /** * {@inheritdoc} */ public function getId() { return 'ZREVRANGEBYSCORE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetReverseRank.php000066400000000000000000000010111361462701300306630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zrevrank * * @author Daniele Alessandri */ class ZSetReverseRank extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZREVRANK'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetScan.php000066400000000000000000000035021361462701300273270ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zscan * * @author Daniele Alessandri */ class ZSetScan extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZSCAN'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { if (count($arguments) === 3 && is_array($arguments[2])) { $options = $this->prepareOptions(array_pop($arguments)); $arguments = array_merge($arguments, $options); } return $arguments; } /** * Returns a list of options and modifiers compatible with Redis. * * @param array $options List of options. * * @return array */ protected function prepareOptions($options) { $options = array_change_key_case($options, CASE_UPPER); $normalized = array(); if (!empty($options['MATCH'])) { $normalized[] = 'MATCH'; $normalized[] = $options['MATCH']; } if (!empty($options['COUNT'])) { $normalized[] = 'COUNT'; $normalized[] = $options['COUNT']; } return $normalized; } /** * {@inheritdoc} */ public function parseResponse($data) { if (is_array($data)) { $members = $data[1]; $result = array(); for ($i = 0; $i < count($members); ++$i) { $result[$members[$i]] = (float) $members[++$i]; } $data[1] = $result; } return $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetScore.php000066400000000000000000000007771361462701300275310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zscore * * @author Daniele Alessandri */ class ZSetScore extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZSCORE'; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Command/ZSetUnionStore.php000066400000000000000000000034251361462701300305540ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Command; /** * @link http://redis.io/commands/zunionstore * * @author Daniele Alessandri */ class ZSetUnionStore extends Command { /** * {@inheritdoc} */ public function getId() { return 'ZUNIONSTORE'; } /** * {@inheritdoc} */ protected function filterArguments(array $arguments) { $options = array(); $argc = count($arguments); if ($argc > 2 && is_array($arguments[$argc - 1])) { $options = $this->prepareOptions(array_pop($arguments)); } if (is_array($arguments[1])) { $arguments = array_merge( array($arguments[0], count($arguments[1])), $arguments[1] ); } return array_merge($arguments, $options); } /** * Returns a list of options and modifiers compatible with Redis. * * @param array $options List of options. * * @return array */ private function prepareOptions($options) { $opts = array_change_key_case($options, CASE_UPPER); $finalizedOpts = array(); if (isset($opts['WEIGHTS']) && is_array($opts['WEIGHTS'])) { $finalizedOpts[] = 'WEIGHTS'; foreach ($opts['WEIGHTS'] as $weight) { $finalizedOpts[] = $weight; } } if (isset($opts['AGGREGATE'])) { $finalizedOpts[] = 'AGGREGATE'; $finalizedOpts[] = $opts['AGGREGATE']; } return $finalizedOpts; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/CommunicationException.php000066400000000000000000000040361361462701300307460ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; use Predis\Connection\NodeConnectionInterface; /** * Base exception class for network-related errors. * * @author Daniele Alessandri */ abstract class CommunicationException extends PredisException { private $connection; /** * @param NodeConnectionInterface $connection Connection that generated the exception. * @param string $message Error message. * @param int $code Error code. * @param \Exception $innerException Inner exception for wrapping the original error. */ public function __construct( NodeConnectionInterface $connection, $message = null, $code = null, \Exception $innerException = null ) { parent::__construct($message, $code, $innerException); $this->connection = $connection; } /** * Gets the connection that generated the exception. * * @return NodeConnectionInterface */ public function getConnection() { return $this->connection; } /** * Indicates if the receiver should reset the underlying connection. * * @return bool */ public function shouldResetConnection() { return true; } /** * Helper method to handle exceptions generated by a connection object. * * @param CommunicationException $exception Exception. * * @throws CommunicationException */ public static function handle(CommunicationException $exception) { if ($exception->shouldResetConnection()) { $connection = $exception->getConnection(); if ($connection->isConnected()) { $connection->disconnect(); } } throw $exception; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/000077500000000000000000000000001361462701300263555ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/ClusterOption.php000066400000000000000000000037511361462701300317060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; use Predis\Connection\Aggregate\ClusterInterface; use Predis\Connection\Aggregate\PredisCluster; use Predis\Connection\Aggregate\RedisCluster; /** * Configures an aggregate connection used for clustering * multiple Redis nodes using various implementations with * different algorithms or strategies. * * @author Daniele Alessandri */ class ClusterOption implements OptionInterface { /** * Creates a new cluster connection from on a known descriptive name. * * @param OptionsInterface $options Instance of the client options. * @param string $id Descriptive identifier of the cluster type (`predis`, `redis-cluster`) * * @return ClusterInterface|null */ protected function createByDescription(OptionsInterface $options, $id) { switch ($id) { case 'predis': case 'predis-cluster': return new PredisCluster(); case 'redis': case 'redis-cluster': return new RedisCluster($options->connections); default: return; } } /** * {@inheritdoc} */ public function filter(OptionsInterface $options, $value) { if (is_string($value)) { $value = $this->createByDescription($options, $value); } if (!$value instanceof ClusterInterface) { throw new \InvalidArgumentException( "An instance of type 'Predis\Connection\Aggregate\ClusterInterface' was expected." ); } return $value; } /** * {@inheritdoc} */ public function getDefault(OptionsInterface $options) { return new PredisCluster(); } } ConnectionFactoryOption.php000066400000000000000000000024531361462701300336330ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; use Predis\Connection\Factory; use Predis\Connection\FactoryInterface; /** * Configures a connection factory used by the client to create new connection * instances for single Redis nodes. * * @author Daniele Alessandri */ class ConnectionFactoryOption implements OptionInterface { /** * {@inheritdoc} */ public function filter(OptionsInterface $options, $value) { if ($value instanceof FactoryInterface) { return $value; } elseif (is_array($value)) { $factory = $this->getDefault($options); foreach ($value as $scheme => $initializer) { $factory->define($scheme, $initializer); } return $factory; } else { throw new \InvalidArgumentException( 'Invalid value provided for the connections option.' ); } } /** * {@inheritdoc} */ public function getDefault(OptionsInterface $options) { return new Factory(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/ExceptionsOption.php000066400000000000000000000015221361462701300324000ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; /** * Configures whether consumers (such as the client) should throw exceptions on * Redis errors (-ERR responses) or just return instances of error responses. * * @author Daniele Alessandri */ class ExceptionsOption implements OptionInterface { /** * {@inheritdoc} */ public function filter(OptionsInterface $options, $value) { return filter_var($value, FILTER_VALIDATE_BOOLEAN); } /** * {@inheritdoc} */ public function getDefault(OptionsInterface $options) { return true; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/OptionInterface.php000066400000000000000000000017331361462701300321630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; /** * Defines an handler used by Predis\Configuration\Options to filter, validate * or return default values for a given option. * * @author Daniele Alessandri */ interface OptionInterface { /** * Filters and validates the passed value. * * @param OptionsInterface $options Options container. * @param mixed $value Input value. * * @return mixed */ public function filter(OptionsInterface $options, $value); /** * Returns the default value for the option. * * @param OptionsInterface $options Options container. * * @return mixed */ public function getDefault(OptionsInterface $options); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/Options.php000066400000000000000000000061731361462701300305300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; /** * Manages Predis options with filtering, conversion and lazy initialization of * values using a mini-DI container approach. * * {@inheritdoc} * * @author Daniele Alessandri */ class Options implements OptionsInterface { protected $input; protected $options; protected $handlers; /** * @param array $options Array of options with their values */ public function __construct(array $options = array()) { $this->input = $options; $this->options = array(); $this->handlers = $this->getHandlers(); } /** * Ensures that the default options are initialized. * * @return array */ protected function getHandlers() { return array( 'cluster' => 'Predis\Configuration\ClusterOption', 'connections' => 'Predis\Configuration\ConnectionFactoryOption', 'exceptions' => 'Predis\Configuration\ExceptionsOption', 'prefix' => 'Predis\Configuration\PrefixOption', 'profile' => 'Predis\Configuration\ProfileOption', 'replication' => 'Predis\Configuration\ReplicationOption', ); } /** * {@inheritdoc} */ public function getDefault($option) { if (isset($this->handlers[$option])) { $handler = $this->handlers[$option]; $handler = new $handler(); return $handler->getDefault($this); } } /** * {@inheritdoc} */ public function defined($option) { return ( array_key_exists($option, $this->options) || array_key_exists($option, $this->input) ); } /** * {@inheritdoc} */ public function __isset($option) { return ( array_key_exists($option, $this->options) || array_key_exists($option, $this->input) ) && $this->__get($option) !== null; } /** * {@inheritdoc} */ public function __get($option) { if (isset($this->options[$option]) || array_key_exists($option, $this->options)) { return $this->options[$option]; } if (isset($this->input[$option]) || array_key_exists($option, $this->input)) { $value = $this->input[$option]; unset($this->input[$option]); if (is_object($value) && method_exists($value, '__invoke')) { $value = $value($this, $option); } if (isset($this->handlers[$option])) { $handler = $this->handlers[$option]; $handler = new $handler(); $value = $handler->filter($this, $value); } return $this->options[$option] = $value; } if (isset($this->handlers[$option])) { return $this->options[$option] = $this->getDefault($option); } return; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/OptionsInterface.php000066400000000000000000000033121361462701300323410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; /** * Interface defining a container for client options. * * @property-read mixed aggregate Custom connection aggregator. * @property-read mixed cluster Aggregate connection for clustering. * @property-read mixed connections Connection factory. * @property-read mixed exceptions Toggles exceptions in client for -ERR responses. * @property-read mixed prefix Key prefixing strategy using the given prefix. * @property-read mixed profile Server profile. * @property-read mixed replication Aggregate connection for replication. * * @author Daniele Alessandri */ interface OptionsInterface { /** * Returns the default value for the given option. * * @param string $option Name of the option. * * @return mixed|null */ public function getDefault($option); /** * Checks if the given option has been set by the user upon initialization. * * @param string $option Name of the option. * * @return bool */ public function defined($option); /** * Checks if the given option has been set and does not evaluate to NULL. * * @param string $option Name of the option. * * @return bool */ public function __isset($option); /** * Returns the value of the given option. * * @param string $option Name of the option. * * @return mixed|null */ public function __get($option); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/PrefixOption.php000066400000000000000000000017341361462701300315210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; use Predis\Command\Processor\KeyPrefixProcessor; use Predis\Command\Processor\ProcessorInterface; /** * Configures a command processor that apply the specified prefix string to a * series of Redis commands considered prefixable. * * @author Daniele Alessandri */ class PrefixOption implements OptionInterface { /** * {@inheritdoc} */ public function filter(OptionsInterface $options, $value) { if ($value instanceof ProcessorInterface) { return $value; } return new KeyPrefixProcessor($value); } /** * {@inheritdoc} */ public function getDefault(OptionsInterface $options) { // NOOP } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/ProfileOption.php000066400000000000000000000037641361462701300316710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; use Predis\Profile\Factory; use Predis\Profile\ProfileInterface; use Predis\Profile\RedisProfile; /** * Configures the server profile to be used by the client to create command * instances depending on the specified version of the Redis server. * * @author Daniele Alessandri */ class ProfileOption implements OptionInterface { /** * Sets the commands processors that need to be applied to the profile. * * @param OptionsInterface $options Client options. * @param ProfileInterface $profile Server profile. */ protected function setProcessors(OptionsInterface $options, ProfileInterface $profile) { if (isset($options->prefix) && $profile instanceof RedisProfile) { // NOTE: directly using __get('prefix') is actually a workaround for // HHVM 2.3.0. It's correct and respects the options interface, it's // just ugly. We will remove this hack when HHVM will fix re-entrant // calls to __get() once and for all. $profile->setProcessor($options->__get('prefix')); } } /** * {@inheritdoc} */ public function filter(OptionsInterface $options, $value) { if (is_string($value)) { $value = Factory::get($value); $this->setProcessors($options, $value); } elseif (!$value instanceof ProfileInterface) { throw new \InvalidArgumentException('Invalid value for the profile option.'); } return $value; } /** * {@inheritdoc} */ public function getDefault(OptionsInterface $options) { $profile = Factory::getDefault(); $this->setProcessors($options, $profile); return $profile; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Configuration/ReplicationOption.php000066400000000000000000000032521361462701300325320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Configuration; use Predis\Connection\Aggregate\MasterSlaveReplication; use Predis\Connection\Aggregate\ReplicationInterface; /** * Configures an aggregate connection used for master/slave replication among * multiple Redis nodes. * * @author Daniele Alessandri */ class ReplicationOption implements OptionInterface { /** * {@inheritdoc} * * @todo There's more code than needed due to a bug in filter_var() as * discussed here https://bugs.php.net/bug.php?id=49510 and different * behaviours when encountering NULL values on PHP 5.3. */ public function filter(OptionsInterface $options, $value) { if ($value instanceof ReplicationInterface) { return $value; } if (is_bool($value) || $value === null) { return $value ? $this->getDefault($options) : null; } if ( !is_object($value) && null !== $asbool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ) { return $asbool ? $this->getDefault($options) : null; } throw new \InvalidArgumentException( "An instance of type 'Predis\Connection\Aggregate\ReplicationInterface' was expected." ); } /** * {@inheritdoc} */ public function getDefault(OptionsInterface $options) { return new MasterSlaveReplication(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/000077500000000000000000000000001361462701300256455ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/AbstractConnection.php000066400000000000000000000124511361462701300321440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; use Predis\CommunicationException; use Predis\Protocol\ProtocolException; /** * Base class with the common logic used by connection classes to communicate * with Redis. * * @author Daniele Alessandri */ abstract class AbstractConnection implements NodeConnectionInterface { private $resource; private $cachedId; protected $parameters; protected $initCommands = array(); /** * @param ParametersInterface $parameters Initialization parameters for the connection. */ public function __construct(ParametersInterface $parameters) { $this->parameters = $this->assertParameters($parameters); } /** * Disconnects from the server and destroys the underlying resource when * PHP's garbage collector kicks in. */ public function __destruct() { $this->disconnect(); } /** * Checks some of the parameters used to initialize the connection. * * @param ParametersInterface $parameters Initialization parameters for the connection. * * @throws \InvalidArgumentException * * @return ParametersInterface */ protected function assertParameters(ParametersInterface $parameters) { switch ($parameters->scheme) { case 'tcp': case 'redis': case 'unix': break; default: throw new \InvalidArgumentException("Invalid scheme: '$parameters->scheme'."); } return $parameters; } /** * Creates the underlying resource used to communicate with Redis. * * @return mixed */ abstract protected function createResource(); /** * {@inheritdoc} */ public function isConnected() { return isset($this->resource); } /** * {@inheritdoc} */ public function connect() { if (!$this->isConnected()) { $this->resource = $this->createResource(); return true; } return false; } /** * {@inheritdoc} */ public function disconnect() { unset($this->resource); } /** * {@inheritdoc} */ public function addConnectCommand(CommandInterface $command) { $this->initCommands[] = $command; } /** * {@inheritdoc} */ public function executeCommand(CommandInterface $command) { $this->writeRequest($command); return $this->readResponse($command); } /** * {@inheritdoc} */ public function readResponse(CommandInterface $command) { return $this->read(); } /** * Helper method that returns an exception message augmented with useful * details from the connection parameters. * * @param string $message Error message. * * @return string */ private function createExceptionMessage($message) { $parameters = $this->parameters; if ($parameters->scheme === 'unix') { return "$message [$parameters->scheme:$parameters->path]"; } if (filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { return "$message [$parameters->scheme://[$parameters->host]:$parameters->port]"; } return "$message [$parameters->scheme://$parameters->host:$parameters->port]"; } /** * Helper method to handle connection errors. * * @param string $message Error message. * @param int $code Error code. */ protected function onConnectionError($message, $code = null) { CommunicationException::handle( new ConnectionException($this, static::createExceptionMessage($message), $code) ); } /** * Helper method to handle protocol errors. * * @param string $message Error message. */ protected function onProtocolError($message) { CommunicationException::handle( new ProtocolException($this, static::createExceptionMessage($message)) ); } /** * {@inheritdoc} */ public function getResource() { if (isset($this->resource)) { return $this->resource; } $this->connect(); return $this->resource; } /** * {@inheritdoc} */ public function getParameters() { return $this->parameters; } /** * Gets an identifier for the connection. * * @return string */ protected function getIdentifier() { if ($this->parameters->scheme === 'unix') { return $this->parameters->path; } return "{$this->parameters->host}:{$this->parameters->port}"; } /** * {@inheritdoc} */ public function __toString() { if (!isset($this->cachedId)) { $this->cachedId = $this->getIdentifier(); } return $this->cachedId; } /** * {@inheritdoc} */ public function __sleep() { return array('parameters', 'initCommands'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Aggregate/000077500000000000000000000000001361462701300275335ustar00rootroot00000000000000ClusterInterface.php000066400000000000000000000011061361462701300334250ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Aggregate * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection\Aggregate; use Predis\Connection\AggregateConnectionInterface; /** * Defines a cluster of Redis servers formed by aggregating multiple connection * instances to single Redis nodes. * * @author Daniele Alessandri */ interface ClusterInterface extends AggregateConnectionInterface { } MasterSlaveReplication.php000066400000000000000000000132161361462701300346100ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Aggregate * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection\Aggregate; use Predis\Command\CommandInterface; use Predis\Connection\NodeConnectionInterface; use Predis\Replication\ReplicationStrategy; /** * Aggregate connection handling replication of Redis nodes configured in a * single master / multiple slaves setup. * * @author Daniele Alessandri */ class MasterSlaveReplication implements ReplicationInterface { protected $strategy; protected $master; protected $slaves; protected $current; /** * {@inheritdoc} */ public function __construct(ReplicationStrategy $strategy = null) { $this->slaves = array(); $this->strategy = $strategy ?: new ReplicationStrategy(); } /** * Checks if one master and at least one slave have been defined. */ protected function check() { if (!isset($this->master) || !$this->slaves) { throw new \RuntimeException('Replication needs one master and at least one slave.'); } } /** * Resets the connection state. */ protected function reset() { $this->current = null; } /** * {@inheritdoc} */ public function add(NodeConnectionInterface $connection) { $alias = $connection->getParameters()->alias; if ($alias === 'master') { $this->master = $connection; } else { $this->slaves[$alias ?: count($this->slaves)] = $connection; } $this->reset(); } /** * {@inheritdoc} */ public function remove(NodeConnectionInterface $connection) { if ($connection->getParameters()->alias === 'master') { $this->master = null; $this->reset(); return true; } else { if (($id = array_search($connection, $this->slaves, true)) !== false) { unset($this->slaves[$id]); $this->reset(); return true; } } return false; } /** * {@inheritdoc} */ public function getConnection(CommandInterface $command) { if ($this->current === null) { $this->check(); $this->current = $this->strategy->isReadOperation($command) ? $this->pickSlave() : $this->master; return $this->current; } if ($this->current === $this->master) { return $this->current; } if (!$this->strategy->isReadOperation($command)) { $this->current = $this->master; } return $this->current; } /** * {@inheritdoc} */ public function getConnectionById($connectionId) { if ($connectionId === 'master') { return $this->master; } if (isset($this->slaves[$connectionId])) { return $this->slaves[$connectionId]; } return; } /** * {@inheritdoc} */ public function switchTo($connection) { $this->check(); if (!$connection instanceof NodeConnectionInterface) { $connection = $this->getConnectionById($connection); } if ($connection !== $this->master && !in_array($connection, $this->slaves, true)) { throw new \InvalidArgumentException('Invalid connection or connection not found.'); } $this->current = $connection; } /** * {@inheritdoc} */ public function getCurrent() { return $this->current; } /** * {@inheritdoc} */ public function getMaster() { return $this->master; } /** * {@inheritdoc} */ public function getSlaves() { return array_values($this->slaves); } /** * Returns the underlying replication strategy. * * @return ReplicationStrategy */ public function getReplicationStrategy() { return $this->strategy; } /** * Returns a random slave. * * @return NodeConnectionInterface */ protected function pickSlave() { return $this->slaves[array_rand($this->slaves)]; } /** * {@inheritdoc} */ public function isConnected() { return $this->current ? $this->current->isConnected() : false; } /** * {@inheritdoc} */ public function connect() { if ($this->current === null) { $this->check(); $this->current = $this->pickSlave(); } $this->current->connect(); } /** * {@inheritdoc} */ public function disconnect() { if ($this->master) { $this->master->disconnect(); } foreach ($this->slaves as $connection) { $connection->disconnect(); } } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $this->getConnection($command)->writeRequest($command); } /** * {@inheritdoc} */ public function readResponse(CommandInterface $command) { return $this->getConnection($command)->readResponse($command); } /** * {@inheritdoc} */ public function executeCommand(CommandInterface $command) { return $this->getConnection($command)->executeCommand($command); } /** * {@inheritdoc} */ public function __sleep() { return array('master', 'slaves', 'strategy'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Aggregate/PredisCluster.php000066400000000000000000000126531361462701300330430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection\Aggregate; use Predis\Cluster\PredisStrategy; use Predis\Cluster\StrategyInterface; use Predis\Command\CommandInterface; use Predis\Connection\NodeConnectionInterface; use Predis\NotSupportedException; /** * Abstraction for a cluster of aggregate connections to various Redis servers * implementing client-side sharding based on pluggable distribution strategies. * * @author Daniele Alessandri * * @todo Add the ability to remove connections from pool. */ class PredisCluster implements ClusterInterface, \IteratorAggregate, \Countable { private $pool; private $strategy; private $distributor; /** * @param StrategyInterface $strategy Optional cluster strategy. */ public function __construct(StrategyInterface $strategy = null) { $this->pool = array(); $this->strategy = $strategy ?: new PredisStrategy(); $this->distributor = $this->strategy->getDistributor(); } /** * {@inheritdoc} */ public function isConnected() { foreach ($this->pool as $connection) { if ($connection->isConnected()) { return true; } } return false; } /** * {@inheritdoc} */ public function connect() { foreach ($this->pool as $connection) { $connection->connect(); } } /** * {@inheritdoc} */ public function disconnect() { foreach ($this->pool as $connection) { $connection->disconnect(); } } /** * {@inheritdoc} */ public function add(NodeConnectionInterface $connection) { $parameters = $connection->getParameters(); if (isset($parameters->alias)) { $this->pool[$parameters->alias] = $connection; } else { $this->pool[] = $connection; } $weight = isset($parameters->weight) ? $parameters->weight : null; $this->distributor->add($connection, $weight); } /** * {@inheritdoc} */ public function remove(NodeConnectionInterface $connection) { if (($id = array_search($connection, $this->pool, true)) !== false) { unset($this->pool[$id]); $this->distributor->remove($connection); return true; } return false; } /** * Removes a connection instance using its alias or index. * * @param string $connectionID Alias or index of a connection. * * @return bool Returns true if the connection was in the pool. */ public function removeById($connectionID) { if ($connection = $this->getConnectionById($connectionID)) { return $this->remove($connection); } return false; } /** * {@inheritdoc} */ public function getConnection(CommandInterface $command) { $slot = $this->strategy->getSlot($command); if (!isset($slot)) { throw new NotSupportedException( "Cannot use '{$command->getId()}' over clusters of connections." ); } $node = $this->distributor->getBySlot($slot); return $node; } /** * {@inheritdoc} */ public function getConnectionById($connectionID) { return isset($this->pool[$connectionID]) ? $this->pool[$connectionID] : null; } /** * Retrieves a connection instance from the cluster using a key. * * @param string $key Key string. * * @return NodeConnectionInterface */ public function getConnectionByKey($key) { $hash = $this->strategy->getSlotByKey($key); $node = $this->distributor->getBySlot($hash); return $node; } /** * Returns the underlying command hash strategy used to hash commands by * using keys found in their arguments. * * @return StrategyInterface */ public function getClusterStrategy() { return $this->strategy; } /** * {@inheritdoc} */ public function count() { return count($this->pool); } /** * {@inheritdoc} */ public function getIterator() { return new \ArrayIterator($this->pool); } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $this->getConnection($command)->writeRequest($command); } /** * {@inheritdoc} */ public function readResponse(CommandInterface $command) { return $this->getConnection($command)->readResponse($command); } /** * {@inheritdoc} */ public function executeCommand(CommandInterface $command) { return $this->getConnection($command)->executeCommand($command); } /** * Executes the specified Redis command on all the nodes of a cluster. * * @param CommandInterface $command A Redis command. * * @return array */ public function executeCommandOnNodes(CommandInterface $command) { $responses = array(); foreach ($this->pool as $connection) { $responses[] = $connection->executeCommand($command); } return $responses; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Aggregate/RedisCluster.php000066400000000000000000000372561361462701300326710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection\Aggregate; use Predis\Cluster\RedisStrategy as RedisClusterStrategy; use Predis\Cluster\StrategyInterface; use Predis\Command\CommandInterface; use Predis\Command\RawCommand; use Predis\Connection\FactoryInterface; use Predis\Connection\NodeConnectionInterface; use Predis\NotSupportedException; use Predis\Response\ErrorInterface as ErrorResponseInterface; /** * Abstraction for a Redis-backed cluster of nodes (Redis >= 3.0.0). * * This connection backend offers smart support for redis-cluster by handling * automatic slots map (re)generation upon -MOVED or -ASK responses returned by * Redis when redirecting a client to a different node. * * The cluster can be pre-initialized using only a subset of the actual nodes in * the cluster, Predis will do the rest by adjusting the slots map and creating * the missing underlying connection instances on the fly. * * It is possible to pre-associate connections to a slots range with the "slots" * parameter in the form "$first-$last". This can greatly reduce runtime node * guessing and redirections. * * It is also possible to ask for the full and updated slots map directly to one * of the nodes and optionally enable such a behaviour upon -MOVED redirections. * Asking for the cluster configuration to Redis is actually done by issuing a * CLUSTER SLOTS command to a random node in the pool. * * @author Daniele Alessandri */ class RedisCluster implements ClusterInterface, \IteratorAggregate, \Countable { private $useClusterSlots = true; private $defaultParameters = array(); private $pool = array(); private $slots = array(); private $slotsMap; private $strategy; private $connections; /** * @param FactoryInterface $connections Optional connection factory. * @param StrategyInterface $strategy Optional cluster strategy. */ public function __construct( FactoryInterface $connections, StrategyInterface $strategy = null ) { $this->connections = $connections; $this->strategy = $strategy ?: new RedisClusterStrategy(); } /** * {@inheritdoc} */ public function isConnected() { foreach ($this->pool as $connection) { if ($connection->isConnected()) { return true; } } return false; } /** * {@inheritdoc} */ public function connect() { if ($connection = $this->getRandomConnection()) { $connection->connect(); } } /** * {@inheritdoc} */ public function disconnect() { foreach ($this->pool as $connection) { $connection->disconnect(); } } /** * {@inheritdoc} */ public function add(NodeConnectionInterface $connection) { $this->pool[(string) $connection] = $connection; unset($this->slotsMap); } /** * {@inheritdoc} */ public function remove(NodeConnectionInterface $connection) { if (false !== $id = array_search($connection, $this->pool, true)) { unset( $this->pool[$id], $this->slotsMap ); return true; } return false; } /** * Removes a connection instance by using its identifier. * * @param string $connectionID Connection identifier. * * @return bool True if the connection was in the pool. */ public function removeById($connectionID) { if (isset($this->pool[$connectionID])) { unset( $this->pool[$connectionID], $this->slotsMap ); return true; } return false; } /** * Generates the current slots map by guessing the cluster configuration out * of the connection parameters of the connections in the pool. * * Generation is based on the same algorithm used by Redis to generate the * cluster, so it is most effective when all of the connections supplied on * initialization have the "slots" parameter properly set accordingly to the * current cluster configuration. */ public function buildSlotsMap() { $this->slotsMap = array(); foreach ($this->pool as $connectionID => $connection) { $parameters = $connection->getParameters(); if (!isset($parameters->slots)) { continue; } $slots = explode('-', $parameters->slots, 2); $this->setSlots($slots[0], $slots[1], $connectionID); } } /** * Generates an updated slots map fetching the cluster configuration using * the CLUSTER SLOTS command against the specified node or a random one from * the pool. * * @param NodeConnectionInterface $connection Optional connection instance. * * @return array */ public function askSlotsMap(NodeConnectionInterface $connection = null) { if (!$connection && !$connection = $this->getRandomConnection()) { return array(); } $command = RawCommand::create('CLUSTER', 'SLOTS'); $response = $connection->executeCommand($command); foreach ($response as $slots) { // We only support master servers for now, so we ignore subsequent // elements in the $slots array identifying slaves. list($start, $end, $master) = $slots; if ($master[0] === '') { $this->setSlots($start, $end, (string) $connection); } else { $this->setSlots($start, $end, "{$master[0]}:{$master[1]}"); } } return $this->slotsMap; } /** * Returns the current slots map for the cluster. * * @return array */ public function getSlotsMap() { if (!isset($this->slotsMap)) { $this->slotsMap = array(); } return $this->slotsMap; } /** * Pre-associates a connection to a slots range to avoid runtime guessing. * * @param int $first Initial slot of the range. * @param int $last Last slot of the range. * @param NodeConnectionInterface|string $connection ID or connection instance. * * @throws \OutOfBoundsException */ public function setSlots($first, $last, $connection) { if ($first < 0x0000 || $first > 0x3FFF || $last < 0x0000 || $last > 0x3FFF || $last < $first ) { throw new \OutOfBoundsException( "Invalid slot range for $connection: [$first-$last]." ); } $slots = array_fill($first, $last - $first + 1, (string) $connection); $this->slotsMap = $this->getSlotsMap() + $slots; } /** * Guesses the correct node associated to a given slot using a precalculated * slots map, falling back to the same logic used by Redis to initialize a * cluster (best-effort). * * @param int $slot Slot index. * * @return string Connection ID. */ protected function guessNode($slot) { if (!isset($this->slotsMap)) { $this->buildSlotsMap(); } if (isset($this->slotsMap[$slot])) { return $this->slotsMap[$slot]; } $count = count($this->pool); $index = min((int) ($slot / (int) (16384 / $count)), $count - 1); $nodes = array_keys($this->pool); return $nodes[$index]; } /** * Creates a new connection instance from the given connection ID. * * @param string $connectionID Identifier for the connection. * * @return NodeConnectionInterface */ protected function createConnection($connectionID) { $separator = strrpos($connectionID, ':'); $parameters = array_merge($this->defaultParameters, array( 'host' => substr($connectionID, 0, $separator), 'port' => substr($connectionID, $separator + 1), )); $connection = $this->connections->create($parameters); return $connection; } /** * {@inheritdoc} */ public function getConnection(CommandInterface $command) { $slot = $this->strategy->getSlot($command); if (!isset($slot)) { throw new NotSupportedException( "Cannot use '{$command->getId()}' with redis-cluster." ); } if (isset($this->slots[$slot])) { return $this->slots[$slot]; } else { return $this->getConnectionBySlot($slot); } } /** * Returns the connection currently associated to a given slot. * * @param int $slot Slot index. * * @throws \OutOfBoundsException * * @return NodeConnectionInterface */ public function getConnectionBySlot($slot) { if ($slot < 0x0000 || $slot > 0x3FFF) { throw new \OutOfBoundsException("Invalid slot [$slot]."); } if (isset($this->slots[$slot])) { return $this->slots[$slot]; } $connectionID = $this->guessNode($slot); if (!$connection = $this->getConnectionById($connectionID)) { $connection = $this->createConnection($connectionID); $this->pool[$connectionID] = $connection; } return $this->slots[$slot] = $connection; } /** * {@inheritdoc} */ public function getConnectionById($connectionID) { if (isset($this->pool[$connectionID])) { return $this->pool[$connectionID]; } } /** * Returns a random connection from the pool. * * @return NodeConnectionInterface|null */ protected function getRandomConnection() { if ($this->pool) { return $this->pool[array_rand($this->pool)]; } } /** * Permanently associates the connection instance to a new slot. * The connection is added to the connections pool if not yet included. * * @param NodeConnectionInterface $connection Connection instance. * @param int $slot Target slot index. */ protected function move(NodeConnectionInterface $connection, $slot) { $this->pool[(string) $connection] = $connection; $this->slots[(int) $slot] = $connection; } /** * Handles -ERR responses returned by Redis. * * @param CommandInterface $command Command that generated the -ERR response. * @param ErrorResponseInterface $error Redis error response object. * * @return mixed */ protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $error) { $details = explode(' ', $error->getMessage(), 2); switch ($details[0]) { case 'MOVED': return $this->onMovedResponse($command, $details[1]); case 'ASK': return $this->onAskResponse($command, $details[1]); default: return $error; } } /** * Handles -MOVED responses by executing again the command against the node * indicated by the Redis response. * * @param CommandInterface $command Command that generated the -MOVED response. * @param string $details Parameters of the -MOVED response. * * @return mixed */ protected function onMovedResponse(CommandInterface $command, $details) { list($slot, $connectionID) = explode(' ', $details, 2); if (!$connection = $this->getConnectionById($connectionID)) { $connection = $this->createConnection($connectionID); } if ($this->useClusterSlots) { $this->askSlotsMap($connection); } $this->move($connection, $slot); $response = $this->executeCommand($command); return $response; } /** * Handles -ASK responses by executing again the command against the node * indicated by the Redis response. * * @param CommandInterface $command Command that generated the -ASK response. * @param string $details Parameters of the -ASK response. * * @return mixed */ protected function onAskResponse(CommandInterface $command, $details) { list($slot, $connectionID) = explode(' ', $details, 2); if (!$connection = $this->getConnectionById($connectionID)) { $connection = $this->createConnection($connectionID); } $connection->executeCommand(RawCommand::create('ASKING')); $response = $connection->executeCommand($command); return $response; } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $this->getConnection($command)->writeRequest($command); } /** * {@inheritdoc} */ public function readResponse(CommandInterface $command) { return $this->getConnection($command)->readResponse($command); } /** * {@inheritdoc} */ public function executeCommand(CommandInterface $command) { $connection = $this->getConnection($command); $response = $connection->executeCommand($command); if ($response instanceof ErrorResponseInterface) { return $this->onErrorResponse($command, $response); } return $response; } /** * {@inheritdoc} */ public function count() { return count($this->pool); } /** * {@inheritdoc} */ public function getIterator() { return new \ArrayIterator(array_values($this->pool)); } /** * Returns the underlying command hash strategy used to hash commands by * using keys found in their arguments. * * @return StrategyInterface */ public function getClusterStrategy() { return $this->strategy; } /** * Returns the underlying connection factory used to create new connection * instances to Redis nodes indicated by redis-cluster. * * @return FactoryInterface */ public function getConnectionFactory() { return $this->connections; } /** * Enables automatic fetching of the current slots map from one of the nodes * using the CLUSTER SLOTS command. This option is disabled by default but * asking the current slots map to Redis upon -MOVED responses may reduce * overhead by eliminating the trial-and-error nature of the node guessing * procedure, mostly when targeting many keys that would end up in a lot of * redirections. * * The slots map can still be manually fetched using the askSlotsMap() * method whether or not this option is enabled. * * @param bool $value Enable or disable the use of CLUSTER SLOTS. */ public function useClusterSlots($value) { $this->useClusterSlots = (bool) $value; } /** * Sets a default array of connection parameters to be applied when creating * new connection instances on the fly when they are not part of the initial * pool supplied upon cluster initialization. * * These parameters are not applied to connections added to the pool using * the add() method. * * @param array $parameters Array of connection parameters. */ public function setDefaultParameters(array $parameters) { $this->defaultParameters = array_merge( $this->defaultParameters, $parameters ?: array() ); } } ReplicationInterface.php000066400000000000000000000023751361462701300342660ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Aggregate * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection\Aggregate; use Predis\Connection\AggregateConnectionInterface; use Predis\Connection\NodeConnectionInterface; /** * Defines a group of Redis nodes in a master / slave replication setup. * * @author Daniele Alessandri */ interface ReplicationInterface extends AggregateConnectionInterface { /** * Switches the internal connection instance in use. * * @param string $connection Alias of a connection */ public function switchTo($connection); /** * Returns the connection instance currently in use by the aggregate * connection. * * @return NodeConnectionInterface */ public function getCurrent(); /** * Returns the connection instance for the master Redis node. * * @return NodeConnectionInterface */ public function getMaster(); /** * Returns a list of connection instances to slave nodes. * * @return NodeConnectionInterface */ public function getSlaves(); } AggregateConnectionInterface.php000066400000000000000000000031031361462701300340230ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; /** * Defines a virtual connection composed of multiple connection instances to * single Redis nodes. * * @author Daniele Alessandri */ interface AggregateConnectionInterface extends ConnectionInterface { /** * Adds a connection instance to the aggregate connection. * * @param NodeConnectionInterface $connection Connection instance. */ public function add(NodeConnectionInterface $connection); /** * Removes the specified connection instance from the aggregate connection. * * @param NodeConnectionInterface $connection Connection instance. * * @return bool Returns true if the connection was in the pool. */ public function remove(NodeConnectionInterface $connection); /** * Returns the connection instance in charge for the given command. * * @param CommandInterface $command Command instance. * * @return NodeConnectionInterface */ public function getConnection(CommandInterface $command); /** * Returns a connection instance from the aggregate connection by its alias. * * @param string $connectionID Connection alias. * * @return NodeConnectionInterface|null */ public function getConnectionById($connectionID); } CompositeConnectionInterface.php000066400000000000000000000023031361462701300341000ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; /** * Defines a connection to communicate with a single Redis server that leverages * an external protocol processor to handle pluggable protocol handlers. * * @author Daniele Alessandri */ interface CompositeConnectionInterface extends NodeConnectionInterface { /** * Returns the protocol processor used by the connection. */ public function getProtocol(); /** * Writes the buffer containing over the connection. * * @param string $buffer String buffer to be sent over the connection. */ public function writeBuffer($buffer); /** * Reads the given number of bytes from the connection. * * @param int $length Number of bytes to read from the connection. * * @return string */ public function readBuffer($length); /** * Reads a line from the connection. * * @param string */ public function readLine(); } CompositeStreamConnection.php000066400000000000000000000056371361462701300334500ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; use Predis\Protocol\ProtocolProcessorInterface; use Predis\Protocol\Text\ProtocolProcessor as TextProtocolProcessor; /** * Connection abstraction to Redis servers based on PHP's stream that uses an * external protocol processor defining the protocol used for the communication. * * @author Daniele Alessandri */ class CompositeStreamConnection extends StreamConnection implements CompositeConnectionInterface { protected $protocol; /** * @param ParametersInterface $parameters Initialization parameters for the connection. * @param ProtocolProcessorInterface $protocol Protocol processor. */ public function __construct( ParametersInterface $parameters, ProtocolProcessorInterface $protocol = null ) { $this->parameters = $this->assertParameters($parameters); $this->protocol = $protocol ?: new TextProtocolProcessor(); } /** * {@inheritdoc} */ public function getProtocol() { return $this->protocol; } /** * {@inheritdoc} */ public function writeBuffer($buffer) { $this->write($buffer); } /** * {@inheritdoc} */ public function readBuffer($length) { if ($length <= 0) { throw new \InvalidArgumentException('Length parameter must be greater than 0.'); } $value = ''; $socket = $this->getResource(); do { $chunk = fread($socket, $length); if ($chunk === false || $chunk === '') { $this->onConnectionError('Error while reading bytes from the server.'); } $value .= $chunk; } while (($length -= strlen($chunk)) > 0); return $value; } /** * {@inheritdoc} */ public function readLine() { $value = ''; $socket = $this->getResource(); do { $chunk = fgets($socket); if ($chunk === false || $chunk === '') { $this->onConnectionError('Error while reading line from the server.'); } $value .= $chunk; } while (substr($value, -2) !== "\r\n"); return substr($value, 0, -2); } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $this->protocol->write($this, $command); } /** * {@inheritdoc} */ public function read() { return $this->protocol->read($this); } /** * {@inheritdoc} */ public function __sleep() { return array_merge(parent::__sleep(), array('protocol')); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/ConnectionException.php000066400000000000000000000007561361462701300323440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\CommunicationException; /** * Exception class that identifies connection-related errors. * * @author Daniele Alessandri */ class ConnectionException extends CommunicationException { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/ConnectionInterface.php000066400000000000000000000030241361462701300322750ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; /** * Defines a connection object used to communicate with one or multiple * Redis servers. * * @author Daniele Alessandri */ interface ConnectionInterface { /** * Opens the connection to Redis. */ public function connect(); /** * Closes the connection to Redis. */ public function disconnect(); /** * Checks if the connection to Redis is considered open. * * @return bool */ public function isConnected(); /** * Writes the request for the given command over the connection. * * @param CommandInterface $command Command instance. */ public function writeRequest(CommandInterface $command); /** * Reads the response to the given command from the connection. * * @param CommandInterface $command Command instance. * * @return mixed */ public function readResponse(CommandInterface $command); /** * Writes a request for the given command over the connection and reads back * the response returned by Redis. * * @param CommandInterface $command Command instance. * * @return mixed */ public function executeCommand(CommandInterface $command); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Factory.php000066400000000000000000000102571361462701300277720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\RawCommand; /** * Standard connection factory for creating connections to Redis nodes. * * @author Daniele Alessandri */ class Factory implements FactoryInterface { protected $schemes = array( 'tcp' => 'Predis\Connection\StreamConnection', 'unix' => 'Predis\Connection\StreamConnection', 'redis' => 'Predis\Connection\StreamConnection', 'http' => 'Predis\Connection\WebdisConnection', ); /** * Checks if the provided argument represents a valid connection class * implementing Predis\Connection\NodeConnectionInterface. Optionally, * callable objects are used for lazy initialization of connection objects. * * @param mixed $initializer FQN of a connection class or a callable for lazy initialization. * * @throws \InvalidArgumentException * * @return mixed */ protected function checkInitializer($initializer) { if (is_callable($initializer)) { return $initializer; } $class = new \ReflectionClass($initializer); if (!$class->isSubclassOf('Predis\Connection\NodeConnectionInterface')) { throw new \InvalidArgumentException( 'A connection initializer must be a valid connection class or a callable object.' ); } return $initializer; } /** * {@inheritdoc} */ public function define($scheme, $initializer) { $this->schemes[$scheme] = $this->checkInitializer($initializer); } /** * {@inheritdoc} */ public function undefine($scheme) { unset($this->schemes[$scheme]); } /** * {@inheritdoc} */ public function create($parameters) { if (!$parameters instanceof ParametersInterface) { $parameters = $this->createParameters($parameters); } $scheme = $parameters->scheme; if (!isset($this->schemes[$scheme])) { throw new \InvalidArgumentException("Unknown connection scheme: '$scheme'."); } $initializer = $this->schemes[$scheme]; if (is_callable($initializer)) { $connection = call_user_func($initializer, $parameters, $this); } else { $connection = new $initializer($parameters); $this->prepareConnection($connection); } if (!$connection instanceof NodeConnectionInterface) { throw new \UnexpectedValueException( 'Objects returned by connection initializers must implement '. "'Predis\Connection\NodeConnectionInterface'." ); } return $connection; } /** * {@inheritdoc} */ public function aggregate(AggregateConnectionInterface $connection, array $parameters) { foreach ($parameters as $node) { $connection->add($node instanceof NodeConnectionInterface ? $node : $this->create($node)); } } /** * Creates a connection parameters instance from the supplied argument. * * @param mixed $parameters Original connection parameters. * * @return ParametersInterface */ protected function createParameters($parameters) { return Parameters::create($parameters); } /** * Prepares a connection instance after its initialization. * * @param NodeConnectionInterface $connection Connection instance. */ protected function prepareConnection(NodeConnectionInterface $connection) { $parameters = $connection->getParameters(); if (isset($parameters->password)) { $connection->addConnectCommand( new RawCommand(array('AUTH', $parameters->password)) ); } if (isset($parameters->database)) { $connection->addConnectCommand( new RawCommand(array('SELECT', $parameters->database)) ); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/FactoryInterface.php000066400000000000000000000030071361462701300316060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; /** * Interface for classes providing a factory of connections to Redis nodes. * * @author Daniele Alessandri */ interface FactoryInterface { /** * Defines or overrides the connection class identified by a scheme prefix. * * @param string $scheme Target connection scheme. * @param mixed $initializer Fully-qualified name of a class or a callable for lazy initialization. */ public function define($scheme, $initializer); /** * Undefines the connection identified by a scheme prefix. * * @param string $scheme Target connection scheme. */ public function undefine($scheme); /** * Creates a new connection object. * * @param mixed $parameters Initialization parameters for the connection. * * @return NodeConnectionInterface */ public function create($parameters); /** * Aggregates single connections into an aggregate connection instance. * * @param AggregateConnectionInterface $aggregate Aggregate connection instance. * @param array $parameters List of parameters for each connection. */ public function aggregate(AggregateConnectionInterface $aggregate, array $parameters); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/NodeConnectionInterface.php000066400000000000000000000025121361462701300331040ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; /** * Defines a connection used to communicate with a single Redis node. * * @author Daniele Alessandri */ interface NodeConnectionInterface extends ConnectionInterface { /** * Returns a string representation of the connection. * * @return string */ public function __toString(); /** * Returns the underlying resource used to communicate with Redis. * * @return mixed */ public function getResource(); /** * Returns the parameters used to initialize the connection. * * @return ParametersInterface */ public function getParameters(); /** * Pushes the given command into a queue of commands executed when * establishing the actual connection to Redis. * * @param CommandInterface $command Instance of a Redis command. */ public function addConnectCommand(CommandInterface $command); /** * Reads a response from the server. * * @return mixed */ public function read(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/Parameters.php000066400000000000000000000107131361462701300304630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; /** * Container for connection parameters used to initialize connections to Redis. * * {@inheritdoc} * * @author Daniele Alessandri */ class Parameters implements ParametersInterface { private $parameters; private static $defaults = array( 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, 'timeout' => 5.0, ); /** * @param array $parameters Named array of connection parameters. */ public function __construct(array $parameters = array()) { $this->parameters = $this->filter($parameters) + $this->getDefaults(); } /** * Returns some default parameters with their values. * * @return array */ protected function getDefaults() { return self::$defaults; } /** * Creates a new instance by supplying the initial parameters either in the * form of an URI string or a named array. * * @param array|string $parameters Set of connection parameters. * * @return Parameters */ public static function create($parameters) { if (is_string($parameters)) { $parameters = static::parse($parameters); } return new static($parameters ?: array()); } /** * Parses an URI string returning an array of connection parameters. * * When using the "redis" and "rediss" schemes the URI is parsed according * to the rules defined by the provisional registration documents approved * by IANA. If the URI has a password in its "user-information" part or a * database number in the "path" part these values override the values of * "password" and "database" if they are present in the "query" part. * * @link http://www.iana.org/assignments/uri-schemes/prov/redis * @link http://www.iana.org/assignments/uri-schemes/prov/redis * * @param string $uri URI string. * * @throws \InvalidArgumentException * * @return array */ public static function parse($uri) { if (stripos($uri, 'unix') === 0) { // Hack to support URIs for UNIX sockets with minimal effort. $uri = str_ireplace('unix:///', 'unix://localhost/', $uri); } if (!$parsed = parse_url($uri)) { throw new \InvalidArgumentException("Invalid parameters URI: $uri"); } if ( isset($parsed['host']) && false !== strpos($parsed['host'], '[') && false !== strpos($parsed['host'], ']') ) { $parsed['host'] = substr($parsed['host'], 1, -1); } if (isset($parsed['query'])) { parse_str($parsed['query'], $queryarray); unset($parsed['query']); $parsed = array_merge($parsed, $queryarray); } if (stripos($uri, 'redis') === 0) { if (isset($parsed['pass'])) { $parsed['password'] = $parsed['pass']; unset($parsed['pass']); } if (isset($parsed['path']) && preg_match('/^\/(\d+)(\/.*)?/', $parsed['path'], $path)) { $parsed['database'] = $path[1]; if (isset($path[2])) { $parsed['path'] = $path[2]; } else { unset($parsed['path']); } } } return $parsed; } /** * Validates and converts each value of the connection parameters array. * * @param array $parameters Connection parameters. * * @return array */ protected function filter(array $parameters) { return $parameters ?: array(); } /** * {@inheritdoc} */ public function __get($parameter) { if (isset($this->parameters[$parameter])) { return $this->parameters[$parameter]; } } /** * {@inheritdoc} */ public function __isset($parameter) { return isset($this->parameters[$parameter]); } /** * {@inheritdoc} */ public function toArray() { return $this->parameters; } /** * {@inheritdoc} */ public function __sleep() { return array('parameters'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/ParametersInterface.php000066400000000000000000000042651361462701300323110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; /** * Interface defining a container for connection parameters. * * The actual list of connection parameters depends on the features supported by * each connection backend class (please refer to their specific documentation), * but the most common parameters used through the library are: * * @property-read string scheme Connection scheme, such as 'tcp' or 'unix'. * @property-read string host IP address or hostname of Redis. * @property-read int port TCP port on which Redis is listening to. * @property-read string path Path of a UNIX domain socket file. * @property-read string alias Alias for the connection. * @property-read float timeout Timeout for the connect() operation. * @property-read float read_write_timeout Timeout for read() and write() operations. * @property-read bool async_connect Performs the connect() operation asynchronously. * @property-read bool tcp_nodelay Toggles the Nagle's algorithm for coalescing. * @property-read bool persistent Leaves the connection open after a GC collection. * @property-read string password Password to access Redis (see the AUTH command). * @property-read string database Database index (see the SELECT command). * * @author Daniele Alessandri */ interface ParametersInterface { /** * Checks if the specified parameters is set. * * @param string $parameter Name of the parameter. * * @return bool */ public function __isset($parameter); /** * Returns the value of the specified parameter. * * @param string $parameter Name of the parameter. * * @return mixed|null */ public function __get($parameter); /** * Returns an array representation of the connection parameters. * * @return array */ public function toArray(); } PhpiredisSocketConnection.php000066400000000000000000000253541361462701300334300ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; use Predis\NotSupportedException; use Predis\Response\Error as ErrorResponse; use Predis\Response\Status as StatusResponse; /** * This class provides the implementation of a Predis connection that uses the * PHP socket extension for network communication and wraps the phpiredis C * extension (PHP bindings for hiredis) to parse the Redis protocol. * * This class is intended to provide an optional low-overhead alternative for * processing responses from Redis compared to the standard pure-PHP classes. * Differences in speed when dealing with short inline responses are practically * nonexistent, the actual speed boost is for big multibulk responses when this * protocol processor can parse and return responses very fast. * * For instructions on how to build and install the phpiredis extension, please * consult the repository of the project. * * The connection parameters supported by this class are: * * - scheme: it can be either 'redis', 'tcp' or 'unix'. * - host: hostname or IP address of the server. * - port: TCP port of the server. * - path: path of a UNIX domain socket when scheme is 'unix'. * - timeout: timeout to perform the connection. * - read_write_timeout: timeout of read / write operations. * * @link http://github.com/nrk/phpiredis * * @author Daniele Alessandri */ class PhpiredisSocketConnection extends AbstractConnection { private $reader; /** * {@inheritdoc} */ public function __construct(ParametersInterface $parameters) { $this->assertExtensions(); parent::__construct($parameters); $this->reader = $this->createReader(); } /** * Disconnects from the server and destroys the underlying resource and the * protocol reader resource when PHP's garbage collector kicks in. */ public function __destruct() { phpiredis_reader_destroy($this->reader); parent::__destruct(); } /** * Checks if the socket and phpiredis extensions are loaded in PHP. */ protected function assertExtensions() { if (!extension_loaded('sockets')) { throw new NotSupportedException( 'The "sockets" extension is required by this connection backend.' ); } if (!extension_loaded('phpiredis')) { throw new NotSupportedException( 'The "phpiredis" extension is required by this connection backend.' ); } } /** * {@inheritdoc} */ protected function assertParameters(ParametersInterface $parameters) { parent::assertParameters($parameters); if (isset($parameters->persistent)) { throw new NotSupportedException( 'Persistent connections are not supported by this connection backend.' ); } return $parameters; } /** * Creates a new instance of the protocol reader resource. * * @return resource */ private function createReader() { $reader = phpiredis_reader_create(); phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); return $reader; } /** * Returns the underlying protocol reader resource. * * @return resource */ protected function getReader() { return $this->reader; } /** * Returns the handler used by the protocol reader for inline responses. * * @return \Closure */ private function getStatusHandler() { return function ($payload) { return StatusResponse::get($payload); }; } /** * Returns the handler used by the protocol reader for error responses. * * @return \Closure */ protected function getErrorHandler() { return function ($payload) { return new ErrorResponse($payload); }; } /** * Helper method used to throw exceptions on socket errors. */ private function emitSocketError() { $errno = socket_last_error(); $errstr = socket_strerror($errno); $this->disconnect(); $this->onConnectionError(trim($errstr), $errno); } /** * Gets the address of an host from connection parameters. * * @param ParametersInterface $parameters Parameters used to initialize the connection. * * @return string */ protected static function getAddress(ParametersInterface $parameters) { if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP)) { return $host; } if ($host === $address = gethostbyname($host)) { return false; } return $address; } /** * {@inheritdoc} */ protected function createResource() { $parameters = $this->parameters; if ($parameters->scheme === 'unix') { $address = $parameters->path; $domain = AF_UNIX; $protocol = 0; } else { if (false === $address = self::getAddress($parameters)) { $this->onConnectionError("Cannot resolve the address of '$parameters->host'."); } $domain = filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? AF_INET6 : AF_INET; $protocol = SOL_TCP; } $socket = @socket_create($domain, SOCK_STREAM, $protocol); if (!is_resource($socket)) { $this->emitSocketError(); } $this->setSocketOptions($socket, $parameters); $this->connectWithTimeout($socket, $address, $parameters); return $socket; } /** * Sets options on the socket resource from the connection parameters. * * @param resource $socket Socket resource. * @param ParametersInterface $parameters Parameters used to initialize the connection. */ private function setSocketOptions($socket, ParametersInterface $parameters) { if ($parameters->scheme !== 'unix') { if (!socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1)) { $this->emitSocketError(); } if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) { $this->emitSocketError(); } } if (isset($parameters->read_write_timeout)) { $rwtimeout = (float) $parameters->read_write_timeout; $timeoutSec = floor($rwtimeout); $timeoutUsec = ($rwtimeout - $timeoutSec) * 1000000; $timeout = array( 'sec' => $timeoutSec, 'usec' => $timeoutUsec, ); if (!socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout)) { $this->emitSocketError(); } if (!socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout)) { $this->emitSocketError(); } } } /** * Opens the actual connection to the server with a timeout. * * @param resource $socket Socket resource. * @param string $address IP address (DNS-resolved from hostname) * @param ParametersInterface $parameters Parameters used to initialize the connection. * * @return string */ private function connectWithTimeout($socket, $address, ParametersInterface $parameters) { socket_set_nonblock($socket); if (@socket_connect($socket, $address, (int) $parameters->port) === false) { $error = socket_last_error(); if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) { $this->emitSocketError(); } } socket_set_block($socket); $null = null; $selectable = array($socket); $timeout = (float) $parameters->timeout; $timeoutSecs = floor($timeout); $timeoutUSecs = ($timeout - $timeoutSecs) * 1000000; $selected = socket_select($selectable, $selectable, $null, $timeoutSecs, $timeoutUSecs); if ($selected === 2) { $this->onConnectionError('Connection refused.', SOCKET_ECONNREFUSED); } if ($selected === 0) { $this->onConnectionError('Connection timed out.', SOCKET_ETIMEDOUT); } if ($selected === false) { $this->emitSocketError(); } } /** * {@inheritdoc} */ public function connect() { if (parent::connect() && $this->initCommands) { foreach ($this->initCommands as $command) { $this->executeCommand($command); } } } /** * {@inheritdoc} */ public function disconnect() { if ($this->isConnected()) { socket_close($this->getResource()); parent::disconnect(); } } /** * {@inheritdoc} */ protected function write($buffer) { $socket = $this->getResource(); while (($length = strlen($buffer)) > 0) { $written = socket_write($socket, $buffer, $length); if ($length === $written) { return; } if ($written === false) { $this->onConnectionError('Error while writing bytes to the server.'); } $buffer = substr($buffer, $written); } } /** * {@inheritdoc} */ public function read() { $socket = $this->getResource(); $reader = $this->reader; while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { if (@socket_recv($socket, $buffer, 4096, 0) === false || $buffer === '' || $buffer === null) { $this->emitSocketError(); } phpiredis_reader_feed($reader, $buffer); } if ($state === PHPIREDIS_READER_STATE_COMPLETE) { return phpiredis_reader_get_reply($reader); } else { $this->onProtocolError(phpiredis_reader_get_error($reader)); return; } } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $arguments = $command->getArguments(); array_unshift($arguments, $command->getId()); $this->write(phpiredis_format_command($arguments)); } /** * {@inheritdoc} */ public function __wakeup() { $this->assertExtensions(); $this->reader = $this->createReader(); } } PhpiredisStreamConnection.php000066400000000000000000000151551361462701300334310ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; use Predis\NotSupportedException; use Predis\Response\Error as ErrorResponse; use Predis\Response\Status as StatusResponse; /** * This class provides the implementation of a Predis connection that uses PHP's * streams for network communication and wraps the phpiredis C extension (PHP * bindings for hiredis) to parse and serialize the Redis protocol. * * This class is intended to provide an optional low-overhead alternative for * processing responses from Redis compared to the standard pure-PHP classes. * Differences in speed when dealing with short inline responses are practically * nonexistent, the actual speed boost is for big multibulk responses when this * protocol processor can parse and return responses very fast. * * For instructions on how to build and install the phpiredis extension, please * consult the repository of the project. * * The connection parameters supported by this class are: * * - scheme: it can be either 'redis', 'tcp' or 'unix'. * - host: hostname or IP address of the server. * - port: TCP port of the server. * - path: path of a UNIX domain socket when scheme is 'unix'. * - timeout: timeout to perform the connection. * - read_write_timeout: timeout of read / write operations. * - async_connect: performs the connection asynchronously. * - tcp_nodelay: enables or disables Nagle's algorithm for coalescing. * - persistent: the connection is left intact after a GC collection. * * @link https://github.com/nrk/phpiredis * * @author Daniele Alessandri */ class PhpiredisStreamConnection extends StreamConnection { private $reader; /** * {@inheritdoc} */ public function __construct(ParametersInterface $parameters) { $this->assertExtensions(); parent::__construct($parameters); $this->reader = $this->createReader(); } /** * {@inheritdoc} */ public function __destruct() { phpiredis_reader_destroy($this->reader); parent::__destruct(); } /** * Checks if the phpiredis extension is loaded in PHP. */ private function assertExtensions() { if (!extension_loaded('phpiredis')) { throw new NotSupportedException( 'The "phpiredis" extension is required by this connection backend.' ); } } /** * {@inheritdoc} */ protected function tcpStreamInitializer(ParametersInterface $parameters) { $uri = "tcp://[{$parameters->host}]:{$parameters->port}"; $flags = STREAM_CLIENT_CONNECT; $socket = null; if (isset($parameters->async_connect) && (bool) $parameters->async_connect) { $flags |= STREAM_CLIENT_ASYNC_CONNECT; } if (isset($parameters->persistent) && (bool) $parameters->persistent) { $flags |= STREAM_CLIENT_PERSISTENT; $uri .= strpos($path = $parameters->path, '/') === 0 ? $path : "/$path"; } $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); if (!$resource) { $this->onConnectionError(trim($errstr), $errno); } if (isset($parameters->read_write_timeout) && function_exists('socket_import_stream')) { $rwtimeout = (float) $parameters->read_write_timeout; $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; $timeout = array( 'sec' => $timeoutSeconds = floor($rwtimeout), 'usec' => ($rwtimeout - $timeoutSeconds) * 1000000, ); $socket = $socket ?: socket_import_stream($resource); @socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout); @socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout); } if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { $socket = $socket ?: socket_import_stream($resource); socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); } return $resource; } /** * Creates a new instance of the protocol reader resource. * * @return resource */ private function createReader() { $reader = phpiredis_reader_create(); phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); return $reader; } /** * Returns the underlying protocol reader resource. * * @return resource */ protected function getReader() { return $this->reader; } /** * Returns the handler used by the protocol reader for inline responses. * * @return \Closure */ protected function getStatusHandler() { return function ($payload) { return StatusResponse::get($payload); }; } /** * Returns the handler used by the protocol reader for error responses. * * @return \Closure */ protected function getErrorHandler() { return function ($errorMessage) { return new ErrorResponse($errorMessage); }; } /** * {@inheritdoc} */ public function read() { $socket = $this->getResource(); $reader = $this->reader; while (PHPIREDIS_READER_STATE_INCOMPLETE === $state = phpiredis_reader_get_state($reader)) { $buffer = stream_socket_recvfrom($socket, 4096); if ($buffer === false || $buffer === '') { $this->onConnectionError('Error while reading bytes from the server.'); } phpiredis_reader_feed($reader, $buffer); } if ($state === PHPIREDIS_READER_STATE_COMPLETE) { return phpiredis_reader_get_reply($reader); } else { $this->onProtocolError(phpiredis_reader_get_error($reader)); return; } } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $arguments = $command->getArguments(); array_unshift($arguments, $command->getId()); $this->write(phpiredis_format_command($arguments)); } /** * {@inheritdoc} */ public function __wakeup() { $this->assertExtensions(); $this->reader = $this->createReader(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/StreamConnection.php000066400000000000000000000206721361462701300316400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; use Predis\Response\Error as ErrorResponse; use Predis\Response\Status as StatusResponse; /** * Standard connection to Redis servers implemented on top of PHP's streams. * The connection parameters supported by this class are:. * * - scheme: it can be either 'redis', 'tcp' or 'unix'. * - host: hostname or IP address of the server. * - port: TCP port of the server. * - path: path of a UNIX domain socket when scheme is 'unix'. * - timeout: timeout to perform the connection. * - read_write_timeout: timeout of read / write operations. * - async_connect: performs the connection asynchronously. * - tcp_nodelay: enables or disables Nagle's algorithm for coalescing. * - persistent: the connection is left intact after a GC collection. * * @author Daniele Alessandri */ class StreamConnection extends AbstractConnection { /** * Disconnects from the server and destroys the underlying resource when the * garbage collector kicks in only if the connection has not been marked as * persistent. */ public function __destruct() { if (isset($this->parameters->persistent) && $this->parameters->persistent) { return; } $this->disconnect(); } /** * {@inheritdoc} */ protected function createResource() { switch ($this->parameters->scheme) { case 'tcp': case 'redis': return $this->tcpStreamInitializer($this->parameters); case 'unix': return $this->unixStreamInitializer($this->parameters); default: throw new \InvalidArgumentException("Invalid scheme: '{$this->parameters->scheme}'."); } } /** * Initializes a TCP stream resource. * * @param ParametersInterface $parameters Initialization parameters for the connection. * * @return resource */ protected function tcpStreamInitializer(ParametersInterface $parameters) { if (!filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { $uri = "tcp://$parameters->host:$parameters->port"; } else { $uri = "tcp://[$parameters->host]:$parameters->port"; } $flags = STREAM_CLIENT_CONNECT; if (isset($parameters->async_connect) && (bool) $parameters->async_connect) { $flags |= STREAM_CLIENT_ASYNC_CONNECT; } if (isset($parameters->persistent) && (bool) $parameters->persistent) { $flags |= STREAM_CLIENT_PERSISTENT; $uri .= strpos($path = $parameters->path, '/') === 0 ? $path : "/$path"; } $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); if (!$resource) { $this->onConnectionError(trim($errstr), $errno); } if (isset($parameters->read_write_timeout)) { $rwtimeout = (float) $parameters->read_write_timeout; $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; $timeoutSeconds = floor($rwtimeout); $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); } if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { $socket = socket_import_stream($resource); socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); } return $resource; } /** * Initializes a UNIX stream resource. * * @param ParametersInterface $parameters Initialization parameters for the connection. * * @return resource */ protected function unixStreamInitializer(ParametersInterface $parameters) { if (!isset($parameters->path)) { throw new InvalidArgumentException('Missing UNIX domain socket path.'); } $uri = "unix://{$parameters->path}"; $flags = STREAM_CLIENT_CONNECT; if ((bool) $parameters->persistent) { $flags |= STREAM_CLIENT_PERSISTENT; } $resource = @stream_socket_client($uri, $errno, $errstr, (float) $parameters->timeout, $flags); if (!$resource) { $this->onConnectionError(trim($errstr), $errno); } if (isset($parameters->read_write_timeout)) { $rwtimeout = (float) $parameters->read_write_timeout; $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; $timeoutSeconds = floor($rwtimeout); $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); } return $resource; } /** * {@inheritdoc} */ public function connect() { if (parent::connect() && $this->initCommands) { foreach ($this->initCommands as $command) { $this->executeCommand($command); } } } /** * {@inheritdoc} */ public function disconnect() { if ($this->isConnected()) { fclose($this->getResource()); parent::disconnect(); } } /** * Performs a write operation over the stream of the buffer containing a * command serialized with the Redis wire protocol. * * @param string $buffer Representation of a command in the Redis wire protocol. */ protected function write($buffer) { $socket = $this->getResource(); while (($length = strlen($buffer)) > 0) { $written = @fwrite($socket, $buffer); if ($length === $written) { return; } if ($written === false || $written === 0) { $this->onConnectionError('Error while writing bytes to the server.'); } $buffer = substr($buffer, $written); } } /** * {@inheritdoc} */ public function read() { $socket = $this->getResource(); $chunk = fgets($socket); if ($chunk === false || $chunk === '') { $this->onConnectionError('Error while reading line from the server.'); } $prefix = $chunk[0]; $payload = substr($chunk, 1, -2); switch ($prefix) { case '+': return StatusResponse::get($payload); case '$': $size = (int) $payload; if ($size === -1) { return; } $bulkData = ''; $bytesLeft = ($size += 2); do { $chunk = fread($socket, min($bytesLeft, 4096)); if ($chunk === false || $chunk === '') { $this->onConnectionError('Error while reading bytes from the server.'); } $bulkData .= $chunk; $bytesLeft = $size - strlen($bulkData); } while ($bytesLeft > 0); return substr($bulkData, 0, -2); case '*': $count = (int) $payload; if ($count === -1) { return; } $multibulk = array(); for ($i = 0; $i < $count; ++$i) { $multibulk[$i] = $this->read(); } return $multibulk; case ':': return (int) $payload; case '-': return new ErrorResponse($payload); default: $this->onProtocolError("Unknown response prefix: '$prefix'."); return; } } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $commandID = $command->getId(); $arguments = $command->getArguments(); $cmdlen = strlen($commandID); $reqlen = count($arguments) + 1; $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; for ($i = 0, $reqlen--; $i < $reqlen; ++$i) { $argument = $arguments[$i]; $arglen = strlen($argument); $buffer .= "\${$arglen}\r\n{$argument}\r\n"; } $this->write($buffer); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Connection/WebdisConnection.php000066400000000000000000000213741361462701300316220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Connection; use Predis\Command\CommandInterface; use Predis\NotSupportedException; use Predis\Protocol\ProtocolException; use Predis\Response\Error as ErrorResponse; use Predis\Response\Status as StatusResponse; /** * This class implements a Predis connection that actually talks with Webdis * instead of connecting directly to Redis. It relies on the cURL extension to * communicate with the web server and the phpiredis extension to parse the * protocol for responses returned in the http response bodies. * * Some features are not yet available or they simply cannot be implemented: * - Pipelining commands. * - Publish / Subscribe. * - MULTI / EXEC transactions (not yet supported by Webdis). * * The connection parameters supported by this class are: * * - scheme: must be 'http'. * - host: hostname or IP address of the server. * - port: TCP port of the server. * - timeout: timeout to perform the connection. * - user: username for authentication. * - pass: password for authentication. * * @link http://webd.is * @link http://github.com/nicolasff/webdis * @link http://github.com/seppo0010/phpiredis * * @author Daniele Alessandri */ class WebdisConnection implements NodeConnectionInterface { private $parameters; private $resource; private $reader; /** * @param ParametersInterface $parameters Initialization parameters for the connection. * * @throws \InvalidArgumentException */ public function __construct(ParametersInterface $parameters) { $this->assertExtensions(); if ($parameters->scheme !== 'http') { throw new \InvalidArgumentException("Invalid scheme: '{$parameters->scheme}'."); } $this->parameters = $parameters; $this->resource = $this->createCurl(); $this->reader = $this->createReader(); } /** * Frees the underlying cURL and protocol reader resources when the garbage * collector kicks in. */ public function __destruct() { curl_close($this->resource); phpiredis_reader_destroy($this->reader); } /** * Helper method used to throw on unsupported methods. * * @param string $method Name of the unsupported method. * * @throws NotSupportedException */ private function throwNotSupportedException($method) { $class = __CLASS__; throw new NotSupportedException("The method $class::$method() is not supported."); } /** * Checks if the cURL and phpiredis extensions are loaded in PHP. */ private function assertExtensions() { if (!extension_loaded('curl')) { throw new NotSupportedException( 'The "curl" extension is required by this connection backend.' ); } if (!extension_loaded('phpiredis')) { throw new NotSupportedException( 'The "phpiredis" extension is required by this connection backend.' ); } } /** * Initializes cURL. * * @return resource */ private function createCurl() { $parameters = $this->getParameters(); if (filter_var($host = $parameters->host, FILTER_VALIDATE_IP)) { $host = "[$host]"; } $options = array( CURLOPT_FAILONERROR => true, CURLOPT_CONNECTTIMEOUT_MS => $parameters->timeout * 1000, CURLOPT_URL => "$parameters->scheme://$host:$parameters->port", CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_POST => true, CURLOPT_WRITEFUNCTION => array($this, 'feedReader'), ); if (isset($parameters->user, $parameters->pass)) { $options[CURLOPT_USERPWD] = "{$parameters->user}:{$parameters->pass}"; } curl_setopt_array($resource = curl_init(), $options); return $resource; } /** * Initializes the phpiredis protocol reader. * * @return resource */ private function createReader() { $reader = phpiredis_reader_create(); phpiredis_reader_set_status_handler($reader, $this->getStatusHandler()); phpiredis_reader_set_error_handler($reader, $this->getErrorHandler()); return $reader; } /** * Returns the handler used by the protocol reader for inline responses. * * @return \Closure */ protected function getStatusHandler() { return function ($payload) { return StatusResponse::get($payload); }; } /** * Returns the handler used by the protocol reader for error responses. * * @return \Closure */ protected function getErrorHandler() { return function ($payload) { return new ErrorResponse($payload); }; } /** * Feeds the phpredis reader resource with the data read from the network. * * @param resource $resource Reader resource. * @param string $buffer Buffer of data read from a connection. * * @return int */ protected function feedReader($resource, $buffer) { phpiredis_reader_feed($this->reader, $buffer); return strlen($buffer); } /** * {@inheritdoc} */ public function connect() { // NOOP } /** * {@inheritdoc} */ public function disconnect() { // NOOP } /** * {@inheritdoc} */ public function isConnected() { return true; } /** * Checks if the specified command is supported by this connection class. * * @param CommandInterface $command Command instance. * * @throws NotSupportedException * * @return string */ protected function getCommandId(CommandInterface $command) { switch ($commandID = $command->getId()) { case 'AUTH': case 'SELECT': case 'MULTI': case 'EXEC': case 'WATCH': case 'UNWATCH': case 'DISCARD': case 'MONITOR': throw new NotSupportedException("Command '$commandID' is not allowed by Webdis."); default: return $commandID; } } /** * {@inheritdoc} */ public function writeRequest(CommandInterface $command) { $this->throwNotSupportedException(__FUNCTION__); } /** * {@inheritdoc} */ public function readResponse(CommandInterface $command) { $this->throwNotSupportedException(__FUNCTION__); } /** * {@inheritdoc} */ public function executeCommand(CommandInterface $command) { $resource = $this->resource; $commandId = $this->getCommandId($command); if ($arguments = $command->getArguments()) { $arguments = implode('/', array_map('urlencode', $arguments)); $serializedCommand = "$commandId/$arguments.raw"; } else { $serializedCommand = "$commandId.raw"; } curl_setopt($resource, CURLOPT_POSTFIELDS, $serializedCommand); if (curl_exec($resource) === false) { $error = curl_error($resource); $errno = curl_errno($resource); throw new ConnectionException($this, trim($error), $errno); } if (phpiredis_reader_get_state($this->reader) !== PHPIREDIS_READER_STATE_COMPLETE) { throw new ProtocolException($this, phpiredis_reader_get_error($this->reader)); } return phpiredis_reader_get_reply($this->reader); } /** * {@inheritdoc} */ public function getResource() { return $this->resource; } /** * {@inheritdoc} */ public function getParameters() { return $this->parameters; } /** * {@inheritdoc} */ public function addConnectCommand(CommandInterface $command) { $this->throwNotSupportedException(__FUNCTION__); } /** * {@inheritdoc} */ public function read() { $this->throwNotSupportedException(__FUNCTION__); } /** * {@inheritdoc} */ public function __toString() { return "{$this->parameters->host}:{$this->parameters->port}"; } /** * {@inheritdoc} */ public function __sleep() { return array('parameters'); } /** * {@inheritdoc} */ public function __wakeup() { $this->assertExtensions(); $this->resource = $this->createCurl(); $this->reader = $this->createReader(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Monitor/000077500000000000000000000000001361462701300251755ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Monitor/Consumer.php000066400000000000000000000100341361462701300274770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Monitor; use Predis\ClientInterface; use Predis\Connection\AggregateConnectionInterface; use Predis\NotSupportedException; /** * Redis MONITOR consumer. * * @author Daniele Alessandri */ class Consumer implements \Iterator { private $client; private $valid; private $position; /** * @param ClientInterface $client Client instance used by the consumer. */ public function __construct(ClientInterface $client) { $this->assertClient($client); $this->client = $client; $this->start(); } /** * Automatically stops the consumer when the garbage collector kicks in. */ public function __destruct() { $this->stop(); } /** * Checks if the passed client instance satisfies the required conditions * needed to initialize a monitor consumer. * * @param ClientInterface $client Client instance used by the consumer. * * @throws NotSupportedException */ private function assertClient(ClientInterface $client) { if ($client->getConnection() instanceof AggregateConnectionInterface) { throw new NotSupportedException( 'Cannot initialize a monitor consumer over aggregate connections.' ); } if ($client->getProfile()->supportsCommand('MONITOR') === false) { throw new NotSupportedException("The current profile does not support 'MONITOR'."); } } /** * Initializes the consumer and sends the MONITOR command to the server. */ protected function start() { $this->client->executeCommand( $this->client->createCommand('MONITOR') ); $this->valid = true; } /** * Stops the consumer. Internally this is done by disconnecting from server * since there is no way to terminate the stream initialized by MONITOR. */ public function stop() { $this->client->disconnect(); $this->valid = false; } /** * {@inheritdoc} */ public function rewind() { // NOOP } /** * Returns the last message payload retrieved from the server. * * @return Object */ public function current() { return $this->getValue(); } /** * {@inheritdoc} */ public function key() { return $this->position; } /** * {@inheritdoc} */ public function next() { ++$this->position; } /** * Checks if the the consumer is still in a valid state to continue. * * @return bool */ public function valid() { return $this->valid; } /** * Waits for a new message from the server generated by MONITOR and returns * it when available. * * @return Object */ private function getValue() { $database = 0; $client = null; $event = $this->client->getConnection()->read(); $callback = function ($matches) use (&$database, &$client) { if (2 === $count = count($matches)) { // Redis <= 2.4 $database = (int) $matches[1]; } if (4 === $count) { // Redis >= 2.6 $database = (int) $matches[2]; $client = $matches[3]; } return ' '; }; $event = preg_replace_callback('/ \(db (\d+)\) | \[(\d+) (.*?)\] /', $callback, $event, 1); @list($timestamp, $command, $arguments) = explode(' ', $event, 3); return (object) array( 'timestamp' => (float) $timestamp, 'database' => $database, 'client' => $client, 'command' => substr($command, 1, -1), 'arguments' => $arguments, ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/NotSupportedException.php000066400000000000000000000007611361462701300306100ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; /** * Exception class thrown when trying to use features not supported by certain * classes or abstractions of Predis. * * @author Daniele Alessandri */ class NotSupportedException extends PredisException { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Pipeline/000077500000000000000000000000001361462701300253135ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Pipeline/Atomic.php000066400000000000000000000066411361462701300272470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Pipeline; use Predis\ClientException; use Predis\ClientInterface; use Predis\Connection\ConnectionInterface; use Predis\Connection\NodeConnectionInterface; use Predis\Response\ErrorInterface as ErrorResponseInterface; use Predis\Response\ResponseInterface; use Predis\Response\ServerException; /** * Command pipeline wrapped into a MULTI / EXEC transaction. * * @author Daniele Alessandri */ class Atomic extends Pipeline { /** * {@inheritdoc} */ public function __construct(ClientInterface $client) { if (!$client->getProfile()->supportsCommands(array('multi', 'exec', 'discard'))) { throw new ClientException( "The current profile does not support 'MULTI', 'EXEC' and 'DISCARD'." ); } parent::__construct($client); } /** * {@inheritdoc} */ protected function getConnection() { $connection = $this->getClient()->getConnection(); if (!$connection instanceof NodeConnectionInterface) { $class = __CLASS__; throw new ClientException("The class '$class' does not support aggregate connections."); } return $connection; } /** * {@inheritdoc} */ protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) { $profile = $this->getClient()->getProfile(); $connection->executeCommand($profile->createCommand('multi')); foreach ($commands as $command) { $connection->writeRequest($command); } foreach ($commands as $command) { $response = $connection->readResponse($command); if ($response instanceof ErrorResponseInterface) { $connection->executeCommand($profile->createCommand('discard')); throw new ServerException($response->getMessage()); } } $executed = $connection->executeCommand($profile->createCommand('exec')); if (!isset($executed)) { // TODO: should be throwing a more appropriate exception. throw new ClientException( 'The underlying transaction has been aborted by the server.' ); } if (count($executed) !== count($commands)) { $expected = count($commands); $received = count($executed); throw new ClientException( "Invalid number of responses [expected $expected, received $received]." ); } $responses = array(); $sizeOfPipe = count($commands); $exceptions = $this->throwServerExceptions(); for ($i = 0; $i < $sizeOfPipe; ++$i) { $command = $commands->dequeue(); $response = $executed[$i]; if (!$response instanceof ResponseInterface) { $responses[] = $command->parseResponse($response); } elseif ($response instanceof ErrorResponseInterface && $exceptions) { $this->exception($connection, $response); } else { $responses[] = $response; } unset($executed[$i]); } return $responses; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Pipeline/ConnectionErrorProof.php000066400000000000000000000073321361462701300321500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Pipeline; use Predis\CommunicationException; use Predis\Connection\Aggregate\ClusterInterface; use Predis\Connection\ConnectionInterface; use Predis\Connection\NodeConnectionInterface; use Predis\NotSupportedException; /** * Command pipeline that does not throw exceptions on connection errors, but * returns the exception instances as the rest of the response elements. * * @todo Awful naming! * * @author Daniele Alessandri */ class ConnectionErrorProof extends Pipeline { /** * {@inheritdoc} */ protected function getConnection() { return $this->getClient()->getConnection(); } /** * {@inheritdoc} */ protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) { if ($connection instanceof NodeConnectionInterface) { return $this->executeSingleNode($connection, $commands); } elseif ($connection instanceof ClusterInterface) { return $this->executeCluster($connection, $commands); } else { $class = get_class($connection); throw new NotSupportedException("The connection class '$class' is not supported."); } } /** * {@inheritdoc} */ protected function executeSingleNode(NodeConnectionInterface $connection, \SplQueue $commands) { $responses = array(); $sizeOfPipe = count($commands); foreach ($commands as $command) { try { $connection->writeRequest($command); } catch (CommunicationException $exception) { return array_fill(0, $sizeOfPipe, $exception); } } for ($i = 0; $i < $sizeOfPipe; ++$i) { $command = $commands->dequeue(); try { $responses[$i] = $connection->readResponse($command); } catch (CommunicationException $exception) { $add = count($commands) - count($responses); $responses = array_merge($responses, array_fill(0, $add, $exception)); break; } } return $responses; } /** * {@inheritdoc} */ protected function executeCluster(ClusterInterface $connection, \SplQueue $commands) { $responses = array(); $sizeOfPipe = count($commands); $exceptions = array(); foreach ($commands as $command) { $cmdConnection = $connection->getConnection($command); if (isset($exceptions[spl_object_hash($cmdConnection)])) { continue; } try { $cmdConnection->writeRequest($command); } catch (CommunicationException $exception) { $exceptions[spl_object_hash($cmdConnection)] = $exception; } } for ($i = 0; $i < $sizeOfPipe; ++$i) { $command = $commands->dequeue(); $cmdConnection = $connection->getConnection($command); $connectionHash = spl_object_hash($cmdConnection); if (isset($exceptions[$connectionHash])) { $responses[$i] = $exceptions[$connectionHash]; continue; } try { $responses[$i] = $cmdConnection->readResponse($command); } catch (CommunicationException $exception) { $responses[$i] = $exception; $exceptions[$connectionHash] = $exception; } } return $responses; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Pipeline/FireAndForget.php000066400000000000000000000014541361462701300305070ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Pipeline; use Predis\Connection\ConnectionInterface; /** * Command pipeline that writes commands to the servers but discards responses. * * @author Daniele Alessandri */ class FireAndForget extends Pipeline { /** * {@inheritdoc} */ protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) { while (!$commands->isEmpty()) { $connection->writeRequest($commands->dequeue()); } $connection->disconnect(); return array(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Pipeline/Pipeline.php000066400000000000000000000147571361462701300276070ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Pipeline; use Predis\ClientContextInterface; use Predis\ClientException; use Predis\ClientInterface; use Predis\Command\CommandInterface; use Predis\Connection\Aggregate\ReplicationInterface; use Predis\Connection\ConnectionInterface; use Predis\Response\ErrorInterface as ErrorResponseInterface; use Predis\Response\ResponseInterface; use Predis\Response\ServerException; /** * Implementation of a command pipeline in which write and read operations of * Redis commands are pipelined to alleviate the effects of network round-trips. * * {@inheritdoc} * * @author Daniele Alessandri */ class Pipeline implements ClientContextInterface { private $client; private $pipeline; private $responses = array(); private $running = false; /** * @param ClientInterface $client Client instance used by the context. */ public function __construct(ClientInterface $client) { $this->client = $client; $this->pipeline = new \SplQueue(); } /** * Queues a command into the pipeline buffer. * * @param string $method Command ID. * @param array $arguments Arguments for the command. * * @return $this */ public function __call($method, $arguments) { $command = $this->client->createCommand($method, $arguments); $this->recordCommand($command); return $this; } /** * Queues a command instance into the pipeline buffer. * * @param CommandInterface $command Command to be queued in the buffer. */ protected function recordCommand(CommandInterface $command) { $this->pipeline->enqueue($command); } /** * Queues a command instance into the pipeline buffer. * * @param CommandInterface $command Command instance to be queued in the buffer. * * @return $this */ public function executeCommand(CommandInterface $command) { $this->recordCommand($command); return $this; } /** * Throws an exception on -ERR responses returned by Redis. * * @param ConnectionInterface $connection Redis connection that returned the error. * @param ErrorResponseInterface $response Instance of the error response. * * @throws ServerException */ protected function exception(ConnectionInterface $connection, ErrorResponseInterface $response) { $connection->disconnect(); $message = $response->getMessage(); throw new ServerException($message); } /** * Returns the underlying connection to be used by the pipeline. * * @return ConnectionInterface */ protected function getConnection() { $connection = $this->getClient()->getConnection(); if ($connection instanceof ReplicationInterface) { $connection->switchTo('master'); } return $connection; } /** * Implements the logic to flush the queued commands and read the responses * from the current connection. * * @param ConnectionInterface $connection Current connection instance. * @param \SplQueue $commands Queued commands. * * @return array */ protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) { foreach ($commands as $command) { $connection->writeRequest($command); } $responses = array(); $exceptions = $this->throwServerExceptions(); while (!$commands->isEmpty()) { $command = $commands->dequeue(); $response = $connection->readResponse($command); if (!$response instanceof ResponseInterface) { $responses[] = $command->parseResponse($response); } elseif ($response instanceof ErrorResponseInterface && $exceptions) { $this->exception($connection, $response); } else { $responses[] = $response; } } return $responses; } /** * Flushes the buffer holding all of the commands queued so far. * * @param bool $send Specifies if the commands in the buffer should be sent to Redis. * * @return $this */ public function flushPipeline($send = true) { if ($send && !$this->pipeline->isEmpty()) { $responses = $this->executePipeline($this->getConnection(), $this->pipeline); $this->responses = array_merge($this->responses, $responses); } else { $this->pipeline = new \SplQueue(); } return $this; } /** * Marks the running status of the pipeline. * * @param bool $bool Sets the running status of the pipeline. * * @throws ClientException */ private function setRunning($bool) { if ($bool && $this->running) { throw new ClientException('The current pipeline context is already being executed.'); } $this->running = $bool; } /** * Handles the actual execution of the whole pipeline. * * @param mixed $callable Optional callback for execution. * * @throws \Exception * @throws \InvalidArgumentException * * @return array */ public function execute($callable = null) { if ($callable && !is_callable($callable)) { throw new \InvalidArgumentException('The argument must be a callable object.'); } $exception = null; $this->setRunning(true); try { if ($callable) { call_user_func($callable, $this); } $this->flushPipeline(); } catch (\Exception $exception) { // NOOP } $this->setRunning(false); if ($exception) { throw $exception; } return $this->responses; } /** * Returns if the pipeline should throw exceptions on server errors. * * @return bool */ protected function throwServerExceptions() { return (bool) $this->client->getOptions()->exceptions; } /** * Returns the underlying client instance used by the pipeline object. * * @return ClientInterface */ public function getClient() { return $this->client; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/PredisException.php000066400000000000000000000006551361462701300273720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis; /** * Base exception class for Predis-related errors. * * @author Daniele Alessandri */ abstract class PredisException extends \Exception { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/000077500000000000000000000000001361462701300251465ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/Factory.php000066400000000000000000000046101361462701300272670ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; use Predis\ClientException; /** * Factory class for creating profile instances from strings. * * @author Daniele Alessandri */ final class Factory { private static $profiles = array( '2.0' => 'Predis\Profile\RedisVersion200', '2.2' => 'Predis\Profile\RedisVersion220', '2.4' => 'Predis\Profile\RedisVersion240', '2.6' => 'Predis\Profile\RedisVersion260', '2.8' => 'Predis\Profile\RedisVersion280', '3.0' => 'Predis\Profile\RedisVersion300', 'dev' => 'Predis\Profile\RedisUnstable', 'default' => 'Predis\Profile\RedisVersion300', ); /** * */ private function __construct() { // NOOP } /** * Returns the default server profile. * * @return ProfileInterface */ public static function getDefault() { return self::get('default'); } /** * Returns the development server profile. * * @return ProfileInterface */ public static function getDevelopment() { return self::get('dev'); } /** * Registers a new server profile. * * @param string $alias Profile version or alias. * @param string $class FQN of a class implementing Predis\Profile\ProfileInterface. * * @throws \InvalidArgumentException */ public static function define($alias, $class) { $reflection = new \ReflectionClass($class); if (!$reflection->isSubclassOf('Predis\Profile\ProfileInterface')) { throw new \InvalidArgumentException("The class '$class' is not a valid profile class."); } self::$profiles[$alias] = $class; } /** * Returns the specified server profile. * * @param string $version Profile version or alias. * * @throws ClientException * * @return ProfileInterface */ public static function get($version) { if (!isset(self::$profiles[$version])) { throw new ClientException("Unknown server profile: '$version'."); } $profile = self::$profiles[$version]; return new $profile(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/ProfileInterface.php000066400000000000000000000026671361462701300311130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; use Predis\Command\CommandInterface; /** * A profile defines all the features and commands supported by certain versions * of Redis. Instances of Predis\Client should use a server profile matching the * version of Redis being used. * * @author Daniele Alessandri */ interface ProfileInterface { /** * Returns the profile version corresponding to the Redis version. * * @return string */ public function getVersion(); /** * Checks if the profile supports the specified command. * * @param string $commandID Command ID. * * @return bool */ public function supportsCommand($commandID); /** * Checks if the profile supports the specified list of commands. * * @param array $commandIDs List of command IDs. * * @return string */ public function supportsCommands(array $commandIDs); /** * Creates a new command instance. * * @param string $commandID Command ID. * @param array $arguments Arguments for the command. * * @return CommandInterface */ public function createCommand($commandID, array $arguments = array()); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisProfile.php000066400000000000000000000066531361462701300302600ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; use Predis\ClientException; use Predis\Command\Processor\ProcessorInterface; /** * Base class implementing common functionalities for Redis server profiles. * * @author Daniele Alessandri */ abstract class RedisProfile implements ProfileInterface { private $commands; private $processor; /** * */ public function __construct() { $this->commands = $this->getSupportedCommands(); } /** * Returns a map of all the commands supported by the profile and their * actual PHP classes. * * @return array */ abstract protected function getSupportedCommands(); /** * {@inheritdoc} */ public function supportsCommand($commandID) { return isset($this->commands[strtoupper($commandID)]); } /** * {@inheritdoc} */ public function supportsCommands(array $commandIDs) { foreach ($commandIDs as $commandID) { if (!$this->supportsCommand($commandID)) { return false; } } return true; } /** * Returns the fully-qualified name of a class representing the specified * command ID registered in the current server profile. * * @param string $commandID Command ID. * * @return string|null */ public function getCommandClass($commandID) { if (isset($this->commands[$commandID = strtoupper($commandID)])) { return $this->commands[$commandID]; } } /** * {@inheritdoc} */ public function createCommand($commandID, array $arguments = array()) { $commandID = strtoupper($commandID); if (!isset($this->commands[$commandID])) { throw new ClientException("Command '$commandID' is not a registered Redis command."); } $commandClass = $this->commands[$commandID]; $command = new $commandClass(); $command->setArguments($arguments); if (isset($this->processor)) { $this->processor->process($command); } return $command; } /** * Defines a new command in the server profile. * * @param string $commandID Command ID. * @param string $class Fully-qualified name of a Predis\Command\CommandInterface. * * @throws \InvalidArgumentException */ public function defineCommand($commandID, $class) { $reflection = new \ReflectionClass($class); if (!$reflection->isSubclassOf('Predis\Command\CommandInterface')) { throw new \InvalidArgumentException("The class '$class' is not a valid command class."); } $this->commands[strtoupper($commandID)] = $class; } /** * {@inheritdoc} */ public function setProcessor(ProcessorInterface $processor = null) { $this->processor = $processor; } /** * {@inheritdoc} */ public function getProcessor() { return $this->processor; } /** * Returns the version of server profile as its string representation. * * @return string */ public function __toString() { return $this->getVersion(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisUnstable.php000066400000000000000000000015661361462701300304330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; /** * Server profile for the current unstable version of Redis. * * @author Daniele Alessandri */ class RedisUnstable extends RedisVersion300 { /** * {@inheritdoc} */ public function getVersion() { return '3.2'; } /** * {@inheritdoc} */ public function getSupportedCommands() { return array_merge(parent::getSupportedCommands(), array( /* ---------------- Redis 3.2 ---------------- */ /* commands operating on hashes */ 'HSTRLEN' => 'Predis\Command\HashStringLength', )); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisVersion200.php000066400000000000000000000163121361462701300305200ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; /** * Server profile for Redis 2.0. * * @author Daniele Alessandri */ class RedisVersion200 extends RedisProfile { /** * {@inheritdoc} */ public function getVersion() { return '2.0'; } /** * {@inheritdoc} */ public function getSupportedCommands() { return array( /* ---------------- Redis 1.2 ---------------- */ /* commands operating on the key space */ 'EXISTS' => 'Predis\Command\KeyExists', 'DEL' => 'Predis\Command\KeyDelete', 'TYPE' => 'Predis\Command\KeyType', 'KEYS' => 'Predis\Command\KeyKeys', 'RANDOMKEY' => 'Predis\Command\KeyRandom', 'RENAME' => 'Predis\Command\KeyRename', 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', 'EXPIRE' => 'Predis\Command\KeyExpire', 'EXPIREAT' => 'Predis\Command\KeyExpireAt', 'TTL' => 'Predis\Command\KeyTimeToLive', 'MOVE' => 'Predis\Command\KeyMove', 'SORT' => 'Predis\Command\KeySort', /* commands operating on string values */ 'SET' => 'Predis\Command\StringSet', 'SETNX' => 'Predis\Command\StringSetPreserve', 'MSET' => 'Predis\Command\StringSetMultiple', 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', 'GET' => 'Predis\Command\StringGet', 'MGET' => 'Predis\Command\StringGetMultiple', 'GETSET' => 'Predis\Command\StringGetSet', 'INCR' => 'Predis\Command\StringIncrement', 'INCRBY' => 'Predis\Command\StringIncrementBy', 'DECR' => 'Predis\Command\StringDecrement', 'DECRBY' => 'Predis\Command\StringDecrementBy', /* commands operating on lists */ 'RPUSH' => 'Predis\Command\ListPushTail', 'LPUSH' => 'Predis\Command\ListPushHead', 'LLEN' => 'Predis\Command\ListLength', 'LRANGE' => 'Predis\Command\ListRange', 'LTRIM' => 'Predis\Command\ListTrim', 'LINDEX' => 'Predis\Command\ListIndex', 'LSET' => 'Predis\Command\ListSet', 'LREM' => 'Predis\Command\ListRemove', 'LPOP' => 'Predis\Command\ListPopFirst', 'RPOP' => 'Predis\Command\ListPopLast', 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', /* commands operating on sets */ 'SADD' => 'Predis\Command\SetAdd', 'SREM' => 'Predis\Command\SetRemove', 'SPOP' => 'Predis\Command\SetPop', 'SMOVE' => 'Predis\Command\SetMove', 'SCARD' => 'Predis\Command\SetCardinality', 'SISMEMBER' => 'Predis\Command\SetIsMember', 'SINTER' => 'Predis\Command\SetIntersection', 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', 'SUNION' => 'Predis\Command\SetUnion', 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', 'SDIFF' => 'Predis\Command\SetDifference', 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', 'SMEMBERS' => 'Predis\Command\SetMembers', 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', /* commands operating on sorted sets */ 'ZADD' => 'Predis\Command\ZSetAdd', 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', 'ZREM' => 'Predis\Command\ZSetRemove', 'ZRANGE' => 'Predis\Command\ZSetRange', 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', 'ZCARD' => 'Predis\Command\ZSetCardinality', 'ZSCORE' => 'Predis\Command\ZSetScore', 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', /* connection related commands */ 'PING' => 'Predis\Command\ConnectionPing', 'AUTH' => 'Predis\Command\ConnectionAuth', 'SELECT' => 'Predis\Command\ConnectionSelect', 'ECHO' => 'Predis\Command\ConnectionEcho', 'QUIT' => 'Predis\Command\ConnectionQuit', /* remote server control commands */ 'INFO' => 'Predis\Command\ServerInfo', 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', 'MONITOR' => 'Predis\Command\ServerMonitor', 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', 'FLUSHALL' => 'Predis\Command\ServerFlushAll', 'SAVE' => 'Predis\Command\ServerSave', 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', 'LASTSAVE' => 'Predis\Command\ServerLastSave', 'SHUTDOWN' => 'Predis\Command\ServerShutdown', 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', /* ---------------- Redis 2.0 ---------------- */ /* commands operating on string values */ 'SETEX' => 'Predis\Command\StringSetExpire', 'APPEND' => 'Predis\Command\StringAppend', 'SUBSTR' => 'Predis\Command\StringSubstr', /* commands operating on lists */ 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', 'BRPOP' => 'Predis\Command\ListPopLastBlocking', /* commands operating on sorted sets */ 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', 'ZCOUNT' => 'Predis\Command\ZSetCount', 'ZRANK' => 'Predis\Command\ZSetRank', 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', /* commands operating on hashes */ 'HSET' => 'Predis\Command\HashSet', 'HSETNX' => 'Predis\Command\HashSetPreserve', 'HMSET' => 'Predis\Command\HashSetMultiple', 'HINCRBY' => 'Predis\Command\HashIncrementBy', 'HGET' => 'Predis\Command\HashGet', 'HMGET' => 'Predis\Command\HashGetMultiple', 'HDEL' => 'Predis\Command\HashDelete', 'HEXISTS' => 'Predis\Command\HashExists', 'HLEN' => 'Predis\Command\HashLength', 'HKEYS' => 'Predis\Command\HashKeys', 'HVALS' => 'Predis\Command\HashValues', 'HGETALL' => 'Predis\Command\HashGetAll', /* transactions */ 'MULTI' => 'Predis\Command\TransactionMulti', 'EXEC' => 'Predis\Command\TransactionExec', 'DISCARD' => 'Predis\Command\TransactionDiscard', /* publish - subscribe */ 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', 'PUBLISH' => 'Predis\Command\PubSubPublish', /* remote server control commands */ 'CONFIG' => 'Predis\Command\ServerConfig', ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisVersion220.php000066400000000000000000000206421361462701300305230ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; /** * Server profile for Redis 2.2. * * @author Daniele Alessandri */ class RedisVersion220 extends RedisProfile { /** * {@inheritdoc} */ public function getVersion() { return '2.2'; } /** * {@inheritdoc} */ public function getSupportedCommands() { return array( /* ---------------- Redis 1.2 ---------------- */ /* commands operating on the key space */ 'EXISTS' => 'Predis\Command\KeyExists', 'DEL' => 'Predis\Command\KeyDelete', 'TYPE' => 'Predis\Command\KeyType', 'KEYS' => 'Predis\Command\KeyKeys', 'RANDOMKEY' => 'Predis\Command\KeyRandom', 'RENAME' => 'Predis\Command\KeyRename', 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', 'EXPIRE' => 'Predis\Command\KeyExpire', 'EXPIREAT' => 'Predis\Command\KeyExpireAt', 'TTL' => 'Predis\Command\KeyTimeToLive', 'MOVE' => 'Predis\Command\KeyMove', 'SORT' => 'Predis\Command\KeySort', /* commands operating on string values */ 'SET' => 'Predis\Command\StringSet', 'SETNX' => 'Predis\Command\StringSetPreserve', 'MSET' => 'Predis\Command\StringSetMultiple', 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', 'GET' => 'Predis\Command\StringGet', 'MGET' => 'Predis\Command\StringGetMultiple', 'GETSET' => 'Predis\Command\StringGetSet', 'INCR' => 'Predis\Command\StringIncrement', 'INCRBY' => 'Predis\Command\StringIncrementBy', 'DECR' => 'Predis\Command\StringDecrement', 'DECRBY' => 'Predis\Command\StringDecrementBy', /* commands operating on lists */ 'RPUSH' => 'Predis\Command\ListPushTail', 'LPUSH' => 'Predis\Command\ListPushHead', 'LLEN' => 'Predis\Command\ListLength', 'LRANGE' => 'Predis\Command\ListRange', 'LTRIM' => 'Predis\Command\ListTrim', 'LINDEX' => 'Predis\Command\ListIndex', 'LSET' => 'Predis\Command\ListSet', 'LREM' => 'Predis\Command\ListRemove', 'LPOP' => 'Predis\Command\ListPopFirst', 'RPOP' => 'Predis\Command\ListPopLast', 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', /* commands operating on sets */ 'SADD' => 'Predis\Command\SetAdd', 'SREM' => 'Predis\Command\SetRemove', 'SPOP' => 'Predis\Command\SetPop', 'SMOVE' => 'Predis\Command\SetMove', 'SCARD' => 'Predis\Command\SetCardinality', 'SISMEMBER' => 'Predis\Command\SetIsMember', 'SINTER' => 'Predis\Command\SetIntersection', 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', 'SUNION' => 'Predis\Command\SetUnion', 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', 'SDIFF' => 'Predis\Command\SetDifference', 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', 'SMEMBERS' => 'Predis\Command\SetMembers', 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', /* commands operating on sorted sets */ 'ZADD' => 'Predis\Command\ZSetAdd', 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', 'ZREM' => 'Predis\Command\ZSetRemove', 'ZRANGE' => 'Predis\Command\ZSetRange', 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', 'ZCARD' => 'Predis\Command\ZSetCardinality', 'ZSCORE' => 'Predis\Command\ZSetScore', 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', /* connection related commands */ 'PING' => 'Predis\Command\ConnectionPing', 'AUTH' => 'Predis\Command\ConnectionAuth', 'SELECT' => 'Predis\Command\ConnectionSelect', 'ECHO' => 'Predis\Command\ConnectionEcho', 'QUIT' => 'Predis\Command\ConnectionQuit', /* remote server control commands */ 'INFO' => 'Predis\Command\ServerInfo', 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', 'MONITOR' => 'Predis\Command\ServerMonitor', 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', 'FLUSHALL' => 'Predis\Command\ServerFlushAll', 'SAVE' => 'Predis\Command\ServerSave', 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', 'LASTSAVE' => 'Predis\Command\ServerLastSave', 'SHUTDOWN' => 'Predis\Command\ServerShutdown', 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', /* ---------------- Redis 2.0 ---------------- */ /* commands operating on string values */ 'SETEX' => 'Predis\Command\StringSetExpire', 'APPEND' => 'Predis\Command\StringAppend', 'SUBSTR' => 'Predis\Command\StringSubstr', /* commands operating on lists */ 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', 'BRPOP' => 'Predis\Command\ListPopLastBlocking', /* commands operating on sorted sets */ 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', 'ZCOUNT' => 'Predis\Command\ZSetCount', 'ZRANK' => 'Predis\Command\ZSetRank', 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', /* commands operating on hashes */ 'HSET' => 'Predis\Command\HashSet', 'HSETNX' => 'Predis\Command\HashSetPreserve', 'HMSET' => 'Predis\Command\HashSetMultiple', 'HINCRBY' => 'Predis\Command\HashIncrementBy', 'HGET' => 'Predis\Command\HashGet', 'HMGET' => 'Predis\Command\HashGetMultiple', 'HDEL' => 'Predis\Command\HashDelete', 'HEXISTS' => 'Predis\Command\HashExists', 'HLEN' => 'Predis\Command\HashLength', 'HKEYS' => 'Predis\Command\HashKeys', 'HVALS' => 'Predis\Command\HashValues', 'HGETALL' => 'Predis\Command\HashGetAll', /* transactions */ 'MULTI' => 'Predis\Command\TransactionMulti', 'EXEC' => 'Predis\Command\TransactionExec', 'DISCARD' => 'Predis\Command\TransactionDiscard', /* publish - subscribe */ 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', 'PUBLISH' => 'Predis\Command\PubSubPublish', /* remote server control commands */ 'CONFIG' => 'Predis\Command\ServerConfig', /* ---------------- Redis 2.2 ---------------- */ /* commands operating on the key space */ 'PERSIST' => 'Predis\Command\KeyPersist', /* commands operating on string values */ 'STRLEN' => 'Predis\Command\StringStrlen', 'SETRANGE' => 'Predis\Command\StringSetRange', 'GETRANGE' => 'Predis\Command\StringGetRange', 'SETBIT' => 'Predis\Command\StringSetBit', 'GETBIT' => 'Predis\Command\StringGetBit', /* commands operating on lists */ 'RPUSHX' => 'Predis\Command\ListPushTailX', 'LPUSHX' => 'Predis\Command\ListPushHeadX', 'LINSERT' => 'Predis\Command\ListInsert', 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', /* commands operating on sorted sets */ 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', /* transactions */ 'WATCH' => 'Predis\Command\TransactionWatch', 'UNWATCH' => 'Predis\Command\TransactionUnwatch', /* remote server control commands */ 'OBJECT' => 'Predis\Command\ServerObject', 'SLOWLOG' => 'Predis\Command\ServerSlowlog', ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisVersion240.php000066400000000000000000000211121361462701300305160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; /** * Server profile for Redis 2.4. * * @author Daniele Alessandri */ class RedisVersion240 extends RedisProfile { /** * {@inheritdoc} */ public function getVersion() { return '2.4'; } /** * {@inheritdoc} */ public function getSupportedCommands() { return array( /* ---------------- Redis 1.2 ---------------- */ /* commands operating on the key space */ 'EXISTS' => 'Predis\Command\KeyExists', 'DEL' => 'Predis\Command\KeyDelete', 'TYPE' => 'Predis\Command\KeyType', 'KEYS' => 'Predis\Command\KeyKeys', 'RANDOMKEY' => 'Predis\Command\KeyRandom', 'RENAME' => 'Predis\Command\KeyRename', 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', 'EXPIRE' => 'Predis\Command\KeyExpire', 'EXPIREAT' => 'Predis\Command\KeyExpireAt', 'TTL' => 'Predis\Command\KeyTimeToLive', 'MOVE' => 'Predis\Command\KeyMove', 'SORT' => 'Predis\Command\KeySort', /* commands operating on string values */ 'SET' => 'Predis\Command\StringSet', 'SETNX' => 'Predis\Command\StringSetPreserve', 'MSET' => 'Predis\Command\StringSetMultiple', 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', 'GET' => 'Predis\Command\StringGet', 'MGET' => 'Predis\Command\StringGetMultiple', 'GETSET' => 'Predis\Command\StringGetSet', 'INCR' => 'Predis\Command\StringIncrement', 'INCRBY' => 'Predis\Command\StringIncrementBy', 'DECR' => 'Predis\Command\StringDecrement', 'DECRBY' => 'Predis\Command\StringDecrementBy', /* commands operating on lists */ 'RPUSH' => 'Predis\Command\ListPushTail', 'LPUSH' => 'Predis\Command\ListPushHead', 'LLEN' => 'Predis\Command\ListLength', 'LRANGE' => 'Predis\Command\ListRange', 'LTRIM' => 'Predis\Command\ListTrim', 'LINDEX' => 'Predis\Command\ListIndex', 'LSET' => 'Predis\Command\ListSet', 'LREM' => 'Predis\Command\ListRemove', 'LPOP' => 'Predis\Command\ListPopFirst', 'RPOP' => 'Predis\Command\ListPopLast', 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', /* commands operating on sets */ 'SADD' => 'Predis\Command\SetAdd', 'SREM' => 'Predis\Command\SetRemove', 'SPOP' => 'Predis\Command\SetPop', 'SMOVE' => 'Predis\Command\SetMove', 'SCARD' => 'Predis\Command\SetCardinality', 'SISMEMBER' => 'Predis\Command\SetIsMember', 'SINTER' => 'Predis\Command\SetIntersection', 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', 'SUNION' => 'Predis\Command\SetUnion', 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', 'SDIFF' => 'Predis\Command\SetDifference', 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', 'SMEMBERS' => 'Predis\Command\SetMembers', 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', /* commands operating on sorted sets */ 'ZADD' => 'Predis\Command\ZSetAdd', 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', 'ZREM' => 'Predis\Command\ZSetRemove', 'ZRANGE' => 'Predis\Command\ZSetRange', 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', 'ZCARD' => 'Predis\Command\ZSetCardinality', 'ZSCORE' => 'Predis\Command\ZSetScore', 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', /* connection related commands */ 'PING' => 'Predis\Command\ConnectionPing', 'AUTH' => 'Predis\Command\ConnectionAuth', 'SELECT' => 'Predis\Command\ConnectionSelect', 'ECHO' => 'Predis\Command\ConnectionEcho', 'QUIT' => 'Predis\Command\ConnectionQuit', /* remote server control commands */ 'INFO' => 'Predis\Command\ServerInfo', 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', 'MONITOR' => 'Predis\Command\ServerMonitor', 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', 'FLUSHALL' => 'Predis\Command\ServerFlushAll', 'SAVE' => 'Predis\Command\ServerSave', 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', 'LASTSAVE' => 'Predis\Command\ServerLastSave', 'SHUTDOWN' => 'Predis\Command\ServerShutdown', 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', /* ---------------- Redis 2.0 ---------------- */ /* commands operating on string values */ 'SETEX' => 'Predis\Command\StringSetExpire', 'APPEND' => 'Predis\Command\StringAppend', 'SUBSTR' => 'Predis\Command\StringSubstr', /* commands operating on lists */ 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', 'BRPOP' => 'Predis\Command\ListPopLastBlocking', /* commands operating on sorted sets */ 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', 'ZCOUNT' => 'Predis\Command\ZSetCount', 'ZRANK' => 'Predis\Command\ZSetRank', 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', /* commands operating on hashes */ 'HSET' => 'Predis\Command\HashSet', 'HSETNX' => 'Predis\Command\HashSetPreserve', 'HMSET' => 'Predis\Command\HashSetMultiple', 'HINCRBY' => 'Predis\Command\HashIncrementBy', 'HGET' => 'Predis\Command\HashGet', 'HMGET' => 'Predis\Command\HashGetMultiple', 'HDEL' => 'Predis\Command\HashDelete', 'HEXISTS' => 'Predis\Command\HashExists', 'HLEN' => 'Predis\Command\HashLength', 'HKEYS' => 'Predis\Command\HashKeys', 'HVALS' => 'Predis\Command\HashValues', 'HGETALL' => 'Predis\Command\HashGetAll', /* transactions */ 'MULTI' => 'Predis\Command\TransactionMulti', 'EXEC' => 'Predis\Command\TransactionExec', 'DISCARD' => 'Predis\Command\TransactionDiscard', /* publish - subscribe */ 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', 'PUBLISH' => 'Predis\Command\PubSubPublish', /* remote server control commands */ 'CONFIG' => 'Predis\Command\ServerConfig', /* ---------------- Redis 2.2 ---------------- */ /* commands operating on the key space */ 'PERSIST' => 'Predis\Command\KeyPersist', /* commands operating on string values */ 'STRLEN' => 'Predis\Command\StringStrlen', 'SETRANGE' => 'Predis\Command\StringSetRange', 'GETRANGE' => 'Predis\Command\StringGetRange', 'SETBIT' => 'Predis\Command\StringSetBit', 'GETBIT' => 'Predis\Command\StringGetBit', /* commands operating on lists */ 'RPUSHX' => 'Predis\Command\ListPushTailX', 'LPUSHX' => 'Predis\Command\ListPushHeadX', 'LINSERT' => 'Predis\Command\ListInsert', 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', /* commands operating on sorted sets */ 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', /* transactions */ 'WATCH' => 'Predis\Command\TransactionWatch', 'UNWATCH' => 'Predis\Command\TransactionUnwatch', /* remote server control commands */ 'OBJECT' => 'Predis\Command\ServerObject', 'SLOWLOG' => 'Predis\Command\ServerSlowlog', /* ---------------- Redis 2.4 ---------------- */ /* remote server control commands */ 'CLIENT' => 'Predis\Command\ServerClient', ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisVersion260.php000066400000000000000000000234341361462701300305310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; /** * Server profile for Redis 2.6. * * @author Daniele Alessandri */ class RedisVersion260 extends RedisProfile { /** * {@inheritdoc} */ public function getVersion() { return '2.6'; } /** * {@inheritdoc} */ public function getSupportedCommands() { return array( /* ---------------- Redis 1.2 ---------------- */ /* commands operating on the key space */ 'EXISTS' => 'Predis\Command\KeyExists', 'DEL' => 'Predis\Command\KeyDelete', 'TYPE' => 'Predis\Command\KeyType', 'KEYS' => 'Predis\Command\KeyKeys', 'RANDOMKEY' => 'Predis\Command\KeyRandom', 'RENAME' => 'Predis\Command\KeyRename', 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', 'EXPIRE' => 'Predis\Command\KeyExpire', 'EXPIREAT' => 'Predis\Command\KeyExpireAt', 'TTL' => 'Predis\Command\KeyTimeToLive', 'MOVE' => 'Predis\Command\KeyMove', 'SORT' => 'Predis\Command\KeySort', 'DUMP' => 'Predis\Command\KeyDump', 'RESTORE' => 'Predis\Command\KeyRestore', /* commands operating on string values */ 'SET' => 'Predis\Command\StringSet', 'SETNX' => 'Predis\Command\StringSetPreserve', 'MSET' => 'Predis\Command\StringSetMultiple', 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', 'GET' => 'Predis\Command\StringGet', 'MGET' => 'Predis\Command\StringGetMultiple', 'GETSET' => 'Predis\Command\StringGetSet', 'INCR' => 'Predis\Command\StringIncrement', 'INCRBY' => 'Predis\Command\StringIncrementBy', 'DECR' => 'Predis\Command\StringDecrement', 'DECRBY' => 'Predis\Command\StringDecrementBy', /* commands operating on lists */ 'RPUSH' => 'Predis\Command\ListPushTail', 'LPUSH' => 'Predis\Command\ListPushHead', 'LLEN' => 'Predis\Command\ListLength', 'LRANGE' => 'Predis\Command\ListRange', 'LTRIM' => 'Predis\Command\ListTrim', 'LINDEX' => 'Predis\Command\ListIndex', 'LSET' => 'Predis\Command\ListSet', 'LREM' => 'Predis\Command\ListRemove', 'LPOP' => 'Predis\Command\ListPopFirst', 'RPOP' => 'Predis\Command\ListPopLast', 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', /* commands operating on sets */ 'SADD' => 'Predis\Command\SetAdd', 'SREM' => 'Predis\Command\SetRemove', 'SPOP' => 'Predis\Command\SetPop', 'SMOVE' => 'Predis\Command\SetMove', 'SCARD' => 'Predis\Command\SetCardinality', 'SISMEMBER' => 'Predis\Command\SetIsMember', 'SINTER' => 'Predis\Command\SetIntersection', 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', 'SUNION' => 'Predis\Command\SetUnion', 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', 'SDIFF' => 'Predis\Command\SetDifference', 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', 'SMEMBERS' => 'Predis\Command\SetMembers', 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', /* commands operating on sorted sets */ 'ZADD' => 'Predis\Command\ZSetAdd', 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', 'ZREM' => 'Predis\Command\ZSetRemove', 'ZRANGE' => 'Predis\Command\ZSetRange', 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', 'ZCARD' => 'Predis\Command\ZSetCardinality', 'ZSCORE' => 'Predis\Command\ZSetScore', 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', /* connection related commands */ 'PING' => 'Predis\Command\ConnectionPing', 'AUTH' => 'Predis\Command\ConnectionAuth', 'SELECT' => 'Predis\Command\ConnectionSelect', 'ECHO' => 'Predis\Command\ConnectionEcho', 'QUIT' => 'Predis\Command\ConnectionQuit', /* remote server control commands */ 'INFO' => 'Predis\Command\ServerInfoV26x', 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', 'MONITOR' => 'Predis\Command\ServerMonitor', 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', 'FLUSHALL' => 'Predis\Command\ServerFlushAll', 'SAVE' => 'Predis\Command\ServerSave', 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', 'LASTSAVE' => 'Predis\Command\ServerLastSave', 'SHUTDOWN' => 'Predis\Command\ServerShutdown', 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', /* ---------------- Redis 2.0 ---------------- */ /* commands operating on string values */ 'SETEX' => 'Predis\Command\StringSetExpire', 'APPEND' => 'Predis\Command\StringAppend', 'SUBSTR' => 'Predis\Command\StringSubstr', /* commands operating on lists */ 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', 'BRPOP' => 'Predis\Command\ListPopLastBlocking', /* commands operating on sorted sets */ 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', 'ZCOUNT' => 'Predis\Command\ZSetCount', 'ZRANK' => 'Predis\Command\ZSetRank', 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', /* commands operating on hashes */ 'HSET' => 'Predis\Command\HashSet', 'HSETNX' => 'Predis\Command\HashSetPreserve', 'HMSET' => 'Predis\Command\HashSetMultiple', 'HINCRBY' => 'Predis\Command\HashIncrementBy', 'HGET' => 'Predis\Command\HashGet', 'HMGET' => 'Predis\Command\HashGetMultiple', 'HDEL' => 'Predis\Command\HashDelete', 'HEXISTS' => 'Predis\Command\HashExists', 'HLEN' => 'Predis\Command\HashLength', 'HKEYS' => 'Predis\Command\HashKeys', 'HVALS' => 'Predis\Command\HashValues', 'HGETALL' => 'Predis\Command\HashGetAll', /* transactions */ 'MULTI' => 'Predis\Command\TransactionMulti', 'EXEC' => 'Predis\Command\TransactionExec', 'DISCARD' => 'Predis\Command\TransactionDiscard', /* publish - subscribe */ 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', 'PUBLISH' => 'Predis\Command\PubSubPublish', /* remote server control commands */ 'CONFIG' => 'Predis\Command\ServerConfig', /* ---------------- Redis 2.2 ---------------- */ /* commands operating on the key space */ 'PERSIST' => 'Predis\Command\KeyPersist', /* commands operating on string values */ 'STRLEN' => 'Predis\Command\StringStrlen', 'SETRANGE' => 'Predis\Command\StringSetRange', 'GETRANGE' => 'Predis\Command\StringGetRange', 'SETBIT' => 'Predis\Command\StringSetBit', 'GETBIT' => 'Predis\Command\StringGetBit', /* commands operating on lists */ 'RPUSHX' => 'Predis\Command\ListPushTailX', 'LPUSHX' => 'Predis\Command\ListPushHeadX', 'LINSERT' => 'Predis\Command\ListInsert', 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', /* commands operating on sorted sets */ 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', /* transactions */ 'WATCH' => 'Predis\Command\TransactionWatch', 'UNWATCH' => 'Predis\Command\TransactionUnwatch', /* remote server control commands */ 'OBJECT' => 'Predis\Command\ServerObject', 'SLOWLOG' => 'Predis\Command\ServerSlowlog', /* ---------------- Redis 2.4 ---------------- */ /* remote server control commands */ 'CLIENT' => 'Predis\Command\ServerClient', /* ---------------- Redis 2.6 ---------------- */ /* commands operating on the key space */ 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', 'MIGRATE' => 'Predis\Command\KeyMigrate', /* commands operating on string values */ 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', 'BITOP' => 'Predis\Command\StringBitOp', 'BITCOUNT' => 'Predis\Command\StringBitCount', /* commands operating on hashes */ 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', /* scripting */ 'EVAL' => 'Predis\Command\ServerEval', 'EVALSHA' => 'Predis\Command\ServerEvalSHA', 'SCRIPT' => 'Predis\Command\ServerScript', /* remote server control commands */ 'TIME' => 'Predis\Command\ServerTime', 'SENTINEL' => 'Predis\Command\ServerSentinel', ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisVersion280.php000066400000000000000000000260151361462701300305310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; /** * Server profile for Redis 2.8. * * @author Daniele Alessandri */ class RedisVersion280 extends RedisProfile { /** * {@inheritdoc} */ public function getVersion() { return '2.8'; } /** * {@inheritdoc} */ public function getSupportedCommands() { return array( /* ---------------- Redis 1.2 ---------------- */ /* commands operating on the key space */ 'EXISTS' => 'Predis\Command\KeyExists', 'DEL' => 'Predis\Command\KeyDelete', 'TYPE' => 'Predis\Command\KeyType', 'KEYS' => 'Predis\Command\KeyKeys', 'RANDOMKEY' => 'Predis\Command\KeyRandom', 'RENAME' => 'Predis\Command\KeyRename', 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', 'EXPIRE' => 'Predis\Command\KeyExpire', 'EXPIREAT' => 'Predis\Command\KeyExpireAt', 'TTL' => 'Predis\Command\KeyTimeToLive', 'MOVE' => 'Predis\Command\KeyMove', 'SORT' => 'Predis\Command\KeySort', 'DUMP' => 'Predis\Command\KeyDump', 'RESTORE' => 'Predis\Command\KeyRestore', /* commands operating on string values */ 'SET' => 'Predis\Command\StringSet', 'SETNX' => 'Predis\Command\StringSetPreserve', 'MSET' => 'Predis\Command\StringSetMultiple', 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', 'GET' => 'Predis\Command\StringGet', 'MGET' => 'Predis\Command\StringGetMultiple', 'GETSET' => 'Predis\Command\StringGetSet', 'INCR' => 'Predis\Command\StringIncrement', 'INCRBY' => 'Predis\Command\StringIncrementBy', 'DECR' => 'Predis\Command\StringDecrement', 'DECRBY' => 'Predis\Command\StringDecrementBy', /* commands operating on lists */ 'RPUSH' => 'Predis\Command\ListPushTail', 'LPUSH' => 'Predis\Command\ListPushHead', 'LLEN' => 'Predis\Command\ListLength', 'LRANGE' => 'Predis\Command\ListRange', 'LTRIM' => 'Predis\Command\ListTrim', 'LINDEX' => 'Predis\Command\ListIndex', 'LSET' => 'Predis\Command\ListSet', 'LREM' => 'Predis\Command\ListRemove', 'LPOP' => 'Predis\Command\ListPopFirst', 'RPOP' => 'Predis\Command\ListPopLast', 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', /* commands operating on sets */ 'SADD' => 'Predis\Command\SetAdd', 'SREM' => 'Predis\Command\SetRemove', 'SPOP' => 'Predis\Command\SetPop', 'SMOVE' => 'Predis\Command\SetMove', 'SCARD' => 'Predis\Command\SetCardinality', 'SISMEMBER' => 'Predis\Command\SetIsMember', 'SINTER' => 'Predis\Command\SetIntersection', 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', 'SUNION' => 'Predis\Command\SetUnion', 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', 'SDIFF' => 'Predis\Command\SetDifference', 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', 'SMEMBERS' => 'Predis\Command\SetMembers', 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', /* commands operating on sorted sets */ 'ZADD' => 'Predis\Command\ZSetAdd', 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', 'ZREM' => 'Predis\Command\ZSetRemove', 'ZRANGE' => 'Predis\Command\ZSetRange', 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', 'ZCARD' => 'Predis\Command\ZSetCardinality', 'ZSCORE' => 'Predis\Command\ZSetScore', 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', /* connection related commands */ 'PING' => 'Predis\Command\ConnectionPing', 'AUTH' => 'Predis\Command\ConnectionAuth', 'SELECT' => 'Predis\Command\ConnectionSelect', 'ECHO' => 'Predis\Command\ConnectionEcho', 'QUIT' => 'Predis\Command\ConnectionQuit', /* remote server control commands */ 'INFO' => 'Predis\Command\ServerInfoV26x', 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', 'MONITOR' => 'Predis\Command\ServerMonitor', 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', 'FLUSHALL' => 'Predis\Command\ServerFlushAll', 'SAVE' => 'Predis\Command\ServerSave', 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', 'LASTSAVE' => 'Predis\Command\ServerLastSave', 'SHUTDOWN' => 'Predis\Command\ServerShutdown', 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', /* ---------------- Redis 2.0 ---------------- */ /* commands operating on string values */ 'SETEX' => 'Predis\Command\StringSetExpire', 'APPEND' => 'Predis\Command\StringAppend', 'SUBSTR' => 'Predis\Command\StringSubstr', /* commands operating on lists */ 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', 'BRPOP' => 'Predis\Command\ListPopLastBlocking', /* commands operating on sorted sets */ 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', 'ZCOUNT' => 'Predis\Command\ZSetCount', 'ZRANK' => 'Predis\Command\ZSetRank', 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', /* commands operating on hashes */ 'HSET' => 'Predis\Command\HashSet', 'HSETNX' => 'Predis\Command\HashSetPreserve', 'HMSET' => 'Predis\Command\HashSetMultiple', 'HINCRBY' => 'Predis\Command\HashIncrementBy', 'HGET' => 'Predis\Command\HashGet', 'HMGET' => 'Predis\Command\HashGetMultiple', 'HDEL' => 'Predis\Command\HashDelete', 'HEXISTS' => 'Predis\Command\HashExists', 'HLEN' => 'Predis\Command\HashLength', 'HKEYS' => 'Predis\Command\HashKeys', 'HVALS' => 'Predis\Command\HashValues', 'HGETALL' => 'Predis\Command\HashGetAll', /* transactions */ 'MULTI' => 'Predis\Command\TransactionMulti', 'EXEC' => 'Predis\Command\TransactionExec', 'DISCARD' => 'Predis\Command\TransactionDiscard', /* publish - subscribe */ 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', 'PUBLISH' => 'Predis\Command\PubSubPublish', /* remote server control commands */ 'CONFIG' => 'Predis\Command\ServerConfig', /* ---------------- Redis 2.2 ---------------- */ /* commands operating on the key space */ 'PERSIST' => 'Predis\Command\KeyPersist', /* commands operating on string values */ 'STRLEN' => 'Predis\Command\StringStrlen', 'SETRANGE' => 'Predis\Command\StringSetRange', 'GETRANGE' => 'Predis\Command\StringGetRange', 'SETBIT' => 'Predis\Command\StringSetBit', 'GETBIT' => 'Predis\Command\StringGetBit', /* commands operating on lists */ 'RPUSHX' => 'Predis\Command\ListPushTailX', 'LPUSHX' => 'Predis\Command\ListPushHeadX', 'LINSERT' => 'Predis\Command\ListInsert', 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', /* commands operating on sorted sets */ 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', /* transactions */ 'WATCH' => 'Predis\Command\TransactionWatch', 'UNWATCH' => 'Predis\Command\TransactionUnwatch', /* remote server control commands */ 'OBJECT' => 'Predis\Command\ServerObject', 'SLOWLOG' => 'Predis\Command\ServerSlowlog', /* ---------------- Redis 2.4 ---------------- */ /* remote server control commands */ 'CLIENT' => 'Predis\Command\ServerClient', /* ---------------- Redis 2.6 ---------------- */ /* commands operating on the key space */ 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', 'MIGRATE' => 'Predis\Command\KeyMigrate', /* commands operating on string values */ 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', 'BITOP' => 'Predis\Command\StringBitOp', 'BITCOUNT' => 'Predis\Command\StringBitCount', /* commands operating on hashes */ 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', /* scripting */ 'EVAL' => 'Predis\Command\ServerEval', 'EVALSHA' => 'Predis\Command\ServerEvalSHA', 'SCRIPT' => 'Predis\Command\ServerScript', /* remote server control commands */ 'TIME' => 'Predis\Command\ServerTime', 'SENTINEL' => 'Predis\Command\ServerSentinel', /* ---------------- Redis 2.8 ---------------- */ /* commands operating on the key space */ 'SCAN' => 'Predis\Command\KeyScan', /* commands operating on string values */ 'BITPOS' => 'Predis\Command\StringBitPos', /* commands operating on sets */ 'SSCAN' => 'Predis\Command\SetScan', /* commands operating on sorted sets */ 'ZSCAN' => 'Predis\Command\ZSetScan', 'ZLEXCOUNT' => 'Predis\Command\ZSetLexCount', 'ZRANGEBYLEX' => 'Predis\Command\ZSetRangeByLex', 'ZREMRANGEBYLEX' => 'Predis\Command\ZSetRemoveRangeByLex', 'ZREVRANGEBYLEX' => 'Predis\Command\ZSetReverseRangeByLex', /* commands operating on hashes */ 'HSCAN' => 'Predis\Command\HashScan', /* publish - subscribe */ 'PUBSUB' => 'Predis\Command\PubSubPubsub', /* commands operating on HyperLogLog */ 'PFADD' => 'Predis\Command\HyperLogLogAdd', 'PFCOUNT' => 'Predis\Command\HyperLogLogCount', 'PFMERGE' => 'Predis\Command\HyperLogLogMerge', /* remote server control commands */ 'COMMAND' => 'Predis\Command\ServerCommand', ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Profile/RedisVersion300.php000066400000000000000000000261151361462701300305230ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Profile; /** * Server profile for Redis 3.0. * * @author Daniele Alessandri */ class RedisVersion300 extends RedisProfile { /** * {@inheritdoc} */ public function getVersion() { return '3.0'; } /** * {@inheritdoc} */ public function getSupportedCommands() { return array( /* ---------------- Redis 1.2 ---------------- */ /* commands operating on the key space */ 'EXISTS' => 'Predis\Command\KeyExists', 'DEL' => 'Predis\Command\KeyDelete', 'TYPE' => 'Predis\Command\KeyType', 'KEYS' => 'Predis\Command\KeyKeys', 'RANDOMKEY' => 'Predis\Command\KeyRandom', 'RENAME' => 'Predis\Command\KeyRename', 'RENAMENX' => 'Predis\Command\KeyRenamePreserve', 'EXPIRE' => 'Predis\Command\KeyExpire', 'EXPIREAT' => 'Predis\Command\KeyExpireAt', 'TTL' => 'Predis\Command\KeyTimeToLive', 'MOVE' => 'Predis\Command\KeyMove', 'SORT' => 'Predis\Command\KeySort', 'DUMP' => 'Predis\Command\KeyDump', 'RESTORE' => 'Predis\Command\KeyRestore', /* commands operating on string values */ 'SET' => 'Predis\Command\StringSet', 'SETNX' => 'Predis\Command\StringSetPreserve', 'MSET' => 'Predis\Command\StringSetMultiple', 'MSETNX' => 'Predis\Command\StringSetMultiplePreserve', 'GET' => 'Predis\Command\StringGet', 'MGET' => 'Predis\Command\StringGetMultiple', 'GETSET' => 'Predis\Command\StringGetSet', 'INCR' => 'Predis\Command\StringIncrement', 'INCRBY' => 'Predis\Command\StringIncrementBy', 'DECR' => 'Predis\Command\StringDecrement', 'DECRBY' => 'Predis\Command\StringDecrementBy', /* commands operating on lists */ 'RPUSH' => 'Predis\Command\ListPushTail', 'LPUSH' => 'Predis\Command\ListPushHead', 'LLEN' => 'Predis\Command\ListLength', 'LRANGE' => 'Predis\Command\ListRange', 'LTRIM' => 'Predis\Command\ListTrim', 'LINDEX' => 'Predis\Command\ListIndex', 'LSET' => 'Predis\Command\ListSet', 'LREM' => 'Predis\Command\ListRemove', 'LPOP' => 'Predis\Command\ListPopFirst', 'RPOP' => 'Predis\Command\ListPopLast', 'RPOPLPUSH' => 'Predis\Command\ListPopLastPushHead', /* commands operating on sets */ 'SADD' => 'Predis\Command\SetAdd', 'SREM' => 'Predis\Command\SetRemove', 'SPOP' => 'Predis\Command\SetPop', 'SMOVE' => 'Predis\Command\SetMove', 'SCARD' => 'Predis\Command\SetCardinality', 'SISMEMBER' => 'Predis\Command\SetIsMember', 'SINTER' => 'Predis\Command\SetIntersection', 'SINTERSTORE' => 'Predis\Command\SetIntersectionStore', 'SUNION' => 'Predis\Command\SetUnion', 'SUNIONSTORE' => 'Predis\Command\SetUnionStore', 'SDIFF' => 'Predis\Command\SetDifference', 'SDIFFSTORE' => 'Predis\Command\SetDifferenceStore', 'SMEMBERS' => 'Predis\Command\SetMembers', 'SRANDMEMBER' => 'Predis\Command\SetRandomMember', /* commands operating on sorted sets */ 'ZADD' => 'Predis\Command\ZSetAdd', 'ZINCRBY' => 'Predis\Command\ZSetIncrementBy', 'ZREM' => 'Predis\Command\ZSetRemove', 'ZRANGE' => 'Predis\Command\ZSetRange', 'ZREVRANGE' => 'Predis\Command\ZSetReverseRange', 'ZRANGEBYSCORE' => 'Predis\Command\ZSetRangeByScore', 'ZCARD' => 'Predis\Command\ZSetCardinality', 'ZSCORE' => 'Predis\Command\ZSetScore', 'ZREMRANGEBYSCORE' => 'Predis\Command\ZSetRemoveRangeByScore', /* connection related commands */ 'PING' => 'Predis\Command\ConnectionPing', 'AUTH' => 'Predis\Command\ConnectionAuth', 'SELECT' => 'Predis\Command\ConnectionSelect', 'ECHO' => 'Predis\Command\ConnectionEcho', 'QUIT' => 'Predis\Command\ConnectionQuit', /* remote server control commands */ 'INFO' => 'Predis\Command\ServerInfoV26x', 'SLAVEOF' => 'Predis\Command\ServerSlaveOf', 'MONITOR' => 'Predis\Command\ServerMonitor', 'DBSIZE' => 'Predis\Command\ServerDatabaseSize', 'FLUSHDB' => 'Predis\Command\ServerFlushDatabase', 'FLUSHALL' => 'Predis\Command\ServerFlushAll', 'SAVE' => 'Predis\Command\ServerSave', 'BGSAVE' => 'Predis\Command\ServerBackgroundSave', 'LASTSAVE' => 'Predis\Command\ServerLastSave', 'SHUTDOWN' => 'Predis\Command\ServerShutdown', 'BGREWRITEAOF' => 'Predis\Command\ServerBackgroundRewriteAOF', /* ---------------- Redis 2.0 ---------------- */ /* commands operating on string values */ 'SETEX' => 'Predis\Command\StringSetExpire', 'APPEND' => 'Predis\Command\StringAppend', 'SUBSTR' => 'Predis\Command\StringSubstr', /* commands operating on lists */ 'BLPOP' => 'Predis\Command\ListPopFirstBlocking', 'BRPOP' => 'Predis\Command\ListPopLastBlocking', /* commands operating on sorted sets */ 'ZUNIONSTORE' => 'Predis\Command\ZSetUnionStore', 'ZINTERSTORE' => 'Predis\Command\ZSetIntersectionStore', 'ZCOUNT' => 'Predis\Command\ZSetCount', 'ZRANK' => 'Predis\Command\ZSetRank', 'ZREVRANK' => 'Predis\Command\ZSetReverseRank', 'ZREMRANGEBYRANK' => 'Predis\Command\ZSetRemoveRangeByRank', /* commands operating on hashes */ 'HSET' => 'Predis\Command\HashSet', 'HSETNX' => 'Predis\Command\HashSetPreserve', 'HMSET' => 'Predis\Command\HashSetMultiple', 'HINCRBY' => 'Predis\Command\HashIncrementBy', 'HGET' => 'Predis\Command\HashGet', 'HMGET' => 'Predis\Command\HashGetMultiple', 'HDEL' => 'Predis\Command\HashDelete', 'HEXISTS' => 'Predis\Command\HashExists', 'HLEN' => 'Predis\Command\HashLength', 'HKEYS' => 'Predis\Command\HashKeys', 'HVALS' => 'Predis\Command\HashValues', 'HGETALL' => 'Predis\Command\HashGetAll', /* transactions */ 'MULTI' => 'Predis\Command\TransactionMulti', 'EXEC' => 'Predis\Command\TransactionExec', 'DISCARD' => 'Predis\Command\TransactionDiscard', /* publish - subscribe */ 'SUBSCRIBE' => 'Predis\Command\PubSubSubscribe', 'UNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribe', 'PSUBSCRIBE' => 'Predis\Command\PubSubSubscribeByPattern', 'PUNSUBSCRIBE' => 'Predis\Command\PubSubUnsubscribeByPattern', 'PUBLISH' => 'Predis\Command\PubSubPublish', /* remote server control commands */ 'CONFIG' => 'Predis\Command\ServerConfig', /* ---------------- Redis 2.2 ---------------- */ /* commands operating on the key space */ 'PERSIST' => 'Predis\Command\KeyPersist', /* commands operating on string values */ 'STRLEN' => 'Predis\Command\StringStrlen', 'SETRANGE' => 'Predis\Command\StringSetRange', 'GETRANGE' => 'Predis\Command\StringGetRange', 'SETBIT' => 'Predis\Command\StringSetBit', 'GETBIT' => 'Predis\Command\StringGetBit', /* commands operating on lists */ 'RPUSHX' => 'Predis\Command\ListPushTailX', 'LPUSHX' => 'Predis\Command\ListPushHeadX', 'LINSERT' => 'Predis\Command\ListInsert', 'BRPOPLPUSH' => 'Predis\Command\ListPopLastPushHeadBlocking', /* commands operating on sorted sets */ 'ZREVRANGEBYSCORE' => 'Predis\Command\ZSetReverseRangeByScore', /* transactions */ 'WATCH' => 'Predis\Command\TransactionWatch', 'UNWATCH' => 'Predis\Command\TransactionUnwatch', /* remote server control commands */ 'OBJECT' => 'Predis\Command\ServerObject', 'SLOWLOG' => 'Predis\Command\ServerSlowlog', /* ---------------- Redis 2.4 ---------------- */ /* remote server control commands */ 'CLIENT' => 'Predis\Command\ServerClient', /* ---------------- Redis 2.6 ---------------- */ /* commands operating on the key space */ 'PTTL' => 'Predis\Command\KeyPreciseTimeToLive', 'PEXPIRE' => 'Predis\Command\KeyPreciseExpire', 'PEXPIREAT' => 'Predis\Command\KeyPreciseExpireAt', 'MIGRATE' => 'Predis\Command\KeyMigrate', /* commands operating on string values */ 'PSETEX' => 'Predis\Command\StringPreciseSetExpire', 'INCRBYFLOAT' => 'Predis\Command\StringIncrementByFloat', 'BITOP' => 'Predis\Command\StringBitOp', 'BITCOUNT' => 'Predis\Command\StringBitCount', /* commands operating on hashes */ 'HINCRBYFLOAT' => 'Predis\Command\HashIncrementByFloat', /* scripting */ 'EVAL' => 'Predis\Command\ServerEval', 'EVALSHA' => 'Predis\Command\ServerEvalSHA', 'SCRIPT' => 'Predis\Command\ServerScript', /* remote server control commands */ 'TIME' => 'Predis\Command\ServerTime', 'SENTINEL' => 'Predis\Command\ServerSentinel', /* ---------------- Redis 2.8 ---------------- */ /* commands operating on the key space */ 'SCAN' => 'Predis\Command\KeyScan', /* commands operating on string values */ 'BITPOS' => 'Predis\Command\StringBitPos', /* commands operating on sets */ 'SSCAN' => 'Predis\Command\SetScan', /* commands operating on sorted sets */ 'ZSCAN' => 'Predis\Command\ZSetScan', 'ZLEXCOUNT' => 'Predis\Command\ZSetLexCount', 'ZRANGEBYLEX' => 'Predis\Command\ZSetRangeByLex', 'ZREMRANGEBYLEX' => 'Predis\Command\ZSetRemoveRangeByLex', 'ZREVRANGEBYLEX' => 'Predis\Command\ZSetReverseRangeByLex', /* commands operating on hashes */ 'HSCAN' => 'Predis\Command\HashScan', /* publish - subscribe */ 'PUBSUB' => 'Predis\Command\PubSubPubsub', /* commands operating on HyperLogLog */ 'PFADD' => 'Predis\Command\HyperLogLogAdd', 'PFCOUNT' => 'Predis\Command\HyperLogLogCount', 'PFMERGE' => 'Predis\Command\HyperLogLogMerge', /* remote server control commands */ 'COMMAND' => 'Predis\Command\ServerCommand', /* ---------------- Redis 3.0 ---------------- */ ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/000077500000000000000000000000001361462701300253475ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/ProtocolException.php000066400000000000000000000010101361462701300315300ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol; use Predis\CommunicationException; /** * Exception used to indentify errors encountered while parsing the Redis wire * protocol. * * @author Daniele Alessandri */ class ProtocolException extends CommunicationException { } ProtocolProcessorInterface.php000066400000000000000000000022301361462701300333200ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol; use Predis\Command\CommandInterface; use Predis\Connection\CompositeConnectionInterface; /** * Defines a pluggable protocol processor capable of serializing commands and * deserializing responses into PHP objects directly from a connection. * * @author Daniele Alessandri */ interface ProtocolProcessorInterface { /** * Writes a request over a connection to Redis. * * @param CompositeConnectionInterface $connection Redis connection. * @param CommandInterface $command Command instance. */ public function write(CompositeConnectionInterface $connection, CommandInterface $command); /** * Reads a response from a connection to Redis. * * @param CompositeConnectionInterface $connection Redis connection. * * @return mixed */ public function read(CompositeConnectionInterface $connection); } RequestSerializerInterface.php000066400000000000000000000012321361462701300333020ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol; use Predis\Command\CommandInterface; /** * Defines a pluggable serializer for Redis commands. * * @author Daniele Alessandri */ interface RequestSerializerInterface { /** * Serializes a Redis command. * * @param CommandInterface $command Redis command. * * @return string */ public function serialize(CommandInterface $command); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/ResponseReaderInterface.php000066400000000000000000000014231361462701300326220ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol; use Predis\Connection\CompositeConnectionInterface; /** * Defines a pluggable reader capable of parsing responses returned by Redis and * deserializing them to PHP objects. * * @author Daniele Alessandri */ interface ResponseReaderInterface { /** * Reads a response from a connection to Redis. * * @param CompositeConnectionInterface $connection Redis connection. * * @return mixed */ public function read(CompositeConnectionInterface $connection); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/000077500000000000000000000000001361462701300262735ustar00rootroot00000000000000CompositeProtocolProcessor.php000066400000000000000000000054161361462701300343170ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text; use Predis\Command\CommandInterface; use Predis\Connection\CompositeConnectionInterface; use Predis\Protocol\ProtocolProcessorInterface; use Predis\Protocol\RequestSerializerInterface; use Predis\Protocol\ResponseReaderInterface; /** * Composite protocol processor for the standard Redis wire protocol using * pluggable handlers to serialize requests and deserialize responses. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class CompositeProtocolProcessor implements ProtocolProcessorInterface { /* * @var RequestSerializerInterface */ protected $serializer; /* * @var ResponseReaderInterface */ protected $reader; /** * @param RequestSerializerInterface $serializer Request serializer. * @param ResponseReaderInterface $reader Response reader. */ public function __construct( RequestSerializerInterface $serializer = null, ResponseReaderInterface $reader = null ) { $this->setRequestSerializer($serializer ?: new RequestSerializer()); $this->setResponseReader($reader ?: new ResponseReader()); } /** * {@inheritdoc} */ public function write(CompositeConnectionInterface $connection, CommandInterface $command) { $connection->writeBuffer($this->serializer->serialize($command)); } /** * {@inheritdoc} */ public function read(CompositeConnectionInterface $connection) { return $this->reader->read($connection); } /** * Sets the request serializer used by the protocol processor. * * @param RequestSerializerInterface $serializer Request serializer. */ public function setRequestSerializer(RequestSerializerInterface $serializer) { $this->serializer = $serializer; } /** * Returns the request serializer used by the protocol processor. * * @return RequestSerializerInterface */ public function getRequestSerializer() { return $this->serializer; } /** * Sets the response reader used by the protocol processor. * * @param ResponseReaderInterface $reader Response reader. */ public function setResponseReader(ResponseReaderInterface $reader) { $this->reader = $reader; } /** * Returns the Response reader used by the protocol processor. * * @return ResponseReaderInterface */ public function getResponseReader() { return $this->reader; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler/000077500000000000000000000000001361462701300276505ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler/BulkResponse.php000066400000000000000000000026401361462701300327770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text\Handler; use Predis\CommunicationException; use Predis\Connection\CompositeConnectionInterface; use Predis\Protocol\ProtocolException; /** * Handler for the bulk response type in the standard Redis wire protocol. * It translates the payload to a string or a NULL. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class BulkResponse implements ResponseHandlerInterface { /** * {@inheritdoc} */ public function handle(CompositeConnectionInterface $connection, $payload) { $length = (int) $payload; if ("$length" !== $payload) { CommunicationException::handle(new ProtocolException( $connection, "Cannot parse '$payload' as a valid length for a bulk response." )); } if ($length >= 0) { return substr($connection->readBuffer($length + 2), 0, -2); } if ($length == -1) { return; } CommunicationException::handle(new ProtocolException( $connection, "Value '$payload' is not a valid length for a bulk response." )); return; } } ErrorResponse.php000066400000000000000000000015101361462701300331070ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text\Handler; use Predis\Connection\CompositeConnectionInterface; use Predis\Response\Error; /** * Handler for the error response type in the standard Redis wire protocol. * It translates the payload to a complex response object for Predis. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class ErrorResponse implements ResponseHandlerInterface { /** * {@inheritdoc} */ public function handle(CompositeConnectionInterface $connection, $payload) { return new Error($payload); } } IntegerResponse.php000066400000000000000000000021671361462701300334240ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text\Handler; use Predis\CommunicationException; use Predis\Connection\CompositeConnectionInterface; use Predis\Protocol\ProtocolException; /** * Handler for the integer response type in the standard Redis wire protocol. * It translates the payload an integer or NULL. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class IntegerResponse implements ResponseHandlerInterface { /** * {@inheritdoc} */ public function handle(CompositeConnectionInterface $connection, $payload) { if (is_numeric($payload)) { return (int) $payload; } if ($payload !== 'nil') { CommunicationException::handle(new ProtocolException( $connection, "Cannot parse '$payload' as a valid numeric response." )); } return; } } MultiBulkResponse.php000066400000000000000000000035051361462701300337340ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text\Handler; use Predis\CommunicationException; use Predis\Connection\CompositeConnectionInterface; use Predis\Protocol\ProtocolException; /** * Handler for the multibulk response type in the standard Redis wire protocol. * It returns multibulk responses as PHP arrays. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class MultiBulkResponse implements ResponseHandlerInterface { /** * {@inheritdoc} */ public function handle(CompositeConnectionInterface $connection, $payload) { $length = (int) $payload; if ("$length" !== $payload) { CommunicationException::handle(new ProtocolException( $connection, "Cannot parse '$payload' as a valid length of a multi-bulk response." )); } if ($length === -1) { return; } $list = array(); if ($length > 0) { $handlersCache = array(); $reader = $connection->getProtocol()->getResponseReader(); for ($i = 0; $i < $length; ++$i) { $header = $connection->readLine(); $prefix = $header[0]; if (isset($handlersCache[$prefix])) { $handler = $handlersCache[$prefix]; } else { $handler = $reader->getHandler($prefix); $handlersCache[$prefix] = $handler; } $list[$i] = $handler->handle($connection, substr($header, 1)); } } return $list; } } ResponseHandlerInterface.php000066400000000000000000000016001361462701300352140ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text\Handler; use Predis\Connection\CompositeConnectionInterface; /** * Defines a pluggable handler used to parse a particular type of response. * * @author Daniele Alessandri */ interface ResponseHandlerInterface { /** * Deserializes a response returned by Redis and reads more data from the * connection if needed. * * @param CompositeConnectionInterface $connection Redis connection. * @param string $payload String payload. * * @return mixed */ public function handle(CompositeConnectionInterface $connection, $payload); } StatusResponse.php000066400000000000000000000015661361462701300333140ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text\Handler; use Predis\Connection\CompositeConnectionInterface; use Predis\Response\Status; /** * Handler for the status response type in the standard Redis wire protocol. It * translates certain classes of status response to PHP objects or just returns * the payload as a string. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class StatusResponse implements ResponseHandlerInterface { /** * {@inheritdoc} */ public function handle(CompositeConnectionInterface $connection, $payload) { return Status::get($payload); } } StreamableMultiBulkResponse.php000066400000000000000000000026231361462701300357340ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/Handler * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text\Handler; use Predis\CommunicationException; use Predis\Connection\CompositeConnectionInterface; use Predis\Protocol\ProtocolException; use Predis\Response\Iterator\MultiBulk as MultiBulkIterator; /** * Handler for the multibulk response type in the standard Redis wire protocol. * It returns multibulk responses as iterators that can stream bulk elements. * * Streamable multibulk responses are not globally supported by the abstractions * built-in into Predis, such as transactions or pipelines. Use them with care! * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class StreamableMultiBulkResponse implements ResponseHandlerInterface { /** * {@inheritdoc} */ public function handle(CompositeConnectionInterface $connection, $payload) { $length = (int) $payload; if ("$length" != $payload) { CommunicationException::handle(new ProtocolException( $connection, "Cannot parse '$payload' as a valid length for a multi-bulk response." )); } return new MultiBulkIterator($connection, $length); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/ProtocolProcessor.php000066400000000000000000000063351361462701300325140ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text; use Predis\Command\CommandInterface; use Predis\CommunicationException; use Predis\Connection\CompositeConnectionInterface; use Predis\Protocol\ProtocolException; use Predis\Protocol\ProtocolProcessorInterface; use Predis\Response\Error as ErrorResponse; use Predis\Response\Iterator\MultiBulk as MultiBulkIterator; use Predis\Response\Status as StatusResponse; /** * Protocol processor for the standard Redis wire protocol. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class ProtocolProcessor implements ProtocolProcessorInterface { protected $mbiterable; protected $serializer; /** * */ public function __construct() { $this->mbiterable = false; $this->serializer = new RequestSerializer(); } /** * {@inheritdoc} */ public function write(CompositeConnectionInterface $connection, CommandInterface $command) { $request = $this->serializer->serialize($command); $connection->writeBuffer($request); } /** * {@inheritdoc} */ public function read(CompositeConnectionInterface $connection) { $chunk = $connection->readLine(); $prefix = $chunk[0]; $payload = substr($chunk, 1); switch ($prefix) { case '+': return new StatusResponse($payload); case '$': $size = (int) $payload; if ($size === -1) { return; } return substr($connection->readBuffer($size + 2), 0, -2); case '*': $count = (int) $payload; if ($count === -1) { return; } if ($this->mbiterable) { return new MultiBulkIterator($connection, $count); } $multibulk = array(); for ($i = 0; $i < $count; ++$i) { $multibulk[$i] = $this->read($connection); } return $multibulk; case ':': return (int) $payload; case '-': return new ErrorResponse($payload); default: CommunicationException::handle(new ProtocolException( $connection, "Unknown response prefix: '$prefix'." )); return; } } /** * Enables or disables returning multibulk responses as specialized PHP * iterators used to stream bulk elements of a multibulk response instead * returning a plain array. * * Streamable multibulk responses are not globally supported by the * abstractions built-in into Predis, such as transactions or pipelines. * Use them with care! * * @param bool $value Enable or disable streamable multibulk responses. */ public function useIterableMultibulk($value) { $this->mbiterable = (bool) $value; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/RequestSerializer.php000066400000000000000000000022131361462701300324640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text; use Predis\Command\CommandInterface; use Predis\Protocol\RequestSerializerInterface; /** * Request serializer for the standard Redis wire protocol. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class RequestSerializer implements RequestSerializerInterface { /** * {@inheritdoc} */ public function serialize(CommandInterface $command) { $commandID = $command->getId(); $arguments = $command->getArguments(); $cmdlen = strlen($commandID); $reqlen = count($arguments) + 1; $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n"; for ($i = 0, $reqlen--; $i < $reqlen; ++$i) { $argument = $arguments[$i]; $arglen = strlen($argument); $buffer .= "\${$arglen}\r\n{$argument}\r\n"; } return $buffer; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Protocol/Text/ResponseReader.php000066400000000000000000000061141361462701300317270ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Protocol\Text; use Predis\CommunicationException; use Predis\Connection\CompositeConnectionInterface; use Predis\Protocol\ProtocolException; use Predis\Protocol\ResponseReaderInterface; /** * Response reader for the standard Redis wire protocol. * * @link http://redis.io/topics/protocol * * @author Daniele Alessandri */ class ResponseReader implements ResponseReaderInterface { protected $handlers; /** * */ public function __construct() { $this->handlers = $this->getDefaultHandlers(); } /** * Returns the default handlers for the supported type of responses. * * @return array */ protected function getDefaultHandlers() { return array( '+' => new Handler\StatusResponse(), '-' => new Handler\ErrorResponse(), ':' => new Handler\IntegerResponse(), '$' => new Handler\BulkResponse(), '*' => new Handler\MultiBulkResponse(), ); } /** * Sets the handler for the specified prefix identifying the response type. * * @param string $prefix Identifier of the type of response. * @param Handler\ResponseHandlerInterface $handler Response handler. */ public function setHandler($prefix, Handler\ResponseHandlerInterface $handler) { $this->handlers[$prefix] = $handler; } /** * Returns the response handler associated to a certain type of response. * * @param string $prefix Identifier of the type of response. * * @return Handler\ResponseHandlerInterface */ public function getHandler($prefix) { if (isset($this->handlers[$prefix])) { return $this->handlers[$prefix]; } return; } /** * {@inheritdoc} */ public function read(CompositeConnectionInterface $connection) { $header = $connection->readLine(); if ($header === '') { $this->onProtocolError($connection, 'Unexpected empty reponse header.'); } $prefix = $header[0]; if (!isset($this->handlers[$prefix])) { $this->onProtocolError($connection, "Unknown response prefix: '$prefix'."); } $payload = $this->handlers[$prefix]->handle($connection, substr($header, 1)); return $payload; } /** * Handles protocol errors generated while reading responses from a * connection. * * @param CompositeConnectionInterface $connection Redis connection that generated the error. * @param string $message Error message. */ protected function onProtocolError(CompositeConnectionInterface $connection, $message) { CommunicationException::handle( new ProtocolException($connection, $message) ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/PubSub/000077500000000000000000000000001361462701300247465ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/PubSub/AbstractConsumer.php000066400000000000000000000125721361462701300307450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\PubSub; /** * Base implementation of a PUB/SUB consumer abstraction based on PHP iterators. * * @author Daniele Alessandri */ abstract class AbstractConsumer implements \Iterator { const SUBSCRIBE = 'subscribe'; const UNSUBSCRIBE = 'unsubscribe'; const PSUBSCRIBE = 'psubscribe'; const PUNSUBSCRIBE = 'punsubscribe'; const MESSAGE = 'message'; const PMESSAGE = 'pmessage'; const PONG = 'pong'; const STATUS_VALID = 1; // 0b0001 const STATUS_SUBSCRIBED = 2; // 0b0010 const STATUS_PSUBSCRIBED = 4; // 0b0100 private $position = null; private $statusFlags = self::STATUS_VALID; /** * Automatically stops the consumer when the garbage collector kicks in. */ public function __destruct() { $this->stop(true); } /** * Checks if the specified flag is valid based on the state of the consumer. * * @param int $value Flag. * * @return bool */ protected function isFlagSet($value) { return ($this->statusFlags & $value) === $value; } /** * Subscribes to the specified channels. * * @param mixed $channel,... One or more channel names. */ public function subscribe($channel /*, ... */) { $this->writeRequest(self::SUBSCRIBE, func_get_args()); $this->statusFlags |= self::STATUS_SUBSCRIBED; } /** * Unsubscribes from the specified channels. * * @param string ... One or more channel names. */ public function unsubscribe(/* ... */) { $this->writeRequest(self::UNSUBSCRIBE, func_get_args()); } /** * Subscribes to the specified channels using a pattern. * * @param mixed $pattern,... One or more channel name patterns. */ public function psubscribe($pattern /* ... */) { $this->writeRequest(self::PSUBSCRIBE, func_get_args()); $this->statusFlags |= self::STATUS_PSUBSCRIBED; } /** * Unsubscribes from the specified channels using a pattern. * * @param string ... One or more channel name patterns. */ public function punsubscribe(/* ... */) { $this->writeRequest(self::PUNSUBSCRIBE, func_get_args()); } /** * PING the server with an optional payload that will be echoed as a * PONG message in the pub/sub loop. * * @param string $payload Optional PING payload. */ public function ping($payload = null) { $this->writeRequest('PING', array($payload)); } /** * Closes the context by unsubscribing from all the subscribed channels. The * context can be forcefully closed by dropping the underlying connection. * * @param bool $drop Indicates if the context should be closed by dropping the connection. * * @return bool Returns false when there are no pending messages. */ public function stop($drop = false) { if (!$this->valid()) { return false; } if ($drop) { $this->invalidate(); $this->disconnect(); } else { if ($this->isFlagSet(self::STATUS_SUBSCRIBED)) { $this->unsubscribe(); } if ($this->isFlagSet(self::STATUS_PSUBSCRIBED)) { $this->punsubscribe(); } } return !$drop; } /** * Closes the underlying connection when forcing a disconnection. */ abstract protected function disconnect(); /** * Writes a Redis command on the underlying connection. * * @param string $method Command ID. * @param array $arguments Arguments for the command. */ abstract protected function writeRequest($method, $arguments); /** * {@inheritdoc} */ public function rewind() { // NOOP } /** * Returns the last message payload retrieved from the server and generated * by one of the active subscriptions. * * @return array */ public function current() { return $this->getValue(); } /** * {@inheritdoc} */ public function key() { return $this->position; } /** * {@inheritdoc} */ public function next() { if ($this->valid()) { ++$this->position; } return $this->position; } /** * Checks if the the consumer is still in a valid state to continue. * * @return bool */ public function valid() { $isValid = $this->isFlagSet(self::STATUS_VALID); $subscriptionFlags = self::STATUS_SUBSCRIBED | self::STATUS_PSUBSCRIBED; $hasSubscriptions = ($this->statusFlags & $subscriptionFlags) > 0; return $isValid && $hasSubscriptions; } /** * Resets the state of the consumer. */ protected function invalidate() { $this->statusFlags = 0; // 0b0000; } /** * Waits for a new message from the server generated by one of the active * subscriptions and returns it when available. * * @return array */ abstract protected function getValue(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/PubSub/Consumer.php000066400000000000000000000105661361462701300272620ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\PubSub; use Predis\ClientException; use Predis\ClientInterface; use Predis\Command\Command; use Predis\Connection\AggregateConnectionInterface; use Predis\NotSupportedException; /** * PUB/SUB consumer abstraction. * * @author Daniele Alessandri */ class Consumer extends AbstractConsumer { private $client; private $options; /** * @param ClientInterface $client Client instance used by the consumer. * @param array $options Options for the consumer initialization. */ public function __construct(ClientInterface $client, array $options = null) { $this->checkCapabilities($client); $this->options = $options ?: array(); $this->client = $client; $this->genericSubscribeInit('subscribe'); $this->genericSubscribeInit('psubscribe'); } /** * Returns the underlying client instance used by the pub/sub iterator. * * @return ClientInterface */ public function getClient() { return $this->client; } /** * Checks if the client instance satisfies the required conditions needed to * initialize a PUB/SUB consumer. * * @param ClientInterface $client Client instance used by the consumer. * * @throws NotSupportedException */ private function checkCapabilities(ClientInterface $client) { if ($client->getConnection() instanceof AggregateConnectionInterface) { throw new NotSupportedException( 'Cannot initialize a PUB/SUB consumer over aggregate connections.' ); } $commands = array('publish', 'subscribe', 'unsubscribe', 'psubscribe', 'punsubscribe'); if ($client->getProfile()->supportsCommands($commands) === false) { throw new NotSupportedException( 'The current profile does not support PUB/SUB related commands.' ); } } /** * This method shares the logic to handle both SUBSCRIBE and PSUBSCRIBE. * * @param string $subscribeAction Type of subscription. */ private function genericSubscribeInit($subscribeAction) { if (isset($this->options[$subscribeAction])) { $this->$subscribeAction($this->options[$subscribeAction]); } } /** * {@inheritdoc} */ protected function writeRequest($method, $arguments) { $this->client->getConnection()->writeRequest( $this->client->createCommand($method, Command::normalizeArguments($arguments) ) ); } /** * {@inheritdoc} */ protected function disconnect() { $this->client->disconnect(); } /** * {@inheritdoc} */ protected function getValue() { $response = $this->client->getConnection()->read(); switch ($response[0]) { case self::SUBSCRIBE: case self::UNSUBSCRIBE: case self::PSUBSCRIBE: case self::PUNSUBSCRIBE: if ($response[2] === 0) { $this->invalidate(); } // The missing break here is intentional as we must process // subscriptions and unsubscriptions as standard messages. // no break case self::MESSAGE: return (object) array( 'kind' => $response[0], 'channel' => $response[1], 'payload' => $response[2], ); case self::PMESSAGE: return (object) array( 'kind' => $response[0], 'pattern' => $response[1], 'channel' => $response[2], 'payload' => $response[3], ); case self::PONG: return (object) array( 'kind' => $response[0], 'payload' => $response[1], ); default: throw new ClientException( "Unknown message type '{$response[0]}' received in the PUB/SUB context." ); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/PubSub/DispatcherLoop.php000066400000000000000000000102221361462701300303740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\PubSub; /** * Method-dispatcher loop built around the client-side abstraction of a Redis * PUB / SUB context. * * @author Daniele Alessandri */ class DispatcherLoop { private $pubsub; protected $callbacks; protected $defaultCallback; protected $subscriptionCallback; /** * @param Consumer $pubsub PubSub consumer instance used by the loop. */ public function __construct(Consumer $pubsub) { $this->callbacks = array(); $this->pubsub = $pubsub; } /** * Checks if the passed argument is a valid callback. * * @param mixed $callable A callback. * * @throws \InvalidArgumentException */ protected function assertCallback($callable) { if (!is_callable($callable)) { throw new \InvalidArgumentException('The given argument must be a callable object.'); } } /** * Returns the underlying PUB / SUB context. * * @return Consumer */ public function getPubSubConsumer() { return $this->pubsub; } /** * Sets a callback that gets invoked upon new subscriptions. * * @param mixed $callable A callback. */ public function subscriptionCallback($callable = null) { if (isset($callable)) { $this->assertCallback($callable); } $this->subscriptionCallback = $callable; } /** * Sets a callback that gets invoked when a message is received on a * channel that does not have an associated callback. * * @param mixed $callable A callback. */ public function defaultCallback($callable = null) { if (isset($callable)) { $this->assertCallback($callable); } $this->subscriptionCallback = $callable; } /** * Binds a callback to a channel. * * @param string $channel Channel name. * @param Callable $callback A callback. */ public function attachCallback($channel, $callback) { $callbackName = $this->getPrefixKeys().$channel; $this->assertCallback($callback); $this->callbacks[$callbackName] = $callback; $this->pubsub->subscribe($channel); } /** * Stops listening to a channel and removes the associated callback. * * @param string $channel Redis channel. */ public function detachCallback($channel) { $callbackName = $this->getPrefixKeys().$channel; if (isset($this->callbacks[$callbackName])) { unset($this->callbacks[$callbackName]); $this->pubsub->unsubscribe($channel); } } /** * Starts the dispatcher loop. */ public function run() { foreach ($this->pubsub as $message) { $kind = $message->kind; if ($kind !== Consumer::MESSAGE && $kind !== Consumer::PMESSAGE) { if (isset($this->subscriptionCallback)) { $callback = $this->subscriptionCallback; call_user_func($callback, $message); } continue; } if (isset($this->callbacks[$message->channel])) { $callback = $this->callbacks[$message->channel]; call_user_func($callback, $message->payload); } elseif (isset($this->defaultCallback)) { $callback = $this->defaultCallback; call_user_func($callback, $message); } } } /** * Terminates the dispatcher loop. */ public function stop() { $this->pubsub->stop(); } /** * Return the prefix used for keys. * * @return string */ protected function getPrefixKeys() { $options = $this->pubsub->getClient()->getOptions(); if (isset($options->prefix)) { return $options->prefix->getPrefix(); } return ''; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Replication/000077500000000000000000000000001361462701300260175ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Replication/ReplicationStrategy.php000066400000000000000000000150561361462701300325330ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Replication; use Predis\Command\CommandInterface; use Predis\NotSupportedException; /** * Defines a strategy for master/slave replication. * * @author Daniele Alessandri */ class ReplicationStrategy { protected $disallowed; protected $readonly; protected $readonlySHA1; /** * */ public function __construct() { $this->disallowed = $this->getDisallowedOperations(); $this->readonly = $this->getReadOnlyOperations(); $this->readonlySHA1 = array(); } /** * Returns if the specified command will perform a read-only operation * on Redis or not. * * @param CommandInterface $command Command instance. * * @throws NotSupportedException * * @return bool */ public function isReadOperation(CommandInterface $command) { if (isset($this->disallowed[$id = $command->getId()])) { throw new NotSupportedException( "The command '$id' is not allowed in replication mode." ); } if (isset($this->readonly[$id])) { if (true === $readonly = $this->readonly[$id]) { return true; } return call_user_func($readonly, $command); } if (($eval = $id === 'EVAL') || $id === 'EVALSHA') { $sha1 = $eval ? sha1($command->getArgument(0)) : $command->getArgument(0); if (isset($this->readonlySHA1[$sha1])) { if (true === $readonly = $this->readonlySHA1[$sha1]) { return true; } return call_user_func($readonly, $command); } } return false; } /** * Returns if the specified command is not allowed for execution in a master * / slave replication context. * * @param CommandInterface $command Command instance. * * @return bool */ public function isDisallowedOperation(CommandInterface $command) { return isset($this->disallowed[$command->getId()]); } /** * Checks if a SORT command is a readable operation by parsing the arguments * array of the specified commad instance. * * @param CommandInterface $command Command instance. * * @return bool */ protected function isSortReadOnly(CommandInterface $command) { $arguments = $command->getArguments(); return ($c = count($arguments)) === 1 ? true : $arguments[$c - 2] !== 'STORE'; } /** * Marks a command as a read-only operation. * * When the behavior of a command can be decided only at runtime depending * on its arguments, a callable object can be provided to dynamically check * if the specified command performs a read or a write operation. * * @param string $commandID Command ID. * @param mixed $readonly A boolean value or a callable object. */ public function setCommandReadOnly($commandID, $readonly = true) { $commandID = strtoupper($commandID); if ($readonly) { $this->readonly[$commandID] = $readonly; } else { unset($this->readonly[$commandID]); } } /** * Marks a Lua script for EVAL and EVALSHA as a read-only operation. When * the behaviour of a script can be decided only at runtime depending on * its arguments, a callable object can be provided to dynamically check * if the passed instance of EVAL or EVALSHA performs write operations or * not. * * @param string $script Body of the Lua script. * @param mixed $readonly A boolean value or a callable object. */ public function setScriptReadOnly($script, $readonly = true) { $sha1 = sha1($script); if ($readonly) { $this->readonlySHA1[$sha1] = $readonly; } else { unset($this->readonlySHA1[$sha1]); } } /** * Returns the default list of disallowed commands. * * @return array */ protected function getDisallowedOperations() { return array( 'SHUTDOWN' => true, 'INFO' => true, 'DBSIZE' => true, 'LASTSAVE' => true, 'CONFIG' => true, 'MONITOR' => true, 'SLAVEOF' => true, 'SAVE' => true, 'BGSAVE' => true, 'BGREWRITEAOF' => true, 'SLOWLOG' => true, ); } /** * Returns the default list of commands performing read-only operations. * * @return array */ protected function getReadOnlyOperations() { return array( 'EXISTS' => true, 'TYPE' => true, 'KEYS' => true, 'SCAN' => true, 'RANDOMKEY' => true, 'TTL' => true, 'GET' => true, 'MGET' => true, 'SUBSTR' => true, 'STRLEN' => true, 'GETRANGE' => true, 'GETBIT' => true, 'LLEN' => true, 'LRANGE' => true, 'LINDEX' => true, 'SCARD' => true, 'SISMEMBER' => true, 'SINTER' => true, 'SUNION' => true, 'SDIFF' => true, 'SMEMBERS' => true, 'SSCAN' => true, 'SRANDMEMBER' => true, 'ZRANGE' => true, 'ZREVRANGE' => true, 'ZRANGEBYSCORE' => true, 'ZREVRANGEBYSCORE' => true, 'ZCARD' => true, 'ZSCORE' => true, 'ZCOUNT' => true, 'ZRANK' => true, 'ZREVRANK' => true, 'ZSCAN' => true, 'ZLEXCOUNT' => true, 'ZRANGEBYLEX' => true, 'ZREVRANGEBYLEX' => true, 'HGET' => true, 'HMGET' => true, 'HEXISTS' => true, 'HLEN' => true, 'HKEYS' => true, 'HVALS' => true, 'HGETALL' => true, 'HSCAN' => true, 'HSTRLEN' => true, 'PING' => true, 'AUTH' => true, 'SELECT' => true, 'ECHO' => true, 'QUIT' => true, 'OBJECT' => true, 'BITCOUNT' => true, 'BITPOS' => true, 'TIME' => true, 'PFCOUNT' => true, 'SORT' => array($this, 'isSortReadOnly'), ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/000077500000000000000000000000001361462701300253445ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/Error.php000066400000000000000000000021771361462701300271550ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response; /** * Represents an error returned by Redis (-ERR responses) during the execution * of a command on the server. * * @author Daniele Alessandri */ class Error implements ErrorInterface { private $message; /** * @param string $message Error message returned by Redis */ public function __construct($message) { $this->message = $message; } /** * {@inheritdoc} */ public function getMessage() { return $this->message; } /** * {@inheritdoc} */ public function getErrorType() { list($errorType) = explode(' ', $this->getMessage(), 2); return $errorType; } /** * Converts the object to its string representation. * * @return string */ public function __toString() { return $this->getMessage(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/ErrorInterface.php000066400000000000000000000014211361462701300307650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response; /** * Represents an error returned by Redis (responses identified by "-" in the * Redis protocol) during the execution of an operation on the server. * * @author Daniele Alessandri */ interface ErrorInterface extends ResponseInterface { /** * Returns the error message. * * @return string */ public function getMessage(); /** * Returns the error type (e.g. ERR, ASK, MOVED). * * @return string */ public function getErrorType(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/Iterator/000077500000000000000000000000001361462701300271355ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/Iterator/MultiBulk.php000066400000000000000000000040041361462701300315540ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response\Iterator; use Predis\Connection\NodeConnectionInterface; /** * Streamable multibulk response. * * @author Daniele Alessandri */ class MultiBulk extends MultiBulkIterator { private $connection; /** * @param NodeConnectionInterface $connection Connection to Redis. * @param int $size Number of elements of the multibulk response. */ public function __construct(NodeConnectionInterface $connection, $size) { $this->connection = $connection; $this->size = $size; $this->position = 0; $this->current = $size > 0 ? $this->getValue() : null; } /** * Handles the synchronization of the client with the Redis protocol when * the garbage collector kicks in (e.g. when the iterator goes out of the * scope of a foreach or it is unset). */ public function __destruct() { $this->drop(true); } /** * Drop queued elements that have not been read from the connection either * by consuming the rest of the multibulk response or quickly by closing the * underlying connection. * * @param bool $disconnect Consume the iterator or drop the connection. */ public function drop($disconnect = false) { if ($disconnect) { if ($this->valid()) { $this->position = $this->size; $this->connection->disconnect(); } } else { while ($this->valid()) { $this->next(); } } } /** * Reads the next item of the multibulk response from the connection. * * @return mixed */ protected function getValue() { return $this->connection->read(); } } MultiBulkIterator.php000066400000000000000000000043201361462701300332100ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/Iterator * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response\Iterator; use Predis\Response\ResponseInterface; /** * Iterator that abstracts the access to multibulk responses allowing them to be * consumed in a streamable fashion without keeping the whole payload in memory. * * This iterator does not support rewinding which means that the iteration, once * consumed, cannot be restarted. * * Always make sure that the whole iteration is consumed (or dropped) to prevent * protocol desynchronization issues. * * @author Daniele Alessandri */ abstract class MultiBulkIterator implements \Iterator, \Countable, ResponseInterface { protected $current; protected $position; protected $size; /** * {@inheritdoc} */ public function rewind() { // NOOP } /** * {@inheritdoc} */ public function current() { return $this->current; } /** * {@inheritdoc} */ public function key() { return $this->position; } /** * {@inheritdoc} */ public function next() { if (++$this->position < $this->size) { $this->current = $this->getValue(); } } /** * {@inheritdoc} */ public function valid() { return $this->position < $this->size; } /** * Returns the number of items comprising the whole multibulk response. * * This method should be used instead of iterator_count() to get the size of * the current multibulk response since the former consumes the iteration to * count the number of elements, but our iterators do not support rewinding. * * @return int */ public function count() { return $this->size; } /** * Returns the current position of the iterator. * * @return int */ public function getPosition() { return $this->position; } /** * {@inheritdoc} */ abstract protected function getValue(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/Iterator/MultiBulkTuple.php000066400000000000000000000042631361462701300325750ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response\Iterator; /** * Outer iterator consuming streamable multibulk responses by yielding tuples of * keys and values. * * This wrapper is useful for responses to commands such as `HGETALL` that can * be iterater as $key => $value pairs. * * @author Daniele Alessandri */ class MultiBulkTuple extends MultiBulk implements \OuterIterator { private $iterator; /** * @param MultiBulk $iterator Inner multibulk response iterator. */ public function __construct(MultiBulk $iterator) { $this->checkPreconditions($iterator); $this->size = count($iterator) / 2; $this->iterator = $iterator; $this->position = $iterator->getPosition(); $this->current = $this->size > 0 ? $this->getValue() : null; } /** * Checks for valid preconditions. * * @param MultiBulk $iterator Inner multibulk response iterator. * * @throws \InvalidArgumentException * @throws \UnexpectedValueException */ protected function checkPreconditions(MultiBulk $iterator) { if ($iterator->getPosition() !== 0) { throw new \InvalidArgumentException( 'Cannot initialize a tuple iterator using an already initiated iterator.' ); } if (($size = count($iterator)) % 2 !== 0) { throw new \UnexpectedValueException('Invalid response size for a tuple iterator.'); } } /** * {@inheritdoc} */ public function getInnerIterator() { return $this->iterator; } /** * {@inheritdoc} */ public function __destruct() { $this->iterator->drop(true); } /** * {@inheritdoc} */ protected function getValue() { $k = $this->iterator->current(); $this->iterator->next(); $v = $this->iterator->current(); $this->iterator->next(); return array($k, $v); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/ResponseInterface.php000066400000000000000000000006411361462701300314750ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response; /** * Represents a complex response object from Redis. * * @author Daniele Alessandri */ interface ResponseInterface { } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/ServerException.php000066400000000000000000000016661361462701300312130ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response; use Predis\PredisException; /** * Exception class that identifies server-side Redis errors. * * @author Daniele Alessandri */ class ServerException extends PredisException implements ErrorInterface { /** * Gets the type of the error returned by Redis. * * @return string */ public function getErrorType() { list($errorType) = explode(' ', $this->getMessage(), 2); return $errorType; } /** * Converts the exception to an instance of Predis\Response\Error. * * @return Error */ public function toErrorResponse() { return new Error($this->getMessage()); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Response/Status.php000066400000000000000000000033171361462701300273440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Response; /** * Represents a status response returned by Redis. * * @author Daniele Alessandri */ class Status implements ResponseInterface { private static $OK; private static $QUEUED; private $payload; /** * @param string $payload Payload of the status response as returned by Redis. */ public function __construct($payload) { $this->payload = $payload; } /** * Converts the response object to its string representation. * * @return string */ public function __toString() { return $this->payload; } /** * Returns the payload of status response. * * @return string */ public function getPayload() { return $this->payload; } /** * Returns an instance of a status response object. * * Common status responses such as OK or QUEUED are cached in order to lower * the global memory usage especially when using pipelines. * * @param string $payload Status response payload. * * @return string */ public static function get($payload) { switch ($payload) { case 'OK': case 'QUEUED': if (isset(self::$$payload)) { return self::$$payload; } return self::$$payload = new self($payload); default: return new self($payload); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Session/000077500000000000000000000000001361462701300251715ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Session/Handler.php000066400000000000000000000060011361462701300272540ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Session; use Predis\ClientInterface; /** * Session handler class that relies on Predis\Client to store PHP's sessions * data into one or multiple Redis servers. * * This class is mostly intended for PHP 5.4 but it can be used under PHP 5.3 * provided that a polyfill for `SessionHandlerInterface` is defined by either * you or an external package such as `symfony/http-foundation`. * * @author Daniele Alessandri */ class Handler implements \SessionHandlerInterface { protected $client; protected $ttl; /** * @param ClientInterface $client Fully initialized client instance. * @param array $options Session handler options. */ public function __construct(ClientInterface $client, array $options = array()) { $this->client = $client; if (isset($options['gc_maxlifetime'])) { $this->ttl = (int) $options['gc_maxlifetime']; } else { $this->ttl = ini_get('session.gc_maxlifetime'); } } /** * Registers this instance as the current session handler. */ public function register() { if (PHP_VERSION_ID >= 50400) { session_set_save_handler($this, true); } else { session_set_save_handler( array($this, 'open'), array($this, 'close'), array($this, 'read'), array($this, 'write'), array($this, 'destroy'), array($this, 'gc') ); } } /** * {@inheritdoc} */ public function open($save_path, $session_id) { // NOOP return true; } /** * {@inheritdoc} */ public function close() { // NOOP return true; } /** * {@inheritdoc} */ public function gc($maxlifetime) { // NOOP return true; } /** * {@inheritdoc} */ public function read($session_id) { if ($data = $this->client->get($session_id)) { return $data; } return ''; } /** * {@inheritdoc} */ public function write($session_id, $session_data) { $this->client->setex($session_id, $this->ttl, $session_data); return true; } /** * {@inheritdoc} */ public function destroy($session_id) { $this->client->del($session_id); return true; } /** * Returns the underlying client instance. * * @return ClientInterface */ public function getClient() { return $this->client; } /** * Returns the session max lifetime value. * * @return int */ public function getMaxLifeTime() { return $this->ttl; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Transaction/000077500000000000000000000000001361462701300260335ustar00rootroot00000000000000AbortedMultiExecException.php000066400000000000000000000021171361462701300335450ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Transaction * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Transaction; use Predis\PredisException; /** * Exception class that identifies a MULTI / EXEC transaction aborted by Redis. * * @author Daniele Alessandri */ class AbortedMultiExecException extends PredisException { private $transaction; /** * @param MultiExec $transaction Transaction that generated the exception. * @param string $message Error message. * @param int $code Error code. */ public function __construct(MultiExec $transaction, $message, $code = null) { parent::__construct($message, $code); $this->transaction = $transaction; } /** * Returns the transaction that generated the exception. * * @return MultiExec */ public function getTransaction() { return $this->transaction; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Transaction/MultiExec.php000066400000000000000000000307711361462701300304530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Transaction; use Predis\ClientContextInterface; use Predis\ClientException; use Predis\ClientInterface; use Predis\Command\CommandInterface; use Predis\CommunicationException; use Predis\Connection\AggregateConnectionInterface; use Predis\NotSupportedException; use Predis\Protocol\ProtocolException; use Predis\Response\ErrorInterface as ErrorResponseInterface; use Predis\Response\ServerException; use Predis\Response\Status as StatusResponse; /** * Client-side abstraction of a Redis transaction based on MULTI / EXEC. * * {@inheritdoc} * * @author Daniele Alessandri */ class MultiExec implements ClientContextInterface { private $state; protected $client; protected $commands; protected $exceptions = true; protected $attempts = 0; protected $watchKeys = array(); protected $modeCAS = false; /** * @param ClientInterface $client Client instance used by the transaction. * @param array $options Initialization options. */ public function __construct(ClientInterface $client, array $options = null) { $this->assertClient($client); $this->client = $client; $this->state = new MultiExecState(); $this->configure($client, $options ?: array()); $this->reset(); } /** * Checks if the passed client instance satisfies the required conditions * needed to initialize the transaction object. * * @param ClientInterface $client Client instance used by the transaction object. * * @throws NotSupportedException */ private function assertClient(ClientInterface $client) { if ($client->getConnection() instanceof AggregateConnectionInterface) { throw new NotSupportedException( 'Cannot initialize a MULTI/EXEC transaction over aggregate connections.' ); } if (!$client->getProfile()->supportsCommands(array('MULTI', 'EXEC', 'DISCARD'))) { throw new NotSupportedException( 'The current profile does not support MULTI, EXEC and DISCARD.' ); } } /** * Configures the transaction using the provided options. * * @param ClientInterface $client Underlying client instance. * @param array $options Array of options for the transaction. **/ protected function configure(ClientInterface $client, array $options) { if (isset($options['exceptions'])) { $this->exceptions = (bool) $options['exceptions']; } else { $this->exceptions = $client->getOptions()->exceptions; } if (isset($options['cas'])) { $this->modeCAS = (bool) $options['cas']; } if (isset($options['watch']) && $keys = $options['watch']) { $this->watchKeys = $keys; } if (isset($options['retry'])) { $this->attempts = (int) $options['retry']; } } /** * Resets the state of the transaction. */ protected function reset() { $this->state->reset(); $this->commands = new \SplQueue(); } /** * Initializes the transaction context. */ protected function initialize() { if ($this->state->isInitialized()) { return; } if ($this->modeCAS) { $this->state->flag(MultiExecState::CAS); } if ($this->watchKeys) { $this->watch($this->watchKeys); } $cas = $this->state->isCAS(); $discarded = $this->state->isDiscarded(); if (!$cas || ($cas && $discarded)) { $this->call('MULTI'); if ($discarded) { $this->state->unflag(MultiExecState::CAS); } } $this->state->unflag(MultiExecState::DISCARDED); $this->state->flag(MultiExecState::INITIALIZED); } /** * Dynamically invokes a Redis command with the specified arguments. * * @param string $method Command ID. * @param array $arguments Arguments for the command. * * @return mixed */ public function __call($method, $arguments) { return $this->executeCommand( $this->client->createCommand($method, $arguments) ); } /** * Executes a Redis command bypassing the transaction logic. * * @param string $commandID Command ID. * @param array $arguments Arguments for the command. * * @throws ServerException * * @return mixed */ protected function call($commandID, array $arguments = array()) { $response = $this->client->executeCommand( $this->client->createCommand($commandID, $arguments) ); if ($response instanceof ErrorResponseInterface) { throw new ServerException($response->getMessage()); } return $response; } /** * Executes the specified Redis command. * * @param CommandInterface $command Command instance. * * @throws AbortedMultiExecException * @throws CommunicationException * * @return $this|mixed */ public function executeCommand(CommandInterface $command) { $this->initialize(); if ($this->state->isCAS()) { return $this->client->executeCommand($command); } $response = $this->client->getConnection()->executeCommand($command); if ($response instanceof StatusResponse && $response == 'QUEUED') { $this->commands->enqueue($command); } elseif ($response instanceof ErrorResponseInterface) { throw new AbortedMultiExecException($this, $response->getMessage()); } else { $this->onProtocolError('The server did not return a +QUEUED status response.'); } return $this; } /** * Executes WATCH against one or more keys. * * @param string|array $keys One or more keys. * * @throws NotSupportedException * @throws ClientException * * @return mixed */ public function watch($keys) { if (!$this->client->getProfile()->supportsCommand('WATCH')) { throw new NotSupportedException('WATCH is not supported by the current profile.'); } if ($this->state->isWatchAllowed()) { throw new ClientException('Sending WATCH after MULTI is not allowed.'); } $response = $this->call('WATCH', is_array($keys) ? $keys : array($keys)); $this->state->flag(MultiExecState::WATCH); return $response; } /** * Finalizes the transaction by executing MULTI on the server. * * @return MultiExec */ public function multi() { if ($this->state->check(MultiExecState::INITIALIZED | MultiExecState::CAS)) { $this->state->unflag(MultiExecState::CAS); $this->call('MULTI'); } else { $this->initialize(); } return $this; } /** * Executes UNWATCH. * * @throws NotSupportedException * * @return MultiExec */ public function unwatch() { if (!$this->client->getProfile()->supportsCommand('UNWATCH')) { throw new NotSupportedException( 'UNWATCH is not supported by the current profile.' ); } $this->state->unflag(MultiExecState::WATCH); $this->__call('UNWATCH', array()); return $this; } /** * Resets the transaction by UNWATCH-ing the keys that are being WATCHed and * DISCARD-ing pending commands that have been already sent to the server. * * @return MultiExec */ public function discard() { if ($this->state->isInitialized()) { $this->call($this->state->isCAS() ? 'UNWATCH' : 'DISCARD'); $this->reset(); $this->state->flag(MultiExecState::DISCARDED); } return $this; } /** * Executes the whole transaction. * * @return mixed */ public function exec() { return $this->execute(); } /** * Checks the state of the transaction before execution. * * @param mixed $callable Callback for execution. * * @throws \InvalidArgumentException * @throws ClientException */ private function checkBeforeExecution($callable) { if ($this->state->isExecuting()) { throw new ClientException( 'Cannot invoke "execute" or "exec" inside an active transaction context.' ); } if ($callable) { if (!is_callable($callable)) { throw new \InvalidArgumentException('The argument must be a callable object.'); } if (!$this->commands->isEmpty()) { $this->discard(); throw new ClientException( 'Cannot execute a transaction block after using fluent interface.' ); } } elseif ($this->attempts) { $this->discard(); throw new ClientException( 'Automatic retries are supported only when a callable block is provided.' ); } } /** * Handles the actual execution of the whole transaction. * * @param mixed $callable Optional callback for execution. * * @throws CommunicationException * @throws AbortedMultiExecException * @throws ServerException * * @return array */ public function execute($callable = null) { $this->checkBeforeExecution($callable); $execResponse = null; $attempts = $this->attempts; do { if ($callable) { $this->executeTransactionBlock($callable); } if ($this->commands->isEmpty()) { if ($this->state->isWatching()) { $this->discard(); } return; } $execResponse = $this->call('EXEC'); if ($execResponse === null) { if ($attempts === 0) { throw new AbortedMultiExecException( $this, 'The current transaction has been aborted by the server.' ); } $this->reset(); continue; } break; } while ($attempts-- > 0); $response = array(); $commands = $this->commands; $size = count($execResponse); if ($size !== count($commands)) { $this->onProtocolError('EXEC returned an unexpected number of response items.'); } for ($i = 0; $i < $size; ++$i) { $cmdResponse = $execResponse[$i]; if ($cmdResponse instanceof ErrorResponseInterface && $this->exceptions) { throw new ServerException($cmdResponse->getMessage()); } $response[$i] = $commands->dequeue()->parseResponse($cmdResponse); } return $response; } /** * Passes the current transaction object to a callable block for execution. * * @param mixed $callable Callback. * * @throws CommunicationException * @throws ServerException */ protected function executeTransactionBlock($callable) { $exception = null; $this->state->flag(MultiExecState::INSIDEBLOCK); try { call_user_func($callable, $this); } catch (CommunicationException $exception) { // NOOP } catch (ServerException $exception) { // NOOP } catch (\Exception $exception) { $this->discard(); } $this->state->unflag(MultiExecState::INSIDEBLOCK); if ($exception) { throw $exception; } } /** * Helper method for protocol errors encountered inside the transaction. * * @param string $message Error message. */ private function onProtocolError($message) { // Since a MULTI/EXEC block cannot be initialized when using aggregate // connections we can safely assume that Predis\Client::getConnection() // will return a Predis\Connection\NodeConnectionInterface instance. CommunicationException::handle(new ProtocolException( $this->client->getConnection(), $message )); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/Predis/Transaction/MultiExecState.php000066400000000000000000000060111361462701300314420ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Predis\Transaction; /** * Utility class used to track the state of a MULTI / EXEC transaction. * * @author Daniele Alessandri */ class MultiExecState { const INITIALIZED = 1; // 0b00001 const INSIDEBLOCK = 2; // 0b00010 const DISCARDED = 4; // 0b00100 const CAS = 8; // 0b01000 const WATCH = 16; // 0b10000 private $flags; /** * */ public function __construct() { $this->flags = 0; } /** * Sets the internal state flags. * * @param int $flags Set of flags */ public function set($flags) { $this->flags = $flags; } /** * Gets the internal state flags. * * @return int */ public function get() { return $this->flags; } /** * Sets one or more flags. * * @param int $flags Set of flags */ public function flag($flags) { $this->flags |= $flags; } /** * Resets one or more flags. * * @param int $flags Set of flags */ public function unflag($flags) { $this->flags &= ~$flags; } /** * Returns if the specified flag or set of flags is set. * * @param int $flags Flag * * @return bool */ public function check($flags) { return ($this->flags & $flags) === $flags; } /** * Resets the state of a transaction. */ public function reset() { $this->flags = 0; } /** * Returns the state of the RESET flag. * * @return bool */ public function isReset() { return $this->flags === 0; } /** * Returns the state of the INITIALIZED flag. * * @return bool */ public function isInitialized() { return $this->check(self::INITIALIZED); } /** * Returns the state of the INSIDEBLOCK flag. * * @return bool */ public function isExecuting() { return $this->check(self::INSIDEBLOCK); } /** * Returns the state of the CAS flag. * * @return bool */ public function isCAS() { return $this->check(self::CAS); } /** * Returns if WATCH is allowed in the current state. * * @return bool */ public function isWatchAllowed() { return $this->check(self::INITIALIZED) && !$this->check(self::CAS); } /** * Returns the state of the WATCH flag. * * @return bool */ public function isWatching() { return $this->check(self::WATCH); } /** * Returns the state of the DISCARDED flag. * * @return bool */ public function isDiscarded() { return $this->check(self::DISCARDED); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/RainLoop/000077500000000000000000000000001361462701300240435ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php000066400000000000000000010535071361462701300261670ustar00rootroot00000000000000aCurrentActionParams = array(); $this->oHttp = null; $this->oLogger = null; $this->oPlugins = null; $this->oMailClient = null; $this->oSocial = null; $this->oConfig = null; $this->aCachers = array(); $this->oStorageProvider = null; $this->oLocalStorageProvider = null; $this->oSettingsProvider = null; $this->oLocalSettingsProvider = null; $this->oFilesProvider = null; $this->oFiltersProvider = null; $this->oDomainProvider = null; $this->oAddressBookProvider = null; $this->oSuggestionsProvider = null; $this->oChangePasswordProvider = null; $this->oTwoFactorAuthProvider = null; $this->oPremProvider = null; $this->sSpecAuthToken = ''; $this->sUpdateAuthToken = ''; $this->bIsAjax = false; $oConfig = $this->Config(); $this->Plugins()->RunHook('filter.application-config', array(&$oConfig)); $this->Logger()->Ping(); } /** * @return \RainLoop\Actions */ public static function NewInstance() { return new self(); } /** * @param string $sSpecAuthToken * * @return \RainLoop\Application */ public function SetSpecAuthToken($sSpecAuthToken) { $this->sSpecAuthToken = $sSpecAuthToken; return $this; } /** * @param string $sUpdateAuthToken * * @return \RainLoop\Application */ public function SetUpdateAuthToken($sUpdateAuthToken) { $this->sUpdateAuthToken = $sUpdateAuthToken; return $this; } /** * @param string $bIsAjax * * @return \RainLoop\Application */ public function SetIsAjax($bIsAjax) { $this->bIsAjax = $bIsAjax; return $this; } /** * @return string */ public function GetSpecAuthToken() { return $this->sSpecAuthToken; } /** * @return string */ public function GetUpdateAuthToken() { return $this->sUpdateAuthToken; } /** * @return boolean */ public function GetIsAjax() { return $this->bIsAjax; } /** * @return string */ public function GetShortLifeSpecAuthToken($iLife = 60) { $aAccountHash = \RainLoop\Utils::DecodeKeyValues($this->getLocalAuthToken()); if (!empty($aAccountHash[0]) && 'token' === $aAccountHash[0] && \is_array($aAccountHash)) { $aAccountHash[10] = \time() + $iLife; return \RainLoop\Utils::EncodeKeyValues($aAccountHash); } return ''; } /** * @return \RainLoop\Application */ public function Config() { if (null === $this->oConfig) { $this->oConfig = new \RainLoop\Config\Application(); if (!$this->oConfig->Load()) { usleep(10000); $this->oConfig->Load(); } // if (!$bLoaded && !$this->oConfig->IsFileExists()) // { // $bSave = true; // } // // if ($bLoaded && !$bSave) // { // $bSave = APP_VERSION !== $this->oConfig->Get('version', 'current'); // } // // if ($bSave) // { // $this->oConfig->Save(); // } } return $this->oConfig; } /** * @param string $sName * @param \RainLoop\Model\Account $oAccount = null * * @return mixed */ private function fabrica($sName, $oAccount = null) { $mResult = null; $this->Plugins() ->RunHook('main.fabrica', array($sName, &$mResult), false) ->RunHook('main.fabrica[2]', array($sName, &$mResult, $oAccount), false) ; if (null === $mResult) { switch ($sName) { case 'files': // RainLoop\Providers\Files\IFiles $mResult = new \RainLoop\Providers\Files\FileStorage(APP_PRIVATE_DATA.'storage/files'); break; case 'storage': case 'storage-local': // RainLoop\Providers\Storage\IStorage $mResult = new \RainLoop\Providers\Storage\FileStorage( APP_PRIVATE_DATA.'storage', 'storage-local' === $sName); break; case 'settings': case 'settings-local': // RainLoop\Providers\Settings\ISettings $mResult = new \RainLoop\Providers\Settings\DefaultSettings( $this->StorageProvider('settings-local' === $sName)); break; case 'login': // \RainLoop\Providers\Login\LoginInterface $mResult = new \RainLoop\Providers\Login\DefaultLogin(); break; case 'domain': // \RainLoop\Providers\Domain\DomainAdminInterface $mResult = new \RainLoop\Providers\Domain\DefaultDomain(APP_PRIVATE_DATA.'domains', $this->Cacher()); break; case 'filters': // \RainLoop\Providers\Filters\FiltersInterface $mResult = new \RainLoop\Providers\Filters\SieveStorage( $this->Plugins(), $this->Config() ); break; case 'address-book': // \RainLoop\Providers\AddressBook\AddressBookInterface $sDsn = \trim($this->Config()->Get('contacts', 'pdo_dsn', '')); $sUser = \trim($this->Config()->Get('contacts', 'pdo_user', '')); $sPassword = (string) $this->Config()->Get('contacts', 'pdo_password', ''); $sDsnType = $this->ValidateContactPdoType(\trim($this->Config()->Get('contacts', 'type', 'sqlite'))); if ('sqlite' === $sDsnType) { $mResult = new \RainLoop\Providers\AddressBook\PdoAddressBook( 'sqlite:'.APP_PRIVATE_DATA.'AddressBook.sqlite', '', '', 'sqlite'); } else { $mResult = new \RainLoop\Providers\AddressBook\PdoAddressBook($sDsn, $sUser, $sPassword, $sDsnType); } break; case 'suggestions': if (null === $mResult) { $mResult = array(); } if (\is_array($mResult) && \RainLoop\Utils::IsOwnCloud() && $this->Config()->Get('labs', 'owncloud_suggestions', true)) { // \RainLoop\Providers\Suggestions\ISuggestions $mResult[] = new \RainLoop\Providers\Suggestions\OwnCloudSuggestions(); } break; case 'change-password': // \RainLoop\Providers\ChangePassword\ChangePasswordInterface break; case 'two-factor-auth': // \RainLoop\Providers\TwoFactorAuth\TwoFactorAuthInterface $mResult = new \RainLoop\Providers\TwoFactorAuth\GoogleTwoFactorAuth(); break; } } foreach (\is_array($mResult) ? $mResult : array($mResult) as $oItem) { if ($oItem && \method_exists($oItem, 'SetLogger')) { $oItem->SetLogger($this->Logger()); } } $this->Plugins()->RunHook('filter.fabrica', array($sName, &$mResult, $oAccount), false); return $mResult; } /** * @return void */ public function BootEnd() { try { if ($this->MailClient()->IsLoggined()) { $this->MailClient()->LogoutAndDisconnect(); } } catch (\Exception $oException) { unset($oException); } } /** * @return string */ public function ParseQueryAuthString() { $sQuery = \trim($this->Http()->GetQueryString()); $iPos = \strpos($sQuery, '&'); if (0 < $iPos) { $sQuery = \substr($sQuery, 0, $iPos); } $sQuery = \trim(\trim($sQuery), ' /'); $aSubQuery = $this->Http()->GetQuery('q', null); if (\is_array($aSubQuery)) { $aSubQuery = \array_map(function ($sS) { return \trim(\trim($sS), ' /'); }, $aSubQuery); if (0 < \count($aSubQuery)) { $sQuery .= '/'.\implode('/', $aSubQuery); } } if ('' === $this->GetSpecAuthToken()) { $aPaths = \explode('/', $sQuery); if (!empty($aPaths[0]) && !empty($aPaths[1]) && '_' === substr($aPaths[1], 0, 1)) { $this->SetSpecAuthToken($aPaths[1]); } } return $sQuery; } /** * @param string $sLine * @param \RainLoop\Model\Account $oAccount = null * @param bool $bUrlEncode = false * @param array $aAdditionalParams = array() * * @return string */ private function compileLogParams($sLine, $oAccount = null, $bUrlEncode = false, $aAdditionalParams = array()) { $aClear = array(); if (false !== \strpos($sLine, '{date:')) { $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); $sLine = \preg_replace_callback('/\{date:([^}]+)\}/', function ($aMatch) use ($sTimeOffset, $bUrlEncode) { return \RainLoop\Utils::UrlEncode(\MailSo\Log\Logger::DateHelper($aMatch[1], $sTimeOffset), $bUrlEncode); }, $sLine); $aClear['/\{date:([^}]*)\}/'] = 'date'; } if (false !== \strpos($sLine, '{imap:') || false !== \strpos($sLine, '{smtp:')) { if (!$oAccount) { $this->ParseQueryAuthString(); $oAccount = $this->getAccountFromToken(false); } if ($oAccount) { $sLine = \str_replace('{imap:login}', \RainLoop\Utils::UrlEncode($oAccount->IncLogin(), $bUrlEncode), $sLine); $sLine = \str_replace('{imap:host}', \RainLoop\Utils::UrlEncode($oAccount->DomainIncHost(), $bUrlEncode), $sLine); $sLine = \str_replace('{imap:port}', \RainLoop\Utils::UrlEncode($oAccount->DomainIncPort(), $bUrlEncode), $sLine); $sLine = \str_replace('{smtp:login}', \RainLoop\Utils::UrlEncode($oAccount->OutLogin(), $bUrlEncode), $sLine); $sLine = \str_replace('{smtp:host}', \RainLoop\Utils::UrlEncode($oAccount->DomainOutHost(), $bUrlEncode), $sLine); $sLine = \str_replace('{smtp:port}', \RainLoop\Utils::UrlEncode($oAccount->DomainOutPort(), $bUrlEncode), $sLine); } $aClear['/\{imap:([^}]*)\}/i'] = 'imap'; $aClear['/\{smtp:([^}]*)\}/i'] = 'smtp'; } if (false !== \strpos($sLine, '{request:')) { if (false !== \strpos($sLine, '{request:ip}')) { $sLine = \str_replace('{request:ip}', \RainLoop\Utils::UrlEncode($this->Http()->GetClientIp( $this->Config()->Get('labs', 'http_client_ip_check_proxy', false)), $bUrlEncode), $sLine); } if (false !== \strpos($sLine, '{request:domain}')) { $sLine = \str_replace('{request:domain}', \RainLoop\Utils::UrlEncode($this->Http()->GetHost(false, true, true), $bUrlEncode), $sLine); } if (false !== \strpos($sLine, '{request:domain-clear}')) { $sLine = \str_replace('{request:domain-clear}', \RainLoop\Utils::UrlEncode( \MailSo\Base\Utils::GetClearDomainName($this->Http()->GetHost(false, true, true)), $bUrlEncode), $sLine); } $aClear['/\{request:([^}]*)\}/i'] = 'request'; } if (false !== \strpos($sLine, '{user:')) { if (false !== \strpos($sLine, '{user:uid}')) { $sLine = \str_replace('{user:uid}', \RainLoop\Utils::UrlEncode(\base_convert(\sprintf('%u', \crc32(\md5(\RainLoop\Utils::GetConnectionToken()))), 10, 32), $bUrlEncode), $sLine ); } if (false !== \strpos($sLine, '{user:ip}')) { $sLine = \str_replace('{user:ip}', \RainLoop\Utils::UrlEncode($this->Http()->GetClientIp( $this->Config()->Get('labs', 'http_client_ip_check_proxy', false)), $bUrlEncode), $sLine); } if (\preg_match('/\{user:(email|login|domain)\}/i', $sLine)) { if (!$oAccount) { $this->ParseQueryAuthString(); $oAccount = $this->getAccountFromToken(false); } if ($oAccount) { $sEmail = $oAccount->Email(); $sLine = \str_replace('{user:email}', \RainLoop\Utils::UrlEncode($sEmail, $bUrlEncode), $sLine); $sLine = \str_replace('{user:login}', \RainLoop\Utils::UrlEncode( \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail), $bUrlEncode), $sLine); $sLine = \str_replace('{user:domain}', \RainLoop\Utils::UrlEncode( \MailSo\Base\Utils::GetDomainFromEmail($sEmail), $bUrlEncode), $sLine); $sLine = \str_replace('{user:domain-clear}', \RainLoop\Utils::UrlEncode( \MailSo\Base\Utils::GetClearDomainName( \MailSo\Base\Utils::GetDomainFromEmail($sEmail)), $bUrlEncode), $sLine); } } $aClear['/\{user:([^}]*)\}/i'] = 'unknown'; } if (false !== \strpos($sLine, '{labs:')) { $sLine = \preg_replace_callback('/\{labs:rand:([1-9])\}/', function ($aMatch) { return \rand(\pow(10, $aMatch[1] - 1), \pow(10, $aMatch[1]) - 1); }, $sLine); $aClear['/\{labs:([^}]*)\}/'] = 'labs'; } if (\is_array($aAdditionalParams) && 0 < \count($aAdditionalParams)) { foreach ($aAdditionalParams as $sKey => $sValue) { $sLine = \str_replace($sKey, $sValue, $sLine); } } if (0 < \count($aClear)) { foreach ($aClear as $sKey => $sValue) { $sLine = \preg_replace($sKey, $sValue, $sLine); } } return $sLine; } /** * @param string $sFileName * * @return string */ private function compileLogFileName($sFileName) { $sFileName = \trim($sFileName); if (0 !== \strlen($sFileName)) { $sFileName = $this->compileLogParams($sFileName); $sFileName = \preg_replace('/[\/]+/', '/', \preg_replace('/[.]+/', '.', $sFileName)); $sFileName = \preg_replace('/[^a-zA-Z0-9@_+=\-\.\/!()\[\]]/', '', $sFileName); } if (0 === \strlen($sFileName)) { $sFileName = 'rainloop-log.txt'; } return $sFileName; } /** * @return void */ public function SetAuthLogoutToken() { @\header('X-RainLoop-Action: Logout'); \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, \md5(APP_START_TIME), 0); } /** * @param \RainLoop\Model\Account $oAccount * * @return void */ public function SetAuthToken($oAccount) { if ($oAccount) { $sSpecAuthToken = '_'.$oAccount->GetAuthTokenQ(); $this->SetSpecAuthToken($sSpecAuthToken); \RainLoop\Utils::SetCookie(self::AUTH_SPEC_TOKEN_KEY, $sSpecAuthToken, 0); if ($oAccount->SignMe() && 0 < \strlen($oAccount->SignMeToken())) { \RainLoop\Utils::SetCookie(self::AUTH_SIGN_ME_TOKEN_KEY, \RainLoop\Utils::EncodeKeyValuesQ(array( 'e' => $oAccount->Email(), 't' => $oAccount->SignMeToken() )), \time() + 60 * 60 * 24 * 30); $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'sign_me', \RainLoop\Utils::EncodeKeyValuesQ(array( 'Time' => \time(), 'AuthToken' => $oAccount->GetAuthTokenQ(), 'SignMetToken' => $oAccount->SignMeToken() )) ); } } } /** * @return string */ public function GetSpecAuthTokenWithDeletion() { $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_TOKEN_KEY, ''); if (0 < strlen($sResult)) { \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_TOKEN_KEY); } return $sResult; } /** * @return string */ public function GetSpecAuthLogoutTokenWithDeletion() { $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY, ''); if (0 < strlen($sResult)) { \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_LOGOUT_TOKEN_KEY); } return $sResult; } /** * @return string */ public function GetSpecLogoutCustomMgsWithDeletion() { $sResult = \RainLoop\Utils::GetCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY, ''); if (0 < strlen($sResult)) { \RainLoop\Utils::ClearCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY); } return $sResult; } /** * @return string */ public function SetSpecLogoutCustomMgsWithDeletion($sMessage) { \RainLoop\Utils::SetCookie(self::AUTH_SPEC_LOGOUT_CUSTOM_MSG_KEY, $sMessage, 0); } /** * @return void */ private function setAdminAuthToken($sToken) { \RainLoop\Utils::SetCookie(self::AUTH_ADMIN_TOKEN_KEY, $sToken, 0); } /** * @return string */ private function getLocalAuthToken() { $sToken = $this->GetSpecAuthToken(); return !empty($sToken) && '_' === \substr($sToken, 0, 1) ? \substr($sToken, 1) : ''; } /** * @return string */ private function getAdminAuthToken() { return \RainLoop\Utils::GetCookie(self::AUTH_ADMIN_TOKEN_KEY, ''); } /** * @return void */ public function ClearAdminAuthToken() { $aAdminHash = \RainLoop\Utils::DecodeKeyValuesQ($this->getAdminAuthToken()); if ( !empty($aAdminHash[0]) && !empty($aAdminHash[1]) && !empty($aAdminHash[2]) && 'token' === $aAdminHash[0] && \md5(APP_SALT) === $aAdminHash[1] ) { $this->Cacher(null, true)->Delete(\RainLoop\KeyPathHelper::SessionAdminKey($aAdminHash[2])); } \RainLoop\Utils::ClearCookie(self::AUTH_ADMIN_TOKEN_KEY); } /** * @param bool $bThrowExceptionOnFalse = false * * @return \RainLoop\Model\Account|bool * @throws \RainLoop\Exceptions\ClientException */ public function GetAccount($bThrowExceptionOnFalse = false) { return $this->getAccountFromToken($bThrowExceptionOnFalse); } /** * @return \MailSo\Base\Http */ public function Http() { if (null === $this->oHttp) { $this->oHttp = \MailSo\Base\Http::SingletonInstance(); } return $this->oHttp; } /** * @return \RainLoop\Social */ public function Social() { if (null === $this->oSocial) { $this->oSocial = new \RainLoop\Social($this->Http(), $this); } return $this->oSocial; } /** * @return \MailSo\Mail\MailClient */ public function MailClient() { if (null === $this->oMailClient) { $this->oMailClient = \MailSo\Mail\MailClient::NewInstance(); $this->oMailClient->SetLogger($this->Logger()); } return $this->oMailClient; } /** * @return \RainLoop\Providers\Filters */ public function FiltersProvider() { if (null === $this->oFiltersProvider) { $this->oFiltersProvider = new \RainLoop\Providers\Filters( $this->fabrica('filters')); } return $this->oFiltersProvider; } /** * @return \RainLoop\Providers\ChangePassword */ public function ChangePasswordProvider() { if (null === $this->oChangePasswordProvider) { $this->oChangePasswordProvider = new \RainLoop\Providers\ChangePassword( $this, $this->fabrica('change-password'), !!$this->Config()->Get('labs', 'check_new_password_strength', true) ); } return $this->oChangePasswordProvider; } /** * @return \RainLoop\Providers\TwoFactorAuth */ public function TwoFactorAuthProvider() { if (null === $this->oTwoFactorAuthProvider) { $this->oTwoFactorAuthProvider = new \RainLoop\Providers\TwoFactorAuth( $this->Config()->Get('security', 'allow_two_factor_auth', false) ? $this->fabrica('two-factor-auth') : null ); } return $this->oTwoFactorAuthProvider; } /** * @return \RainLoop\Providers\Prem */ public function PremProvider() { if (null === $this->oPremProvider) { if (\file_exists(APP_VERSION_ROOT_PATH.'app/libraries/RainLoop/Providers/Prem.php')) { $this->oPremProvider = new \RainLoop\Providers\Prem( $this->Config(), $this->Logger(), $this->Cacher(null, true) ); } else { $this->oPremProvider = false; } } return $this->oPremProvider; } /** * @param bool $bLocal = false * * @return \RainLoop\Providers\Storage */ public function StorageProvider($bLocal = false) { if ($bLocal) { if (null === $this->oLocalStorageProvider) { $this->oLocalStorageProvider = new \RainLoop\Providers\Storage( $this->fabrica('storage-local')); } return $this->oLocalStorageProvider; } else { if (null === $this->oStorageProvider) { $this->oStorageProvider = new \RainLoop\Providers\Storage( $this->fabrica('storage')); } return $this->oStorageProvider; } return null; } /** * @return \RainLoop\Providers\Settings */ public function SettingsProvider($bLocal = false) { if ($bLocal) { if (null === $this->oLocalSettingsProvider) { $this->oLocalSettingsProvider = new \RainLoop\Providers\Settings( $this->fabrica('settings-local')); } return $this->oLocalSettingsProvider; } else { if (null === $this->oSettingsProvider) { $this->oSettingsProvider = new \RainLoop\Providers\Settings( $this->fabrica('settings')); } return $this->oSettingsProvider; } return null; } /** * @return \RainLoop\Providers\Files */ public function FilesProvider() { if (null === $this->oFilesProvider) { $this->oFilesProvider = new \RainLoop\Providers\Files( $this->fabrica('files')); } return $this->oFilesProvider; } /** * @return \RainLoop\Providers\Domain */ public function DomainProvider() { if (null === $this->oDomainProvider) { $this->oDomainProvider = new \RainLoop\Providers\Domain( $this->fabrica('domain'), $this->Plugins()); } return $this->oDomainProvider; } /** * @return \RainLoop\Providers\Suggestions */ public function SuggestionsProvider() { if (null === $this->oSuggestionsProvider) { $this->oSuggestionsProvider = new \RainLoop\Providers\Suggestions( $this->fabrica('suggestions')); } return $this->oSuggestionsProvider; } /** * @param \RainLoop\Model\Account $oAccount = null * @param bool $bForceEnable = false * * @return \RainLoop\Providers\AddressBook */ public function AddressBookProvider($oAccount = null, $bForceEnable = false) { if (null === $this->oAddressBookProvider) { $oDriver = null; if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::CONTACTS, $oAccount)) { if ($this->Config()->Get('contacts', 'enable', false) || $bForceEnable) { $oDriver = $this->fabrica('address-book', $oAccount); } } $this->oAddressBookProvider = new \RainLoop\Providers\AddressBook($oDriver); $this->oAddressBookProvider->SetLogger($this->Logger()); } return $this->oAddressBookProvider; } /** * @param \RainLoop\Model\Account $oAccount = null * @param bool $bForceFile = false * * @return \MailSo\Cache\CacheClient */ public function Cacher($oAccount = null, $bForceFile = false) { $sKey = ''; if ($oAccount) { $sKey = $oAccount->ParentEmailHelper(); } $sIndexKey = empty($sKey) ? '_default_' : $sKey; if ($bForceFile) { $sIndexKey .= '/_files_'; } if (!isset($this->aCachers[$sIndexKey])) { $this->aCachers[$sIndexKey] = \MailSo\Cache\CacheClient::NewInstance(); $oDriver = null; $sDriver = \strtoupper(\trim($this->Config()->Get('cache', 'fast_cache_driver', 'files'))); switch (true) { default: case $bForceFile: $oDriver = \MailSo\Cache\Drivers\File::NewInstance(APP_PRIVATE_DATA.'cache', $sKey); break; case ('APC' === $sDriver || 'APCU' === $sDriver) && \MailSo\Base\Utils::FunctionExistsAndEnabled(array( 'apc_store', 'apc_fetch', 'apc_delete', 'apc_clear_cache')): $oDriver = \MailSo\Cache\Drivers\APC::NewInstance($sKey); break; case ('MEMCACHE' === $sDriver || 'MEMCACHED' === $sDriver) && \MailSo\Base\Utils::FunctionExistsAndEnabled('memcache_connect'): $oDriver = \MailSo\Cache\Drivers\Memcache::NewInstance( $this->Config()->Get('labs', 'fast_cache_memcache_host', '127.0.0.1'), (int) $this->Config()->Get('labs', 'fast_cache_memcache_port', 11211), 43200, $sKey ); break; case 'REDIS' === $sDriver && \class_exists('Predis\Client'): $oDriver = \MailSo\Cache\Drivers\Redis::NewInstance( $this->Config()->Get('labs', 'fast_cache_redis_host', '127.0.0.1'), (int) $this->Config()->Get('labs', 'fast_cache_redis_port', 6379), 43200, $sKey ); break; } if ($oDriver) { $this->aCachers[$sIndexKey]->SetDriver($oDriver); } $this->aCachers[$sIndexKey]->SetCacheIndex($this->Config()->Get('cache', 'fast_cache_index', '')); } return $this->aCachers[$sIndexKey]; } /** * @return \RainLoop\Plugins\Manager */ public function Plugins() { if (null === $this->oPlugins) { $this->oPlugins = new \RainLoop\Plugins\Manager($this); $this->oPlugins->SetLogger($this->Logger()); } return $this->oPlugins; } /** * @return \MailSo\Log\Logger */ public function Logger() { if (null === $this->oLogger) { $this->oLogger = \MailSo\Log\Logger::SingletonInstance(); if (!!$this->Config()->Get('logs', 'enable', false)) { $sSessionFilter = (string) $this->Config()->Get('logs', 'session_filter', ''); if (!empty($sSessionFilter)) { $aSessionParts = \explode(':', $sSessionFilter, 2); if (empty($aSessionParts[0]) || empty($aSessionParts[1]) || (string) $aSessionParts[1] !== (string) \RainLoop\Utils::GetCookie($aSessionParts[0], '')) { return $this->oLogger; } } $sTimeOffset = (string) $this->Config()->Get('logs', 'time_offset', '0'); $this->oLogger->SetShowSecter(!$this->Config()->Get('logs', 'hide_passwords', true)); $sLogFileName = $this->Config()->Get('logs', 'filename', ''); $oDriver = null; if ('syslog' === $sLogFileName) { $oDriver = \MailSo\Log\Drivers\Syslog::NewInstance(); } else { $sLogFileFullPath = \APP_PRIVATE_DATA.'logs/'.$this->compileLogFileName($sLogFileName); $sLogFileDir = \dirname($sLogFileFullPath); if (!@is_dir($sLogFileDir)) { @mkdir($sLogFileDir, 0755, true); } $oDriver = \MailSo\Log\Drivers\File::NewInstance($sLogFileFullPath); } $this->oLogger->Add($oDriver ->WriteOnErrorOnly($this->Config()->Get('logs', 'write_on_error_only', false)) ->WriteOnPhpErrorOnly($this->Config()->Get('logs', 'write_on_php_error_only', false)) ->WriteOnTimeoutOnly($this->Config()->Get('logs', 'write_on_timeout_only', 0)) ->SetTimeOffset($sTimeOffset) ); if (!$this->Config()->Get('debug', 'enable', false)) { $this->oLogger->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME); } $this->oLogger->WriteEmptyLine(); $oHttp = $this->Http(); $this->oLogger->Write('[DATE:'.\MailSo\Log\Logger::DateHelper('d.m.y', $sTimeOffset). (0 !== $sTimeOffset ? '][OFFSET:'.(0 < $sTimeOffset ? '+' : '-'). \str_pad((string) \abs($sTimeOffset), 2, '0', STR_PAD_LEFT) : ''). '][RL:'.APP_VERSION.'][PHP:'.PHP_VERSION.'][IP:'. $oHttp->GetClientIp($this->Config()->Get('labs', 'http_client_ip_check_proxy', false)).'][PID:'. (\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? \getmypid() : 'unknown').']['. $oHttp->GetServer('SERVER_SOFTWARE', '~').']['. (\MailSo\Base\Utils::FunctionExistsAndEnabled('php_sapi_name') ? \php_sapi_name() : '~' ).']' ); $sPdo = (\class_exists('PDO') ? \implode(',', \PDO::getAvailableDrivers()) : 'off'); $sPdo = empty($sPdo) ? '~' : $sPdo; $this->oLogger->Write('['. 'Suhosin:'.(\extension_loaded('suhosin') || @\ini_get('suhosin.get.max_value_length') ? 'on' : 'off'). '][APC:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('apc_fetch') ? 'on' : 'off'). '][MB:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('mb_convert_encoding') ? 'on' : 'off'). '][PDO:'.$sPdo. (\RainLoop\Utils::IsOwnCloud() ? '][cloud:true' : ''). '][Streams:'.\implode(',', \stream_get_transports()). ']'); $this->oLogger->Write( '['.$oHttp->GetMethod().'] '.$oHttp->GetScheme().'://'.$oHttp->GetHost(false, false).$oHttp->GetServer('REQUEST_URI', ''), \MailSo\Log\Enumerations\Type::NOTE, 'REQUEST'); } } return $this->oLogger; } /** * @return \MailSo\Log\Logger */ public function LoggerAuth() { if (null === $this->oLoggerAuth) { $this->oLoggerAuth = \MailSo\Log\Logger::NewInstance(false); if (!!$this->Config()->Get('logs', 'auth_logging', false)) { $sAuthLogFileFullPath = \APP_PRIVATE_DATA.'logs/'.$this->compileLogFileName( $this->Config()->Get('logs', 'auth_logging_filename', '')); $sLogFileDir = \dirname($sAuthLogFileFullPath); if (!@is_dir($sLogFileDir)) { @mkdir($sLogFileDir, 0755, true); } $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::MEMORY); $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME); $this->oLoggerAuth->AddForbiddenType(\MailSo\Log\Enumerations\Type::TIME_DELTA); $oDriver = \MailSo\Log\Drivers\File::NewInstance($sAuthLogFileFullPath); $oDriver->DisableTimePrefix(); $oDriver->DisableGuidPrefix(); $oDriver->DisableTypedPrefix(); $this->oLoggerAuth->Add($oDriver); } } return $this->oLoggerAuth; } /** * @param \RainLoop\Model\Account $oAccount = null * @param array $aAdditionalParams = array() */ public function LoggerAuthHelper($oAccount = null, $aAdditionalParams = array()) { $sLine = $this->Config()->Get('logs', 'auth_logging_format', ''); if (!empty($sLine)) { $this->LoggerAuth()->Write($this->compileLogParams($sLine, $oAccount, false, $aAdditionalParams)); } } /** * @return string */ private function getAdminToken() { $sRand = \MailSo\Base\Utils::Md5Rand(); if (!$this->Cacher(null, true)->Set(\RainLoop\KeyPathHelper::SessionAdminKey($sRand), \time())) { $this->oLogger->Write('Cannot store an admin token', \MailSo\Log\Enumerations\Type::WARNING); $sRand = ''; } return '' === $sRand ? '' : \RainLoop\Utils::EncodeKeyValuesQ(array('token', \md5(APP_SALT), $sRand)); } /** * @param bool $bThrowExceptionOnFalse = true * * @return bool */ public function IsAdminLoggined($bThrowExceptionOnFalse = true) { $bResult = false; if ($this->Config()->Get('security', 'allow_admin_panel', true)) { $aAdminHash = \RainLoop\Utils::DecodeKeyValuesQ($this->getAdminAuthToken()); if (!empty($aAdminHash[0]) && !empty($aAdminHash[1]) && !empty($aAdminHash[2]) && 'token' === $aAdminHash[0] && \md5(APP_SALT) === $aAdminHash[1] && '' !== $this->Cacher(null, true)->Get(\RainLoop\KeyPathHelper::SessionAdminKey($aAdminHash[2]), '') ) { $bResult = true; } } if (!$bResult && $bThrowExceptionOnFalse) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } return $bResult; } /** * @param string $sTo */ public function SetMailtoRequest($sTo) { if (!empty($sTo)) { \RainLoop\Utils::SetCookie(self::AUTH_MAILTO_TOKEN_KEY, \RainLoop\Utils::EncodeKeyValuesQ(array( 'Time' => \microtime(true), 'MailTo' => 'MailTo', 'To' => $sTo )), 0); } } /** * @param string $sEmail * @param string $sLogin * @param string $sPassword * @param string $sSignMeToken = '' * @param string $sClientCert = '' * @param bool $bThrowProvideException = false * * @return \RainLoop\Model\Account|null */ public function LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken = '', $sClientCert = '', $bThrowProvideException = false) { $oAccount = null; if (0 < \strlen($sEmail) && 0 < \strlen($sLogin) && 0 < \strlen($sPassword)) { $oDomain = $this->DomainProvider()->Load(\MailSo\Base\Utils::GetDomainFromEmail($sEmail), true); if ($oDomain instanceof \RainLoop\Model\Domain) { if ($oDomain->ValidateWhiteList($sEmail, $sLogin)) { $oAccount = \RainLoop\Model\Account::NewInstance($sEmail, $sLogin, $sPassword, $oDomain, $sSignMeToken, '', '', $sClientCert); $this->Plugins()->RunHook('filter.acount', array(&$oAccount)); if ($bThrowProvideException && !($oAccount instanceof \RainLoop\Model\Account)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } } else if ($bThrowProvideException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountNotAllowed); } } else if ($bThrowProvideException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DomainNotAllowed); } } return $oAccount; } /** * @param string $sToken * @param bool $bThrowExceptionOnFalse = true * @param bool $bValidateShortToken = true * @param bool $bQ = false * * @return \RainLoop\Model\Account|bool * @throws \RainLoop\Exceptions\ClientException */ public function GetAccountFromCustomToken($sToken, $bThrowExceptionOnFalse = true, $bValidateShortToken = true, $bQ = false) { $oResult = false; if (!empty($sToken)) { $aAccountHash = $bQ ? \RainLoop\Utils::DecodeKeyValuesQ($sToken) : \RainLoop\Utils::DecodeKeyValues($sToken); if (!empty($aAccountHash[0]) && 'token' === $aAccountHash[0] && // simple token validation 8 <= \count($aAccountHash) && // length checking !empty($aAccountHash[7]) && // does short token exist (!$bValidateShortToken || \RainLoop\Utils::GetShortToken() === $aAccountHash[7] || // check short token if needed (isset($aAccountHash[10]) && 0 < $aAccountHash[10] && \time() < $aAccountHash[10])) ) { $oAccount = $this->LoginProvide($aAccountHash[1], $aAccountHash[2], $aAccountHash[3], empty($aAccountHash[5]) ? '' : $aAccountHash[5], empty($aAccountHash[11]) ? '' : $aAccountHash[11], $bThrowExceptionOnFalse); if ($oAccount instanceof \RainLoop\Model\Account) { if (!empty($aAccountHash[8]) && !empty($aAccountHash[9])) // init proxy user/password { $oAccount->SetProxyAuthUser($aAccountHash[8]); $oAccount->SetProxyAuthPassword($aAccountHash[9]); } $this->Logger()->AddSecret($oAccount->Password()); $this->Logger()->AddSecret($oAccount->ProxyAuthPassword()); $oAccount->SetParentEmail($aAccountHash[6]); $oResult = $oAccount; } } else if ($bThrowExceptionOnFalse) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } } if ($bThrowExceptionOnFalse && !($oResult instanceof \RainLoop\Model\Account)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } return $oResult; } /** * @return \RainLoop\Model\Account|bool */ public function GetAccountFromSignMeToken() { $oAccount = false; $sSignMeToken = \RainLoop\Utils::GetCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY, ''); if (!empty($sSignMeToken)) { $aTokenData = \RainLoop\Utils::DecodeKeyValuesQ($sSignMeToken); if (\is_array($aTokenData) && !empty($aTokenData['e']) && !empty($aTokenData['t'])) { $sTokenSettings = $this->StorageProvider()->Get($aTokenData['e'], \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'sign_me' ); if (!empty($sTokenSettings)) { $aSignMeData = \RainLoop\Utils::DecodeKeyValuesQ($sTokenSettings); if (\is_array($aSignMeData) && !empty($aSignMeData['AuthToken']) && !empty($aSignMeData['SignMetToken']) && $aSignMeData['SignMetToken'] === $aTokenData['t']) { $oAccount = $this->GetAccountFromCustomToken($aSignMeData['AuthToken'], false, false, true); } } } } else { \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); } return $oAccount; } /** * @param bool $bThrowExceptionOnFalse = true * * @return \RainLoop\Model\Account|bool * @throws \RainLoop\Exceptions\ClientException */ public function getAccountFromToken($bThrowExceptionOnFalse = true) { return $this->GetAccountFromCustomToken($this->getLocalAuthToken(), $bThrowExceptionOnFalse, true, true); } /** * @return bool */ public function IsOpen() { return !$this->PremProvider(); } /** * @param bool $bAdmin = false * @param bool $bMobile = false * @param bool $bMobileDevice = false * * @return array */ public function AppDataSystem($bAdmin = false, $bMobile = false, $bMobileDevice = false) { $oConfig = $this->Config(); $aAttachmentsActions = array(); if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS)) { if (!!\class_exists('ZipArchive')) { $aAttachmentsActions[] = 'zip'; } if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('OCP\Files')) { $aAttachmentsActions[] = 'owncloud'; } if ($oConfig->Get('social', 'dropbox_enable', false) && 0 < \strlen(\trim($oConfig->Get('social', 'dropbox_api_key', '')))) { $aAttachmentsActions[] = 'dropbox'; } } return \array_merge(array( 'version' => APP_VERSION, 'admin' => $bAdmin, 'mobile' => $bMobile, 'mobileDevice' => $bMobileDevice, 'webPath' => \RainLoop\Utils::WebPath(), 'webVersionPath' => \RainLoop\Utils::WebVersionPath(), 'token' => $oConfig->Get('security', 'csrf_protection', false) ? \RainLoop\Utils::GetCsrfToken() : '', 'inIframe' => (bool) $oConfig->Get('labs', 'in_iframe', false), 'allowHtmlEditorSourceButton' => (bool) $oConfig->Get('labs', 'allow_html_editor_source_button', false), 'allowHtmlEditorBitiButtons' => (bool) $oConfig->Get('labs', 'allow_html_editor_biti_buttons', false), 'allowCtrlEnterOnCompose' => (bool) $oConfig->Get('labs', 'allow_ctrl_enter_on_compose', false), 'customLoginLink' => $oConfig->Get('labs', 'custom_login_link', ''), 'customLogoutLink' => $oConfig->Get('labs', 'custom_logout_link', ''), 'forgotPasswordLinkUrl' => \trim($oConfig->Get('login', 'forgot_password_link_url', '')), 'registrationLinkUrl' => \trim($oConfig->Get('login', 'registration_link_url', '')), 'hideSubmitButton' => (bool) $oConfig->Get('login', 'hide_submit_button', true), 'jsHash' => \md5(\RainLoop\Utils::GetConnectionToken()), 'useImapThread' => (bool) $oConfig->Get('labs', 'use_imap_thread', false), 'useImapSubscribe' => (bool) $oConfig->Get('labs', 'use_imap_list_subscribe', true), 'allowAppendMessage' => (bool) $oConfig->Get('labs', 'allow_message_append', false), 'materialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), 'folderSpecLimit' => (int) $oConfig->Get('labs', 'folders_spec_limit', 50), 'faviconStatus' => (bool) $oConfig->Get('labs', 'favicon_status', true), 'allowCmdInterface' => (bool) $oConfig->Get('labs', 'allow_cmd', false), 'useNativeScrollbars' => (bool) $oConfig->Get('interface', 'use_native_scrollbars', false), 'listPermanentFiltered' => '' !== \trim(\RainLoop\Api::Config()->Get('labs', 'imap_message_list_permanent_filter', '')), 'themes' => $this->GetThemes($bMobile, false), 'languages' => $this->GetLanguages(false), 'languagesAdmin' => $this->GetLanguages(true), 'appVersionType' => APP_VERSION_TYPE, 'attachmentsActions' => $aAttachmentsActions ), $bAdmin ? array( 'adminHostUse' => '' !== $oConfig->Get('security', 'admin_panel_host', ''), 'adminPath' => \strtolower($oConfig->Get('security', 'admin_panel_key', 'admin')), 'allowAdminPanel' => (bool) $oConfig->Get('security', 'allow_admin_panel', true), ) : array()); } /** * @param bool $bAdmin * @param bool $bMobile = false * @param string $sAuthAccountHash = '' * * @return array */ public function AppData($bAdmin, $bMobile = false, $bMobileDevice = false, $sAuthAccountHash = '') { if (0 < \strlen($sAuthAccountHash) && \preg_match('/[^_\-\.a-zA-Z0-9]/', $sAuthAccountHash)) { $sAuthAccountHash = ''; } $oAccount = null; $oConfig = $this->Config(); /* required by Index.html and rl.js: NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBackground PluginsLink AuthAccountHash */ $aResult = array( 'Auth' => false, 'AccountHash' => '', 'AccountSignMe' => false, 'AuthAccountHash' => '', 'MailToEmail' => '', 'Email' => '', 'DevEmail' => '', 'DevPassword' => '', 'Title' => $oConfig->Get('webmail', 'title', 'RainLoop Webmail'), 'LoadingDescription' => $oConfig->Get('webmail', 'loading_description', 'RainLoop'), 'LoadingDescriptionEsc' => 'RainLoop', 'FaviconUrl' => $oConfig->Get('webmail', 'favicon_url', ''), 'LoginDescription' => '', 'LoginLogo' => '', 'LoginBackground' => '', 'LoginCss' => '', 'UserLogo' => '', 'UserLogoTitle' => '', 'UserLogoMessage' => '', 'UserCss' => '', 'WelcomePageUrl' => '', 'WelcomePageDisplay' => 'none', 'IncludeCss' => '', 'IncludeBackground' => '', 'LoginDefaultDomain' => $oConfig->Get('login', 'default_domain', ''), 'DetermineUserLanguage' => (bool) $oConfig->Get('login', 'determine_user_language', true), 'DetermineUserDomain' => (bool) $oConfig->Get('login', 'determine_user_domain', false), 'UseLoginWelcomePage' => (bool) $oConfig->Get('login', 'welcome_page', false), 'StartupUrl' => \trim(\ltrim(\trim($oConfig->Get('labs', 'startup_url', '')), '#/')), 'SieveAllowFileintoInbox' => (bool) $oConfig->Get('labs', 'sieve_allow_fileinto_inbox', false), 'ContactsIsAllowed' => false, 'ChangePasswordIsAllowed' => false, 'RequireTwoFactor' => false, 'Community' => true, 'PremType' => false, 'Admin' => array(), 'Capa' => array(), 'Plugins' => array(), 'System' => $this->AppDataSystem($bAdmin, $bMobile, $bMobileDevice) ); if (0 < \strlen($sAuthAccountHash)) { $aResult['AuthAccountHash'] = $sAuthAccountHash; } $oPremProvider = $this->PremProvider(); if ($oPremProvider) { $oPremProvider->PopulateAppData($aResult); } if ('' !== $aResult['LoadingDescription'] && 'RainLoop' !== $aResult['LoadingDescription']) { $aResult['LoadingDescriptionEsc'] = @\htmlspecialchars($aResult['LoadingDescription'], ENT_QUOTES|ENT_IGNORE, 'UTF-8'); } $oSettings = null; if (!$bAdmin) { $oAccount = $this->getAccountFromToken(false); if ($oAccount instanceof \RainLoop\Model\Account) { $aResult['IncludeCss'] = $aResult['UserCss']; $oAddressBookProvider = $this->AddressBookProvider($oAccount); $aResult['Auth'] = true; $aResult['Email'] = $oAccount->Email(); $aResult['IncLogin'] = $oAccount->IncLogin(); $aResult['OutLogin'] = $oAccount->OutLogin(); $aResult['AccountHash'] = $oAccount->Hash(); $aResult['AccountSignMe'] = $oAccount->SignMe(); $aResult['ChangePasswordIsAllowed'] = $this->ChangePasswordProvider()->PasswordChangePossibility($oAccount); $aResult['ContactsIsAllowed'] = $oAddressBookProvider->IsActive(); $aResult['ContactsSyncIsAllowed'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); $aResult['ContactsSyncInterval'] = (int) $oConfig->Get('contacts', 'sync_interval', 20); $aResult['EnableContactsSync'] = false; $aResult['ContactsSyncUrl'] = ''; $aResult['ContactsSyncUser'] = ''; $aResult['ContactsSyncPassword'] = ''; if ($aResult['ContactsIsAllowed'] && $aResult['ContactsSyncIsAllowed']) { $mData = $this->getContactsSyncData($oAccount); if (\is_array($mData)) { $aResult['EnableContactsSync'] = isset($mData['Enable']) ? !!$mData['Enable'] : false; $aResult['ContactsSyncUrl'] = isset($mData['Url']) ? \trim($mData['Url']) : ''; $aResult['ContactsSyncUser'] = isset($mData['User']) ? \trim($mData['User']) : ''; $aResult['ContactsSyncPassword'] = APP_DUMMY; } } if ($aResult['AccountSignMe']) { $sToken = \RainLoop\Utils::GetCookie(self::AUTH_MAILTO_TOKEN_KEY, null); if (null !== $sToken) { \RainLoop\Utils::ClearCookie(self::AUTH_MAILTO_TOKEN_KEY); $mMailToData = \RainLoop\Utils::DecodeKeyValuesQ($sToken); if (\is_array($mMailToData) && !empty($mMailToData['MailTo']) && 'MailTo' === $mMailToData['MailTo'] && !empty($mMailToData['To'])) { $aResult['MailToEmail'] = $mMailToData['To']; } } } $oSettings = $this->SettingsProvider()->Load($oAccount); if (!$oAccount->IsAdditionalAccount() && !empty($aResult['WelcomePageUrl']) && ('once' === $aResult['WelcomePageDisplay'] || 'always' === $aResult['WelcomePageDisplay'])) { if ('once' === $aResult['WelcomePageDisplay']) { if ($aResult['WelcomePageUrl'] === $oSettings->GetConf('LastWelcomePage', '')) { $aResult['WelcomePageUrl'] = ''; $aResult['WelcomePageDisplay'] = ''; } } } else { $aResult['WelcomePageUrl'] = ''; $aResult['WelcomePageDisplay'] = ''; } if (!empty($aResult['StartupUrl'])) { $aResult['StartupUrl'] = $this->compileLogParams($aResult['StartupUrl'], $oAccount, true); } if (!empty($aResult['UserIframeMessage'])) { $aResult['UserIframeMessage'] = $this->compileLogParams($aResult['UserIframeMessage'], $oAccount, true); } } else { $oAccount = null; $aResult['IncludeBackground'] = $aResult['LoginBackground']; $aResult['IncludeCss'] = $aResult['LoginCss']; $aResult['DevEmail'] = $oConfig->Get('labs', 'dev_email', ''); $aResult['DevPassword'] = $oConfig->Get('labs', 'dev_password', ''); $aResult['WelcomePageUrl'] = ''; $aResult['WelcomePageDisplay'] = ''; $aResult['StartupUrl'] = ''; if (empty($aResult['AdditionalLoginError'])) { $aResult['AdditionalLoginError'] = $this->GetSpecLogoutCustomMgsWithDeletion(); } } $aResult['AllowGoogleSocial'] = (bool) $oConfig->Get('social', 'google_enable', false); $aResult['AllowGoogleSocialAuth'] = (bool) $oConfig->Get('social', 'google_enable_auth', true); $aResult['AllowGoogleSocialAuthGmail'] = (bool) $oConfig->Get('social', 'google_enable_auth_gmail', true); $aResult['AllowGoogleSocialDrive'] = (bool) $oConfig->Get('social', 'google_enable_drive', true); $aResult['AllowGoogleSocialPreview'] = (bool) $oConfig->Get('social', 'google_enable_preview', true); $aResult['GoogleClientID'] = \trim($oConfig->Get('social', 'google_client_id', '')); $aResult['GoogleApiKey'] = \trim($oConfig->Get('social', 'google_api_key', '')); if (!$aResult['AllowGoogleSocial'] || ($aResult['AllowGoogleSocial'] && ( '' === \trim($oConfig->Get('social', 'google_client_id', '')) || '' === \trim($oConfig->Get('social', 'google_client_secret', ''))))) { $aResult['AllowGoogleSocialAuth'] = false; $aResult['AllowGoogleSocialAuthGmail'] = false; $aResult['AllowGoogleSocialDrive'] = false; $aResult['GoogleClientID'] = ''; $aResult['GoogleApiKey'] = ''; } if (!$aResult['AllowGoogleSocial']) { $aResult['AllowGoogleSocialPreview'] = false; } if ($aResult['AllowGoogleSocial'] && !$aResult['AllowGoogleSocialAuth'] && !$aResult['AllowGoogleSocialAuthGmail'] && !$aResult['AllowGoogleSocialDrive'] && !$aResult['AllowGoogleSocialPreview']) { $aResult['AllowGoogleSocial'] = false; } $aResult['AllowFacebookSocial'] = (bool) $oConfig->Get('social', 'fb_enable', false); if ($aResult['AllowFacebookSocial'] && ( '' === \trim($oConfig->Get('social', 'fb_app_id', '')) || '' === \trim($oConfig->Get('social', 'fb_app_secret', '')))) { $aResult['AllowFacebookSocial'] = false; } $aResult['AllowTwitterSocial'] = (bool) $oConfig->Get('social', 'twitter_enable', false); if ($aResult['AllowTwitterSocial'] && ( '' === \trim($oConfig->Get('social', 'twitter_consumer_key', '')) || '' === \trim($oConfig->Get('social', 'twitter_consumer_secret', '')))) { $aResult['AllowTwitterSocial'] = false; } $aResult['AllowDropboxSocial'] = (bool) $oConfig->Get('social', 'dropbox_enable', false); $aResult['DropboxApiKey'] = \trim($oConfig->Get('social', 'dropbox_api_key', '')); if (!$aResult['AllowDropboxSocial']) { $aResult['DropboxApiKey'] = ''; } else if (0 === strlen($aResult['DropboxApiKey'])) { $aResult['AllowDropboxSocial'] = false; } $aResult['Capa'] = $this->Capa(false, $bMobile, $oAccount); if ($aResult['Auth'] && !$aResult['RequireTwoFactor']) { if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount) && $this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE, $oAccount) && $this->TwoFactorAuthProvider()->IsActive()) { $aData = $this->getTwoFactorInfo($oAccount, true); $aResult['RequireTwoFactor'] = !$aData || !isset($aData['User'], $aData['IsSet'], $aData['Enable']) || !($aData['IsSet'] && $aData['Enable']); } } } else { $aResult['Auth'] = $this->IsAdminLoggined(false); if ($aResult['Auth']) { $aResult['AdminDomain'] = APP_SITE; $aResult['AdminLogin'] = (string) $oConfig->Get('security', 'admin_login', ''); $aResult['UseTokenProtection'] = (bool) $oConfig->Get('security', 'csrf_protection', true); $aResult['EnabledPlugins'] = (bool) $oConfig->Get('plugins', 'enable', false); $aResult['VerifySslCertificate'] = (bool) $oConfig->Get('ssl', 'verify_certificate', false); $aResult['AllowSelfSigned'] = (bool) $oConfig->Get('ssl', 'allow_self_signed', true); $aDrivers = \class_exists('PDO') ? \PDO::getAvailableDrivers() : null; $aResult['MySqlIsSupported'] = \is_array($aDrivers) ? \in_array('mysql', $aDrivers) : false; $aResult['SQLiteIsSupported'] = \is_array($aDrivers) ? \in_array('sqlite', $aDrivers) : false; $aResult['PostgreSqlIsSupported'] = \is_array($aDrivers) ? \in_array('pgsql', $aDrivers) : false; $aResult['ContactsEnable'] = (bool) $oConfig->Get('contacts', 'enable', false); $aResult['ContactsSync'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); $aResult['ContactsPdoType'] = (string) $this->ValidateContactPdoType(\trim($this->Config()->Get('contacts', 'type', 'sqlite'))); $aResult['ContactsPdoDsn'] = (string) $oConfig->Get('contacts', 'pdo_dsn', ''); $aResult['ContactsPdoType'] = (string) $oConfig->Get('contacts', 'type', ''); $aResult['ContactsPdoUser'] = (string) $oConfig->Get('contacts', 'pdo_user', ''); $aResult['ContactsPdoPassword'] = (string) APP_DUMMY; $aResult['AllowGoogleSocial'] = (bool) $oConfig->Get('social', 'google_enable', false); $aResult['AllowGoogleSocialAuth'] = (bool) $oConfig->Get('social', 'google_enable_auth', true); $aResult['AllowGoogleSocialAuthGmail'] = (bool) $oConfig->Get('social', 'google_enable_auth_gmail', true); $aResult['AllowGoogleSocialDrive'] = (bool) $oConfig->Get('social', 'google_enable_drive', true); $aResult['AllowGoogleSocialPreview'] = (bool) $oConfig->Get('social', 'google_enable_preview', true); $aResult['GoogleClientID'] = (string) $oConfig->Get('social', 'google_client_id', ''); $aResult['GoogleClientSecret'] = (string) $oConfig->Get('social', 'google_client_secret', ''); $aResult['GoogleApiKey'] = (string) $oConfig->Get('social', 'google_api_key', ''); $aResult['AllowFacebookSocial'] = (bool) $oConfig->Get('social', 'fb_enable', false); $aResult['FacebookAppID'] = (string) $oConfig->Get('social', 'fb_app_id', ''); $aResult['FacebookAppSecret'] = (string) $oConfig->Get('social', 'fb_app_secret', ''); $aResult['AllowTwitterSocial'] = (bool) $oConfig->Get('social', 'twitter_enable', false); $aResult['TwitterConsumerKey'] = (string) $oConfig->Get('social', 'twitter_consumer_key', ''); $aResult['TwitterConsumerSecret'] = (string) $oConfig->Get('social', 'twitter_consumer_secret', ''); $aResult['AllowDropboxSocial'] = (bool) $oConfig->Get('social', 'dropbox_enable', false); $aResult['DropboxApiKey'] = (string) $oConfig->Get('social', 'dropbox_api_key', ''); $aResult['SubscriptionEnabled'] = (bool) \MailSo\Base\Utils::ValidateDomain($aResult['AdminDomain'], true); // || \MailSo\Base\Utils::ValidateIP($aResult['AdminDomain']); $aResult['WeakPassword'] = (bool) $oConfig->ValidatePassword('12345'); $aResult['CoreAccess'] = (bool) $this->rainLoopCoreAccess(); $aResult['PhpUploadSizes'] = array( 'upload_max_filesize' => \ini_get('upload_max_filesize'), 'post_max_size' => \ini_get('post_max_size') ); } $aResult['Capa'] = $this->Capa(true, $bMobile); } $aResult['SupportedFacebookSocial'] = (bool) \version_compare(PHP_VERSION, '5.4.0', '>='); if (!$aResult['SupportedFacebookSocial']) { $aResult['AllowFacebookSocial'] = false; $aResult['FacebookAppID'] = ''; $aResult['FacebookAppSecret'] = ''; } $aResult['ProjectHash'] = \md5($aResult['AccountHash'].APP_VERSION.$this->Plugins()->Hash()); $sLanguage = $oConfig->Get('webmail', 'language', 'en'); $sLanguageAdmin = $oConfig->Get('webmail', 'language_admin', 'en'); $sTheme = $oConfig->Get('webmail', 'theme', 'Default'); $aResult['NewMoveToFolder'] = (bool) $oConfig->Get('interface', 'new_move_to_folder_button', true); $aResult['AllowLanguagesOnSettings'] = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true); $aResult['AllowLanguagesOnLogin'] = (bool) $oConfig->Get('login', 'allow_languages_on_login', true); $aResult['AttachmentLimit'] = ((int) $oConfig->Get('webmail', 'attachment_size_limit', 10)) * 1024 * 1024; $aResult['SignMe'] = (string) $oConfig->Get('login', 'sign_me_auto', \RainLoop\Enumerations\SignMeType::DEFAILT_OFF); $aResult['UseLocalProxyForExternalImages'] = (bool) $oConfig->Get('labs', 'use_local_proxy_for_external_images', false); // user $aResult['ShowImages'] = (bool) $oConfig->Get('defaults', 'show_images', false); $aResult['MPP'] = (int) $oConfig->Get('webmail', 'messages_per_page', 25); $aResult['SoundNotification'] = false; $aResult['DesktopNotifications'] = false; $aResult['Layout'] = (int) $oConfig->Get('defaults', 'view_layout', \RainLoop\Enumerations\Layout::SIDE_PREVIEW); $aResult['EditorDefaultType'] = (string) $oConfig->Get('defaults', 'view_editor_type', ''); $aResult['UseCheckboxesInList'] = (bool) $oConfig->Get('defaults', 'view_use_checkboxes', true); $aResult['AutoLogout'] = (int) $oConfig->Get('defaults', 'autologout', 30); $aResult['UseThreads'] = (bool) $oConfig->Get('defaults', 'mail_use_threads', false); $aResult['AllowDraftAutosave'] = (bool) $oConfig->Get('defaults', 'allow_draft_autosave', true); $aResult['ReplySameFolder'] = (bool) $oConfig->Get('defaults', 'mail_reply_same_folder', false); $aResult['ContactsAutosave'] = (bool) $oConfig->Get('defaults', 'contacts_autosave', true); $aResult['EnableTwoFactor'] = false; $aResult['ParentEmail'] = ''; $aResult['InterfaceAnimation'] = true; $aResult['UserBackgroundName'] = ''; $aResult['UserBackgroundHash'] = ''; if (!$bAdmin && $oAccount instanceof \RainLoop\Model\Account) { $aResult['ParentEmail'] = $oAccount->ParentEmail(); $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); if ($oSettingsLocal instanceof \RainLoop\Settings) { // if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) $aResult['SentFolder'] = (string) $oSettingsLocal->GetConf('SentFolder', ''); $aResult['DraftFolder'] = (string) $oSettingsLocal->GetConf('DraftFolder', ''); $aResult['SpamFolder'] = (string) $oSettingsLocal->GetConf('SpamFolder', ''); $aResult['TrashFolder'] = (string) $oSettingsLocal->GetConf('TrashFolder', ''); $aResult['ArchiveFolder'] = (string) $oSettingsLocal->GetConf('ArchiveFolder', ''); $aResult['NullFolder'] = (string) $oSettingsLocal->GetConf('NullFolder', ''); } if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::SETTINGS, $oAccount)) { if ($oSettings instanceof \RainLoop\Settings) { if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) { $sLanguage = (string) $oSettings->GetConf('Language', $sLanguage); } $aResult['EditorDefaultType'] = (string) $oSettings->GetConf('EditorDefaultType', $aResult['EditorDefaultType']); $aResult['ShowImages'] = (bool) $oSettings->GetConf('ShowImages', $aResult['ShowImages']); $aResult['ContactsAutosave'] = (bool) $oSettings->GetConf('ContactsAutosave', $aResult['ContactsAutosave']); $aResult['MPP'] = (int) $oSettings->GetConf('MPP', $aResult['MPP']); $aResult['SoundNotification'] = (bool) $oSettings->GetConf('SoundNotification', $aResult['SoundNotification']); $aResult['DesktopNotifications'] = (bool) $oSettings->GetConf('DesktopNotifications', $aResult['DesktopNotifications']); $aResult['UseCheckboxesInList'] = (bool) $oSettings->GetConf('UseCheckboxesInList', $aResult['UseCheckboxesInList']); $aResult['AllowDraftAutosave'] = (bool) $oSettings->GetConf('AllowDraftAutosave', $aResult['AllowDraftAutosave']); $aResult['AutoLogout'] = (int) $oSettings->GetConf('AutoLogout', $aResult['AutoLogout']); $aResult['Layout'] = (int) $oSettings->GetConf('Layout', $aResult['Layout']); if (!$this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::AUTOLOGOUT, $oAccount)) { $aResult['AutoLogout'] = 0; } if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) { $aResult['UserBackgroundName'] = (string) $oSettings->GetConf('UserBackgroundName', $aResult['UserBackgroundName']); $aResult['UserBackgroundHash'] = (string) $oSettings->GetConf('UserBackgroundHash', $aResult['UserBackgroundHash']); // if (!empty($aResult['UserBackgroundName']) && !empty($aResult['UserBackgroundHash'])) // { // $aResult['IncludeBackground'] = './?/Raw/&q[]=/{{USER}}/UserBackground/&q[]=/'. // $aResult['UserBackgroundHash'].'/'; // } } $aResult['EnableTwoFactor'] = (bool) $oSettings->GetConf('EnableTwoFactor', $aResult['EnableTwoFactor']); } if ($oSettingsLocal instanceof \RainLoop\Settings) { $aResult['UseThreads'] = (bool) $oSettingsLocal->GetConf('UseThreads', $aResult['UseThreads']); $aResult['ReplySameFolder'] = (bool) $oSettingsLocal->GetConf('ReplySameFolder', $aResult['ReplySameFolder']); if ($this->GetCapa(false, $bMobile, \RainLoop\Enumerations\Capa::THEMES, $oAccount)) { $sTheme = (string) $oSettingsLocal->GetConf('Theme', $sTheme); } } } } if (!$aResult['Auth']) { if (!$bAdmin) { if ($oConfig->Get('login', 'allow_languages_on_login', true) && $oConfig->Get('login', 'determine_user_language', true)) { $sLanguage = $this->ValidateLanguage( $this->detectUserLanguage($bAdmin), $sLanguage, false); } } } $sTheme = $this->ValidateTheme($sTheme, $bMobile); $sStaticCache = $this->StaticCache(); $aResult['Theme'] = $sTheme; $aResult['NewThemeLink'] = $this->ThemeLink($sTheme, $bAdmin); $aResult['Language'] = $this->ValidateLanguage($sLanguage, '', false); $aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, '', true); $aResult['UserLanguageRaw'] = $this->detectUserLanguage($bAdmin); $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', false, true); $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', true, true); $aResult['PluginsLink'] = ''; if (0 < $this->Plugins()->Count() && $this->Plugins()->HaveJs($bAdmin)) { $aResult['PluginsLink'] = './?/Plugins/0/'.($bAdmin ? 'Admin' : 'User').'/'.$sStaticCache.'/'; } $aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'Admin' : 'App').'/'. ($bAdmin ? $aResult['LanguageAdmin'] : $aResult['Language']).'/'.$sStaticCache.'/'; $aResult['TemplatesLink'] = './?/Templates/0/'.($bAdmin ? 'Admin' : 'App').'/'.$sStaticCache.'/'; $bAppJsDebug = !!$this->Config()->Get('labs', 'use_app_debug_js', false); $aResult['StaticLibJsLink'] = $this->StaticPath('js/'.($bAppJsDebug ? '' : 'min/'). 'libs'.($bAppJsDebug ? '' : '.min').'.js'); $aResult['StaticAppJsLink'] = $this->StaticPath('js/'.($bAppJsDebug ? '' : 'min/'). ($bAdmin ? 'admin' : 'app').($bAppJsDebug ? '' : '.min').'.js'); $aResult['StaticAppJsNextLink'] = $this->StaticPath('js/'.($bAdmin ? 'admin' : 'app').'.next.js'); $aResult['StaticEditorJsLink'] = $this->StaticPath('ckeditor/ckeditor.js'); $aResult['EditorDefaultType'] = \in_array($aResult['EditorDefaultType'], array('Plain', 'Html', 'HtmlForced', 'PlainForced')) ? $aResult['EditorDefaultType'] : 'Plain'; // IDN $aResult['Email'] = \MailSo\Base\Utils::IdnToUtf8($aResult['Email']); $aResult['ParentEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['ParentEmail']); $aResult['MailToEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['MailToEmail']); $aResult['DevEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['DevEmail']); // Mobile override if ($bMobile) { $aResult['Layout'] = \RainLoop\Enumerations\Layout::NO_PREVIW; $aResult['SoundNotification'] = false; $aResult['DesktopNotifications'] = false; $aResult['UseCheckboxesInList'] = true; $aResult['UserBackgroundName'] = ''; $aResult['UserBackgroundHash'] = ''; } $this->Plugins()->InitAppData($bAdmin, $aResult, $oAccount); return $aResult; } /** * @return array */ private function getUserLanguagesFromHeader() { $aResult = $aList = array(); $sAcceptLang = \strtolower($this->Http()->GetServer('HTTP_ACCEPT_LANGUAGE', 'en')); if (!empty($sAcceptLang) && \preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', $sAcceptLang, $aList)) { $aResult = \array_combine($aList[1], $aList[2]); foreach ($aResult as $n => $v) { $aResult[$n] = $v ? $v : 1; } \arsort($aResult, SORT_NUMERIC); } return $aResult; } public function googleStoreTokens($oCache, $sAccessToken, $sRefreshToken) { $sCacheKey = 'tokens='.\md5($sRefreshToken); $oCache->Set($sCacheKey, $sAccessToken); $oCache->SetTimer($sCacheKey); } /** * @return string */ public function googleRefreshTokenCallback($sAccessToken, $sRefreshToken) { $oAccount = $this->getAccountFromToken(false); if ($oAccount && $this->GetIsAjax()) { $oCache = $this->Cacher($oAccount); $sCacheKey = 'tokens='.\md5($sRefreshToken); $sCachedAccessToken = $oCache->Get($sCacheKey); $iTime = $oCache->GetTimer($sCacheKey); if ($sCachedAccessToken === '' || $iTime === 0) { $this->googleStoreTokens($oCache, $sAccessToken, $sRefreshToken); } else if (\time() - 60 * 10 * 2 > $iTime) // 20min { $sCachedAccessToken = $this->Social()->GoogleRefreshToken($sAccessToken, $sRefreshToken); if ($sCachedAccessToken !== $sAccessToken) { $this->googleStoreTokens($oCache, $sCachedAccessToken, $sRefreshToken); $oAccount->SetPassword(\RainLoop\Model\Account::GenerateTokensPassword($sCachedAccessToken, $sRefreshToken)); $this->AuthToken($oAccount); $this->SetUpdateAuthToken($this->GetSpecAuthToken()); } } if ($sCachedAccessToken) { return $sCachedAccessToken; } } return $sAccessToken; } /** * @return string */ public function detectUserLanguage($bAdmin = false) { $sResult = ''; $aLangs = $this->getUserLanguagesFromHeader(); foreach (\array_keys($aLangs) as $sLang) { $sLang = $this->ValidateLanguage($sLang, '', $bAdmin, true); if (!empty($sLang)) { $sResult = $sLang; break; } } return $sResult; } /** * @param int $iWait = 1 * @param int $iDelay = 1 */ private function requestSleep($iWait = 1, $iDelay = 1) { if (0 < $iDelay && 0 < $iWait) { if ($iWait > \time() - APP_START_TIME) { \sleep($iDelay); } } } private function loginErrorDelay() { $iDelay = (int) $this->Config()->Get('labs', 'login_fault_delay', 0); if (0 < $iDelay) { $this->requestSleep(1, $iDelay); } } /** * @param \RainLoop\Model\Account $oAccount */ public function AuthToken($oAccount) { if ($oAccount instanceof \RainLoop\Model\Account) { $this->SetAuthToken($oAccount); $aAccounts = $this->GetAccounts($oAccount); if (\is_array($aAccounts) && isset($aAccounts[$oAccount->Email()])) { $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); $this->SetAccounts($oAccount, $aAccounts); } } } /** * @param \RainLoop\Model\Account $oAccount * @param bool $bAuthLog = false * * @throws \RainLoop\Exceptions\ClientException */ public function CheckMailConnection($oAccount, $bAuthLog = false) { try { $oAccount->IncConnectAndLoginHelper($this->Plugins(), $this->MailClient(), $this->Config(), array($this, 'googleRefreshTokenCallback')); } catch (\RainLoop\Exceptions\ClientException $oException) { throw $oException; } catch (\MailSo\Net\Exceptions\ConnectionException $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); } catch (\MailSo\Imap\Exceptions\LoginBadCredentialsException $oException) { if ($bAuthLog) { $this->LoggerAuthHelper($oAccount); } if ($this->Config()->Get('labs', 'imap_show_login_alert', true)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException, $oException->getAlertFromStatus()); } else { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); } } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); } } /** * @param string $sLogin * @param bool $bAdmin = false * @return array */ private function getAdditionalLogParamsByUserLogin($sLogin, $bAdmin = false) { $sHost = $bAdmin ? $this->Http()->GetHost(false, true, true) : \MailSo\Base\Utils::GetDomainFromEmail($sLogin); return array( '{imap:login}' => $sLogin, '{imap:host}' => $sHost, '{smtp:login}' => $sLogin, '{smtp:host}' => $sHost, '{user:email}' => $sLogin, '{user:login}' => \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin), '{user:domain}' => $sHost, ); } /** * @param string $sEmail * @param string $sPassword * @param string $sSignMeToken = '' * @param string $sAdditionalCode = '' * @param string $bAdditionalCodeSignMe = false * @param string $bSkipTwoFactorAuth = false * * @return \RainLoop\Model\Account * @throws \RainLoop\Exceptions\ClientException */ public function LoginProcess(&$sEmail, &$sPassword, $sSignMeToken = '', $sAdditionalCode = '', $bAdditionalCodeSignMe = false, $bSkipTwoFactorAuth = false) { $sInputEmail = $sEmail; $this->Plugins()->RunHook('filter.login-credentials.step-1', array(&$sEmail, &$sPassword)); $sEmail = \MailSo\Base\Utils::Trim($sEmail); if ($this->Config()->Get('login', 'login_lowercase', true)) { $sEmail = \MailSo\Base\Utils::StrToLowerIfAscii($sEmail); } if (false === \strpos($sEmail, '@')) { $this->Logger()->Write('The email address "'.$sEmail.'" is not complete', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); if (false === \strpos($sEmail, '@') && !!$this->Config()->Get('login', 'determine_user_domain', false)) { $sUserHost = \trim($this->Http()->GetHost(false, true, true)); $this->Logger()->Write('Determined user domain: '.$sUserHost, \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); $bAdded = false; $iLimit = 14; $aDomainParts = \explode('.', $sUserHost); $oDomainProvider = $this->DomainProvider(); while (0 < \count($aDomainParts) && 0 < $iLimit) { $sLine = \trim(\implode('.', $aDomainParts), '. '); $oDomain = $oDomainProvider->Load($sLine, false); if ($oDomain && $oDomain instanceof \RainLoop\Model\Domain) { $bAdded = true; $this->Logger()->Write('Check "'.$sLine.'": OK ('.$sEmail.' > '.$sEmail.'@'.$sLine.')', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); $sEmail = $sEmail.'@'.$sLine; break; } else { $this->Logger()->Write('Check "'.$sLine.'": NO', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); } \array_shift($aDomainParts); $iLimit--; } if (!$bAdded) { $sLine = $sUserHost; $oDomain = $oDomainProvider->Load($sLine, true); if ($oDomain && $oDomain instanceof \RainLoop\Model\Domain) { $bAdded = true; $this->Logger()->Write('Check "'.$sLine.'" with wildcard: OK ('.$sEmail.' > '.$sEmail.'@'.$sLine.')', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); $sEmail = $sEmail.'@'.$sLine; } else { $this->Logger()->Write('Check "'.$sLine.'" with wildcard: NO', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); } } if (!$bAdded) { $this->Logger()->Write('Domain was not found!', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); } } $sDefDomain = \trim($this->Config()->Get('login', 'default_domain', '')); if (false === \strpos($sEmail, '@') && 0 < \strlen($sDefDomain)) { $this->Logger()->Write('Default domain "'.$sDefDomain.'" was used. ('.$sEmail.' > '.$sEmail.'@'.$sDefDomain.')', \MailSo\Log\Enumerations\Type::INFO, 'LOGIN'); $sEmail = $sEmail.'@'.$sDefDomain; } } $this->Plugins()->RunHook('filter.login-credentials.step-2', array(&$sEmail, &$sPassword)); if (false === \strpos($sEmail, '@') || 0 === \strlen($sPassword)) { $this->loginErrorDelay(); throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); } $this->Logger()->AddSecret($sPassword); $sLogin = $sEmail; if ($this->Config()->Get('login', 'login_lowercase', true)) { $sLogin = \MailSo\Base\Utils::StrToLowerIfAscii($sLogin); } $this->Plugins()->RunHook('filter.login-credentials', array(&$sEmail, &$sLogin, &$sPassword)); $this->Logger()->AddSecret($sPassword); $this->Plugins()->RunHook('event.login-pre-login-provide', array()); $oAccount = null; $sClientCert = \trim($this->Config()->Get('ssl', 'client_cert', '')); try { $oAccount = $this->LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken, $sClientCert, true); if (!($oAccount instanceof \RainLoop\Model\Account)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } $this->Plugins()->RunHook('event.login-post-login-provide', array(&$oAccount)); if (!($oAccount instanceof \RainLoop\Model\Account)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } } catch (\Exception $oException) { $this->loginErrorDelay(); $this->LoggerAuthHelper($oAccount, $this->getAdditionalLogParamsByUserLogin($sInputEmail)); throw $oException; } // 2FA if (!$bSkipTwoFactorAuth && $this->TwoFactorAuthProvider()->IsActive()) { $aData = $this->getTwoFactorInfo($oAccount); if ($aData && isset($aData['IsSet'], $aData['Enable']) && !empty($aData['Secret']) && $aData['IsSet'] && $aData['Enable']) { $sSecretHash = \md5(APP_SALT.$aData['Secret'].\RainLoop\Utils::Fingerprint()); $sSecretCookieHash = \RainLoop\Utils::GetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, ''); if (empty($sSecretCookieHash) || $sSecretHash !== $sSecretCookieHash) { $sAdditionalCode = \trim($sAdditionalCode); if (empty($sAdditionalCode)) { $this->Logger()->Write('TFA: Required Code for '.$oAccount->ParentEmailHelper().' account.'); throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountTwoFactorAuthRequired); } else { $this->Logger()->Write('TFA: Verify Code for '.$oAccount->ParentEmailHelper().' account.'); $bUseBackupCode = false; if (6 < \strlen($sAdditionalCode) && !empty($aData['BackupCodes'])) { $aBackupCodes = \explode(' ', \trim(\preg_replace('/[^\d]+/', ' ', $aData['BackupCodes']))); $bUseBackupCode = \in_array($sAdditionalCode, $aBackupCodes); if ($bUseBackupCode) { $this->removeBackupCodeFromTwoFactorInfo($oAccount->ParentEmailHelper(), $sAdditionalCode); } } if (!$bUseBackupCode && !$this->TwoFactorAuthProvider()->VerifyCode($aData['Secret'], $sAdditionalCode)) { $this->loginErrorDelay(); $this->LoggerAuthHelper($oAccount); throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountTwoFactorAuthError); } if ($bAdditionalCodeSignMe) { \RainLoop\Utils::SetCookie(self::AUTH_TFA_SIGN_ME_TOKEN_KEY, $sSecretHash, \time() + 60 * 60 * 24 * 14); } } } } } try { $this->CheckMailConnection($oAccount, true); } catch (\Exception $oException) { $this->loginErrorDelay(); throw $oException; } return $oAccount; } /** * @param string $sEmail * * @return string */ private function generateSignMeToken($sEmail) { return \MailSo\Base\Utils::Md5Rand(APP_SALT.$sEmail); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoLogin() { $sEmail = \MailSo\Base\Utils::Trim($this->GetActionParam('Email', '')); $sPassword = $this->GetActionParam('Password', ''); $sLanguage = $this->GetActionParam('Language', ''); $bSignMe = '1' === (string) $this->GetActionParam('SignMe', '0'); $sAdditionalCode = $this->GetActionParam('AdditionalCode', ''); $bAdditionalCodeSignMe = '1' === (string) $this->GetActionParam('AdditionalCodeSignMe', '0'); $oAccount = null; $this->Logger()->AddSecret($sPassword); if ('sleep@sleep.dev' === $sEmail && 0 < \strlen($sPassword) && \is_numeric($sPassword) && $this->Config()->Get('debug', 'enable', false) && 0 < (int) $sPassword && 30 > (int) $sPassword ) { \sleep((int) $sPassword); throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } try { $oAccount = $this->LoginProcess($sEmail, $sPassword, $bSignMe ? $this->generateSignMeToken($sEmail) : '', $sAdditionalCode, $bAdditionalCodeSignMe); } catch (\RainLoop\Exceptions\ClientException $oException) { if ($oException && \RainLoop\Notifications::AccountTwoFactorAuthRequired === $oException->getCode()) { return $this->DefaultResponse(__FUNCTION__, true, array( 'TwoFactorAuth' => true )); } else { throw $oException; } } $this->AuthToken($oAccount); if ($oAccount && 0 < \strlen($sLanguage)) { $oSettings = $this->SettingsProvider()->Load($oAccount); if ($oSettings) { $sLanguage = $this->ValidateLanguage($sLanguage); $sCurrentLanguage = $oSettings->GetConf('Language', ''); if ($sCurrentLanguage !== $sLanguage) { $oSettings->SetConf('Language', $sLanguage); $this->SettingsProvider()->Save($oAccount, $oSettings); } } } return $this->TrueResponse(__FUNCTION__); } /** * @param \RainLoop\Model\Account $oAccount * * @return array */ public function GetAccounts($oAccount) { if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) { $sAccounts = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts' ); $aAccounts = array(); if ('' !== $sAccounts && '{' === \substr($sAccounts, 0, 1)) { $aAccounts = @\json_decode($sAccounts, true); } if (\is_array($aAccounts) && 0 < \count($aAccounts)) { if (1 === \count($aAccounts)) { $this->SetAccounts($oAccount, array()); } else if (1 < \count($aAccounts)) { $sOrder = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts_identities_order' ); $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); if (isset($aOrder['Accounts']) && \is_array($aOrder['Accounts']) && 1 < \count($aOrder['Accounts'])) { $aAccounts = \array_merge(\array_flip($aOrder['Accounts']), $aAccounts); $aAccounts = \array_filter($aAccounts, function ($sHash) { return 5 < \strlen($sHash); }); } } return $aAccounts; } } $aAccounts = array(); if (!$oAccount->IsAdditionalAccount()) { $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); } return $aAccounts; } /** * @param \RainLoop\Model\Account $oAccount * * @return array */ public function GetTemplates($oAccount) { $aTemplates = array(); if ($oAccount) { $aData = array(); $sData = $this->StorageProvider(true)->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'templates' ); if ('' !== $sData && '[' === \substr($sData, 0, 1)) { $aData = @\json_decode($sData, true); } if (\is_array($aData) && 0 < \count($aData)) { foreach ($aData as $aItem) { $oItem = \RainLoop\Model\Template::NewInstance(); $oItem->FromJSON($aItem); if ($oItem && $oItem->Validate()) { \array_push($aTemplates, $oItem); } } } if (1 < \count($aTemplates)) { $sOrder = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'templates_order' ); $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); if (\is_array($aOrder) && 1 < \count($aOrder)) { \usort($aTemplates, function ($a, $b) use ($aOrder) { return \array_search($a->Id(), $aOrder) < \array_search($b->Id(), $aOrder) ? -1 : 1; }); } } } return $aTemplates; } /** * @param \RainLoop\Model\Account $oAccount * @param string $sID * * @return \RainLoop\Model\Identity */ public function GetTemplateByID($oAccount, $sID) { $aTemplates = $this->GetTemplates($oAccount); if (\is_array($aTemplates)) { foreach ($aTemplates as $oIdentity) { if ($oIdentity && $sID === $oIdentity->Id()) { return $oIdentity; } } } return isset($aTemplates[0]) ? $aTemplates[0] : null; } /** * @param \RainLoop\Model\Account $oAccount * * @return array */ public function GetIdentities($oAccount) { $bAllowIdentities = $this->GetCapa(false, false, \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount); $aIdentities = array(); if ($oAccount) { $aSubIdentities = array(); $sData = $this->StorageProvider(true)->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'identities' ); if ('' !== $sData && '[' === \substr($sData, 0, 1)) { $aSubIdentities = @\json_decode($sData, true); } $bHasAccountIdentity = false; if (\is_array($aSubIdentities) && 0 < \count($aSubIdentities)) { foreach ($aSubIdentities as $aItem) { $oItem = \RainLoop\Model\Identity::NewInstance(); $oItem->FromJSON($aItem); if ($oItem && $oItem->Validate()) { if ($oItem->IsAccountIdentities()) { $oItem->SetEmail($oAccount->Email()); $bHasAccountIdentity = true; \array_push($aIdentities, $oItem); } else if ($bAllowIdentities) { \array_push($aIdentities, $oItem); } } } } if (!$bHasAccountIdentity) { \array_unshift($aIdentities, \RainLoop\Model\Identity::NewInstanceFromAccount($oAccount)); } if (1 < \count($aIdentities) && $bAllowIdentities) { $sOrder = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts_identities_order' ); $aOrder = empty($sOrder) ? array() : @\json_decode($sOrder, true); if (isset($aOrder['Identities']) && \is_array($aOrder['Identities']) && 1 < \count($aOrder['Identities'])) { $aList = $aOrder['Identities']; foreach ($aList as $iIndex => $sItem) { if ('' === $sItem) { $aList[$iIndex] = '---'; } } \usort($aIdentities, function ($a, $b) use ($aList) { return \array_search($a->Id(true), $aList) < \array_search($b->Id(true), $aList) ? -1 : 1; }); } } } return $aIdentities; } /** * @param \RainLoop\Model\Account $oAccount * @param string $sID * @param bool $bFirstOnEmpty = false * * @return \RainLoop\Model\Identity */ public function GetIdentityByID($oAccount, $sID, $bFirstOnEmpty = false) { $aIdentities = $this->GetIdentities($oAccount); if (\is_array($aIdentities)) { foreach ($aIdentities as $oIdentity) { if ($oIdentity && $sID === $oIdentity->Id()) { return $oIdentity; } } } return $bFirstOnEmpty && \is_array($aIdentities) && isset($aIdentities[0]) ? $aIdentities[0] : null; } /** * @param \RainLoop\Model\Account $oAccount * * @return \RainLoop\Model\Identity */ public function GetAccountIdentity($oAccount) { return $this->GetIdentityByID($oAccount, '', true); } /** * @param \RainLoop\Model\Account $oAccount * @param array $aAccounts = array() * * @return array */ public function SetAccounts($oAccount, $aAccounts = array()) { $sParentEmail = $oAccount->ParentEmailHelper(); if (!\is_array($aAccounts) || 0 >= \count($aAccounts) || (1 === \count($aAccounts) && !empty($aAccounts[$sParentEmail]))) { $this->StorageProvider()->Clear($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts' ); } else { $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts', @\json_encode($aAccounts) ); } } /** * @param \RainLoop\Model\Account $oAccount * @param array $aIdentities = array() * * @return array */ public function SetIdentities($oAccount, $aIdentities = array()) { $bAllowIdentities = $this->GetCapa(false, false, \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount); $aResult = array(); foreach ($aIdentities as $oItem) { if (!$bAllowIdentities && $oItem && !$oItem->IsAccountIdentities()) { continue; } $aResult[] = $oItem->ToSimpleJSON(false); } return $this->StorageProvider(true)->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'identities', @\json_encode($aResult) ); } /** * @param \RainLoop\Model\Account $oAccount * @param array $aTemplates = array() * * @return array */ public function SetTemplates($oAccount, $aTemplates = array()) { $aResult = array(); foreach ($aTemplates as $oItem) { $aResult[] = $oItem->ToSimpleJSON(false); } return $this->StorageProvider(true)->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'templates', @\json_encode($aResult) ); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoFilters() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FILTERS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $aFakeFilters = null; $this->Plugins() ->RunHook('filter.filters-fake', array($oAccount, &$aFakeFilters)) ; if ($aFakeFilters) { return $this->DefaultResponse(__FUNCTION__, $aFakeFilters); } return $this->DefaultResponse(__FUNCTION__, $this->FiltersProvider()->Load($oAccount, $oAccount->DomainSieveAllowRaw())); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoFiltersSave() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FILTERS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $aIncFilters = $this->GetActionParam('Filters', array()); $sRaw = $this->GetActionParam('Raw', ''); $bRawIsActive = '1' === (string) $this->GetActionParam('RawIsActive', '0'); $aFilters = array(); foreach ($aIncFilters as $aFilter) { if ($aFilter) { $oFilter = new \RainLoop\Providers\Filters\Classes\Filter(); if ($oFilter->FromJSON($aFilter)) { $aFilters[] = $oFilter; } } } $this->Plugins() ->RunHook('filter.filters-save', array($oAccount, &$aFilters, &$sRaw, &$bRawIsActive)) ; return $this->DefaultResponse(__FUNCTION__, $this->FiltersProvider()->Save($oAccount, $aFilters, $sRaw, $bRawIsActive)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoAccountSetup() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sParentEmail = $oAccount->ParentEmailHelper(); $aAccounts = $this->GetAccounts($oAccount); if (!\is_array($aAccounts)) { $aAccounts = array(); } $sEmail = \trim($this->GetActionParam('Email', '')); $sPassword = $this->GetActionParam('Password', ''); $bNew = '1' === (string) $this->GetActionParam('New', '1'); $sEmail = \MailSo\Base\Utils::IdnToAscii($sEmail, true); if ($bNew && ($oAccount->Email() === $sEmail || $sParentEmail === $sEmail || isset($aAccounts[$sEmail]))) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountAlreadyExists); } else if (!$bNew && !isset($aAccounts[$sEmail])) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AccountDoesNotExist); } $oNewAccount = $this->LoginProcess($sEmail, $sPassword, '', '', false, true); $oNewAccount->SetParentEmail($sParentEmail); $aAccounts[$oNewAccount->Email()] = $oNewAccount->GetAuthToken(); if (!$oAccount->IsAdditionalAccount()) { $aAccounts[$oAccount->Email()] = $oAccount->GetAuthToken(); } $this->SetAccounts($oAccount, $aAccounts); return $this->TrueResponse(__FUNCTION__); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoAccountDelete() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sParentEmail = $oAccount->ParentEmailHelper(); $sEmailToDelete = \trim($this->GetActionParam('EmailToDelete', '')); $sEmailToDelete = \MailSo\Base\Utils::IdnToAscii($sEmailToDelete, true); $aAccounts = $this->GetAccounts($oAccount); if (0 < \strlen($sEmailToDelete) && $sEmailToDelete !== $sParentEmail && \is_array($aAccounts) && isset($aAccounts[$sEmailToDelete])) { unset($aAccounts[$sEmailToDelete]); $oAccountToChange = null; if ($oAccount->Email() === $sEmailToDelete && !empty($aAccounts[$sParentEmail])) { $oAccountToChange = $this->GetAccountFromCustomToken($aAccounts[$sParentEmail], false, false); if ($oAccountToChange) { $this->AuthToken($oAccountToChange); } } $this->SetAccounts($oAccount, $aAccounts); return $this->TrueResponse(__FUNCTION__, array('Reload' => !!$oAccountToChange)); } return $this->FalseResponse(__FUNCTION__); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoAttachmentsActions() { if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS)) { return $this->FalseResponse(__FUNCTION__); } $oAccount = $this->initMailClientConnection(); $sAction = $this->GetActionParam('Do', ''); $aHashes = $this->GetActionParam('Hashes', null); $mResult = false; $bError = false; $aData = false; if (\is_array($aHashes) && 0 < \count($aHashes)) { $aData = array(); foreach ($aHashes as $sZipHash) { $aResult = $this->getMimeFileByHash($oAccount, $sZipHash); if (\is_array($aResult) && !empty($aResult['FileHash'])) { $aData[] = $aResult; } else { $bError = true; break; } } } $oFilesProvider = $this->FilesProvider(); if (!empty($sAction) && !$bError && \is_array($aData) && 0 < \count($aData) && $oFilesProvider && $oFilesProvider->IsActive()) { $bError = false; switch (\strtolower($sAction)) { case 'zip': if (\class_exists('ZipArchive')) { $sZipHash = \MailSo\Base\Utils::Md5Rand(); $sZipFileName = $oFilesProvider->GenerateLocalFullFileName($oAccount, $sZipHash); if (!empty($sZipFileName)) { $oZip = new \ZipArchive(); $oZip->open($sZipFileName, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE); $oZip->setArchiveComment('RainLoop/'.APP_VERSION); foreach ($aData as $aItem) { $sFileName = (string) (isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'); $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); if (!empty($sFileHash)) { $sFullFileNameHash = $oFilesProvider->GetFileName($oAccount, $sFileHash); if (!$oZip->addFile($sFullFileNameHash, $sFileName)) { $bError = true; } } } if (!$bError) { $bError = !$oZip->close(); } else { $oZip->close(); } } foreach ($aData as $aItem) { $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); if (!empty($sFileHash)) { $oFilesProvider->Clear($oAccount, $sFileHash); } } if (!$bError) { $mResult = array( 'Files' => array(array( 'FileName' => 'attachments.zip', 'Hash' => \RainLoop\Utils::EncodeKeyValuesQ(array( 'V' => APP_VERSION, 'Account' => $oAccount ? \md5($oAccount->Hash()) : '', 'FileName' => 'attachments.zip', 'MimeType' => 'application/zip', 'FileHash' => $sZipHash )) )) ); } } break; case 'owncloud': $mResult = false; if (\RainLoop\Utils::IsOwnCloudLoggedIn() && \class_exists('OCP\Files')) { $sSaveFolder = $this->Config()->Get('labs', 'owncloud_save_folder', ''); if (empty($sSaveFolder)) { $sSaveFolder = 'Attachments'; } $oFiles = \OCP\Files::getStorage('files'); if ($oFilesProvider && $oFiles && $oFilesProvider->IsActive() && \method_exists($oFiles, 'file_put_contents')) { if (!$oFiles->is_dir($sSaveFolder)) { $oFiles->mkdir($sSaveFolder); } $mResult = true; foreach ($aData as $aItem) { $sSavedFileName = isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat'; $sSavedFileHash = !empty($aItem['FileHash']) ? $aItem['FileHash'] : ''; if (!empty($sSavedFileHash)) { $fFile = $oFilesProvider->GetFile($oAccount, $sSavedFileHash, 'rb'); if (\is_resource($fFile)) { $sSavedFileNameFull = \MailSo\Base\Utils::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, function ($sPath) use ($oFiles) { return $oFiles->file_exists($sPath); }); if (!$oFiles->file_put_contents($sSavedFileNameFull, $fFile)) { $mResult = false; } if (\is_resource($fFile)) { @\fclose($fFile); } } } } } } foreach ($aData as $aItem) { $sFileHash = (string) (isset($aItem['FileHash']) ? $aItem['FileHash'] : ''); if (!empty($sFileHash)) { $oFilesProvider->Clear($oAccount, $sFileHash); } } break; case 'dropbox': $mResult = array( 'ShortLife' => '_'.$this->GetShortLifeSpecAuthToken(), 'Url' => \preg_replace('/\?(.*)$/', '', $this->Http()->GetFullUrl()), 'Files' => array() ); foreach ($aData as $aItem) { $mResult['Files'][] = array( 'FileName' => isset($aItem['FileName']) ? $aItem['FileName'] : 'file.dat', 'Hash' => \RainLoop\Utils::EncodeKeyValuesQ($aItem) ); } break; } } else { $bError = true; } $this->requestSleep(); return $this->DefaultResponse(__FUNCTION__, $bError ? false : $mResult); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoIdentityUpdate() { $oAccount = $this->getAccountFromToken(); $oIdentity = \RainLoop\Model\Identity::NewInstance(); if (!$oIdentity->FromJSON($this->GetActionParams(), true)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); } $aIdentities = $this->GetIdentities($oAccount); $bAdded = false; $aIdentitiesForSave = array(); foreach ($aIdentities as $oItem) { if ($oItem) { if ($oItem->Id() === $oIdentity->Id()) { $aIdentitiesForSave[] = $oIdentity; $bAdded = true; } else { $aIdentitiesForSave[] = $oItem; } } } if (!$bAdded) { $aIdentitiesForSave[] = $oIdentity; } return $this->DefaultResponse(__FUNCTION__, $this->SetIdentities($oAccount, $aIdentitiesForSave)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoIdentityDelete() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::IDENTITIES, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sId = \trim($this->GetActionParam('IdToDelete', '')); if (empty($sId)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); } $aNew = array(); $aIdentities = $this->GetIdentities($oAccount); foreach ($aIdentities as $oItem) { if ($oItem && $sId !== $oItem->Id()) { $aNew[] = $oItem; } } return $this->DefaultResponse(__FUNCTION__, $this->SetIdentities($oAccount, $aNew)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoTemplateSetup() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $oTemplate = \RainLoop\Model\Template::NewInstance(); if (!$oTemplate->FromJSON($this->GetActionParams(), true)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidInputArgument); } if ('' === $oTemplate->Id()) { $oTemplate->GenerateID(); } $aTemplatesForSave = array(); $aTemplates = $this->GetTemplates($oAccount); foreach ($aTemplates as $oItem) { if ($oItem && $oItem->Id() !== $oTemplate->Id()) { $aTemplatesForSave[] = $oItem; } } $aTemplatesForSave[] = $oTemplate; return $this->DefaultResponse(__FUNCTION__, $this->SetTemplates($oAccount, $aTemplatesForSave)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoTemplateDelete() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sId = \trim($this->GetActionParam('IdToDelete', '')); if (empty($sId)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); } $aNew = array(); $aTemplates = $this->GetTemplates($oAccount); foreach ($aTemplates as $oItem) { if ($oItem && $sId !== $oItem->Id()) { $aNew[] = $oItem; } } return $this->DefaultResponse(__FUNCTION__, $this->SetTemplates($oAccount, $aNew)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoTemplateGetByID() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sId = \trim($this->GetActionParam('ID', '')); if (empty($sId)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); } $oTemplate = false; $aTemplates = $this->GetTemplates($oAccount); foreach ($aTemplates as $oItem) { if ($oItem && $sId === $oItem->Id()) { $oTemplate = $oItem; break; } } $oTemplate->SetPopulateAlways(true); return $this->DefaultResponse(__FUNCTION__, $oTemplate); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoAccountsAndIdentitiesSortOrder() { $oAccount = $this->getAccountFromToken(); $aAccounts = $this->GetActionParam('Accounts', null); $aIdentities = $this->GetActionParam('Identities', null); if (!\is_array($aAccounts) && !\is_array($aIdentities)) { return $this->FalseResponse(__FUNCTION__); } return $this->DefaultResponse(__FUNCTION__, $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'accounts_identities_order', \json_encode(array( 'Accounts' => \is_array($aAccounts) ? $aAccounts : array(), 'Identities' => \is_array($aIdentities) ? $aIdentities : array() )) )); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoAccountsAndIdentities() { $oAccount = $this->getAccountFromToken(); $mAccounts = false; if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) { $mAccounts = $this->GetAccounts($oAccount); $mAccounts = \array_keys($mAccounts); foreach ($mAccounts as $iIndex => $sName) { $mAccounts[$iIndex] = \MailSo\Base\Utils::IdnToUtf8($sName); } } return $this->DefaultResponse(__FUNCTION__, array( 'Accounts' => $mAccounts, 'Identities' => $this->GetIdentities($oAccount) )); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoTemplates() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TEMPLATES, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } return $this->DefaultResponse(__FUNCTION__, array( 'Templates' => $this->GetTemplates($oAccount) )); } /** * @param string $sHash * * @return int * * @throws \MailSo\Base\Exceptions\Exception */ public function getAccountUnreadCountFromHash($sHash) { $iResult = 0; $oAccount = $this->GetAccountFromCustomToken($sHash, false); if ($oAccount) { try { $oMailClient = \MailSo\Mail\MailClient::NewInstance(); $oMailClient->SetLogger($this->Logger()); $oAccount->IncConnectAndLoginHelper($this->Plugins(), $oMailClient, $this->Config(), array($this, 'googleRefreshTokenCallback')); $iResult = $oMailClient->InboxUnreadCount(); $oMailClient->LogoutAndDisconnect(); } catch (\Exception $oException) { $this->Logger()->WriteException($oException); } } return $iResult; } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoAccountsCounts() { $oAccount = $this->getAccountFromToken(); $bComplete = true; $aCounts = array(); if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) { $iLimit = 7; $mAccounts = $this->GetAccounts($oAccount); if (\is_array($mAccounts) && 0 < \count($mAccounts)) { if ($iLimit > \count($mAccounts)) { $mAccounts = \array_slice($mAccounts, 0, $iLimit); } else { $bComplete = false; } if (0 < \count($mAccounts)) { foreach ($mAccounts as $sEmail => $sHash) { $aCounts[] = array(\MailSo\Base\Utils::IdnToUtf8($sEmail), $oAccount->Email() === $sEmail ? 0 : $this->getAccountUnreadCountFromHash($sHash)); } } } } else { $aCounts[] = array(\MailSo\Base\Utils::IdnToUtf8($oAccount->Email()), 0); } return $this->DefaultResponse(__FUNCTION__, array( 'Complete' => $bComplete, 'Counts' => $aCounts )); } /** * @param \RainLoop\Model\Account $oAccount */ public function ClearSignMeData($oAccount) { if ($oAccount) { \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); $this->StorageProvider()->Clear($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'sign_me' ); } } /** * @return array */ public function DoLogout() { $oAccount = $this->getAccountFromToken(false); if ($oAccount) { if ($oAccount->SignMe()) { $this->ClearSignMeData($oAccount); } if (!$oAccount->IsAdditionalAccount()) { \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SPEC_TOKEN_KEY); } } return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoAppDelayStart() { $this->Plugins()->RunHook('service.app-delay-start-begin'); \RainLoop\Utils::UpdateConnectionToken(); $bMainCache = false; $bFilesCache = false; $bVersionsCache = false; $iOneDay1 = 60 * 60 * 23; $iOneDay2 = 60 * 60 * 25; $iOneDay3 = 60 * 60 * 30; $sTimers = $this->StorageProvider()->Get(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', ''); $aTimers = \explode(',', $sTimers); $iMainCacheTime = !empty($aTimers[0]) && \is_numeric($aTimers[0]) ? (int) $aTimers[0] : 0; $iFilesCacheTime = !empty($aTimers[1]) && \is_numeric($aTimers[1]) ? (int) $aTimers[1] : 0; $iVersionsCacheTime = !empty($aTimers[2]) && \is_numeric($aTimers[2]) ? (int) $aTimers[2] : 0; if (0 === $iMainCacheTime || $iMainCacheTime + $iOneDay1 < \time()) { $bMainCache = true; $iMainCacheTime = \time(); } if (0 === $iFilesCacheTime || $iFilesCacheTime + $iOneDay2 < \time()) { $bFilesCache = true; $iFilesCacheTime = \time(); } if (0 === $iVersionsCacheTime || $iVersionsCacheTime + $iOneDay3 < \time()) { $bVersionsCache = true; $iVersionsCacheTime = \time(); } if ($bMainCache || $bFilesCache || $bVersionsCache) { if (!$this->StorageProvider()->Put(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', \implode(',', array($iMainCacheTime, $iFilesCacheTime, $iVersionsCacheTime)))) { $bMainCache = $bFilesCache = $bVersionsCache = false; } } if ($bMainCache) { $this->Logger()->Write('Cacher GC: Begin'); $this->Cacher()->GC(48); $this->Logger()->Write('Cacher GC: End'); } else if ($bFilesCache) { $this->Logger()->Write('Files GC: Begin'); $this->FilesProvider()->GC(48); $this->Logger()->Write('Files GC: End'); } else if ($bVersionsCache) { $oPremProvider = $this->PremProvider(); if ($oPremProvider) { $oPremProvider->ClearOldVersion(); } } $this->Plugins()->RunHook('service.app-delay-start-end'); return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoSystemFoldersUpdate() { $oAccount = $this->getAccountFromToken(); $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); $oSettingsLocal->SetConf('SentFolder', $this->GetActionParam('SentFolder', '')); $oSettingsLocal->SetConf('DraftFolder', $this->GetActionParam('DraftFolder', '')); $oSettingsLocal->SetConf('SpamFolder', $this->GetActionParam('SpamFolder', '')); $oSettingsLocal->SetConf('TrashFolder', $this->GetActionParam('TrashFolder', '')); $oSettingsLocal->SetConf('ArchiveFolder', $this->GetActionParam('ArchiveFolder', '')); $oSettingsLocal->SetConf('NullFolder', $this->GetActionParam('NullFolder', '')); return $this->DefaultResponse(__FUNCTION__, $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); } /** * @param \RainLoop\Config\Application $oConfig * @param string $sParamName * @param string $sConfigSector * @param string $sConfigName * @param string $sType = 'string' * @param callable|null $mStringCallback = null */ public function setConfigFromParams(&$oConfig, $sParamName, $sConfigSector, $sConfigName, $sType = 'string', $mStringCallback = null) { $sValue = $this->GetActionParam($sParamName, ''); if ($this->HasActionParam($sParamName)) { switch ($sType) { default: case 'string': $sValue = (string) $sValue; if ($mStringCallback && is_callable($mStringCallback)) { $sValue = call_user_func($mStringCallback, $sValue); } $oConfig->Set($sConfigSector, $sConfigName, (string) $sValue); break; case 'dummy': $sValue = (string) $this->GetActionParam('ContactsPdoPassword', APP_DUMMY); if (APP_DUMMY !== $sValue) { $oConfig->Set($sConfigSector, $sConfigName, (string) $sValue); } break; case 'int': $iValue = (int) $sValue; $oConfig->Set($sConfigSector, $sConfigName, $iValue); break; case 'bool': $oConfig->Set($sConfigSector, $sConfigName, '1' === (string) $sValue); break; } } } /** * @param \RainLoop\Config\Application $oConfig * @param string $sParamName * @param string $sCapa */ private function setCapaFromParams(&$oConfig, $sParamName, $sCapa) { switch ($sCapa) { case \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS: $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_additional_accounts', 'bool'); break; case \RainLoop\Enumerations\Capa::IDENTITIES: $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_additional_identities', 'bool'); break; case \RainLoop\Enumerations\Capa::TEMPLATES: $this->setConfigFromParams($oConfig, $sParamName, 'capa', 'x-templates', 'bool'); break; case \RainLoop\Enumerations\Capa::TWO_FACTOR: $this->setConfigFromParams($oConfig, $sParamName, 'security', 'allow_two_factor_auth', 'bool'); break; case \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE: $this->setConfigFromParams($oConfig, $sParamName, 'security', 'force_two_factor_auth', 'bool'); break; case \RainLoop\Enumerations\Capa::GRAVATAR: $this->setConfigFromParams($oConfig, $sParamName, 'labs', 'allow_gravatar', 'bool'); break; case \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS: $this->setConfigFromParams($oConfig, $sParamName, 'interface', 'show_attachment_thumbnail', 'bool'); break; case \RainLoop\Enumerations\Capa::THEMES: $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_themes', 'bool'); break; case \RainLoop\Enumerations\Capa::USER_BACKGROUND: $this->setConfigFromParams($oConfig, $sParamName, 'webmail', 'allow_user_background', 'bool'); break; case \RainLoop\Enumerations\Capa::OPEN_PGP: $this->setConfigFromParams($oConfig, $sParamName, 'security', 'openpgp', 'bool'); break; } } /** * @param \RainLoop\Settings $oSettings * @param string $sConfigName * @param string $sType = 'string' * @param callable|null $mStringCallback = null */ private function setSettingsFromParams(&$oSettings, $sConfigName, $sType = 'string', $mStringCallback = null) { if ($this->HasActionParam($sConfigName)) { $sValue = $this->GetActionParam($sConfigName, ''); switch ($sType) { default: case 'string': $sValue = (string) $sValue; if ($mStringCallback && is_callable($mStringCallback)) { $sValue = call_user_func($mStringCallback, $sValue); } $oSettings->SetConf($sConfigName, (string) $sValue); break; case 'int': $iValue = (int) $sValue; $oSettings->SetConf($sConfigName, $iValue); break; case 'bool': $oSettings->SetConf($sConfigName, '1' === (string) $sValue); break; } } } /** * @return array */ public function DoAdminSettingsUpdate() { // sleep(3); // return $this->DefaultResponse(__FUNCTION__, false); $this->IsAdminLoggined(); $oConfig = $this->Config(); $self = $this; $this->setConfigFromParams($oConfig, 'Language', 'webmail', 'language', 'string', function ($sLanguage) use ($self) { return $self->ValidateLanguage($sLanguage, '', false); }); $this->setConfigFromParams($oConfig, 'LanguageAdmin', 'webmail', 'language_admin', 'string', function ($sLanguage) use ($self) { return $self->ValidateLanguage($sLanguage, '', true); }); $this->setConfigFromParams($oConfig, 'Theme', 'webmail', 'theme', 'string', function ($sTheme) use ($self) { return $self->ValidateTheme($sTheme); }); $this->setConfigFromParams($oConfig, 'VerifySslCertificate', 'ssl', 'verify_certificate', 'bool'); $this->setConfigFromParams($oConfig, 'AllowSelfSigned', 'ssl', 'allow_self_signed', 'bool'); $this->setConfigFromParams($oConfig, 'UseLocalProxyForExternalImages', 'labs', 'use_local_proxy_for_external_images', 'bool'); $this->setConfigFromParams($oConfig, 'NewMoveToFolder', 'interface', 'new_move_to_folder_button', 'bool'); $this->setConfigFromParams($oConfig, 'AllowLanguagesOnSettings', 'webmail', 'allow_languages_on_settings', 'bool'); $this->setConfigFromParams($oConfig, 'AllowLanguagesOnLogin', 'login', 'allow_languages_on_login', 'bool'); $this->setConfigFromParams($oConfig, 'AttachmentLimit', 'webmail', 'attachment_size_limit', 'int'); $this->setConfigFromParams($oConfig, 'LoginDefaultDomain', 'login', 'default_domain', 'string'); $this->setConfigFromParams($oConfig, 'ContactsEnable', 'contacts', 'enable', 'bool'); $this->setConfigFromParams($oConfig, 'ContactsSync', 'contacts', 'allow_sync', 'bool'); $this->setConfigFromParams($oConfig, 'ContactsPdoDsn', 'contacts', 'pdo_dsn', 'string'); $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); $this->setConfigFromParams($oConfig, 'ContactsPdoPassword', 'contacts', 'pdo_password', 'dummy'); $this->setConfigFromParams($oConfig, 'ContactsPdoType', 'contacts', 'type', 'string', function ($sType) use ($self) { return $self->ValidateContactPdoType($sType); }); $this->setCapaFromParams($oConfig, 'CapaAdditionalAccounts', \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS); $this->setCapaFromParams($oConfig, 'CapaIdentities', \RainLoop\Enumerations\Capa::IDENTITIES); $this->setCapaFromParams($oConfig, 'CapaTemplates', \RainLoop\Enumerations\Capa::TEMPLATES); $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuth', \RainLoop\Enumerations\Capa::TWO_FACTOR); $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuthForce', \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE); $this->setCapaFromParams($oConfig, 'CapaOpenPGP', \RainLoop\Enumerations\Capa::OPEN_PGP); $this->setCapaFromParams($oConfig, 'CapaGravatar', \RainLoop\Enumerations\Capa::GRAVATAR); $this->setCapaFromParams($oConfig, 'CapaThemes', \RainLoop\Enumerations\Capa::THEMES); $this->setCapaFromParams($oConfig, 'CapaUserBackground', \RainLoop\Enumerations\Capa::USER_BACKGROUND); $this->setCapaFromParams($oConfig, 'CapaAttachmentThumbnails', \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS); $this->setConfigFromParams($oConfig, 'DetermineUserLanguage', 'login', 'determine_user_language', 'bool'); $this->setConfigFromParams($oConfig, 'DetermineUserDomain', 'login', 'determine_user_domain', 'bool'); $this->setConfigFromParams($oConfig, 'Title', 'webmail', 'title', 'string'); $this->setConfigFromParams($oConfig, 'LoadingDescription', 'webmail', 'loading_description', 'string'); $this->setConfigFromParams($oConfig, 'FaviconUrl', 'webmail', 'favicon_url', 'string'); $this->setConfigFromParams($oConfig, 'TokenProtection', 'security', 'csrf_protection', 'bool'); $this->setConfigFromParams($oConfig, 'EnabledPlugins', 'plugins', 'enable', 'bool'); $this->setConfigFromParams($oConfig, 'GoogleEnable', 'social', 'google_enable', 'bool'); $this->setConfigFromParams($oConfig, 'GoogleEnableAuth', 'social', 'google_enable_auth', 'bool'); $this->setConfigFromParams($oConfig, 'GoogleEnableAuthGmail', 'social', 'google_enable_auth_gmail', 'bool'); $this->setConfigFromParams($oConfig, 'GoogleEnableDrive', 'social', 'google_enable_drive', 'bool'); $this->setConfigFromParams($oConfig, 'GoogleEnablePreview', 'social', 'google_enable_preview', 'bool'); $this->setConfigFromParams($oConfig, 'GoogleClientID', 'social', 'google_client_id', 'string'); $this->setConfigFromParams($oConfig, 'GoogleClientSecret', 'social', 'google_client_secret', 'string'); $this->setConfigFromParams($oConfig, 'GoogleApiKey', 'social', 'google_api_key', 'string'); $this->setConfigFromParams($oConfig, 'FacebookEnable', 'social', 'fb_enable', 'bool'); $this->setConfigFromParams($oConfig, 'FacebookAppID', 'social', 'fb_app_id', 'string'); $this->setConfigFromParams($oConfig, 'FacebookAppSecret', 'social', 'fb_app_secret', 'string'); $this->setConfigFromParams($oConfig, 'TwitterEnable', 'social', 'twitter_enable', 'bool'); $this->setConfigFromParams($oConfig, 'TwitterConsumerKey', 'social', 'twitter_consumer_key', 'string'); $this->setConfigFromParams($oConfig, 'TwitterConsumerSecret', 'social', 'twitter_consumer_secret', 'string'); $this->setConfigFromParams($oConfig, 'DropboxEnable', 'social', 'dropbox_enable', 'bool'); $this->setConfigFromParams($oConfig, 'DropboxApiKey', 'social', 'dropbox_api_key', 'string'); $oPremProvider = $this->PremProvider(); if ($oPremProvider) { $oPremProvider->PremSection($this, $oConfig); } return $this->DefaultResponse(__FUNCTION__, $oConfig->Save()); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoAdminLogin() { $sLogin = trim($this->GetActionParam('Login', '')); $sPassword = $this->GetActionParam('Password', ''); $this->Logger()->AddSecret($sPassword); if (0 === strlen($sLogin) || 0 === strlen($sPassword) || !$this->Config()->Get('security', 'allow_admin_panel', true) || $sLogin !== $this->Config()->Get('security', 'admin_login', '') || !$this->Config()->ValidatePassword($sPassword)) { $this->loginErrorDelay(); $this->LoggerAuthHelper(null, $this->getAdditionalLogParamsByUserLogin($sLogin, true)); throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError); } $sToken = $this->getAdminToken(); $this->setAdminAuthToken($sToken); return $this->DefaultResponse(__FUNCTION__, $sToken ? true : false); } /** * @return array */ public function DoAdminLogout() { $this->ClearAdminAuthToken(); return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoAdminPing() { $this->IsAdminLoggined(); return $this->DefaultResponse(__FUNCTION__, true); } /** * @return array */ public function DoAdminContactsTest() { $this->IsAdminLoggined(); $oConfig = $this->Config(); $this->setConfigFromParams($oConfig, 'ContactsPdoDsn', 'contacts', 'pdo_dsn', 'string'); $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); $this->setConfigFromParams($oConfig, 'ContactsPdoPassword', 'contacts', 'pdo_password', 'dummy'); $self = $this; $this->setConfigFromParams($oConfig, 'ContactsPdoType', 'contacts', 'type', 'string', function ($sType) use ($self) { return $self->ValidateContactPdoType($sType); }); $sTestMessage = $this->AddressBookProvider(null, true)->Test(); return $this->DefaultResponse(__FUNCTION__, array( 'Result' => '' === $sTestMessage, 'Message' => \MailSo\Base\Utils::Utf8Clear($sTestMessage, '?') )); } /** * @return array */ public function DoAdminLicensing() { $this->IsAdminLoggined(); $bForce = '1' === (string) $this->GetActionParam('Force', '0'); $mResult = false; $iErrorCode = -1; $oPremProvider = $this->PremProvider(); if ($oPremProvider && 2 < \strlen(APP_SITE)) { $sValue = $oPremProvider->Fetcher($bForce); $this->requestSleep(); $iExpired = 0; if ($oPremProvider->Parser($sValue, $iExpired)) { $mResult = array( 'Banned' => false, 'Expired' => $iExpired, ); } else if ($sValue === 'NO' || \preg_match('/^EXPIRED:[\d]+$/', $sValue)) { $iErrorCode = -1; } else if ($sValue === 'TOO_MANY_CONNECTIONS') { $iErrorCode = -1; } else { $iErrorCode = \RainLoop\Notifications::LicensingServerIsUnavailable; } } if (0 < $iErrorCode && !$mResult) { throw new \RainLoop\Exceptions\ClientException($iErrorCode); } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * @return array */ public function DoAdminLicensingActivate() { $this->IsAdminLoggined(); $sDomain = (string) $this->GetActionParam('Domain', ''); $sKey = (string) $this->GetActionParam('Key', ''); $mResult = false; $iErrorCode = -1; $oPrem = $this->PremProvider(); if ($oPrem && 2 < \strlen($sDomain) && 2 < \strlen($sKey) && $sDomain === APP_SITE) { $iCode = 0; $sValue = $oPrem->Activate($sDomain, $sKey, $iCode); $this->requestSleep(); $aMatch = array(); if ('OK' === $sValue) { $mResult = true; } else if ('TOO_MANY_CONNECTIONS' === $sValue) { $mResult = 'Too many connections. Please try again later.'; } else if (\preg_match('/^ERROR:(.+)$/', $sValue, $aMatch) && !empty($aMatch[1])) { $mResult = trim($aMatch[1]); $this->Logger()->Write('Activation error for: '.$sKey.' ('.$sDomain.')', \MailSo\Log\Enumerations\Type::ERROR); $this->Logger()->Write($mResult, \MailSo\Log\Enumerations\Type::ERROR); } else { $iErrorCode = \RainLoop\Notifications::LicensingServerIsUnavailable; } } if (0 < $iErrorCode && !$mResult) { throw new \RainLoop\Exceptions\ClientException($iErrorCode); } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * @return array */ public function DoAdminPasswordUpdate() { $this->IsAdminLoggined(); $bResult = false; $oConfig = $this->Config(); $sLogin = \trim($this->GetActionParam('Login', '')); $sPassword = $this->GetActionParam('Password', ''); $this->Logger()->AddSecret($sPassword); $sNewPassword = $this->GetActionParam('NewPassword', ''); if (0 < \strlen(\trim($sNewPassword))) { $this->Logger()->AddSecret($sNewPassword); } if ($oConfig->ValidatePassword($sPassword)) { if (0 < \strlen($sLogin)) { $oConfig->Set('security', 'admin_login', $sLogin); } if (0 < \strlen(\trim($sNewPassword))) { $oConfig->SetPassword($sNewPassword); } $bResult = true; } return $this->DefaultResponse(__FUNCTION__, $bResult ? ($oConfig->Save() ? array('Weak' => $oConfig->ValidatePassword('12345')) : false) : false); } /** * @return array */ public function DoAdminDomainLoad() { $this->IsAdminLoggined(); return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->Load($this->GetActionParam('Name', ''), false, false)); } /** * @return array */ public function DoAdminDomainList() { $this->IsAdminLoggined(); $iOffset = (int) $this->GetActionParam('Offset', 0); $iLimit = (int) $this->GetActionParam('Limit', 20); $sSearch = (string) $this->GetActionParam('Search', ''); $bIncludeAliases = '1' === (string) $this->GetActionParam('IncludeAliases', '1'); $iOffset = 0; $sSearch = ''; $iLimit = $this->Config()->Get('labs', 'domain_list_limit', 99); return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->GetList($iOffset, $iLimit, $sSearch, $bIncludeAliases)); } /** * @return array */ public function DoAdminDomainDelete() { $this->IsAdminLoggined(); return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->Delete((string) $this->GetActionParam('Name', ''))); } /** * @return array */ public function DoAdminDomainDisable() { $this->IsAdminLoggined(); return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->Disable( (string) $this->GetActionParam('Name', ''), '1' === (string) $this->GetActionParam('Disabled', '0') )); } /** * @return array */ public function DoAdminDomainSave() { $this->IsAdminLoggined(); $oDomain = $this->DomainProvider()->LoadOrCreateNewFromAction($this); return $this->DefaultResponse(__FUNCTION__, $oDomain instanceof \RainLoop\Model\Domain ? $this->DomainProvider()->Save($oDomain) : false); } /** * @return array */ public function DoAdminDomainAliasSave() { $this->IsAdminLoggined(); return $this->DefaultResponse(__FUNCTION__, $this->DomainProvider()->SaveAlias( (string) $this->GetActionParam('Name', ''), (string) $this->GetActionParam('Alias', '') )); } /** * @return array */ public function DoAdminDomainTest() { $this->IsAdminLoggined(); $bImapResult = false; $sImapErrorDesc = ''; $bSmtpResult = false; $sSmtpErrorDesc = ''; $bSieveResult = false; $sSieveErrorDesc = ''; $iImapTime = 0; $iSmtpTime = 0; $iSieveTime = 0; $iConnectionTimeout = 5; $oDomain = $this->DomainProvider()->LoadOrCreateNewFromAction($this, 'domain-test-connection.de'); if ($oDomain) { try { $oImapClient = \MailSo\Imap\ImapClient::NewInstance()->SetLogger($this->Logger()); $oImapClient->SetTimeOuts($iConnectionTimeout); $iTime = \microtime(true); $oImapClient->Connect($oDomain->IncHost(), $oDomain->IncPort(), $oDomain->IncSecure(), !!$this->Config()->Get('ssl', 'verify_certificate', false), !!$this->Config()->Get('ssl', 'allow_self_signed', true), $this->Config()->Get('ssl', 'client_cert', '') ); $iImapTime = \microtime(true) - $iTime; $oImapClient->Disconnect(); $bImapResult = true; } catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); $sImapErrorDesc = $oException->getSocketMessage(); if (empty($sImapErrorDesc)) { $sImapErrorDesc = $oException->getMessage(); } } catch (\Exception $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); $sImapErrorDesc = $oException->getMessage(); } if ($oDomain->OutUsePhpMail()) { $bSmtpResult = \MailSo\Base\Utils::FunctionExistsAndEnabled('mail'); if (!$bSmtpResult) { $sSmtpErrorDesc = 'PHP: mail() function is undefined'; } } else { try { $oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger()); $oSmtpClient->SetTimeOuts($iConnectionTimeout); $iTime = \microtime(true); $oSmtpClient->Connect($oDomain->OutHost(), $oDomain->OutPort(), \MailSo\Smtp\SmtpClient::EhloHelper(), $oDomain->OutSecure(), !!$this->Config()->Get('ssl', 'verify_certificate', false), !!$this->Config()->Get('ssl', 'allow_self_signed', true) ); $iSmtpTime = \microtime(true) - $iTime; $oSmtpClient->Disconnect(); $bSmtpResult = true; } catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); $sSmtpErrorDesc = $oException->getSocketMessage(); if (empty($sSmtpErrorDesc)) { $sSmtpErrorDesc = $oException->getMessage(); } } catch (\Exception $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); $sSmtpErrorDesc = $oException->getMessage(); } } if ($oDomain->UseSieve()) { try { $oSieveClient = \MailSo\Sieve\ManageSieveClient::NewInstance()->SetLogger($this->Logger()); $oSieveClient->SetTimeOuts($iConnectionTimeout); $oSieveClient->__USE_INITIAL_AUTH_PLAIN_COMMAND = !!$this->Config()->Get('labs', 'sieve_auth_plain_initial', true); $iTime = \microtime(true); $oSieveClient->Connect($oDomain->SieveHost(), $oDomain->SievePort(), $oDomain->SieveSecure(), !!$this->Config()->Get('ssl', 'verify_certificate', false), !!$this->Config()->Get('ssl', 'allow_self_signed', true) ); $iSieveTime = \microtime(true) - $iTime; $oSieveClient->Disconnect(); $bSieveResult = true; } catch (\MailSo\Net\Exceptions\SocketCanNotConnectToHostException $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); $sSieveErrorDesc = $oException->getSocketMessage(); if (empty($sSieveErrorDesc)) { $sSieveErrorDesc = $oException->getMessage(); } } catch (\Exception $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); $sSieveErrorDesc = $oException->getMessage(); } } else { $bSieveResult = true; } } return $this->DefaultResponse(__FUNCTION__, array( 'Imap' => $bImapResult ? true : $sImapErrorDesc, 'Smtp' => $bSmtpResult ? true : $sSmtpErrorDesc, 'Sieve' => $bSieveResult ? true : $sSieveErrorDesc )); } /** * @return string */ private function rainLoopRepo() { $sUrl = APP_REPOSITORY_PATH; if ('' !== $sUrl) { $sUrl = rtrim($sUrl, '\\/').'/'; } return $sUrl; } private function rainLoopUpdatable() { return @file_exists(APP_INDEX_ROOT_PATH.'index.php') && @is_writable(APP_INDEX_ROOT_PATH.'index.php') && @is_writable(APP_INDEX_ROOT_PATH.'rainloop/') && APP_VERSION !== APP_DEV_VERSION ; } private function rainLoopCoreAccess() { $sCoreAccess = \strtolower(\preg_replace('/[\s,;]+/', ' ', $this->Config()->Get('security', 'core_install_access_domain', ''))); return '' === $sCoreAccess || '*' === $sCoreAccess || APP_SITE === $sCoreAccess; } /** * @param string $sRepo * @param bool $bReal = false * * @return array */ private function getRepositoryDataByUrl($sRepo, &$bReal = false) { $bReal = false; $aRep = null; $sRep = ''; $sRepoFile = 'repository.json'; $iRepTime = 0; $oHttp = \MailSo\Base\Http::SingletonInstance(); $sCacheKey = \RainLoop\KeyPathHelper::RepositoryCacheFile($sRepo, $sRepoFile); $sRep = $this->Cacher()->Get($sCacheKey); if ('' !== $sRep) { $iRepTime = $this->Cacher()->GetTimer($sCacheKey); } if ('' === $sRep || 0 === $iRepTime || \time() - 3600 > $iRepTime) { $iCode = 0; $sContentType = ''; $sRepPath = $sRepo.$sRepoFile; $sRep = '' !== $sRepo ? $oHttp->GetUrlAsString($sRepPath, 'RainLoop', $sContentType, $iCode, $this->Logger(), 10, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')) : false; if (false !== $sRep) { $aRep = @\json_decode($sRep); $bReal = \is_array($aRep) && 0 < \count($aRep); if ($bReal) { $this->Cacher()->Set($sCacheKey, $sRep); $this->Cacher()->SetTimer($sCacheKey); } } else { $this->Logger()->Write('Cannot read remote repository file: '.$sRepPath, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); } } else if ('' !== $sRep) { $aRep = @\json_decode($sRep, false, 10); $bReal = \is_array($aRep) && 0 < \count($aRep); } $aResult = array(); if (\is_array($aRep)) { foreach ($aRep as $oItem) { if ($oItem && isset($oItem->type, $oItem->id, $oItem->name, $oItem->version, $oItem->release, $oItem->file, $oItem->description)) { if (!empty($oItem->required) && APP_DEV_VERSION !== APP_VERSION && version_compare(APP_VERSION, $oItem->required, '<')) { continue; } if (!empty($oItem->depricated) && APP_DEV_VERSION !== APP_VERSION && version_compare(APP_VERSION, $oItem->depricated, '>=')) { continue; } if ('plugin' === $oItem->type) { $aResult[] = array( 'type' => $oItem->type, 'id' => $oItem->id, 'name' => $oItem->name, 'installed' => '', 'version' => $oItem->version, 'file' => $oItem->file, 'release' => $oItem->release, 'desc' => $oItem->description ); } } } } return $aResult; } /** * @return string */ private function getCoreChannel() { $sChannel = \trim(\strtolower($this->Config()->Get('labs', 'update_channel', 'stable'))); if (empty($sChannel) || !\in_array($sChannel, array('stable', 'beta'))) { $sChannel = 'stable'; } return $sChannel; } private function getCoreData(&$bReal) { $bReal = false; $sChannel = $this->getCoreChannel(); $sRepo = \str_replace('{{channel}}', $sChannel, APP_REPO_CORE_FILE); $oHttp = \MailSo\Base\Http::SingletonInstance(); $sCacheKey = \RainLoop\KeyPathHelper::RepositoryCacheCore($sRepo); $sRep = $this->Cacher()->Get($sCacheKey); if ('' !== $sRep) { $iRepTime = $this->Cacher()->GetTimer($sCacheKey); } if ('' === $sRep || 0 === $iRepTime || \time() - 3600 > $iRepTime) { $iCode = 0; $sContentType = ''; $sRep = '' !== $sRepo ? $oHttp->GetUrlAsString($sRepo, 'RainLoop', $sContentType, $iCode, $this->Logger(), 10, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')) : false; if (false !== $sRep) { $aRep = @\json_decode($sRep, true, 10); $bReal = \is_array($aRep) && 0 < \count($aRep) && isset($aRep['id']) && 'rainloop' === $aRep['id']; if ($bReal) { $this->Cacher()->Set($sCacheKey, $sRep); $this->Cacher()->SetTimer($sCacheKey); } } else { $this->Logger()->Write('Cannot read remote repository file: '.$sRepo, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); } } else if ('' !== $sRep) { $aRep = @\json_decode($sRep, true, 10); $bReal = \is_array($aRep) && 0 < \count($aRep) && isset($aRep['id']) && 'rainloop' === $aRep['id']; } return $bReal ? $aRep : false; } private function getRepositoryData(&$bReal, &$bRainLoopUpdatable) { $bRainLoopUpdatable = $this->rainLoopUpdatable(); $aResult = $this->getRepositoryDataByUrl($this->rainLoopRepo(), $bReal); $aSub = array(); if (\is_array($aResult)) { foreach ($aResult as $aItem) { if ('plugin' === $aItem['type']) { $aSub[] = $aItem; } } $aResult = $aSub; unset($aSub); } $aInstalled = $this->Plugins()->InstalledPlugins(); if (\is_array($aInstalled)) { foreach ($aResult as &$aItem) { if ('plugin' === $aItem['type']) { foreach ($aInstalled as &$aSubItem) { if (\is_array($aSubItem) && isset($aSubItem[0]) && $aSubItem[0] === $aItem['id']) { $aSubItem[2] = true; $aItem['installed'] = $aSubItem[1]; } } } } foreach ($aInstalled as $aSubItemSec) { if ($aSubItemSec && !isset($aSubItemSec[2])) { \array_push($aResult, array( 'type' => 'plugin', 'id' => $aSubItemSec[0], 'name' => $aSubItemSec[0], 'installed' => $aSubItemSec[1], 'version' => '', 'file' => '', 'release' => '', 'desc' => '' )); } } } foreach ($aResult as &$aItem) { $aItem['compare'] = \version_compare($aItem['installed'], $aItem['version'], '<'); $aItem['canBeDeleted'] = '' !== $aItem['installed'] && 'plugin' === $aItem['type']; $aItem['canBeUpdated'] = $aItem['compare']; $aItem['canBeInstalled'] = true; } return $aResult; } /** * @return array */ public function DoAdminPackagesList() { $this->IsAdminLoggined(); $bReal = false; $bRainLoopUpdatable = false; $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); return $this->DefaultResponse(__FUNCTION__, array( 'Real' => $bReal, 'MainUpdatable' => $bRainLoopUpdatable, 'List' => $aList )); } /** * @return array */ public function DoAdminCoreData() { $this->IsAdminLoggined(); $bReal = false; $aData = array(); $bRainLoopUpdatable = $this->rainLoopUpdatable(); $bRainLoopAccess = $this->rainLoopCoreAccess(); if ($bRainLoopAccess) { $aData = $this->getCoreData($bReal); } $sVersion = empty($aData['version']) ? '' : $aData['version']; $sType = empty($aData['channel']) ? 'stable' : $aData['channel']; $sWarnings = empty($aData['warnings']) ? '' : $aData['warnings']; $aWarnings = $sWarnings ? explode('|', $sWarnings) : array(); $sCurrentVersion = APP_VERSION; $bShowWarning = false; if ($sCurrentVersion !== APP_DEV_VERSION) { foreach ($aWarnings as $sWarningVersion) { $sWarningVersion = \trim($sWarningVersion); if (\version_compare($sCurrentVersion, $sWarningVersion, '<') && \version_compare($sVersion, $sWarningVersion, '>=')) { $bShowWarning = true; break; } } } return $this->DefaultResponse(__FUNCTION__, array( 'Real' => $bReal, 'Access' => $bRainLoopAccess, 'Updatable' => $bRainLoopUpdatable, 'Warning' => $bShowWarning, 'Channel' => $this->getCoreChannel(), 'Type' => $sType, 'Version' => $sCurrentVersion, 'RemoteVersion' => $sVersion, 'RemoteRelease' => empty($aData['release']) ? '' : $aData['release'], 'VersionCompare' => \version_compare($sCurrentVersion, $sVersion) )); } /** * @return array */ public function DoAdminUpdateCoreData() { $this->IsAdminLoggined(); $bReal = false; $bRainLoopUpdatable = $this->rainLoopUpdatable(); $bRainLoopAccess = $this->rainLoopCoreAccess(); $oPremProvider = $this->PremProvider(); $aData = array(); if ($bRainLoopUpdatable && $bRainLoopAccess) { $aData = $this->getCoreData($bReal); } $bResult = false; if ($bReal && $oPremProvider && !empty($aData['file'])) { $bResult = $oPremProvider->UpdateCore($this, $aData['file']); } return $this->DefaultResponse(__FUNCTION__, $bResult); } /** * @return array */ public function DoAdminPackageDelete() { $this->IsAdminLoggined(); $sId = $this->GetActionParam('Id', ''); $bReal = false; $bRainLoopUpdatable = false; $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); $sResultId = ''; foreach ($aList as $oItem) { if ($oItem && 'plugin' === $oItem['type'] && $sId === $oItem['id']) { $sResultId = $sId; break; } } $bResult = false; if ('' !== $sResultId) { $bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sResultId); if ($bResult) { $this->pluginEnable($sResultId, false); } } return $this->DefaultResponse(__FUNCTION__, $bResult); } /** * @param string $sUrl * * @return string */ public function downloadRemotePackageByUrl($sUrl) { $bResult = false; $sTmp = APP_PRIVATE_DATA.\md5(\microtime(true).$sUrl).'.zip'; $pDest = @\fopen($sTmp, 'w+b'); if ($pDest) { $iCode = 0; $sContentType = ''; @\set_time_limit(120); $oHttp = \MailSo\Base\Http::SingletonInstance(); $bResult = $oHttp->SaveUrlToFile($sUrl, $pDest, $sTmp, $sContentType, $iCode, $this->Logger(), 60, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')); if (!$bResult) { $this->Logger()->Write('Cannot save url to temp file: ', \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); $this->Logger()->Write($sUrl.' -> '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); } @\fclose($pDest); } else { $this->Logger()->Write('Cannot create temp file: '.$sTmp, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); } return $bResult ? $sTmp : ''; } /** * @return array */ public function DoAdminPackageInstall() { $this->IsAdminLoggined(); $sType = $this->GetActionParam('Type', ''); $sId = $this->GetActionParam('Id', ''); $sFile = $this->GetActionParam('File', ''); $this->Logger()->Write('Start package install: '.$sFile.' ('.$sType.')', \MailSo\Log\Enumerations\Type::INFO, 'INSTALLER'); $sRealFile = ''; $bReal = false; $bRainLoopUpdatable = false; $aList = $this->getRepositoryData($bReal, $bRainLoopUpdatable); if ('plugin' === $sType) { foreach ($aList as $oItem) { if ($oItem && $sFile === $oItem['file'] && $sId === $oItem['id']) { $sRealFile = $sFile; break; } } } $sTmp = ''; $bResult = false; if ('' !== $sRealFile) { $sUrl = $this->rainLoopRepo().$sRealFile; $sTmp = $this->downloadRemotePackageByUrl($sUrl); } if ('' !== $sTmp) { include_once APP_VERSION_ROOT_PATH.'app/libraries/pclzip/pclzip.lib.php'; $oArchive = new \PclZip($sTmp); if ('plugin' === $sType) { $bResult = true; if (\is_dir(APP_PLUGINS_PATH.$sId)) { $bResult = \MailSo\Base\Utils::RecRmDir(APP_PLUGINS_PATH.$sId); if (!$bResult) { $this->Logger()->Write('Cannot remove previous plugin folder: '.$sId, \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); } } if ($bResult) { $bResult = 0 !== $oArchive->extract(PCLZIP_OPT_PATH, APP_PLUGINS_PATH); if (!$bResult) { $this->Logger()->Write('Cannot extract package files: '.$oArchive->errorInfo(), \MailSo\Log\Enumerations\Type::ERROR, 'INSTALLER'); } } } @\unlink($sTmp); } return $this->DefaultResponse(__FUNCTION__, $bResult ? ('plugin' !== $sType ? array('Reload' => true) : true) : false); } /** * @return array */ public function DoAdminPluginList() { $this->IsAdminLoggined(); $aResult = array(); $sEnabledPlugins = $this->Config()->Get('plugins', 'enabled_list', ''); $aEnabledPlugins = \explode(',', \strtolower($sEnabledPlugins)); $aEnabledPlugins = \array_map('trim', $aEnabledPlugins); $aList = $this->Plugins()->InstalledPlugins(); foreach ($aList as $aItem) { $aResult[] = array( 'Name' => $aItem[0], 'Enabled' => \in_array(\strtolower($aItem[0]), $aEnabledPlugins), 'Configured' => false ); } return $this->DefaultResponse(__FUNCTION__, $aResult); } /** * @param string $sName * @param bool $bEnable = true * @return bool */ private function pluginEnable($sName, $bEnable = true) { if (0 === \strlen($sName)) { return false; } $oConfig = $this->Config(); $sEnabledPlugins = $oConfig->Get('plugins', 'enabled_list', ''); $aEnabledPlugins = \explode(',', \strtolower($sEnabledPlugins)); $aEnabledPlugins = \array_map('trim', $aEnabledPlugins); $aNewEnabledPlugins = array(); if ($bEnable) { $aNewEnabledPlugins = $aEnabledPlugins; $aNewEnabledPlugins[] = $sName; } else { foreach ($aEnabledPlugins as $sPlugin) { if ($sName !== $sPlugin && 0 < \strlen($sPlugin)) { $aNewEnabledPlugins[] = $sPlugin; } } } $aNewEnabledPlugins = \array_unique($aNewEnabledPlugins); $oConfig->Set('plugins', 'enabled_list', \trim(\implode(',', $aNewEnabledPlugins), ' ,')); return $oConfig->Save(); } /** * @return array */ public function DoAdminPluginDisable() { $this->IsAdminLoggined(); $sName = (string) $this->GetActionParam('Name', ''); $bDisable = '1' === (string) $this->GetActionParam('Disabled', '1'); if (!$bDisable) { $oPlugin = $this->Plugins()->CreatePluginByName($sName); if ($oPlugin && ($oPlugin instanceof \RainLoop\Plugins\AbstractPlugin)) { $sValue = $oPlugin->Supported(); if (0 < \strlen($sValue)) { return $this->FalseResponse(__FUNCTION__, \RainLoop\Notifications::UnsupportedPluginPackage, $sValue); } } else { return $this->FalseResponse(__FUNCTION__, \RainLoop\Notifications::InvalidPluginPackage); } } return $this->DefaultResponse(__FUNCTION__, $this->pluginEnable($sName, !$bDisable)); } /** * @return array */ public function DoAdminPluginLoad() { $this->IsAdminLoggined(); $mResult = false; $sName = (string) $this->GetActionParam('Name', ''); if (!empty($sName)) { $oPlugin = $this->Plugins()->CreatePluginByName($sName); if ($oPlugin) { $mResult = array( 'Name' => $sName, 'Readme' => file_exists($oPlugin->Path().'/README') ? file_get_contents($oPlugin->Path().'/README') : '', 'Config' => array() ); $aMap = $oPlugin->ConfigMap(); $oConfig = $oPlugin->Config(); if (is_array($aMap) && 0 < count($aMap)) { foreach ($aMap as $oItem) { if ($oItem && ($oItem instanceof \RainLoop\Plugins\Property)) { $aItem = $oItem->ToArray(); $aItem[0] = $oConfig->Get('plugin', $oItem->Name(), ''); if (\RainLoop\Enumerations\PluginPropertyType::PASSWORD === $oItem->Type()) { $aItem[0] = APP_DUMMY; } $mResult['Config'][] = $aItem; } } } } } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * @return array */ public function DoAdminPluginSettingsUpdate() { $this->IsAdminLoggined(); $mResult = false; $sName = (string) $this->GetActionParam('Name', ''); if (!empty($sName)) { $oPlugin = $this->Plugins()->CreatePluginByName($sName); if ($oPlugin) { $oConfig = $oPlugin->Config(); $aMap = $oPlugin->ConfigMap(); if (is_array($aMap) && 0 < count($aMap)) { foreach ($aMap as $oItem) { $sValue = $this->GetActionParam('_'.$oItem->Name(), $oConfig->Get('plugin', $oItem->Name())); if (\RainLoop\Enumerations\PluginPropertyType::PASSWORD !== $oItem->Type() || APP_DUMMY !== $sValue) { $mResultValue = null; switch ($oItem->Type()) { case \RainLoop\Enumerations\PluginPropertyType::INT: $mResultValue = (int) $sValue; break; case \RainLoop\Enumerations\PluginPropertyType::BOOL: $mResultValue = '1' === (string) $sValue; break; case \RainLoop\Enumerations\PluginPropertyType::SELECTION: if (is_array($oItem->DefaultValue()) && in_array($sValue, $oItem->DefaultValue())) { $mResultValue = (string) $sValue; } break; case \RainLoop\Enumerations\PluginPropertyType::PASSWORD: case \RainLoop\Enumerations\PluginPropertyType::STRING: case \RainLoop\Enumerations\PluginPropertyType::STRING_TEXT: $mResultValue = (string) $sValue; break; } if (null !== $mResultValue) { $oConfig->Set('plugin', $oItem->Name(), $mResultValue); } } } } $mResult = $oConfig->Save(); } } if (!$mResult) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSavePluginSettings); } return $this->DefaultResponse(__FUNCTION__, true); } /** * @return array */ public function DoSettingsUpdate() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::SETTINGS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $self = $this; $oConfig = $this->Config(); $oSettings = $this->SettingsProvider()->Load($oAccount); $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) { $this->setSettingsFromParams($oSettings, 'Language', 'string', function ($sLanguage) use ($self) { return $self->ValidateLanguage($sLanguage); }); } else { $oSettings->SetConf('Language', $this->ValidateLanguage($oConfig->Get('webmail', 'language', 'en'))); } if ($this->GetCapa(false, false, \RainLoop\Enumerations\Capa::THEMES, $oAccount)) { $this->setSettingsFromParams($oSettingsLocal, 'Theme', 'string', function ($sTheme) use ($self) { return $self->ValidateTheme($sTheme); }); } else { $oSettingsLocal->SetConf('Theme', $this->ValidateTheme($oConfig->Get('webmail', 'theme', 'Default'))); } $this->setSettingsFromParams($oSettings, 'MPP', 'int', function ($iValue) { return (int) (\in_array($iValue, array(10, 20, 30, 50, 100, 150, 200, 300)) ? $iValue : 20); }); $this->setSettingsFromParams($oSettings, 'Layout', 'int', function ($iValue) { return (int) (\in_array((int) $iValue, array(\RainLoop\Enumerations\Layout::NO_PREVIW, \RainLoop\Enumerations\Layout::SIDE_PREVIEW, \RainLoop\Enumerations\Layout::BOTTOM_PREVIEW)) ? $iValue : \RainLoop\Enumerations\Layout::SIDE_PREVIEW); }); $this->setSettingsFromParams($oSettings, 'EditorDefaultType', 'string'); $this->setSettingsFromParams($oSettings, 'ShowImages', 'bool'); $this->setSettingsFromParams($oSettings, 'ContactsAutosave', 'bool'); $this->setSettingsFromParams($oSettings, 'DesktopNotifications', 'bool'); $this->setSettingsFromParams($oSettings, 'SoundNotification', 'bool'); $this->setSettingsFromParams($oSettings, 'UseCheckboxesInList', 'bool'); $this->setSettingsFromParams($oSettings, 'AllowDraftAutosave', 'bool'); $this->setSettingsFromParams($oSettings, 'AutoLogout', 'int'); $this->setSettingsFromParams($oSettings, 'EnableTwoFactor', 'bool'); $this->setSettingsFromParams($oSettingsLocal, 'UseThreads', 'bool'); $this->setSettingsFromParams($oSettingsLocal, 'ReplySameFolder', 'bool'); return $this->DefaultResponse(__FUNCTION__, $this->SettingsProvider()->Save($oAccount, $oSettings) && $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); } /** * @return array */ public function DoNoop() { $this->initMailClientConnection(); return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoPing() { return $this->DefaultResponse(__FUNCTION__, 'Pong'); } /** * @return array */ public function DoChangePassword() { $mResult = false; $oAccount = $this->getAccountFromToken(); if ($oAccount) { try { $mResult = $this->ChangePasswordProvider()->ChangePassword( $oAccount, $this->GetActionParam('PrevPassword', ''), $this->GetActionParam('NewPassword', '') ); } catch (\Exception $oException) { $this->loginErrorDelay(); $this->Logger()->Write('Error: Can\'t change password for '.$oAccount->Email().' account.', \MailSo\Log\Enumerations\Type::NOTICE); throw $oException; } } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * @return array */ public function DoWelcomeClose() { $oAccount = $this->getAccountFromToken(); if ($oAccount && !$oAccount->IsAdditionalAccount()) { $oSettings = $this->SettingsProvider()->Load($oAccount); $oSettings->SetConf('LastWelcomePage', $this->Config()->Get('branding', 'welcome_page_url', '')); return $this->DefaultResponse(__FUNCTION__, $this->SettingsProvider()->Save($oAccount, $oSettings)); } return $this->FalseResponse(__FUNCTION__); } /** * @return array */ public function DoVersion() { return $this->DefaultResponse(__FUNCTION__, APP_VERSION === (string) $this->GetActionParam('Version', '')); } /** * @param \MailSo\Mail\FolderCollection $oFolders * @return array */ private function recFoldersNames($oFolders) { $aResult = array(); if ($oFolders) { $aFolders =& $oFolders->GetAsArray(); foreach ($aFolders as $oFolder) { $aResult[] = $oFolder->FullNameRaw()."|". implode("|", $oFolder->Flags()).($oFolder->IsSubscribed() ? '1' : '0'); $oSub = $oFolder->SubFolders(); if ($oSub && 0 < $oSub->Count()) { $aResult = \array_merge($aResult, $this->recFoldersNames($oSub)); } } } return $aResult; } /** * @staticvar array $aCache * @param \RainLoop\Model\Account $oAccount * * @return array */ private function systemFoldersNames($oAccount) { static $aCache = null; if (null === $aCache) { $aCache = array( 'Sent' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Send' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Outbox' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Out box' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Sent Item' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Sent Items' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Send Item' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Send Items' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Sent Mail' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Sent Mails' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Send Mail' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Send Mails' => \MailSo\Imap\Enumerations\FolderType::SENT, 'Drafts' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, 'Draft' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, 'Draft Mail' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, 'Draft Mails' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, 'Drafts Mail' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, 'Drafts Mails' => \MailSo\Imap\Enumerations\FolderType::DRAFTS, 'Junk E-mail' => \MailSo\Imap\Enumerations\FolderType::JUNK, 'Spam' => \MailSo\Imap\Enumerations\FolderType::JUNK, 'Spams' => \MailSo\Imap\Enumerations\FolderType::JUNK, 'Junk' => \MailSo\Imap\Enumerations\FolderType::JUNK, 'Bulk Mail' => \MailSo\Imap\Enumerations\FolderType::JUNK, 'Bulk Mails' => \MailSo\Imap\Enumerations\FolderType::JUNK, 'Deleted Items' => \MailSo\Imap\Enumerations\FolderType::TRASH, 'Trash' => \MailSo\Imap\Enumerations\FolderType::TRASH, 'Deleted' => \MailSo\Imap\Enumerations\FolderType::TRASH, 'Bin' => \MailSo\Imap\Enumerations\FolderType::TRASH, 'Archive' => \MailSo\Imap\Enumerations\FolderType::ALL, 'Archives' => \MailSo\Imap\Enumerations\FolderType::ALL, 'All' => \MailSo\Imap\Enumerations\FolderType::ALL, 'All Mail' => \MailSo\Imap\Enumerations\FolderType::ALL, 'All Mails' => \MailSo\Imap\Enumerations\FolderType::ALL, ); $aNewCache = array(); foreach ($aCache as $sKey => $iType) { $aNewCache[$sKey] = $iType; $aNewCache[\str_replace(' ', '', $sKey)] = $iType; } $aCache = $aNewCache; $this->Plugins()->RunHook('filter.system-folders-names', array($oAccount, &$aCache)); } return $aCache; } /** * @param \RainLoop\Model\Account $oAccount * @param \MailSo\Mail\FolderCollection $oFolders * @param array $aResult * @param bool $bListFolderTypes = true */ private function recFoldersTypes($oAccount, $oFolders, &$aResult, $bListFolderTypes = true) { if ($oFolders) { $aFolders =& $oFolders->GetAsArray(); if (\is_array($aFolders) && 0 < \count($aFolders)) { if ($bListFolderTypes) { foreach ($aFolders as $oFolder) { $iFolderListType = $oFolder->GetFolderListType(); if (!isset($aResult[$iFolderListType]) && \in_array($iFolderListType, array( \MailSo\Imap\Enumerations\FolderType::SENT, \MailSo\Imap\Enumerations\FolderType::DRAFTS, \MailSo\Imap\Enumerations\FolderType::JUNK, \MailSo\Imap\Enumerations\FolderType::TRASH, \MailSo\Imap\Enumerations\FolderType::ALL ))) { $aResult[$iFolderListType] = $oFolder->FullNameRaw(); } } foreach ($aFolders as $oFolder) { $oSub = $oFolder->SubFolders(); if ($oSub && 0 < $oSub->Count()) { $this->recFoldersTypes($oAccount, $oSub, $aResult, true); } } } $aMap = $this->systemFoldersNames($oAccount); foreach ($aFolders as $oFolder) { $sName = $oFolder->Name(); $sFullName = $oFolder->FullName(); if (isset($aMap[$sName]) || isset($aMap[$sFullName])) { $iFolderType = isset($aMap[$sName]) ? $aMap[$sName] : $aMap[$sFullName]; if (!isset($aResult[$iFolderType]) && \in_array($iFolderType, array( \MailSo\Imap\Enumerations\FolderType::SENT, \MailSo\Imap\Enumerations\FolderType::DRAFTS, \MailSo\Imap\Enumerations\FolderType::JUNK, \MailSo\Imap\Enumerations\FolderType::TRASH, \MailSo\Imap\Enumerations\FolderType::ALL ))) { $aResult[$iFolderType] = $oFolder->FullNameRaw(); } } } foreach ($aFolders as $oFolder) { $oSub = $oFolder->SubFolders(); if ($oSub && 0 < $oSub->Count()) { $this->recFoldersTypes($oAccount, $oSub, $aResult, false); } } } } } /** * @return array */ public function DoFolders() { $oAccount = $this->initMailClientConnection(); $oFolderCollection = null; $this->Plugins()->RunHook('filter.folders-before', array($oAccount, &$oFolderCollection)); $bUseFolders = $this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount); if (null === $oFolderCollection) { $oFolderCollection = $this->MailClient()->Folders('', $bUseFolders ? '*' : 'INBOX', !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true), (int) $this->Config()->Get('labs', 'imap_folder_list_limit', 200) ); } $this->Plugins()->RunHook('filter.folders-post', array($oAccount, &$oFolderCollection)); if ($oFolderCollection instanceof \MailSo\Mail\FolderCollection) { $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); $aSystemFolders = array(); $this->recFoldersTypes($oAccount, $oFolderCollection, $aSystemFolders); $oFolderCollection->SystemFolders = $aSystemFolders; if ($bUseFolders && $this->Config()->Get('labs', 'autocreate_system_folders', true)) { $bDoItAgain = false; $sNamespace = $oFolderCollection->GetNamespace(); $sParent = empty($sNamespace) ? '' : \substr($sNamespace, 0, -1); $sDelimiter = $oFolderCollection->FindDelimiter(); $aList = array(); $aMap = $this->systemFoldersNames($oAccount); if ('' === $oSettingsLocal->GetConf('SentFolder', '')) { $aList[] = \MailSo\Imap\Enumerations\FolderType::SENT; } if ('' === $oSettingsLocal->GetConf('DraftFolder', '')) { $aList[] = \MailSo\Imap\Enumerations\FolderType::DRAFTS; } if ('' === $oSettingsLocal->GetConf('SpamFolder', '')) { $aList[] = \MailSo\Imap\Enumerations\FolderType::JUNK; } if ('' === $oSettingsLocal->GetConf('TrashFolder', '')) { $aList[] = \MailSo\Imap\Enumerations\FolderType::TRASH; } if ('' === $oSettingsLocal->GetConf('ArchiveFolder', '')) { $aList[] = \MailSo\Imap\Enumerations\FolderType::ALL; } $this->Plugins()->RunHook('filter.folders-system-types', array($oAccount, &$aList)); foreach ($aList as $iType) { if (!isset($aSystemFolders[$iType])) { $mFolderNameToCreate = \array_search($iType, $aMap); if (!empty($mFolderNameToCreate)) { $iPos = \strrpos($mFolderNameToCreate, $sDelimiter); if (false !== $iPos) { $mNewParent = \substr($mFolderNameToCreate, 0, $iPos); $mNewFolderNameToCreate = \substr($mFolderNameToCreate, $iPos + 1); if (0 < \strlen($mNewFolderNameToCreate)) { $mFolderNameToCreate = $mNewFolderNameToCreate; } if (0 < \strlen($mNewParent)) { $sParent = 0 < \strlen($sParent) ? $sParent.$sDelimiter.$mNewParent : $mNewParent; } } $sFullNameToCheck = \MailSo\Base\Utils::ConvertEncoding($mFolderNameToCreate, \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); if (0 < \strlen(\trim($sParent))) { $sFullNameToCheck = $sParent.$sDelimiter.$sFullNameToCheck; } if (!$oFolderCollection->GetByFullNameRaw($sFullNameToCheck)) { try { if ($this->MailClient()->FolderCreate($mFolderNameToCreate, $sParent, true, $sDelimiter)) { $bDoItAgain = true; } } catch (\Exception $oException) { $this->Logger()->WriteException($oException); } } } } } if ($bDoItAgain) { $oFolderCollection = $this->MailClient()->Folders('', '*', !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true), (int) $this->Config()->Get('labs', 'imap_folder_list_limit', 200) ); if ($oFolderCollection) { $aSystemFolders = array(); $this->recFoldersTypes($oAccount, $oFolderCollection, $aSystemFolders); $oFolderCollection->SystemFolders = $aSystemFolders; } } } if ($oFolderCollection) { $oFolderCollection->FoldersHash = \md5(\implode("\x0", $this->recFoldersNames($oFolderCollection))); } } $this->Plugins()->RunHook('filter.folders-complete', array($oAccount, &$oFolderCollection)); return $this->DefaultResponse(__FUNCTION__, $oFolderCollection); } /** * @return array */ public function DoFolderCreate() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } try { $sFolderNameInUtf = $this->GetActionParam('Folder', ''); $sFolderParentFullNameRaw = $this->GetActionParam('Parent', ''); $this->MailClient()->FolderCreate($sFolderNameInUtf, $sFolderParentFullNameRaw, !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantCreateFolder, $oException); } return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoFolderSubscribe() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); $bSubscribe = '1' === (string) $this->GetActionParam('Subscribe', '0'); try { $this->MailClient()->FolderSubscribe($sFolderFullNameRaw, !!$bSubscribe); } catch (\Exception $oException) { if ($bSubscribe) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSubscribeFolder, $oException); } else { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantUnsubscribeFolder, $oException); } } return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoFolderCheckable() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); $bCheckable = '1' === (string) $this->GetActionParam('Checkable', '0'); $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); $sCheckableFolder = $oSettingsLocal->GetConf('CheckableFolder', '[]'); $aCheckableFolder = @\json_decode($sCheckableFolder); if (!\is_array($aCheckableFolder)) { $aCheckableFolder = array(); } if ($bCheckable) { $aCheckableFolder[] = $sFolderFullNameRaw; } else { $aCheckableFolderNew = array(); foreach ($aCheckableFolder as $sFolder) { if ($sFolder !== $sFolderFullNameRaw) { $aCheckableFolderNew[] = $sFolder; } } $aCheckableFolder = $aCheckableFolderNew; } $aCheckableFolder = \array_unique($aCheckableFolder); $oSettingsLocal->SetConf('CheckableFolder', @\json_encode($aCheckableFolder)); return $this->DefaultResponse(__FUNCTION__, $this->SettingsProvider(true)->Save($oAccount, $oSettingsLocal)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoFolderRename() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sPrevFolderFullNameRaw = $this->GetActionParam('Folder', ''); $sNewTopFolderNameInUtf = $this->GetActionParam('NewFolderName', ''); try { $this->MailClient()->FolderRename($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantRenameFolder, $oException); } return $this->TrueResponse(__FUNCTION__); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoFolderDelete() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::FOLDERS, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); try { $this->MailClient()->FolderDelete($sFolderFullNameRaw, !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true)); } catch (\MailSo\Mail\Exceptions\NonEmptyFolder $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteNonEmptyFolder, $oException); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteFolder, $oException); } return $this->TrueResponse(__FUNCTION__); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoFolderClear() { $this->initMailClientConnection(); $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); try { $this->MailClient()->FolderClear($sFolderFullNameRaw); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); } return $this->TrueResponse(__FUNCTION__); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoFolderInformation() { $sFolder = $this->GetActionParam('Folder', ''); $sPrevUidNext = $this->GetActionParam('UidNext', ''); $aFlagsUids = array(); $sFlagsUids = (string) $this->GetActionParam('FlagsUids', ''); $aFlagsFilteredUids = array(); if (0 < strlen($sFlagsUids)) { $aFlagsUids = explode(',', $sFlagsUids); $aFlagsFilteredUids = array_filter($aFlagsUids, function (&$sUid) { $sUid = (int) trim($sUid); return 0 < (int) trim($sUid); }); } $this->initMailClientConnection(); $sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); $sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); try { $aInboxInformation = $this->MailClient()->FolderInformation( $sFolder, $sPrevUidNext, $aFlagsFilteredUids ); if (\is_array($aInboxInformation) && isset($aInboxInformation['Flags']) && \is_array($aInboxInformation['Flags'])) { foreach ($aInboxInformation['Flags'] as $iUid => $aFlags) { $aLowerFlags = array_map('strtolower', $aFlags); $aInboxInformation['Flags'][$iUid] = array( 'IsSeen' => in_array('\\seen', $aLowerFlags), 'IsFlagged' => in_array('\\flagged', $aLowerFlags), 'IsAnswered' => in_array('\\answered', $aLowerFlags), 'IsDeleted' => in_array('\\deleted', $aLowerFlags), 'IsForwarded' => 0 < strlen($sForwardedFlag) && in_array(strtolower($sForwardedFlag), $aLowerFlags), 'IsReadReceipt' => 0 < strlen($sReadReceiptFlag) && in_array(strtolower($sReadReceiptFlag), $aLowerFlags) ); } } } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); } if (\is_array($aInboxInformation)) { $aInboxInformation['Version'] = APP_VERSION; } return $this->DefaultResponse(__FUNCTION__, $aInboxInformation); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoFolderInformationMultiply() { $aResult = array( 'List' => array(), 'Version' => APP_VERSION ); $aFolders = $this->GetActionParam('Folders', null); if (\is_array($aFolders)) { $this->initMailClientConnection(); $aFolders = \array_unique($aFolders); foreach ($aFolders as $sFolder) { if (0 < \strlen(\trim($sFolder)) && 'INBOX' !== \strtoupper($sFolder)) { try { $aInboxInformation = $this->MailClient()->FolderInformation($sFolder, '', array()); if (\is_array($aInboxInformation) && isset($aInboxInformation['Folder'])) { $aResult['List'][] = $aInboxInformation; } } catch (\Exception $oException) { $this->Logger()->WriteException($oException); } } } } return $this->DefaultResponse(__FUNCTION__, $aResult); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoMessageList() { // \sleep(1); // throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); $sFolder = ''; $iOffset = 0; $iLimit = 20; $sSearch = ''; $sUidNext = ''; $bUseThreads = false; $sThreadUid = ''; $sRawKey = $this->GetActionParam('RawKey', ''); $aValues = $this->getDecodedClientRawKeyValue($sRawKey, 9); if (\is_array($aValues) && 7 < \count($aValues)) { $sFolder =(string) $aValues[0]; $iOffset = (int) $aValues[1]; $iLimit = (int) $aValues[2]; $sSearch = (string) $aValues[3]; $sUidNext = (string) $aValues[6]; $bUseThreads = (bool) $aValues[7]; if ($bUseThreads) { $sThreadUid = isset($aValues[8]) ? (string) $aValues[8] : ''; } $this->verifyCacheByKey($sRawKey); } else { $sFolder = $this->GetActionParam('Folder', ''); $iOffset = (int) $this->GetActionParam('Offset', 0); $iLimit = (int) $this->GetActionParam('Limit', 10); $sSearch = $this->GetActionParam('Search', ''); $sUidNext = $this->GetActionParam('UidNext', ''); $bUseThreads = '1' === (string) $this->GetActionParam('UseThreads', '0'); if ($bUseThreads) { $sThreadUid = (string) $this->GetActionParam('ThreadUid', ''); } } if (0 === strlen($sFolder)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList); } $this->initMailClientConnection(); try { if (!$this->Config()->Get('labs', 'use_imap_thread', false)) { $bUseThreads = false; } $oMessageList = $this->MailClient()->MessageList( $sFolder, $iOffset, $iLimit, $sSearch, $sUidNext, $this->cacherForUids(), !!$this->Config()->Get('labs', 'use_imap_sort', false), $bUseThreads, $sThreadUid, '' ); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessageList, $oException); } if ($oMessageList instanceof \MailSo\Mail\MessageCollection) { $this->cacheByKey($sRawKey); } return $this->DefaultResponse(__FUNCTION__, $oMessageList); } /** * @param \RainLoop\Model\Account $oAccount * @param bool $bWithDraftInfo = true * * @return \MailSo\Mime\Message */ private function buildMessage($oAccount, $bWithDraftInfo = true) { $sIdentityID = $this->GetActionParam('IdentityID', ''); $sTo = $this->GetActionParam('To', ''); $sCc = $this->GetActionParam('Cc', ''); $sBcc = $this->GetActionParam('Bcc', ''); $sReplyTo = $this->GetActionParam('ReplyTo', ''); $sSubject = $this->GetActionParam('Subject', ''); $bTextIsHtml = '1' === $this->GetActionParam('TextIsHtml', '0'); $bReadReceiptRequest = '1' === $this->GetActionParam('ReadReceiptRequest', '0'); $bMarkAsImportant = '1' === $this->GetActionParam('MarkAsImportant', '0'); $sText = $this->GetActionParam('Text', ''); $aAttachments = $this->GetActionParam('Attachments', null); $aDraftInfo = $this->GetActionParam('DraftInfo', null); $sInReplyTo = $this->GetActionParam('InReplyTo', ''); $sReferences = $this->GetActionParam('References', ''); $oMessage = \MailSo\Mime\Message::NewInstance(); if (!$this->Config()->Get('security', 'hide_x_mailer_header', false)) { $oMessage->SetXMailer('RainLoop/'.APP_VERSION); } else { $oMessage->DoesNotAddDefaultXMailer(); } $oFromIdentity = $this->GetIdentityByID($oAccount, $sIdentityID); if ($oFromIdentity) { $oMessage->SetFrom(\MailSo\Mime\Email::NewInstance( $oFromIdentity->Email(), $oFromIdentity->Name())); } else { $oMessage->SetFrom(\MailSo\Mime\Email::Parse($oAccount->Email())); } $oFrom = $oMessage->GetFrom(); $oMessage->RegenerateMessageId($oFrom ? $oFrom->GetDomain() : ''); if (!empty($sReplyTo)) { $oReplyTo = \MailSo\Mime\EmailCollection::NewInstance($sReplyTo); if ($oReplyTo && 0 < $oReplyTo->Count()) { $oMessage->SetReplyTo($oReplyTo); } } if ($bReadReceiptRequest) { $oMessage->SetReadReceipt($oAccount->Email()); } if ($bMarkAsImportant) { $oMessage->SetPriority(\MailSo\Mime\Enumerations\MessagePriority::HIGH); } $oMessage->SetSubject($sSubject); $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sTo); if ($oToEmails && $oToEmails->Count()) { $oMessage->SetTo($oToEmails); } $oCcEmails = \MailSo\Mime\EmailCollection::NewInstance($sCc); if ($oCcEmails && $oCcEmails->Count()) { $oMessage->SetCc($oCcEmails); } $oBccEmails = \MailSo\Mime\EmailCollection::NewInstance($sBcc); if ($oBccEmails && $oBccEmails->Count()) { $oMessage->SetBcc($oBccEmails); } if ($bWithDraftInfo && \is_array($aDraftInfo) && !empty($aDraftInfo[0]) && !empty($aDraftInfo[1]) && !empty($aDraftInfo[2])) { $oMessage->SetDraftInfo($aDraftInfo[0], $aDraftInfo[1], $aDraftInfo[2]); } if (0 < \strlen($sInReplyTo)) { $oMessage->SetInReplyTo($sInReplyTo); } if (0 < \strlen($sReferences)) { $oMessage->SetReferences($sReferences); } $aFoundedCids = array(); $mFoundDataURL = array(); $aFoundedContentLocationUrls = array(); $sTextToAdd = $bTextIsHtml ? \MailSo\Base\HtmlUtils::BuildHtml($sText, $aFoundedCids, $mFoundDataURL, $aFoundedContentLocationUrls) : $sText; $this->Plugins()->RunHook($bTextIsHtml ? 'filter.message-html' : 'filter.message-plain', array($oAccount, &$oMessage, &$sTextToAdd)); if ($bTextIsHtml && 0 < \strlen($sTextToAdd)) { $sTextConverted = \MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sTextToAdd); $this->Plugins()->RunHook('filter.message-plain', array($oAccount, &$oMessage, &$sTextConverted)); $oMessage->AddText($sTextConverted, false); } $oMessage->AddText($sTextToAdd, $bTextIsHtml); if (\is_array($aAttachments)) { foreach ($aAttachments as $sTempName => $aData) { $sFileName = (string) $aData[0]; $bIsInline = (bool) $aData[1]; $sCID = (string) $aData[2]; $sContentLocation = isset($aData[3]) ? (string) $aData[3] : ''; $rResource = $this->FilesProvider()->GetFile($oAccount, $sTempName); if (\is_resource($rResource)) { $iFileSize = $this->FilesProvider()->FileSize($oAccount, $sTempName); $oMessage->Attachments()->Add( \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, $bIsInline, \in_array(trim(trim($sCID), '<>'), $aFoundedCids), $sCID, array(), $sContentLocation ) ); } } } if ($mFoundDataURL && \is_array($mFoundDataURL) && 0 < \count($mFoundDataURL)) { foreach ($mFoundDataURL as $sCidHash => $sDataUrlString) { $aMatch = array(); $sCID = '<'.$sCidHash.'>'; if (\preg_match('/^data:(image\/[a-zA-Z0-9]+);base64,(.+)$/i', $sDataUrlString, $aMatch) && !empty($aMatch[1]) && !empty($aMatch[2])) { $sRaw = \MailSo\Base\Utils::Base64Decode($aMatch[2]); $iFileSize = \strlen($sRaw); if (0 < $iFileSize) { $sFileName = \preg_replace('/[^a-z0-9]+/i', '.', $aMatch[1]); $rResource = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($sRaw); $sRaw = ''; unset($sRaw); unset($aMatch); $oMessage->Attachments()->Add( \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, true, true, $sCID) ); } } } } $this->Plugins()->RunHook('filter.build-message', array(&$oMessage)); $this->Plugins()->RunHook('filter.build-message[2]', array(&$oMessage, $oAccount)); return $oMessage; } /** * @param \RainLoop\Model\Account $oAccount * * @return void */ private function deleteMessageAttachmnets($oAccount) { $aAttachments = $this->GetActionParam('Attachments', null); if (\is_array($aAttachments)) { foreach (\array_keys($aAttachments) as $sTempName) { if ($this->FilesProvider()->FileExists($oAccount, $sTempName)) { $this->FilesProvider()->Clear($oAccount, $sTempName); } } } } /** * @param \RainLoop\Model\Account $oAccount * * @return \MailSo\Mime\Message */ private function buildReadReceiptMessage($oAccount) { $sReadReceipt = $this->GetActionParam('ReadReceipt', ''); $sSubject = $this->GetActionParam('Subject', ''); $sText = $this->GetActionParam('Text', ''); $oIdentity = $this->GetAccountIdentity($oAccount); if (empty($sReadReceipt) || empty($sSubject) || empty($sText) || !$oIdentity) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); } $oMessage = \MailSo\Mime\Message::NewInstance(); if (!$this->Config()->Get('security', 'hide_x_mailer_header', false)) { $oMessage->SetXMailer('RainLoop/'.APP_VERSION); } $oMessage->SetFrom(\MailSo\Mime\Email::NewInstance($oIdentity->Email(), $oIdentity->Name())); $oFrom = $oMessage->GetFrom(); $oMessage->RegenerateMessageId($oFrom ? $oFrom->GetDomain() : ''); $sReplyTo = $oIdentity->ReplyTo(); if (!empty($sReplyTo)) { $oReplyTo = \MailSo\Mime\EmailCollection::NewInstance($sReplyTo); if ($oReplyTo && $oReplyTo->Count()) { $oMessage->SetReplyTo($oReplyTo); } } $oMessage->SetSubject($sSubject); $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sReadReceipt); if ($oToEmails && $oToEmails->Count()) { $oMessage->SetTo($oToEmails); } $this->Plugins()->RunHook('filter.read-receipt-message-plain', array($oAccount, &$oMessage, &$sText)); $oMessage->AddText($sText, false); $this->Plugins()->RunHook('filter.build-read-receipt-message', array(&$oMessage, $oAccount)); return $oMessage; } /** * @return array */ public function DoSaveMessage() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sMessageFolder = $this->GetActionParam('MessageFolder', ''); $sMessageUid = $this->GetActionParam('MessageUid', ''); $sDraftFolder = $this->GetActionParam('DraftFolder', ''); if (0 === strlen($sDraftFolder)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); } $oMessage = $this->buildMessage($oAccount, true); $this->Plugins() ->RunHook('filter.save-message', array(&$oMessage)) ->RunHook('filter.save-message[2]', array(&$oMessage, $oAccount)) ; $mResult = false; if ($oMessage) { $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( $oMessage->ToStream(false), array($rMessageStream), 8192, true, true); if (false !== $iMessageStreamSize) { $sMessageId = $oMessage->MessageId(); \rewind($rMessageStream); $iNewUid = 0; $this->MailClient()->MessageAppendStream( $rMessageStream, $iMessageStreamSize, $sDraftFolder, array( \MailSo\Imap\Enumerations\MessageFlag::SEEN ), $iNewUid); if (!empty($sMessageId) && (null === $iNewUid || 0 === $iNewUid)) { $iNewUid = $this->MailClient()->FindMessageUidByMessageId($sDraftFolder, $sMessageId); } $mResult = true; if (0 < strlen($sMessageFolder) && 0 < strlen($sMessageUid)) { $this->MailClient()->MessageDelete($sMessageFolder, array($sMessageUid), true, true); } if (null !== $iNewUid && 0 < $iNewUid) { $mResult = array( 'NewFolder' => $sDraftFolder, 'NewUid' => $iNewUid ); } } } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * * @param \RainLoop\Model\Account $oAccount * @param \MailSo\Mime\Message $oMessage * @param resource $rMessageStream * @param bool $bDsn = false * @param bool $bAddHiddenRcpt = true * * @throws \RainLoop\Exceptions\ClientException * @throws \MailSo\Net\Exceptions\ConnectionException */ private function smtpSendMessage($oAccount, $oMessage, &$rMessageStream, &$iMessageStreamSize, $bDsn = false, $bAddHiddenRcpt = true) { $oRcpt = $oMessage->GetRcpt(); if ($oRcpt && 0 < $oRcpt->Count()) { $this->Plugins()->RunHook('filter.smtp-message-stream', array($oAccount, &$rMessageStream, &$iMessageStreamSize)); $this->Plugins()->RunHook('filter.message-rcpt', array($oAccount, &$oRcpt)); try { $oFrom = $oMessage->GetFrom(); $sFrom = $oFrom instanceof \MailSo\Mime\Email ? $oFrom->GetEmail() : ''; $sFrom = empty($sFrom) ? $oAccount->Email() : $sFrom; $this->Plugins()->RunHook('filter.smtp-from', array($oAccount, $oMessage, &$sFrom)); $aHiddenRcpt = array(); if ($bAddHiddenRcpt) { $this->Plugins()->RunHook('filter.smtp-hidden-rcpt', array($oAccount, $oMessage, &$aHiddenRcpt)); } $bUsePhpMail = $oAccount->Domain()->OutUsePhpMail(); $oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger()); $oSmtpClient->SetTimeOuts(10, (int) \RainLoop\Api::Config()->Get('labs', 'smtp_timeout', 60)); $bLoggined = $oAccount->OutConnectAndLoginHelper( $this->Plugins(), $oSmtpClient, $this->Config(), array($this, 'googleRefreshTokenCallback'), $bUsePhpMail ); if ($bUsePhpMail) { if (\MailSo\Base\Utils::FunctionExistsAndEnabled('mail')) { $aToCollection = $oMessage->GetTo(); if ($aToCollection && $oFrom) { $sRawBody = @\stream_get_contents($rMessageStream); if (!empty($sRawBody)) { $sMailTo = \trim($aToCollection->ToString(true)); $sMailSubject = \trim($oMessage->GetSubject()); $sMailSubject = 0 === \strlen($sMailSubject) ? '' : \MailSo\Base\Utils::EncodeUnencodedValue( \MailSo\Base\Enumerations\Encoding::BASE64_SHORT, $sMailSubject); $sMailHeaders = $sMailBody = ''; list($sMailHeaders, $sMailBody) = \explode("\r\n\r\n", $sRawBody, 2); unset($sRawBody); if ($this->Config()->Get('labs', 'mail_func_clear_headers', true)) { $sMailHeaders = \MailSo\Base\Utils::RemoveHeaderFromHeaders($sMailHeaders, array( \MailSo\Mime\Enumerations\Header::TO_, \MailSo\Mime\Enumerations\Header::SUBJECT )); } if ($this->Config()->Get('debug', 'enable', false)) { $this->Logger()->WriteDump(array( $sMailTo, $sMailSubject, $sMailBody, $sMailHeaders )); } $bR = $this->Config()->Get('labs', 'mail_func_additional_parameters', false) ? \mail($sMailTo, $sMailSubject, $sMailBody, $sMailHeaders, '-f'.$oFrom->GetEmail()) : \mail($sMailTo, $sMailSubject, $sMailBody, $sMailHeaders); if (!$bR) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); } } } } else { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); } } else if ($oSmtpClient->IsConnected()) { if (!empty($sFrom)) { $oSmtpClient->MailFrom($sFrom, '', $bDsn); } $aRcpt =& $oRcpt->GetAsArray(); foreach ($aRcpt as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) { $oSmtpClient->Rcpt($oEmail->GetEmail(), $bDsn); } if ($bAddHiddenRcpt && \is_array($aHiddenRcpt) && 0 < \count($aHiddenRcpt)) { foreach ($aHiddenRcpt as $sEmail) { if (\preg_match('/^[^@\s]+@[^@\s]+$/', $sEmail)) { $oSmtpClient->Rcpt($sEmail); } } } $oSmtpClient->DataWithStream($rMessageStream); if ($bLoggined) { $oSmtpClient->Logout(); } $oSmtpClient->Disconnect(); } } catch (\MailSo\Net\Exceptions\ConnectionException $oException) { if ($this->Config()->Get('labs', 'smtp_show_server_errors')) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ClientViewError, $oException); } else { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); } } catch (\MailSo\Smtp\Exceptions\LoginException $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); } catch (\Exception $oException) { if ($this->Config()->Get('labs', 'smtp_show_server_errors')) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ClientViewError, $oException); } else { throw $oException; } } } else { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidRecipients); } } /** * @return array */ public function DoSendMessage() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $oConfig = $this->Config(); $sDraftFolder = $this->GetActionParam('MessageFolder', ''); $sDraftUid = $this->GetActionParam('MessageUid', ''); $sSentFolder = $this->GetActionParam('SentFolder', ''); $aDraftInfo = $this->GetActionParam('DraftInfo', null); $bDsn = '1' === (string) $this->GetActionParam('Dsn', '0'); $oMessage = $this->buildMessage($oAccount, false); $this->Plugins() ->RunHook('filter.send-message', array(&$oMessage)) ->RunHook('filter.send-message[2]', array(&$oMessage, $oAccount)) ; $mResult = false; try { if ($oMessage) { $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( $oMessage->ToStream(true), array($rMessageStream), 8192, true, true, true); if (false !== $iMessageStreamSize) { $this->smtpSendMessage($oAccount, $oMessage, $rMessageStream, $iMessageStreamSize, $bDsn, true); if (\is_array($aDraftInfo) && 3 === \count($aDraftInfo)) { $sDraftInfoType = $aDraftInfo[0]; $sDraftInfoUid = $aDraftInfo[1]; $sDraftInfoFolder = $aDraftInfo[2]; try { switch (\strtolower($sDraftInfoType)) { case 'reply': case 'reply-all': $this->MailClient()->MessageSetFlag($sDraftInfoFolder, array($sDraftInfoUid), true, \MailSo\Imap\Enumerations\MessageFlag::ANSWERED, true); break; case 'forward': $sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); if (0 < strlen($sForwardedFlag)) { $this->MailClient()->MessageSetFlag($sDraftInfoFolder, array($sDraftInfoUid), true, $sForwardedFlag, true); } break; } } catch (\Exception $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } } if (0 < \strlen($sSentFolder)) { try { if (!$oMessage->GetBcc()) { if (\is_resource($rMessageStream)) { \rewind($rMessageStream); } $this->Plugins()->RunHook('filter.sent-message-stream', array($oAccount, &$rMessageStream, &$iMessageStreamSize)); $this->MailClient()->MessageAppendStream( $rMessageStream, $iMessageStreamSize, $sSentFolder, array( \MailSo\Imap\Enumerations\MessageFlag::SEEN ) ); } else { $rAppendMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $iAppendMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( $oMessage->ToStream(false), array($rAppendMessageStream), 8192, true, true, true); $this->Plugins()->RunHook('filter.sent-message-stream', array($oAccount, &$rAppendMessageStream, &$iAppendMessageStreamSize)); $this->MailClient()->MessageAppendStream( $rAppendMessageStream, $iAppendMessageStreamSize, $sSentFolder, array( \MailSo\Imap\Enumerations\MessageFlag::SEEN )); if (\is_resource($rAppendMessageStream)) { @fclose($rAppendMessageStream); } } } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSaveMessage, $oException); } } if (\is_resource($rMessageStream)) { @\fclose($rMessageStream); } $this->deleteMessageAttachmnets($oAccount); if (0 < \strlen($sDraftFolder) && 0 < \strlen($sDraftUid)) { try { $this->MailClient()->MessageDelete($sDraftFolder, array($sDraftUid), true, true); } catch (\Exception $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } } $mResult = true; } } } catch (\RainLoop\Exceptions\ClientException $oException) { throw $oException; } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage, $oException); } if (false === $mResult) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); } try { if ($oMessage && $this->AddressBookProvider($oAccount)->IsActive()) { $aArrayToFrec = array(); $oToCollection = $oMessage->GetTo(); if ($oToCollection) { $aTo =& $oToCollection->GetAsArray(); foreach ($aTo as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) { $aArrayToFrec[$oEmail->GetEmail(true)] = $oEmail->ToString(false, true); } } if (0 < \count($aArrayToFrec)) { $oSettings = $this->SettingsProvider()->Load($oAccount); $this->AddressBookProvider($oAccount)->IncFrec( $oAccount->ParentEmailHelper(), \array_values($aArrayToFrec), !!$oSettings->GetConf('ContactsAutosave', !!$oConfig->Get('defaults', 'contacts_autosave', true))); } } } catch (\Exception $oException) { $this->Logger()->WriteException($oException); } return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoSendReadReceiptMessage() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::COMPOSER, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $oMessage = $this->buildReadReceiptMessage($oAccount); $this->Plugins()->RunHook('filter.send-read-receipt-message', array(&$oMessage, $oAccount)); $mResult = false; try { if ($oMessage) { $rMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $iMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( $oMessage->ToStream(true), array($rMessageStream), 8192, true, true, true); if (false !== $iMessageStreamSize) { $this->smtpSendMessage($oAccount, $oMessage, $rMessageStream, $iMessageStreamSize, false, false); if (\is_resource($rMessageStream)) { @\fclose($rMessageStream); } $mResult = true; $sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); if (!empty($sReadReceiptFlag)) { $sFolderFullName = $this->GetActionParam('MessageFolder', ''); $sUid = $this->GetActionParam('MessageUid', ''); $this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $sUid), '1'); if (0 < \strlen($sFolderFullName) && 0 < \strlen($sUid)) { try { $this->MailClient()->MessageSetFlag($sFolderFullName, array($sUid), true, $sReadReceiptFlag, true, true); } catch (\Exception $oException) {} } } } } } catch (\RainLoop\Exceptions\ClientException $oException) { throw $oException; } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage, $oException); } if (false === $mResult) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantSendMessage); } return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoQuota() { $oAccount = $this->initMailClientConnection(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::QUOTA, $oAccount)) { return $this->DefaultResponse(__FUNCTION__, array(0, 0, 0, 0)); } try { $aQuota = $this->MailClient()->Quota(); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); } return $this->DefaultResponse(__FUNCTION__, $aQuota); } private function getContactsSyncData($oAccount) { $mResult = null; $sData = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'contacts_sync' ); if (!empty($sData)) { $mData = \RainLoop\Utils::DecodeKeyValues($sData); if (\is_array($mData)) { $mResult = array( 'Enable' => isset($mData['Enable']) ? !!$mData['Enable'] : false, 'Url' => isset($mData['Url']) ? \trim($mData['Url']) : '', 'User' => isset($mData['User']) ? \trim($mData['User']) : '', 'Password' => isset($mData['Password']) ? $mData['Password'] : '' ); } } return $mResult; } /** * @return array */ public function DoSaveContactsSyncData() { $oAccount = $this->getAccountFromToken(); $oAddressBookProvider = $this->AddressBookProvider($oAccount); if (!$oAddressBookProvider || !$oAddressBookProvider->IsActive()) { return $this->FalseResponse(__FUNCTION__); } $bEnabled = '1' === (string) $this->GetActionParam('Enable', '0'); $sUrl = $this->GetActionParam('Url', ''); $sUser = $this->GetActionParam('User', ''); $sPassword = $this->GetActionParam('Password', ''); $mData = $this->getContactsSyncData($oAccount); $bResult = $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'contacts_sync', \RainLoop\Utils::EncodeKeyValues(array( 'Enable' => $bEnabled, 'User' => $sUser, 'Password' => APP_DUMMY === $sPassword && isset($mData['Password']) ? $mData['Password'] : (APP_DUMMY === $sPassword ? '' : $sPassword), 'Url' => $sUrl )) ); return $this->DefaultResponse(__FUNCTION__, $bResult); } /** * @return array */ public function DoContactsSync() { $bResult = false; $oAccount = $this->getAccountFromToken(); $oAddressBookProvider = $this->AddressBookProvider($oAccount); if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) { $mData = $this->getContactsSyncData($oAccount); if (\is_array($mData) && isset($mData['Enable'], $mData['User'], $mData['Password'], $mData['Url']) && $mData['Enable']) { $bResult = $oAddressBookProvider->Sync( $oAccount->ParentEmailHelper(), $mData['Url'], $mData['User'], $mData['Password']); } } if (!$bResult) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ContactsSyncError); } return $this->TrueResponse(__FUNCTION__); } private function getTwoFactorInfo($oAccount, $bRemoveSecret = false) { $sEmail = $oAccount->ParentEmailHelper(); $mData = null; $aResult = array( 'User' => '', 'IsSet' => false, 'Enable' => false, 'Secret' => '', 'UrlTitle' => '', 'BackupCodes' => '' ); if (!empty($sEmail)) { $aResult['User'] = $sEmail; $sData = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'two_factor' ); if ($sData) { $mData = \RainLoop\Utils::DecodeKeyValues($sData); } } if (\is_array($mData) && !empty($aResult['User']) && !empty($mData['User']) && !empty($mData['Secret']) && !empty($mData['BackupCodes']) && $sEmail === $mData['User']) { $aResult['IsSet'] = true; $aResult['Enable'] = isset($mData['Enable']) ? !!$mData['Enable'] : false; $aResult['Secret'] = $mData['Secret']; $aResult['BackupCodes'] = $mData['BackupCodes']; $aResult['UrlTitle'] = $this->Config()->Get('webmail', 'title', ''); } if ($bRemoveSecret) { if (isset($aResult['Secret'])) { unset($aResult['Secret']); } if (isset($aResult['UrlTitle'])) { unset($aResult['UrlTitle']); } if (isset($aResult['BackupCodes'])) { unset($aResult['BackupCodes']); } } return $aResult; } /** * @param \RainLoop\Model\Account $oAccount * @param string $sCode * * @return bool */ private function removeBackupCodeFromTwoFactorInfo($oAccount, $sCode) { if (!$oAccount || empty($sCode)) { return false; } $sData = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'two_factor' ); if ($sData) { $mData = \RainLoop\Utils::DecodeKeyValues($sData); if (!empty($mData['BackupCodes'])) { $sBackupCodes = \preg_replace('/[^\d]+/', ' ', ' '.$mData['BackupCodes'].' '); $sBackupCodes = \str_replace(' '.$sCode.' ', '', $sBackupCodes); $mData['BackupCodes'] = \trim(\preg_replace('/[^\d]+/', ' ', $sBackupCodes)); return $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'two_factor', \RainLoop\Utils::EncodeKeyValues($mData) ); } } return false; } /** * @return array */ public function DoGetTwoFactorInfo() { $oAccount = $this->getAccountFromToken(); if (!$this->TwoFactorAuthProvider()->IsActive() || !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } return $this->DefaultResponse(__FUNCTION__, $this->getTwoFactorInfo($oAccount, true)); } /** * @return array */ public function DoCreateTwoFactorSecret() { $oAccount = $this->getAccountFromToken(); if (!$this->TwoFactorAuthProvider()->IsActive() || !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sEmail = $oAccount->ParentEmailHelper(); $sSecret = $this->TwoFactorAuthProvider()->CreateSecret(); $aCodes = array(); for ($iIndex = 9; $iIndex > 0; $iIndex--) { $aCodes[] = \rand(100000000, 900000000); } $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'two_factor', \RainLoop\Utils::EncodeKeyValues(array( 'User' => $sEmail, 'Enable' => false, 'Secret' => $sSecret, 'BackupCodes' => \implode(' ', $aCodes) )) ); $this->requestSleep(); return $this->DefaultResponse(__FUNCTION__, $this->getTwoFactorInfo($oAccount)); } /** * @return array */ public function DoShowTwoFactorSecret() { $oAccount = $this->getAccountFromToken(); if (!$this->TwoFactorAuthProvider()->IsActive() || !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $aResult = $this->getTwoFactorInfo($oAccount); if (\is_array($aResult)) { unset($aResult['BackupCodes']); } return $this->DefaultResponse(__FUNCTION__, $aResult); } /** * @return array */ public function DoEnableTwoFactor() { $oAccount = $this->getAccountFromToken(); if (!$this->TwoFactorAuthProvider()->IsActive() || !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sEmail = $oAccount->ParentEmailHelper(); $bResult = false; $mData = $this->getTwoFactorInfo($oAccount); if (isset($mData['Secret'], $mData['BackupCodes'])) { $bResult = $this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'two_factor', \RainLoop\Utils::EncodeKeyValues(array( 'User' => $sEmail, 'Enable' => '1' === \trim($this->GetActionParam('Enable', '0')), 'Secret' => $mData['Secret'], 'BackupCodes' => $mData['BackupCodes'] )) ); } return $this->DefaultResponse(__FUNCTION__, $bResult); } /** * @return array */ public function DoTestTwoFactorInfo() { $oAccount = $this->getAccountFromToken(); if (!$this->TwoFactorAuthProvider()->IsActive() || !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sCode = \trim($this->GetActionParam('Code', '')); $aData = $this->getTwoFactorInfo($oAccount); $sSecret = !empty($aData['Secret']) ? $aData['Secret'] : ''; // $this->Logger()->WriteDump(array( // $sCode, $sSecret, $aData, // $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode) // )); $this->requestSleep(); return $this->DefaultResponse(__FUNCTION__, $this->TwoFactorAuthProvider()->VerifyCode($sSecret, $sCode)); } /** * @return array */ public function DoClearTwoFactorInfo() { $oAccount = $this->getAccountFromToken(); if (!$this->TwoFactorAuthProvider()->IsActive() || !$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $this->StorageProvider()->Clear($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'two_factor' ); return $this->DefaultResponse(__FUNCTION__, $this->getTwoFactorInfo($oAccount, true)); } /** * @return array */ public function DoContacts() { $oAccount = $this->getAccountFromToken(); $sSearch = \trim($this->GetActionParam('Search', '')); $iOffset = (int) $this->GetActionParam('Offset', 0); $iLimit = (int) $this->GetActionParam('Limit', 20); $iOffset = 0 > $iOffset ? 0 : $iOffset; $iLimit = 0 > $iLimit ? 20 : $iLimit; $iResultCount = 0; $mResult = array(); $oAbp = $this->AddressBookProvider($oAccount); if ($oAbp->IsActive()) { $iResultCount = 0; $mResult = $oAbp->GetContacts($oAccount->ParentEmailHelper(), $iOffset, $iLimit, $sSearch, $iResultCount); } return $this->DefaultResponse(__FUNCTION__, array( 'Offset' => $iOffset, 'Limit' => $iLimit, 'Count' => $iResultCount, 'Search' => $sSearch, 'List' => $mResult )); } /** * @return array */ public function DoContactsDelete() { $oAccount = $this->getAccountFromToken(); $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); $aFilteredUids = \array_filter($aUids, function (&$mUid) { $mUid = (int) \trim($mUid); return 0 < $mUid; }); $bResult = false; if (0 < \count($aFilteredUids) && $this->AddressBookProvider($oAccount)->IsActive()) { $bResult = $this->AddressBookProvider($oAccount)->DeleteContacts($oAccount->ParentEmailHelper(), $aFilteredUids); } return $this->DefaultResponse(__FUNCTION__, $bResult); } /** * @return array */ public function DoContactSave() { $oAccount = $this->getAccountFromToken(); $bResult = false; $oAddressBookProvider = $this->AddressBookProvider($oAccount); $sRequestUid = \trim($this->GetActionParam('RequestUid', '')); if ($oAddressBookProvider && $oAddressBookProvider->IsActive() && 0 < \strlen($sRequestUid)) { $sUid = \trim($this->GetActionParam('Uid', '')); $oContact = null; if (0 < \strlen($sUid)) { $oContact = $oAddressBookProvider->GetContactByID($oAccount->ParentEmailHelper(), $sUid); } if (!$oContact) { $oContact = new \RainLoop\Providers\AddressBook\Classes\Contact(); if (0 < \strlen($sUid)) { $oContact->IdContact = $sUid; } } $oContact->Properties = array(); $aProperties = $this->GetActionParam('Properties', array()); if (\is_array($aProperties)) { foreach ($aProperties as $aItem) { if ($aItem && isset($aItem[0], $aItem[1]) && \is_numeric($aItem[0])) { $oProp = new \RainLoop\Providers\AddressBook\Classes\Property(); $oProp->Type = (int) $aItem[0]; $oProp->Value = $aItem[1]; $oProp->TypeStr = empty($aItem[2]) ? '': $aItem[2]; $oContact->Properties[] = $oProp; } } } if (!empty($oContact->Etag)) { $oContact->Etag = \md5($oContact->ToVCard()); } $oContact->PopulateDisplayAndFullNameValue(true); $bResult = $oAddressBookProvider->ContactSave($oAccount->ParentEmailHelper(), $oContact); } return $this->DefaultResponse(__FUNCTION__, array( 'RequestUid' => $sRequestUid, 'ResultID' => $bResult ? $oContact->IdContact : '', 'Result' => $bResult )); } /** * @return array */ public function DoSuggestions() { $oAccount = $this->getAccountFromToken(); $sQuery = \trim($this->GetActionParam('Query', '')); $iLimit = (int) $this->Config()->Get('contacts', 'suggestions_limit', 20); $aResult = array(); $this->Plugins()->RunHook('ajax.suggestions-input-parameters', array(&$sQuery, &$iLimit, $oAccount)); $iLimit = (int) $iLimit; if (5 > $iLimit) { $iLimit = 5; } $this->Plugins()->RunHook('ajax.suggestions-pre', array(&$aResult, $sQuery, $oAccount, $iLimit)); if ($iLimit > \count($aResult) && 0 < \strlen($sQuery)) { try { // Address Book $oAddressBookProvider = $this->AddressBookProvider($oAccount); if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) { $aSuggestions = $oAddressBookProvider->GetSuggestions($oAccount->ParentEmailHelper(), $sQuery, $iLimit); if (0 === \count($aResult)) { $aResult = $aSuggestions; } else { $aResult = \array_merge($aResult, $aSuggestions); } } } catch (\Exception $oException) { $this->Logger()->WriteException($oException); } } if ($iLimit > \count($aResult) && 0 < \strlen($sQuery)) { $oSuggestionsProvider = $this->SuggestionsProvider(); if ($oSuggestionsProvider && $oSuggestionsProvider->IsActive()) { $aSuggestionsProviderResult = $oSuggestionsProvider->Process($oAccount, $sQuery, $iLimit); if (\is_array($aSuggestionsProviderResult) && 0 < \count($aSuggestionsProviderResult)) { $aResult = \array_merge($aResult, $aSuggestionsProviderResult); } } } $aResult = \RainLoop\Utils::RemoveSuggestionDuplicates($aResult); if ($iLimit < \count($aResult)) { $aResult = \array_slice($aResult, 0, $iLimit); } $this->Plugins()->RunHook('ajax.suggestions-post', array(&$aResult, $sQuery, $oAccount, $iLimit)); $aResult = \RainLoop\Utils::RemoveSuggestionDuplicates($aResult); if ($iLimit < \count($aResult)) { $aResult = \array_slice($aResult, 0, $iLimit); } return $this->DefaultResponse(__FUNCTION__, $aResult); } /** * @return array */ private function messageSetFlag($sActionFunction, $sResponseFunction) { $this->initMailClientConnection(); $sFolder = $this->GetActionParam('Folder', ''); $bSetAction = '1' === (string) $this->GetActionParam('SetAction', '0'); $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); $aFilteredUids = \array_filter($aUids, function (&$sUid) { $sUid = (int) \trim($sUid); return 0 < $sUid; }); try { $this->MailClient()->{$sActionFunction}($sFolder, $aFilteredUids, true, $bSetAction, true); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); } return $this->TrueResponse($sResponseFunction); } /** * @return array */ public function DoMessageSetSeen() { return $this->messageSetFlag('MessageSetSeen', __FUNCTION__); } /** * @return array */ public function DoMessageSetSeenToAll() { $this->initMailClientConnection(); $sFolder = $this->GetActionParam('Folder', ''); $bSetAction = '1' === (string) $this->GetActionParam('SetAction', '0'); $sThreadUids = \trim($this->GetActionParam('ThreadUids', '')); try { $this->MailClient()->MessageSetSeenToAll($sFolder, $bSetAction, !empty($sThreadUids) ? explode(',', $sThreadUids) : null); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); } return $this->TrueResponse(__FUNCTION__); } /** * @return array */ public function DoMessageSetFlagged() { return $this->messageSetFlag('MessageSetFlagged', __FUNCTION__); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoMessage() { $sRawKey = (string) $this->GetActionParam('RawKey', ''); $sFolder = ''; $iUid = 0; $aValues = $this->getDecodedClientRawKeyValue($sRawKey, 4); if (is_array($aValues) && 4 === count($aValues)) { $sFolder = (string) $aValues[0]; $iUid = (int) $aValues[1]; $this->verifyCacheByKey($sRawKey); } else { $sFolder = $this->GetActionParam('Folder', ''); $iUid = (int) $this->GetActionParam('Uid', 0); } $oAccount = $this->initMailClientConnection(); try { $oMessage = $this->MailClient()->Message($sFolder, $iUid, true, $this->cacherForThreads(), (int) $this->Config()->Get('labs', 'imap_body_text_limit', 0) ); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantGetMessage, $oException); } if ($oMessage instanceof \MailSo\Mail\Message) { $this->Plugins() ->RunHook('filter.result-message', array(&$oMessage)) ->RunHook('filter.result-message[2]', array(&$oMessage, $oAccount)) ; $this->cacheByKey($sRawKey); } return $this->DefaultResponse(__FUNCTION__, $oMessage); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoMessageDelete() { $this->initMailClientConnection(); $sFolder = $this->GetActionParam('Folder', ''); $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); $aFilteredUids = \array_filter($aUids, function (&$sUid) { $sUid = (int) \trim($sUid); return 0 < $sUid; }); try { $this->MailClient()->MessageDelete($sFolder, $aFilteredUids, true, true, !!$this->Config()->Get('labs', 'use_imap_expunge_all_on_delete', false)); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantDeleteMessage, $oException); } if ($this->Config()->Get('labs', 'use_imap_unselect', true)) { try { $this->MailClient()->FolderUnSelect(); } catch (\Exception $oException) { unset($oException); } } $sHash = ''; try { $sHash = $this->MailClient()->FolderHash($sFolder); } catch (\Exception $oException) { unset($oException); } return $this->DefaultResponse(__FUNCTION__, '' === $sHash ? false : array($sFolder, $sHash)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoMessageMove() { $this->initMailClientConnection(); $sFromFolder = $this->GetActionParam('FromFolder', ''); $sToFolder = $this->GetActionParam('ToFolder', ''); $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); $bMarkAsRead = '1' === (string) $this->GetActionParam('MarkAsRead', '0'); $aFilteredUids = \array_filter($aUids, function (&$mUid) { $mUid = (int) \trim($mUid); return 0 < $mUid; }); if ($bMarkAsRead) { try { $this->MailClient()->MessageSetSeen($sFromFolder, $aFilteredUids, true, true); } catch (\Exception $oException) { unset($oException); } } try { $this->MailClient()->MessageMove($sFromFolder, $sToFolder, $aFilteredUids, true, !!$this->Config()->Get('labs', 'use_imap_move', true), !!$this->Config()->Get('labs', 'use_imap_expunge_all_on_delete', false) ); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantMoveMessage, $oException); } if ($this->Config()->Get('labs', 'use_imap_unselect', true)) { try { $this->MailClient()->FolderUnSelect(); } catch (\Exception $oException) { unset($oException); } } $sHash = ''; try { $sHash = $this->MailClient()->FolderHash($sFromFolder); } catch (\Exception $oException) { unset($oException); } return $this->DefaultResponse(__FUNCTION__, '' === $sHash ? false : array($sFromFolder, $sHash)); } /** * @return array * * @throws \MailSo\Base\Exceptions\Exception */ public function DoMessageCopy() { $this->initMailClientConnection(); $sFromFolder = $this->GetActionParam('FromFolder', ''); $sToFolder = $this->GetActionParam('ToFolder', ''); $aUids = \explode(',', (string) $this->GetActionParam('Uids', '')); $aFilteredUids = \array_filter($aUids, function (&$mUid) { $mUid = (int) \trim($mUid); return 0 < $mUid; }); try { $this->MailClient()->MessageCopy($sFromFolder, $sToFolder, $aFilteredUids, true); $sHash = $this->MailClient()->FolderHash($sFromFolder); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CantCopyMessage, $oException); } return $this->DefaultResponse(__FUNCTION__, '' === $sHash ? false : array($sFromFolder, $sHash)); } /** * @param string $sFileName * @param string $sContentType * @param string $sMimeIndex * @param int $iMaxLength = 250 * * @return string */ public function MainClearFileName($sFileName, $sContentType, $sMimeIndex, $iMaxLength = 250) { $sFileName = 0 === \strlen($sFileName) ? \preg_replace('/[^a-zA-Z0-9]/', '.', (empty($sMimeIndex) ? '' : $sMimeIndex.'.').$sContentType) : $sFileName; $sClearedFileName = \MailSo\Base\Utils::StripSpaces(\preg_replace('/[\.]+/', '.', $sFileName)); $sExt = \MailSo\Base\Utils::GetFileExtension($sClearedFileName); if (10 < $iMaxLength && $iMaxLength < \strlen($sClearedFileName) - \strlen($sExt)) { $sClearedFileName = \substr($sClearedFileName, 0, $iMaxLength).(empty($sExt) ? '' : '.'.$sExt); } return \MailSo\Base\Utils::ClearFileName(\MailSo\Base\Utils::Utf8Clear($sClearedFileName)); } /** * @return array */ public function DoMessageUploadAttachments() { $oAccount = $this->initMailClientConnection(); $mResult = false; $self = $this; try { $aAttachments = $this->GetActionParam('Attachments', array()); if (\is_array($aAttachments) && 0 < \count($aAttachments)) { $mResult = array(); foreach ($aAttachments as $sAttachment) { $aValues = \RainLoop\Utils::DecodeKeyValuesQ($sAttachment); if (\is_array($aValues)) { $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; $sTempName = \md5($sAttachment); if (!$this->FilesProvider()->FileExists($oAccount, $sTempName)) { $this->MailClient()->MessageMimeStream( function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oAccount, &$mResult, $sTempName, $sAttachment, $self) { if (is_resource($rResource)) { $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $sFileName = $self->MainClearFileName($sFileName, $sContentType, $sMimeIndex); if ($self->FilesProvider()->PutFile($oAccount, $sTempName, $rResource)) { $mResult[$sTempName] = $sAttachment; } } }, $sFolder, $iUid, true, $sMimeIndex); } else { $mResult[$sTempName] = $sAttachment; } } } } } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::MailServerError, $oException); } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * @return array */ public function DoComposeUploadExternals() { $oAccount = $this->getAccountFromToken(); $mResult = false; $aExternals = $this->GetActionParam('Externals', array()); if (\is_array($aExternals) && 0 < \count($aExternals)) { $oHttp = \MailSo\Base\Http::SingletonInstance(); $mResult = array(); foreach ($aExternals as $sUrl) { $mResult[$sUrl] = ''; $sTempName = \md5($sUrl); $iCode = 0; $sContentType = ''; $rFile = $this->FilesProvider()->GetFile($oAccount, $sTempName, 'wb+'); if ($rFile && $oHttp->SaveUrlToFile($sUrl, $rFile, '', $sContentType, $iCode, $this->Logger(), 60, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', ''))) { $mResult[$sUrl] = $sTempName; } if (\is_resource($rFile)) { @\fclose($rFile); } } } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * @return array */ public function DoComposeUploadDrive() { $oAccount = $this->getAccountFromToken(); $mResult = false; $sUrl = $this->GetActionParam('Url', ''); $sAccessToken = $this->GetActionParam('AccessToken', ''); $sGoogleApiKey = (string) $this->Config()->Get('social', 'google_api_key', ''); if (0 < \strlen($sUrl) && 0 < \strlen($sAccessToken) && 0 < \strlen($sGoogleApiKey)) { $oHttp = \MailSo\Base\Http::SingletonInstance(); $mResult[$sUrl] = false; $sTempName = \md5($sUrl); $iCode = 0; $sContentType = ''; $rFile = $this->FilesProvider()->GetFile($oAccount, $sTempName, 'wb+'); if ($rFile && $oHttp->SaveUrlToFile($sUrl.'&key='.$sGoogleApiKey, $rFile, '', $sContentType, $iCode, $this->Logger(), 60, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', ''), array('Authorization: Bearer '.$sAccessToken))) { $mResult[$sUrl] = array($sTempName, 0); } if (\is_resource($rFile)) { @\fclose($rFile); } if (isset($mResult[$sUrl][1])) { $mResult[$sUrl][1] = $rFile = $this->FilesProvider()->FileSize($oAccount, $sTempName); } } return $this->DefaultResponse(__FUNCTION__, $mResult); } /** * @return array */ public function DoSocialUsers() { $oAccount = $this->getAccountFromToken(); $oSettings = $this->SettingsProvider()->Load($oAccount); $aData = array( 'Google' => '', 'Facebook' => '', 'Twitter' => '' ); if ($oSettings) { $aData['Google'] = $oSettings->GetConf('GoogleSocialName', ''); $aData['Facebook'] = $oSettings->GetConf('FacebookSocialName', ''); $aData['Twitter'] = $oSettings->GetConf('TwitterSocialName', ''); } return $this->DefaultResponse(__FUNCTION__, $aData); } /** * @return array */ public function DoSocialGoogleDisconnect() { $oAccount = $this->getAccountFromToken(); return $this->DefaultResponse(__FUNCTION__, $this->Social()->GoogleDisconnect($oAccount)); } /** * @return array */ public function DoSocialTwitterDisconnect() { $oAccount = $this->getAccountFromToken(); return $this->DefaultResponse(__FUNCTION__, $this->Social()->TwitterDisconnect($oAccount)); } /** * @return array */ public function DoSocialFacebookDisconnect() { $oAccount = $this->getAccountFromToken(); return $this->DefaultResponse(__FUNCTION__, $this->Social()->FacebookDisconnect($oAccount)); } /** * @param int $iError * @param int $iClientError * * @return string */ private function getUploadErrorMessageByCode($iError, &$iClientError) { $sError = ''; $iClientError = UploadClientError::NORMAL; switch($iError) { case UPLOAD_ERR_OK: break; case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: case UploadError::CONFIG_SIZE: case UploadError::EMPTY_FILES_DATA: $sError = 'File is too big'; $iClientError = UploadClientError::FILE_IS_TOO_BIG; break; case UPLOAD_ERR_PARTIAL: $sError = 'File partially uploaded'; $iClientError = UploadClientError::FILE_PARTIALLY_UPLOADED; break; case UPLOAD_ERR_NO_FILE: $sError = 'No file uploaded'; $iClientError = UploadClientError::FILE_NO_UPLOADED; break; case UPLOAD_ERR_NO_TMP_DIR: case UPLOAD_ERR_CANT_WRITE: case UPLOAD_ERR_EXTENSION: $sError = 'Missing temp folder'; $iClientError = UploadClientError::MISSING_TEMP_FOLDER; break; case UploadError::ON_SAVING: $sError = 'Error on saving file'; $iClientError = UploadClientError::FILE_ON_SAVING_ERROR; break; case UploadError::FILE_TYPE: $sError = 'Invalid file type'; $iClientError = UploadClientError::FILE_TYPE; break; case UploadError::UNKNOWN: default: $sError = 'Unknown error'; $iClientError = UploadClientError::UNKNOWN; break; } return $sError; } /** * @return array */ public function Upload() { $oAccount = $this->getAccountFromToken(); $aResponse = array(); $aFile = $this->GetActionParam('File', null); $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) { $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) { $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; } else { $sUploadName = $aFile['name']; $iSize = $aFile['size']; $sMimeType = $aFile['type']; $aResponse['Attachment'] = array( 'Name' => $sUploadName, 'TempName' => $sSavedName, 'MimeType' => $sMimeType, 'Size' => (int) $iSize ); } } if (UPLOAD_ERR_OK !== $iError) { $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); if (!empty($sError)) { $aResponse['ErrorCode'] = $iClientError; $aResponse['Error'] = $sError; } } return $this->DefaultResponse(__FUNCTION__, $aResponse); } /** * @return array */ public function DoClearUserBackground() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $oSettings = $this->SettingsProvider()->Load($oAccount); if ($oAccount && $oSettings) { $this->StorageProvider()->Clear($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'background' ); $oSettings->SetConf('UserBackgroundName', ''); $oSettings->SetConf('UserBackgroundHash', ''); } return $this->DefaultResponse(__FUNCTION__, $oAccount && $oSettings ? $this->SettingsProvider()->Save($oAccount, $oSettings) : false); } /** * @return array */ public function UploadBackground() { $oAccount = $this->getAccountFromToken(); if (!$this->GetCapa(false, false, \RainLoop\Enumerations\Capa::USER_BACKGROUND, $oAccount)) { return $this->FalseResponse(__FUNCTION__); } $sName = ''; $sHash = ''; $aFile = $this->GetActionParam('File', null); $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) { $sMimeType = \strtolower(\MailSo\Base\Utils::MimeContentType($aFile['name'])); if (\in_array($sMimeType, array('image/png', 'image/jpg', 'image/jpeg'))) { $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) { $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; } else { $rData = $this->FilesProvider()->GetFile($oAccount, $sSavedName); if (@\is_resource($rData)) { $sData = @\stream_get_contents($rData); if (!empty($sData) && 0 < \strlen($sData)) { $sName = $aFile['name']; if (empty($sName)) { $sName = '_'; } if ($this->StorageProvider()->Put($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'background', \json_encode(array( 'Name' => $aFile['name'], 'ContentType' => $sMimeType, 'Raw' => \base64_encode($sData) )) )) { $oSettings = $this->SettingsProvider()->Load($oAccount); if ($oSettings) { $sHash = \MailSo\Base\Utils::Md5Rand($sName.APP_VERSION.APP_SALT); $oSettings->SetConf('UserBackgroundName', $sName); $oSettings->SetConf('UserBackgroundHash', $sHash); $this->SettingsProvider()->Save($oAccount, $oSettings); } } } unset($sData); } if (@\is_resource($rData)) { @\fclose($rData); } unset($rData); } $this->FilesProvider()->Clear($oAccount, $sSavedName); } else { $iError = \RainLoop\Enumerations\UploadError::FILE_TYPE; } } if (UPLOAD_ERR_OK !== $iError) { $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); if (!empty($sError)) { return $this->FalseResponse(__FUNCTION__, $iClientError, $sError); } } return $this->DefaultResponse(__FUNCTION__, !empty($sName) && !empty($sHash) ? array( 'Name' => $sName, 'Hash' => $sHash ) : false); } /** * @return array */ public function UploadContacts() { $oAccount = $this->getAccountFromToken(); $mResponse = false; $aFile = $this->GetActionParam('File', null); $iError = $this->GetActionParam('Error', \RainLoop\Enumerations\UploadError::UNKNOWN); if ($oAccount && UPLOAD_ERR_OK === $iError && \is_array($aFile)) { $sSavedName = 'upload-post-'.\md5($aFile['name'].$aFile['tmp_name']); if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $aFile['tmp_name'])) { $iError = \RainLoop\Enumerations\UploadError::ON_SAVING; } else { @\ini_set('auto_detect_line_endings', true); $mData = $this->FilesProvider()->GetFile($oAccount, $sSavedName); if ($mData) { $sFileStart = @\fread($mData, 20); \rewind($mData); if (false !== $sFileStart) { $sFileStart = \trim($sFileStart); if (false !== \strpos($sFileStart, 'BEGIN:VCARD')) { $mResponse = $this->importContactsFromVcfFile($oAccount, $mData); } else if (false !== \strpos($sFileStart, ',') || false !== \strpos($sFileStart, ';')) { $mResponse = $this->importContactsFromCsvFile($oAccount, $mData, $sFileStart); } } } if (\is_resource($mData)) { @\fclose($mData); } unset($mData); $this->FilesProvider()->Clear($oAccount, $sSavedName); @\ini_set('auto_detect_line_endings', false); } } if (UPLOAD_ERR_OK !== $iError) { $iClientError = \RainLoop\Enumerations\UploadClientError::NORMAL; $sError = $this->getUploadErrorMessageByCode($iError, $iClientError); if (!empty($sError)) { return $this->FalseResponse(__FUNCTION__, $iClientError, $sError); } } return $this->DefaultResponse(__FUNCTION__, $mResponse); } /** * @param \RainLoop\Model\Account $oAccount * @param resource $rFile * @param string $sFileStart * * @return int */ private function importContactsFromCsvFile($oAccount, $rFile, $sFileStart) { $iCount = 0; $aHeaders = null; $aData = array(); if ($oAccount && \is_resource($rFile)) { $oAddressBookProvider = $this->AddressBookProvider($oAccount); if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) { $sDelimiter = ((int) \strpos($sFileStart, ',') > (int) \strpos($sFileStart, ';')) ? ',' : ';'; @\setlocale(LC_CTYPE, 'en_US.UTF-8'); while (false !== ($mRow = \fgetcsv($rFile, 5000, $sDelimiter, '"'))) { if (null === $aHeaders) { if (3 >= \count($mRow)) { return 0; } $aHeaders = $mRow; foreach ($aHeaders as $iIndex => $sHeaderValue) { $aHeaders[$iIndex] = \MailSo\Base\Utils::Utf8Clear($sHeaderValue); } } else { $aNewItem = array(); foreach ($aHeaders as $iIndex => $sHeaderValue) { $aNewItem[$sHeaderValue] = isset($mRow[$iIndex]) ? $mRow[$iIndex] : ''; } $aData[] = $aNewItem; } } if (\is_array($aData) && 0 < \count($aData)) { $this->Logger()->Write('Import contacts from csv'); $iCount = $oAddressBookProvider->ImportCsvArray($oAccount->ParentEmailHelper(), $aData); } } } return $iCount; } /** * @param \RainLoop\Model\Account $oAccount * @param resource $rFile * * @return int */ private function importContactsFromVcfFile($oAccount, $rFile) { $iCount = 0; if ($oAccount && \is_resource($rFile)) { $oAddressBookProvider = $this->AddressBookProvider($oAccount); if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) { $sFile = \stream_get_contents($rFile); if (\is_resource($rFile)) { \fclose($rFile); } if (is_string($sFile) && 5 < \strlen($sFile)) { $this->Logger()->Write('Import contacts from vcf'); $iCount = $oAddressBookProvider->ImportVcfFile($oAccount->ParentEmailHelper(), $sFile); } } } return $iCount; } /** * @return bool * * @throws \MailSo\Base\Exceptions\Exception */ public function RawViewAsPlain() { $this->initMailClientConnection(); $sRawKey = (string) $this->GetActionParam('RawKey', ''); $aValues = $this->getDecodedRawKeyValue($sRawKey); $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; $iUid = (int) (isset($aValues['Uid']) ? $aValues['Uid'] : 0); $sMimeIndex = (string) (isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''); \header('Content-Type: text/plain', true); return $this->MailClient()->MessageMimeStream(function ($rResource) { if (\is_resource($rResource)) { \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); } }, $sFolder, $iUid, true, $sMimeIndex); } /** * @return string */ public function RawFramedView() { $oAccount = $this->getAccountFromToken(false); if ($oAccount) { $sRawKey = (string) $this->GetActionParam('RawKey', ''); $aParams = $this->GetActionParam('Params', null); $this->Http()->ServerNoCache(); $aData = \RainLoop\Utils::DecodeKeyValuesQ($sRawKey); if (isset($aParams[0], $aParams[1], $aParams[2]) && 'Raw' === $aParams[0] && 'FramedView' === $aParams[2] && isset($aData['Framed']) && $aData['Framed'] && $aData['FileName']) { if ($this->isFileHasFramedPreview($aData['FileName'])) { $sNewSpecAuthToken = $this->GetShortLifeSpecAuthToken(); if (!empty($sNewSpecAuthToken)) { $aParams[1] = '_'.$sNewSpecAuthToken; $aParams[2] = 'View'; \array_shift($aParams); $sLast = \array_pop($aParams); $sUrl = $this->Http()->GetFullUrl().'?/Raw/&q[]=/'.\implode('/', $aParams).'/&q[]=/'.$sLast; $sFullUrl = 'https://docs.google.com/viewer?embedded=true&url='.\urlencode($sUrl); @\header('Content-Type: text/html; charset=utf-8'); echo ''. ''. ''. ''; } } } } return true; } /** * @return bool * * @throws \MailSo\Base\Exceptions\Exception */ public function Append() { $oAccount = $this->initMailClientConnection(); $sFolderFullNameRaw = $this->GetActionParam('Folder', ''); $_FILES = isset($_FILES) ? $_FILES : null; if ($oAccount instanceof \RainLoop\Model\Account && $this->Config()->Get('labs', 'allow_message_append', false) && isset($_FILES, $_FILES['AppendFile'], $_FILES['AppendFile']['name'], $_FILES['AppendFile']['tmp_name'], $_FILES['AppendFile']['size'])) { if (is_string($_FILES['AppendFile']['tmp_name']) && 0 < strlen($_FILES['AppendFile']['tmp_name'])) { if (\UPLOAD_ERR_OK === (int) $_FILES['AppendFile']['error'] && !empty($sFolderFullNameRaw)) { $sSavedName = 'append-post-'.md5($sFolderFullNameRaw.$_FILES['AppendFile']['name'].$_FILES['AppendFile']['tmp_name']); if ($this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $_FILES['AppendFile']['tmp_name'])) { $iMessageStreamSize = $this->FilesProvider()->FileSize($oAccount, $sSavedName); $rMessageStream = $this->FilesProvider()->GetFile($oAccount, $sSavedName); $this->MailClient()->MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderFullNameRaw); $this->FilesProvider()->Clear($oAccount, $sSavedName); } } } } return $this->DefaultResponse(__FUNCTION__, true); } /** * @param bool $bAdmin * @param bool $bMobile = false * @param \RainLoop\Model\Account $oAccount = null * * @return array */ public function Capa($bAdmin, $bMobile = false, $oAccount = null) { $oConfig = $this->Config(); $aResult = array(); if ($oConfig->Get('capa', 'folders', true)) { $aResult[] = \RainLoop\Enumerations\Capa::FOLDERS; if ($oConfig->Get('capa', 'messagelist_actions', true)) { $aResult[] = \RainLoop\Enumerations\Capa::MESSAGELIST_ACTIONS; if ($oConfig->Get('capa', 'dangerous_actions', true)) { $aResult[] = \RainLoop\Enumerations\Capa::DANGEROUS_ACTIONS; } } } if ($oConfig->Get('capa', 'reload', true)) { $aResult[] = \RainLoop\Enumerations\Capa::RELOAD; } if ($oConfig->Get('capa', 'quota', true)) { $aResult[] = \RainLoop\Enumerations\Capa::QUOTA; } if ($oConfig->Get('capa', 'settings', true)) { $aResult[] = \RainLoop\Enumerations\Capa::SETTINGS; if ($oConfig->Get('webmail', 'allow_additional_accounts', false)) { $aResult[] = \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS; } if ($oConfig->Get('webmail', 'allow_additional_identities', false)) { $aResult[] = \RainLoop\Enumerations\Capa::IDENTITIES; } if ($oConfig->Get('capa', 'x-templates', true) && !$bMobile) { $aResult[] = \RainLoop\Enumerations\Capa::TEMPLATES; } if ($oConfig->Get('webmail', 'allow_themes', false) && !$bMobile) { $aResult[] = \RainLoop\Enumerations\Capa::THEMES; } if ($oConfig->Get('webmail', 'allow_user_background', false) && !$bMobile) { $aResult[] = \RainLoop\Enumerations\Capa::USER_BACKGROUND; } if ($oConfig->Get('security', 'openpgp', false) && !$bMobile) { $aResult[] = \RainLoop\Enumerations\Capa::OPEN_PGP; } if ($oConfig->Get('capa', 'filters', false)) { $aResult[] = \RainLoop\Enumerations\Capa::FILTERS; if ($bAdmin || ($oAccount && $oAccount->Domain()->UseSieve())) { $aResult[] = \RainLoop\Enumerations\Capa::SIEVE; } } } if ($oConfig->Get('security', 'allow_two_factor_auth', false) && ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) { $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR; if ($oConfig->Get('security', 'force_two_factor_auth', false) && ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) { $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE; } } if ($oConfig->Get('capa', 'help', true) && !$bMobile) { $aResult[] = \RainLoop\Enumerations\Capa::HELP; } if ($oConfig->Get('capa', 'attachments_actions', false)) { $aResult[] = \RainLoop\Enumerations\Capa::ATTACHMENTS_ACTIONS; } if ($oConfig->Get('capa', 'message_actions', true)) { $aResult[] = \RainLoop\Enumerations\Capa::MESSAGE_ACTIONS; } if ($oConfig->Get('capa', 'composer', true)) { $aResult[] = \RainLoop\Enumerations\Capa::COMPOSER; if ($oConfig->Get('capa', 'contacts', true)) { $aResult[] = \RainLoop\Enumerations\Capa::CONTACTS; } } if ($oConfig->Get('capa', 'search', true)) { $aResult[] = \RainLoop\Enumerations\Capa::SEARCH; if ($oConfig->Get('capa', 'search_adv', true) && !$bMobile) { $aResult[] = \RainLoop\Enumerations\Capa::SEARCH_ADV; } } if ($oConfig->Get('labs', 'allow_gravatar', false)) { $aResult[] = \RainLoop\Enumerations\Capa::GRAVATAR; } if ($oConfig->Get('interface', 'show_attachment_thumbnail', true)) { $aResult[] = \RainLoop\Enumerations\Capa::ATTACHMENT_THUMBNAILS; } if ($oConfig->Get('labs', 'allow_prefetch', false) && !$bMobile) { $aResult[] = \RainLoop\Enumerations\Capa::PREFETCH; } if (!\RainLoop\Utils::IsOwnCloud()) { $aResult[] = \RainLoop\Enumerations\Capa::AUTOLOGOUT; } return $aResult; } /** * @param bool $bAdmin * @param bool $bMobile * @param string $sName * @param \RainLoop\Model\Account $oAccount = null * * @return bool */ public function GetCapa($bAdmin, $bMobile, $sName, $oAccount = null) { return \in_array($sName, $this->Capa($bAdmin, $bMobile, $oAccount)); } /** * @param string $sKey * * @return string */ public function etag($sKey) { return \md5('Etag:'.\md5($sKey.\md5($this->Config()->Get('cache', 'index', '')))); } /** * @param string $sKey * @param bool $bForce = false * * @return bool */ public function cacheByKey($sKey, $bForce = false) { $bResult = false; if (!empty($sKey) && ($bForce || ($this->Config()->Get('cache', 'enable', true) && $this->Config()->Get('cache', 'http', true)))) { $iExpires = $this->Config()->Get('cache', 'http_expires', 3600); if (0 < $iExpires) { $this->oHttp->ServerUseCache($this->etag($sKey), 1382478804, \time() + $iExpires); $bResult = true; } } if (!$bResult) { $this->oHttp->ServerNoCache(); } return $bResult; } /** * @param string $sKey * @param bool $bForce = false * * @return void */ public function verifyCacheByKey($sKey, $bForce = false) { if (!empty($sKey) && ($bForce || $this->Config()->Get('cache', 'enable', true) && $this->Config()->Get('cache', 'http', true))) { $sIfNoneMatch = $this->Http()->GetHeader('If-None-Match', ''); if ($this->etag($sKey) === $sIfNoneMatch) { $this->Http()->StatusHeader(304); $this->cacheByKey($sKey); exit(0); } } } /** * @param \RainLoop\Model\Account $oAccount * @param string $sHash * * @return array */ private function getMimeFileByHash($oAccount, $sHash) { $aValues = $this->getDecodedRawKeyValue($sHash); $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; $sContentTypeIn = (string) isset($aValues['MimeType']) ? $aValues['MimeType'] : ''; $sFileNameIn = (string) isset($aValues['FileName']) ? $aValues['FileName'] : ''; $oFileProvider = $this->FilesProvider(); $sResultHash = ''; $mResult = $this->MailClient()->MessageMimeStream(function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oAccount, $oFileProvider, $sFileNameIn, $sContentTypeIn, &$sResultHash) { unset($sContentType, $sFileName, $sMimeIndex); if ($oAccount && \is_resource($rResource)) { $sHash = \MailSo\Base\Utils::Md5Rand($sFileNameIn.'~'.$sContentTypeIn); $rTempResource = $oFileProvider->GetFile($oAccount, $sHash, 'wb+'); if (@\is_resource($rTempResource)) { if (false !== \MailSo\Base\Utils::MultipleStreamWriter($rResource, array($rTempResource))) { $sResultHash = $sHash; } @\fclose($rTempResource); } } }, $sFolder, $iUid, true, $sMimeIndex); $aValues['FileHash'] = ''; if ($mResult) { $aValues['FileHash'] = $sResultHash; } return $aValues; } /** * @param \Imagine\Image\AbstractImage $oImage * @param int $iOrientation */ private function rotateImageByOrientation(&$oImage, $iOrientation) { if (0 < $iOrientation) { switch ($iOrientation) { default: case 1: break; case 2: // flip horizontal $oImage->flipHorizontally(); break; case 3: // rotate 180 $oImage->rotate(180); break; case 4: // flip vertical $oImage->flipVertically(); break; case 5: // vertical flip + 90 rotate $oImage->flipVertically(); $oImage->rotate(90); break; case 6: // rotate 90 $oImage->rotate(90); break; case 7: // horizontal flip + 90 rotate $oImage->flipHorizontally(); $oImage->rotate(90); break; case 8: // rotate 270 $oImage->rotate(270); break; } } } /** * @param \Imagine\Image\AbstractImage $oImage */ public function correctImageOrientation($oImage, $bDetectImageOrientation = true, $iThumbnailBoxSize = null) { $iOrientation = 1; if ($bDetectImageOrientation && \MailSo\Base\Utils::FunctionExistsAndEnabled('exif_read_data') && \MailSo\Base\Utils::FunctionExistsAndEnabled('gd_info')) { $oMetadata = $oImage->metadata(new \Imagine\Image\Metadata\ExifMetadataReader()); $iOrientation = isset($oMetadata['ifd0.Orientation']) && is_numeric($oMetadata['ifd0.Orientation']) ? (int) $oMetadata['ifd0.Orientation'] : 1; } if ($iThumbnailBoxSize && 0 < $iThumbnailBoxSize) { $oImage = $oImage->thumbnail( new \Imagine\Image\Box($iThumbnailBoxSize, $iThumbnailBoxSize), \Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND); $this->rotateImageByOrientation($oImage, $iOrientation); } else { $this->rotateImageByOrientation($oImage, $iOrientation); } return $oImage; } /** * @param bool $bDownload * @param bool $bThumbnail = false * * @return bool */ private function rawSmart($bDownload, $bThumbnail = false) { $sRawKey = (string) $this->GetActionParam('RawKey', ''); $aValues = $this->getDecodedRawKeyValue($sRawKey); $sRange = $this->Http()->GetHeader('Range'); $aMatch = array(); $sRangeStart = $sRangeEnd = ''; $bIsRangeRequest = false; if (!empty($sRange) && 'bytes=0-' !== \strtolower($sRange) && \preg_match('/^bytes=([0-9]+)-([0-9]*)/i', \trim($sRange), $aMatch)) { $sRangeStart = $aMatch[1]; $sRangeEnd = $aMatch[2]; $bIsRangeRequest = true; } $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; $iUid = isset($aValues['Uid']) ? (int) $aValues['Uid'] : 0; $sMimeIndex = isset($aValues['MimeIndex']) ? (string) $aValues['MimeIndex'] : ''; $sContentTypeIn = isset($aValues['MimeType']) ? (string) $aValues['MimeType'] : ''; $sFileNameIn = isset($aValues['FileName']) ? (string) $aValues['FileName'] : ''; $sFileHashIn = isset($aValues['FileHash']) ? (string) $aValues['FileHash'] : ''; $bDetectImageOrientation = !!$this->Config()->Get('labs', 'detect_image_exif_orientation', true); if (!empty($sFileHashIn)) { $this->verifyCacheByKey($sRawKey); $oAccount = $this->getAccountFromToken(); $sContentTypeOut = empty($sContentTypeIn) ? \MailSo\Base\Utils::MimeContentType($sFileNameIn) : $sContentTypeIn; $sFileNameOut = $this->MainClearFileName($sFileNameIn, $sContentTypeIn, $sMimeIndex); $rResource = $this->FilesProvider()->GetFile($oAccount, $sFileHashIn); if (\is_resource($rResource)) { $sFileNameOut = \MailSo\Base\Utils::ConvertEncoding( $sFileNameOut, \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::CP858); \header('Content-Type: '.$sContentTypeOut); \header('Content-Disposition: attachment; '. \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); \header('Accept-Ranges: none', true); \header('Content-Transfer-Encoding: binary'); \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); return true; } return false; } else { if (!empty($sFolder) && 0 < $iUid) { $this->verifyCacheByKey($sRawKey); } } $oAccount = $this->initMailClientConnection(); $self = $this; return $this->MailClient()->MessageMimeStream( function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ( $self, $oAccount, $sRawKey, $sContentTypeIn, $sFileNameIn, $bDownload, $bThumbnail, $bDetectImageOrientation, $bIsRangeRequest, $sRangeStart, $sRangeEnd ) { if ($oAccount && \is_resource($rResource)) { \MailSo\Base\Utils::ResetTimeLimit(); $sContentTypeOut = $sContentTypeIn; if (empty($sContentTypeOut)) { $sContentTypeOut = $sContentType; if (empty($sContentTypeOut)) { $sContentTypeOut = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); } } $sFileNameOut = $sFileNameIn; if (empty($sFileNameOut)) { $sFileNameOut = $sFileName; } $sFileNameOut = $self->MainClearFileName($sFileNameOut, $sContentTypeOut, $sMimeIndex); $self->cacheByKey($sRawKey); $sLoadedData = null; if (!$bDownload) { if ($bThumbnail) { try { $oImagine = new \Imagine\Gd\Imagine(); $oImage = $oImagine->load(\stream_get_contents($rResource)); $oImage = $self->correctImageOrientation($oImage, $bDetectImageOrientation, 60); \header('Content-Disposition: inline; '. \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut.'_thumb60x60.png')), true); $oImage->show('png'); } catch (\Exception $oException) { $self->Logger()->WriteExceptionShort($oException); } } else if ($bDetectImageOrientation && \in_array($sContentTypeOut, array('image/png', 'image/jpeg', 'image/jpg')) && \MailSo\Base\Utils::FunctionExistsAndEnabled('gd_info')) { try { $oImagine = new \Imagine\Gd\Imagine(); $sLoadedData = \stream_get_contents($rResource); $oImage = $oImagine->load($sLoadedData); $oImage = $self->correctImageOrientation($oImage, $bDetectImageOrientation); \header('Content-Disposition: inline; '. \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); $oImage->show($sContentTypeOut === 'image/png' ? 'png' : 'jpg'); } catch (\Exception $oException) { $self->Logger()->WriteExceptionShort($oException); } } else { $sLoadedData = \stream_get_contents($rResource); } } if ($bDownload || $sLoadedData) { if (!headers_sent()) { \header('Content-Type: '.$sContentTypeOut); \header('Content-Disposition: '.($bDownload ? 'attachment' : 'inline').'; '. \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); \header('Accept-Ranges: bytes'); \header('Content-Transfer-Encoding: binary'); } if ($bIsRangeRequest && !$sLoadedData) { $sLoadedData = \stream_get_contents($rResource); } \MailSo\Base\Utils::ResetTimeLimit(); if ($sLoadedData) { if ($bIsRangeRequest && (0 < \strlen($sRangeStart) || 0 < \strlen($sRangeEnd))) { $iFullContentLength = \strlen($sLoadedData); $self->Http()->StatusHeader(206); $iRangeStart = (int) $sRangeStart; $iRangeEnd = (int) $sRangeEnd; if ('' === $sRangeEnd) { $sLoadedData = 0 < $iRangeStart ? \substr($sLoadedData, $iRangeStart) : $sLoadedData; } else { if ($iRangeStart < $iRangeEnd) { $sLoadedData = \substr($sLoadedData, $iRangeStart, $iRangeEnd - $iRangeStart); } else { $sLoadedData = 0 < $iRangeStart ? \substr($sLoadedData, $iRangeStart) : $sLoadedData; } } $iContentLength = \strlen($sLoadedData); if (0 < $iContentLength) { \header('Content-Length: '.$iContentLength, true); \header('Content-Range: bytes '.$sRangeStart.'-'.(0 < $iRangeEnd ? $iRangeEnd : $iFullContentLength - 1).'/'.$iFullContentLength); } echo $sLoadedData; } else { echo $sLoadedData; } unset($sLoadedData); } else { \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); } } } }, $sFolder, $iUid, true, $sMimeIndex); } /** * @return bool */ public function RawDownload() { return $this->rawSmart(true); } /** * @return bool */ public function RawView() { return $this->rawSmart(false); } /** * @return bool */ public function RawViewThumbnail() { return $this->rawSmart(false, true); } /** * @return bool */ public function RawUserBackground() { $sRawKey = (string) $this->GetActionParam('RawKey', ''); $this->verifyCacheByKey($sRawKey); $oAccount = $this->getAccountFromToken(); $sData = $this->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, 'background' ); if (!empty($sData)) { $aData = \json_decode($sData, true); unset($sData); if (!empty($aData['ContentType']) && !empty($aData['Raw']) && \in_array($aData['ContentType'], array('image/png', 'image/jpg', 'image/jpeg'))) { $this->cacheByKey($sRawKey); @\header('Content-Type: '.$aData['ContentType']); echo \base64_decode($aData['Raw']); unset($aData); return true; } } return false; } /** * @return bool */ public function RawPublic() { $sRawKey = (string) $this->GetActionParam('RawKey', ''); $this->verifyCacheByKey($sRawKey); $sHash = $sRawKey; $sData = ''; if (!empty($sHash)) { $sData = $this->StorageProvider()->Get(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, \RainLoop\KeyPathHelper::PublicFile($sHash) ); } $aMatch = array(); if (!empty($sData) && 0 === \strpos($sData, 'data:') && \preg_match('/^data:([^:]+):/', $sData, $aMatch) && !empty($aMatch[1])) { $sContentType = \trim($aMatch[1]); if (\in_array($sContentType, array('image/png', 'image/jpg', 'image/jpeg'))) { $this->cacheByKey($sRawKey); @\header('Content-Type: '.$sContentType); echo \preg_replace('/^data:[^:]+:/', '', $sData); unset($sData); return true; } } return false; } /** * @param string $sFileName * * @return bool */ public function isFileHasFramedPreview($sFileName) { $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); return \in_array($sExt, array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx')); } /** * @param string $sFileName * * @return bool */ public function isFileHasThumbnail($sFileName) { static $aCache = array(); $sExt = \MailSo\Base\Utils::GetFileExtension($sFileName); if (isset($aCache[$sExt])) { return $aCache[$sExt]; } $bResult = \function_exists('gd_info'); if ($bResult) { $bResult = false; switch ($sExt) { case 'png': $bResult = \function_exists('imagecreatefrompng'); break; case 'gif': $bResult = \function_exists('imagecreatefromgif'); break; case 'jpg': case 'jpeg': $bResult = \function_exists('imagecreatefromjpeg'); break; } } $aCache[$sExt] = $bResult; return $bResult; } /** * @return bool */ public function RawAvatar() { $sData = ''; $sRawKey = (string) $this->GetActionParam('RawKey', ''); $sRawKey = \urldecode($sRawKey); $this->verifyCacheByKey($sRawKey); if (0 < \strlen($sRawKey) && \preg_match('/^[^@]+@([^@]+)$/', $sRawKey)) { $sEmail = \MailSo\Base\Utils::IdnToAscii($sRawKey, true); $iCode = 0; $sContentType = ''; $sGravatarUrl = 'http://gravatar.com/avatar/'.\md5(strtolower($sEmail)).'.jpg?s=80&d=404'; $this->Logger()->Write('gravatar: '.$sGravatarUrl); $sData = $this->Http()->GetUrlAsString($sGravatarUrl, null, $sContentType, $iCode, null, 5, $this->Config()->Get('labs', 'curl_proxy', ''), $this->Config()->Get('labs', 'curl_proxy_auth', '')); $sContentType = \strtolower(\trim($sContentType)); if (200 !== $iCode || empty($sData) || !\in_array($sContentType, array('image/jpeg', 'image/jpg', 'image/png'))) { $this->Logger()->Write('gravatar: code: '.$iCode.', content-type: '.$sContentType); $sData = ''; $aMatch = array(); if (\preg_match('/^[^@]+@([a-z0-9\-\.]+)$/', $sEmail, $aMatch) && !empty($aMatch[1])) { $sDomain = $aMatch[1]; if (\file_exists(APP_VERSION_ROOT_PATH.'app/resources/images/services/'.$sDomain.'.png')) { $sContentType = 'image/png'; $sData = \file_get_contents(APP_VERSION_ROOT_PATH.'app/resources/images/services/'.$sDomain.'.png'); } } } } if (empty($sData) || empty($sContentType)) { $sContentType = 'image/png'; $sData = \file_get_contents(APP_VERSION_ROOT_PATH.'app/resources/images/empty-contact.png'); } $this->cacheByKey($sRawKey); \header('Content-Type: '.$sContentType); echo $sData; return true; } /** * @return bool */ public function RawContactsVcf() { $oAccount = $this->getAccountFromToken(); \header('Content-Type: text/x-vcard; charset=UTF-8'); \header('Content-Disposition: attachment; filename="contacts.vcf"', true); \header('Accept-Ranges: none', true); \header('Content-Transfer-Encoding: binary'); $this->oHttp->ServerNoCache(); return $this->AddressBookProvider($oAccount)->IsActive() ? $this->AddressBookProvider($oAccount)->Export($oAccount->ParentEmailHelper(), 'vcf') : false; } /** * @return bool */ public function RawContactsCsv() { $oAccount = $this->getAccountFromToken(); \header('Content-Type: text/csv; charset=UTF-8'); \header('Content-Disposition: attachment; filename="contacts.csv"', true); \header('Accept-Ranges: none', true); \header('Content-Transfer-Encoding: binary'); $this->oHttp->ServerNoCache(); return $this->AddressBookProvider($oAccount)->IsActive() ? $this->AddressBookProvider($oAccount)->Export($oAccount->ParentEmailHelper(), 'csv') : false; } /** * @return \RainLoop\Model\Account|bool */ private function initMailClientConnection() { $oAccount = null; if (!$this->MailClient()->IsLoggined()) { $oAccount = $this->getAccountFromToken(); try { $oAccount->IncConnectAndLoginHelper($this->Plugins(), $this->MailClient(), $this->Config(), array($this, 'googleRefreshTokenCallback')); } catch (\MailSo\Net\Exceptions\ConnectionException $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException); } catch (\Exception $oException) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException); } $this->MailClient()->ImapClient()->__FORCE_SELECT_ON_EXAMINE__ = !!$this->Config()->Get('labs', 'use_imap_force_selection'); } return $oAccount; } /** * @param string $sRawKey * * @return array | false */ private function getDecodedRawKeyValue($sRawKey) { $bResult = false; if (!empty($sRawKey)) { $aValues = \RainLoop\Utils::DecodeKeyValuesQ($sRawKey); if (is_array($aValues)) { $bResult = $aValues; } } return $bResult; } /** * @param string $sRawKey * @param int | null $iLenCache * @return array | bool */ private function getDecodedClientRawKeyValue($sRawKey, $iLenCache = null) { $mResult = false; if (!empty($sRawKey)) { $sRawKey = \MailSo\Base\Utils::UrlSafeBase64Decode($sRawKey); $aValues = explode("\x0", $sRawKey); if (is_array($aValues) && (null === $iLenCache || $iLenCache === count($aValues))) { $mResult = $aValues; } } return $mResult; } /** * @return string */ public function StaticCache() { static $sCache = null; if (!$sCache) { $sCache = \md5(APP_VERSION.$this->Plugins()->Hash()); } return $sCache; } /** * @param string $sTheme * * @return string */ public function ThemeLink($sTheme, $bAdmin) { return './?/Css/0/'.($bAdmin ? 'Admin' : 'User').'/-/'.$sTheme.'/-/'.$this->StaticCache().'/Hash/-/'; } /** * @param string $sTheme * * @return string */ public function ValidateTheme($sTheme, $bMobile = false) { if ($bMobile) { return 'Mobile'; } return \in_array($sTheme, $this->GetThemes($bMobile)) ? $sTheme : $this->Config()->Get('themes', 'default', $bMobile ? 'Mobile' : 'Default'); } /** * @param string $sLanguage * @param string $sDefault = '' * @param bool $bAdmin = false * @param bool $bAllowEmptyResult = false * * @return string */ public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bAllowEmptyResult = false) { $sResult = ''; $aLang = $this->GetLanguages($bAdmin); if (\is_array($aLang)) { $aHelper = array('en' => 'en_us', 'ar' => 'ar_sa', 'cs' => 'cs_cz', 'no' => 'nb_no', 'ua' => 'uk_ua', 'cn' => 'zh_cn', 'zh' => 'zh_cn', 'tw' => 'zh_tw', 'fa' => 'fa_ir'); $sLanguage = isset($aHelper[$sLanguage]) ? $aHelper[$sLanguage] : $sLanguage; $sDefault = isset($aHelper[$sDefault]) ? $aHelper[$sDefault] : $sDefault; $sLanguage = \strtolower(\str_replace('-', '_', $sLanguage)); if (2 === strlen($sLanguage)) { $sLanguage = $sLanguage.'_'.$sLanguage; } $sDefault = \strtolower(\str_replace('-', '_', $sDefault)); if (2 === strlen($sDefault)) { $sDefault = $sDefault.'_'.$sDefault; } $sLanguage = \preg_replace_callback('/_([a-zA-Z0-9]{2})$/', function ($aData) { return \strtoupper($aData[0]); }, $sLanguage); $sDefault = \preg_replace_callback('/_([a-zA-Z0-9]{2})$/', function ($aData) { return \strtoupper($aData[0]); }, $sDefault); if (\in_array($sLanguage, $aLang)) { $sResult = $sLanguage; } if (empty($sResult) && !empty($sDefault) && \in_array($sDefault, $aLang)) { $sResult = $sDefault; } if (empty($sResult) && !$bAllowEmptyResult) { $sResult = $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en_US'); $sResult = \in_array($sResult, $aLang) ? $sResult : 'en_US'; } } return $sResult; } /** * @param string $sType * * @return string */ public function ValidateContactPdoType($sType) { return \in_array($sType, array('mysql', 'pgsql', 'sqlite')) ? $sType : 'sqlite'; } /** * @staticvar array $aCache * * @return array */ public function GetThemes($bMobile = false, $bIncludeMobile = true) { if ($bMobile) { return array('Mobile'); } static $aCache = array('full' => null, 'mobile' => null); if ($bIncludeMobile && \is_array($aCache['full'])) { return $aCache['full']; } else if ($bIncludeMobile && \is_array($aCache['mobile'])) { return $aCache['mobile']; } $bClear = false; $bDefault = false; $sList = array(); $sDir = APP_VERSION_ROOT_PATH.'themes'; if (@\is_dir($sDir)) { $rDirH = \opendir($sDir); if ($rDirH) { while (($sFile = \readdir($rDirH)) !== false) { if ('.' !== $sFile{0} && \is_dir($sDir.'/'.$sFile) && \file_exists($sDir.'/'.$sFile.'/styles.less')) { if ('Default' === $sFile) { $bDefault = true; } else if ('Clear' === $sFile) { $bClear = true; } else if ($bIncludeMobile || 'Mobile' !== $sFile) { $sList[] = $sFile; } } } @closedir($rDirH); } } $sDir = APP_INDEX_ROOT_PATH.'themes'; // custom user themes if (@\is_dir($sDir)) { $rDirH = \opendir($sDir); if ($rDirH) { while (($sFile = \readdir($rDirH)) !== false) { if ('.' !== $sFile{0} && \is_dir($sDir.'/'.$sFile) && \file_exists($sDir.'/'.$sFile.'/styles.less')) { $sList[] = $sFile.'@custom'; } } @\closedir($rDirH); } } $sList = \array_unique($sList); \sort($sList); if ($bDefault) { \array_unshift($sList, 'Default'); } if ($bClear) { \array_push($sList, 'Clear'); } $aCache[$bIncludeMobile ? 'full' : 'mobile'] = $sList; return $sList; } /** * @staticvar array $aCache * @param bool $bAdmin = false * * @return array */ public function GetLanguages($bAdmin = false) { static $aCache = array(); $sDir = APP_VERSION_ROOT_PATH.'app/localization/'.($bAdmin ? 'admin' : 'webmail').'/'; if (isset($aCache[$sDir])) { return $aCache[$sDir]; } $aTop = array(); $aList = array(); if (@\is_dir($sDir)) { $rDirH = \opendir($sDir); if ($rDirH) { while (($sFile = \readdir($rDirH)) !== false) { if ('.' !== $sFile{0} && \is_file($sDir.'/'.$sFile) && '.yml' === \substr($sFile, -4)) { $sLang = \substr($sFile, 0, -4); if (0 < \strlen($sLang) && 'always' !== $sLang && '_source.en' !== $sLang) { \array_push($aList, $sLang); } } } @\closedir($rDirH); } } \sort($aTop); \sort($aList); $aCache[$sDir] = \array_merge($aTop, $aList); return $aCache[$sDir]; } /** * @param string $sName * @param string $sHtml * * @return string */ public function ProcessTemplate($sName, $sHtml) { $sHtml = $this->Plugins()->ProcessTemplate($sName, $sHtml); $sHtml = \preg_replace('/\{\{INCLUDE\/([a-zA-Z]+)\/PLACE\}\}/', '', $sHtml); $sHtml = \preg_replace('/' : '', '{{BaseAppBodyScript}}' => $sSentryDsn ? '' : '', '{{BaseAppFaviconPngLinkTag}}' => $sFaviconPngLink ? '' : '', '{{BaseAppFaviconTouchLinkTag}}' => $sAppleTouchLink ? '' : '', '{{BaseAppMainCssLink}}' => $this->staticPath('css/app'.($bAppCssDebug ? '' : '.min').'.css'), '{{BaseAppThemeCssLink}}' => $this->oActions->ThemeLink($sTheme, $bAdmin), '{{BaseAppPolyfillsScriptLink}}' => $this->staticPath('js/'.($bAppJsDebug ? '' : 'min/').'polyfills'.($bAppJsDebug ? '' : '.min').'.js'), '{{BaseAppBootScriptLink}}' => $this->staticPath('js/'.($bAppJsDebug ? '' : 'min/').'boot'.($bAppJsDebug ? '' : '.min').'.js'), '{{BaseViewport}}' => $bMobile ? 'width=device-width,initial-scale=1,user-scalable=no' : 'width=950,maximum-scale=2', '{{BaseContentSecurityPolicy}}' => $sContentSecurityPolicy ? '' : '', '{{BaseDir}}' => false && \in_array($sLanguage, array('ar', 'he', 'ur')) ? 'rtl' : 'ltr', '{{BaseAppManifestLink}}' => $this->staticPath('manifest.json') ); $aTemplateParameters['{{RainloopBootData}}'] = \json_encode(array( 'admin' => $bAdmin, 'language' => $sLanguage, 'theme' => $sTheme, 'mobile' => $bMobile, 'mobileDevice' => $bMobileDevice )); $aTemplateParameters['{{BaseHash}}'] = \md5( \implode('~', array( $bAdmin ? '1' : '0', \md5($this->oActions->Config()->Get('cache', 'index', '')), $this->oActions->Plugins()->Hash(), \RainLoop\Utils::WebVersionPath(), APP_VERSION, )). \implode('~', $aTemplateParameters) ); return $aTemplateParameters; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php000066400000000000000000001060521361462701300275010ustar00rootroot00000000000000oHttp = $oHttp; $this->oActions = $oActions; $this->aPaths = array(); $this->sQuery = ''; } /** * @return \MailSo\Log\Logger */ public function Logger() { return $this->oActions->Logger(); } /** * @return \RainLoop\Plugins\Manager */ public function Plugins() { return $this->oActions->Plugins(); } /** * @return \RainLoop\Application */ public function Config() { return $this->oActions->Config(); } /** * @return \MailSo\Cache\CacheClient */ public function Cacher() { return $this->oActions->Cacher(); } /** * @return \RainLoop\Providers\Storage */ public function StorageProvider() { return $this->oActions->StorageProvider(); } /** * @return \RainLoop\Providers\Settings */ public function SettingsProvider() { return $this->oActions->SettingsProvider(); } /** * @param array $aPaths * * @return \RainLoop\ServiceActions */ public function SetPaths($aPaths) { $this->aPaths = \is_array($aPaths) ? $aPaths : array(); return $this; } /** * @param string $sQuery * * @return \RainLoop\ServiceActions */ public function SetQuery($sQuery) { $this->sQuery = $sQuery; return $this; } /** * @return string */ public function ServiceAjax() { @\ob_start(); $aResponseItem = null; $oException = null; $sAction = $this->oHttp->GetPost('Action', null); if (empty($sAction) && $this->oHttp->IsGet() && !empty($this->aPaths[2])) { $sAction = $this->aPaths[2]; } $this->oActions->SetIsAjax(true); try { if ($this->oHttp->IsPost() && $this->Config()->Get('security', 'csrf_protection', false) && $this->oHttp->GetPost('XToken', '') !== \RainLoop\Utils::GetCsrfToken()) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::InvalidToken); } else if (!empty($sAction)) { $sMethodName = 'Do'.$sAction; $this->Logger()->Write('Action: '.$sMethodName, \MailSo\Log\Enumerations\Type::NOTE, 'AJAX'); $aPost = $this->oHttp->GetPostAsArray(); if (\is_array($aPost) && 0 < \count($aPost)) { $this->oActions->SetActionParams($aPost, $sMethodName); switch ($sMethodName) { case 'DoLogin': case 'DoAdminLogin': case 'DoAccountAdd': $this->Logger()->AddSecret($this->oActions->GetActionParam('Password', '')); break; case 'DoChangePassword': $this->Logger()->AddSecret($this->oActions->GetActionParam('PrevPassword', '')); $this->Logger()->AddSecret($this->oActions->GetActionParam('NewPassword', '')); break; } $this->Logger()->Write(\MailSo\Base\Utils::Php2js($aPost, $this->Logger()), \MailSo\Log\Enumerations\Type::INFO, 'POST', true); } else if (3 < \count($this->aPaths) && $this->oHttp->IsGet()) { $this->oActions->SetActionParams(array( 'RawKey' => empty($this->aPaths[3]) ? '' : $this->aPaths[3] ), $sMethodName); } if (\method_exists($this->oActions, $sMethodName) && \is_callable(array($this->oActions, $sMethodName))) { $this->Plugins()->RunHook('ajax.action-pre-call', array($sAction)); $aResponseItem = \call_user_func(array($this->oActions, $sMethodName)); $this->Plugins()->RunHook('ajax.action-post-call', array($sAction, &$aResponseItem)); } else if ($this->Plugins()->HasAdditionalAjax($sMethodName)) { $this->Plugins()->RunHook('ajax.action-pre-call', array($sAction)); $aResponseItem = $this->Plugins()->RunAdditionalAjax($sMethodName); $this->Plugins()->RunHook('ajax.action-post-call', array($sAction, &$aResponseItem)); } } if (!\is_array($aResponseItem)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); } } catch (\Exception $oException) { $aResponseItem = $this->oActions->ExceptionResponse( empty($sAction) ? 'Unknown' : $sAction, $oException); if (\is_array($aResponseItem) && $oException instanceof \RainLoop\Exceptions\ClientException) { if ('Folders' === $sAction) { $aResponseItem['ClearAuth'] = true; } if ($oException->getLogoutOnException()) { $aResponseItem['Logout'] = true; if ($oException->getAdditionalMessage()) { $this->oActions->SetSpecLogoutCustomMgsWithDeletion($oException->getAdditionalMessage()); } } } } if (\is_array($aResponseItem)) { $aResponseItem['Time'] = (int) ((\microtime(true) - APP_START) * 1000); $sUpdateToken = $this->oActions->GetUpdateAuthToken(); if ($sUpdateToken) { $aResponseItem['UpdateToken'] = $sUpdateToken; } } $this->Plugins()->RunHook('filter.ajax-response', array($sAction, &$aResponseItem)); @\header('Content-Type: application/json; charset=utf-8'); $sResult = \MailSo\Base\Utils::Php2js($aResponseItem, $this->Logger()); $sObResult = @\ob_get_clean(); if ($this->Logger()->IsEnabled()) { if (0 < \strlen($sObResult)) { $this->Logger()->Write($sObResult, \MailSo\Log\Enumerations\Type::ERROR, 'OB-DATA'); } if ($oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } $iLimit = (int) $this->Config()->Get('labs', 'log_ajax_response_write_limit', 0); $this->Logger()->Write(0 < $iLimit && $iLimit < \strlen($sResult) ? \substr($sResult, 0, $iLimit).'...' : $sResult, \MailSo\Log\Enumerations\Type::INFO, 'AJAX'); } return $sResult; } /** * @return string */ public function ServiceOwnCloudAuth() { $this->oHttp->ServerNoCache(); if (!\RainLoop\Utils::IsOwnCloud() || !isset($_ENV['___rainloop_owncloud_email']) || !isset($_ENV['___rainloop_owncloud_password']) || empty($_ENV['___rainloop_owncloud_email']) ) { $this->oActions->SetAuthLogoutToken(); $this->oActions->Location('./'); return ''; } $bLogout = true; $sEmail = $_ENV['___rainloop_owncloud_email']; $sPassword = $_ENV['___rainloop_owncloud_password']; try { $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword); $this->oActions->AuthToken($oAccount); $bLogout = !($oAccount instanceof \RainLoop\Model\Account); } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException); } if ($bLogout) { $this->oActions->SetAuthLogoutToken(); } $this->oActions->Location('./'); return ''; } /** * @return string */ public function ServiceAppend() { @\ob_start(); $bResponse = false; $oException = null; try { if (\method_exists($this->oActions, 'Append') && \is_callable(array($this->oActions, 'Append'))) { $this->oActions->SetActionParams($this->oHttp->GetPostAsArray(), 'Append'); $bResponse = \call_user_func(array($this->oActions, 'Append')); } } catch (\Exception $oException) { $bResponse = false; } @\header('Content-Type: text/plain; charset=utf-8'); $sResult = true === $bResponse ? '1' : '0'; $sObResult = @\ob_get_clean(); if (0 < \strlen($sObResult)) { $this->Logger()->Write($sObResult, \MailSo\Log\Enumerations\Type::ERROR, 'OB-DATA'); } if ($oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } $this->Logger()->Write($sResult, \MailSo\Log\Enumerations\Type::INFO, 'APPEND'); return $sResult; } /** * @param string $sAction * @param int $iSizeLimit = 0 * * @return string */ private function privateUpload($sAction, $iSizeLimit = 0) { $oConfig = $this->Config(); @\ob_start(); $aResponseItem = null; try { $aFile = null; $sInputName = 'uploader'; $iError = \RainLoop\Enumerations\UploadError::UNKNOWN; $iSizeLimit = (0 < $iSizeLimit ? $iSizeLimit : ((int) $oConfig->Get('webmail', 'attachment_size_limit', 0))) * 1024 * 1024; $iError = UPLOAD_ERR_OK; $_FILES = isset($_FILES) ? $_FILES : null; if (isset($_FILES, $_FILES[$sInputName], $_FILES[$sInputName]['name'], $_FILES[$sInputName]['tmp_name'], $_FILES[$sInputName]['size'])) { $iError = (isset($_FILES[$sInputName]['error'])) ? (int) $_FILES[$sInputName]['error'] : UPLOAD_ERR_OK; if (UPLOAD_ERR_OK === $iError && 0 < $iSizeLimit && $iSizeLimit < (int) $_FILES[$sInputName]['size']) { $iError = \RainLoop\Enumerations\UploadError::CONFIG_SIZE; } if (UPLOAD_ERR_OK === $iError) { $aFile = $_FILES[$sInputName]; } } else if (!isset($_FILES) || !is_array($_FILES) || 0 === count($_FILES)) { $iError = UPLOAD_ERR_INI_SIZE; } else { $iError = \RainLoop\Enumerations\UploadError::EMPTY_FILES_DATA; } if (\method_exists($this->oActions, $sAction) && \is_callable(array($this->oActions, $sAction))) { $aActionParams = $this->oHttp->GetQueryAsArray(); $aActionParams['File'] = $aFile; $aActionParams['Error'] = $iError; $this->oActions->SetActionParams($aActionParams, $sAction); $aResponseItem = \call_user_func(array($this->oActions, $sAction)); } if (!is_array($aResponseItem)) { throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::UnknownError); } } catch (\Exception $oException) { $aResponseItem = $this->oActions->ExceptionResponse($sAction, $oException); } if ('iframe' === $this->oHttp->GetPost('jua-post-type', '')) { @\header('Content-Type: text/html; charset=utf-8'); } else { @\header('Content-Type: application/json; charset=utf-8'); } $this->Plugins()->RunHook('filter.upload-response', array(&$aResponseItem)); $sResult = \MailSo\Base\Utils::Php2js($aResponseItem, $this->Logger()); $sObResult = @\ob_get_clean(); if (0 < \strlen($sObResult)) { $this->Logger()->Write($sObResult, \MailSo\Log\Enumerations\Type::ERROR, 'OB-DATA'); } $this->Logger()->Write($sResult, \MailSo\Log\Enumerations\Type::INFO, 'UPLOAD'); return $sResult; } /** * @return string */ public function ServiceUpload() { return $this->privateUpload('Upload'); } /** * @return string */ public function ServiceUploadContacts() { return $this->privateUpload('UploadContacts', 5); } /** * @return string */ public function ServiceUploadBackground() { return $this->privateUpload('UploadBackground', 1); } /** * @return string */ public function ServiceProxyExternal() { $bResult = false; $sData = empty($this->aPaths[1]) ? '' : $this->aPaths[1]; if (!empty($sData) && $this->oActions->Config()->Get('labs', 'use_local_proxy_for_external_images', false)) { $this->oActions->verifyCacheByKey($sData); $aData = \RainLoop\Utils::DecodeKeyValuesQ($sData); if (\is_array($aData) && !empty($aData['Token']) && !empty($aData['Url']) && $aData['Token'] === \RainLoop\Utils::GetConnectionToken()) { $iCode = 404; $sContentType = ''; $mResult = $this->oHttp->GetUrlAsString($aData['Url'], 'RainLoop External Proxy', $sContentType, $iCode); if (false !== $mResult && 200 === $iCode && \in_array($sContentType, array('image/png', 'image/jpeg', 'image/jpg', 'image/bmp', 'image/gif'))) { $bResult = true; $this->oActions->cacheByKey($sData); \header('Content-Type: '.$sContentType); echo $mResult; } } } if (!$bResult) { $this->oHttp->StatusHeader(404); } return ''; } /** * @return string */ public function ServiceRaw() { $sResult = ''; $sRawError = ''; $sAction = empty($this->aPaths[2]) ? '' : $this->aPaths[2]; $oException = null; try { $sRawError = 'Invalid action'; if (0 !== \strlen($sAction)) { $sMethodName = 'Raw'.$sAction; if (\method_exists($this->oActions, $sMethodName)) { @\header('X-Raw-Action: '.$sMethodName, true); @\header('Content-Security-Policy: script-src \'none\'; frame-src \'none\'; child-src \'none\'', true); $sRawError = ''; $this->oActions->SetActionParams(array( 'RawKey' => empty($this->aPaths[3]) ? '' : $this->aPaths[3], 'Params' => $this->aPaths ), $sMethodName); if (!\call_user_func(array($this->oActions, $sMethodName))) { $sRawError = 'False result'; } else { $sRawError = ''; } } else { $sRawError = 'Unknown action "'.$sAction.'"'; } } else { $sRawError = 'Empty action'; } } catch (\RainLoop\Exceptions\ClientException $oException) { $sRawError = 'Exception as result'; switch ($oException->getCode()) { case \RainLoop\Notifications::AuthError: $sRawError = 'Authentication failed'; break; } } catch (\Exception $oException) { $sRawError = 'Exception as result'; } if (0 < \strlen($sRawError)) { $this->oActions->Logger()->Write($sRawError, \MailSo\Log\Enumerations\Type::ERROR); $this->oActions->Logger()->WriteDump($this->aPaths, \MailSo\Log\Enumerations\Type::ERROR, 'PATHS'); } if ($oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR, 'RAW'); } return $sResult; } /** * @return string */ public function ServiceLang() { // sleep(2); $sResult = ''; @\header('Content-Type: application/javascript; charset=utf-8'); if (!empty($this->aPaths[3])) { $bAdmim = 'Admin' === (isset($this->aPaths[2]) ? (string) $this->aPaths[2] : 'App'); $sLanguage = $this->oActions->ValidateLanguage($this->aPaths[3], '', $bAdmim); $bCacheEnabled = $this->Config()->Get('labs', 'cache_system_data', true); if (!empty($sLanguage) && $bCacheEnabled) { $this->oActions->verifyCacheByKey($this->sQuery); } $sCacheFileName = ''; if ($bCacheEnabled) { $sCacheFileName = \RainLoop\KeyPathHelper::LangCache( $sLanguage, $bAdmim, $this->oActions->Plugins()->Hash()); $sResult = $this->Cacher()->Get($sCacheFileName); } if (0 === \strlen($sResult)) { $sResult = $this->compileLanguage($sLanguage, $bAdmim, false); if ($bCacheEnabled && 0 < \strlen($sCacheFileName)) { $this->Cacher()->Set($sCacheFileName, $sResult); } } if ($bCacheEnabled) { $this->oActions->cacheByKey($this->sQuery); } } return $sResult; } /** * @return string */ public function ServiceTemplates() { $sResult = ''; @\header('Content-Type: application/javascript; charset=utf-8'); $bCacheEnabled = $this->Config()->Get('labs', 'cache_system_data', true); if ($bCacheEnabled) { $this->oActions->verifyCacheByKey($this->sQuery); } $bAdmin = false !== \strpos($this->sQuery, 'Admin'); $sCacheFileName = ''; if ($bCacheEnabled) { $sCacheFileName = \RainLoop\KeyPathHelper::TemplatesCache($bAdmin, $this->oActions->Plugins()->Hash()); $sResult = $this->Cacher()->Get($sCacheFileName); } if (0 === \strlen($sResult)) { $sResult = $this->compileTemplates($bAdmin); if ($bCacheEnabled && 0 < \strlen($sCacheFileName)) { $this->Cacher()->Set($sCacheFileName, $sResult); } } if ($bCacheEnabled) { $this->oActions->cacheByKey($this->sQuery); } return $sResult; } /** * @return string */ public function ServicePlugins() { $sResult = ''; $bAdmin = !empty($this->aPaths[2]) && 'Admin' === $this->aPaths[2]; @\header('Content-Type: application/javascript; charset=utf-8'); $bCacheEnabled = $this->Config()->Get('labs', 'cache_system_data', true); if ($bCacheEnabled) { $this->oActions->verifyCacheByKey($this->sQuery); } $sCacheFileName = ''; if ($bCacheEnabled) { $sCacheFileName = \RainLoop\KeyPathHelper::PluginsJsCache($this->oActions->Plugins()->Hash()); $sResult = $this->Cacher()->Get($sCacheFileName); } if (0 === strlen($sResult)) { $sResult = $this->Plugins()->CompileJs($bAdmin); if ($bCacheEnabled && 0 < \strlen($sCacheFileName)) { $this->Cacher()->Set($sCacheFileName, $sResult); } } if ($bCacheEnabled) { $this->oActions->cacheByKey($this->sQuery); } return $sResult; } /** * @return string */ public function ServiceCss() { $sResult = ''; $bAdmin = !empty($this->aPaths[2]) && 'Admin' === $this->aPaths[2]; $bJson = !empty($this->aPaths[9]) && 'Json' === $this->aPaths[9]; if ($bJson) { @\header('Content-Type: application/json; charset=utf-8'); } else { @\header('Content-Type: text/css; charset=utf-8'); } $sTheme = ''; if (!empty($this->aPaths[4])) { $sTheme = $this->oActions->ValidateTheme($this->aPaths[4]); $sRealTheme = $sTheme; $bCustomTheme = '@custom' === \substr($sTheme, -7); if ($bCustomTheme) { $sRealTheme = \substr($sTheme, 0, -7); } $bCacheEnabled = $this->Config()->Get('labs', 'cache_system_data', true); if ($bCacheEnabled) { $this->oActions->verifyCacheByKey($this->sQuery); } $sCacheFileName = ''; if ($bCacheEnabled) { $sCacheFileName = \RainLoop\KeyPathHelper::CssCache($sTheme, $this->oActions->Plugins()->Hash()); $sResult = $this->Cacher()->Get($sCacheFileName); } if (0 === \strlen($sResult)) { try { include_once APP_VERSION_ROOT_PATH.'app/libraries/lessphp/ctype.php'; include_once APP_VERSION_ROOT_PATH.'app/libraries/lessphp/lessc.inc.php'; $oLess = new \RainLoopVendor\lessc(); $oLess->setFormatter('compressed'); $aResult = array(); $sThemeFile = ($bCustomTheme ? APP_INDEX_ROOT_PATH : APP_VERSION_ROOT_PATH).'themes/'.$sRealTheme.'/styles.less'; $sThemeExtFile = ($bCustomTheme ? APP_INDEX_ROOT_PATH : APP_VERSION_ROOT_PATH).'themes/'.$sRealTheme.'/ext.less'; $sThemeValuesFile = APP_VERSION_ROOT_PATH.'app/templates/Themes/values.less'; $sThemeTemplateFile = APP_VERSION_ROOT_PATH.'app/templates/Themes/template.less'; if (\file_exists($sThemeFile) && \file_exists($sThemeTemplateFile) && \file_exists($sThemeValuesFile)) { $aResult[] = '@base: "'. ($bCustomTheme ? \RainLoop\Utils::WebPath() : \RainLoop\Utils::WebVersionPath()). 'themes/'.$sRealTheme.'/";'; $aResult[] = \file_get_contents($sThemeValuesFile); $aResult[] = \file_get_contents($sThemeFile); $aResult[] = \file_get_contents($sThemeTemplateFile); if (\file_exists($sThemeExtFile)) { $aResult[] = \file_get_contents($sThemeExtFile); } } $aResult[] = $this->Plugins()->CompileCss($bAdmin); $sResult = $oLess->compile(\implode("\n", $aResult)); if ($bCacheEnabled) { if (0 < \strlen($sCacheFileName)) { $this->Cacher()->Set($sCacheFileName, $sResult); } } } catch (\Exception $oException) { $this->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR, 'LESS'); } } if ($bCacheEnabled) { $this->oActions->cacheByKey($this->sQuery); } } return $bJson ? \MailSo\Base\Utils::Php2js(array($sTheme, $sResult), $this->Logger()) : $sResult; } /** * @return string */ public function ServiceSocialGoogle() { $bXAuth = '1' === (string) $this->oHttp->GetQuery('xauth', '0'); return $this->oActions->Social()->GooglePopupService($bXAuth); } /** * @return string */ public function ServiceSocialFacebook() { return $this->oActions->Social()->FacebookPopupService(); } /** * @return string */ public function ServiceSocialTwitter() { return $this->oActions->Social()->TwitterPopupService(); } /** * @return string */ public function ServiceAppData($sAdd = '') { return $this->localAppData(false, $sAdd); } /** * @return string */ public function ServiceAdminAppData($sAdd = '') { return $this->localAppData(true, $sAdd); } /** * @return string */ public function ServiceMobileVersion() { \RainLoop\Utils::SetCookie(\RainLoop\Actions::RL_MOBILE_TYPE, 'mobile'); $this->oActions->Location('./'); return ''; } /** * @return string */ public function ServiceDesktopVersion() { \RainLoop\Utils::SetCookie(\RainLoop\Actions::RL_MOBILE_TYPE, 'desktop'); $this->oActions->Location('./'); return ''; } /** * @return string */ public function ServiceNoScript() { return $this->localError($this->oActions->StaticI18N('STATIC/NO_SCRIPT_TITLE'), $this->oActions->StaticI18N('STATIC/NO_SCRIPT_DESC')); } /** * @return string */ public function ServiceNoCookie() { return $this->localError($this->oActions->StaticI18N('STATIC/NO_COOKIE_TITLE'), $this->oActions->StaticI18N('STATIC/NO_COOKIE_DESC')); } /** * @return string */ public function ServiceBadBrowser() { $sTitle = $this->oActions->StaticI18N('STATIC/BAD_BROWSER_TITLE'); $sDesc = \nl2br($this->oActions->StaticI18N('STATIC/BAD_BROWSER_DESC')); @\header('Content-Type: text/html; charset=utf-8'); return \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/BadBrowser.html'), array( '{{BaseWebStaticPath}}' => \RainLoop\Utils::WebStaticPath(), '{{ErrorTitle}}' => $sTitle, '{{ErrorHeader}}' => $sTitle, '{{ErrorDesc}}' => $sDesc )); } /** * @return string */ public function ServiceMailto() { $this->oHttp->ServerNoCache(); $sTo = \trim($this->oHttp->GetQuery('to', '')); if (!empty($sTo) && \preg_match('/^mailto:/i', $sTo)) { $oAccount = $this->oActions->GetAccountFromSignMeToken(); if ($oAccount) { $this->oActions->SetMailtoRequest($sTo); } } $this->oActions->Location('./'); return ''; } /** * @return string */ public function ServicePing() { $this->oHttp->ServerNoCache(); @\header('Content-Type: text/plain; charset=utf-8'); $this->oActions->Logger()->Write('Pong', \MailSo\Log\Enumerations\Type::INFO, 'PING'); return 'Pong'; } /** * @return string */ public function ServiceInfo() { $this->oHttp->ServerNoCache(); if ($this->oActions->IsAdminLoggined(false)) { @\header('Content-Type: text/html; charset=utf-8'); \phpinfo(); } } /** * @return string */ public function ServiceSso() { $this->oHttp->ServerNoCache(); $oException = null; $oAccount = null; $bLogout = true; $sSsoHash = $this->oHttp->GetRequest('hash', ''); if (!empty($sSsoHash)) { $mData = null; $sSsoSubData = $this->Cacher()->Get(\RainLoop\KeyPathHelper::SsoCacherKey($sSsoHash)); if (!empty($sSsoSubData)) { $mData = \RainLoop\Utils::DecodeKeyValuesQ($sSsoSubData); $this->Cacher()->Delete(\RainLoop\KeyPathHelper::SsoCacherKey($sSsoHash)); if (\is_array($mData) && !empty($mData['Email']) && isset($mData['Password'], $mData['Time']) && (0 === $mData['Time'] || \time() - 10 < $mData['Time'])) { $sEmail = \trim($mData['Email']); $sPassword = $mData['Password']; $aAdditionalOptions = isset($mData['AdditionalOptions']) && \is_array($mData['AdditionalOptions']) && 0 < \count($mData['AdditionalOptions']) ? $mData['AdditionalOptions'] : null; try { $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword); if ($oAccount instanceof \RainLoop\Model\Account && $aAdditionalOptions) { $bNeedToSettings = false; $oSettings = $this->SettingsProvider()->Load($oAccount); if ($oSettings) { $sLanguage = isset($aAdditionalOptions['Language']) ? $aAdditionalOptions['Language'] : ''; if ($sLanguage) { $sLanguage = $this->oActions->ValidateLanguage($sLanguage); if ($sLanguage !== $oSettings->GetConf('Language', '')) { $bNeedToSettings = true; $oSettings->SetConf('Language', $sLanguage); } } } if ($bNeedToSettings) { $this->SettingsProvider()->Save($oAccount, $oSettings); } } $this->oActions->AuthToken($oAccount); $bLogout = !($oAccount instanceof \RainLoop\Model\Account); } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException); } } } } if ($bLogout) { $this->oActions->SetAuthLogoutToken(); } $this->oActions->Location('./'); return ''; } /** * @return string */ public function ServiceRemoteAutoLogin() { $oException = null; $oAccount = null; $bLogout = true; $sEmail = $this->oHttp->GetEnv('REMOTE_USER', ''); $sPassword = $this->oHttp->GetEnv('REMOTE_PASSWORD', ''); if (0 < \strlen($sEmail) && 0 < \strlen(\trim($sPassword))) { try { $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword); $this->oActions->AuthToken($oAccount); $bLogout = !($oAccount instanceof \RainLoop\Model\Account); } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException); } } if ($bLogout) { $this->oActions->SetAuthLogoutToken(); } $this->oActions->Location('./'); return ''; } /** * @return string */ public function ServiceExternalLogin() { $this->oHttp->ServerNoCache(); $oException = null; $oAccount = null; $bLogout = true; if ($this->oActions->Config()->Get('labs', 'allow_external_login', false)) { $sEmail = \trim($this->oHttp->GetRequest('Email', '')); $sPassword = $this->oHttp->GetRequest('Password', ''); try { $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword); $this->oActions->AuthToken($oAccount); $bLogout = !($oAccount instanceof \RainLoop\Model\Account); } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException); } if ($bLogout) { $this->oActions->SetAuthLogoutToken(); } } switch (\strtolower($this->oHttp->GetRequest('Output', 'Redirect'))) { case 'json': @\header('Content-Type: application/json; charset=utf-8'); $aResult = array( 'Action' => 'ExternalLogin', 'Result' => $oAccount instanceof \RainLoop\Model\Account ? true : false, 'ErrorCode' => 0 ); if (!$aResult['Result']) { if ($oException instanceof \RainLoop\Exceptions\ClientException) { $aResult['ErrorCode'] = $oException->getCode(); } else { $aResult['ErrorCode'] = \RainLoop\Notifications::AuthError; } } return \MailSo\Base\Utils::Php2js($aResult, $this->Logger()); case 'redirect': default: $this->oActions->Location('./'); break; } return ''; } /** * @return string */ public function ServiceExternalSso() { $this->oHttp->ServerNoCache(); $sResult = ''; $bLogout = true; $sKey = $this->oActions->Config()->Get('labs', 'external_sso_key', ''); if ($this->oActions->Config()->Get('labs', 'allow_external_sso', false) && !empty($sKey) && $sKey === \trim($this->oHttp->GetRequest('SsoKey', ''))) { $sEmail = \trim($this->oHttp->GetRequest('Email', '')); $sPassword = $this->oHttp->GetRequest('Password', ''); $sResult = \RainLoop\Api::GetUserSsoHash($sEmail, $sPassword); $bLogout = 0 === \strlen($sResult); switch (\strtolower($this->oHttp->GetRequest('Output', 'Plain'))) { case 'plain': @\header('Content-Type: text/plain'); break; case 'json': @\header('Content-Type: application/json; charset=utf-8'); $sResult = \MailSo\Base\Utils::Php2js(array( 'Action' => 'ExternalSso', 'Result' => $sResult ), $this->Logger()); break; } } if ($bLogout) { $this->oActions->SetAuthLogoutToken(); } return $sResult; } private function changeAction() { $this->oHttp->ServerNoCache(); $oAccount = $this->oActions->GetAccount(); if ($oAccount && $this->oActions->GetCapa(false, false, \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS, $oAccount)) { $oAccountToLogin = null; $sEmail = empty($this->aPaths[2]) ? '' : \urldecode(\trim($this->aPaths[2])); if (!empty($sEmail)) { $sEmail = \MailSo\Base\Utils::IdnToAscii($sEmail); $aAccounts = $this->oActions->GetAccounts($oAccount); if (isset($aAccounts[$sEmail])) { $oAccountToLogin = $this->oActions->GetAccountFromCustomToken($aAccounts[$sEmail], false, false); } } if ($oAccountToLogin) { $this->oActions->AuthToken($oAccountToLogin); } } } /** * @return string */ public function ServiceChange() { $this->changeAction(); $this->oActions->Location('./'); return ''; } /** * @param string $sTitle * @param string $sDesc * * @return mixed */ public function ErrorTemplates($sTitle, $sDesc, $bShowBackLink = true) { return strtr(file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Error.html'), array( '{{BaseWebStaticPath}}' => \RainLoop\Utils::WebStaticPath(), '{{ErrorTitle}}' => $sTitle, '{{ErrorHeader}}' => $sTitle, '{{ErrorDesc}}' => $sDesc, '{{BackLinkVisibilityStyle}}' => $bShowBackLink ? 'display:inline-block' : 'display:none', '{{BackLink}}' => $this->oActions->StaticI18N('STATIC/BACK_LINK'), '{{BackHref}}' => './' )); } /** * @param string $sTitle * @param string $sDesc * * @return string */ private function localError($sTitle, $sDesc) { @header('Content-Type: text/html; charset=utf-8'); return $this->ErrorTemplates($sTitle, \nl2br($sDesc)); } /** * @param bool $bAdmin = true * @param string $sAdd = '' * * @return string */ private function localAppData($bAdmin = false, $sAdd = '') { @\header('Content-Type: application/javascript; charset=utf-8'); $this->oHttp->ServerNoCache(); $sAuthAccountHash = ''; if (!$bAdmin && 0 === \strlen($this->oActions->GetSpecAuthLogoutTokenWithDeletion())) { $sAuthAccountHash = $this->oActions->GetSpecAuthTokenWithDeletion(); if (empty($sAuthAccountHash)) { $sAuthAccountHash = $this->oActions->GetSpecAuthToken(); } if (empty($sAuthAccountHash)) { $oAccount = $this->oActions->GetAccountFromSignMeToken(); if ($oAccount) { try { $this->oActions->CheckMailConnection($oAccount); $this->oActions->AuthToken($oAccount); $sAuthAccountHash = $this->oActions->GetSpecAuthToken(); } catch (\Exception $oException) { $oException = null; $this->oActions->ClearSignMeData($oAccount); } } } $this->oActions->SetSpecAuthToken($sAuthAccountHash); } $sResult = $this->compileAppData($this->oActions->AppData($bAdmin, 0 === \strpos($sAdd, 'mobile'), '1' === \substr($sAdd, -1), $sAuthAccountHash), false); $this->Logger()->Write($sResult, \MailSo\Log\Enumerations\Type::INFO, 'APPDATA'); return $sResult; } /** * @param bool $bAdmin = false * @param bool $bJsOutput = true * * @return string */ public function compileTemplates($bAdmin = false, $bJsOutput = true) { $aTemplates = array(); \RainLoop\Utils::CompileTemplates($aTemplates, APP_VERSION_ROOT_PATH.'app/templates/Views/Components', 'Component'); \RainLoop\Utils::CompileTemplates($aTemplates, APP_VERSION_ROOT_PATH.'app/templates/Views/'.($bAdmin ? 'Admin' : 'User')); \RainLoop\Utils::CompileTemplates($aTemplates, APP_VERSION_ROOT_PATH.'app/templates/Views/Common'); $this->oActions->Plugins()->CompileTemplate($aTemplates, $bAdmin); $sHtml = ''; foreach ($aTemplates as $sName => $sFile) { $sName = \preg_replace('/[^a-zA-Z0-9]/', '', $sName); $sHtml .= ''; } unset($aTemplates); return $bJsOutput ? 'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml), $this->Logger()).';' : $sHtml; } /** * @param string $sLanguage * * @return string */ private function convertLanguageNameToMomentLanguageName($sLanguage) { $aHelper = array('en_gb' => 'en-gb', 'fr_ca' => 'fr-ca', 'pt_br' => 'pt-br', 'uk_ua' => 'ua', 'zh_cn' => 'zh-cn', 'zh_tw' => 'zh-tw', 'fa_ir' => 'fa'); return isset($aHelper[$sLanguage]) ? $aHelper[$sLanguage] : \substr($sLanguage, 0, 2); } /** * @param string $sLanguage * @param bool $bAdmin = false * @param bool $bWrapByScriptTag = true * * @return string */ private function compileLanguage($sLanguage, $bAdmin = false, $bWrapByScriptTag = true) { $aResultLang = array(); $sMoment = 'window.moment && window.moment.locale && window.moment.locale(\'en\');'; $sMomentFileName = APP_VERSION_ROOT_PATH.'app/localization/moment/'. $this->convertLanguageNameToMomentLanguageName($sLanguage).'.js'; if (\file_exists($sMomentFileName)) { $sMoment = \file_get_contents($sMomentFileName); $sMoment = \preg_replace('/\/\/[^\n]+\n/', '', $sMoment); } \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/langs.yml', $aResultLang); \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/'. ($bAdmin ? 'admin' : 'webmail').'/_source.en.yml', $aResultLang); \RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/localization/'. ($bAdmin ? 'admin' : 'webmail').'/'.$sLanguage.'.yml', $aResultLang); $this->Plugins()->ReadLang($sLanguage, $aResultLang); $sLangJs = ''; $aLangKeys = \array_keys($aResultLang); foreach ($aLangKeys as $sKey) { $sString = isset($aResultLang[$sKey]) ? $aResultLang[$sKey] : $sKey; if (\is_array($sString)) { $sString = \implode("\n", $sString); } $sLangJs .= '"'.\str_replace('"', '\\"', \str_replace('\\', '\\\\', $sKey)).'":' .'"'.\str_replace(array("\r", "\n", "\t"), array('\r', '\n', '\t'), \str_replace('"', '\\"', \str_replace('\\', '\\\\', $sString))).'",'; } $sResult = empty($sLangJs) ? 'null' : '{'.\substr($sLangJs, 0, -1).'}'; return ($bWrapByScriptTag ? '' : '') ; } /** * @param array $aAppData * @param bool $bWrapByScriptTag = true * * @return string */ private function compileAppData($aAppData, $bWrapByScriptTag = true) { return ($bWrapByScriptTag ? '' : '') ; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/RainLoop/Settings.php000066400000000000000000000017731361462701300263640ustar00rootroot00000000000000aData = array(); $this->bLocal = !!$bLocal; } /** * @param array $aData * * @return \RainLoop\Settings */ public function InitData($aData) { if (\is_array($aData)) { $this->aData = $aData; } return $this; } /** * @return array */ public function DataAsArray() { return $this->aData; } /** * @return bool */ public function IsLocal() { return $this->bLocal; } /** * @param string $sName * @param mixed $mDefValue = null * * @return mixed */ public function GetConf($sName, $mDefValue = null) { return isset($this->aData[$sName]) ? $this->aData[$sName] : $mDefValue; } /** * @param string $sName * @param mixed $mValue * * @return void */ public function SetConf($sName, $mValue) { $this->aData[$sName] = $mValue; } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/RainLoop/Social.php000066400000000000000000000624261361462701300260000ustar00rootroot00000000000000oHttp = $oHttp; $this->oActions = $oActions; } /** * @return bool */ public function GoogleDisconnect($oAccount) { $oGoogle = $this->GoogleConnector(); if ($oAccount && $oGoogle) { $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); $sEncodedeData = $oSettings->GetConf('GoogleAccessToken', ''); if (!empty($sEncodedeData)) { $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedeData); if (\is_array($aData) && !empty($aData['id'])) { $this->oActions->StorageProvider()->Clear(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->GoogleUserLoginStorageKey($oGoogle, $aData['id']) ); } } $oSettings->SetConf('GoogleAccessToken', ''); $oSettings->SetConf('GoogleSocialName', ''); return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); } return false; } /** * @return bool */ public function FacebookDisconnect($oAccount) { $oFacebook = $this->FacebookConnector($oAccount ? $oAccount : null); if ($oAccount && $oFacebook) { $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); $sEncodedeData = $oSettings->GetConf('FacebookAccessToken', ''); if (!empty($sEncodedeData)) { $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedeData); if (is_array($aData) && isset($aData['id'])) { $this->oActions->StorageProvider()->Clear(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->FacebookUserLoginStorageKey($oFacebook, $aData['id']) ); } } $oSettings->SetConf('FacebookAccessToken', ''); $oSettings->SetConf('FacebookSocialName', ''); return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); } return false; } /** * @return bool */ public function TwitterDisconnect($oAccount) { $oTwitter = $this->TwitterConnector(); if ($oAccount && $oTwitter) { $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); $sEncodedData = $oSettings->GetConf('TwitterAccessToken', ''); if (!empty($sEncodedData)) { $aData = \RainLoop\Utils::DecodeKeyValues($sEncodedData); if (is_array($aData) && isset($aData['id'])) { $this->oActions->StorageProvider()->Clear(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->TwitterUserLoginStorageKey($oTwitter, $aData['id']) ); } } $oSettings->SetConf('TwitterAccessToken', ''); $oSettings->SetConf('TwitterSocialName', ''); return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); } return false; } /** * @return string */ public function popupServiceResult($sTypeStr, $sLoginUrl, $bLogin, $iErrorCode) { $sResult = ''; $bAppCssDebug = !!$this->oActions->Config()->Get('labs', 'use_app_debug_css', false); $sIcon = $sTypeStr; if ('facebook' === $sIcon) { $sIcon = $sIcon.'-alt'; } if ($sLoginUrl) { $this->oHttp->ServerNoCache(); @\header('Content-Type: text/html; charset=utf-8'); $sResult = \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Social.html'), array( '{{RefreshMeta}}' => '', '{{Stylesheet}}' => $this->oActions->StaticPath('css/social'.($bAppCssDebug ? '' : '.min').'.css'), '{{Icon}}' => $sIcon, '{{Script}}' => '' )); } else { $this->oHttp->ServerNoCache(); @\header('Content-Type: text/html; charset=utf-8'); $sCallBackType = $bLogin ? '_login' : ''; $sConnectionFunc = 'rl_'.\md5(\RainLoop\Utils::GetConnectionToken()).'_'.$sTypeStr.$sCallBackType.'_service'; $sResult = \strtr(\file_get_contents(APP_VERSION_ROOT_PATH.'app/templates/Social.html'), array( '{{RefreshMeta}}' => '', '{{Stylesheet}}' => $this->oActions->StaticPath('css/social'.($bAppCssDebug ? '' : '.min').'.css'), '{{Icon}}' => $sIcon, '{{Script}}' => '' )); } return $sResult; } /** * @return string */ public function GoogleRefreshToken($sAccessToken, $sRefreshToken) { $oGoogle = $this->GoogleConnector(); if ($oGoogle) { $aRefreshTokenResponse = $oGoogle->getAccessToken('https://accounts.google.com/o/oauth2/token', 'refresh_token', array( 'refresh_token' => $sRefreshToken )); return !empty($aRefreshTokenResponse['result']['access_token']) ? $aRefreshTokenResponse['result']['access_token'] : ''; } return $sAccessToken; } /** * @return string */ public function GooglePopupService($bGmail = false) { $sLoginUrl = ''; $oAccount = null; $bLogin = false; $iErrorCode = \RainLoop\Notifications::UnknownError; try { $oGoogle = $this->GoogleConnector(); if ($this->oHttp->HasQuery('error')) { $iErrorCode = ('access_denied' === $this->oHttp->GetQuery('error')) ? \RainLoop\Notifications::SocialGoogleLoginAccessDisable : \RainLoop\Notifications::UnknownError; } else if ($oGoogle) { $oAccount = $this->oActions->GetAccount(); $bLogin = !$oAccount; $sCheckToken = ''; $sCheckAuth = ''; $sState = $this->oHttp->GetQuery('state'); if (!empty($sState)) { $aParts = explode('|', $sState, 3); if (!$bGmail) { $bGmail = !empty($aParts[0]) ? '1' === (string) $aParts[0] : false; } $sCheckToken = !empty($aParts[1]) ? $aParts[1] : ''; $sCheckAuth = !empty($aParts[2]) ? $aParts[2] : ''; } $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialGoogle'; if (!$this->oHttp->HasQuery('code')) { $aParams = array( 'scope' => \trim(\implode(' ', array( 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile', $bGmail ? 'https://mail.google.com/' : '' ))), 'state' => ($bGmail ? '1' : '0').'|'.\RainLoop\Utils::GetConnectionToken().'|'.$this->oActions->GetSpecAuthToken(), 'response_type' => 'code' ); if ($bGmail) { $aParams['access_type'] = 'offline'; // $aParams['prompt'] = 'consent'; } $sLoginUrl = $oGoogle->getAuthenticationUrl('https://accounts.google.com/o/oauth2/auth', $sRedirectUrl, $aParams); } else if (!empty($sState) && $sCheckToken === \RainLoop\Utils::GetConnectionToken()) { if (!empty($sCheckAuth)) { $this->oActions->SetSpecAuthToken($sCheckAuth); $oAccount = $this->oActions->GetAccount(); $bLogin = !$oAccount; } $aAuthorizationCodeResponse = $oGoogle->getAccessToken('https://accounts.google.com/o/oauth2/token', 'authorization_code', array( 'code' => $this->oHttp->GetQuery('code'), 'redirect_uri' => $sRedirectUrl )); $sAccessToken = !empty($aAuthorizationCodeResponse['result']['access_token']) ? $aAuthorizationCodeResponse['result']['access_token'] : ''; $sRefreshToken = !empty($aAuthorizationCodeResponse['result']['refresh_token']) ? $aAuthorizationCodeResponse['result']['refresh_token'] : ''; if (!empty($sAccessToken)) { $oGoogle->setAccessToken($sAccessToken); $aUserInfoResponse = $oGoogle->fetch('https://www.googleapis.com/oauth2/v2/userinfo'); if (!empty($aUserInfoResponse['result']['id'])) { if ($bLogin) { $aUserData = null; if ($bGmail) { if (!empty($aUserInfoResponse['result']['email'])) { $aUserData = array( 'Email' => $aUserInfoResponse['result']['email'], 'Password' => \RainLoop\Model\Account::GenerateTokensPassword($sAccessToken, $sRefreshToken) ); } } else { $sUserData = $this->oActions->StorageProvider()->Get(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->GoogleUserLoginStorageKey($oGoogle, $aUserInfoResponse['result']['id']) ); $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); } if ($aUserData && \is_array($aUserData) && !empty($aUserData['Email']) && isset($aUserData['Password'])) { $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); } else { $iErrorCode = \RainLoop\Notifications::SocialGoogleLoginAccessDisable; } } if ($oAccount && !$bGmail) { $aUserData = array( 'ID' => $aUserInfoResponse['result']['id'], 'Email' => $oAccount->Email(), 'Password' => $oAccount->Password() ); $sSocialName = !empty($aUserInfoResponse['result']['name']) ? $aUserInfoResponse['result']['name'] : ''; $sSocialName .= !empty($aUserInfoResponse['result']['email']) ? ' ('.$aUserInfoResponse['result']['email'].')' : ''; $sSocialName = \trim($sSocialName); $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); $oSettings->SetConf('GoogleAccessToken', \RainLoop\Utils::EncodeKeyValues(array( 'id' => $aUserInfoResponse['result']['id'] ))); $oSettings->SetConf('GoogleSocialName', $sSocialName); $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); $this->oActions->StorageProvider()->Put(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->GoogleUserLoginStorageKey($oGoogle, $aUserInfoResponse['result']['id']), \RainLoop\Utils::EncodeKeyValues($aUserData)); $iErrorCode = 0; } } } } } } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } return $this->popupServiceResult('google', $sLoginUrl, $bLogin, $iErrorCode); } /** * @return string */ public function FacebookPopupService() { $sLoginUrl = ''; $sSocialName = ''; $mData = false; $sUserData = ''; $aUserData = false; $oAccount = null; $bLogin = false; $iErrorCode = \RainLoop\Notifications::UnknownError; if (0 === \strlen($this->oActions->GetSpecAuthToken()) && $this->oHttp->HasQuery('rlah')) { $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); } $oAccount = $this->oActions->GetAccount(); $sRedirectUrl = ''; $oFacebook = $this->FacebookConnector($oAccount, $sRedirectUrl); if ($oFacebook) { try { $oRedirectLoginHelper = $oFacebook->getRedirectLoginHelper(); $oAccessToken = $oRedirectLoginHelper->getAccessToken(); if (!$oAccessToken && !$this->oHttp->HasQuery('state')) { $sLoginUrl = $oFacebook->getRedirectLoginHelper()->getLoginUrl($sRedirectUrl.'&display=popup'); } else if ($oAccessToken) { $oResponse = $oFacebook->get('/me?fields=id,name', (string) $oAccessToken); $oGraphUser = $oResponse->getGraphUser(); $mData = $oGraphUser->getId(); $sSocialName = $oGraphUser->getName(); if ($oAccount) { if ($mData && 0 < \strlen($mData)) { $aUserData = array( 'id' => $mData, 'Email' => $oAccount->Email(), 'Password' => $oAccount->Password() ); $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); $oSettings->SetConf('FacebookSocialName', $sSocialName); $oSettings->SetConf('FacebookAccessToken', \RainLoop\Utils::EncodeKeyValues(array('id' => $mData))); $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); $this->oActions->StorageProvider()->Put(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->FacebookUserLoginStorageKey($oFacebook, $mData), \RainLoop\Utils::EncodeKeyValues($aUserData)); $iErrorCode = 0; } } else { $bLogin = true; if ($mData && 0 < \strlen($mData)) { $sUserData = $this->oActions->StorageProvider()->Get(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->FacebookUserLoginStorageKey($oFacebook, $mData)); if ($sUserData) { $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); } } if ($aUserData && \is_array($aUserData) && !empty($aUserData['Email']) && isset($aUserData['Password'])) { $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); } else { $iErrorCode = \RainLoop\Notifications::SocialFacebookLoginAccessDisable; } } } } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } } return $this->popupServiceResult('facebook', $sLoginUrl, $bLogin, $iErrorCode); } /** * @return string */ public function TwitterPopupService() { $sLoginUrl = ''; $sSocialName = ''; $oAccount = null; $bLogin = false; $iErrorCode = \RainLoop\Notifications::UnknownError; $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialTwitter'; if (0 < strlen($this->oActions->GetSpecAuthToken())) { $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); } else if ($this->oHttp->HasQuery('rlah')) { $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); } try { $oTwitter = $this->TwitterConnector(); if ($oTwitter) { $sSessionKey = \implode('_', array('twitter', \md5($oTwitter->config['consumer_secret']), \md5(\RainLoop\Utils::GetConnectionToken()), 'AuthSessionData')); $oAccount = $this->oActions->GetAccount(); if ($oAccount) { if (isset($_REQUEST['oauth_verifier'])) { $sAuth = $this->oActions->Cacher()->Get($sSessionKey); $oAuth = $sAuth ? \json_decode($sAuth, true) : null; if ($oAuth && !empty($oAuth['oauth_token']) && !empty($oAuth['oauth_token_secret'])) { $oTwitter->config['user_token'] = $oAuth['oauth_token']; $oTwitter->config['user_secret'] = $oAuth['oauth_token_secret']; $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/access_token', ''), array( 'oauth_callback' => $sRedirectUrl, 'oauth_verifier' => $_REQUEST['oauth_verifier'] )); if (200 === $iCode && isset($oTwitter->response['response'])) { $aAccessToken = $oTwitter->extract_params($oTwitter->response['response']); if ($aAccessToken && isset($aAccessToken['oauth_token']) && !empty($aAccessToken['user_id'])) { $aAccessToken['id'] = $aAccessToken['user_id']; $oTwitter->config['user_token'] = $aAccessToken['oauth_token']; $oTwitter->config['user_secret'] = $aAccessToken['oauth_token_secret']; $sSocialName = !empty($aAccessToken['screen_name']) ? '@'.$aAccessToken['screen_name'] : $aAccessToken['user_id']; $sSocialName = \trim($sSocialName); $aUserData = array( 'id' => $aAccessToken['id'], 'Email' => $oAccount->Email(), 'Password' => $oAccount->Password() ); $oSettings = $this->oActions->SettingsProvider()->Load($oAccount); $oSettings->SetConf('TwitterAccessToken', \RainLoop\Utils::EncodeKeyValues($aAccessToken)); $oSettings->SetConf('TwitterSocialName', $sSocialName); $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); $this->oActions->StorageProvider()->Put(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->TwitterUserLoginStorageKey($oTwitter, $aAccessToken['id']), \RainLoop\Utils::EncodeKeyValues($aUserData)); $iErrorCode = 0; } } } } else { $aParams = array( 'oauth_callback' => $sRedirectUrl, 'x_auth_access_type' => 'read' ); $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/request_token', ''), $aParams); if (200 === $iCode && isset($oTwitter->response['response'])) { $oAuth = $oTwitter->extract_params($oTwitter->response['response']); if (!empty($oAuth['oauth_token'])) { $this->oActions->Cacher()->Set($sSessionKey, \json_encode($oAuth)); $sLoginUrl = $oTwitter->url('oauth/authenticate', '').'?oauth_token='.$oAuth['oauth_token']; } } } } else { $bLogin = true; if (isset($_REQUEST['oauth_verifier'])) { $sAuth = $this->oActions->Cacher()->Get($sSessionKey); $oAuth = $sAuth ? \json_decode($sAuth, true) : null; if ($oAuth && !empty($oAuth['oauth_token']) && !empty($oAuth['oauth_token_secret'])) { $oTwitter->config['user_token'] = $oAuth['oauth_token']; $oTwitter->config['user_secret'] = $oAuth['oauth_token_secret']; $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/access_token', ''), array( 'oauth_callback' => $sRedirectUrl, 'oauth_verifier' => $_REQUEST['oauth_verifier'] )); if (200 === $iCode && isset($oTwitter->response['response'])) { $aAccessToken = $oTwitter->extract_params($oTwitter->response['response']); if ($aAccessToken && isset($aAccessToken['oauth_token']) && !empty($aAccessToken['user_id'])) { $sUserData = $this->oActions->StorageProvider()->Get(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, $this->TwitterUserLoginStorageKey($oTwitter, $aAccessToken['user_id']) ); $aUserData = \RainLoop\Utils::DecodeKeyValues($sUserData); if ($aUserData && \is_array($aUserData) && !empty($aUserData['Email']) && isset($aUserData['Password'])) { $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); } else { $iErrorCode = \RainLoop\Notifications::SocialTwitterLoginAccessDisable; } $this->oActions->Cacher()->Delete($sSessionKey); } } } } else { $aParams = array( 'oauth_callback' => $sRedirectUrl, 'x_auth_access_type' => 'read' ); $iCode = $oTwitter->request('POST', $oTwitter->url('oauth/request_token', ''), $aParams); if (200 === $iCode && isset($oTwitter->response['response'])) { $oAuth = $oTwitter->extract_params($oTwitter->response['response']); if (!empty($oAuth['oauth_token'])) { $this->oActions->Cacher()->Set($sSessionKey, \json_encode($oAuth)); $sLoginUrl = $oTwitter->url('oauth/authenticate', '').'?oauth_token='.$oAuth['oauth_token']; } } } } } } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } return $this->popupServiceResult('twitter', $sLoginUrl, $bLogin, $iErrorCode); } /** * @return \OAuth2\Client|null */ public function GoogleConnector() { $oGoogle = false; $oConfig = $this->oActions->Config(); if ($oConfig->Get('social', 'google_enable', false) && '' !== \trim($oConfig->Get('social', 'google_client_id', '')) && '' !== \trim($oConfig->Get('social', 'google_client_secret', ''))) { include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/Client.php'; include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/IGrantType.php'; include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php'; include_once APP_VERSION_ROOT_PATH.'app/libraries/PHP-OAuth2/GrantType/RefreshToken.php'; try { $oGoogle = new \OAuth2\Client( \trim($oConfig->Get('social', 'google_client_id', '')), \trim($oConfig->Get('social', 'google_client_secret', ''))); $sProxy = $this->oActions->Config()->Get('labs', 'curl_proxy', ''); if (0 < \strlen($sProxy)) { $oGoogle->setCurlOption(CURLOPT_PROXY, $sProxy); $sProxyAuth = $this->oActions->Config()->Get('labs', 'curl_proxy_auth', ''); if (0 < \strlen($sProxyAuth)) { $oGoogle->setCurlOption(CURLOPT_PROXYUSERPWD, $sProxyAuth); } } } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } } return false === $oGoogle ? null : $oGoogle; } /** * @return \tmhOAuth|null */ public function TwitterConnector() { $oTwitter = false; $oConfig = $this->oActions->Config(); if ($oConfig->Get('social', 'twitter_enable', false) && '' !== \trim($oConfig->Get('social', 'twitter_consumer_key', '')) && '' !== \trim($oConfig->Get('social', 'twitter_consumer_secret', ''))) { include_once APP_VERSION_ROOT_PATH.'app/libraries/tmhOAuth/tmhOAuth.php'; include_once APP_VERSION_ROOT_PATH.'app/libraries/tmhOAuth/tmhUtilities.php'; $sProxy = $this->oActions->Config()->Get('labs', 'curl_proxy', ''); $sProxyAuth = $this->oActions->Config()->Get('labs', 'curl_proxy_auth', ''); $oTwitter = new \tmhOAuth(array( 'consumer_key' => \trim($oConfig->Get('social', 'twitter_consumer_key', '')), 'consumer_secret' => \trim($oConfig->Get('social', 'twitter_consumer_secret', '')), 'curl_proxy' => 0 < \strlen($sProxy) ? $sProxy : false, 'curl_proxyuserpwd' => 0 < \strlen($sProxyAuth) ? $sProxyAuth : false )); } return false === $oTwitter ? null : $oTwitter; } /** * @param \RainLoop\Model\Account|null $oAccount = null * @param string $sRedirectUrl = '' * * @return \RainLoop\Common\RainLoopFacebookRedirectLoginHelper|null */ public function FacebookConnector($oAccount = null, &$sRedirectUrl = '') { $oFacebook = false; $oConfig = $this->oActions->Config(); $sAppID = \trim($oConfig->Get('social', 'fb_app_id', '')); $sAppSecret = \trim($oConfig->Get('social', 'fb_app_secret', '')); if (\version_compare(PHP_VERSION, '5.4.0', '>=') && $oConfig->Get('social', 'fb_enable', false) && '' !== $sAppID && '' !== \trim($oConfig->Get('social', 'fb_app_secret', '')) && \class_exists('Facebook\Facebook') ) { $sRedirectUrl = $this->oHttp->GetFullUrl().'?SocialFacebook'; if (0 < \strlen($this->oActions->GetSpecAuthToken())) { $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); } else if ($this->oHttp->HasQuery('rlah')) { $this->oActions->SetSpecAuthToken($this->oHttp->GetQuery('rlah', '')); $sRedirectUrl .= '&rlah='.$this->oActions->GetSpecAuthToken(); } try { $oAccount = $this->oActions->GetAccount(); $oFacebook = new \Facebook\Facebook(array( 'app_id' => $sAppID, // Replace {app-id} with your app id 'app_secret' => $sAppSecret, 'persistent_data_handler' => new \RainLoop\Common\FacebookRainLoopPersistentDataHandler( $oAccount, \RainLoop\Utils::GetConnectionToken(), $this->oActions->StorageProvider() ) )); } catch (\Exception $oException) { $this->oActions->Logger()->WriteException($oException, \MailSo\Log\Enumerations\Type::ERROR); } } return false === $oFacebook ? null : $oFacebook; } /** * @return string */ public function GoogleUserLoginStorageKey($oGoogle, $sGoogleUserId) { return \implode('_', array('google', \md5($oGoogle->getClientId()), $sGoogleUserId, APP_SALT)); } /** * @return string */ public function FacebookUserLoginStorageKey($oFacebook, $sFacebookUserId) { return \implode('_', array('facebookNew', \md5($oFacebook->getApp()->getId()), $sFacebookUserId, APP_SALT)); } /** * @return string */ public function TwitterUserLoginStorageKey($oTwitter, $sTwitterUserId) { return \implode('_', array('twitter_2', \md5($oTwitter->config['consumer_secret']), $sTwitterUserId, APP_SALT)); } /** * @param \RainLoop\Model\Account|null $oAccount * @param string $sEmail * @param string $sPassword * * @return int */ private function loginProcess(&$oAccount, $sEmail, $sPassword) { $iErrorCode = \RainLoop\Notifications::UnknownError; try { $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword, '', '', false, true); if ($oAccount instanceof \RainLoop\Model\Account) { $this->oActions->AuthToken($oAccount); $iErrorCode = 0; } else { $oAccount = null; $iErrorCode = \RainLoop\Notifications::AuthError; } } catch (\RainLoop\Exceptions\ClientException $oException) { $iErrorCode = $oException->getCode(); } catch (\Exception $oException) { unset($oException); $iErrorCode = \RainLoop\Notifications::UnknownError; } return $iErrorCode; } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php000066400000000000000000000352731361462701300256660ustar00rootroot00000000000000 $sLine) { $sEncrypted = ''; \openssl_public_encrypt($sLine, $sEncrypted, $oPubKey); $aString[$iIndex] = $sEncrypted; } $aString[] = $sKey; $sResult = @\serialize($aString); \openssl_free_key($oPubKey); } \openssl_free_key($oPrivKey); } return $sResult; } /** * @param string $sString * @param string $sKey = '' * * @return string|false */ static public function DecryptStringRSA($sString, $sKey = '') { $sResult = ''; $sKey = \md5($sKey); $sPrivateKey = \RainLoop\Utils::RsaPrivateKey(); if (!empty($sPrivateKey) && !empty($sString)) { $oPrivKey = \openssl_pkey_get_private($sPrivateKey); $aString = @\unserialize($sString); if (\is_array($aString)) { if ($sKey === \array_pop($aString)) { foreach ($aString as $iIndex => $sLine) { $sDecrypted = ''; \openssl_private_decrypt($sLine, $sDecrypted, $oPrivKey); $aString[$iIndex] = $sDecrypted; } $sResult = \implode('', $aString); } } \openssl_free_key($oPrivKey); } return $sResult; } /** * @param string $sString * @param string $sKey * * @return string */ static public function EncryptString($sString, $sKey) { return \MailSo\Base\Crypt::XxteaEncrypt($sString, $sKey); } /** * @param string $sEncriptedString * @param string $sKey * * @return string */ static public function DecryptString($sEncriptedString, $sKey) { return \MailSo\Base\Crypt::XxteaDecrypt($sEncriptedString, $sKey); } /** * @param string $sString * @param string $sKey * * @return string */ static public function EncryptStringQ($sString, $sKey) { // if (\MailSo\Base\Utils::FunctionExistsAndEnabled('openssl_pkey_get_private')) // { // return \RainLoop\Utils::EncryptStringRSA($sString, // $sKey.'Q'.\RainLoop\Utils::GetShortToken()); // } return \MailSo\Base\Crypt::XxteaEncrypt($sString, $sKey.'Q'.\RainLoop\Utils::GetShortToken()); } /** * @param string $sEncriptedString * @param string $sKey * * @return string */ static public function DecryptStringQ($sEncriptedString, $sKey) { // if (\MailSo\Base\Utils::FunctionExistsAndEnabled('openssl_pkey_get_private')) // { // return \RainLoop\Utils::DecryptStringRSA($sEncriptedString, // $sKey.'Q'.\RainLoop\Utils::GetShortToken()); // } return \MailSo\Base\Crypt::XxteaDecrypt($sEncriptedString, $sKey.'Q'.\RainLoop\Utils::GetShortToken()); } /** * @param array $aValues * @param string $sCustomKey = '' * * @return string */ static public function EncodeKeyValues(array $aValues, $sCustomKey = '') { return \MailSo\Base\Utils::UrlSafeBase64Encode( \RainLoop\Utils::EncryptString(@\serialize($aValues), \md5(APP_SALT.$sCustomKey))); } /** * @param string $sEncodedValues * @param string $sCustomKey = '' * * @return array */ static public function DecodeKeyValues($sEncodedValues, $sCustomKey = '') { $aResult = @\unserialize( \RainLoop\Utils::DecryptString( \MailSo\Base\Utils::UrlSafeBase64Decode($sEncodedValues), \md5(APP_SALT.$sCustomKey))); return \is_array($aResult) ? $aResult : array(); } /** * @param array $aValues * @param string $sCustomKey = '' * * @return string */ static public function EncodeKeyValuesQ(array $aValues, $sCustomKey = '') { return \MailSo\Base\Utils::UrlSafeBase64Encode( \RainLoop\Utils::EncryptStringQ( @\serialize($aValues), \md5(APP_SALT.$sCustomKey))); } /** * @param string $sEncodedValues * @param string $sCustomKey = '' * * @return array */ static public function DecodeKeyValuesQ($sEncodedValues, $sCustomKey = '') { $aResult = @\unserialize( \RainLoop\Utils::DecryptStringQ( \MailSo\Base\Utils::UrlSafeBase64Decode($sEncodedValues), \md5(APP_SALT.$sCustomKey))); return \is_array($aResult) ? $aResult : array(); } /** * @return string */ static public function GetConnectionToken() { $sKey = 'rltoken'; $sToken = \RainLoop\Utils::GetCookie($sKey, null); if (null === $sToken) { $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); } return \md5('Connection'.APP_SALT.$sToken.'Token'.APP_SALT); } /** * @return string */ static public function Fingerprint() { return \md5(empty($_SERVER['HTTP_USER_AGENT']) ? 'RainLoopFingerprint' : $_SERVER['HTTP_USER_AGENT']); } /** * @return string */ static public function GetShortToken() { $sKey = 'rlsession'; $sToken = \RainLoop\Utils::GetCookie($sKey, null); if (null === $sToken) { $sToken = \MailSo\Base\Utils::Md5Rand(APP_SALT); \RainLoop\Utils::SetCookie($sKey, $sToken, 0); } return \md5('Session'.APP_SALT.$sToken.'Token'.APP_SALT); } /** * @return void */ static public function UpdateConnectionToken() { $sKey = 'rltoken'; $sToken = \RainLoop\Utils::GetCookie($sKey, ''); if (!empty($sToken)) { \RainLoop\Utils::SetCookie($sKey, $sToken, \time() + 60 * 60 * 24 * 30); } } /** * @return string */ static public function GetCsrfToken() { return \md5('Csrf'.APP_SALT.self::GetConnectionToken().'Token'.APP_SALT); } /** * @param string $sPath * * @return string */ public static function PathMD5($sPath) { $sResult = ''; if (@\is_dir($sPath)) { $oDirIterator = new \RecursiveDirectoryIterator($sPath); $oIterator = new \RecursiveIteratorIterator($oDirIterator, \RecursiveIteratorIterator::SELF_FIRST); foreach ($oIterator as $oFile) { $sResult = \md5($sResult.($oFile->isFile() ? \md5_file($oFile) : $oFile)); } } return $sResult; } /** * @param string $sFileName * @param array $aResultLang * * @return void */ public static function ReadAndAddLang($sFileName, &$aResultLang) { if (\file_exists($sFileName)) { $isYml = '.yml' === substr($sFileName, -4); if ($isYml) { $aLang = \spyc_load(\str_replace(array(': >-', ': |-', ': |+'), array(': >', ': |', ': |'), \file_get_contents($sFileName))); if (\is_array($aLang)) { \reset($aLang); $sLangKey = key($aLang); if (isset($aLang[$sLangKey]) && is_array($aLang[$sLangKey])) { $aLang = $aLang[$sLangKey]; } else { $aLang = null; } } } else { $aLang = \RainLoop\Utils::CustomParseIniFile($sFileName, true); } if (\is_array($aLang)) { foreach ($aLang as $sKey => $mValue) { if (\is_array($mValue)) { foreach ($mValue as $sSecKey => $mSecValue) { $aResultLang[$sKey.'/'.$sSecKey] = $mSecValue; } } else { $aResultLang[$sKey] = $mValue; } } } } } /** * @param string $sDir * @param string $sType = '' * @return array */ public static function FolderFiles($sDir, $sType = '') { $aResult = array(); if (@\is_dir($sDir)) { if (false !== ($rDirHandle = @\opendir($sDir))) { while (false !== ($sFile = @\readdir($rDirHandle))) { if (empty($sType) || $sType === \substr($sFile, -\strlen($sType))) { if (\is_file($sDir.'/'.$sFile)) { $aResult[] = $sFile; } } } @\closedir($rDirHandle); } } return $aResult; } /** * @param string $sHtml * * @return string */ public static function ClearHtmlOutput($sHtml) { // return $sHtml; return \trim(\str_replace('> <', '><', \str_replace('" />', '"/>', \preg_replace('/[\s]+ /i', ' ', \preg_replace('/ [\s]+/i', ' ', \preg_replace('/[\r\n\t]+/', ' ', $sHtml )))))); } /** * @param string $sKey * @return bool */ public static function FastCheck($sKey) { $bResult = false; $aMatches = array(); if (!empty($sKey) && 0 < \strlen($sKey) && \preg_match('/^(RL[\d]+)\-(.+)\-([^\-]+)$/', $sKey, $aMatches) && 3 === \count($aMatches)) { $bResult = $aMatches[3] === \strtoupper(\base_convert(\crc32(\md5( $aMatches[1].'-'.$aMatches[2].'-')), 10, 32)); } return $bResult; } /** * @param array $aList * @param string $sDirName * @param string $sNameSuffix = '' */ public static function CompileTemplates(&$aList, $sDirName, $sNameSuffix = '') { if (\file_exists($sDirName)) { $aFileList = \RainLoop\Utils::FolderFiles($sDirName, '.html'); foreach ($aFileList as $sName) { $sTemplateName = \substr($sName, 0, -5).$sNameSuffix; $aList[$sTemplateName] = $sDirName.'/'.$sName; } } } /** * @param string $sName * @param mixed $mDefault = null * @return mixed */ public static function GetCookie($sName, $mDefault = null) { if (null === \RainLoop\Utils::$Cookies) { \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); } return isset(\RainLoop\Utils::$Cookies[$sName]) ? \RainLoop\Utils::$Cookies[$sName] : $mDefault; } public static function SetCookie($sName, $sValue = '', $iExpire = 0, $sPath = null, $sDomain = null, $bSecure = null, $bHttpOnly = true) { if (null === \RainLoop\Utils::$Cookies) { \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); } if (null === $sPath) { $sPath = \RainLoop\Utils::$CookieDefaultPath; $sPath = $sPath && 0 < \strlen($sPath) ? $sPath : null; } if (null === $bSecure) { $bSecure = \RainLoop\Utils::$CookieDefaultSecure; } \RainLoop\Utils::$Cookies[$sName] = $sValue; @\setcookie($sName, $sValue, $iExpire, $sPath, $sDomain, $bSecure, $bHttpOnly); } public static function ClearCookie($sName) { if (null === \RainLoop\Utils::$Cookies) { \RainLoop\Utils::$Cookies = is_array($_COOKIE) ? $_COOKIE : array(); } $sPath = \RainLoop\Utils::$CookieDefaultPath; $sPath = $sPath && 0 < \strlen($sPath) ? $sPath : null; unset(\RainLoop\Utils::$Cookies[$sName]); @\setcookie($sName, '', \time() - 3600 * 24 * 30, $sPath); } /** * @return bool */ public static function IsOwnCloud() { return isset($_ENV['RAINLOOP_OWNCLOUD']) && $_ENV['RAINLOOP_OWNCLOUD'] && \class_exists('OC'); } /** * @return bool */ public static function IsOwnCloudLoggedIn() { return self::IsOwnCloud() && \class_exists('OCP\User') && \OCP\User::isLoggedIn(); } /** * @param string $sV * @param bool $bEncode = false * * @return string */ public static function UrlEncode($sV, $bEncode = false) { return $bEncode ? \urlencode($sV) : $sV; } /** * @return string */ public static function WebPath() { $sAppPath = ''; if (\RainLoop\Utils::IsOwnCloud()) { if (\class_exists('OC_App')) { $sAppPath = \rtrim(\trim(\OC_App::getAppWebPath('rainloop')), '\\/').'/app/'; } if (empty($sAppPath)) { $sUrl = \MailSo\Base\Http::SingletonInstance()->GetUrl(); if ($sUrl && \preg_match('/\/index\.php\/apps\/rainloop/', $sUrl)) { $sAppPath = \preg_replace('/\/index\.php\/apps\/rainloop.+$/', '/apps/rainloop/app/', $sUrl); } } } return $sAppPath; } /** * @return string */ public static function WebVersionPath() { return self::WebPath().'rainloop/v/'.APP_VERSION.'/'; } /** * @return string */ public static function WebStaticPath() { return self::WebVersionPath().'static/'; } /** * @param array $aSuggestions * * @return array */ public static function RemoveSuggestionDuplicates($aSuggestions) { $aResult = array(); if (is_array($aSuggestions)) { $aCache = array(); foreach ($aSuggestions as $aItem) { $sLine = \implode('~~', $aItem); if (!isset($aCache[$sLine])) { $aCache[$sLine] = true; $aResult[] = $aItem; } } } return $aResult; } /** * @param string $sFileName * @param bool $bProcessSections = false * * @return array */ public static function CustomParseIniFile($sFileName, $bProcessSections = false) { // if (\MailSo\Base\Utils::FunctionExistsAndEnabled('parse_ini_file')) // { // return @\parse_ini_file($sFileName, !!$bProcessSections); // } $sData = @\file_get_contents($sFileName); return \is_string($sData) ? @\parse_ini_string($sData, !!$bProcessSections) : null; } public static function CustomBaseConvert($sNumberInput, $sFromBaseInput = '0123456789', $sToBaseInput = '0123456789') { if ($sFromBaseInput === $sToBaseInput) { return $sNumberInput; } $mFromBase = \str_split($sFromBaseInput, 1); $mToBase = \str_split($sToBaseInput, 1); $aNumber = \str_split($sNumberInput, 1); $iFromLen = \strlen($sFromBaseInput); $iToLen = \strlen($sToBaseInput); $numberLen = \strlen($sNumberInput); $mRetVal = ''; if ($sToBaseInput === '0123456789') { $mRetVal = 0; for ($iIndex = 1; $iIndex <= $numberLen; $iIndex++) { $mRetVal = \bcadd($mRetVal, \bcmul(\array_search($aNumber[$iIndex - 1], $mFromBase), \bcpow($iFromLen, $numberLen - $iIndex))); } return $mRetVal; } if ($sFromBaseInput != '0123456789') { $sBase10 = \RainLoop\Utils::CustomBaseConvert($sNumberInput, $sFromBaseInput, '0123456789'); } else { $sBase10 = $sNumberInput; } if ($sBase10 < \strlen($sToBaseInput)) { return $mToBase[$sBase10]; } while ($sBase10 !== '0') { $mRetVal = $mToBase[\bcmod($sBase10, $iToLen)].$mRetVal; $sBase10 = \bcdiv($sBase10, $iToLen, 0); } return $mRetVal; } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/000077500000000000000000000000001361462701300254675ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/000077500000000000000000000000001361462701300265215ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Backend/000077500000000000000000000000001361462701300300505ustar00rootroot00000000000000AbstractBackend.php000066400000000000000000000126101361462701300335150ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Backend array( * '{DAV:}displayname' => null, * ), * 424 => array( * '{DAV:}owner' => null, * ) * ) * * In this example it was forbidden to update {DAV:}displayname. * (403 Forbidden), which in turn also caused {DAV:}owner to fail * (424 Failed Dependency) because the request needs to be atomic. * * @param mixed $calendarId * @param array $mutations * @return bool|array */ public function updateCalendar($calendarId, array $mutations) { return false; } /** * Performs a calendar-query on the contents of this calendar. * * The calendar-query is defined in RFC4791 : CalDAV. Using the * calendar-query it is possible for a client to request a specific set of * object, based on contents of iCalendar properties, date-ranges and * iCalendar component types (VTODO, VEVENT). * * This method should just return a list of (relative) urls that match this * query. * * The list of filters are specified as an array. The exact array is * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser. * * Note that it is extremely likely that getCalendarObject for every path * returned from this method will be called almost immediately after. You * may want to anticipate this to speed up these requests. * * This method provides a default implementation, which parses *all* the * iCalendar objects in the specified calendar. * * This default may well be good enough for personal use, and calendars * that aren't very large. But if you anticipate high usage, big calendars * or high loads, you are strongly adviced to optimize certain paths. * * The best way to do so is override this method and to optimize * specifically for 'common filters'. * * Requests that are extremely common are: * * requests for just VEVENTS * * requests for just VTODO * * requests with a time-range-filter on either VEVENT or VTODO. * * ..and combinations of these requests. It may not be worth it to try to * handle every possible situation and just rely on the (relatively * easy to use) CalendarQueryValidator to handle the rest. * * Note that especially time-range-filters may be difficult to parse. A * time-range filter specified on a VEVENT must for instance also handle * recurrence rules correctly. * A good example of how to interprete all these filters can also simply * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct * as possible, so it gives you a good idea on what type of stuff you need * to think of. * * @param mixed $calendarId * @param array $filters * @return array */ public function calendarQuery($calendarId, array $filters) { $result = array(); $objects = $this->getCalendarObjects($calendarId); $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator(); foreach($objects as $object) { if ($this->validateFilterForObject($object, $filters)) { $result[] = $object['uri']; } } return $result; } /** * This method validates if a filters (as passed to calendarQuery) matches * the given object. * * @param array $object * @param array $filters * @return bool */ protected function validateFilterForObject(array $object, array $filters) { // Unfortunately, setting the 'calendardata' here is optional. If // it was excluded, we actually need another call to get this as // well. if (!isset($object['calendardata'])) { $object = $this->getCalendarObject($object['calendarid'], $object['uri']); } $data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata']; $vObject = VObject\Reader::read($data); $validator = new CalDAV\CalendarQueryValidator(); return $validator->validate($vObject, $filters); } } BackendInterface.php000066400000000000000000000212011361462701300336460ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Backend array( * '{DAV:}displayname' => null, * ), * 424 => array( * '{DAV:}owner' => null, * ) * ) * * In this example it was forbidden to update {DAV:}displayname. * (403 Forbidden), which in turn also caused {DAV:}owner to fail * (424 Failed Dependency) because the request needs to be atomic. * * @param mixed $calendarId * @param array $mutations * @return bool|array */ public function updateCalendar($calendarId, array $mutations); /** * Delete a calendar and all it's objects * * @param mixed $calendarId * @return void */ public function deleteCalendar($calendarId); /** * Returns all calendar objects within a calendar. * * Every item contains an array with the following keys: * * id - unique identifier which will be used for subsequent updates * * calendardata - The iCalendar-compatible calendar data * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. * * lastmodified - a timestamp of the last modification time * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: * ' "abcdef"') * * calendarid - The calendarid as it was passed to this function. * * size - The size of the calendar objects, in bytes. * * Note that the etag is optional, but it's highly encouraged to return for * speed reasons. * * The calendardata is also optional. If it's not returned * 'getCalendarObject' will be called later, which *is* expected to return * calendardata. * * If neither etag or size are specified, the calendardata will be * used/fetched to determine these numbers. If both are specified the * amount of times this is needed is reduced by a great degree. * * @param mixed $calendarId * @return array */ public function getCalendarObjects($calendarId); /** * Returns information from a single calendar object, based on it's object * uri. * * The returned array must have the same keys as getCalendarObjects. The * 'calendardata' object is required here though, while it's not required * for getCalendarObjects. * * This method must return null if the object did not exist. * * @param mixed $calendarId * @param string $objectUri * @return array|null */ public function getCalendarObject($calendarId,$objectUri); /** * Creates a new calendar object. * * It is possible return an etag from this function, which will be used in * the response to this PUT request. Note that the ETag must be surrounded * by double-quotes. * * However, you should only really return this ETag if you don't mangle the * calendar-data. If the result of a subsequent GET to this object is not * the exact same as this request body, you should omit the ETag. * * @param mixed $calendarId * @param string $objectUri * @param string $calendarData * @return string|null */ public function createCalendarObject($calendarId,$objectUri,$calendarData); /** * Updates an existing calendarobject, based on it's uri. * * It is possible return an etag from this function, which will be used in * the response to this PUT request. Note that the ETag must be surrounded * by double-quotes. * * However, you should only really return this ETag if you don't mangle the * calendar-data. If the result of a subsequent GET to this object is not * the exact same as this request body, you should omit the ETag. * * @param mixed $calendarId * @param string $objectUri * @param string $calendarData * @return string|null */ public function updateCalendarObject($calendarId,$objectUri,$calendarData); /** * Deletes an existing calendar object. * * @param mixed $calendarId * @param string $objectUri * @return void */ public function deleteCalendarObject($calendarId,$objectUri); /** * Performs a calendar-query on the contents of this calendar. * * The calendar-query is defined in RFC4791 : CalDAV. Using the * calendar-query it is possible for a client to request a specific set of * object, based on contents of iCalendar properties, date-ranges and * iCalendar component types (VTODO, VEVENT). * * This method should just return a list of (relative) urls that match this * query. * * The list of filters are specified as an array. The exact array is * documented by SabreForRainLoop\CalDAV\CalendarQueryParser. * * Note that it is extremely likely that getCalendarObject for every path * returned from this method will be called almost immediately after. You * may want to anticipate this to speed up these requests. * * This method provides a default implementation, which parses *all* the * iCalendar objects in the specified calendar. * * This default may well be good enough for personal use, and calendars * that aren't very large. But if you anticipate high usage, big calendars * or high loads, you are strongly adviced to optimize certain paths. * * The best way to do so is override this method and to optimize * specifically for 'common filters'. * * Requests that are extremely common are: * * requests for just VEVENTS * * requests for just VTODO * * requests with a time-range-filter on either VEVENT or VTODO. * * ..and combinations of these requests. It may not be worth it to try to * handle every possible situation and just rely on the (relatively * easy to use) CalendarQueryValidator to handle the rest. * * Note that especially time-range-filters may be difficult to parse. A * time-range filter specified on a VEVENT must for instance also handle * recurrence rules correctly. * A good example of how to interprete all these filters can also simply * be found in SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct * as possible, so it gives you a good idea on what type of stuff you need * to think of. * * @param mixed $calendarId * @param array $filters * @return array */ public function calendarQuery($calendarId, array $filters); } NotificationSupport.php000066400000000000000000000031111361462701300345210ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Backend 'displayname', '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', ); /** * Creates the backend * * @param \PDO $pdo * @param string $calendarTableName * @param string $calendarObjectTableName */ public function __construct(\PDO $pdo, $calendarTableName = 'calendars', $calendarObjectTableName = 'calendarobjects') { $this->pdo = $pdo; $this->calendarTableName = $calendarTableName; $this->calendarObjectTableName = $calendarObjectTableName; } /** * Returns a list of calendars for a principal. * * Every project is an array with the following keys: * * id, a unique id that will be used by other functions to modify the * calendar. This can be the same as the uri or a database key. * * uri, which the basename of the uri with which the calendar is * accessed. * * principaluri. The owner of the calendar. Almost always the same as * principalUri passed to this method. * * Furthermore it can contain webdav properties in clark notation. A very * common one is '{DAV:}displayname'. * * @param string $principalUri * @return array */ public function getCalendarsForUser($principalUri) { $fields = array_values($this->propertyMap); $fields[] = 'id'; $fields[] = 'uri'; $fields[] = 'ctag'; $fields[] = 'components'; $fields[] = 'principaluri'; $fields[] = 'transparent'; // Making fields a comma-delimited list $fields = implode(', ', $fields); $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM ".$this->calendarTableName." WHERE principaluri = ? ORDER BY calendarorder ASC"); $stmt->execute(array($principalUri)); $calendars = array(); while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { $components = array(); if ($row['components']) { $components = explode(',',$row['components']); } $calendar = array( 'id' => $row['id'], 'uri' => $row['uri'], 'principaluri' => $row['principaluri'], '{' . CalDAV\Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet($components), '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), ); foreach($this->propertyMap as $xmlName=>$dbName) { $calendar[$xmlName] = $row[$dbName]; } $calendars[] = $calendar; } return $calendars; } /** * Creates a new calendar for a principal. * * If the creation was a success, an id must be returned that can be used to reference * this calendar in other methods, such as updateCalendar * * @param string $principalUri * @param string $calendarUri * @param array $properties * @return string */ public function createCalendar($principalUri, $calendarUri, array $properties) { $fieldNames = array( 'principaluri', 'uri', 'ctag', 'transparent', ); $values = array( ':principaluri' => $principalUri, ':uri' => $calendarUri, ':ctag' => 1, ':transparent' => 0, ); // Default value $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; $fieldNames[] = 'components'; if (!isset($properties[$sccs])) { $values[':components'] = 'VEVENT,VTODO'; } else { if (!($properties[$sccs] instanceof CalDAV\Property\SupportedCalendarComponentSet)) { throw new DAV\Exception('The ' . $sccs . ' property must be of type: \SabreForRainLoop\CalDAV\Property\SupportedCalendarComponentSet'); } $values[':components'] = implode(',',$properties[$sccs]->getValue()); } $transp = '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp'; if (isset($properties[$transp])) { $values[':transparent'] = $properties[$transp]->getValue()==='transparent'; } foreach($this->propertyMap as $xmlName=>$dbName) { if (isset($properties[$xmlName])) { $values[':' . $dbName] = $properties[$xmlName]; $fieldNames[] = $dbName; } } $stmt = $this->pdo->prepare("INSERT INTO ".$this->calendarTableName." (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")"); $stmt->execute($values); return $this->pdo->lastInsertId(); } /** * Updates properties for a calendar. * * The mutations array uses the propertyName in clark-notation as key, * and the array value for the property value. In the case a property * should be deleted, the property value will be null. * * This method must be atomic. If one property cannot be changed, the * entire operation must fail. * * If the operation was successful, true can be returned. * If the operation failed, false can be returned. * * Deletion of a non-existent property is always successful. * * Lastly, it is optional to return detailed information about any * failures. In this case an array should be returned with the following * structure: * * array( * 403 => array( * '{DAV:}displayname' => null, * ), * 424 => array( * '{DAV:}owner' => null, * ) * ) * * In this example it was forbidden to update {DAV:}displayname. * (403 Forbidden), which in turn also caused {DAV:}owner to fail * (424 Failed Dependency) because the request needs to be atomic. * * @param string $calendarId * @param array $mutations * @return bool|array */ public function updateCalendar($calendarId, array $mutations) { $newValues = array(); $result = array( 200 => array(), // Ok 403 => array(), // Forbidden 424 => array(), // Failed Dependency ); $hasError = false; foreach($mutations as $propertyName=>$propertyValue) { switch($propertyName) { case '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' : $fieldName = 'transparent'; $newValues[$fieldName] = $propertyValue->getValue()==='transparent'; break; default : // Checking the property map if (!isset($this->propertyMap[$propertyName])) { // We don't know about this property. $hasError = true; $result[403][$propertyName] = null; unset($mutations[$propertyName]); continue; } $fieldName = $this->propertyMap[$propertyName]; $newValues[$fieldName] = $propertyValue; } } // If there were any errors we need to fail the request if ($hasError) { // Properties has the remaining properties foreach($mutations as $propertyName=>$propertyValue) { $result[424][$propertyName] = null; } // Removing unused statuscodes for cleanliness foreach($result as $status=>$properties) { if (is_array($properties) && count($properties)===0) unset($result[$status]); } return $result; } // Success // Now we're generating the sql query. $valuesSql = array(); foreach($newValues as $fieldName=>$value) { $valuesSql[] = $fieldName . ' = ?'; } $valuesSql[] = 'ctag = ctag + 1'; $stmt = $this->pdo->prepare("UPDATE " . $this->calendarTableName . " SET " . implode(', ',$valuesSql) . " WHERE id = ?"); $newValues['id'] = $calendarId; $stmt->execute(array_values($newValues)); return true; } /** * Delete a calendar and all it's objects * * @param string $calendarId * @return void */ public function deleteCalendar($calendarId) { $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); $stmt->execute(array($calendarId)); $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarTableName.' WHERE id = ?'); $stmt->execute(array($calendarId)); } /** * Returns all calendar objects within a calendar. * * Every item contains an array with the following keys: * * id - unique identifier which will be used for subsequent updates * * calendardata - The iCalendar-compatible calendar data * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. * * lastmodified - a timestamp of the last modification time * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: * ' "abcdef"') * * calendarid - The calendarid as it was passed to this function. * * size - The size of the calendar objects, in bytes. * * Note that the etag is optional, but it's highly encouraged to return for * speed reasons. * * The calendardata is also optional. If it's not returned * 'getCalendarObject' will be called later, which *is* expected to return * calendardata. * * If neither etag or size are specified, the calendardata will be * used/fetched to determine these numbers. If both are specified the * amount of times this is needed is reduced by a great degree. * * @param string $calendarId * @return array */ public function getCalendarObjects($calendarId) { $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?'); $stmt->execute(array($calendarId)); $result = array(); foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { $result[] = array( 'id' => $row['id'], 'uri' => $row['uri'], 'lastmodified' => $row['lastmodified'], 'etag' => '"' . $row['etag'] . '"', 'calendarid' => $row['calendarid'], 'size' => (int)$row['size'], ); } return $result; } /** * Returns information from a single calendar object, based on it's object * uri. * * The returned array must have the same keys as getCalendarObjects. The * 'calendardata' object is required here though, while it's not required * for getCalendarObjects. * * This method must return null if the object did not exist. * * @param string $calendarId * @param string $objectUri * @return array|null */ public function getCalendarObject($calendarId,$objectUri) { $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size, calendardata FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); $stmt->execute(array($calendarId, $objectUri)); $row = $stmt->fetch(\PDO::FETCH_ASSOC); if(!$row) return null; return array( 'id' => $row['id'], 'uri' => $row['uri'], 'lastmodified' => $row['lastmodified'], 'etag' => '"' . $row['etag'] . '"', 'calendarid' => $row['calendarid'], 'size' => (int)$row['size'], 'calendardata' => $row['calendardata'], ); } /** * Creates a new calendar object. * * It is possible return an etag from this function, which will be used in * the response to this PUT request. Note that the ETag must be surrounded * by double-quotes. * * However, you should only really return this ETag if you don't mangle the * calendar-data. If the result of a subsequent GET to this object is not * the exact same as this request body, you should omit the ETag. * * @param mixed $calendarId * @param string $objectUri * @param string $calendarData * @return string|null */ public function createCalendarObject($calendarId,$objectUri,$calendarData) { $extraData = $this->getDenormalizedData($calendarData); $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified, etag, size, componenttype, firstoccurence, lastoccurence) VALUES (?,?,?,?,?,?,?,?,?)'); $stmt->execute(array( $calendarId, $objectUri, $calendarData, time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'], )); $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); $stmt->execute(array($calendarId)); return '"' . $extraData['etag'] . '"'; } /** * Updates an existing calendarobject, based on it's uri. * * It is possible return an etag from this function, which will be used in * the response to this PUT request. Note that the ETag must be surrounded * by double-quotes. * * However, you should only really return this ETag if you don't mangle the * calendar-data. If the result of a subsequent GET to this object is not * the exact same as this request body, you should omit the ETag. * * @param mixed $calendarId * @param string $objectUri * @param string $calendarData * @return string|null */ public function updateCalendarObject($calendarId,$objectUri,$calendarData) { $extraData = $this->getDenormalizedData($calendarData); $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ?, etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE calendarid = ? AND uri = ?'); $stmt->execute(array($calendarData,time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'] ,$calendarId,$objectUri)); $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?'); $stmt->execute(array($calendarId)); return '"' . $extraData['etag'] . '"'; } /** * Parses some information from calendar objects, used for optimized * calendar-queries. * * Returns an array with the following keys: * * etag * * size * * componentType * * firstOccurence * * lastOccurence * * @param string $calendarData * @return array */ protected function getDenormalizedData($calendarData) { $vObject = VObject\Reader::read($calendarData); $componentType = null; $component = null; $firstOccurence = null; $lastOccurence = null; foreach($vObject->getComponents() as $component) { if ($component->name!=='VTIMEZONE') { $componentType = $component->name; break; } } if (!$componentType) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component'); } if ($componentType === 'VEVENT') { $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp(); // Finding the last occurence is a bit harder if (!isset($component->RRULE)) { if (isset($component->DTEND)) { $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp(); } elseif (isset($component->DURATION)) { $endDate = clone $component->DTSTART->getDateTime(); $endDate->add(VObject\DateTimeParser::parse($component->DURATION->getValue())); $lastOccurence = $endDate->getTimeStamp(); } elseif (!$component->DTSTART->hasTime()) { $endDate = clone $component->DTSTART->getDateTime(); $endDate->modify('+1 day'); $lastOccurence = $endDate->getTimeStamp(); } else { $lastOccurence = $firstOccurence; } } else { $it = new VObject\RecurrenceIterator($vObject, (string)$component->UID); $maxDate = new \DateTime(self::MAX_DATE); if ($it->isInfinite()) { $lastOccurence = $maxDate->getTimeStamp(); } else { $end = $it->getDtEnd(); while($it->valid() && $end < $maxDate) { $end = $it->getDtEnd(); $it->next(); } $lastOccurence = $end->getTimeStamp(); } } } return array( 'etag' => md5($calendarData), 'size' => strlen($calendarData), 'componentType' => $componentType, 'firstOccurence' => $firstOccurence, 'lastOccurence' => $lastOccurence, ); } /** * Deletes an existing calendar object. * * @param string $calendarId * @param string $objectUri * @return void */ public function deleteCalendarObject($calendarId,$objectUri) { $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?'); $stmt->execute(array($calendarId,$objectUri)); $stmt = $this->pdo->prepare('UPDATE '. $this->calendarTableName .' SET ctag = ctag + 1 WHERE id = ?'); $stmt->execute(array($calendarId)); } /** * Performs a calendar-query on the contents of this calendar. * * The calendar-query is defined in RFC4791 : CalDAV. Using the * calendar-query it is possible for a client to request a specific set of * object, based on contents of iCalendar properties, date-ranges and * iCalendar component types (VTODO, VEVENT). * * This method should just return a list of (relative) urls that match this * query. * * The list of filters are specified as an array. The exact array is * documented by \SabreForRainLoop\CalDAV\CalendarQueryParser. * * Note that it is extremely likely that getCalendarObject for every path * returned from this method will be called almost immediately after. You * may want to anticipate this to speed up these requests. * * This method provides a default implementation, which parses *all* the * iCalendar objects in the specified calendar. * * This default may well be good enough for personal use, and calendars * that aren't very large. But if you anticipate high usage, big calendars * or high loads, you are strongly adviced to optimize certain paths. * * The best way to do so is override this method and to optimize * specifically for 'common filters'. * * Requests that are extremely common are: * * requests for just VEVENTS * * requests for just VTODO * * requests with a time-range-filter on a VEVENT. * * ..and combinations of these requests. It may not be worth it to try to * handle every possible situation and just rely on the (relatively * easy to use) CalendarQueryValidator to handle the rest. * * Note that especially time-range-filters may be difficult to parse. A * time-range filter specified on a VEVENT must for instance also handle * recurrence rules correctly. * A good example of how to interprete all these filters can also simply * be found in \SabreForRainLoop\CalDAV\CalendarQueryFilter. This class is as correct * as possible, so it gives you a good idea on what type of stuff you need * to think of. * * This specific implementation (for the PDO) backend optimizes filters on * specific components, and VEVENT time-ranges. * * @param string $calendarId * @param array $filters * @return array */ public function calendarQuery($calendarId, array $filters) { $result = array(); $validator = new \SabreForRainLoop\CalDAV\CalendarQueryValidator(); $componentType = null; $requirePostFilter = true; $timeRange = null; // if no filters were specified, we don't need to filter after a query if (!$filters['prop-filters'] && !$filters['comp-filters']) { $requirePostFilter = false; } // Figuring out if there's a component filter if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) { $componentType = $filters['comp-filters'][0]['name']; // Checking if we need post-filters if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) { $requirePostFilter = false; } // There was a time-range filter if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) { $timeRange = $filters['comp-filters'][0]['time-range']; // If start time OR the end time is not specified, we can do a // 100% accurate mysql query. if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) { $requirePostFilter = false; } } } if ($requirePostFilter) { $query = "SELECT uri, calendardata FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; } else { $query = "SELECT uri FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid"; } $values = array( 'calendarid' => $calendarId, ); if ($componentType) { $query.=" AND componenttype = :componenttype"; $values['componenttype'] = $componentType; } if ($timeRange && $timeRange['start']) { $query.=" AND lastoccurence > :startdate"; $values['startdate'] = $timeRange['start']->getTimeStamp(); } if ($timeRange && $timeRange['end']) { $query.=" AND firstoccurence < :enddate"; $values['enddate'] = $timeRange['end']->getTimeStamp(); } $stmt = $this->pdo->prepare($query); $stmt->execute($values); $result = array(); while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { if ($requirePostFilter) { if (!$this->validateFilterForObject($row, $filters)) { continue; } } $result[] = $row['uri']; } return $result; } } SharingSupport.php000066400000000000000000000217051361462701300334770ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/BackendcaldavBackend = $caldavBackend; $this->calendarInfo = $calendarInfo; } /** * Returns the name of the calendar * * @return string */ public function getName() { return $this->calendarInfo['uri']; } /** * Updates properties such as the display name and description * * @param array $mutations * @return array */ public function updateProperties($mutations) { return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations); } /** * Returns the list of properties * * @param array $requestedProperties * @return array */ public function getProperties($requestedProperties) { $response = array(); foreach($requestedProperties as $prop) switch($prop) { case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' : $response[$prop] = new Property\SupportedCalendarData(); break; case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' : $response[$prop] = new Property\SupportedCollationSet(); break; case '{DAV:}owner' : $response[$prop] = new DAVACL\Property\Principal(DAVACL\Property\Principal::HREF,$this->calendarInfo['principaluri']); break; default : if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop]; break; } return $response; } /** * Returns a calendar object * * The contained calendar objects are for example Events or Todo's. * * @param string $name * @return \SabreForRainLoop\CalDAV\ICalendarObject */ public function getChild($name) { $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); if (!$obj) throw new DAV\Exception\NotFound('Calendar object not found'); $obj['acl'] = $this->getACL(); // Removing the irrelivant foreach($obj['acl'] as $key=>$acl) { if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') { unset($obj['acl'][$key]); } } return new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); } /** * Returns the full list of calendar objects * * @return array */ public function getChildren() { $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); $children = array(); foreach($objs as $obj) { $obj['acl'] = $this->getACL(); // Removing the irrelivant foreach($obj['acl'] as $key=>$acl) { if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') { unset($obj['acl'][$key]); } } $children[] = new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); } return $children; } /** * Checks if a child-node exists. * * @param string $name * @return bool */ public function childExists($name) { $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); if (!$obj) return false; else return true; } /** * Creates a new directory * * We actually block this, as subdirectories are not allowed in calendars. * * @param string $name * @return void */ public function createDirectory($name) { throw new DAV\Exception\MethodNotAllowed('Creating collections in calendar objects is not allowed'); } /** * Creates a new file * * The contents of the new file must be a valid ICalendar string. * * @param string $name * @param resource $calendarData * @return string|null */ public function createFile($name,$calendarData = null) { if (is_resource($calendarData)) { $calendarData = stream_get_contents($calendarData); } return $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData); } /** * Deletes the calendar. * * @return void */ public function delete() { $this->caldavBackend->deleteCalendar($this->calendarInfo['id']); } /** * Renames the calendar. Note that most calendars use the * {DAV:}displayname to display a name to display a name. * * @param string $newName * @return void */ public function setName($newName) { throw new DAV\Exception\MethodNotAllowed('Renaming calendars is not yet supported'); } /** * Returns the last modification date as a unix timestamp. * * @return void */ public function getLastModified() { return null; } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->calendarInfo['principaluri']; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->getOwner(), 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->getOwner(), 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->getOwner() . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->getOwner() . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->getOwner() . '/calendar-proxy-read', 'protected' => true, ), array( 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy', 'principal' => '{DAV:}authenticated', 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet(); // We need to inject 'read-free-busy' in the tree, aggregated under // {DAV:}read. foreach($default['aggregates'] as &$agg) { if ($agg['privilege'] !== '{DAV:}read') continue; $agg['aggregates'][] = array( 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy', ); } return $default; } /** * Performs a calendar-query on the contents of this calendar. * * The calendar-query is defined in RFC4791 : CalDAV. Using the * calendar-query it is possible for a client to request a specific set of * object, based on contents of iCalendar properties, date-ranges and * iCalendar component types (VTODO, VEVENT). * * This method should just return a list of (relative) urls that match this * query. * * The list of filters are specified as an array. The exact array is * documented by SabreForRainLoop\CalDAV\CalendarQueryParser. * * @param array $filters * @return array */ public function calendarQuery(array $filters) { return $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/CalendarObject.php000066400000000000000000000157521361462701300321040ustar00rootroot00000000000000caldavBackend = $caldavBackend; if (!isset($objectData['calendarid'])) { throw new \InvalidArgumentException('The objectData argument must contain a \'calendarid\' property'); } if (!isset($objectData['uri'])) { throw new \InvalidArgumentException('The objectData argument must contain an \'uri\' property'); } $this->calendarInfo = $calendarInfo; $this->objectData = $objectData; } /** * Returns the uri for this object * * @return string */ public function getName() { return $this->objectData['uri']; } /** * Returns the ICalendar-formatted object * * @return string */ public function get() { // Pre-populating the 'calendardata' is optional, if we don't have it // already we fetch it from the backend. if (!isset($this->objectData['calendardata'])) { $this->objectData = $this->caldavBackend->getCalendarObject($this->objectData['calendarid'], $this->objectData['uri']); } return $this->objectData['calendardata']; } /** * Updates the ICalendar-formatted object * * @param string|resource $calendarData * @return string */ public function put($calendarData) { if (is_resource($calendarData)) { $calendarData = stream_get_contents($calendarData); } $etag = $this->caldavBackend->updateCalendarObject($this->calendarInfo['id'],$this->objectData['uri'],$calendarData); $this->objectData['calendardata'] = $calendarData; $this->objectData['etag'] = $etag; return $etag; } /** * Deletes the calendar object * * @return void */ public function delete() { $this->caldavBackend->deleteCalendarObject($this->calendarInfo['id'],$this->objectData['uri']); } /** * Returns the mime content-type * * @return string */ public function getContentType() { return 'text/calendar; charset=utf-8'; } /** * Returns an ETag for this object. * * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. * * @return string */ public function getETag() { if (isset($this->objectData['etag'])) { return $this->objectData['etag']; } else { return '"' . md5($this->get()). '"'; } } /** * Returns the last modification date as a unix timestamp * * @return int */ public function getLastModified() { return $this->objectData['lastmodified']; } /** * Returns the size of this object in bytes * * @return int */ public function getSize() { if (array_key_exists('size',$this->objectData)) { return $this->objectData['size']; } else { return strlen($this->get()); } } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->calendarInfo['principaluri']; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { // An alternative acl may be specified in the object data. if (isset($this->objectData['acl'])) { return $this->objectData['acl']; } // The default ACL return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->calendarInfo['principaluri'], 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->calendarInfo['principaluri'], 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new \SabreForRainLoop\DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See \SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } } CalendarQueryParser.php000066400000000000000000000211721361462701300330720ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAVdom = $dom; $this->xpath = new \DOMXPath($dom); $this->xpath->registerNameSpace('cal',Plugin::NS_CALDAV); $this->xpath->registerNameSpace('dav','urn:DAV'); } /** * Parses the request. * * @return void */ public function parse() { $filterNode = null; $filter = $this->xpath->query('/cal:calendar-query/cal:filter'); if ($filter->length !== 1) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('Only one filter element is allowed'); } $compFilters = $this->parseCompFilters($filter->item(0)); if (count($compFilters)!==1) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('There must be exactly 1 top-level comp-filter.'); } $this->filters = $compFilters[0]; $this->requestedProperties = array_keys(\SabreForRainLoop\DAV\XMLUtil::parseProperties($this->dom->firstChild)); $expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand'); if ($expand->length>0) { $this->expand = $this->parseExpand($expand->item(0)); } } /** * Parses all the 'comp-filter' elements from a node * * @param \DOMElement $parentNode * @return array */ protected function parseCompFilters(\DOMElement $parentNode) { $compFilterNodes = $this->xpath->query('cal:comp-filter', $parentNode); $result = array(); for($ii=0; $ii < $compFilterNodes->length; $ii++) { $compFilterNode = $compFilterNodes->item($ii); $compFilter = array(); $compFilter['name'] = $compFilterNode->getAttribute('name'); $compFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $compFilterNode)->length>0; $compFilter['comp-filters'] = $this->parseCompFilters($compFilterNode); $compFilter['prop-filters'] = $this->parsePropFilters($compFilterNode); $compFilter['time-range'] = $this->parseTimeRange($compFilterNode); if ($compFilter['time-range'] && !in_array($compFilter['name'],array( 'VEVENT', 'VTODO', 'VJOURNAL', 'VFREEBUSY', 'VALARM', ))) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component'); }; $result[] = $compFilter; } return $result; } /** * Parses all the prop-filter elements from a node * * @param \DOMElement $parentNode * @return array */ protected function parsePropFilters(\DOMElement $parentNode) { $propFilterNodes = $this->xpath->query('cal:prop-filter', $parentNode); $result = array(); for ($ii=0; $ii < $propFilterNodes->length; $ii++) { $propFilterNode = $propFilterNodes->item($ii); $propFilter = array(); $propFilter['name'] = $propFilterNode->getAttribute('name'); $propFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $propFilterNode)->length>0; $propFilter['param-filters'] = $this->parseParamFilters($propFilterNode); $propFilter['text-match'] = $this->parseTextMatch($propFilterNode); $propFilter['time-range'] = $this->parseTimeRange($propFilterNode); $result[] = $propFilter; } return $result; } /** * Parses the param-filter element * * @param \DOMElement $parentNode * @return array */ protected function parseParamFilters(\DOMElement $parentNode) { $paramFilterNodes = $this->xpath->query('cal:param-filter', $parentNode); $result = array(); for($ii=0;$ii<$paramFilterNodes->length;$ii++) { $paramFilterNode = $paramFilterNodes->item($ii); $paramFilter = array(); $paramFilter['name'] = $paramFilterNode->getAttribute('name'); $paramFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $paramFilterNode)->length>0; $paramFilter['text-match'] = $this->parseTextMatch($paramFilterNode); $result[] = $paramFilter; } return $result; } /** * Parses the text-match element * * @param \DOMElement $parentNode * @return array|null */ protected function parseTextMatch(\DOMElement $parentNode) { $textMatchNodes = $this->xpath->query('cal:text-match', $parentNode); if ($textMatchNodes->length === 0) return null; $textMatchNode = $textMatchNodes->item(0); $negateCondition = $textMatchNode->getAttribute('negate-condition'); $negateCondition = $negateCondition==='yes'; $collation = $textMatchNode->getAttribute('collation'); if (!$collation) $collation = 'i;ascii-casemap'; return array( 'negate-condition' => $negateCondition, 'collation' => $collation, 'value' => $textMatchNode->nodeValue ); } /** * Parses the time-range element * * @param \DOMElement $parentNode * @return array|null */ protected function parseTimeRange(\DOMElement $parentNode) { $timeRangeNodes = $this->xpath->query('cal:time-range', $parentNode); if ($timeRangeNodes->length === 0) { return null; } $timeRangeNode = $timeRangeNodes->item(0); if ($start = $timeRangeNode->getAttribute('start')) { $start = VObject\DateTimeParser::parseDateTime($start); } else { $start = null; } if ($end = $timeRangeNode->getAttribute('end')) { $end = VObject\DateTimeParser::parseDateTime($end); } else { $end = null; } if (!is_null($start) && !is_null($end) && $end <= $start) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the time-range filter'); } return array( 'start' => $start, 'end' => $end, ); } /** * Parses the CALDAV:expand element * * @param \DOMElement $parentNode * @return void */ protected function parseExpand(\DOMElement $parentNode) { $start = $parentNode->getAttribute('start'); if(!$start) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "start" attribute is required for the CALDAV:expand element'); } $start = VObject\DateTimeParser::parseDateTime($start); $end = $parentNode->getAttribute('end'); if(!$end) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('The "end" attribute is required for the CALDAV:expand element'); } $end = VObject\DateTimeParser::parseDateTime($end); if ($end <= $start) { throw new \SabreForRainLoop\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.'); } return array( 'start' => $start, 'end' => $end, ); } } CalendarQueryValidator.php000066400000000000000000000320661361462701300335670ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAVname !== $filters['name']) { return false; } return $this->validateCompFilters($vObject, $filters['comp-filters']) && $this->validatePropFilters($vObject, $filters['prop-filters']); } /** * This method checks the validity of comp-filters. * * A list of comp-filters needs to be specified. Also the parent of the * component we're checking should be specified, not the component to check * itself. * * @param VObject\Component $parent * @param array $filters * @return bool */ protected function validateCompFilters(VObject\Component $parent, array $filters) { foreach($filters as $filter) { $isDefined = isset($parent->$filter['name']); if ($filter['is-not-defined']) { if ($isDefined) { return false; } else { continue; } } if (!$isDefined) { return false; } if ($filter['time-range']) { foreach($parent->$filter['name'] as $subComponent) { if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { continue 2; } } return false; } if (!$filter['comp-filters'] && !$filter['prop-filters']) { continue; } // If there are sub-filters, we need to find at least one component // for which the subfilters hold true. foreach($parent->$filter['name'] as $subComponent) { if ( $this->validateCompFilters($subComponent, $filter['comp-filters']) && $this->validatePropFilters($subComponent, $filter['prop-filters'])) { // We had a match, so this comp-filter succeeds continue 2; } } // If we got here it means there were sub-comp-filters or // sub-prop-filters and there was no match. This means this filter // needs to return false. return false; } // If we got here it means we got through all comp-filters alive so the // filters were all true. return true; } /** * This method checks the validity of prop-filters. * * A list of prop-filters needs to be specified. Also the parent of the * property we're checking should be specified, not the property to check * itself. * * @param VObject\Component $parent * @param array $filters * @return bool */ protected function validatePropFilters(VObject\Component $parent, array $filters) { foreach($filters as $filter) { $isDefined = isset($parent->$filter['name']); if ($filter['is-not-defined']) { if ($isDefined) { return false; } else { continue; } } if (!$isDefined) { return false; } if ($filter['time-range']) { foreach($parent->$filter['name'] as $subComponent) { if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) { continue 2; } } return false; } if (!$filter['param-filters'] && !$filter['text-match']) { continue; } // If there are sub-filters, we need to find at least one property // for which the subfilters hold true. foreach($parent->$filter['name'] as $subComponent) { if( $this->validateParamFilters($subComponent, $filter['param-filters']) && (!$filter['text-match'] || $this->validateTextMatch($subComponent, $filter['text-match'])) ) { // We had a match, so this prop-filter succeeds continue 2; } } // If we got here it means there were sub-param-filters or // text-match filters and there was no match. This means the // filter needs to return false. return false; } // If we got here it means we got through all prop-filters alive so the // filters were all true. return true; } /** * This method checks the validity of param-filters. * * A list of param-filters needs to be specified. Also the parent of the * parameter we're checking should be specified, not the parameter to check * itself. * * @param VObject\Property $parent * @param array $filters * @return bool */ protected function validateParamFilters(VObject\Property $parent, array $filters) { foreach($filters as $filter) { $isDefined = isset($parent[$filter['name']]); if ($filter['is-not-defined']) { if ($isDefined) { return false; } else { continue; } } if (!$isDefined) { return false; } if (!$filter['text-match']) { continue; } if (version_compare(VObject\Version::VERSION, '3.0.0beta1', '>=')) { // If there are sub-filters, we need to find at least one parameter // for which the subfilters hold true. foreach($parent[$filter['name']]->getParts() as $subParam) { if($this->validateTextMatch($subParam,$filter['text-match'])) { // We had a match, so this param-filter succeeds continue 2; } } } else { // If there are sub-filters, we need to find at least one parameter // for which the subfilters hold true. foreach($parent[$filter['name']] as $subParam) { if($this->validateTextMatch($subParam,$filter['text-match'])) { // We had a match, so this param-filter succeeds continue 2; } } } // If we got here it means there was a text-match filter and there // were no matches. This means the filter needs to return false. return false; } // If we got here it means we got through all param-filters alive so the // filters were all true. return true; } /** * This method checks the validity of a text-match. * * A single text-match should be specified as well as the specific property * or parameter we need to validate. * * @param VObject\Node|string $check Value to check against. * @param array $textMatch * @return bool */ protected function validateTextMatch($check, array $textMatch) { if ($check instanceof VObject\Node) { $check = (string)$check; } $isMatching = \SabreForRainLoop\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']); return ($textMatch['negate-condition'] xor $isMatching); } /** * Validates if a component matches the given time range. * * This is all based on the rules specified in rfc4791, which are quite * complex. * * @param VObject\Node $component * @param DateTime $start * @param DateTime $end * @return bool */ protected function validateTimeRange(VObject\Node $component, $start, $end) { if (is_null($start)) { $start = new DateTime('1900-01-01'); } if (is_null($end)) { $end = new DateTime('3000-01-01'); } switch($component->name) { case 'VEVENT' : case 'VTODO' : case 'VJOURNAL' : return $component->isInTimeRange($start, $end); case 'VALARM' : // If the valarm is wrapped in a recurring event, we need to // expand the recursions, and validate each. // // Our datamodel doesn't easily allow us to do this straight // in the VALARM component code, so this is a hack, and an // expensive one too. if ($component->parent->name === 'VEVENT' && $component->parent->RRULE) { // Fire up the iterator! $it = new VObject\RecurrenceIterator($component->parent->parent, (string)$component->parent->UID); while($it->valid()) { $expandedEvent = $it->getEventObject(); // We need to check from these expanded alarms, which // one is the first to trigger. Based on this, we can // determine if we can 'give up' expanding events. $firstAlarm = null; if ($expandedEvent->VALARM !== null) { foreach($expandedEvent->VALARM as $expandedAlarm) { $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); if ($expandedAlarm->isInTimeRange($start, $end)) { return true; } if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') { // This is an alarm with a non-relative trigger // time, likely created by a buggy client. The // implication is that every alarm in this // recurring event trigger at the exact same // time. It doesn't make sense to traverse // further. } else { // We store the first alarm as a means to // figure out when we can stop traversing. if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { $firstAlarm = $effectiveTrigger; } } } } if (is_null($firstAlarm)) { // No alarm was found. // // Or technically: No alarm that will change for // every instance of the recurrence was found, // which means we can assume there was no match. return false; } if ($firstAlarm > $end) { return false; } $it->next(); } return false; } else { return $component->isInTimeRange($start, $end); } case 'VFREEBUSY' : throw new \SabreForRainLoop\DAV\Exception\NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components'); case 'COMPLETED' : case 'CREATED' : case 'DTEND' : case 'DTSTAMP' : case 'DTSTART' : case 'DUE' : case 'LAST-MODIFIED' : return ($start <= $component->getDateTime() && $end >= $component->getDateTime()); default : throw new \SabreForRainLoop\DAV\Exception\BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component'); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/CalendarRootNode.php000066400000000000000000000043321361462701300324170ustar00rootroot00000000000000caldavBackend = $caldavBackend; } /** * Returns the nodename * * We're overriding this, because the default will be the 'principalPrefix', * and we want it to be SabreForRainLoop\CalDAV\Plugin::CALENDAR_ROOT * * @return string */ public function getName() { return Plugin::CALENDAR_ROOT; } /** * This method returns a node for a principal. * * The passed array contains principal information, and is guaranteed to * at least contain a uri item. Other properties may or may not be * supplied by the authentication backend. * * @param array $principal * @return \SabreForRainLoop\DAV\INode */ public function getChildForPrincipal(array $principal) { return new UserCalendars($this->caldavBackend, $principal); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Exception/000077500000000000000000000000001361462701300304575ustar00rootroot00000000000000InvalidComponentType.php000066400000000000000000000016411361462701300352260ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/ExceptionownerDocument; $np = $doc->createElementNS(CalDAV\Plugin::NS_CALDAV,'cal:supported-calendar-component'); $errorNode->appendChild($np); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/ICSExportPlugin.php000066400000000000000000000076321361462701300322410ustar00rootroot00000000000000server = $server; $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); } /** * 'beforeMethod' event handles. This event handles intercepts GET requests ending * with ?export * * @param string $method * @param string $uri * @return bool */ public function beforeMethod($method, $uri) { if ($method!='GET') return; if ($this->server->httpRequest->getQueryString()!='export') return; // splitting uri list($uri) = explode('?',$uri,2); $node = $this->server->tree->getNodeForPath($uri); if (!($node instanceof Calendar)) return; // Checking ACL, if available. if ($aclPlugin = $this->server->getPlugin('acl')) { $aclPlugin->checkPrivileges($uri, '{DAV:}read'); } $this->server->httpResponse->setHeader('Content-Type','text/calendar'); $this->server->httpResponse->sendStatus(200); $nodes = $this->server->getPropertiesForPath($uri, array( '{' . Plugin::NS_CALDAV . '}calendar-data', ),1); $this->server->httpResponse->sendBody($this->generateICS($nodes)); // Returning false to break the event chain return false; } /** * Merges all calendar objects, and builds one big ics export * * @param array $nodes * @return string */ public function generateICS(array $nodes) { $calendar = new VObject\Component\VCalendar(); $calendar->version = '2.0'; if (DAV\Server::$exposeVersion) { $calendar->prodid = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN'; } else { $calendar->prodid = '-//SabreDAV//SabreDAV//EN'; } $calendar->calscale = 'GREGORIAN'; $collectedTimezones = array(); $timezones = array(); $objects = array(); foreach($nodes as $node) { if (!isset($node[200]['{' . Plugin::NS_CALDAV . '}calendar-data'])) { continue; } $nodeData = $node[200]['{' . Plugin::NS_CALDAV . '}calendar-data']; $nodeComp = VObject\Reader::read($nodeData); foreach($nodeComp->children() as $child) { switch($child->name) { case 'VEVENT' : case 'VTODO' : case 'VJOURNAL' : $objects[] = $child; break; // VTIMEZONE is special, because we need to filter out the duplicates case 'VTIMEZONE' : // Naively just checking tzid. if (in_array((string)$child->TZID, $collectedTimezones)) continue; $timezones[] = $child; $collectedTimezones[] = $child->TZID; break; } } } foreach($timezones as $tz) $calendar->add($tz); foreach($objects as $obj) $calendar->add($obj); return $calendar->serialize(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/ICalendar.php000066400000000000000000000021701361462701300310540ustar00rootroot00000000000000caldavBackend = $caldavBackend; $this->principalUri = $principalUri; } /** * Returns all notifications for a principal * * @return array */ public function getChildren() { $children = array(); $notifications = $this->caldavBackend->getNotificationsForPrincipal($this->principalUri); foreach($notifications as $notification) { $children[] = new Node( $this->caldavBackend, $this->principalUri, $notification ); } return $children; } /** * Returns the name of this object * * @return string */ public function getName() { return 'notifications'; } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->principalUri; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'principal' => $this->getOwner(), 'privilege' => '{DAV:}read', 'protected' => true, ), array( 'principal' => $this->getOwner(), 'privilege' => '{DAV:}write', 'protected' => true, ) ); } /** * Updates the ACL * * This method will receive a list of new ACE's as an array argument. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } } ICollection.php000066400000000000000000000012511361462701300341670ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/NotificationscaldavBackend = $caldavBackend; $this->principalUri = $principalUri; $this->notification = $notification; } /** * Returns the path name for this notification * * @return id */ public function getName() { return $this->notification->getId() . '.xml'; } /** * Returns the etag for the notification. * * The etag must be surrounded by litteral double-quotes. * * @return string */ public function getETag() { return $this->notification->getETag(); } /** * This method must return an xml element, using the * SabreForRainLoop\CalDAV\Notifications\INotificationType classes. * * @return INotificationType */ public function getNotificationType() { return $this->notification; } /** * Deletes this notification * * @return void */ public function delete() { $this->caldavBackend->deleteNotification($this->getOwner(), $this->notification); } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->principalUri; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'principal' => $this->getOwner(), 'privilege' => '{DAV:}read', 'protected' => true, ), array( 'principal' => $this->getOwner(), 'privilege' => '{DAV:}write', 'protected' => true, ) ); } /** * Updates the ACL * * This method will receive a list of new ACE's as an array argument. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } } Notification/000077500000000000000000000000001361462701300337015ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/NotificationsInvite.php000066400000000000000000000224661361462701300356620ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification$value) { if (!property_exists($this, $key)) { throw new \InvalidArgumentException('Unknown option: ' . $key); } $this->$key = $value; } } /** * Serializes the notification as a single property. * * You should usually just encode the single top-level element of the * notification. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server, \DOMElement $node) { $prop = $node->ownerDocument->createElement('cs:invite-notification'); $node->appendChild($prop); } /** * This method serializes the entire notification, as it is used in the * response body. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serializeBody(DAV\Server $server, \DOMElement $node) { $doc = $node->ownerDocument; $dt = $doc->createElement('cs:dtstamp'); $this->dtStamp->setTimezone(new \DateTimezone('GMT')); $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); $node->appendChild($dt); $prop = $doc->createElement('cs:invite-notification'); $node->appendChild($prop); $uid = $doc->createElement('cs:uid'); $uid->appendChild( $doc->createTextNode($this->id) ); $prop->appendChild($uid); $href = $doc->createElement('d:href'); $href->appendChild( $doc->createTextNode( $this->href ) ); $prop->appendChild($href); $nodeName = null; switch($this->type) { case SharingPlugin::STATUS_ACCEPTED : $nodeName = 'cs:invite-accepted'; break; case SharingPlugin::STATUS_DECLINED : $nodeName = 'cs:invite-declined'; break; case SharingPlugin::STATUS_DELETED : $nodeName = 'cs:invite-deleted'; break; case SharingPlugin::STATUS_NORESPONSE : $nodeName = 'cs:invite-noresponse'; break; } $prop->appendChild( $doc->createElement($nodeName) ); $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); $hostUrl = $doc->createElement('cs:hosturl'); $hostUrl->appendChild($hostHref); $prop->appendChild($hostUrl); $access = $doc->createElement('cs:access'); if ($this->readOnly) { $access->appendChild($doc->createElement('cs:read')); } else { $access->appendChild($doc->createElement('cs:read-write')); } $prop->appendChild($access); $organizerUrl = $doc->createElement('cs:organizer'); // If the organizer contains a 'mailto:' part, it means it should be // treated as absolute. if (strtolower(substr($this->organizer,0,7))==='mailto:') { $organizerHref = new DAV\Property\Href($this->organizer, false); } else { $organizerHref = new DAV\Property\Href($this->organizer, true); } $organizerHref->serialize($server, $organizerUrl); if ($this->commonName) { $commonName = $doc->createElement('cs:common-name'); $commonName->appendChild($doc->createTextNode($this->commonName)); $organizerUrl->appendChild($commonName); $commonNameOld = $doc->createElement('cs:organizer-cn'); $commonNameOld->appendChild($doc->createTextNode($this->commonName)); $prop->appendChild($commonNameOld); } if ($this->firstName) { $firstName = $doc->createElement('cs:first-name'); $firstName->appendChild($doc->createTextNode($this->firstName)); $organizerUrl->appendChild($firstName); $firstNameOld = $doc->createElement('cs:organizer-first'); $firstNameOld->appendChild($doc->createTextNode($this->firstName)); $prop->appendChild($firstNameOld); } if ($this->lastName) { $lastName = $doc->createElement('cs:last-name'); $lastName->appendChild($doc->createTextNode($this->lastName)); $organizerUrl->appendChild($lastName); $lastNameOld = $doc->createElement('cs:organizer-last'); $lastNameOld->appendChild($doc->createTextNode($this->lastName)); $prop->appendChild($lastNameOld); } $prop->appendChild($organizerUrl); if ($this->summary) { $summary = $doc->createElement('cs:summary'); $summary->appendChild($doc->createTextNode($this->summary)); $prop->appendChild($summary); } if ($this->supportedComponents) { $xcomp = $doc->createElement('cal:supported-calendar-component-set'); $this->supportedComponents->serialize($server, $xcomp); $prop->appendChild($xcomp); } } /** * Returns a unique id for this notification * * This is just the base url. This should generally be some kind of unique * id. * * @return string */ public function getId() { return $this->id; } /** * Returns the ETag for this notification. * * The ETag must be surrounded by literal double-quotes. * * @return string */ public function getETag() { return $this->etag; } } InviteReply.php000066400000000000000000000132211361462701300366630ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notification$value) { if (!property_exists($this, $key)) { throw new \InvalidArgumentException('Unknown option: ' . $key); } $this->$key = $value; } } /** * Serializes the notification as a single property. * * You should usually just encode the single top-level element of the * notification. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server, \DOMElement $node) { $prop = $node->ownerDocument->createElement('cs:invite-reply'); $node->appendChild($prop); } /** * This method serializes the entire notification, as it is used in the * response body. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serializeBody(DAV\Server $server, \DOMElement $node) { $doc = $node->ownerDocument; $dt = $doc->createElement('cs:dtstamp'); $this->dtStamp->setTimezone(new \DateTimezone('GMT')); $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z'))); $node->appendChild($dt); $prop = $doc->createElement('cs:invite-reply'); $node->appendChild($prop); $uid = $doc->createElement('cs:uid'); $uid->appendChild($doc->createTextNode($this->id)); $prop->appendChild($uid); $inReplyTo = $doc->createElement('cs:in-reply-to'); $inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) ); $prop->appendChild($inReplyTo); $href = $doc->createElement('d:href'); $href->appendChild( $doc->createTextNode($this->href) ); $prop->appendChild($href); $nodeName = null; switch($this->type) { case SharingPlugin::STATUS_ACCEPTED : $nodeName = 'cs:invite-accepted'; break; case SharingPlugin::STATUS_DECLINED : $nodeName = 'cs:invite-declined'; break; } $prop->appendChild( $doc->createElement($nodeName) ); $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl); $hostUrl = $doc->createElement('cs:hosturl'); $hostUrl->appendChild($hostHref); $prop->appendChild($hostUrl); if ($this->summary) { $summary = $doc->createElement('cs:summary'); $summary->appendChild($doc->createTextNode($this->summary)); $prop->appendChild($summary); } } /** * Returns a unique id for this notification * * This is just the base url. This should generally be some kind of unique * id. * * @return string */ public function getId() { return $this->id; } /** * Returns the ETag for this notification. * * The ETag must be surrounded by literal double-quotes. * * @return string */ public function getETag() { return $this->etag; } } SystemStatus.php000066400000000000000000000104001361462701300370750ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Notifications/Notificationid = $id; $this->type = $type; $this->description = $description; $this->href = $href; $this->etag = $etag; } /** * Serializes the notification as a single property. * * You should usually just encode the single top-level element of the * notification. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server, \DOMElement $node) { switch($this->type) { case self::TYPE_LOW : $type = 'low'; break; case self::TYPE_MEDIUM : $type = 'medium'; break; default : case self::TYPE_HIGH : $type = 'high'; break; } $prop = $node->ownerDocument->createElement('cs:systemstatus'); $prop->setAttribute('type', $type); $node->appendChild($prop); } /** * This method serializes the entire notification, as it is used in the * response body. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serializeBody(DAV\Server $server, \DOMElement $node) { switch($this->type) { case self::TYPE_LOW : $type = 'low'; break; case self::TYPE_MEDIUM : $type = 'medium'; break; default : case self::TYPE_HIGH : $type = 'high'; break; } $prop = $node->ownerDocument->createElement('cs:systemstatus'); $prop->setAttribute('type', $type); if ($this->description) { $text = $node->ownerDocument->createTextNode($this->description); $desc = $node->ownerDocument->createElement('cs:description'); $desc->appendChild($text); $prop->appendChild($desc); } if ($this->href) { $text = $node->ownerDocument->createTextNode($this->href); $href = $node->ownerDocument->createElement('d:href'); $href->appendChild($text); $prop->appendChild($href); } $node->appendChild($prop); } /** * Returns a unique id for this notification * * This is just the base url. This should generally be some kind of unique * id. * * @return string */ public function getId() { return $this->id; } /* * Returns the ETag for this notification. * * The ETag must be surrounded by literal double-quotes. * * @return string */ public function getETag() { return $this->etag; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Plugin.php000066400000000000000000001374321361462701300305020ustar00rootroot00000000000000imipHandler = $imipHandler; } /** * Use this method to tell the server this plugin defines additional * HTTP methods. * * This method is passed a uri. It should only return HTTP methods that are * available for the specified uri. * * @param string $uri * @return array */ public function getHTTPMethods($uri) { // The MKCALENDAR is only available on unmapped uri's, whose // parents extend IExtendedCollection list($parent, $name) = DAV\URLUtil::splitPath($uri); $node = $this->server->tree->getNodeForPath($parent); if ($node instanceof DAV\IExtendedCollection) { try { $node->getChild($name); } catch (DAV\Exception\NotFound $e) { return array('MKCALENDAR'); } } return array(); } /** * Returns a list of features for the DAV: HTTP header. * * @return array */ public function getFeatures() { return array('calendar-access', 'calendar-proxy'); } /** * Returns a plugin name. * * Using this name other plugins will be able to access other plugins * using DAV\Server::getPlugin * * @return string */ public function getPluginName() { return 'caldav'; } /** * Returns a list of reports this plugin supports. * * This will be used in the {DAV:}supported-report-set property. * Note that you still need to subscribe to the 'report' event to actually * implement them * * @param string $uri * @return array */ public function getSupportedReportSet($uri) { $node = $this->server->tree->getNodeForPath($uri); $reports = array(); if ($node instanceof ICalendar || $node instanceof ICalendarObject) { $reports[] = '{' . self::NS_CALDAV . '}calendar-multiget'; $reports[] = '{' . self::NS_CALDAV . '}calendar-query'; } if ($node instanceof ICalendar) { $reports[] = '{' . self::NS_CALDAV . '}free-busy-query'; } return $reports; } /** * Initializes the plugin * * @param DAV\Server $server * @return void */ public function initialize(DAV\Server $server) { $this->server = $server; $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); //$server->subscribeEvent('unknownMethod',array($this,'unknownMethod2'),1000); $server->subscribeEvent('report',array($this,'report')); $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); $server->subscribeEvent('beforeMethod', array($this,'beforeMethod')); $server->xmlNamespaces[self::NS_CALDAV] = 'cal'; $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs'; $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'SabreForRainLoop\\CalDAV\\Property\\SupportedCalendarComponentSet'; $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'SabreForRainLoop\\CalDAV\\Property\\ScheduleCalendarTransp'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write'; $server->resourceTypeMapping['\\SabreForRainLoop\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification'; array_push($server->protectedProperties, '{' . self::NS_CALDAV . '}supported-calendar-component-set', '{' . self::NS_CALDAV . '}supported-calendar-data', '{' . self::NS_CALDAV . '}max-resource-size', '{' . self::NS_CALDAV . '}min-date-time', '{' . self::NS_CALDAV . '}max-date-time', '{' . self::NS_CALDAV . '}max-instances', '{' . self::NS_CALDAV . '}max-attendees-per-instance', '{' . self::NS_CALDAV . '}calendar-home-set', '{' . self::NS_CALDAV . '}supported-collation-set', '{' . self::NS_CALDAV . '}calendar-data', // scheduling extension '{' . self::NS_CALDAV . '}schedule-inbox-URL', '{' . self::NS_CALDAV . '}schedule-outbox-URL', '{' . self::NS_CALDAV . '}calendar-user-address-set', '{' . self::NS_CALDAV . '}calendar-user-type', // CalendarServer extensions '{' . self::NS_CALENDARSERVER . '}getctag', '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for', '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for', '{' . self::NS_CALENDARSERVER . '}notification-URL', '{' . self::NS_CALENDARSERVER . '}notificationtype' ); } /** * This function handles support for the MKCALENDAR method * * @param string $method * @param string $uri * @return bool */ public function unknownMethod($method, $uri) { switch ($method) { case 'MKCALENDAR' : $this->httpMkCalendar($uri); // false is returned to stop the propagation of the // unknownMethod event. return false; case 'POST' : // Checking if this is a text/calendar content type $contentType = $this->server->httpRequest->getHeader('Content-Type'); if (strpos($contentType, 'text/calendar')!==0) { return; } // Checking if we're talking to an outbox try { $node = $this->server->tree->getNodeForPath($uri); } catch (DAV\Exception\NotFound $e) { return; } if (!$node instanceof Schedule\IOutbox) return; $this->outboxRequest($node, $uri); return false; } } /** * This functions handles REPORT requests specific to CalDAV * * @param string $reportName * @param \DOMNode $dom * @return bool */ public function report($reportName,$dom) { switch($reportName) { case '{'.self::NS_CALDAV.'}calendar-multiget' : $this->calendarMultiGetReport($dom); return false; case '{'.self::NS_CALDAV.'}calendar-query' : $this->calendarQueryReport($dom); return false; case '{'.self::NS_CALDAV.'}free-busy-query' : $this->freeBusyQueryReport($dom); return false; } } /** * This function handles the MKCALENDAR HTTP method, which creates * a new calendar. * * @param string $uri * @return void */ public function httpMkCalendar($uri) { // Due to unforgivable bugs in iCal, we're completely disabling MKCALENDAR support // for clients matching iCal in the user agent //$ua = $this->server->httpRequest->getHeader('User-Agent'); //if (strpos($ua,'iCal/')!==false) { // throw new \SabreForRainLoop\DAV\Exception\Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.'); //} $body = $this->server->httpRequest->getBody(true); $properties = array(); if ($body) { $dom = DAV\XMLUtil::loadDOMDocument($body); foreach($dom->firstChild->childNodes as $child) { if (DAV\XMLUtil::toClarkNotation($child)!=='{DAV:}set') continue; foreach(DAV\XMLUtil::parseProperties($child,$this->server->propertyMap) as $k=>$prop) { $properties[$k] = $prop; } } } $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); $this->server->createCollection($uri,$resourceType,$properties); $this->server->httpResponse->sendStatus(201); $this->server->httpResponse->setHeader('Content-Length',0); } /** * beforeGetProperties * * This method handler is invoked before any after properties for a * resource are fetched. This allows us to add in any CalDAV specific * properties. * * @param string $path * @param DAV\INode $node * @param array $requestedProperties * @param array $returnedProperties * @return void */ public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) { if ($node instanceof DAVACL\IPrincipal) { // calendar-home-set property $calHome = '{' . self::NS_CALDAV . '}calendar-home-set'; if (in_array($calHome,$requestedProperties)) { $principalId = $node->getName(); $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/'; unset($requestedProperties[array_search($calHome, $requestedProperties)]); $returnedProperties[200][$calHome] = new DAV\Property\Href($calendarHomePath); } // schedule-outbox-URL property $scheduleProp = '{' . self::NS_CALDAV . '}schedule-outbox-URL'; if (in_array($scheduleProp,$requestedProperties)) { $principalId = $node->getName(); $outboxPath = self::CALENDAR_ROOT . '/' . $principalId . '/outbox'; unset($requestedProperties[array_search($scheduleProp, $requestedProperties)]); $returnedProperties[200][$scheduleProp] = new DAV\Property\Href($outboxPath); } // calendar-user-address-set property $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set'; if (in_array($calProp,$requestedProperties)) { $addresses = $node->getAlternateUriSet(); $addresses[] = $this->server->getBaseUri() . DAV\URLUtil::encodePath($node->getPrincipalUrl() . '/'); unset($requestedProperties[array_search($calProp, $requestedProperties)]); $returnedProperties[200][$calProp] = new DAV\Property\HrefList($addresses, false); } // These two properties are shortcuts for ical to easily find // other principals this principal has access to. $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for'; $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for'; if (in_array($propRead,$requestedProperties) || in_array($propWrite,$requestedProperties)) { $aclPlugin = $this->server->getPlugin('acl'); $membership = $aclPlugin->getPrincipalMembership($path); $readList = array(); $writeList = array(); foreach($membership as $group) { $groupNode = $this->server->tree->getNodeForPath($group); // If the node is either ap proxy-read or proxy-write // group, we grab the parent principal and add it to the // list. if ($groupNode instanceof Principal\IProxyRead) { list($readList[]) = DAV\URLUtil::splitPath($group); } if ($groupNode instanceof Principal\IProxyWrite) { list($writeList[]) = DAV\URLUtil::splitPath($group); } } if (in_array($propRead,$requestedProperties)) { unset($requestedProperties[$propRead]); $returnedProperties[200][$propRead] = new DAV\Property\HrefList($readList); } if (in_array($propWrite,$requestedProperties)) { unset($requestedProperties[$propWrite]); $returnedProperties[200][$propWrite] = new DAV\Property\HrefList($writeList); } } // notification-URL property $notificationUrl = '{' . self::NS_CALENDARSERVER . '}notification-URL'; if (($index = array_search($notificationUrl, $requestedProperties)) !== false) { $principalId = $node->getName(); $calendarHomePath = 'calendars/' . $principalId . '/notifications/'; unset($requestedProperties[$index]); $returnedProperties[200][$notificationUrl] = new DAV\Property\Href($calendarHomePath); } } // instanceof IPrincipal if ($node instanceof Notifications\INode) { $propertyName = '{' . self::NS_CALENDARSERVER . '}notificationtype'; if (($index = array_search($propertyName, $requestedProperties)) !== false) { $returnedProperties[200][$propertyName] = $node->getNotificationType(); unset($requestedProperties[$index]); } } // instanceof Notifications_INode if ($node instanceof ICalendarObject) { // The calendar-data property is not supposed to be a 'real' // property, but in large chunks of the spec it does act as such. // Therefore we simply expose it as a property. $calDataProp = '{' . Plugin::NS_CALDAV . '}calendar-data'; if (in_array($calDataProp, $requestedProperties)) { unset($requestedProperties[$calDataProp]); $val = $node->get(); if (is_resource($val)) $val = stream_get_contents($val); // Taking out \r to not screw up the xml output $returnedProperties[200][$calDataProp] = str_replace("\r","", $val); } } } /** * This function handles the calendar-multiget REPORT. * * This report is used by the client to fetch the content of a series * of urls. Effectively avoiding a lot of redundant requests. * * @param \DOMNode $dom * @return void */ public function calendarMultiGetReport($dom) { $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)); $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); $xpath = new \DOMXPath($dom); $xpath->registerNameSpace('cal',Plugin::NS_CALDAV); $xpath->registerNameSpace('dav','urn:DAV'); $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand'); if ($expand->length>0) { $expandElem = $expand->item(0); $start = $expandElem->getAttribute('start'); $end = $expandElem->getAttribute('end'); if(!$start || !$end) { throw new DAV\Exception\BadRequest('The "start" and "end" attributes are required for the CALDAV:expand element'); } $start = VObject\DateTimeParser::parseDateTime($start); $end = VObject\DateTimeParser::parseDateTime($end); if ($end <= $start) { throw new DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.'); } $expand = true; } else { $expand = false; } foreach($hrefElems as $elem) { $uri = $this->server->calculateUri($elem->nodeValue); list($objProps) = $this->server->getPropertiesForPath($uri,$properties); if ($expand && isset($objProps[200]['{' . self::NS_CALDAV . '}calendar-data'])) { $vObject = VObject\Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']); $vObject->expand($start, $end); $objProps[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); } $propertyList[]=$objProps; } $prefer = $this->server->getHTTPPRefer(); $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); } /** * This function handles the calendar-query REPORT * * This report is used by clients to request calendar objects based on * complex conditions. * * @param \DOMNode $dom * @return void */ public function calendarQueryReport($dom) { $parser = new CalendarQueryParser($dom); $parser->parse(); $node = $this->server->tree->getNodeForPath($this->server->getRequestUri()); $depth = $this->server->getHTTPDepth(0); // The default result is an empty array $result = array(); // The calendarobject was requested directly. In this case we handle // this locally. if ($depth == 0 && $node instanceof ICalendarObject) { $requestedCalendarData = true; $requestedProperties = $parser->requestedProperties; if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) { // We always retrieve calendar-data, as we need it for filtering. $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data'; // If calendar-data wasn't explicitly requested, we need to remove // it after processing. $requestedCalendarData = false; } $properties = $this->server->getPropertiesForPath( $this->server->getRequestUri(), $requestedProperties, 0 ); // This array should have only 1 element, the first calendar // object. $properties = current($properties); // If there wasn't any calendar-data returned somehow, we ignore // this. if (isset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) { $validator = new CalendarQueryValidator(); $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); if ($validator->validate($vObject,$parser->filters)) { // If the client didn't require the calendar-data property, // we won't give it back. if (!$requestedCalendarData) { unset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); } else { if ($parser->expand) { $vObject->expand($parser->expand['start'], $parser->expand['end']); $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); } } $result = array($properties); } } } // If we're dealing with a calendar, the calendar itself is responsible // for the calendar-query. if ($node instanceof ICalendar && $depth = 1) { $nodePaths = $node->calendarQuery($parser->filters); foreach($nodePaths as $path) { list($properties) = $this->server->getPropertiesForPath($this->server->getRequestUri() . '/' . $path, $parser->requestedProperties); if ($parser->expand) { // We need to do some post-processing $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']); $vObject->expand($parser->expand['start'], $parser->expand['end']); $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize(); } $result[] = $properties; } } $prefer = $this->server->getHTTPPRefer(); $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); } /** * This method is responsible for parsing the request and generating the * response for the CALDAV:free-busy-query REPORT. * * @param \DOMNode $dom * @return void */ protected function freeBusyQueryReport(\DOMNode $dom) { $start = null; $end = null; foreach($dom->firstChild->childNodes as $childNode) { $clark = DAV\XMLUtil::toClarkNotation($childNode); if ($clark == '{' . self::NS_CALDAV . '}time-range') { $start = $childNode->getAttribute('start'); $end = $childNode->getAttribute('end'); break; } } if ($start) { $start = VObject\DateTimeParser::parseDateTime($start); } if ($end) { $end = VObject\DateTimeParser::parseDateTime($end); } if (!$start && !$end) { throw new DAV\Exception\BadRequest('The freebusy report must have a time-range filter'); } $acl = $this->server->getPlugin('acl'); if (!$acl) { throw new DAV\Exception('The ACL plugin must be loaded for free-busy queries to work'); } $uri = $this->server->getRequestUri(); $acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy'); $calendar = $this->server->tree->getNodeForPath($uri); if (!$calendar instanceof ICalendar) { throw new DAV\Exception\NotImplemented('The free-busy-query REPORT is only implemented on calendars'); } // Doing a calendar-query first, to make sure we get the most // performance. $urls = $calendar->calendarQuery(array( 'name' => 'VCALENDAR', 'comp-filters' => array( array( 'name' => 'VEVENT', 'comp-filters' => array(), 'prop-filters' => array(), 'is-not-defined' => false, 'time-range' => array( 'start' => $start, 'end' => $end, ), ), ), 'prop-filters' => array(), 'is-not-defined' => false, 'time-range' => null, )); $objects = array_map(function($url) use ($calendar) { $obj = $calendar->getChild($url)->get(); return $obj; }, $urls); $generator = new VObject\FreeBusyGenerator(); $generator->setObjects($objects); $generator->setTimeRange($start, $end); $result = $generator->getResult(); $result = $result->serialize(); $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->setHeader('Content-Type', 'text/calendar'); $this->server->httpResponse->setHeader('Content-Length', strlen($result)); $this->server->httpResponse->sendBody($result); } /** * This method is triggered before a file gets updated with new content. * * This plugin uses this method to ensure that CalDAV objects receive * valid calendar data. * * @param string $path * @param DAV\IFile $node * @param resource $data * @return void */ public function beforeWriteContent($path, DAV\IFile $node, &$data) { if (!$node instanceof ICalendarObject) return; $this->validateICalendar($data, $path); } /** * This method is triggered before a new file is created. * * This plugin uses this method to ensure that newly created calendar * objects contain valid calendar data. * * @param string $path * @param resource $data * @param DAV\ICollection $parentNode * @return void */ public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) { if (!$parentNode instanceof Calendar) return; $this->validateICalendar($data, $path); } /** * This event is triggered before any HTTP request is handled. * * We use this to intercept GET calls to notification nodes, and return the * proper response. * * @param string $method * @param string $path * @return void */ public function beforeMethod($method, $path) { if ($method!=='GET') return; try { $node = $this->server->tree->getNodeForPath($path); } catch (DAV\Exception\NotFound $e) { return; } if (!$node instanceof Notifications\INode) return; if (!$this->server->checkPreconditions(true)) return false; $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->formatOutput = true; $root = $dom->createElement('cs:notification'); foreach($this->server->xmlNamespaces as $namespace => $prefix) { $root->setAttribute('xmlns:' . $prefix, $namespace); } $dom->appendChild($root); $node->getNotificationType()->serializeBody($this->server, $root); $this->server->httpResponse->setHeader('Content-Type','application/xml'); $this->server->httpResponse->setHeader('ETag',$node->getETag()); $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->sendBody($dom->saveXML()); return false; } /** * Checks if the submitted iCalendar data is in fact, valid. * * An exception is thrown if it's not. * * @param resource|string $data * @param string $path * @return void */ protected function validateICalendar(&$data, $path) { // If it's a stream, we convert it to a string first. if (is_resource($data)) { $data = stream_get_contents($data); } // Converting the data to unicode, if needed. $data = DAV\StringUtil::ensureUTF8($data); try { $vobj = VObject\Reader::read($data); } catch (VObject\ParseException $e) { throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage()); } if ($vobj->name !== 'VCALENDAR') { throw new DAV\Exception\UnsupportedMediaType('This collection can only support iCalendar objects.'); } // Get the Supported Components for the target calendar list($parentPath,$object) = DAV\URLUtil::splitPath($path); $calendarProperties = $this->server->getProperties($parentPath,array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set')); $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue(); $foundType = null; $foundUID = null; foreach($vobj->getComponents() as $component) { switch($component->name) { case 'VTIMEZONE' : continue 2; case 'VEVENT' : case 'VTODO' : case 'VJOURNAL' : if (is_null($foundType)) { $foundType = $component->name; if (!in_array($foundType, $supportedComponents)) { throw new Exception\InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType); } if (!isset($component->UID)) { throw new DAV\Exception\BadRequest('Every ' . $component->name . ' component must have an UID'); } $foundUID = (string)$component->UID; } else { if ($foundType !== $component->name) { throw new DAV\Exception\BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType); } if ($foundUID !== (string)$component->UID) { throw new DAV\Exception\BadRequest('Every ' . $component->name . ' in this object must have identical UIDs'); } } break; default : throw new DAV\Exception\BadRequest('You are not allowed to create components of type: ' . $component->name . ' here'); } } if (!$foundType) throw new DAV\Exception\BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL'); } /** * This method handles POST requests to the schedule-outbox. * * Currently, two types of requests are support: * * FREEBUSY requests from RFC 6638 * * Simple iTIP messages from draft-desruisseaux-caldav-sched-04 * * The latter is from an expired early draft of the CalDAV scheduling * extensions, but iCal depends on a feature from that spec, so we * implement it. * * @param Schedule\IOutbox $outboxNode * @param string $outboxUri * @return void */ public function outboxRequest(Schedule\IOutbox $outboxNode, $outboxUri) { // Parsing the request body try { $vObject = VObject\Reader::read($this->server->httpRequest->getBody(true)); } catch (VObject\ParseException $e) { throw new DAV\Exception\BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); } // The incoming iCalendar object must have a METHOD property, and a // component. The combination of both determines what type of request // this is. $componentType = null; foreach($vObject->getComponents() as $component) { if ($component->name !== 'VTIMEZONE') { $componentType = $component->name; break; } } if (is_null($componentType)) { throw new DAV\Exception\BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component'); } // Validating the METHOD $method = strtoupper((string)$vObject->METHOD); if (!$method) { throw new DAV\Exception\BadRequest('A METHOD property must be specified in iTIP messages'); } // So we support two types of requests: // // REQUEST with a VFREEBUSY component // REQUEST, REPLY, ADD, CANCEL on VEVENT components $acl = $this->server->getPlugin('acl'); if ($componentType === 'VFREEBUSY' && $method === 'REQUEST') { $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-query-freebusy'); $this->handleFreeBusyRequest($outboxNode, $vObject); } elseif ($componentType === 'VEVENT' && in_array($method, array('REQUEST','REPLY','ADD','CANCEL'))) { $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-post-vevent'); $this->handleEventNotification($outboxNode, $vObject); } else { throw new DAV\Exception\NotImplemented('SabreDAV supports only VFREEBUSY (REQUEST) and VEVENT (REQUEST, REPLY, ADD, CANCEL)'); } } /** * This method handles the REQUEST, REPLY, ADD and CANCEL methods for * VEVENT iTip messages. * * @return void */ protected function handleEventNotification(Schedule\IOutbox $outboxNode, VObject\Component $vObject) { $originator = $this->server->httpRequest->getHeader('Originator'); $recipients = $this->server->httpRequest->getHeader('Recipient'); if (!$originator) { throw new DAV\Exception\BadRequest('The Originator: header must be specified when making POST requests'); } if (!$recipients) { throw new DAV\Exception\BadRequest('The Recipient: header must be specified when making POST requests'); } $recipients = explode(',',$recipients); foreach($recipients as $k=>$recipient) { $recipient = trim($recipient); if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) { throw new DAV\Exception\BadRequest('Recipients must start with mailto: and must be valid email address'); } $recipient = substr($recipient, 7); $recipients[$k] = $recipient; } // We need to make sure that 'originator' matches one of the email // addresses of the selected principal. $principal = $outboxNode->getOwner(); $props = $this->server->getProperties($principal,array( '{' . self::NS_CALDAV . '}calendar-user-address-set', )); $addresses = array(); if (isset($props['{' . self::NS_CALDAV . '}calendar-user-address-set'])) { $addresses = $props['{' . self::NS_CALDAV . '}calendar-user-address-set']->getHrefs(); } $found = false; foreach($addresses as $address) { // Trimming the / on both sides, just in case.. if (rtrim(strtolower($originator),'/') === rtrim(strtolower($address),'/')) { $found = true; break; } } if (!$found) { throw new DAV\Exception\Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header'); } // If the Originator header was a url, and not a mailto: address.. // we're going to try to pull the mailto: from the vobject body. if (strtolower(substr($originator,0,7)) !== 'mailto:') { $originator = (string)$vObject->VEVENT->ORGANIZER; } if (strtolower(substr($originator,0,7)) !== 'mailto:') { throw new DAV\Exception\Forbidden('Could not find mailto: address in both the Orignator header, and the ORGANIZER property in the VEVENT'); } $originator = substr($originator,7); $result = $this->iMIPMessage($originator, $recipients, $vObject, $principal); $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->setHeader('Content-Type','application/xml'); $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); } /** * Sends an iMIP message by email. * * This method must return an array with status codes per recipient. * This should look something like: * * array( * 'user1@example.org' => '2.0;Success' * ) * * Formatting for this status code can be found at: * https://tools.ietf.org/html/rfc5545#section-3.8.8.3 * * A list of valid status codes can be found at: * https://tools.ietf.org/html/rfc5546#section-3.6 * * @param string $originator * @param array $recipients * @param VObject\Component $vObject * @param string $principal Principal url * @return array */ protected function iMIPMessage($originator, array $recipients, VObject\Component $vObject, $principal) { if (!$this->imipHandler) { $resultStatus = '5.2;This server does not support this operation'; } else { $this->imipHandler->sendMessage($originator, $recipients, $vObject, $principal); $resultStatus = '2.0;Success'; } $result = array(); foreach($recipients as $recipient) { $result[$recipient] = $resultStatus; } return $result; } /** * Generates a schedule-response XML body * * The recipients array is a key->value list, containing email addresses * and iTip status codes. See the iMIPMessage method for a description of * the value. * * @param array $recipients * @return string */ public function generateScheduleResponse(array $recipients) { $dom = new \DOMDocument('1.0','utf-8'); $dom->formatOutput = true; $xscheduleResponse = $dom->createElement('cal:schedule-response'); $dom->appendChild($xscheduleResponse); foreach($this->server->xmlNamespaces as $namespace=>$prefix) { $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace); } foreach($recipients as $recipient=>$status) { $xresponse = $dom->createElement('cal:response'); $xrecipient = $dom->createElement('cal:recipient'); $xrecipient->appendChild($dom->createTextNode($recipient)); $xresponse->appendChild($xrecipient); $xrequestStatus = $dom->createElement('cal:request-status'); $xrequestStatus->appendChild($dom->createTextNode($status)); $xresponse->appendChild($xrequestStatus); $xscheduleResponse->appendChild($xresponse); } return $dom->saveXML(); } /** * This method is responsible for parsing a free-busy query request and * returning it's result. * * @param Schedule\IOutbox $outbox * @param string $request * @return string */ protected function handleFreeBusyRequest(Schedule\IOutbox $outbox, VObject\Component $vObject) { $vFreeBusy = $vObject->VFREEBUSY; $organizer = $vFreeBusy->organizer; $organizer = (string)$organizer; // Validating if the organizer matches the owner of the inbox. $owner = $outbox->getOwner(); $caldavNS = '{' . Plugin::NS_CALDAV . '}'; $uas = $caldavNS . 'calendar-user-address-set'; $props = $this->server->getProperties($owner,array($uas)); if (empty($props[$uas]) || !in_array($organizer, $props[$uas]->getHrefs())) { throw new DAV\Exception\Forbidden('The organizer in the request did not match any of the addresses for the owner of this inbox'); } if (!isset($vFreeBusy->ATTENDEE)) { throw new DAV\Exception\BadRequest('You must at least specify 1 attendee'); } $attendees = array(); foreach($vFreeBusy->ATTENDEE as $attendee) { $attendees[]= (string)$attendee; } if (!isset($vFreeBusy->DTSTART) || !isset($vFreeBusy->DTEND)) { throw new DAV\Exception\BadRequest('DTSTART and DTEND must both be specified'); } $startRange = $vFreeBusy->DTSTART->getDateTime(); $endRange = $vFreeBusy->DTEND->getDateTime(); $results = array(); foreach($attendees as $attendee) { $results[] = $this->getFreeBusyForEmail($attendee, $startRange, $endRange, $vObject); } $dom = new \DOMDocument('1.0','utf-8'); $dom->formatOutput = true; $scheduleResponse = $dom->createElement('cal:schedule-response'); foreach($this->server->xmlNamespaces as $namespace=>$prefix) { $scheduleResponse->setAttribute('xmlns:' . $prefix,$namespace); } $dom->appendChild($scheduleResponse); foreach($results as $result) { $response = $dom->createElement('cal:response'); $recipient = $dom->createElement('cal:recipient'); $recipientHref = $dom->createElement('d:href'); $recipientHref->appendChild($dom->createTextNode($result['href'])); $recipient->appendChild($recipientHref); $response->appendChild($recipient); $reqStatus = $dom->createElement('cal:request-status'); $reqStatus->appendChild($dom->createTextNode($result['request-status'])); $response->appendChild($reqStatus); if (isset($result['calendar-data'])) { $calendardata = $dom->createElement('cal:calendar-data'); $calendardata->appendChild($dom->createTextNode(str_replace("\r\n","\n",$result['calendar-data']->serialize()))); $response->appendChild($calendardata); } $scheduleResponse->appendChild($response); } $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->setHeader('Content-Type','application/xml'); $this->server->httpResponse->sendBody($dom->saveXML()); } /** * Returns free-busy information for a specific address. The returned * data is an array containing the following properties: * * calendar-data : A VFREEBUSY VObject * request-status : an iTip status code. * href: The principal's email address, as requested * * The following request status codes may be returned: * * 2.0;description * * 3.7;description * * @param string $email address * @param \DateTime $start * @param \DateTime $end * @param VObject\Component $request * @return array */ protected function getFreeBusyForEmail($email, \DateTime $start, \DateTime $end, VObject\Component $request) { $caldavNS = '{' . Plugin::NS_CALDAV . '}'; $aclPlugin = $this->server->getPlugin('acl'); if (substr($email,0,7)==='mailto:') $email = substr($email,7); $result = $aclPlugin->principalSearch( array('{http://sabredav.org/ns}email-address' => $email), array( '{DAV:}principal-URL', $caldavNS . 'calendar-home-set', '{http://sabredav.org/ns}email-address', ) ); if (!count($result)) { return array( 'request-status' => '3.7;Could not find principal', 'href' => 'mailto:' . $email, ); } if (!isset($result[0][200][$caldavNS . 'calendar-home-set'])) { return array( 'request-status' => '3.7;No calendar-home-set property found', 'href' => 'mailto:' . $email, ); } $homeSet = $result[0][200][$caldavNS . 'calendar-home-set']->getHref(); // Grabbing the calendar list $objects = array(); foreach($this->server->tree->getNodeForPath($homeSet)->getChildren() as $node) { if (!$node instanceof ICalendar) { continue; } $aclPlugin->checkPrivileges($homeSet . $node->getName() ,$caldavNS . 'read-free-busy'); // Getting the list of object uris within the time-range $urls = $node->calendarQuery(array( 'name' => 'VCALENDAR', 'comp-filters' => array( array( 'name' => 'VEVENT', 'comp-filters' => array(), 'prop-filters' => array(), 'is-not-defined' => false, 'time-range' => array( 'start' => $start, 'end' => $end, ), ), ), 'prop-filters' => array(), 'is-not-defined' => false, 'time-range' => null, )); $calObjects = array_map(function($url) use ($node) { $obj = $node->getChild($url)->get(); return $obj; }, $urls); $objects = array_merge($objects,$calObjects); } $vcalendar = new VObject\Component\VCalendar(); $vcalendar->VERSION = '2.0'; $vcalendar->METHOD = 'REPLY'; $vcalendar->CALSCALE = 'GREGORIAN'; $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN'; $generator = new VObject\FreeBusyGenerator(); $generator->setObjects($objects); $generator->setTimeRange($start, $end); $generator->setBaseObject($vcalendar); $result = $generator->getResult(); $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email; $vcalendar->VFREEBUSY->UID = (string)$request->VFREEBUSY->UID; $vcalendar->VFREEBUSY->ORGANIZER = clone $request->VFREEBUSY->ORGANIZER; return array( 'calendar-data' => $result, 'request-status' => '2.0;Success', 'href' => 'mailto:' . $email, ); } /** * This method is used to generate HTML output for the * DAV\Browser\Plugin. This allows us to generate an interface users * can use to create new calendars. * * @param DAV\INode $node * @param string $output * @return bool */ public function htmlActionsPanel(DAV\INode $node, &$output) { if (!$node instanceof UserCalendars) return; $output.= '

Create new calendar



'; return false; } /** * This method allows us to intercept the 'mkcalendar' sabreAction. This * action enables the user to create new calendars from the browser plugin. * * @param string $uri * @param string $action * @param array $postVars * @return bool */ public function browserPostAction($uri, $action, array $postVars) { if ($action!=='mkcalendar') return; $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar'); $properties = array(); if (isset($postVars['{DAV:}displayname'])) { $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; } $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Principal/000077500000000000000000000000001361462701300304425ustar00rootroot00000000000000Collection.php000066400000000000000000000015731361462701300331750ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/PrincipalprincipalBackend, $principalInfo); } } IProxyRead.php000066400000000000000000000007361361462701300331300ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/PrincipalprincipalInfo = $principalInfo; $this->principalBackend = $principalBackend; } /** * Returns this principals name. * * @return string */ public function getName() { return 'calendar-proxy-read'; } /** * Returns the last modification time * * @return null */ public function getLastModified() { return null; } /** * Deletes the current node * * @throws DAV\Exception\Forbidden * @return void */ public function delete() { throw new DAV\Exception\Forbidden('Permission denied to delete node'); } /** * Renames the node * * @throws DAV\Exception\Forbidden * @param string $name The new name * @return void */ public function setName($name) { throw new DAV\Exception\Forbidden('Permission denied to rename file'); } /** * Returns a list of alternative urls for a principal * * This can for example be an email address, or ldap url. * * @return array */ public function getAlternateUriSet() { return array(); } /** * Returns the full principal url * * @return string */ public function getPrincipalUrl() { return $this->principalInfo['uri'] . '/' . $this->getName(); } /** * Returns the list of group members * * If this principal is a group, this function should return * all member principal uri's for the group. * * @return array */ public function getGroupMemberSet() { return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); } /** * Returns the list of groups this principal is member of * * If this principal is a member of a (list of) groups, this function * should return a list of principal uri's for it's members. * * @return array */ public function getGroupMembership() { return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); } /** * Sets a list of group members * * If this principal is a group, this method sets all the group members. * The list of members is always overwritten, never appended to. * * This method should throw an exception if the members could not be set. * * @param array $principals * @return void */ public function setGroupMemberSet(array $principals) { $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); } /** * Returns the displayname * * This should be a human readable name for the principal. * If none is available, return the nodename. * * @return string */ public function getDisplayName() { return $this->getName(); } } ProxyWrite.php000066400000000000000000000077221361462701300332400ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/PrincipalprincipalInfo = $principalInfo; $this->principalBackend = $principalBackend; } /** * Returns this principals name. * * @return string */ public function getName() { return 'calendar-proxy-write'; } /** * Returns the last modification time * * @return null */ public function getLastModified() { return null; } /** * Deletes the current node * * @throws DAV\Exception\Forbidden * @return void */ public function delete() { throw new DAV\Exception\Forbidden('Permission denied to delete node'); } /** * Renames the node * * @throws DAV\Exception\Forbidden * @param string $name The new name * @return void */ public function setName($name) { throw new DAV\Exception\Forbidden('Permission denied to rename file'); } /** * Returns a list of alternative urls for a principal * * This can for example be an email address, or ldap url. * * @return array */ public function getAlternateUriSet() { return array(); } /** * Returns the full principal url * * @return string */ public function getPrincipalUrl() { return $this->principalInfo['uri'] . '/' . $this->getName(); } /** * Returns the list of group members * * If this principal is a group, this function should return * all member principal uri's for the group. * * @return array */ public function getGroupMemberSet() { return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl()); } /** * Returns the list of groups this principal is member of * * If this principal is a member of a (list of) groups, this function * should return a list of principal uri's for it's members. * * @return array */ public function getGroupMembership() { return $this->principalBackend->getGroupMembership($this->getPrincipalUrl()); } /** * Sets a list of group members * * If this principal is a group, this method sets all the group members. * The list of members is always overwritten, never appended to. * * This method should throw an exception if the members could not be set. * * @param array $principals * @return void */ public function setGroupMemberSet(array $principals) { $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals); } /** * Returns the displayname * * This should be a human readable name for the principal. * If none is available, return the nodename. * * @return string */ public function getDisplayName() { return $this->getName(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Principal/User.php000066400000000000000000000074761361462701300321070ustar00rootroot00000000000000principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/' . $name); if (!$principal) { throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found'); } if ($name === 'calendar-proxy-read') return new ProxyRead($this->principalBackend, $this->principalProperties); if ($name === 'calendar-proxy-write') return new ProxyWrite($this->principalBackend, $this->principalProperties); throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found'); } /** * Returns an array with all the child nodes * * @return DAV\INode[] */ public function getChildren() { $r = array(); if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-read')) { $r[] = new ProxyRead($this->principalBackend, $this->principalProperties); } if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-write')) { $r[] = new ProxyWrite($this->principalBackend, $this->principalProperties); } return $r; } /** * Returns whether or not the child node exists * * @param string $name * @return bool */ public function childExists($name) { try { $this->getChild($name); return true; } catch (DAV\Exception\NotFound $e) { return false; } } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { $acl = parent::getACL(); $acl[] = array( 'privilege' => '{DAV:}read', 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-read', 'protected' => true, ); $acl[] = array( 'privilege' => '{DAV:}read', 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-write', 'protected' => true, ); return $acl; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Property/000077500000000000000000000000001361462701300303455ustar00rootroot00000000000000AllowedSharingModes.php000066400000000000000000000036341361462701300347000ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/PropertycanBeShared = $canBeShared; $this->canBePublished = $canBePublished; } /** * Serializes the property in a DOMDocument * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server, \DOMElement $node) { $doc = $node->ownerDocument; if ($this->canBeShared) { $xcomp = $doc->createElement('cs:can-be-shared'); $node->appendChild($xcomp); } if ($this->canBePublished) { $xcomp = $doc->createElement('cs:can-be-published'); $node->appendChild($xcomp); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Property/Invite.php000066400000000000000000000167641361462701300323320ustar00rootroot00000000000000users = $users; $this->organizer = $organizer; } /** * Returns the list of users, as it was passed to the constructor. * * @return array */ public function getValue() { return $this->users; } /** * Serializes the property in a DOMDocument * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server,\DOMElement $node) { $doc = $node->ownerDocument; if (!is_null($this->organizer)) { $xorganizer = $doc->createElement('cs:organizer'); $href = $doc->createElement('d:href'); $href->appendChild($doc->createTextNode($this->organizer['href'])); $xorganizer->appendChild($href); if (isset($this->organizer['commonName']) && $this->organizer['commonName']) { $commonName = $doc->createElement('cs:common-name'); $commonName->appendChild($doc->createTextNode($this->organizer['commonName'])); $xorganizer->appendChild($commonName); } if (isset($this->organizer['firstName']) && $this->organizer['firstName']) { $firstName = $doc->createElement('cs:first-name'); $firstName->appendChild($doc->createTextNode($this->organizer['firstName'])); $xorganizer->appendChild($firstName); } if (isset($this->organizer['lastName']) && $this->organizer['lastName']) { $lastName = $doc->createElement('cs:last-name'); $lastName->appendChild($doc->createTextNode($this->organizer['lastName'])); $xorganizer->appendChild($lastName); } $node->appendChild($xorganizer); } foreach($this->users as $user) { $xuser = $doc->createElement('cs:user'); $href = $doc->createElement('d:href'); $href->appendChild($doc->createTextNode($user['href'])); $xuser->appendChild($href); if (isset($user['commonName']) && $user['commonName']) { $commonName = $doc->createElement('cs:common-name'); $commonName->appendChild($doc->createTextNode($user['commonName'])); $xuser->appendChild($commonName); } switch($user['status']) { case SharingPlugin::STATUS_ACCEPTED : $status = $doc->createElement('cs:invite-accepted'); $xuser->appendChild($status); break; case SharingPlugin::STATUS_DECLINED : $status = $doc->createElement('cs:invite-declined'); $xuser->appendChild($status); break; case SharingPlugin::STATUS_NORESPONSE : $status = $doc->createElement('cs:invite-noresponse'); $xuser->appendChild($status); break; case SharingPlugin::STATUS_INVALID : $status = $doc->createElement('cs:invite-invalid'); $xuser->appendChild($status); break; } $xaccess = $doc->createElement('cs:access'); if ($user['readOnly']) { $xaccess->appendChild( $doc->createElement('cs:read') ); } else { $xaccess->appendChild( $doc->createElement('cs:read-write') ); } $xuser->appendChild($xaccess); if (isset($user['summary']) && $user['summary']) { $summary = $doc->createElement('cs:summary'); $summary->appendChild($doc->createTextNode($user['summary'])); $xuser->appendChild($summary); } $node->appendChild($xuser); } } /** * Unserializes the property. * * This static method should return a an instance of this object. * * @param \DOMElement $prop * @return DAV\IProperty */ static function unserialize(\DOMElement $prop) { $xpath = new \DOMXPath($prop->ownerDocument); $xpath->registerNamespace('cs', CalDAV\Plugin::NS_CALENDARSERVER); $xpath->registerNamespace('d', 'urn:DAV'); $users = array(); foreach($xpath->query('cs:user', $prop) as $user) { $status = null; if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) { $status = SharingPlugin::STATUS_ACCEPTED; } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) { $status = SharingPlugin::STATUS_DECLINED; } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) { $status = SharingPlugin::STATUS_NORESPONSE; } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) { $status = SharingPlugin::STATUS_INVALID; } else { throw new DAV\Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid'); } $users[] = array( 'href' => $xpath->evaluate('string(d:href)', $user), 'commonName' => $xpath->evaluate('string(cs:common-name)', $user), 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user), 'summary' => $xpath->evaluate('string(cs:summary)', $user), 'status' => $status, ); } return new self($users); } } ScheduleCalendarTransp.php000066400000000000000000000052311361462701300353560ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Propertyvalue = $value; } /** * Returns the current value * * @return string */ public function getValue() { return $this->value; } /** * Serializes the property in a DOMDocument * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server,\DOMElement $node) { $doc = $node->ownerDocument; switch($this->value) { case self::TRANSPARENT : $xval = $doc->createElement('cal:transparent'); break; case self::OPAQUE : $xval = $doc->createElement('cal:opaque'); break; } $node->appendChild($xval); } /** * Unserializes the DOMElement back into a Property class. * * @param \DOMElement $node * @return ScheduleCalendarTransp */ static function unserialize(\DOMElement $node) { $value = null; foreach($node->childNodes as $childNode) { switch(DAV\XMLUtil::toClarkNotation($childNode)) { case '{' . CalDAV\Plugin::NS_CALDAV . '}opaque' : $value = self::OPAQUE; break; case '{' . CalDAV\Plugin::NS_CALDAV . '}transparent' : $value = self::TRANSPARENT; break; } } if (is_null($value)) return null; return new self($value); } } SupportedCalendarComponentSet.php000066400000000000000000000040701361462701300367560ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Propertycomponents = $components; } /** * Returns the list of supported components * * @return array */ public function getValue() { return $this->components; } /** * Serializes the property in a DOMDocument * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server,\DOMElement $node) { $doc = $node->ownerDocument; foreach($this->components as $component) { $xcomp = $doc->createElement('cal:comp'); $xcomp->setAttribute('name',$component); $node->appendChild($xcomp); } } /** * Unserializes the DOMElement back into a Property class. * * @param \DOMElement $node * @return Property_SupportedCalendarComponentSet */ static function unserialize(\DOMElement $node) { $components = array(); foreach($node->childNodes as $childNode) { if (DAV\XMLUtil::toClarkNotation($childNode)==='{' . CalDAV\Plugin::NS_CALDAV . '}comp') { $components[] = $childNode->getAttribute('name'); } } return new self($components); } } SupportedCalendarData.php000066400000000000000000000022771361462701300352200ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/PropertyownerDocument; $prefix = isset($server->xmlNamespaces[Plugin::NS_CALDAV])?$server->xmlNamespaces[Plugin::NS_CALDAV]:'cal'; $caldata = $doc->createElement($prefix . ':calendar-data'); $caldata->setAttribute('content-type','text/calendar'); $caldata->setAttribute('version','2.0'); $node->appendChild($caldata); } } SupportedCollationSet.php000066400000000000000000000023201361462701300353020ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/PropertyownerDocument; $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav'); if (!$prefix) $prefix = 'cal'; $node->appendChild( $doc->createElement($prefix . ':supported-collation','i;ascii-casemap') ); $node->appendChild( $doc->createElement($prefix . ':supported-collation','i;octet') ); $node->appendChild( $doc->createElement($prefix . ':supported-collation','i;unicode-casemap') ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/000077500000000000000000000000001361462701300302555ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IMip.php000066400000000000000000000064471361462701300316370ustar00rootroot00000000000000senderEmail = $senderEmail; } /** * Sends one or more iTip messages through email. * * @param string $originator Originator Email * @param array $recipients Array of email addresses * @param VObject\Component $vObject * @param string $principal Principal Url of the originator * @return void */ public function sendMessage($originator, array $recipients, VObject\Component $vObject, $principal) { foreach($recipients as $recipient) { $to = $recipient; $replyTo = $originator; $subject = 'SabreDAV iTIP message'; switch(strtoupper($vObject->METHOD)) { case 'REPLY' : $subject = 'Response for: ' . $vObject->VEVENT->SUMMARY; break; case 'REQUEST' : $subject = 'Invitation for: ' .$vObject->VEVENT->SUMMARY; break; case 'CANCEL' : $subject = 'Cancelled event: ' . $vObject->VEVENT->SUMMARY; break; } $headers = array(); $headers[] = 'Reply-To: ' . $replyTo; $headers[] = 'From: ' . $this->senderEmail; $headers[] = 'Content-Type: text/calendar; method=' . (string)$vObject->method . '; charset=utf-8'; if (DAV\Server::$exposeVersion) { $headers[] = 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY; } $vcalBody = $vObject->serialize(); $this->mail($to, $subject, $vcalBody, $headers); } } // @codeCoverageIgnoreStart // This is deemed untestable in a reasonable manner /** * This function is reponsible for sending the actual email. * * @param string $to Recipient email address * @param string $subject Subject of the email * @param string $body iCalendar body * @param array $headers List of headers * @return void */ protected function mail($to, $subject, $body, array $headers) { mail($to, $subject, $body, implode("\r\n", $headers)); } // @codeCoverageIgnoreEnd } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Schedule/IOutbox.php000066400000000000000000000006761361462701300323700ustar00rootroot00000000000000principalUri = $principalUri; } /** * Returns the name of the node. * * This is used to generate the url. * * @return string */ public function getName() { return 'outbox'; } /** * Returns an array with all the child nodes * * @return \SabreForRainLoop\DAV\INode[] */ public function getChildren() { return array(); } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->principalUri; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy', 'principal' => $this->getOwner(), 'protected' => true, ), array( 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent', 'principal' => $this->getOwner(), 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->getOwner(), 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\MethodNotAllowed('You\'re not allowed to update the ACL'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet(); $default['aggregates'][] = array( 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy', ); $default['aggregates'][] = array( 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent', ); return $default; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/ShareableCalendar.php000066400000000000000000000041111361462701300325470ustar00rootroot00000000000000caldavBackend->updateShares($this->calendarInfo['id'], $add, $remove); } /** * Returns the list of people whom this calendar is shared with. * * Every element in this array should have the following properties: * * href - Often a mailto: address * * commonName - Optional, for example a first + last name * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants. * * readOnly - boolean * * summary - Optional, a description for the share * * @return array */ public function getShares() { return $this->caldavBackend->getShares($this->calendarInfo['id']); } /** * Marks this calendar as published. * * Publishing a calendar should automatically create a read-only, public, * subscribable calendar. * * @param bool $value * @return void */ public function setPublishStatus($value) { $this->caldavBackend->setPublishStatus($this->calendarInfo['id'], $value); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/SharedCalendar.php000066400000000000000000000065541361462701300321040ustar00rootroot00000000000000calendarInfo['{http://calendarserver.org/ns/}shared-url']; } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->calendarInfo['{http://sabredav.org/ns}owner-principal']; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { // The top-level ACL only contains access information for the true // owner of the calendar, so we need to add the information for the // sharee. $acl = parent::getACL(); $acl[] = array( 'privilege' => '{DAV:}read', 'principal' => $this->calendarInfo['principaluri'], 'protected' => true, ); if (!$this->calendarInfo['{http://sabredav.org/ns}read-only']) { $acl[] = array( 'privilege' => '{DAV:}write', 'principal' => $this->calendarInfo['principaluri'], 'protected' => true, ); } return $acl; } /** * Returns the list of people whom this calendar is shared with. * * Every element in this array should have the following properties: * * href - Often a mailto: address * * commonName - Optional, for example a first + last name * * status - See the SabreForRainLoop\CalDAV\SharingPlugin::STATUS_ constants. * * readOnly - boolean * * summary - Optional, a description for the share * * @return array */ public function getShares() { return $this->caldavBackend->getShares($this->calendarInfo['id']); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/SharingPlugin.php000066400000000000000000000431511361462701300320100ustar00rootroot00000000000000server = $server; $server->resourceTypeMapping['SabreForRainLoop\\CalDAV\\ISharedCalendar'] = '{' . Plugin::NS_CALENDARSERVER . '}shared'; array_push( $this->server->protectedProperties, '{' . Plugin::NS_CALENDARSERVER . '}invite', '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes', '{' . Plugin::NS_CALENDARSERVER . '}shared-url' ); $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); $this->server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); $this->server->subscribeEvent('updateProperties', array($this, 'updateProperties')); $this->server->subscribeEvent('unknownMethod', array($this,'unknownMethod')); } /** * This event is triggered when properties are requested for a certain * node. * * This allows us to inject any properties early. * * @param string $path * @param DAV\INode $node * @param array $requestedProperties * @param array $returnedProperties * @return void */ public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) { if ($node instanceof IShareableCalendar) { if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { unset($requestedProperties[$index]); $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] = new Property\Invite( $node->getShares() ); } } if ($node instanceof ISharedCalendar) { if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}shared-url', $requestedProperties))!==false) { unset($requestedProperties[$index]); $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}shared-url'] = new DAV\Property\Href( $node->getSharedUrl() ); } // The 'invite' property is slightly different for the 'shared' // instance of the calendar, as it also contains the owner // information. if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) { unset($requestedProperties[$index]); // Fetching owner information $props = $this->server->getPropertiesForPath($node->getOwner(), array( '{http://sabredav.org/ns}email-address', '{DAV:}displayname', ), 1); $ownerInfo = array( 'href' => $node->getOwner(), ); if (isset($props[0][200])) { // We're mapping the internal webdav properties to the // elements caldav-sharing expects. if (isset($props[0][200]['{http://sabredav.org/ns}email-address'])) { $ownerInfo['href'] = 'mailto:' . $props[0][200]['{http://sabredav.org/ns}email-address']; } if (isset($props[0][200]['{DAV:}displayname'])) { $ownerInfo['commonName'] = $props[0][200]['{DAV:}displayname']; } } $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] = new Property\Invite( $node->getShares(), $ownerInfo ); } } } /** * This method is triggered *after* all properties have been retrieved. * This allows us to inject the correct resourcetype for calendars that * have been shared. * * @param string $path * @param array $properties * @param DAV\INode $node * @return void */ public function afterGetProperties($path, &$properties, DAV\INode $node) { if ($node instanceof IShareableCalendar) { if (isset($properties[200]['{DAV:}resourcetype'])) { if (count($node->getShares())>0) { $properties[200]['{DAV:}resourcetype']->add( '{' . Plugin::NS_CALENDARSERVER . '}shared-owner' ); } } $propName = '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes'; if (array_key_exists($propName, $properties[404])) { unset($properties[404][$propName]); $properties[200][$propName] = new Property\AllowedSharingModes(true,false); } } } /** * This method is trigged when a user attempts to update a node's * properties. * * A previous draft of the sharing spec stated that it was possible to use * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing * the calendar. * * Even though this is no longer in the current spec, we keep this around * because OS X 10.7 may still make use of this feature. * * @param array $mutations * @param array $result * @param DAV\INode $node * @return void */ public function updateProperties(array &$mutations, array &$result, DAV\INode $node) { if (!$node instanceof IShareableCalendar) return; if (!isset($mutations['{DAV:}resourcetype'])) { return; } // Only doing something if shared-owner is indeed not in the list. if($mutations['{DAV:}resourcetype']->is('{' . Plugin::NS_CALENDARSERVER . '}shared-owner')) return; $shares = $node->getShares(); $remove = array(); foreach($shares as $share) { $remove[] = $share['href']; } $node->updateShares(array(), $remove); // We're marking this update as 200 OK $result[200]['{DAV:}resourcetype'] = null; // Removing it from the mutations list unset($mutations['{DAV:}resourcetype']); } /** * This event is triggered when the server didn't know how to handle a * certain request. * * We intercept this to handle POST requests on calendars. * * @param string $method * @param string $uri * @return null|bool */ public function unknownMethod($method, $uri) { if ($method!=='POST') { return; } // Only handling xml $contentType = $this->server->httpRequest->getHeader('Content-Type'); if (strpos($contentType,'application/xml')===false && strpos($contentType,'text/xml')===false) return; // Making sure the node exists try { $node = $this->server->tree->getNodeForPath($uri); } catch (DAV\Exception\NotFound $e) { return; } $requestBody = $this->server->httpRequest->getBody(true); // If this request handler could not deal with this POST request, it // will return 'null' and other plugins get a chance to handle the // request. // // However, we already requested the full body. This is a problem, // because a body can only be read once. This is why we preemptively // re-populated the request body with the existing data. $this->server->httpRequest->setBody($requestBody); $dom = DAV\XMLUtil::loadDOMDocument($requestBody); $documentType = DAV\XMLUtil::toClarkNotation($dom->firstChild); switch($documentType) { // Dealing with the 'share' document, which modified invitees on a // calendar. case '{' . Plugin::NS_CALENDARSERVER . '}share' : // We can only deal with IShareableCalendar objects if (!$node instanceof IShareableCalendar) { return; } // Getting ACL info $acl = $this->server->getPlugin('acl'); // If there's no ACL support, we allow everything if ($acl) { $acl->checkPrivileges($uri, '{DAV:}write'); } $mutations = $this->parseShareRequest($dom); $node->updateShares($mutations[0], $mutations[1]); $this->server->httpResponse->sendStatus(200); // Adding this because sending a response body may cause issues, // and I wanted some type of indicator the response was handled. $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); // Breaking the event chain return false; // The invite-reply document is sent when the user replies to an // invitation of a calendar share. case '{'. Plugin::NS_CALENDARSERVER.'}invite-reply' : // This only works on the calendar-home-root node. if (!$node instanceof UserCalendars) { return; } // Getting ACL info $acl = $this->server->getPlugin('acl'); // If there's no ACL support, we allow everything if ($acl) { $acl->checkPrivileges($uri, '{DAV:}write'); } $message = $this->parseInviteReplyRequest($dom); $url = $node->shareReply( $message['href'], $message['status'], $message['calendarUri'], $message['inReplyTo'], $message['summary'] ); $this->server->httpResponse->sendStatus(200); // Adding this because sending a response body may cause issues, // and I wanted some type of indicator the response was handled. $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); if ($url) { $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->formatOutput = true; $root = $dom->createElement('cs:shared-as'); foreach($this->server->xmlNamespaces as $namespace => $prefix) { $root->setAttribute('xmlns:' . $prefix, $namespace); } $dom->appendChild($root); $href = new DAV\Property\Href($url); $href->serialize($this->server, $root); $this->server->httpResponse->setHeader('Content-Type','application/xml'); $this->server->httpResponse->sendBody($dom->saveXML()); } // Breaking the event chain return false; case '{' . Plugin::NS_CALENDARSERVER . '}publish-calendar' : // We can only deal with IShareableCalendar objects if (!$node instanceof IShareableCalendar) { return; } // Getting ACL info $acl = $this->server->getPlugin('acl'); // If there's no ACL support, we allow everything if ($acl) { $acl->checkPrivileges($uri, '{DAV:}write'); } $node->setPublishStatus(true); // iCloud sends back the 202, so we will too. $this->server->httpResponse->sendStatus(202); // Adding this because sending a response body may cause issues, // and I wanted some type of indicator the response was handled. $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); // Breaking the event chain return false; case '{' . Plugin::NS_CALENDARSERVER . '}unpublish-calendar' : // We can only deal with IShareableCalendar objects if (!$node instanceof IShareableCalendar) { return; } // Getting ACL info $acl = $this->server->getPlugin('acl'); // If there's no ACL support, we allow everything if ($acl) { $acl->checkPrivileges($uri, '{DAV:}write'); } $node->setPublishStatus(false); $this->server->httpResponse->sendStatus(200); // Adding this because sending a response body may cause issues, // and I wanted some type of indicator the response was handled. $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well'); // Breaking the event chain return false; } } /** * Parses the 'share' POST request. * * This method returns an array, containing two arrays. * The first array is a list of new sharees. Every element is a struct * containing a: * * href element. (usually a mailto: address) * * commonName element (often a first and lastname, but can also be * false) * * readOnly (true or false) * * summary (A description of the share, can also be false) * * The second array is a list of sharees that are to be removed. This is * just a simple array with 'hrefs'. * * @param \DOMDocument $dom * @return array */ protected function parseShareRequest(\DOMDocument $dom) { $xpath = new \DOMXPath($dom); $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER); $xpath->registerNamespace('d', 'urn:DAV'); $set = array(); $elems = $xpath->query('cs:set'); for($i=0; $i < $elems->length; $i++) { $xset = $elems->item($i); $set[] = array( 'href' => $xpath->evaluate('string(d:href)', $xset), 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset), 'summary' => $xpath->evaluate('string(cs:summary)', $xset), 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset)!==false ); } $remove = array(); $elems = $xpath->query('cs:remove'); for($i=0; $i < $elems->length; $i++) { $xremove = $elems->item($i); $remove[] = $xpath->evaluate('string(d:href)', $xremove); } return array($set, $remove); } /** * Parses the 'invite-reply' POST request. * * This method returns an array, containing the following properties: * * href - The sharee who is replying * * status - One of the self::STATUS_* constants * * calendarUri - The url of the shared calendar * * inReplyTo - The unique id of the share invitation. * * summary - Optional description of the reply. * * @param \DOMDocument $dom * @return array */ protected function parseInviteReplyRequest(\DOMDocument $dom) { $xpath = new \DOMXPath($dom); $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER); $xpath->registerNamespace('d', 'urn:DAV'); $hostHref = $xpath->evaluate('string(cs:hosturl/d:href)'); if (!$hostHref) { throw new DAV\Exception\BadRequest('The {' . Plugin::NS_CALENDARSERVER . '}hosturl/{DAV:}href element is required'); } return array( 'href' => $xpath->evaluate('string(d:href)'), 'calendarUri' => $this->server->calculateUri($hostHref), 'inReplyTo' => $xpath->evaluate('string(cs:in-reply-to)'), 'summary' => $xpath->evaluate('string(cs:summary)'), 'status' => $xpath->evaluate('boolean(cs:invite-accepted)')?self::STATUS_ACCEPTED:self::STATUS_DECLINED ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/UserCalendars.php000066400000000000000000000216521361462701300317730ustar00rootroot00000000000000caldavBackend = $caldavBackend; $this->principalInfo = $principalInfo; } /** * Returns the name of this object * * @return string */ public function getName() { list(,$name) = DAV\URLUtil::splitPath($this->principalInfo['uri']); return $name; } /** * Updates the name of this object * * @param string $name * @return void */ public function setName($name) { throw new DAV\Exception\Forbidden(); } /** * Deletes this object * * @return void */ public function delete() { throw new DAV\Exception\Forbidden(); } /** * Returns the last modification date * * @return int */ public function getLastModified() { return null; } /** * Creates a new file under this object. * * This is currently not allowed * * @param string $filename * @param resource $data * @return void */ public function createFile($filename, $data=null) { throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); } /** * Creates a new directory under this object. * * This is currently not allowed. * * @param string $filename * @return void */ public function createDirectory($filename) { throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); } /** * Returns a single calendar, by name * * @param string $name * @todo needs optimizing * @return Calendar */ public function getChild($name) { foreach($this->getChildren() as $child) { if ($name==$child->getName()) return $child; } throw new DAV\Exception\NotFound('Calendar with name \'' . $name . '\' could not be found'); } /** * Checks if a calendar exists. * * @param string $name * @todo needs optimizing * @return bool */ public function childExists($name) { foreach($this->getChildren() as $child) { if ($name==$child->getName()) return true; } return false; } /** * Returns a list of calendars * * @return array */ public function getChildren() { $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); $objs = array(); foreach($calendars as $calendar) { if ($this->caldavBackend instanceof Backend\SharingSupport) { if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) { $objs[] = new SharedCalendar($this->caldavBackend, $calendar); } else { $objs[] = new ShareableCalendar($this->caldavBackend, $calendar); } } else { $objs[] = new Calendar($this->caldavBackend, $calendar); } } $objs[] = new Schedule\Outbox($this->principalInfo['uri']); // We're adding a notifications node, if it's supported by the backend. if ($this->caldavBackend instanceof Backend\NotificationSupport) { $objs[] = new Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']); } return $objs; } /** * Creates a new calendar * * @param string $name * @param array $resourceType * @param array $properties * @return void */ public function createExtendedCollection($name, array $resourceType, array $properties) { $isCalendar = false; foreach($resourceType as $rt) { switch ($rt) { case '{DAV:}collection' : case '{http://calendarserver.org/ns/}shared-owner' : // ignore break; case '{urn:ietf:params:xml:ns:caldav}calendar' : $isCalendar = true; break; default : throw new DAV\Exception\InvalidResourceType('Unknown resourceType: ' . $rt); } } if (!$isCalendar) { throw new DAV\Exception\InvalidResourceType('You can only create calendars in this collection'); } $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties); } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->principalInfo['uri']; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->principalInfo['uri'], 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->principalInfo['uri'], 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read', 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } /** * This method is called when a user replied to a request to share. * * This method should return the url of the newly created calendar if the * share was accepted. * * @param string href The sharee who is replying (often a mailto: address) * @param int status One of the SharingPlugin::STATUS_* constants * @param string $calendarUri The url to the calendar thats being shared * @param string $inReplyTo The unique id this message is a response to * @param string $summary A description of the reply * @return null|string */ public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) { if (!$this->caldavBackend instanceof Backend\SharingSupport) { throw new DAV\Exception\NotImplemented('Sharing support is not implemented by this backend.'); } return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CalDAV/Version.php000066400000000000000000000007631361462701300306650ustar00rootroot00000000000000carddavBackend = $carddavBackend; $this->addressBookInfo = $addressBookInfo; } /** * Returns the name of the addressbook * * @return string */ public function getName() { return $this->addressBookInfo['uri']; } /** * Returns a card * * @param string $name * @return \ICard */ public function getChild($name) { $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); if (!$obj) throw new DAV\Exception\NotFound('Card not found'); return new Card($this->carddavBackend,$this->addressBookInfo,$obj); } /** * Returns the full list of cards * * @return array */ public function getChildren() { $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); $children = array(); foreach($objs as $obj) { $children[] = new Card($this->carddavBackend,$this->addressBookInfo,$obj); } return $children; } /** * Creates a new directory * * We actually block this, as subdirectories are not allowed in addressbooks. * * @param string $name * @return void */ public function createDirectory($name) { throw new DAV\Exception\MethodNotAllowed('Creating collections in addressbooks is not allowed'); } /** * Creates a new file * * The contents of the new file must be a valid VCARD. * * This method may return an ETag. * * @param string $name * @param resource $vcardData * @return string|null */ public function createFile($name,$vcardData = null) { if (is_resource($vcardData)) { $vcardData = stream_get_contents($vcardData); } // Converting to UTF-8, if needed $vcardData = DAV\StringUtil::ensureUTF8($vcardData); return $this->carddavBackend->createCard($this->addressBookInfo['id'],$name,$vcardData); } /** * Deletes the entire addressbook. * * @return void */ public function delete() { $this->carddavBackend->deleteAddressBook($this->addressBookInfo['id']); } /** * Renames the addressbook * * @param string $newName * @return void */ public function setName($newName) { throw new DAV\Exception\MethodNotAllowed('Renaming addressbooks is not yet supported'); } /** * Returns the last modification date as a unix timestamp. * * @return void */ public function getLastModified() { return null; } /** * Updates properties on this node, * * The properties array uses the propertyName in clark-notation as key, * and the array value for the property value. In the case a property * should be deleted, the property value will be null. * * This method must be atomic. If one property cannot be changed, the * entire operation must fail. * * If the operation was successful, true can be returned. * If the operation failed, false can be returned. * * Deletion of a non-existent property is always successful. * * Lastly, it is optional to return detailed information about any * failures. In this case an array should be returned with the following * structure: * * array( * 403 => array( * '{DAV:}displayname' => null, * ), * 424 => array( * '{DAV:}owner' => null, * ) * ) * * In this example it was forbidden to update {DAV:}displayname. * (403 Forbidden), which in turn also caused {DAV:}owner to fail * (424 Failed Dependency) because the request needs to be atomic. * * @param array $mutations * @return bool|array */ public function updateProperties($mutations) { return $this->carddavBackend->updateAddressBook($this->addressBookInfo['id'], $mutations); } /** * Returns a list of properties for this nodes. * * The properties list is a list of propertynames the client requested, * encoded in clark-notation {xmlnamespace}tagname * * If the array is empty, it means 'all properties' were requested. * * @param array $properties * @return array */ public function getProperties($properties) { $response = array(); foreach($properties as $propertyName) { if (isset($this->addressBookInfo[$propertyName])) { $response[$propertyName] = $this->addressBookInfo[$propertyName]; } } return $response; } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->addressBookInfo['principaluri']; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->addressBookInfo['principaluri'], 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->addressBookInfo['principaluri'], 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } } AddressBookQueryParser.php000066400000000000000000000137071361462701300337400ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAVdom = $dom; $this->xpath = new \DOMXPath($dom); $this->xpath->registerNameSpace('card',Plugin::NS_CARDDAV); } /** * Parses the request. * * @return void */ public function parse() { $filterNode = null; $limit = $this->xpath->evaluate('number(/card:addressbook-query/card:limit/card:nresults)'); if (is_nan($limit)) $limit = null; $filter = $this->xpath->query('/card:addressbook-query/card:filter'); // According to the CardDAV spec there needs to be exactly 1 filter // element. However, KDE 4.8.2 contains a bug that will encode 0 filter // elements, so this is a workaround for that. // // See: https://bugs.kde.org/show_bug.cgi?id=300047 if ($filter->length === 0) { $test = null; $filter = null; } elseif ($filter->length === 1) { $filter = $filter->item(0); $test = $this->xpath->evaluate('string(@test)', $filter); } else { throw new DAV\Exception\BadRequest('Only one filter element is allowed'); } if (!$test) $test = self::TEST_ANYOF; if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) { throw new DAV\Exception\BadRequest('The test attribute must either hold "anyof" or "allof"'); } $propFilters = array(); $propFilterNodes = $this->xpath->query('card:prop-filter', $filter); for($ii=0; $ii < $propFilterNodes->length; $ii++) { $propFilters[] = $this->parsePropFilterNode($propFilterNodes->item($ii)); } $this->filters = $propFilters; $this->limit = $limit; $this->requestedProperties = array_keys(DAV\XMLUtil::parseProperties($this->dom->firstChild)); $this->test = $test; } /** * Parses the prop-filter xml element * * @param \DOMElement $propFilterNode * @return array */ protected function parsePropFilterNode(\DOMElement $propFilterNode) { $propFilter = array(); $propFilter['name'] = $propFilterNode->getAttribute('name'); $propFilter['test'] = $propFilterNode->getAttribute('test'); if (!$propFilter['test']) $propFilter['test'] = 'anyof'; $propFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $propFilterNode)->length>0; $paramFilterNodes = $this->xpath->query('card:param-filter', $propFilterNode); $propFilter['param-filters'] = array(); for($ii=0;$ii<$paramFilterNodes->length;$ii++) { $propFilter['param-filters'][] = $this->parseParamFilterNode($paramFilterNodes->item($ii)); } $propFilter['text-matches'] = array(); $textMatchNodes = $this->xpath->query('card:text-match', $propFilterNode); for($ii=0;$ii<$textMatchNodes->length;$ii++) { $propFilter['text-matches'][] = $this->parseTextMatchNode($textMatchNodes->item($ii)); } return $propFilter; } /** * Parses the param-filter element * * @param \DOMElement $paramFilterNode * @return array */ public function parseParamFilterNode(\DOMElement $paramFilterNode) { $paramFilter = array(); $paramFilter['name'] = $paramFilterNode->getAttribute('name'); $paramFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $paramFilterNode)->length>0; $paramFilter['text-match'] = null; $textMatch = $this->xpath->query('card:text-match', $paramFilterNode); if ($textMatch->length>0) { $paramFilter['text-match'] = $this->parseTextMatchNode($textMatch->item(0)); } return $paramFilter; } /** * Text match * * @param \DOMElement $textMatchNode * @return array */ public function parseTextMatchNode(\DOMElement $textMatchNode) { $matchType = $textMatchNode->getAttribute('match-type'); if (!$matchType) $matchType = 'contains'; if (!in_array($matchType, array('contains', 'equals', 'starts-with', 'ends-with'))) { throw new DAV\Exception\BadRequest('Unknown match-type: ' . $matchType); } $negateCondition = $textMatchNode->getAttribute('negate-condition'); $negateCondition = $negateCondition==='yes'; $collation = $textMatchNode->getAttribute('collation'); if (!$collation) $collation = 'i;unicode-casemap'; return array( 'negate-condition' => $negateCondition, 'collation' => $collation, 'match-type' => $matchType, 'value' => $textMatchNode->nodeValue ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/AddressBookRoot.php000066400000000000000000000042601361462701300324520ustar00rootroot00000000000000carddavBackend = $carddavBackend; parent::__construct($principalBackend, $principalPrefix); } /** * Returns the name of the node * * @return string */ public function getName() { return Plugin::ADDRESSBOOK_ROOT; } /** * This method returns a node for a principal. * * The passed array contains principal information, and is guaranteed to * at least contain a uri item. Other properties may or may not be * supplied by the authentication backend. * * @param array $principal * @return \SabreForRainLoop\DAV\INode */ public function getChildForPrincipal(array $principal) { return new UserAddressBooks($this->carddavBackend, $principal['uri']); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/Backend/000077500000000000000000000000001361462701300302225ustar00rootroot00000000000000AbstractBackend.php000066400000000000000000000007431361462701300336730ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/Backendpdo = $pdo; $this->addressBooksTableName = $addressBooksTableName; $this->cardsTableName = $cardsTableName; } /** * Returns the list of addressbooks for a specific user. * * @param string $principalUri * @return array */ public function getAddressBooksForUser($principalUri) { $stmt = $this->pdo->prepare('SELECT id, uri, displayname, principaluri, description, ctag FROM '.$this->addressBooksTableName.' WHERE principaluri = ?'); $stmt->execute(array($principalUri)); $addressBooks = array(); foreach($stmt->fetchAll() as $row) { $addressBooks[] = array( 'id' => $row['id'], 'uri' => $row['uri'], 'principaluri' => $row['principaluri'], '{DAV:}displayname' => $row['displayname'], '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], '{http://calendarserver.org/ns/}getctag' => $row['ctag'], '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(), ); } return $addressBooks; } /** * Updates an addressbook's properties * * See SabreForRainLoop\DAV\IProperties for a description of the mutations array, as * well as the return value. * * @param mixed $addressBookId * @param array $mutations * @see SabreForRainLoop\DAV\IProperties::updateProperties * @return bool|array */ public function updateAddressBook($addressBookId, array $mutations) { $updates = array(); foreach($mutations as $property=>$newValue) { switch($property) { case '{DAV:}displayname' : $updates['displayname'] = $newValue; break; case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' : $updates['description'] = $newValue; break; default : // If any unsupported values were being updated, we must // let the entire request fail. return false; } } // No values are being updated? if (!$updates) { return false; } $query = 'UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 '; foreach($updates as $key=>$value) { $query.=', `' . $key . '` = :' . $key . ' '; } $query.=' WHERE id = :addressbookid'; $stmt = $this->pdo->prepare($query); $updates['addressbookid'] = $addressBookId; $stmt->execute($updates); return true; } /** * Creates a new address book * * @param string $principalUri * @param string $url Just the 'basename' of the url. * @param array $properties * @return void */ public function createAddressBook($principalUri, $url, array $properties) { $values = array( 'displayname' => null, 'description' => null, 'principaluri' => $principalUri, 'uri' => $url, ); foreach($properties as $property=>$newValue) { switch($property) { case '{DAV:}displayname' : $values['displayname'] = $newValue; break; case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' : $values['description'] = $newValue; break; default : throw new DAV\Exception\BadRequest('Unknown property: ' . $property); } } $query = 'INSERT INTO ' . $this->addressBooksTableName . ' (uri, displayname, description, principaluri, ctag) VALUES (:uri, :displayname, :description, :principaluri, 1)'; $stmt = $this->pdo->prepare($query); $stmt->execute($values); } /** * Deletes an entire addressbook and all its contents * * @param int $addressBookId * @return void */ public function deleteAddressBook($addressBookId) { $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); $stmt->execute(array($addressBookId)); $stmt = $this->pdo->prepare('DELETE FROM ' . $this->addressBooksTableName . ' WHERE id = ?'); $stmt->execute(array($addressBookId)); } /** * Returns all cards for a specific addressbook id. * * This method should return the following properties for each card: * * carddata - raw vcard data * * uri - Some unique url * * lastmodified - A unix timestamp * * It's recommended to also return the following properties: * * etag - A unique etag. This must change every time the card changes. * * size - The size of the card in bytes. * * If these last two properties are provided, less time will be spent * calculating them. If they are specified, you can also ommit carddata. * This may speed up certain requests, especially with large cards. * * @param mixed $addressbookId * @return array */ public function getCards($addressbookId) { $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?'); $stmt->execute(array($addressbookId)); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } /** * Returns a specfic card. * * The same set of properties must be returned as with getCards. The only * exception is that 'carddata' is absolutely required. * * @param mixed $addressBookId * @param string $cardUri * @return array */ public function getCard($addressBookId, $cardUri) { $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ? LIMIT 1'); $stmt->execute(array($addressBookId, $cardUri)); $result = $stmt->fetchAll(\PDO::FETCH_ASSOC); return (count($result)>0?$result[0]:false); } /** * Creates a new card. * * The addressbook id will be passed as the first argument. This is the * same id as it is returned from the getAddressbooksForUser method. * * The cardUri is a base uri, and doesn't include the full path. The * cardData argument is the vcard body, and is passed as a string. * * It is possible to return an ETag from this method. This ETag is for the * newly created resource, and must be enclosed with double quotes (that * is, the string itself must contain the double quotes). * * You should only return the ETag if you store the carddata as-is. If a * subsequent GET request on the same card does not have the same body, * byte-by-byte and you did return an ETag here, clients tend to get * confused. * * If you don't return an ETag, you can just return null. * * @param mixed $addressBookId * @param string $cardUri * @param string $cardData * @return string|null */ public function createCard($addressBookId, $cardUri, $cardData) { $stmt = $this->pdo->prepare('INSERT INTO ' . $this->cardsTableName . ' (carddata, uri, lastmodified, addressbookid) VALUES (?, ?, ?, ?)'); $result = $stmt->execute(array($cardData, $cardUri, time(), $addressBookId)); $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); $stmt2->execute(array($addressBookId)); return '"' . md5($cardData) . '"'; } /** * Updates a card. * * The addressbook id will be passed as the first argument. This is the * same id as it is returned from the getAddressbooksForUser method. * * The cardUri is a base uri, and doesn't include the full path. The * cardData argument is the vcard body, and is passed as a string. * * It is possible to return an ETag from this method. This ETag should * match that of the updated resource, and must be enclosed with double * quotes (that is: the string itself must contain the actual quotes). * * You should only return the ETag if you store the carddata as-is. If a * subsequent GET request on the same card does not have the same body, * byte-by-byte and you did return an ETag here, clients tend to get * confused. * * If you don't return an ETag, you can just return null. * * @param mixed $addressBookId * @param string $cardUri * @param string $cardData * @return string|null */ public function updateCard($addressBookId, $cardUri, $cardData) { $stmt = $this->pdo->prepare('UPDATE ' . $this->cardsTableName . ' SET carddata = ?, lastmodified = ? WHERE uri = ? AND addressbookid =?'); $stmt->execute(array($cardData, time(), $cardUri, $addressBookId)); $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); $stmt2->execute(array($addressBookId)); return '"' . md5($cardData) . '"'; } /** * Deletes a card * * @param mixed $addressBookId * @param string $cardUri * @return bool */ public function deleteCard($addressBookId, $cardUri) { $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ?'); $stmt->execute(array($addressBookId, $cardUri)); $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?'); $stmt2->execute(array($addressBookId)); return $stmt->rowCount()===1; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/Card.php000066400000000000000000000136231361462701300302620ustar00rootroot00000000000000carddavBackend = $carddavBackend; $this->addressBookInfo = $addressBookInfo; $this->cardData = $cardData; } /** * Returns the uri for this object * * @return string */ public function getName() { return $this->cardData['uri']; } /** * Returns the VCard-formatted object * * @return string */ public function get() { // Pre-populating 'carddata' is optional. If we don't yet have it // already, we fetch it from the backend. if (!isset($this->cardData['carddata'])) { $this->cardData = $this->carddavBackend->getCard($this->addressBookInfo['id'], $this->cardData['uri']); } return $this->cardData['carddata']; } /** * Updates the VCard-formatted object * * @param string $cardData * @return string|null */ public function put($cardData) { if (is_resource($cardData)) $cardData = stream_get_contents($cardData); // Converting to UTF-8, if needed $cardData = DAV\StringUtil::ensureUTF8($cardData); $etag = $this->carddavBackend->updateCard($this->addressBookInfo['id'],$this->cardData['uri'],$cardData); $this->cardData['carddata'] = $cardData; $this->cardData['etag'] = $etag; return $etag; } /** * Deletes the card * * @return void */ public function delete() { $this->carddavBackend->deleteCard($this->addressBookInfo['id'],$this->cardData['uri']); } /** * Returns the mime content-type * * @return string */ public function getContentType() { return 'text/x-vcard; charset=utf-8'; } /** * Returns an ETag for this object * * @return string */ public function getETag() { if (isset($this->cardData['etag'])) { return $this->cardData['etag']; } else { $data = $this->get(); if (is_string($data)) { return '"' . md5($data) . '"'; } else { // We refuse to calculate the md5 if it's a stream. return null; } } } /** * Returns the last modification date as a unix timestamp * * @return int */ public function getLastModified() { return isset($this->cardData['lastmodified'])?$this->cardData['lastmodified']:null; } /** * Returns the size of this object in bytes * * @return int */ public function getSize() { if (array_key_exists('size', $this->cardData)) { return $this->cardData['size']; } else { return strlen($this->get()); } } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->addressBookInfo['principaluri']; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->addressBookInfo['principaluri'], 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->addressBookInfo['principaluri'], 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/IAddressBook.php000066400000000000000000000006671361462701300317260ustar00rootroot00000000000000subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties')); $server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties')); $server->subscribeEvent('updateProperties', array($this, 'updateProperties')); $server->subscribeEvent('report', array($this,'report')); $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); /* Namespaces */ $server->xmlNamespaces[self::NS_CARDDAV] = 'card'; /* Mapping Interfaces to {DAV:}resourcetype values */ $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook'; $server->resourceTypeMapping['SabreForRainLoop\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory'; /* Adding properties that may never be changed */ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data'; $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}max-resource-size'; $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set'; $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set'; $server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'SabreForRainLoop\\DAV\\Property\\Href'; $this->server = $server; } /** * Returns a list of supported features. * * This is used in the DAV: header in the OPTIONS and PROPFIND requests. * * @return array */ public function getFeatures() { return array('addressbook'); } /** * Returns a list of reports this plugin supports. * * This will be used in the {DAV:}supported-report-set property. * Note that you still need to subscribe to the 'report' event to actually * implement them * * @param string $uri * @return array */ public function getSupportedReportSet($uri) { $node = $this->server->tree->getNodeForPath($uri); if ($node instanceof IAddressBook || $node instanceof ICard) { return array( '{' . self::NS_CARDDAV . '}addressbook-multiget', '{' . self::NS_CARDDAV . '}addressbook-query', ); } return array(); } /** * Adds all CardDAV-specific properties * * @param string $path * @param DAV\INode $node * @param array $requestedProperties * @param array $returnedProperties * @return void */ public function beforeGetProperties($path, DAV\INode $node, array &$requestedProperties, array &$returnedProperties) { if ($node instanceof DAVACL\IPrincipal) { // calendar-home-set property $addHome = '{' . self::NS_CARDDAV . '}addressbook-home-set'; if (in_array($addHome,$requestedProperties)) { $principalId = $node->getName(); $addressbookHomePath = self::ADDRESSBOOK_ROOT . '/' . $principalId . '/'; unset($requestedProperties[array_search($addHome, $requestedProperties)]); $returnedProperties[200][$addHome] = new DAV\Property\Href($addressbookHomePath); } $directories = '{' . self::NS_CARDDAV . '}directory-gateway'; if ($this->directories && in_array($directories, $requestedProperties)) { unset($requestedProperties[array_search($directories, $requestedProperties)]); $returnedProperties[200][$directories] = new DAV\Property\HrefList($this->directories); } } if ($node instanceof ICard) { // The address-data property is not supposed to be a 'real' // property, but in large chunks of the spec it does act as such. // Therefore we simply expose it as a property. $addressDataProp = '{' . self::NS_CARDDAV . '}address-data'; if (in_array($addressDataProp, $requestedProperties)) { unset($requestedProperties[$addressDataProp]); $val = $node->get(); if (is_resource($val)) $val = stream_get_contents($val); $returnedProperties[200][$addressDataProp] = $val; } } if ($node instanceof UserAddressBooks) { $meCardProp = '{http://calendarserver.org/ns/}me-card'; if (in_array($meCardProp, $requestedProperties)) { $props = $this->server->getProperties($node->getOwner(), array('{http://sabredav.org/ns}vcard-url')); if (isset($props['{http://sabredav.org/ns}vcard-url'])) { $returnedProperties[200][$meCardProp] = new DAV\Property\Href( $props['{http://sabredav.org/ns}vcard-url'] ); $pos = array_search($meCardProp, $requestedProperties); unset($requestedProperties[$pos]); } } } } /** * This event is triggered when a PROPPATCH method is executed * * @param array $mutations * @param array $result * @param DAV\INode $node * @return bool */ public function updateProperties(&$mutations, &$result, DAV\INode $node) { if (!$node instanceof UserAddressBooks) { return true; } $meCard = '{http://calendarserver.org/ns/}me-card'; // The only property we care about if (!isset($mutations[$meCard])) return true; $value = $mutations[$meCard]; unset($mutations[$meCard]); if ($value instanceof DAV\Property\IHref) { $value = $value->getHref(); $value = $this->server->calculateUri($value); } elseif (!is_null($value)) { $result[400][$meCard] = null; return false; } $innerResult = $this->server->updateProperties( $node->getOwner(), array( '{http://sabredav.org/ns}vcard-url' => $value, ) ); $closureResult = false; foreach($innerResult as $status => $props) { if (is_array($props) && array_key_exists('{http://sabredav.org/ns}vcard-url', $props)) { $result[$status][$meCard] = null; $closureResult = ($status>=200 && $status<300); } } return $result; } /** * This functions handles REPORT requests specific to CardDAV * * @param string $reportName * @param \DOMNode $dom * @return bool */ public function report($reportName,$dom) { switch($reportName) { case '{'.self::NS_CARDDAV.'}addressbook-multiget' : $this->addressbookMultiGetReport($dom); return false; case '{'.self::NS_CARDDAV.'}addressbook-query' : $this->addressBookQueryReport($dom); return false; default : return; } } /** * This function handles the addressbook-multiget REPORT. * * This report is used by the client to fetch the content of a series * of urls. Effectively avoiding a lot of redundant requests. * * @param \DOMNode $dom * @return void */ public function addressbookMultiGetReport($dom) { $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)); $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href'); $propertyList = array(); foreach($hrefElems as $elem) { $uri = $this->server->calculateUri($elem->nodeValue); list($propertyList[]) = $this->server->getPropertiesForPath($uri,$properties); } $prefer = $this->server->getHTTPPRefer(); $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal'])); } /** * This method is triggered before a file gets updated with new content. * * This plugin uses this method to ensure that Card nodes receive valid * vcard data. * * @param string $path * @param DAV\IFile $node * @param resource $data * @return void */ public function beforeWriteContent($path, DAV\IFile $node, &$data) { if (!$node instanceof ICard) return; $this->validateVCard($data); } /** * This method is triggered before a new file is created. * * This plugin uses this method to ensure that Card nodes receive valid * vcard data. * * @param string $path * @param resource $data * @param DAV\ICollection $parentNode * @return void */ public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) { if (!$parentNode instanceof IAddressBook) return; $this->validateVCard($data); } /** * Checks if the submitted iCalendar data is in fact, valid. * * An exception is thrown if it's not. * * @param resource|string $data * @return void */ protected function validateVCard(&$data) { // If it's a stream, we convert it to a string first. if (is_resource($data)) { $data = stream_get_contents($data); } // Converting the data to unicode, if needed. $data = DAV\StringUtil::ensureUTF8($data); try { $vobj = VObject\Reader::read($data); } catch (VObject\ParseException $e) { throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage()); } if ($vobj->name !== 'VCARD') { throw new DAV\Exception\UnsupportedMediaType('This collection can only support vcard objects.'); } if (!isset($vobj->UID)) { // No UID in vcards is invalid, but we'll just add it in anyway. $vobj->add('UID', DAV\UUIDUtil::getUUID()); $data = $vobj->serialize(); } } /** * This function handles the addressbook-query REPORT * * This report is used by the client to filter an addressbook based on a * complex query. * * @param \DOMNode $dom * @return void */ protected function addressbookQueryReport($dom) { $query = new AddressBookQueryParser($dom); $query->parse(); $depth = $this->server->getHTTPDepth(0); if ($depth==0) { $candidateNodes = array( $this->server->tree->getNodeForPath($this->server->getRequestUri()) ); } else { $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri()); } $validNodes = array(); foreach($candidateNodes as $node) { if (!$node instanceof ICard) continue; $blob = $node->get(); if (is_resource($blob)) { $blob = stream_get_contents($blob); } if (!$this->validateFilters($blob, $query->filters, $query->test)) { continue; } $validNodes[] = $node; if ($query->limit && $query->limit <= count($validNodes)) { // We hit the maximum number of items, we can stop now. break; } } $result = array(); foreach($validNodes as $validNode) { if ($depth==0) { $href = $this->server->getRequestUri(); } else { $href = $this->server->getRequestUri() . '/' . $validNode->getName(); } list($result[]) = $this->server->getPropertiesForPath($href, $query->requestedProperties, 0); } $prefer = $this->server->getHTTPPRefer(); $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); } /** * Validates if a vcard makes it throught a list of filters. * * @param string $vcardData * @param array $filters * @param string $test anyof or allof (which means OR or AND) * @return bool */ public function validateFilters($vcardData, array $filters, $test) { $vcard = VObject\Reader::read($vcardData); if (!$filters) return true; foreach($filters as $filter) { $isDefined = isset($vcard->{$filter['name']}); if ($filter['is-not-defined']) { if ($isDefined) { $success = false; } else { $success = true; } } elseif ((!$filter['param-filters'] && !$filter['text-matches']) || !$isDefined) { // We only need to check for existence $success = $isDefined; } else { $vProperties = $vcard->select($filter['name']); $results = array(); if ($filter['param-filters']) { $results[] = $this->validateParamFilters($vProperties, $filter['param-filters'], $filter['test']); } if ($filter['text-matches']) { $texts = array(); foreach($vProperties as $vProperty) $texts[] = $vProperty->getValue(); $results[] = $this->validateTextMatches($texts, $filter['text-matches'], $filter['test']); } if (count($results)===1) { $success = $results[0]; } else { if ($filter['test'] === 'anyof') { $success = $results[0] || $results[1]; } else { $success = $results[0] && $results[1]; } } } // else // There are two conditions where we can already determine whether // or not this filter succeeds. if ($test==='anyof' && $success) { return true; } if ($test==='allof' && !$success) { return false; } } // foreach // If we got all the way here, it means we haven't been able to // determine early if the test failed or not. // // This implies for 'anyof' that the test failed, and for 'allof' that // we succeeded. Sounds weird, but makes sense. return $test==='allof'; } /** * Validates if a param-filter can be applied to a specific property. * * @todo currently we're only validating the first parameter of the passed * property. Any subsequence parameters with the same name are * ignored. * @param array $vProperties * @param array $filters * @param string $test * @return bool */ protected function validateParamFilters(array $vProperties, array $filters, $test) { foreach($filters as $filter) { $isDefined = false; foreach($vProperties as $vProperty) { $isDefined = isset($vProperty[$filter['name']]); if ($isDefined) break; } if ($filter['is-not-defined']) { if ($isDefined) { $success = false; } else { $success = true; } // If there's no text-match, we can just check for existence } elseif (!$filter['text-match'] || !$isDefined) { $success = $isDefined; } else { $success = false; foreach($vProperties as $vProperty) { // If we got all the way here, we'll need to validate the // text-match filter. $success = DAV\StringUtil::textMatch($vProperty[$filter['name']]->getValue(), $filter['text-match']['value'], $filter['text-match']['collation'], $filter['text-match']['match-type']); if ($success) break; } if ($filter['text-match']['negate-condition']) { $success = !$success; } } // else // There are two conditions where we can already determine whether // or not this filter succeeds. if ($test==='anyof' && $success) { return true; } if ($test==='allof' && !$success) { return false; } } // If we got all the way here, it means we haven't been able to // determine early if the test failed or not. // // This implies for 'anyof' that the test failed, and for 'allof' that // we succeeded. Sounds weird, but makes sense. return $test==='allof'; } /** * Validates if a text-filter can be applied to a specific property. * * @param array $texts * @param array $filters * @param string $test * @return bool */ protected function validateTextMatches(array $texts, array $filters, $test) { foreach($filters as $filter) { $success = false; foreach($texts as $haystack) { $success = DAV\StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']); // Breaking on the first match if ($success) break; } if ($filter['negate-condition']) { $success = !$success; } if ($success && $test==='anyof') return true; if (!$success && $test=='allof') return false; } // If we got all the way here, it means we haven't been able to // determine early if the test failed or not. // // This implies for 'anyof' that the test failed, and for 'allof' that // we succeeded. Sounds weird, but makes sense. return $test==='allof'; } /** * This event is triggered after webdav-properties have been retrieved. * * @return bool */ public function afterGetProperties($uri, &$properties) { // If the request was made using the SOGO connector, we must rewrite // the content-type property. By default SabreDAV will send back // text/x-vcard; charset=utf-8, but for SOGO we must strip that last // part. if (!isset($properties[200]['{DAV:}getcontenttype'])) return; if (strpos($this->server->httpRequest->getHeader('User-Agent'),'Thunderbird')===false) { return; } if (strpos($properties[200]['{DAV:}getcontenttype'],'text/x-vcard')===0) { $properties[200]['{DAV:}getcontenttype'] = 'text/x-vcard'; } } /** * This method is used to generate HTML output for the * SabreForRainLoop\DAV\Browser\Plugin. This allows us to generate an interface users * can use to create new calendars. * * @param DAV\INode $node * @param string $output * @return bool */ public function htmlActionsPanel(DAV\INode $node, &$output) { if (!$node instanceof UserAddressBooks) return; $output.= '

Create new address book



'; return false; } /** * This method allows us to intercept the 'mkcalendar' sabreAction. This * action enables the user to create new calendars from the browser plugin. * * @param string $uri * @param string $action * @param array $postVars * @return bool */ public function browserPostAction($uri, $action, array $postVars) { if ($action!=='mkaddressbook') return; $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:carddav}addressbook'); $properties = array(); if (isset($postVars['{DAV:}displayname'])) { $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname']; } $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties); return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/Property/000077500000000000000000000000001361462701300305175ustar00rootroot00000000000000SupportedAddressData.php000066400000000000000000000035431361462701300352430ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/Property 'text/vcard', 'version' => '3.0'), // array('contentType' => 'text/vcard', 'version' => '4.0'), ); } $this->supportedData = $supportedData; } /** * Serializes the property in a DOMDocument * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server,\DOMElement $node) { $doc = $node->ownerDocument; $prefix = isset($server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV]) ? $server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV] : 'card'; foreach($this->supportedData as $supported) { $caldata = $doc->createElementNS(CardDAV\Plugin::NS_CARDDAV, $prefix . ':address-data-type'); $caldata->setAttribute('content-type',$supported['contentType']); $caldata->setAttribute('version',$supported['version']); $node->appendChild($caldata); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/UserAddressBooks.php000066400000000000000000000136171361462701300326360ustar00rootroot00000000000000carddavBackend = $carddavBackend; $this->principalUri = $principalUri; } /** * Returns the name of this object * * @return string */ public function getName() { list(,$name) = DAV\URLUtil::splitPath($this->principalUri); return $name; } /** * Updates the name of this object * * @param string $name * @return void */ public function setName($name) { throw new DAV\Exception\MethodNotAllowed(); } /** * Deletes this object * * @return void */ public function delete() { throw new DAV\Exception\MethodNotAllowed(); } /** * Returns the last modification date * * @return int */ public function getLastModified() { return null; } /** * Creates a new file under this object. * * This is currently not allowed * * @param string $filename * @param resource $data * @return void */ public function createFile($filename, $data=null) { throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported'); } /** * Creates a new directory under this object. * * This is currently not allowed. * * @param string $filename * @return void */ public function createDirectory($filename) { throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported'); } /** * Returns a single calendar, by name * * @param string $name * @todo needs optimizing * @return \AddressBook */ public function getChild($name) { foreach($this->getChildren() as $child) { if ($name==$child->getName()) return $child; } throw new DAV\Exception\NotFound('Addressbook with name \'' . $name . '\' could not be found'); } /** * Returns a list of addressbooks * * @return array */ public function getChildren() { $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); $objs = array(); foreach($addressbooks as $addressbook) { $objs[] = new AddressBook($this->carddavBackend, $addressbook); } return $objs; } /** * Creates a new addressbook * * @param string $name * @param array $resourceType * @param array $properties * @return void */ public function createExtendedCollection($name, array $resourceType, array $properties) { if (!in_array('{'.Plugin::NS_CARDDAV.'}addressbook',$resourceType) || count($resourceType)!==2) { throw new DAV\Exception\InvalidResourceType('Unknown resourceType for this collection'); } $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties); } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->principalUri; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->principalUri, 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->principalUri, 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/VCFExportPlugin.php000066400000000000000000000054241361462701300324100ustar00rootroot00000000000000server = $server; $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); } /** * 'beforeMethod' event handles. This event handles intercepts GET requests ending * with ?export * * @param string $method * @param string $uri * @return bool */ public function beforeMethod($method, $uri) { if ($method!='GET') return; if ($this->server->httpRequest->getQueryString()!='export') return; // splitting uri list($uri) = explode('?',$uri,2); $node = $this->server->tree->getNodeForPath($uri); if (!($node instanceof IAddressBook)) return; // Checking ACL, if available. if ($aclPlugin = $this->server->getPlugin('acl')) { $aclPlugin->checkPrivileges($uri, '{DAV:}read'); } $this->server->httpResponse->setHeader('Content-Type','text/directory'); $this->server->httpResponse->sendStatus(200); $nodes = $this->server->getPropertiesForPath($uri, array( '{' . Plugin::NS_CARDDAV . '}address-data', ),1); $this->server->httpResponse->sendBody($this->generateVCF($nodes)); // Returning false to break the event chain return false; } /** * Merges all vcard objects, and builds one big vcf export * * @param array $nodes * @return string */ public function generateVCF(array $nodes) { $output = ""; foreach($nodes as $node) { if (!isset($node[200]['{' . Plugin::NS_CARDDAV . '}address-data'])) { continue; } $nodeData = $node[200]['{' . Plugin::NS_CARDDAV . '}address-data']; // Parsing this node so VObject can clean up the output. $output .= VObject\Reader::read($nodeData)->serialize(); } return $output; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/CardDAV/Version.php000066400000000000000000000010121361462701300310230ustar00rootroot00000000000000currentUser; } /** * Authenticates the user based on the current request. * * If authentication is successful, true must be returned. * If authentication fails, an exception must be thrown. * * @param DAV\Server $server * @param string $realm * @throws DAV\Exception\NotAuthenticated * @return bool */ public function authenticate(DAV\Server $server, $realm) { $auth = new HTTP\BasicAuth(); $auth->setHTTPRequest($server->httpRequest); $auth->setHTTPResponse($server->httpResponse); $auth->setRealm($realm); $userpass = $auth->getUserPass(); if (!$userpass) { $auth->requireLogin(); throw new DAV\Exception\NotAuthenticated('No basic authentication headers were found'); } // Authenticates the user if (!$this->validateUserPass($userpass[0],$userpass[1])) { $auth->requireLogin(); throw new DAV\Exception\NotAuthenticated('Username or password does not match'); } $this->currentUser = $userpass[0]; return true; } } AbstractDigest.php000066400000000000000000000055531361462701300336760ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Auth/BackendsetHTTPRequest($server->httpRequest); $digest->setHTTPResponse($server->httpResponse); $digest->setRealm($realm); $digest->init(); $username = $digest->getUsername(); // No username was given if (!$username) { $digest->requireLogin(); throw new DAV\Exception\NotAuthenticated('No digest authentication headers were found'); } $hash = $this->getDigestHash($realm, $username); // If this was false, the user account didn't exist if ($hash===false || is_null($hash)) { $digest->requireLogin(); throw new DAV\Exception\NotAuthenticated('The supplied username was not on file'); } if (!is_string($hash)) { throw new DAV\Exception('The returned value from getDigestHash must be a string or null'); } // If this was false, the password or part of the hash was incorrect. if (!$digest->validateA1($hash)) { $digest->requireLogin(); throw new DAV\Exception\NotAuthenticated('Incorrect username'); } $this->currentUser = $username; return true; } /** * Returns the currently logged in username. * * @return string|null */ public function getCurrentUser() { return $this->currentUser; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/Apache.php000066400000000000000000000031221361462701300322210ustar00rootroot00000000000000httpRequest->getRawServerValue('REMOTE_USER'); if (is_null($remoteUser)) { throw new DAV\Exception('We did not receive the $_SERVER[REMOTE_USER] property. This means that apache might have been misconfigured'); } $this->remoteUser = $remoteUser; return true; } /** * Returns information about the currently logged in user. * * If nobody is currently logged in, this method should return null. * * @return array|null */ public function getCurrentUser() { return $this->remoteUser; } } BackendInterface.php000066400000000000000000000017041361462701300341350ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Auth/BackendloadFile($filename); } /** * Loads an htdigest-formatted file. This method can be called multiple times if * more than 1 file is used. * * @param string $filename * @return void */ public function loadFile($filename) { foreach(file($filename,FILE_IGNORE_NEW_LINES) as $line) { if (substr_count($line, ":") !== 2) throw new DAV\Exception('Malformed htdigest file. Every line should contain 2 colons'); list($username,$realm,$A1) = explode(':',$line); if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1)) throw new DAV\Exception('Malformed htdigest file. Invalid md5 hash'); $this->users[$realm . ':' . $username] = $A1; } } /** * Returns a users' information * * @param string $realm * @param string $username * @return string */ public function getDigestHash($realm, $username) { return isset($this->users[$realm . ':' . $username])?$this->users[$realm . ':' . $username]:false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Auth/Backend/PDO.php000066400000000000000000000027321361462701300314700ustar00rootroot00000000000000pdo = $pdo; $this->tableName = $tableName; } /** * Returns the digest hash for a user. * * @param string $realm * @param string $username * @return string|null */ public function getDigestHash($realm,$username) { $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM '.$this->tableName.' WHERE username = ?'); $stmt->execute(array($username)); $result = $stmt->fetchAll(); if (!count($result)) return; return $result[0]['digesta1']; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Auth/Plugin.php000066400000000000000000000047641361462701300307640ustar00rootroot00000000000000authBackend = $authBackend; $this->realm = $realm; } /** * Initializes the plugin. This function is automatically called by the server * * @param DAV\Server $server * @return void */ public function initialize(DAV\Server $server) { $this->server = $server; $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),10); } /** * Returns a plugin name. * * Using this name other plugins will be able to access other plugins * using DAV\Server::getPlugin * * @return string */ public function getPluginName() { return 'auth'; } /** * Returns the current users' principal uri. * * If nobody is logged in, this will return null. * * @return string|null */ public function getCurrentUser() { $userInfo = $this->authBackend->getCurrentUser(); if (!$userInfo) return null; return $userInfo; } /** * This method is called before any HTTP method and forces users to be authenticated * * @param string $method * @param string $uri * @throws SabreForRainLoop\DAV\Exception\NotAuthenticated * @return bool */ public function beforeMethod($method, $uri) { $this->authBackend->authenticate($this->server,$this->realm); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/000077500000000000000000000000001361462701300275245ustar00rootroot00000000000000GuessContentType.php000066400000000000000000000047671361462701300334570ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', // groupware 'ics' => 'text/calendar', 'vcf' => 'text/x-vcard', // text 'txt' => 'text/plain', ); /** * Initializes the plugin * * @param DAV\Server $server * @return void */ public function initialize(DAV\Server $server) { // Using a relatively low priority (200) to allow other extensions // to set the content-type first. $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'),200); } /** * Handler for teh afterGetProperties event * * @param string $path * @param array $properties * @return void */ public function afterGetProperties($path, &$properties) { if (array_key_exists('{DAV:}getcontenttype', $properties[404])) { list(, $fileName) = DAV\URLUtil::splitPath($path); $contentType = $this->getContentType($fileName); if ($contentType) { $properties[200]['{DAV:}getcontenttype'] = $contentType; unset($properties[404]['{DAV:}getcontenttype']); } } } /** * Simple method to return the contenttype * * @param string $fileName * @return string */ protected function getContentType($fileName) { // Just grabbing the extension $extension = strtolower(substr($fileName,strrpos($fileName,'.')+1)); if (isset($this->extensionMap[$extension])) return $this->extensionMap[$extension]; } } MapGetToPropFind.php000066400000000000000000000026071361462701300333050ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browserserver = $server; $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); } /** * This method intercepts GET requests to non-files, and changes it into an HTTP PROPFIND request * * @param string $method * @param string $uri * @return bool */ public function httpGetInterceptor($method, $uri) { if ($method!='GET') return true; $node = $this->server->tree->getNodeForPath($uri); if ($node instanceof DAV\IFile) return; $this->server->invokeMethod('PROPFIND',$uri); return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/Plugin.php000066400000000000000000000371371361462701300315060ustar00rootroot00000000000000 'icons/file', 'SabreForRainLoop\\DAV\\ICollection' => 'icons/collection', 'SabreForRainLoop\\DAVACL\\IPrincipal' => 'icons/principal', 'SabreForRainLoop\\CalDAV\\ICalendar' => 'icons/calendar', 'SabreForRainLoop\\CardDAV\\IAddressBook' => 'icons/addressbook', 'SabreForRainLoop\\CardDAV\\ICard' => 'icons/card', ); /** * The file extension used for all icons * * @var string */ public $iconExtension = '.png'; /** * reference to server class * * @var SabreForRainLoop\DAV\Server */ protected $server; /** * enablePost turns on the 'actions' panel, which allows people to create * folders and upload files straight from a browser. * * @var bool */ protected $enablePost = true; /** * By default the browser plugin will generate a favicon and other images. * To turn this off, set this property to false. * * @var bool */ protected $enableAssets = true; /** * Creates the object. * * By default it will allow file creation and uploads. * Specify the first argument as false to disable this * * @param bool $enablePost * @param bool $enableAssets */ public function __construct($enablePost=true, $enableAssets = true) { $this->enablePost = $enablePost; $this->enableAssets = $enableAssets; } /** * Initializes the plugin and subscribes to events * * @param DAV\Server $server * @return void */ public function initialize(DAV\Server $server) { $this->server = $server; $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor')); $this->server->subscribeEvent('onHTMLActionsPanel', array($this, 'htmlActionsPanel'),200); if ($this->enablePost) $this->server->subscribeEvent('unknownMethod',array($this,'httpPOSTHandler')); } /** * This method intercepts GET requests to collections and returns the html * * @param string $method * @param string $uri * @return bool */ public function httpGetInterceptor($method, $uri) { if ($method !== 'GET') return true; // We're not using straight-up $_GET, because we want everything to be // unit testable. $getVars = array(); parse_str($this->server->httpRequest->getQueryString(), $getVars); if (isset($getVars['sabreAction']) && $getVars['sabreAction'] === 'asset' && isset($getVars['assetName'])) { $this->serveAsset($getVars['assetName']); return false; } try { $node = $this->server->tree->getNodeForPath($uri); } catch (DAV\Exception\NotFound $e) { // We're simply stopping when the file isn't found to not interfere // with other plugins. return; } if ($node instanceof DAV\IFile) return; $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->setHeader('Content-Type','text/html; charset=utf-8'); $this->server->httpResponse->sendBody( $this->generateDirectoryIndex($uri) ); return false; } /** * Handles POST requests for tree operations. * * @param string $method * @param string $uri * @return bool */ public function httpPOSTHandler($method, $uri) { if ($method!='POST') return; $contentType = $this->server->httpRequest->getHeader('Content-Type'); list($contentType) = explode(';', $contentType); if ($contentType !== 'application/x-www-form-urlencoded' && $contentType !== 'multipart/form-data') { return; } $postVars = $this->server->httpRequest->getPostVars(); if (!isset($postVars['sabreAction'])) return; if ($this->server->broadcastEvent('onBrowserPostAction', array($uri, $postVars['sabreAction'], $postVars))) { switch($postVars['sabreAction']) { case 'mkcol' : if (isset($postVars['name']) && trim($postVars['name'])) { // Using basename() because we won't allow slashes list(, $folderName) = DAV\URLUtil::splitPath(trim($postVars['name'])); $this->server->createDirectory($uri . '/' . $folderName); } break; case 'put' : if ($_FILES) $file = current($_FILES); else break; list(, $newName) = DAV\URLUtil::splitPath(trim($file['name'])); if (isset($postVars['name']) && trim($postVars['name'])) $newName = trim($postVars['name']); // Making sure we only have a 'basename' component list(, $newName) = DAV\URLUtil::splitPath($newName); if (is_uploaded_file($file['tmp_name'])) { $this->server->createFile($uri . '/' . $newName, fopen($file['tmp_name'],'r')); } break; } } $this->server->httpResponse->setHeader('Location',$this->server->httpRequest->getUri()); $this->server->httpResponse->sendStatus(302); return false; } /** * Escapes a string for html. * * @param string $value * @return string */ public function escapeHTML($value) { return htmlspecialchars($value,ENT_QUOTES,'UTF-8'); } /** * Generates the html directory index for a given url * * @param string $path * @return string */ public function generateDirectoryIndex($path) { $version = ''; if (DAV\Server::$exposeVersion) { $version = DAV\Version::VERSION ."-". DAV\Version::STABILITY; } $html = " Index for " . $this->escapeHTML($path) . "/ - SabreDAV " . $version . " "; if ($this->enableAssets) { $html.=''; } $html .= "

Index for " . $this->escapeHTML($path) . "/

"; $files = $this->server->getPropertiesForPath($path,array( '{DAV:}displayname', '{DAV:}resourcetype', '{DAV:}getcontenttype', '{DAV:}getcontentlength', '{DAV:}getlastmodified', ),1); $parent = $this->server->tree->getNodeForPath($path); if ($path) { list($parentUri) = DAV\URLUtil::splitPath($path); $fullPath = DAV\URLUtil::encodePath($this->server->getBaseUri() . $parentUri); $icon = $this->enableAssets?'Parent':''; $html.= ""; } foreach($files as $file) { // This is the current directory, we can skip it if (rtrim($file['href'],'/')==$path) continue; list(, $name) = DAV\URLUtil::splitPath($file['href']); $type = null; if (isset($file[200]['{DAV:}resourcetype'])) { $type = $file[200]['{DAV:}resourcetype']->getValue(); // resourcetype can have multiple values if (!is_array($type)) $type = array($type); foreach($type as $k=>$v) { // Some name mapping is preferred switch($v) { case '{DAV:}collection' : $type[$k] = 'Collection'; break; case '{DAV:}principal' : $type[$k] = 'Principal'; break; case '{urn:ietf:params:xml:ns:carddav}addressbook' : $type[$k] = 'Addressbook'; break; case '{urn:ietf:params:xml:ns:caldav}calendar' : $type[$k] = 'Calendar'; break; case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' : $type[$k] = 'Schedule Inbox'; break; case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' : $type[$k] = 'Schedule Outbox'; break; case '{http://calendarserver.org/ns/}calendar-proxy-read' : $type[$k] = 'Proxy-Read'; break; case '{http://calendarserver.org/ns/}calendar-proxy-write' : $type[$k] = 'Proxy-Write'; break; } } $type = implode(', ', $type); } // If no resourcetype was found, we attempt to use // the contenttype property if (!$type && isset($file[200]['{DAV:}getcontenttype'])) { $type = $file[200]['{DAV:}getcontenttype']; } if (!$type) $type = 'Unknown'; $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:''; $lastmodified = isset($file[200]['{DAV:}getlastmodified'])?$file[200]['{DAV:}getlastmodified']->getTime()->format(\DateTime::ATOM):''; $fullPath = DAV\URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/')); $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name; $displayName = $this->escapeHTML($displayName); $type = $this->escapeHTML($type); $icon = ''; if ($this->enableAssets) { $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name); foreach(array_reverse($this->iconMap) as $class=>$iconName) { if ($node instanceof $class) { $icon = ''; break; } } } $html.= ""; } $html.= ""; $output = ''; if ($this->enablePost) { $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output)); } $html.=$output; $html.= "
NameTypeSizeLast modified

$icon .. [parent]
$icon {$displayName} {$type} {$size} {$lastmodified}

Generated by SabreDAV " . $version . " (c)2007-2013 http://code.google.com/p/sabredav/
"; return $html; } /** * This method is used to generate the 'actions panel' output for * collections. * * This specifically generates the interfaces for creating new files, and * creating new directories. * * @param DAV\INode $node * @param mixed $output * @return void */ public function htmlActionsPanel(DAV\INode $node, &$output) { if (!$node instanceof DAV\ICollection) return; // We also know fairly certain that if an object is a non-extended // SimpleCollection, we won't need to show the panel either. if (get_class($node)==='SabreForRainLoop\\DAV\\SimpleCollection') return; $output.= '

Create new folder

Name:

Upload file

Name (optional):
File:
'; } /** * This method takes a path/name of an asset and turns it into url * suiteable for http access. * * @param string $assetName * @return string */ protected function getAssetUrl($assetName) { return $this->server->getBaseUri() . '?sabreAction=asset&assetName=' . urlencode($assetName); } /** * This method returns a local pathname to an asset. * * @param string $assetName * @return string */ protected function getLocalAssetPath($assetName) { $assetDir = __DIR__ . '/assets/'; $path = $assetDir . $assetName; // Making sure people aren't trying to escape from the base path. if (strpos(realpath($path), realpath($assetDir)) === 0) { return $path; } throw new DAV\Exception\Forbidden('Path does not exist, or escaping from the base path was detected'); } /** * This method reads an asset from disk and generates a full http response. * * @param string $assetName * @return void */ protected function serveAsset($assetName) { $assetPath = $this->getLocalAssetPath($assetName); if (!file_exists($assetPath)) { throw new DAV\Exception\NotFound('Could not find an asset with this name'); } // Rudimentary mime type detection switch(strtolower(substr($assetPath,strpos($assetPath,'.')+1))) { case 'ico' : $mime = 'image/vnd.microsoft.icon'; break; case 'png' : $mime = 'image/png'; break; default: $mime = 'application/octet-stream'; break; } $this->server->httpResponse->setHeader('Content-Type', $mime); $this->server->httpResponse->setHeader('Content-Length', filesize($assetPath)); $this->server->httpResponse->setHeader('Cache-Control', 'public, max-age=1209600'); $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->sendBody(fopen($assetPath,'r')); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/000077500000000000000000000000001361462701300310265ustar00rootroot00000000000000favicon.ico000066400000000000000000000102761361462701300330760ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets  ¨( @   ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙łłłłłłłłłłł5ł~łÁłßł˙ł˙łçłĐł¨łQł łłłłłłłłł˙˙˙˙˙˙łłłłłłłłł^ł×ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łúł”łłłłłłłł˙˙˙˙˙˙łłłłłłł#łĎł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł÷łtłłłłłł˙˙˙˙˙˙łłłłłłVł÷ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł÷ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łął łłłł˙˙˙˙˙˙łłłłł`łüł˙ł˙ł˙ł˙ł˙ł˙ł˙łúłł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łÉłłłł˙˙˙˙˙˙łłłł@łüł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łˇłŹł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łĽłłł˙˙˙˙˙˙łłłłěł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł.ł•ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łwłł˙˙˙˙˙˙łłł˘ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł¸łłŞł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łúłł˙˙˙˙˙˙łł łüł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łúł łłŔł˙ł˙ł˙ł˙ł˙ł˙ł˙łČł˙ł˙ł˙ł˙ł˙ł‘ł˙˙˙˙˙˙łł•ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łłłłáł˙ł˙ł˙ł˙ł˙ł˙ł˙łWł˙ł˙ł˙ł˙ł˙łôł ˙˙˙˙˙˙łłäł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łÜł łł łüł˙ł˙ł˙ł˙ł˙ł˙łôłł˙ł˙ł˙ł˙ł˙ł˙łU˙˙˙˙˙˙ł)ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙łúł+łłł8ł˙ł˙ł˙ł˙ł˙ł˙ł˙łžłłôł˙ł˙ł˙ł˙ł˙ł—˙˙˙˙˙˙ł\ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł˙ł`łłłłwł˙ł˙ł˙ł˙ł˙ł˙ł˙ł8łłňł˙ł˙ł˙ł˙ł˙łŃ˙˙˙˙˙˙ł{ł˙ł˙ł˙ł˙ł˙ł˙ł˙łwłłłłłÇł˙ł˙ł˙ł˙ł˙ł˙łËłłłňł˙ł˙ł˙ł˙ł˙łç˙˙˙˙˙˙łł˙ł˙ł˙ł˙ł˙ł˙ł„łłłłłłüł˙ł˙ł˙ł˙ł˙ł˙łNłłłúł˙ł˙ł˙ł˙ł˙łú˙˙˙˙˙˙ł~ł˙ł˙ł˙ł˙ł÷łVłłłłłł„ł˙ł˙ł˙ł˙ł˙ł˙łČłłłł˙ł˙ł˙ł˙ł˙ł˙łô˙˙˙˙˙˙łlł˙ł˙ł˙łäł+łłłłłłłďł˙ł˙ł˙ł˙ł˙łüł3łłł/ł˙ł˙ł˙ł˙ł˙ł˙łá˙˙˙˙˙˙łBł˙ł˙łĄłłłłłłłłł˙ł˙ł˙ł˙ł˙ł˙ł’łłłłał˙ł˙ł˙ł˙ł˙ł˙łş˙˙˙˙˙˙łł±ł(łłłłłłłł#łüł˙ł˙ł˙ł˙ł˙ł×łłłłłšł˙ł˙ł˙ł˙ł˙ł˙ł{˙˙˙˙˙˙łłłłłłłłłł łßł˙ł˙ł˙ł˙ł˙łňł#łłłłłŮł˙ł˙ł˙ł˙ł˙ł˙ł+˙˙˙˙˙˙łłłłłłłłłłżł˙ł˙ł˙ł˙ł˙ł÷ł0łłłłł+ł˙ł˙ł˙ł˙ł˙ł˙łŃł˙˙˙˙˙˙łłłłłłłł łżł˙ł˙ł˙ł˙ł˙łúł?łłłłłłŽł˙ł˙ł˙ł˙ł˙ł˙łGł˙˙˙˙˙˙łłłłłłł#łŃł˙ł˙ł˙ł˙ł˙łďł9łłłłłłłňł˙ł˙ł˙ł˙ł˙łĚłł˙˙˙˙˙˙łłłłłłjł÷ł˙ł˙ł˙ł˙ł˙łßł łłłłłłłŽł˙ł˙ł˙ł˙ł˙łďłłł˙˙˙˙˙˙łłłłł¨ł˙ł˙ł˙ł˙ł˙ł˙ł›ł łłłłłłł+łúł˙ł˙ł˙ł˙łúłFłłł˙˙˙˙˙˙łłłłł łĚł˙ł˙ł˙łßłCłłłłłłłł łÜł˙ł˙ł˙ł˙łúłIłłłł˙˙˙˙˙˙łłłłłłłśłďłnłłłłłłłłłłżł˙ł˙ł˙ł˙łáł6łłłłł˙˙˙˙˙˙łłłłłłłłłłłłłłłłłł¶ł˙ł˙ł˙ł÷ł•ł łłłłłł˙˙˙˙˙˙łłłłłłłłłłłłłłłłłĎł˙ł˙łÜł~łłłłłłłłł˙˙˙˙˙˙łłłłłłłłłłłłłłłłpłgłPłłłłłłłłłłłł˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŕ˙˙˙ţüřđŕŕŔŔŔ€ €€<€x€řđđŹŕ˙Ŕ˙€<˙|ţřřřřđřŕüŔ?˙€˙˙˙˙˙˙˙˙˙˙rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons/000077500000000000000000000000001361462701300321415ustar00rootroot00000000000000addressbook.png000066400000000000000000000161001361462701300350660ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons‰PNG  IHDR00 ÉtEXtSoftwareAdobe ImageReadyqÉe< iTXtXML:com.adobe.xmp © 2009 by Oliver Twardowski Oliver Twardowski ‹ç4FIDATxÚbü˙˙?6Ŕ"ŠŤĹţ‹ r1°˛01|řň“á€óćŹßţţűĎŔÍÍĹđöÝW†ęw /?ţ`8ň‘‰A[’‹áßűo g΀H|˙ĂŔ ËřŤáËÓo ż˙10xĆĽg`YnÍÇúźj)Č)â\ŚďŻ«mĄ˙ó-ţůë7Ă«źúνeKĽşä׆/_ż0|řô ˇăĐ%¸„Xügxýń'BâÓ÷˙ ßî?břó—č$;~ţ…`řu @Á]U"Ăúß?/ŤA@Z–WDś•ťťáó»W ďž>bxüGŚaY[-ĂĆ׿!Ž›&ŔǰeőVf`X‚Śů …źż˙0|ůţ›ábŔ6„Ő`ź|řĘŔţŤ…ť‡—áĂ?†÷żäX3|úüěíMźçUą20Á4Ľ˙ö—áĐg‚Ü, .ú ŽĘ ź}ĆÇO Ü?†YŐ†¨~°çg3‘B÷?ĂĄ¬ ˙kż1Âm7±řű D?‘0Ś˙ZT6¤¤ ăÔŻŇ0ĆiŞi´Ž-çâÍ7(ú‚O tî 88ű>E']]‡87Q+­CŤ-˘ńrąKÎ/ Ä´ŕÝpđżűľßź[ęݲ•“ľ<>Đ›Í-’µ {m’sLÇ#| _°}xĆQÜ^]öW`­Z0MM.&ŕaŚ€GčÚ¸?gĹ]&DYŞ•Š1‹° \(ŚŢżĘ#"BL|¤¶P«™ô:éĎcü(…»Ý8ä*}‡rÖŢi1\ BôąM!‹¨&ŕőz :ĐÇĐ´źź^±Ó0 Ě“‰€¤ÇÇľ_îŔĄĆg đđ6E˝j˘ĺTi~âAuďl?ä>´×ł–ZIŮ#ň™ËiÜo: úô±(+‰“Ĺ‚Nů7ţ°Ě!^`řĐ?ňţHÇ©;6\×Ý›Źţ+kŐ®ŰDEĎĚŽ71/'F` ‰Š"­ ‚D”éi ˇŕ( ˇĄJCŹD H)JJE(%‘˘ Dkń:ű÷îÚŽ'[1«ŮYícî˝çžsöH.ÝöĄ»˙ěfćć­ć¸!„@mj [›xýŕÎó·Aúp ¤ţx|Ąá&HĄľ/á+Ę“¤X/g Ü*m3hM¤ §D„$ĺŐ`möjfđáQSŚ•<°ú€ EÓI«Ş"!5mMí‘®0KI15µ1ąMhťĺA¶[1Ú*:Z=~Ä™‡<óX ¨TÂ#r%»˘g‹ Újh®Ââ ýĆÓŮo ß(ŢaJÇ :Ý$ĎÖľÄŢ™®ßĽ†żŽ]#‰ŮäWÝ {ôśYÎŇxS]ĹÚ‰wĺDT'-Mż˘°Ńk8„|Zů‚Čú8_›F7Q–zˇ6Ş* CěÄ—J!JáM *Ô8ˇČCŞ'ńůŰ6ŞÔřIĄđc·Ť‹v]ÂÝ™˘/ěÍĹE<ąuďË™ZEĂ ŰłYÓŐs8ĄZQBc4„AŰn_’ÍĄ{ŔË«ĺqąĂέ)ČňúwÔéşîŮfî@‰Ľó€ča2łň&[ţ!ö~ŠýÉľő¦şĎďjW¨š×Żw?bái0*ÂĂB»qşŇÓřh%‡=CđäPL*Ô .·ĚBjěú±ţ÷ř'íUE†ß™Ůa]űѲ4ÂFF°i’¨x°C· č Ő©Ľĺ­CŇ% Ľ]:Dţ1Š‚5:(†«•«íîěěü=ß73ş;şk‡Zfwgľ÷yż÷çyźďżlJň•ćëí9I§n?ޞ傏˘Ş´_Ý˝4č>śú«¸;g±®ľnJ$jˇ2ę@˝uŻŰMńČ=ô‚ŚžpM, aSĎR1›%=—#ިmh„ššš˘ňˇ`8yL Ť+‚IU𑪀I1diŁŚ=›Ť2˛0ń8‹š–K÷Ţ/Ó…ŃĎÔß~nő6nͦŔş‚B·%®(¨t5SDgű† z°QŻĽG8m»žăܤ›^ĺ8đF0'¨‚ńAčqđ žÓ5•Q5Ţsµ]G¬_Ő,ĘN,’aë4ŕ‚˘e—$'ź.OxÎŤ[čJ7ĘůśN…‚U@´±o\]ËC& Đ•ç,Ü÷éŔÝ—6ZÁ WŹJxҬ3†Äz1(¨"Üc~ŃrŐhÚ&ĽvüPń\äô}PŰTÂeĄ.*ÇTáß’Ap“ËuśMRGW;MýôÄ* eŕ]>*Í@ͧ'Ć)?6Ć*‡ž°+â,#Î ą†&`übëş˙|š4Ä}¨ł…Ćg¨Ţ3ńľëď (hšŞw`áeˇřĎř˛îăŤôfnŤÎ·ěççľŃ|FI¶&˙qŤ*’ «PečŰX„Đ‹~ŔĽÇÝ%C+ĐŞnĐŻĄ‘T“'Őá %ĂŽH|PEů<€˛Nh€€„aYPµD;w(¤%pľŔYŹÓAOk#I™¤×Ö“–Ncţâ6^gěu›Cħ(&,*ĐŔčÎ#»h¸ď—Ňtş­™r‹KH.@Ě×OŹ7SŁŐŮ4ŁR nyIV‹´SéŮ«Yż['ż Łâý’Ă?ŹR/I·-ö49˛5±’Y+ů:‹2čLą¸B'âa·o%˝č„+äiŐŇ*ďŔŤ0XéúýG^ô‘Đ~Ó˘‘­˘…ťÇîV3ąä¬č¬Đ‡b¦ĘXui#LŐľ}6˘WŻ"xę±P­mľÖź•E”š™Ţ¦ŠÂ$˙Ąd)ý}í\Ň[ř’zńv͉Ł/Ě-wĐ?t}F©QWábÁ冻…'-ťö“wź.ĂřŤRă˙T¶ŕĄŔ–ý˙ŹĹYKlTUţνw¦Ą”"-CÁ)4Ťˇ D¬A]TŤ˘&>0!, Ńbډ1Ä ăcďÂÄ ş4bâBŤQ4®Q,ÔH_ŘŹv(ťÎëŢsŽ˙ÎąÓéĐ‘r ń&gîÜ;3çţď˙űţYódRz2GěśľżžęI×&w QQ•Äß„9>ĘUôŰ_Ď…ĄÄŔîP“oęÁˇ#O#¸ož}ĺuC*ďĆQ©TpybÜtîînŚář ó'g+‰xăˇ-š‰wă”/ ‘Mů)sö<ĎśĆ)8°ăd+hęíŻc°CHHI]EV\2•©ÇŇÜçn”ŢĽÇż8Ťw>ƆM›Í>G·Š5#ßL$.Ć´9Ł:’ťYH?bÂ츧éŹŇR:žëĹJ×ß ˛‰ĂÂj‹¤SB;áchČĎË_5ĎţěÔyÜł­ĎyFęמʊ;VŔ ĽjŐ÷ ©y=ZʨCö/¬ĺĄ•>ް*At‚kÇD•VYëGöZ -c\âŕĘ!ÄŲB"đć‡AŔVxBÂúĽHJŹÂ*2tÚ†N¨ź-jÇăŚĐ&”`BHŐ(‡‘r#˘|>„\gs7_“)’EČľPˇg† Š%ˇM^°2ĘĆ»'4†—Ôw76‰sÁBgľôĄ"áĆ*V!> …"dŢâĂĄ¤ đچCEĘ_šĘ/9ÖYaCÇw1ăy”ĺ Ae·9¶,ýFÓŮ\ki•ÄJʏ=pę­ÇĐßߏç2)Ľ"‰ŞĐK=-ÚL¸<2%ľp!kyĎÇyäs8Äő’ŔLqyĎmë˛-T]¨1 V„ä¤ä®Ë e=Â8K»úx,ŹŻĮͶ eĐrřđť'1hźh'iDŠ0ńŇs‚ÓgÄl›HřŮr “ /îBT,`üŇ„MdúRßî^ŚĘ˙nh´Q! «3”•Ä”ŚË¬vඥä‹}Řľe#Ţ=ů3Ć dE˝Ů OçŮF–—˛'´2 ń`(.łq°N[eč}[˛ĐFXéę»;Dµ4–¬IěáâŤöíěÄ…‘Iür5ÄĂ=Ś˙ń&.D.8lBTȲiQĆőĹ"Â&AŚ2´4ÖADăÄď:'z”'#™>PG•ÖîÚÍăÚÎBë ÓlÎFHľ’äňhkN“UKą’Ăý­ ćCC e„~sŃ64ű‰•ĘĘŃ]Řö QĹź% ź%§@×±cÉ’xűňČÎŻŽîřESü 4“đ­÷nĂŮ©ö’Ź;wtá“3ăhNxfO¬ŕű±](bgg+öfšńűĄCĄĄ\îvŇő‰ CĘ U«Đç×Vˇ'bđ®LT|đŕîn|yńY7D;ÁŤLcߦűJef¦ę4âGîâŰ\ńŢ^ ÇFţ‘Ţýř ˙M‘ Ő-V>L¸‘‡Nź›@†dçŽvlíhCŰú&'ĆĚÜMśą0cµf˛ŞWů?fe ¤.\°!´T)%ËÚM=Ý€:ąąyxlάµîą®…EÂvŞvĄ|3™ZŐŃbŻq8ÝîĐ 4hN(,đŚćퟥÜó€XĺáIŮnpóĎó¤„-ź—?‘”ŕßG†µîĐ5çZ­őęaÓHˇřú·ŁgMzžŞŽ7ţ˝w;¨šůC<·¸e9!Ą^yOÖÍ/ęWuď3¸óôô4F†~Ĺ«ŹP2ˇO䎮,槦Lą]Üë¤áł’ĚŁ÷Ń(›Í>I—­NÇźV›F¬©ć ×ÓÚč6ŚWsÍJ»ĹĆđkV˝#CӾ황#4ÎŇ‚;s©áŃ^“łŐ(Évő˙»én˙bTjŕůů¸"IEND®B`‚calendar.png000066400000000000000000000104441361462701300343440ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons‰PNG  IHDR00 ÉČiTXtXML:com.adobe.xmp Oliver Twardowski  Made on a Mac! exclusive for Smashing Magazine icons flavour smashing magazine addicted to coffee © 2009 by Oliver Twardowski îQŇtEXtSoftwareAdobe ImageReadyqÉe< ňIDATxÚbü˙˙?6ŔÄ€°€XFĆ˙ş@Z?ńc Č( ţĎ”€€0 7jéŇĄ`ZRR’áđáĂ;"##ţüůĂ &&Ć **Ę@ڤşJŽ% h©(ĹĘĹĹxíĂŹďßú45ĽĽĽŔ®Đ××˙/,, fí¸ dĎ«WŻ^ĽxÁđőëW†ź?B<ôĂÓ§Oş»»¤¤¤ŘŘŘđA) @ýŤBşéÂ+tcď¤Gq—,{oâ% Ů Y„€ËBĹ`Rť”–.Úy ĚĚ›˙ÓęoTWηcá©É`Ę —śqĂąĽ ąđÎ^>UxY–mG’íűžh­%Ă@TJ}˘ĺś“g­#Ńyž!Ą¤tSJ»Ň;Ífďﺎ6{ďń(ą…ඣ?jB@kýuÜş®45—[ę jж-žPN-)BQô–E""k'íĂŘÜy‹pí‘8v m ¬ W`DN*^çŢz މ ďţŢ9çőfiH= ¬ů–¬´†¨:ÇÎÜaö>=SE7š­î÷¬TâbËí–öř_”%đÝ'`Źä#.{Di# E‘SU•C }„Ěó\eY¦„ ]ŔΕëşRŔ˝<ĎS:Ň4Ut¦) Ç!$S˘ŁmŰ_ZmŰ–Ă8Ž©iŞëZěŔjłpbyîČ+h[č`…9ąë:*ŠBŢE†Ń?˛yĘď/IyçľďËŠ2¶×ď"žËż ‡uh`> ­ęY†˘čmăG)şv2ŕO¨88 ˘ ŁŁNů/.ÝŞ[&W'‡véŢt"tWˇYš†hĎąäĹv°Đ‚.É{y9ď˝{Ďą÷Ď\ú•ÎjYŚ@?*Ľ ń,ŕyĄĎX ź¨[ébžwŢcQÁńŽĎaE”;Č…lqŢÇP•¶Fŕé/đ[$ŕ5‰%YŁŢĽO§ň4Éëüčç7«7yĆ{`qîRÂű;ylµ$b°ż€ďŹ´ µŰíĂl6Óę@2IĄRIKĺ úĂPęőşŽ7›Ť–L&•$%†ďű:ßl6e±X¨Ďçó#ŤX=XĂ*•Šţ@ Ł-V nhćĘ岲†ČĽÓédq‡śô'“l€<™L$źĎ+_ÇăqÖŁ®ŃKLO››¤"QA$©úO˛×§ÇŃńp8T Ҷۭôű}†6Ó[ťŇ4·ËťÚ€§¦ž«ŐŞŘ¶­ů`/ăĎÝnW ,e€ÜČu]©Őjz“_7 ›c«ĺr©€¦·0¤(WúŢëő´ˇšâ’űިŘűw»ť¶ T4Î1Ý$źŔaáah8Ç\đ–\×h4ÄóĽź4=—} Ŕ}ů¬¦Eaü6J⢆RÜb]şA\fŃĄÚđ _!řB»ëÚEtáJ!Ź .\ ­ĐJc –.4ęôünç3Ɔd‘E{a;wî=çžűçűľóďcŃ˙ăŕôlźş›ü1°rÔ‚\ż”÷ °íjž€ąŐŰP˝’ă»r ş$PíŢĄ3#w:¬Ťz+••4ŕěZóŤ\˘Wg.VÇęZĚžÉßµ°ĂJFM6¨ď Hľ÷–h!Q,äjó~}qˇľťżWsůemŹÔT\ź \§źÔ-ąxÇź?©©č;+°V–ü"}?HźŻGe9¶|n¤ńĆů‘–«ţóęJîô÷L hq¨lĹéV˝ËĺÔÉĺĄZliŰ©ň°Ôk±k9ő]´Bˇ``(›áp¨1ťN»Č ţ ŚÇcÝ$0~>źkb"^ĄRQťNç…Ř3A8Ał~ Uâń¸f'“ŽđĐŹL:}‰„ęv»ş˘‰}‰'ŠY˛®ÍfS··Z-UŻ×5=ŽF#˝Ś^™ŤFÝCň :µŰí{íĹbQĺóyWx1s˛†Ţä!řüőn¨q@ť¨&“‰–ŤěK÷dĆ0‘±\Á@׹'¬{&“Ń2‡ďŕťc·/WLݤ>Ôąxad ‘2oNźĎAµZ}tŢÇě—™ őp8Ě;$ý=»lů-@»ćďŮĹń3?4C’*Iˇ6 -„l°‹•]›Ťd K-¬,µR˙mP±± `ĐÂ$V6fe1ě2FYwfr>çÝ3^_f]ÝMŠ ąp¸ofžďťsďůń=ßëżţ‚·µüoŔÝ€8˝żŘÔôG&X•%2A{:çÂŤą-ëße.ěžüy‚ łr5g‚ř Y¤˝'†­jgšr$‘a®ŘuÁPá `),“–~Ż4…űjy»·xy 楼–cĘeM+(n/Ö$J^\Í돹Ëäsľ9Q0$ŁůÍ WĚ– 8ýcÔĆŮ;ɬŔ51 ŮO ©)¸˝°kčS\źjŠWkásMBţ­ˇ )€’ ĂE??ŐůW”÷5‰˙ň`PžT ţ˛ŠĹłrZÉÉď*'Şî“ŻIacCľ–źôY§FćLN5ż>U9řö+‘6ä{­‡?Ű÷ĎQŐ öŃç#ňÁÚšüřŕSѧęá:•"(ń·R®»PŘš†/?–Ź::äüYI"¶NćJ•Äe â?+~)j)kS$Fť9±•°B§’Nź<|(÷ ÜS”Ěo'_éJ€í"Cß<’űmmR+=“3}׹íNµîf՛ꀶ˙°šF÷őőYU:::2Ä ž€EŤV„î‚ňIŁčS“Ż!kÜÄ?ű[[[ ):€`đ.Îţţľ´··Űs(É ýĺĺeCí«««™†;Ŕ @ (ޢĽýwwwëyOOŹ!DŹé$ڶć‚JŠJ2Ëĺ˛ěííY 1ßĹBA“Ц 0 ^ l](Ě~{© ±"6@8Ŕ p<<<´•E1–¦–űűű­Â`îq"-ľŕřěěě4ecPăýŐ°Ć+>88hďqNĺąvrčNpŽmeĺÓZ›¦ Ҩ««Ëx5ďcNŽćd ľÔľí˝ĆnĹFĂŃ^úĽV!"ÎÎÎÚ ŃîBc‚1céx€ŽWůą,###Ö†íěě%OźŁć„a#`킎ÚÓäďŞ<ŕ¨hrrŇ\`MSŢÇ»é <>>6óąľľ^_9ve``ŔZ ÜC‰ľŹ•jtŤŰy_S˝)ŤŢÖ€ÍÍÍúyçńůžů=îŰç}ŇÖÖ–loo[ŚŹŹ[Żnz&y·w+n‚Ř<_gŕB¤Í­ 2é?&đ㻦ĐÜÜśą!»444dťvżźX!Ó…C¬7Ű”Ăď'&&¬}-‹2??oßsŢ@°Ň~-..Ö”HzÄ`(‡ ­Řôtt SSSV[Ľô@u1öó°ôęż–†Ét;gffdzzZVVVdiiÉV¦··×Š©4v+>C3̤břrj…źěáßéVŹtN°CÖtww[8eţĆř`EGGGM^押°ĄĄĹx0_]÷ećXÜ`…BqîyĎúŹđŞ`Źçxu]aÜÚŚĂp5…ŔF(dĚś.‘±Ř oĽ_iĹ…í ~Đăüł§¸2i˙uyˇŻ.i×+©»3… ĺ¨Ôě*BćÂU™IµŔ—[íÖ.,,4,0wtNgÄĚO:Ó¸ű¸‚®¬ I‚`NÇ@ŤęMď†ĘÜÄŹZ›˘ë\Ôżä¤q#–Ť®ŻyU$ŐH*Ń\ MZZž‡#€řš ¸ůË?ßĆžř/—Üľ¤Aµć?IEND®B`‚card.png000066400000000000000000000130771361462701300335110ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons‰PNG  IHDR00 ÉtEXtSoftwareAdobe ImageReadyqÉe< iTXtXML:com.adobe.xmp © 2009 by Oliver Twardowski Oliver Twardowski ‹ç4EIDATxÚtŤ± €0 k(: |ó+dHŃ”ÂhÉ–lËr ‰?LŰwc\#€Ţ;Zkߢšá8÷7pw”R€q®ŞL)1çüX^"Â[1RĎUL/_ľüţ˙ׯ_`üůóç˙«V­úĎňáÆ'O3Á*ż~ýĘđďß?&ÓžćľÂśÂUÉŹú?Ăz]@}\J‘ozďż30sî: ĂDĄ}ß ÎÂD!„iYI’—”Ň›Ş9ç{×u¦t˝×u˝UB^Ť16Č+{Ü„ o‘"H)]ą˛/#W>ŔŠĆ7§IC“.Ą;×ŕÂW0n-Ž€,…°ßŠ·Âˇ˘ bĄŃţx=óf÷ÍŰ»ąôđ‹~ľ/¸"?I-DŚ9z…q™jâ=UŻ"sÉ!€µÖěş.8ăiyž]űeE­3oŰvšÁ8Žĺű<3vaME¦( ó±\šíĎ68‡Ž˙ť‚^śÇÂţk´¤öűwôÁ†a0UUą¬ŽˇŠ„S˝JGé9&˝ś 0Étł×™YŻ7—šrgí6K®ĺ_N%=T'ŠĂš@Üŕgä_—Jµ˛–¦©/kćdˇ r¤ăâ="Ö&ňuIŹ€–e٧Cüĺ†oMÓě’$ ¨% B^–ĺwß÷+÷ůP×ő>ŽcżG ńp©8 Ŕ~Őł&DÁMšÁR¸BňŇŘ«ĂĆH쵎•E~BŞ&µ "¤ÖHŔ6Ą…˙ŕ;›\ź`ÔĽ9n^Ţ]l“Ęĺ>v÷ÍîŰ˝™Ů#Ž˙%8ŁŃhOaá=+8ä%ZW0ŻĽčđ kŇn·OÜš4ÖeµŔR<ę ?Ń»)LtčŞT* béšěŠŕ‚¤€ËĺT›ÍW(\ż?Ć_±6ŘYŮ`ö,AÚ¶§ »¤3®Fă:>fŘ´ÁYGď‹8;CSDÔŤĄíĂb±íčüÁ©á·_Ż×÷ňŮ?t7™LtöB{ô““ó#Žčů|ţv6›Ą6şŠáp¸·TĐëő.ęőú¦T*­ű,ůg>ź_ŠŹ}/‹+®'b¶Z­sąüąmů ]«im"Ă“ŐV"@bČ/ňěMęGÄ˙‚EHOz)ń'$ćâ!^’¦Ľĺ`É-]4ĹS=7˝yÎP<”n6Î3ťgűît7¤`!Ă~dgöýšŮ÷yŢ\ů ®ým©ŔRĄK– \€?Lrő÷~ż?KdęG€‡erHfŽÄ ŻqŽDĎ–Ëe“ű1 “dÓ2yÍąXJ*W抒O“H$•jDc~ÔBˇqomͤŘ^ĆćŚú<3˨Ű٬Ęçó•ŕ…3őíčČ@"ť¬Żß˙§ýűHvFP —.tBŞX 2ćĚD’gđ’ă:†ŃrŮ™ymw·wAYč6× Ť¤ŕ”ôČ\`„±óx|˘Ť7s99>ŽĆÝŇZRî"2tp)$ĆAxďnibnÁX(Ş€_/‹±ýź LÂp’jî"•pk$®uŃ@>p~ÉŃĐú4N"ę–H ŐÉ L&“č…,`ĂK8˘‚‰m—;„˙xŚ"_ĘŹ:¶jQŚ}Ix€n+•J—ŠA\ÄCZ;îŐjµ·zß§[ŐýŽ•Jĺe»ÝŢ&·GKËE,CA~ť17Xśz˝ţa<wAŤŘ~Ş=˙Ş×ëíŕ›CąÜ0LM%H‘đÂ=|şÝîkýHĂ*€*ój«ŐÚĆłćżBxŚÁXň¶îV á1ż7›Íú6x–Ŕ*t:ť”Ž0‡8iÍË Ř„`_±ľiĎW¬Đ¸F=ý§ óܵĂöčŮR›•Ü.÷_ѧöřÝ™÷ŽPčĚv\źÚó)8›xcöC÷ÉdČ ÍűDĹďł<‚j?IEND®B`‚collection.png000066400000000000000000000066221361462701300347310ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons‰PNG  IHDR00 ÉČiTXtXML:com.adobe.xmp Oliver Twardowski  Made on a Mac! exclusive for Smashing Magazine icons flavour smashing magazine addicted to coffee © 2009 by Oliver Twardowski îQŇtEXtSoftwareAdobe ImageReadyqÉe<`IDATxÚbü˙˙?6ŔÄ€°€Žôů˙˙ýĆđ˙×/F66Fn.FˇIt88Ů.łs˛1°°23üůý—áçw Ľť»˙™ţ˙ű–őďÓW†_hv#é®âĚ^ü˙˙·ď ˙ż‡ÁÉÉŔČũʧ­ČŔÁÍĆŔĆÁ –řőă7ĂŹŻżnł|űô ČřÁŔ tüşčßß ,˙>cřřf@ľČ%a†‚NҦkŽÁ™z,¸MĹi* 4qlJ¤‘ţaç©–®šŢü ü`®Úq†ah“˛02p&6ŽŔŔWŕ0€€[0!ÁŔ̢?Ű)ĄLü$,EvŇĆŻ©ßs^ćŇĎ©ôwµ´Fk22hĄ¸´\[éŰÝ!9ŻúőŢ’$9ç4UM€Cđ9ÖÉjÉX 'Zô’FĎĂ+yůY8M;5לl;̵E*/ˇŹ9‘‚çÍžçŢ)Ń«Ľń3‰$&0^É 9A>!¨"Ë ă ĄP€ osű`$˝őA˘¨N–›ęÎk{©A!7ç ©yŹ“2@©ŰRd§Éď±ýú‰^”Ůőą8öµ+Tel6:gsv݇Í_ čqŘÎŕrT>6˘Ő[—ó«v€ýňWi ¸»·EK%…¶>„ŤX%ľ…66vbeë­ř‚ vJÔF±ňRÚAvĆ™ÝŮ?wą41ér°ěĺr7s»·űýľ™hŃ$Á䚬Ču›nkŠŽxőŚ’˝Ő;ß{űNÖVš˘"ËčÜ ¨ßˇ{‡Ţě¶ăŰGX—Đ%{Fy•őL("2t‰Ë%˘%Ń›…tž%ŕ{jTAuQ®ăRAó¬ÓÖצ1íSH çĘÇËw”TôŇ üR¤˙ÖŰ, 8kFF僚»ÚV‹§wččĹÍ”‰VdVŚ{-‹Ć5ߥB3NŔż©µ "đ ÝŰ…Ç ŇŢÖY8©ä‘X÷Íü36řAÄC5ĂĹX@^ŽŚĐś„nöTA¦Ş¨q…dÂeouůúçţú»ˇ?žéz‹§Ü © ŕ.°S$+'‡Q`2$ÇďŃÍRgˇC}‹ˇĚA!g˛Ęą¬iŁ©K<†„Cëţ>Ű&đpx“KŔÇdcŞ|áO},–Ŕů›×&ČG"ŕĎWÉŻůă«~¤'IjąWď$Âńwr(›ÄöxLRaaJýŹŕ‚ćb{Ä .Ăş›“’zVÚŚ”× )ŤŚ4ť­SŹČ–đW—á=é¤őĆn[ţhĎęY¤Šˇh’7ł+*‹ ‚ř´ŘBD«aÁĘŇż`'XŘV6 ‚6‚Ťť˝……­ëN±««‚…?ŔÂĆ]żf^r˝ůľ7/;ޞ.Ě@Č}oŢ#÷$yÉ9'˙Ľ™ßóçććöÉ üŠÝ0¸ˇa Z Ńúéţęχ—oě'¶Ś&,Q[™Ä†)€.(ŕŔ»ľA®‹â]•ď©HcÔn?ď0xŚĺŇőŹ“Äkc*É2T ‰)H–¨Ju´‹ň=ÂďˇŢš}… Nwśx°1mY[\:$ôEłĐFzŞg ľÜk”‹-Uő×Ň=Ó(O›Üł‘ /' ĽGŰ~Ш%ŢöÚ’ń‚o…ť6v2DkŹKŚvD˝µ÷Ć­‰źżŠ…ŁKgŢ_:·ĺZ9v¸‚MŢÁV—•JĎ«SzĹÉŽp?Ç–gË.Á †›ś·™4=9ÉMąH™‰ÁÍ-h˝‰\éaô1™e۸¶ âęŤ\’¶eŮIÚ_çĂ f‹•Éä ô˘Ŕ(ŔdÇ1€Ńń„łř~‹”^k”ś*JŇŘ›&’" - ™ç2ý6ă…’Ý!HZ Xä Ýc‰§ä©ţH ?á@ĽńVéݧ–ľźŞ™‹1V1V2-YŞĺŃČßj}€€0A·0™ş LĽcj®o_]x§T›@Ý%őß‚‰ÉÖÔV˛ž;›FP®J˘ $qaą†Ę’5祧´ť2$YË<ő%=‚)?˘Ă DĐŢÎ˙™îŞüaúű°sóÂqĆ…‚p~j+}·C»쾊Â^śĽě’9­×˙Ŕ_Ü»ßFŽŔłbŃĂ*™;xýQ ÉĂ۸ťÄ‰Ý˙/Ňă2ôŁkHĽÖľ­^ÓYk}”&ŚĆB¨ű…§Ň#ĎÄX‘šIJÍ.‹çć´č«i‹ú76ĹgfŢVůÚĄŁŔŹbÜŮIEND®B`‚file.png000066400000000000000000000054251361462701300335150ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons‰PNG  IHDR00 ÉČiTXtXML:com.adobe.xmp Oliver Twardowski  Made on a Mac! exclusive for Smashing Magazine icons flavour smashing magazine addicted to coffee © 2009 by Oliver Twardowski îQŇtEXtSoftwareAdobe ImageReadyqÉe<ăIDATxÚlڱ ŔP5¦s˙śO +QĂ(bőŕîÄ»f¨j›Y‹Čkâîľ)3ăG¨Şď«Ě"Zp86".x#^W˝}űě˘÷ďß˙ßµkÂUź>}ú2fÄUţü›˙ăÇTWtT˛˛˛2Ŕědi˙őëÜ( W˝{÷b1ÔŮŔ`b8yň$CTT#L Š‹Áö21­iŃ@_0ČËË3˘ °°°€5€Ăś!((GV ó ĚĎa>ĆĐđóçO¸999á~ÁŞ(É;iŇ$\ //Źč‚'—€A†ŢÂěÎ…]Ř úŚÂ'j%”Ű µ‹ľe†¶č ˝¬[k=x:Ńs΋ę@°h5ł9—Rú“%E§D1ý»2 , ôÁŕ{äŇ€‘Rš3čě™Á÷Ž”Ţ¬ă7ÜFíěĎ’.Ý‚ˇŐ÷ÁŔˇ¨dM‰§6@­ő×CŢĘî†aÁ4ę€Q4ă0S*?|čJQ/EŠPóă»3¶»­ĄÝőžÝ”k­ť,ŤŁ]ç‰ÄŹś+ËÇ])ĺu+îźF†âM$#Ií">„ŕÔHJɵ֮ó<Ż­L e5?÷Ţ»śswI‘ …ĘBöŘżĚŔo'ź®qí—Źcď­ď°]˘_{Ťž\R„ÍUuĎT( `,úxŰĄ>ćoWEl!ëÄ1$–¤[vń{– Ź 8¦+ʲŔłLů[T|ŕĹZR†ˇ`tŐEĄËŢŁ—é1zń{€˘÷é9şşŐŚ00}$!)h@Ähß˙Í›çĎÝŹO¬޶‰lĺ,ËâćyÇąů1/ ‡X9;öČş® o®m[7MÓc†kq¨ÂÉyďů©kšć{ß÷ýeÇg¶ĹÎUČů^×5Hńw.xD=gç@aZ{!†PŽĐu]~@4!´T<âˇěíz˘Ö«g¶Űłs č¨ 2Be+ج22™x[ˇ•T@÷C9 yŤ….+j=˝±ł—‰3Ł*Tč ďČůseá;›UđAĄ0¶4É0ŠBÄ„14TĆýPAOďšÉ±¶wUöS„[­ő4–č ů'k@t‰QỆ>-…pxSUŐ&/şîw2­äż *ŔZÎϱ2=¦¬‚đN!¶‚´Ú’!ň?F’kvęřŮ|ňŠ^Ą-šµ¶Ű č(Ž#!ńC5”ŕ7@®Á‰+ DHŘm„Ź<•0č6š¬öxĺN‰Ąń‡ÝŰçĚ9úţd,ňáÂß>ŚóQâ˘ëşÓńx|ĆkrŹo‡5Z˛XË !d%.6pX°—âcăXé1ô4‰uëĵîă]}|H/¸ü ˝ćcR±â^K˝°]Zy4űĄ9$­¬Ĺ%éšĎďÇŕWđF&$<ć9Ľ®grębyϦ\˝˘ Ę1Éɵf!ë4GÇ˝uxĹÝ d C(ÂěíT’21‡¦ 2ĚY;¦Ë¨ţÜbŤ­®Ý_ŇÉmÁH9_’\™2""s< fe\w˝Ü»ëέ߹M€Ü’@Ă'nNť$ďNŢśĽ:yq×g¬ăç«<ŕľyúŻ´Ęh!’ŁH6ŔIEND®B`‚parent.png000066400000000000000000000066221361462701300340670ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons‰PNG  IHDR00 ÉČiTXtXML:com.adobe.xmp Oliver Twardowski  Made on a Mac! exclusive for Smashing Magazine icons flavour smashing magazine addicted to coffee © 2009 by Oliver Twardowski îQŇtEXtSoftwareAdobe ImageReadyqÉe<`IDATxÚbü˙˙?6ŔÄ€°€Žôů˙˙ýĆđ˙×/F66Fn.FˇIt88Ů.łs˛1°°23üůý—áçw Ľť»˙™ţ˙ű–őďÓW†_hv#é®âĚ^ü˙˙·ď ˙ż‡ÁÉÉŔČũʧ­ČŔÁÍĆŔĆÁ –řőă7ĂŹŻżnł|űô ČřÁŔ tüşčßß ,˙>cřřf@ľČ%a†‚NҦkŽÁ™z,¸MĹi* 4qlJ¤‘ţaç©–®šŢü ü`®Úq†ah“˛02p&6ŽŔŔWŕ0€€[0!ÁŔ̢?Ű)ĄLü$,EvŇĆŻ©ßs^ćŇĎ©ôwµ´Fk22hĄ¸´\[éŰÝ!9ŻúőŢ’$9ç4UM€Cđ9ÖÉjÉX 'Zô’FĎĂ+yůY8M;5לl;̵E*/ˇŹ9‘‚çÍžçŢ)Ń«Ľń3‰$&0^É 9A>!¨"Ë ă ĄP€ osű`$˝őA˘¨N–›ęÎk{©A!7ç ©yŹ“2@©ŰRd§Éď±ýú‰^”Ůőą8öµ+Tel6:gsv݇Í_ čqŘÎŕrT>6˘Ő[—ó«v€ýňWi ¸»·EK%…¶>„ŤX%ľ…66vbeë­ř‚ vJÔF±ňRÚAvĆ™ÝŮ?wą41ér°ěĺr7s»·űýľ™hŃ$Á䚬Ču›nkŠŽxőŚ’˝Ő;ß{űNÖVš˘"ËčÜ ¨ßˇ{‡Ţě¶ăŰGX—Đ%{Fy•őL("2t‰Ë%˘%Ń›…tž%ŕ{jTAuQ®ăRAó¬ÓÖצ1íSH çĘÇËw”TôŇ üR¤˙ÖŰ, 8kFF僚»ÚV‹§wččĹÍ”‰VdVŚ{-‹Ć5ߥB3NŔż©µ "đ ÝŰ…Ç ŇŢÖY8©ä‘X÷Íü36řAÄC5ĂĹX@^ŽŚĐś„nöTA¦Ş¨q…dÂeouůúçţú»ˇ?žéz‹§Ü © ŕ.°S$+'‡Q`2$ÇďŃÍRgˇC}‹ˇĚA!g˛Ęą¬iŁ©K<†„Cëţ>Ű&đpx“KŔÇdcŞ|áO},–Ŕů›×&ČG"ŕĎWÉŻůă«~¤'IjąWď$Âńwr(›ÄöxLRaaJýŹŕ‚ćb{Ä .Ăş›“’zVÚŚ”× )ŤŚ4ť­SŹČ–đW—á=é¤őĆn[ţhĎęY¤Šˇh’7ł+*‹ ‚ř´ŘBD«aÁĘŇż`'XŘV6 ‚6‚Ťť˝……­ëN±««‚…?ŔÂĆ]żf^r˝ůľ7/;ޞ.Ě@Č}oŢ#÷$yÉ9'˙Ľ™ßóçććöÉ üŠÝ0¸ˇa Z Ńúéţęχ—oě'¶Ś&,Q[™Ä†)€.(ŕŔ»ľA®‹â]•ď©HcÔn?ď0xŚĺŇőŹ“Äkc*É2T ‰)H–¨Ju´‹ň=ÂďˇŢš}… Nwśx°1mY[\:$ôEłĐFzŞg ľÜk”‹-Uő×Ň=Ó(O›Üł‘ /' ĽGŰ~Ш%ŢöÚ’ń‚o…ť6v2DkŹKŚvD˝µ÷Ć­‰źżŠ…ŁKgŢ_:·ĺZ9v¸‚MŢÁV—•JĎ«SzĹÉŽp?Ç–gË.Á †›ś·™4=9ÉMąH™‰ÁÍ-h˝‰\éaô1™e۸¶ âęŤ\’¶eŮIÚ_çĂ f‹•Éä ô˘Ŕ(ŔdÇ1€Ńń„łř~‹”^k”ś*JŇŘ›&’" - ™ç2ý6ă…’Ý!HZ Xä Ýc‰§ä©ţH ?á@ĽńVéݧ–ľźŞ™‹1V1V2-YŞĺŃČßj}€€0A·0™ş LĽcj®o_]x§T›@Ý%őß‚‰ÉÖÔV˛ž;›FP®J˘ $qaą†Ę’5祧´ť2$YË<ő%=‚)?˘Ă DĐŢÎ˙™îŞüaúű°sóÂqĆ…‚p~j+}·C»쾊Â^śĽě’9­×˙Ŕ_Ü»ßFŽŔłbŃĂ*™;xýQ ÉĂ۸ťÄ‰Ý˙/Ňă2ôŁkHĽÖľ­^ÓYk}”&ŚĆB¨ű…§Ň#ĎÄX‘šIJÍ.‹çć´č«i‹ú76ĹgfŢVůÚĄŁŔŹbÜŮIEND®B`‚principal.png000066400000000000000000000125501361462701300345540ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Browser/assets/icons‰PNG  IHDR00 ÉtEXtSoftwareAdobe ImageReadyqÉe< iTXtXML:com.adobe.xmp © 2009 by Oliver Twardowski Oliver Twardowski ‹ç4nIDATxÚbü˙˙?V’a%yĹ˙bÂb˙M Ś_‚ř,0¬¬l ‚‚l źż|CŃÂÖ–6@ę?3ÍÓň_HXˇł˝óĎ’ŤŹKŔp@1ârÜ(qń˙ ăĂ]%((˘.!"*Ši”ż_Ŕ|aa˛ Ŕ–ÇĹĆcŘÎÉÁÁ@(„a~^ůĘŠŞ˙´ş†7ädä1L~ôä!#†ca@XXŔPn.n˙YŮŘľ˙ΰo˙^F a‘ ,¬,ó˙üţÓdU†–ÖfF°†”äÔ˙ D€Âw¸6AyĄ˙|‚ď ÚL@j?˛‚—o^2â´!>1A‘›Č Äæ ďsqroŕäâb@ĆxmnnnĽ6`hŕââřČĘĆÎĎÄÄLl Óđ†Rfzć˙gĎźŁ«ů°qÓA ú&ü?qâ$^§ 0Lź9ťě¤ó.݆oŔ„÷+++ŃI €HNK¤B D…ĎKJHüţó‡áÍ›×`1ffm M†;÷ď18€ÉóŢý»Śd‘’˘2Á0ÄgŢ ZĽpI=7–äM č3SsPövŔŁä©Ó' )JE.ŽÎ˙aęŔe7##Ăź?î?°_€ä äfĺ|ăááa`cc¦f°á ęTJk¨©ó{{x DŔšô˝±©‰Ŕ“'O^>A\ZgaeĐ7Ôg€ę)\łnÍ š›š˙߼q“jLZJęUgO—8<Ýż˙€ŤťťjĽ~űVŚ.E@ŃÜ&˘,Vş ÂB"˙µ4uţKKH*áůT "`I*ŔÎÎţ^MUŤáň•ËqQ1aQ†k7Ż%ľy˙vŮ›ýđđ!Ny5U†Ă'Ž0’DŹź=e`feÁ‰ď>ĽĎś”˛‚ě ‡…™`}ÄđęŐk}ň-`e9@ $–M¨Ť)’,P”“çyúě^|˙ö•ťl ~˙űkÂʆżˇ¨ ¨D¶ź?}ľ,) đ©áäâŢOv2ݸqŁZkKŢ"X›ŹČJ¦ţţţ·ŘXŮ16 lQ8á3ś¨˘BUMe";;0.Ř€iDřśŔ¦ŕˇĂSÜđzúä©<#°ţeú˙°ŃĹÂĚđóÇPÝü(}‡˘ÂTß*+)€Ú˘-»ź?ľ3üĘ€Ŕć ?¨ľ&«°ö!÷[YZ ;~Ą3 É\⇕……AŘ!¶ÉŰŕ‰-Vřâ’ý222 Ď_dřóç7QE2PHĎŮÓg>+|A¬€zÂ"" wnßa ‹cc`ç!qĹŞĺ ŕ‘\^RöňóçĎ ĚŚD˛бgÎśaĐÖŃUH >~ú$ĆĚÂÂ@-pçÎ]Ôdúë÷op«ŤfP;sČ6[tgu!M…ařŰ˙ÎU+\Đ~Úö‹F#‰˘Śâ$ěďĆ.ŁH˝Ť Ľč: é6 ŠČ%0ˇnĽ0Čĺl5ŮÎ<›z¦—§m˝ďńl¬šwŽôÂáůŘßއóž÷{žw˙J‡čĘ)ĽÔĄQ]eŢ%ś´Ř"čQŇKĚřz“6Y `ó',[ FCŢęÝzi‘°, =XGŚz#ß‹ç™B%(Â.ł(%şSĚܸ¬%äq{ŰmŽ›čÝsósŕČŁ|Oß,ĚŐfâp8 EQd–NřéśŔŮ3çĆ 1žŽ´µîZ2žňS‰x@Ň‚Ε§ˇ4"űă·ČWr˛ţÄXJKĽ}›Ëqđ#ÎĹÖńňĘrBŽ—8i±Xb Ă&ŕőz$'pçvg?śßŤj­Vt/§fgď<•”ŔŁţľŢúă ·4jŤh+,”Ł„¦ŔTőŢKŕü…¦1ą¤ň3ŤŢS[ݤuĺ»ďäádřǨվÖŔ‰«Ó߉ő®µ{tD«×óŘ~őrDLňŰ)ćěľ&ßČÚc…íňŕá cU…Bů›fâ¸ŐEĐ×wo‚ý˛«Ńf_sۇńXś¤Ói’Ë­%Îkt!ç|.Źsa˘VŞřĎQá?u•č ŽöĘB ĺbKřŮ^›Ínžž˙ő}6›+*M•JYVąş\nŤ~g8Žë¨k[@§Édj@{şÜ'ťL‚ýB¸ozëZʧ¸'λAcˇJí ĽŘöKí¨ĺź°ŮśN‡$S)~ă%pµRD•ÉÄűř˝Pf8䜉FŃSÜ|9řvC×®\oµî·YkjČçÉI’YÉěץ7čɡş:đ BĹ)˙óĎe˛ŁG…B!’˘iáńŞv,Ç‘OĹI±=üA Wl|°]9®+%;<ůM_bhs( *4ť€ZŐ%¨î+ R@…°V”9ĺsx$”`VX#ţ,AĽ¸\đ‡€YČ9óߌU~É;°ÍSńGIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Client.php000066400000000000000000000447421361462701300300430ustar00rootroot00000000000000$validSetting = $settings[$validSetting]; } } if (isset($settings['authType'])) { $this->authType = $settings['authType']; } else { $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST; } $this->propertyMap['{DAV:}resourcetype'] = 'SabreForRainLoop\\DAV\\Property\\ResourceType'; } /** * Add trusted root certificates to the webdav client. * * The parameter certificates should be a absolute path to a file * which contains all trusted certificates * * @param string $certificates */ public function addTrustedCertificates($certificates) { $this->trustedCertificates = $certificates; } /** * Enables/disables SSL peer verification * * @param boolean $value */ public function setVerifyPeer($value) { $this->verifyPeer = $value; } /** * Does a PROPFIND request * * The list of requested properties must be specified as an array, in clark * notation. * * The returned array will contain a list of filenames as keys, and * properties as values. * * The properties array will contain the list of properties. Only properties * that are actually returned from the server (without error) will be * returned, anything else is discarded. * * Depth should be either 0 or 1. A depth of 1 will cause a request to be * made to the server to also return all child resources. * * @param string $url * @param array $properties * @param int $depth * @return array */ public function propFind($url, array $properties, $depth = 0) { $body = '' . "\n"; $body.= '' . "\n"; $body.= ' ' . "\n"; foreach($properties as $property) { list( $namespace, $elementName ) = XMLUtil::parseClarkNotation($property); if ($namespace === 'DAV:') { $body.=' ' . "\n"; } else { $body.=" \n"; } } $body.= ' ' . "\n"; $body.= ''; $response = $this->request('PROPFIND', $url, $body, array( 'Depth' => $depth, 'Content-Type' => 'application/xml' )); $result = $this->parseMultiStatus($response['body']); // If depth was 0, we only return the top item if ($depth===0) { reset($result); $result = current($result); return isset($result[200])?$result[200]:array(); } $newResult = array(); foreach($result as $href => $statusList) { $newResult[$href] = isset($statusList[200])?$statusList[200]:array(); } return $newResult; } /** * Updates a list of properties on the server * * The list of properties must have clark-notation properties for the keys, * and the actual (string) value for the value. If the value is null, an * attempt is made to delete the property. * * @todo Must be building the request using the DOM, and does not yet * support complex properties. * @param string $url * @param array $properties * @return void */ public function propPatch($url, array $properties) { $body = '' . "\n"; $body.= '' . "\n"; foreach($properties as $propName => $propValue) { list( $namespace, $elementName ) = XMLUtil::parseClarkNotation($propName); if ($propValue === null) { $body.="\n"; if ($namespace === 'DAV:') { $body.=' ' . "\n"; } else { $body.=" \n"; } $body.="\n"; } else { $body.="\n"; if ($namespace === 'DAV:') { $body.=' '; } else { $body.=" "; } // Shitty.. i know $body.=htmlspecialchars($propValue, ENT_NOQUOTES, 'UTF-8'); if ($namespace === 'DAV:') { $body.='' . "\n"; } else { $body.="\n"; } $body.="\n"; } } $body.= ''; $this->request('PROPPATCH', $url, $body, array( 'Content-Type' => 'application/xml' )); } /** * Performs an HTTP options request * * This method returns all the features from the 'DAV:' header as an array. * If there was no DAV header, or no contents this method will return an * empty array. * * @return array */ public function options() { $result = $this->request('OPTIONS'); if (!isset($result['headers']['dav'])) { return array(); } $features = explode(',', $result['headers']['dav']); foreach($features as &$v) { $v = trim($v); } return $features; } /** * Performs an actual HTTP request, and returns the result. * * If the specified url is relative, it will be expanded based on the base * url. * * The returned array contains 3 keys: * * body - the response body * * httpCode - a HTTP code (200, 404, etc) * * headers - a list of response http headers. The header names have * been lowercased. * * @param string $method * @param string $url * @param string $body * @param array $headers * @return array */ public function request($method, $url = '', $body = null, $headers = array()) { $url = $this->getAbsoluteUrl($url); $curlSettings = array( CURLOPT_RETURNTRANSFER => true, // Return headers as part of the response CURLOPT_HEADER => true, CURLOPT_POSTFIELDS => $body, CURLOPT_USERAGENT => 'RainLoop DAV Client', // TODO rainloop // Automatically follow redirects CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, ); if($this->verifyPeer !== null) { $curlSettings[CURLOPT_SSL_VERIFYPEER] = $this->verifyPeer; // TODO rainloop if (!$this->verifyPeer) { $curlSettings[CURLOPT_SSL_VERIFYHOST] = 0; } // --- } if($this->trustedCertificates) { $curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates; } switch ($method) { case 'HEAD' : // do not read body with HEAD requests (this is necessary because cURL does not ignore the body with HEAD // requests when the Content-Length header is given - which in turn is perfectly valid according to HTTP // specs...) cURL does unfortunately return an error in this case ("transfer closed transfer closed with // ... bytes remaining to read") this can be circumvented by explicitly telling cURL to ignore the // response body $curlSettings[CURLOPT_NOBODY] = true; $curlSettings[CURLOPT_CUSTOMREQUEST] = 'HEAD'; break; default: $curlSettings[CURLOPT_CUSTOMREQUEST] = $method; break; } // Adding HTTP headers $nHeaders = array(); foreach($headers as $key=>$value) { $nHeaders[] = $key . ': ' . $value; } $curlSettings[CURLOPT_HTTPHEADER] = $nHeaders; if ($this->proxy) { $curlSettings[CURLOPT_PROXY] = $this->proxy; } if ($this->userName && $this->authType) { $curlType = 0; if ($this->authType & self::AUTH_BASIC) { $curlType |= CURLAUTH_BASIC; } if ($this->authType & self::AUTH_DIGEST) { $curlType |= CURLAUTH_DIGEST; } $curlSettings[CURLOPT_HTTPAUTH] = $curlType; $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password; } // var_dump($url); // var_dump($curlSettings); list( $response, $curlInfo, $curlErrNo, $curlError ) = $this->curlRequest($url, $curlSettings); // var_dump($response); $headerBlob = substr($response, 0, $curlInfo['header_size']); $response = substr($response, $curlInfo['header_size']); // In the case of 100 Continue, or redirects we'll have multiple lists // of headers for each separate HTTP response. We can easily split this // because they are separated by \r\n\r\n $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n")); // We only care about the last set of headers $headerBlob = $headerBlob[count($headerBlob)-1]; // Splitting headers $headerBlob = explode("\r\n", $headerBlob); $headers = array(); foreach($headerBlob as $header) { $parts = explode(':', $header, 2); if (count($parts)==2) { $headers[strtolower(trim($parts[0]))] = trim($parts[1]); } } $response = array( 'body' => $response, 'statusCode' => $curlInfo['http_code'], 'headers' => $headers ); if ($curlErrNo) { throw new Exception('[CURL] Error while making request: ' . $curlError . ' (error code: ' . $curlErrNo . ')'); } if ($response['statusCode']>=400) { switch ($response['statusCode']) { case 400 : throw new Exception\BadRequest('Bad request'); case 401 : throw new Exception\NotAuthenticated('Not authenticated'); case 402 : throw new Exception\PaymentRequired('Payment required'); case 403 : throw new Exception\Forbidden('Forbidden'); case 404: throw new Exception\NotFound('Resource not found.'); case 405 : throw new Exception\MethodNotAllowed('Method not allowed'); case 409 : throw new Exception\Conflict('Conflict'); case 412 : throw new Exception\PreconditionFailed('Precondition failed'); case 416 : throw new Exception\RequestedRangeNotSatisfiable('Requested Range Not Satisfiable'); case 500 : throw new Exception('Internal server error'); case 501 : throw new Exception\NotImplemented('Not Implemented'); case 507 : throw new Exception\InsufficientStorage('Insufficient storage'); default: throw new Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')'); } } return $response; } /** * Wrapper for all curl functions. * * The only reason this was split out in a separate method, is so it * becomes easier to unittest. * * @param string $url * @param array $settings * @return array */ // @codeCoverageIgnoreStart protected function curlRequest($url, $settings) { // TODO rainloop $curl = curl_init($url); $sSafeMode = strtolower(trim(@ini_get('safe_mode'))); $bSafeMode = 'on' === $sSafeMode || '1' === $sSafeMode; if (!$bSafeMode && ini_get('open_basedir') === '') { curl_setopt_array($curl, $settings); $data = curl_exec($curl); } else { $settings[CURLOPT_FOLLOWLOCATION] = false; curl_setopt_array($curl, $settings); $max_redirects = isset($settings[CURLOPT_MAXREDIRS]) ? $settings[CURLOPT_MAXREDIRS] : 5; $mr = $max_redirects; if ($mr > 0) { $newurl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); $rcurl = curl_copy_handle($curl); curl_setopt($rcurl, CURLOPT_HEADER, true); curl_setopt($rcurl, CURLOPT_NOBODY, true); curl_setopt($rcurl, CURLOPT_FORBID_REUSE, false); curl_setopt($rcurl, CURLOPT_RETURNTRANSFER, true); do { curl_setopt($rcurl, CURLOPT_URL, $newurl); $header = curl_exec($rcurl); if (curl_errno($rcurl)) { $code = 0; } else { $code = curl_getinfo($rcurl, CURLINFO_HTTP_CODE); if ($code == 301 || $code == 302) { $matches = array(); preg_match('/Location:(.*?)\n/', $header, $matches); $newurl = trim(array_pop($matches)); } else { $code = 0; } } } while ($code && --$mr); curl_close($rcurl); if ($mr > 0) { curl_setopt($curl, CURLOPT_URL, $newurl); } } if ($mr == 0 && $max_redirects > 0) { $data = false; } else { $data = curl_exec($curl); } } return array( $data, curl_getinfo($curl), curl_errno($curl), curl_error($curl) ); } // @codeCoverageIgnoreEnd /** * Returns the full url based on the given url (which may be relative). All * urls are expanded based on the base url as given by the server. * * @param string $url * @return string */ protected function getAbsoluteUrl($url) { // If the url starts with http:// or https://, the url is already absolute. if (preg_match('/^http(s?):\/\//', $url)) { return $url; } // If the url starts with a slash, we must calculate the url based off // the root of the base url. if (strpos($url,'/') === 0) { $parts = parse_url($this->baseUri); return $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url; } // Otherwise... return $this->baseUri . $url; } /** * Parses a WebDAV multistatus response body * * This method returns an array with the following structure * * array( * 'url/to/resource' => array( * '200' => array( * '{DAV:}property1' => 'value1', * '{DAV:}property2' => 'value2', * ), * '404' => array( * '{DAV:}property1' => null, * '{DAV:}property2' => null, * ), * ) * 'url/to/resource2' => array( * .. etc .. * ) * ) * * * @param string $body xml body * @return array */ public function parseMultiStatus($body) { $body = XMLUtil::convertDAVNamespace($body); $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA); if ($responseXML===false) { throw new \InvalidArgumentException('The passed data is not valid XML'); } $responseXML->registerXPathNamespace('d', 'urn:DAV'); $propResult = array(); foreach($responseXML->xpath('d:response') as $response) { $response->registerXPathNamespace('d', 'urn:DAV'); $href = $response->xpath('d:href'); $href = (string)$href[0]; $properties = array(); foreach($response->xpath('d:propstat') as $propStat) { $propStat->registerXPathNamespace('d', 'urn:DAV'); $status = $propStat->xpath('d:status'); list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3); // Only using the propertymap for results with status 200. $propertyMap = $statusCode==='200' ? $this->propertyMap : array(); $properties[$statusCode] = XMLUtil::parseProperties(dom_import_simplexml($propStat), $propertyMap); } $propResult[$href] = $properties; } return $propResult; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Collection.php000066400000000000000000000057241361462701300307150ustar00rootroot00000000000000getChildren() as $child) { if ($child->getName()==$name) return $child; } throw new Exception\NotFound('File not found: ' . $name); } /** * Checks is a child-node exists. * * It is generally a good idea to try and override this. Usually it can be optimized. * * @param string $name * @return bool */ public function childExists($name) { try { $this->getChild($name); return true; } catch(Exception\NotFound $e) { return false; } } /** * Creates a new file in the directory * * Data will either be supplied as a stream resource, or in certain cases * as a string. Keep in mind that you may have to support either. * * After succesful creation of the file, you may choose to return the ETag * of the new file here. * * The returned ETag must be surrounded by double-quotes (The quotes should * be part of the actual string). * * If you cannot accurately determine the ETag, you should not return it. * If you don't store the file exactly as-is (you're transforming it * somehow) you should also not return an ETag. * * This means that if a subsequent GET to this new file does not exactly * return the same contents of what was submitted here, you are strongly * recommended to omit the ETag. * * @param string $name Name of the file * @param resource|string $data Initial payload * @return null|string */ public function createFile($name, $data = null) { throw new Exception\Forbidden('Permission denied to create file (filename ' . $name . ')'); } /** * Creates a new subdirectory * * @param string $name * @throws Exception\Forbidden * @return void */ public function createDirectory($name) { throw new Exception\Forbidden('Permission denied to create directory'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Exception.php000066400000000000000000000027321361462701300305540ustar00rootroot00000000000000lock) { $error = $errorNode->ownerDocument->createElementNS('DAV:','d:no-conflicting-lock'); $errorNode->appendChild($error); if (!is_object($this->lock)) var_dump($this->lock); $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri)); } } } FileNotFound.php000066400000000000000000000010451361462701300330250ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/ExceptionownerDocument->createElementNS('DAV:','d:valid-resourcetype'); $errorNode->appendChild($error); } } LockTokenMatchesRequestUri.php000066400000000000000000000020611361462701300357170ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Exceptionmessage = 'The locktoken supplied does not match any locks on this entity'; } /** * This method allows the exception to include additional information into the WebDAV error response * * @param DAV\Server $server * @param \DOMElement $errorNode * @return void */ public function serialize(DAV\Server $server,\DOMElement $errorNode) { $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-matches-request-uri'); $errorNode->appendChild($error); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Exception/Locked.php000066400000000000000000000033661361462701300317610ustar00rootroot00000000000000lock = $lock; } /** * Returns the HTTP statuscode for this exception * * @return int */ public function getHTTPCode() { return 423; } /** * This method allows the exception to include additional information into the WebDAV error response * * @param DAV\Server $server * @param \DOMElement $errorNode * @return void */ public function serialize(DAV\Server $server,\DOMElement $errorNode) { if ($this->lock) { $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-submitted'); $errorNode->appendChild($error); $href = $errorNode->ownerDocument->createElementNS('DAV:','d:href'); $href->appendChild($errorNode->ownerDocument->createTextNode($this->lock->uri)); $error->appendChild( $href ); } } } MethodNotAllowed.php000066400000000000000000000021001361462701300336730ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/ExceptiongetAllowedMethods($server->getRequestUri()); return array( 'Allow' => strtoupper(implode(', ',$methods)), ); } } NotAuthenticated.php000066400000000000000000000011461361462701300337360ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Exceptionheader = $header; } /** * Returns the HTTP statuscode for this exception * * @return int */ public function getHTTPCode() { return 412; } /** * This method allows the exception to include additional information into the WebDAV error response * * @param DAV\Server $server * @param \DOMElement $errorNode * @return void */ public function serialize(DAV\Server $server,\DOMElement $errorNode) { if ($this->header) { $prop = $errorNode->ownerDocument->createElement('s:header'); $prop->nodeValue = $this->header; $errorNode->appendChild($prop); } } } ReportNotSupported.php000066400000000000000000000015671361462701300343440ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/ExceptionownerDocument->createElementNS('DAV:','d:supported-report'); $errorNode->appendChild($error); } } RequestedRangeNotSatisfiable.php000066400000000000000000000012061361462701300362360ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Exception * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class ServiceUnavailable extends DAV\Exception { /** * Returns the HTTP statuscode for this exception * * @return int */ public function getHTTPCode() { return 503; } } UnsupportedMediaType.php000066400000000000000000000012431361462701300346230ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Exceptionpath . '/' . $name; file_put_contents($newPath,$data); } /** * Creates a new subdirectory * * @param string $name * @return void */ public function createDirectory($name) { $newPath = $this->path . '/' . $name; mkdir($newPath); } /** * Returns a specific child node, referenced by its name * * This method must throw DAV\Exception\NotFound if the node does not * exist. * * @param string $name * @throws DAV\Exception\NotFound * @return DAV\INode */ public function getChild($name) { $path = $this->path . '/' . $name; if (!file_exists($path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located'); if (is_dir($path)) { return new Directory($path); } else { return new File($path); } } /** * Returns an array with all the child nodes * * @return DAV\INode[] */ public function getChildren() { $nodes = array(); foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node); return $nodes; } /** * Checks if a child exists. * * @param string $name * @return bool */ public function childExists($name) { $path = $this->path . '/' . $name; return file_exists($path); } /** * Deletes all files in this directory, and then itself * * @return void */ public function delete() { foreach($this->getChildren() as $child) $child->delete(); rmdir($this->path); } /** * Returns available diskspace information * * @return array */ public function getQuotaInfo() { return array( disk_total_space($this->path)-disk_free_space($this->path), disk_free_space($this->path) ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/FS/File.php000066400000000000000000000031421361462701300300010ustar00rootroot00000000000000path,$data); } /** * Returns the data * * @return string */ public function get() { return fopen($this->path,'r'); } /** * Delete the current file * * @return void */ public function delete() { unlink($this->path); } /** * Returns the size of the node, in bytes * * @return int */ public function getSize() { return filesize($this->path); } /** * Returns the ETag for a file * * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. * * Return null if the ETag can not effectively be determined * * @return mixed */ public function getETag() { return null; } /** * Returns the mime-type for a file * * If null is returned, we'll assume application/octet-stream * * @return mixed */ public function getContentType() { return null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/FS/Node.php000066400000000000000000000027521361462701300300150ustar00rootroot00000000000000path = $path; } /** * Returns the name of the node * * @return string */ public function getName() { list(, $name) = DAV\URLUtil::splitPath($this->path); return $name; } /** * Renames the node * * @param string $name The new name * @return void */ public function setName($name) { list($parentPath, ) = DAV\URLUtil::splitPath($this->path); list(, $newName) = DAV\URLUtil::splitPath($name); $newPath = $parentPath . '/' . $newName; rename($this->path,$newPath); $this->path = $newPath; } /** * Returns the last modification time, as a unix timestamp * * @return int */ public function getLastModified() { return filemtime($this->path); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/FSExt/000077500000000000000000000000001361462701300270725ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/FSExt/Directory.php000066400000000000000000000102341361462701300315470ustar00rootroot00000000000000path . '/' . $name; file_put_contents($newPath,$data); return '"' . md5_file($newPath) . '"'; } /** * Creates a new subdirectory * * @param string $name * @return void */ public function createDirectory($name) { // We're not allowing dots if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..'); $newPath = $this->path . '/' . $name; mkdir($newPath); } /** * Returns a specific child node, referenced by its name * * This method must throw SabreForRainLoop\DAV\Exception\NotFound if the node does not * exist. * * @param string $name * @throws DAV\Exception\NotFound * @return DAV\INode */ public function getChild($name) { $path = $this->path . '/' . $name; if (!file_exists($path)) throw new DAV\Exception\NotFound('File could not be located'); if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..'); if (is_dir($path)) { return new Directory($path); } else { return new File($path); } } /** * Checks if a child exists. * * @param string $name * @return bool */ public function childExists($name) { if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..'); $path = $this->path . '/' . $name; return file_exists($path); } /** * Returns an array with all the child nodes * * @return DAV\INode[] */ public function getChildren() { $nodes = array(); foreach(scandir($this->path) as $node) if($node!='.' && $node!='..' && $node!='.sabredav') $nodes[] = $this->getChild($node); return $nodes; } /** * Deletes all files in this directory, and then itself * * @return bool */ public function delete() { // Deleting all children foreach($this->getChildren() as $child) $child->delete(); // Removing resource info, if its still around if (file_exists($this->path . '/.sabredav')) unlink($this->path . '/.sabredav'); // Removing the directory itself rmdir($this->path); return parent::delete(); } /** * Returns available diskspace information * * @return array */ public function getQuotaInfo() { return array( disk_total_space($this->path)-disk_free_space($this->path), disk_free_space($this->path) ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/FSExt/File.php000066400000000000000000000046011361462701300304630ustar00rootroot00000000000000path,$data); return '"' . md5_file($this->path) . '"'; } /** * Updates the data at a given offset * * The data argument is a readable stream resource. * The offset argument is a 0-based offset where the data should be * written. * * param resource|string $data * @return void */ public function putRange($data, $offset) { $f = fopen($this->path, 'c'); fseek($f,$offset-1); if (is_string($data)) { fwrite($f, $data); } else { stream_copy_to_stream($data,$f); } fclose($f); return '"' . md5_file($this->path) . '"'; } /** * Returns the data * * @return resource */ public function get() { return fopen($this->path,'r'); } /** * Delete the current file * * @return bool */ public function delete() { unlink($this->path); return parent::delete(); } /** * Returns the ETag for a file * * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. * * Return null if the ETag can not effectively be determined * * @return string|null */ public function getETag() { return '"' . md5_file($this->path). '"'; } /** * Returns the mime-type for a file * * If null is returned, we'll assume application/octet-stream * * @return string|null */ public function getContentType() { return null; } /** * Returns the size of the file, in bytes * * @return int */ public function getSize() { return filesize($this->path); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/FSExt/Node.php000066400000000000000000000131571361462701300304770ustar00rootroot00000000000000getResourceData(); foreach($properties as $propertyName=>$propertyValue) { // If it was null, we need to delete the property if (is_null($propertyValue)) { if (isset($resourceData['properties'][$propertyName])) { unset($resourceData['properties'][$propertyName]); } } else { $resourceData['properties'][$propertyName] = $propertyValue; } } $this->putResourceData($resourceData); return true; } /** * Returns a list of properties for this nodes.; * * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author * If the array is empty, all properties should be returned * * @param array $properties * @return array */ function getProperties($properties) { $resourceData = $this->getResourceData(); // if the array was empty, we need to return everything if (!$properties) return $resourceData['properties']; $props = array(); foreach($properties as $property) { if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property]; } return $props; } /** * Returns the path to the resource file * * @return string */ protected function getResourceInfoPath() { list($parentDir) = DAV\URLUtil::splitPath($this->path); return $parentDir . '/.sabredav'; } /** * Returns all the stored resource information * * @return array */ protected function getResourceData() { $path = $this->getResourceInfoPath(); if (!file_exists($path)) return array('properties' => array()); // opening up the file, and creating a shared lock $handle = fopen($path,'r'); flock($handle,LOCK_SH); $data = ''; // Reading data until the eof while(!feof($handle)) { $data.=fread($handle,8192); } // We're all good fclose($handle); // Unserializing and checking if the resource file contains data for this file $data = unserialize($data); if (!isset($data[$this->getName()])) { return array('properties' => array()); } $data = $data[$this->getName()]; if (!isset($data['properties'])) $data['properties'] = array(); return $data; } /** * Updates the resource information * * @param array $newData * @return void */ protected function putResourceData(array $newData) { $path = $this->getResourceInfoPath(); // opening up the file, and creating a shared lock $handle = fopen($path,'a+'); flock($handle,LOCK_EX); $data = ''; rewind($handle); // Reading data until the eof while(!feof($handle)) { $data.=fread($handle,8192); } // Unserializing and checking if the resource file contains data for this file $data = unserialize($data); $data[$this->getName()] = $newData; ftruncate($handle,0); rewind($handle); fwrite($handle,serialize($data)); fclose($handle); } /** * Renames the node * * @param string $name The new name * @return void */ public function setName($name) { list($parentPath, ) = DAV\URLUtil::splitPath($this->path); list(, $newName) = DAV\URLUtil::splitPath($name); $newPath = $parentPath . '/' . $newName; // We're deleting the existing resourcedata, and recreating it // for the new path. $resourceData = $this->getResourceData(); $this->deleteResourceData(); rename($this->path,$newPath); $this->path = $newPath; $this->putResourceData($resourceData); } /** * @return bool */ public function deleteResourceData() { // When we're deleting this node, we also need to delete any resource information $path = $this->getResourceInfoPath(); if (!file_exists($path)) return true; // opening up the file, and creating a shared lock $handle = fopen($path,'a+'); flock($handle,LOCK_EX); $data = ''; rewind($handle); // Reading data until the eof while(!feof($handle)) { $data.=fread($handle,8192); } // Unserializing and checking if the resource file contains data for this file $data = unserialize($data); if (isset($data[$this->getName()])) unset($data[$this->getName()]); ftruncate($handle,0); rewind($handle); fwrite($handle,serialize($data)); fclose($handle); return true; } public function delete() { return $this->deleteResourceData(); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/File.php000066400000000000000000000034271361462701300274770ustar00rootroot00000000000000 array( * '{DAV:}displayname' => null, * ), * 424 => array( * '{DAV:}owner' => null, * ) * ) * * In this example it was forbidden to update {DAV:}displayname. * (403 Forbidden), which in turn also caused {DAV:}owner to fail * (424 Failed Dependency) because the request needs to be atomic. * * @param array $mutations * @return bool|array */ function updateProperties($mutations); /** * Returns a list of properties for this nodes. * * The properties list is a list of propertynames the client requested, * encoded in clark-notation {xmlnamespace}tagname * * If the array is empty, it means 'all properties' were requested. * * Note that it's fine to liberally give properties back, instead of * conforming to the list of requested properties. * The Server class will filter out the extra. * * @param array $properties * @return void */ function getProperties($properties); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/IQuota.php000066400000000000000000000014261361462701300300170ustar00rootroot00000000000000dataDir = $dataDir; } protected function getFileNameForUri($uri) { return $this->dataDir . '/sabredav_' . md5($uri) . '.locks'; } /** * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects * * This method should return all the locks for a particular uri, including * locks that might be set on a parent uri. * * If returnChildLocks is set to true, this method should also look for * any locks in the subtree of the uri for locks. * * @param string $uri * @param bool $returnChildLocks * @return array */ public function getLocks($uri, $returnChildLocks) { $lockList = array(); $currentPath = ''; foreach(explode('/',$uri) as $uriPart) { // weird algorithm that can probably be improved, but we're traversing the path top down if ($currentPath) $currentPath.='/'; $currentPath.=$uriPart; $uriLocks = $this->getData($currentPath); foreach($uriLocks as $uriLock) { // Unless we're on the leaf of the uri-tree we should ignore locks with depth 0 if($uri==$currentPath || $uriLock->depth!=0) { $uriLock->uri = $currentPath; $lockList[] = $uriLock; } } } // Checking if we can remove any of these locks foreach($lockList as $k=>$lock) { if (time() > $lock->timeout + $lock->created) unset($lockList[$k]); } return $lockList; } /** * Locks a uri * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function lock($uri, LockInfo $lockInfo) { // We're making the lock timeout 30 minutes $lockInfo->timeout = 1800; $lockInfo->created = time(); $locks = $this->getLocks($uri,false); foreach($locks as $k=>$lock) { if ($lock->token == $lockInfo->token) unset($locks[$k]); } $locks[] = $lockInfo; $this->putData($uri,$locks); return true; } /** * Removes a lock from a uri * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function unlock($uri, LockInfo $lockInfo) { $locks = $this->getLocks($uri,false); foreach($locks as $k=>$lock) { if ($lock->token == $lockInfo->token) { unset($locks[$k]); $this->putData($uri,$locks); return true; } } return false; } /** * Returns the stored data for a uri * * @param string $uri * @return array */ protected function getData($uri) { $path = $this->getFilenameForUri($uri); if (!file_exists($path)) return array(); // opening up the file, and creating a shared lock $handle = fopen($path,'r'); flock($handle,LOCK_SH); $data = ''; // Reading data until the eof while(!feof($handle)) { $data.=fread($handle,8192); } // We're all good fclose($handle); // Unserializing and checking if the resource file contains data for this file $data = unserialize($data); if (!$data) return array(); return $data; } /** * Updates the lock information * * @param string $uri * @param array $newData * @return void */ protected function putData($uri,array $newData) { $path = $this->getFileNameForUri($uri); // opening up the file, and creating a shared lock $handle = fopen($path,'a+'); flock($handle,LOCK_EX); ftruncate($handle,0); rewind($handle); fwrite($handle,serialize($newData)); fclose($handle); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/File.php000066400000000000000000000104001361462701300320660ustar00rootroot00000000000000locksFile = $locksFile; } /** * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects * * This method should return all the locks for a particular uri, including * locks that might be set on a parent uri. * * If returnChildLocks is set to true, this method should also look for * any locks in the subtree of the uri for locks. * * @param string $uri * @param bool $returnChildLocks * @return array */ public function getLocks($uri, $returnChildLocks) { $newLocks = array(); $locks = $this->getData(); foreach($locks as $lock) { if ($lock->uri === $uri || //deep locks on parents ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) || // locks on children ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) { $newLocks[] = $lock; } } // Checking if we can remove any of these locks foreach($newLocks as $k=>$lock) { if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]); } return $newLocks; } /** * Locks a uri * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function lock($uri, LockInfo $lockInfo) { // We're making the lock timeout 30 minutes $lockInfo->timeout = 1800; $lockInfo->created = time(); $lockInfo->uri = $uri; $locks = $this->getData(); foreach($locks as $k=>$lock) { if ( ($lock->token == $lockInfo->token) || (time() > $lock->timeout + $lock->created) ) { unset($locks[$k]); } } $locks[] = $lockInfo; $this->putData($locks); return true; } /** * Removes a lock from a uri * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function unlock($uri, LockInfo $lockInfo) { $locks = $this->getData(); foreach($locks as $k=>$lock) { if ($lock->token == $lockInfo->token) { unset($locks[$k]); $this->putData($locks); return true; } } return false; } /** * Loads the lockdata from the filesystem. * * @return array */ protected function getData() { if (!file_exists($this->locksFile)) return array(); // opening up the file, and creating a shared lock $handle = fopen($this->locksFile,'r'); flock($handle,LOCK_SH); // Reading data until the eof $data = stream_get_contents($handle); // We're all good fclose($handle); // Unserializing and checking if the resource file contains data for this file $data = unserialize($data); if (!$data) return array(); return $data; } /** * Saves the lockdata * * @param array $newData * @return void */ protected function putData(array $newData) { // opening up the file, and creating an exclusive lock $handle = fopen($this->locksFile,'a+'); flock($handle,LOCK_EX); // We can only truncate and rewind once the lock is acquired. ftruncate($handle,0); rewind($handle); fwrite($handle,serialize($newData)); fclose($handle); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Locks/Backend/PDO.php000066400000000000000000000111031361462701300316320ustar00rootroot00000000000000pdo = $pdo; $this->tableName = $tableName; } /** * Returns a list of SabreForRainLoop\DAV\Locks\LockInfo objects * * This method should return all the locks for a particular uri, including * locks that might be set on a parent uri. * * If returnChildLocks is set to true, this method should also look for * any locks in the subtree of the uri for locks. * * @param string $uri * @param bool $returnChildLocks * @return array */ public function getLocks($uri, $returnChildLocks) { // NOTE: the following 10 lines or so could be easily replaced by // pure sql. MySQL's non-standard string concatenation prevents us // from doing this though. $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM '.$this->tableName.' WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)'; $params = array(time(),$uri); // We need to check locks for every part in the uri. $uriParts = explode('/',$uri); // We already covered the last part of the uri array_pop($uriParts); $currentPath=''; foreach($uriParts as $part) { if ($currentPath) $currentPath.='/'; $currentPath.=$part; $query.=' OR (depth!=0 AND uri = ?)'; $params[] = $currentPath; } if ($returnChildLocks) { $query.=' OR (uri LIKE ?)'; $params[] = $uri . '/%'; } $query.=')'; $stmt = $this->pdo->prepare($query); $stmt->execute($params); $result = $stmt->fetchAll(); $lockList = array(); foreach($result as $row) { $lockInfo = new LockInfo(); $lockInfo->owner = $row['owner']; $lockInfo->token = $row['token']; $lockInfo->timeout = $row['timeout']; $lockInfo->created = $row['created']; $lockInfo->scope = $row['scope']; $lockInfo->depth = $row['depth']; $lockInfo->uri = $row['uri']; $lockList[] = $lockInfo; } return $lockList; } /** * Locks a uri * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function lock($uri, LockInfo $lockInfo) { // We're making the lock timeout 30 minutes $lockInfo->timeout = 30*60; $lockInfo->created = time(); $lockInfo->uri = $uri; $locks = $this->getLocks($uri,false); $exists = false; foreach($locks as $lock) { if ($lock->token == $lockInfo->token) $exists = true; } if ($exists) { $stmt = $this->pdo->prepare('UPDATE '.$this->tableName.' SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?'); $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); } else { $stmt = $this->pdo->prepare('INSERT INTO '.$this->tableName.' (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)'); $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); } return true; } /** * Removes a lock from a uri * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function unlock($uri, LockInfo $lockInfo) { $stmt = $this->pdo->prepare('DELETE FROM '.$this->tableName.' WHERE uri = ? AND token = ?'); $stmt->execute(array($uri,$lockInfo->token)); return $stmt->rowCount()===1; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Locks/LockInfo.php000066400000000000000000000024771361462701300314030ustar00rootroot00000000000000addPlugin($lockPlugin); * * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @author Evert Pot (http://evertpot.com/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Plugin extends DAV\ServerPlugin { /** * locksBackend * * @var Backend\Backend\Interface */ protected $locksBackend; /** * server * * @var SabreForRainLoop\DAV\Server */ protected $server; /** * __construct * * @param Backend\BackendInterface $locksBackend */ public function __construct(Backend\BackendInterface $locksBackend = null) { $this->locksBackend = $locksBackend; } /** * Initializes the plugin * * This method is automatically called by the Server class after addPlugin. * * @param DAV\Server $server * @return void */ public function initialize(DAV\Server $server) { $this->server = $server; $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),50); $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties')); } /** * Returns a plugin name. * * Using this name other plugins will be able to access other plugins * using SabreForRainLoop\DAV\Server::getPlugin * * @return string */ public function getPluginName() { return 'locks'; } /** * This method is called by the Server if the user used an HTTP method * the server didn't recognize. * * This plugin intercepts the LOCK and UNLOCK methods. * * @param string $method * @param string $uri * @return bool */ public function unknownMethod($method, $uri) { switch($method) { case 'LOCK' : $this->httpLock($uri); return false; case 'UNLOCK' : $this->httpUnlock($uri); return false; } } /** * This method is called after most properties have been found * it allows us to add in any Lock-related properties * * @param string $path * @param array $newProperties * @return bool */ public function afterGetProperties($path, &$newProperties) { foreach($newProperties[404] as $propName=>$discard) { switch($propName) { case '{DAV:}supportedlock' : $val = false; if ($this->locksBackend) $val = true; $newProperties[200][$propName] = new DAV\Property\SupportedLock($val); unset($newProperties[404][$propName]); break; case '{DAV:}lockdiscovery' : $newProperties[200][$propName] = new DAV\Property\LockDiscovery($this->getLocks($path)); unset($newProperties[404][$propName]); break; } } return true; } /** * This method is called before the logic for any HTTP method is * handled. * * This plugin uses that feature to intercept access to locked resources. * * @param string $method * @param string $uri * @return bool */ public function beforeMethod($method, $uri) { switch($method) { case 'DELETE' : $lastLock = null; if (!$this->validateLock($uri,$lastLock, true)) throw new DAV\Exception\Locked($lastLock); break; case 'MKCOL' : case 'PROPPATCH' : case 'PUT' : case 'PATCH' : $lastLock = null; if (!$this->validateLock($uri,$lastLock)) throw new DAV\Exception\Locked($lastLock); break; case 'MOVE' : $lastLock = null; if (!$this->validateLock(array( $uri, $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), ),$lastLock, true)) throw new DAV\Exception\Locked($lastLock); break; case 'COPY' : $lastLock = null; if (!$this->validateLock( $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')), $lastLock, true)) throw new DAV\Exception\Locked($lastLock); break; } return true; } /** * Use this method to tell the server this plugin defines additional * HTTP methods. * * This method is passed a uri. It should only return HTTP methods that are * available for the specified uri. * * @param string $uri * @return array */ public function getHTTPMethods($uri) { if ($this->locksBackend) return array('LOCK','UNLOCK'); return array(); } /** * Returns a list of features for the HTTP OPTIONS Dav: header. * * In this case this is only the number 2. The 2 in the Dav: header * indicates the server supports locks. * * @return array */ public function getFeatures() { return array(2); } /** * Returns all lock information on a particular uri * * This function should return an array with SabreForRainLoop\DAV\Locks\LockInfo objects. If there are no locks on a file, return an empty array. * * Additionally there is also the possibility of locks on parent nodes, so we'll need to traverse every part of the tree * If the $returnChildLocks argument is set to true, we'll also traverse all the children of the object * for any possible locks and return those as well. * * @param string $uri * @param bool $returnChildLocks * @return array */ public function getLocks($uri, $returnChildLocks = false) { $lockList = array(); if ($this->locksBackend) $lockList = array_merge($lockList,$this->locksBackend->getLocks($uri, $returnChildLocks)); return $lockList; } /** * Locks an uri * * The WebDAV lock request can be operated to either create a new lock on a file, or to refresh an existing lock * If a new lock is created, a full XML body should be supplied, containing information about the lock such as the type * of lock (shared or exclusive) and the owner of the lock * * If a lock is to be refreshed, no body should be supplied and there should be a valid If header containing the lock * * Additionally, a lock can be requested for a non-existent file. In these case we're obligated to create an empty file as per RFC4918:S7.3 * * @param string $uri * @return void */ protected function httpLock($uri) { $lastLock = null; if (!$this->validateLock($uri,$lastLock)) { // If the existing lock was an exclusive lock, we need to fail if (!$lastLock || $lastLock->scope == LockInfo::EXCLUSIVE) { //var_dump($lastLock); throw new DAV\Exception\ConflictingLock($lastLock); } } if ($body = $this->server->httpRequest->getBody(true)) { // This is a new lock request $lockInfo = $this->parseLockRequest($body); $lockInfo->depth = $this->server->getHTTPDepth(); $lockInfo->uri = $uri; if($lastLock && $lockInfo->scope != LockInfo::SHARED) throw new DAV\Exception\ConflictingLock($lastLock); } elseif ($lastLock) { // This must have been a lock refresh $lockInfo = $lastLock; // The resource could have been locked through another uri. if ($uri!=$lockInfo->uri) $uri = $lockInfo->uri; } else { // There was neither a lock refresh nor a new lock request throw new DAV\Exception\BadRequest('An xml body is required for lock requests'); } if ($timeout = $this->getTimeoutHeader()) $lockInfo->timeout = $timeout; $newFile = false; // If we got this far.. we should go check if this node actually exists. If this is not the case, we need to create it first try { $this->server->tree->getNodeForPath($uri); // We need to call the beforeWriteContent event for RFC3744 // Edit: looks like this is not used, and causing problems now. // // See Issue 222 // $this->server->broadcastEvent('beforeWriteContent',array($uri)); } catch (DAV\Exception\NotFound $e) { // It didn't, lets create it $this->server->createFile($uri,fopen('php://memory','r')); $newFile = true; } $this->lockNode($uri,$lockInfo); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->setHeader('Lock-Token','token . '>'); $this->server->httpResponse->sendStatus($newFile?201:200); $this->server->httpResponse->sendBody($this->generateLockResponse($lockInfo)); } /** * Unlocks a uri * * This WebDAV method allows you to remove a lock from a node. The client should provide a valid locktoken through the Lock-token http header * The server should return 204 (No content) on success * * @param string $uri * @return void */ protected function httpUnlock($uri) { $lockToken = $this->server->httpRequest->getHeader('Lock-Token'); // If the locktoken header is not supplied, we need to throw a bad request exception if (!$lockToken) throw new DAV\Exception\BadRequest('No lock token was supplied'); $locks = $this->getLocks($uri); // Windows sometimes forgets to include < and > in the Lock-Token // header if ($lockToken[0]!=='<') $lockToken = '<' . $lockToken . '>'; foreach($locks as $lock) { if ('token . '>' == $lockToken) { $this->unlockNode($uri,$lock); $this->server->httpResponse->setHeader('Content-Length','0'); $this->server->httpResponse->sendStatus(204); return; } } // If we got here, it means the locktoken was invalid throw new DAV\Exception\LockTokenMatchesRequestUri(); } /** * Locks a uri * * All the locking information is supplied in the lockInfo object. The object has a suggested timeout, but this can be safely ignored * It is important that if the existing timeout is ignored, the property is overwritten, as this needs to be sent back to the client * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function lockNode($uri,LockInfo $lockInfo) { if (!$this->server->broadcastEvent('beforeLock',array($uri,$lockInfo))) return; if ($this->locksBackend) return $this->locksBackend->lock($uri,$lockInfo); throw new DAV\Exception\MethodNotAllowed('Locking support is not enabled for this resource. No Locking backend was found so if you didn\'t expect this error, please check your configuration.'); } /** * Unlocks a uri * * This method removes a lock from a uri. It is assumed all the supplied information is correct and verified * * @param string $uri * @param LockInfo $lockInfo * @return bool */ public function unlockNode($uri, LockInfo $lockInfo) { if (!$this->server->broadcastEvent('beforeUnlock',array($uri,$lockInfo))) return; if ($this->locksBackend) return $this->locksBackend->unlock($uri,$lockInfo); } /** * Returns the contents of the HTTP Timeout header. * * The method formats the header into an integer. * * @return int */ public function getTimeoutHeader() { $header = $this->server->httpRequest->getHeader('Timeout'); if ($header) { if (stripos($header,'second-')===0) $header = (int)(substr($header,7)); else if (strtolower($header)=='infinite') $header = LockInfo::TIMEOUT_INFINITE; else throw new DAV\Exception\BadRequest('Invalid HTTP timeout header'); } else { $header = 0; } return $header; } /** * Generates the response for successful LOCK requests * * @param LockInfo $lockInfo * @return string */ protected function generateLockResponse(LockInfo $lockInfo) { $dom = new \DOMDocument('1.0','utf-8'); $dom->formatOutput = true; $prop = $dom->createElementNS('DAV:','d:prop'); $dom->appendChild($prop); $lockDiscovery = $dom->createElementNS('DAV:','d:lockdiscovery'); $prop->appendChild($lockDiscovery); $lockObj = new DAV\Property\LockDiscovery(array($lockInfo),true); $lockObj->serialize($this->server,$lockDiscovery); return $dom->saveXML(); } /** * validateLock should be called when a write operation is about to happen * It will check if the requested url is locked, and see if the correct lock tokens are passed * * @param mixed $urls List of relevant urls. Can be an array, a string or nothing at all for the current request uri * @param mixed $lastLock This variable will be populated with the last checked lock object (SabreForRainLoop\DAV\Locks\LockInfo) * @param bool $checkChildLocks If set to true, this function will also look for any locks set on child resources of the supplied urls. This is needed for for example deletion of entire trees. * @return bool */ protected function validateLock($urls = null,&$lastLock = null, $checkChildLocks = false) { if (is_null($urls)) { $urls = array($this->server->getRequestUri()); } elseif (is_string($urls)) { $urls = array($urls); } elseif (!is_array($urls)) { throw new DAV\Exception('The urls parameter should either be null, a string or an array'); } $conditions = $this->getIfConditions(); // We're going to loop through the urls and make sure all lock conditions are satisfied foreach($urls as $url) { $locks = $this->getLocks($url, $checkChildLocks); // If there were no conditions, but there were locks, we fail if (!$conditions && $locks) { reset($locks); $lastLock = current($locks); return false; } // If there were no locks or conditions, we go to the next url if (!$locks && !$conditions) continue; foreach($conditions as $condition) { if (!$condition['uri']) { $conditionUri = $this->server->getRequestUri(); } else { $conditionUri = $this->server->calculateUri($condition['uri']); } // If the condition has a url, and it isn't part of the affected url at all, check the next condition if ($conditionUri && strpos($url,$conditionUri)!==0) continue; // The tokens array contians arrays with 2 elements. 0=true/false for normal/not condition, 1=locktoken // At least 1 condition has to be satisfied foreach($condition['tokens'] as $conditionToken) { $etagValid = true; $lockValid = true; // key 2 can contain an etag if ($conditionToken[2]) { $uri = $conditionUri?$conditionUri:$this->server->getRequestUri(); $node = $this->server->tree->getNodeForPath($uri); $etagValid = $node->getETag()==$conditionToken[2]; } // key 1 can contain a lock token if ($conditionToken[1]) { $lockValid = false; // Match all the locks foreach($locks as $lockIndex=>$lock) { $lockToken = 'opaquelocktoken:' . $lock->token; // Checking NOT if (!$conditionToken[0] && $lockToken != $conditionToken[1]) { // Condition valid, onto the next $lockValid = true; break; } if ($conditionToken[0] && $lockToken == $conditionToken[1]) { $lastLock = $lock; // Condition valid and lock matched unset($locks[$lockIndex]); $lockValid = true; break; } } } // If, after checking both etags and locks they are stil valid, // we can continue with the next condition. if ($etagValid && $lockValid) continue 2; } // No conditions matched, so we fail throw new DAV\Exception\PreconditionFailed('The tokens provided in the if header did not match','If'); } // Conditions were met, we'll also need to check if all the locks are gone if (count($locks)) { reset($locks); // There's still locks, we fail $lastLock = current($locks); return false; } } // We got here, this means every condition was satisfied return true; } /** * This method is created to extract information from the WebDAV HTTP 'If:' header * * The If header can be quite complex, and has a bunch of features. We're using a regex to extract all relevant information * The function will return an array, containing structs with the following keys * * * uri - the uri the condition applies to. If this is returned as an * empty string, this implies it's referring to the request url. * * tokens - The lock token. another 2 dimensional array containing 2 elements (0 = true/false.. If this is a negative condition its set to false, 1 = the actual token) * * etag - an etag, if supplied * * @return array */ public function getIfConditions() { $header = $this->server->httpRequest->getHeader('If'); if (!$header) return array(); $matches = array(); $regex = '/(?:\<(?P.*?)\>\s)?\((?PNot\s)?(?:\<(?P[^\>]*)\>)?(?:\s?)(?:\[(?P[^\]]*)\])?\)/im'; preg_match_all($regex,$header,$matches,PREG_SET_ORDER); $conditions = array(); foreach($matches as $match) { $condition = array( 'uri' => $match['uri'], 'tokens' => array( array($match['not']?0:1,$match['token'],isset($match['etag'])?$match['etag']:'') ), ); if (!$condition['uri'] && count($conditions)) $conditions[count($conditions)-1]['tokens'][] = array( $match['not']?0:1, $match['token'], isset($match['etag'])?$match['etag']:'' ); else { $conditions[] = $condition; } } return $conditions; } /** * Parses a webdav lock xml body, and returns a new SabreForRainLoop\DAV\Locks\LockInfo object * * @param string $body * @return DAV\Locks\LockInfo */ protected function parseLockRequest($body) { $xml = simplexml_load_string( DAV\XMLUtil::convertDAVNamespace($body), null, LIBXML_NOWARNING); $xml->registerXPathNamespace('d','urn:DAV'); $lockInfo = new LockInfo(); $children = $xml->children("urn:DAV"); $lockInfo->owner = (string)$children->owner; $lockInfo->token = DAV\UUIDUtil::getUUID(); $lockInfo->scope = count($xml->xpath('d:lockscope/d:exclusive'))>0 ? LockInfo::EXCLUSIVE : LockInfo::SHARED; return $lockInfo; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Mount/000077500000000000000000000000001361462701300272035ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Mount/Plugin.php000066400000000000000000000042271361462701300311570ustar00rootroot00000000000000server = $server; $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90); } /** * 'beforeMethod' event handles. This event handles intercepts GET requests ending * with ?mount * * @param string $method * @param string $uri * @return bool */ public function beforeMethod($method, $uri) { if ($method!='GET') return; if ($this->server->httpRequest->getQueryString()!='mount') return; $currentUri = $this->server->httpRequest->getAbsoluteUri(); // Stripping off everything after the ? list($currentUri) = explode('?',$currentUri); $this->davMount($currentUri); // Returning false to break the event chain return false; } /** * Generates the davmount response * * @param string $uri absolute uri * @return void */ public function davMount($uri) { $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->setHeader('Content-Type','application/davmount+xml'); ob_start(); echo '', "\n"; echo "\n"; echo " ", htmlspecialchars($uri, ENT_NOQUOTES, 'UTF-8'), "\n"; echo ""; $this->server->httpResponse->sendBody(ob_get_clean()); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Node.php000066400000000000000000000021461361462701300275020ustar00rootroot00000000000000rootNode = $rootNode; } /** * Returns the INode object for the requested path * * @param string $path * @return INode */ public function getNodeForPath($path) { $path = trim($path,'/'); if (isset($this->cache[$path])) return $this->cache[$path]; // Is it the root node? if (!strlen($path)) { return $this->rootNode; } // Attempting to fetch its parent list($parentName, $baseName) = URLUtil::splitPath($path); // If there was no parent, we must simply ask it from the root node. if ($parentName==="") { $node = $this->rootNode->getChild($baseName); } else { // Otherwise, we recursively grab the parent and ask him/her. $parent = $this->getNodeForPath($parentName); if (!($parent instanceof ICollection)) throw new Exception\NotFound('Could not find node at path: ' . $path); $node = $parent->getChild($baseName); } $this->cache[$path] = $node; return $node; } /** * This function allows you to check if a node exists. * * @param string $path * @return bool */ public function nodeExists($path) { try { // The root always exists if ($path==='') return true; list($parent, $base) = URLUtil::splitPath($path); $parentNode = $this->getNodeForPath($parent); if (!$parentNode instanceof ICollection) return false; return $parentNode->childExists($base); } catch (Exception\NotFound $e) { return false; } } /** * Returns a list of childnodes for a given path. * * @param string $path * @return array */ public function getChildren($path) { $node = $this->getNodeForPath($path); $children = $node->getChildren(); foreach($children as $child) { $this->cache[trim($path,'/') . '/' . $child->getName()] = $child; } return $children; } /** * This method is called with every tree update * * Examples of tree updates are: * * node deletions * * node creations * * copy * * move * * renaming nodes * * If Tree classes implement a form of caching, this will allow * them to make sure caches will be expired. * * If a path is passed, it is assumed that the entire subtree is dirty * * @param string $path * @return void */ public function markDirty($path) { // We don't care enough about sub-paths // flushing the entire cache $path = trim($path,'/'); foreach($this->cache as $nodePath=>$node) { if ($nodePath == $path || strpos($nodePath,$path.'/')===0) unset($this->cache[$nodePath]); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/000077500000000000000000000000001361462701300306405ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/PartialUpdate/IFile.php000066400000000000000000000024261361462701300323450ustar00rootroot00000000000000addPlugin($patchPlugin); * * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Plugin extends DAV\ServerPlugin { /** * Reference to server * * @var SabreForRainLoop\DAV\Server */ protected $server; /** * Initializes the plugin * * This method is automatically called by the Server class after addPlugin. * * @param DAV\Server $server * @return void */ public function initialize(DAV\Server $server) { $this->server = $server; $server->subscribeEvent('unknownMethod',array($this,'unknownMethod')); } /** * Returns a plugin name. * * Using this name other plugins will be able to access other plugins * using DAV\Server::getPlugin * * @return string */ public function getPluginName() { return 'partialupdate'; } /** * This method is called by the Server if the user used an HTTP method * the server didn't recognize. * * This plugin intercepts the PATCH methods. * * @param string $method * @param string $uri * @return bool|null */ public function unknownMethod($method, $uri) { switch($method) { case 'PATCH': return $this->httpPatch($uri); } } /** * Use this method to tell the server this plugin defines additional * HTTP methods. * * This method is passed a uri. It should only return HTTP methods that are * available for the specified uri. * * We claim to support PATCH method (partial update) if and only if * - the node exist * - the node implements our partial update interface * * @param string $uri * @return array */ public function getHTTPMethods($uri) { $tree = $this->server->tree; if ($tree->nodeExists($uri) && $tree->getNodeForPath($uri) instanceof IFile) { return array('PATCH'); } return array(); } /** * Returns a list of features for the HTTP OPTIONS Dav: header. * * @return array */ public function getFeatures() { return array('sabredav-partialupdate'); } /** * Patch an uri * * The WebDAV patch request can be used to modify only a part of an * existing resource. If the resource does not exist yet and the first * offset is not 0, the request fails * * @param string $uri * @return void */ protected function httpPatch($uri) { // Get the node. Will throw a 404 if not found $node = $this->server->tree->getNodeForPath($uri); if (!($node instanceof IFile)) { throw new DAV\Exception\MethodNotAllowed('The target resource does not support the PATCH method.'); } $range = $this->getHTTPUpdateRange(); if (!$range) { throw new DAV\Exception\BadRequest('No valid "X-Update-Range" found in the headers'); } $contentType = strtolower( $this->server->httpRequest->getHeader('Content-Type') ); if ($contentType != 'application/x-sabredav-partialupdate') { throw new DAV\Exception\UnsupportedMediaType('Unknown Content-Type header "' . $contentType . '"'); } $len = $this->server->httpRequest->getHeader('Content-Length'); // Load the begin and end data $start = ($range[0])?$range[0]:0; $end = ($range[1])?$range[1]:$len-1; // Check consistency if($end < $start) throw new DAV\Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); if($end - $start + 1 != $len) throw new DAV\Exception\RequestedRangeNotSatisfiable('Actual data length (' . $len . ') is not consistent with begin (' . $range[0] . ') and end (' . $range[1] . ') offsets'); // Checking If-None-Match and related headers. if (!$this->server->checkPreconditions()) return; if (!$this->server->broadcastEvent('beforeWriteContent',array($uri, $node, null))) return; $body = $this->server->httpRequest->getBody(); $etag = $node->putRange($body, $start-1); $this->server->broadcastEvent('afterWriteContent',array($uri, $node)); $this->server->httpResponse->setHeader('Content-Length','0'); if ($etag) $this->server->httpResponse->setHeader('ETag',$etag); $this->server->httpResponse->sendStatus(204); return false; } /** * Returns the HTTP custom range update header * * This method returns null if there is no well-formed HTTP range request * header or array($start, $end). * * The first number is the offset of the first byte in the range. * The second number is the offset of the last byte in the range. * * If the second offset is null, it should be treated as the offset of the last byte of the entity * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity * * @return array|null */ public function getHTTPUpdateRange() { $range = $this->server->httpRequest->getHeader('X-Update-Range'); if (is_null($range)) return null; // Matching "Range: bytes=1234-5678: both numbers are optional if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; if ($matches[1]==='' && $matches[2]==='') return null; return array( $matches[1]!==''?$matches[1]:null, $matches[2]!==''?$matches[2]:null, ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Property.php000066400000000000000000000013351361462701300304400ustar00rootroot00000000000000time = $time; } elseif (is_int($time) || ctype_digit($time)) { $this->time = new \DateTime('@' . $time); } else { $this->time = new \DateTime($time); } // Setting timezone to UTC $this->time->setTimezone(new \DateTimeZone('UTC')); } /** * serialize * * @param DAV\Server $server * @param \DOMElement $prop * @return void */ public function serialize(DAV\Server $server, \DOMElement $prop) { $doc = $prop->ownerDocument; //$prop->setAttribute('xmlns:b','urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/'); //$prop->setAttribute('b:dt','dateTime.rfc1123'); $prop->nodeValue = HTTP\Util::toHTTPDate($this->time); } /** * getTime * * @return \DateTime */ public function getTime() { return $this->time; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Property/Href.php000066400000000000000000000044531361462701300313300ustar00rootroot00000000000000href = $href; $this->autoPrefix = $autoPrefix; } /** * Returns the uri * * @return string */ public function getHref() { return $this->href; } /** * Serializes this property. * * It will additionally prepend the href property with the server's base uri. * * @param DAV\Server $server * @param \DOMElement $dom * @return void */ public function serialize(DAV\Server $server, \DOMElement $dom) { $prefix = $server->xmlNamespaces['DAV:']; $elem = $dom->ownerDocument->createElement($prefix . ':href'); if ($this->autoPrefix) { $value = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href); } else { $value = $this->href; } $elem->appendChild($dom->ownerDocument->createTextNode($value)); $dom->appendChild($elem); } /** * Unserializes this property from a DOM Element * * This method returns an instance of this class. * It will only decode {DAV:}href values. For non-compatible elements null will be returned. * * @param \DOMElement $dom * @return DAV\Property\Href */ static function unserialize(\DOMElement $dom) { if ($dom->firstChild && DAV\XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') { return new self($dom->firstChild->textContent,false); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Property/HrefList.php000066400000000000000000000045161361462701300321640ustar00rootroot00000000000000hrefs = $hrefs; $this->autoPrefix = $autoPrefix; } /** * Returns the uris * * @return array */ public function getHrefs() { return $this->hrefs; } /** * Serializes this property. * * It will additionally prepend the href property with the server's base uri. * * @param DAV\Server $server * @param \DOMElement $dom * @return void */ public function serialize(DAV\Server $server,\DOMElement $dom) { $prefix = $server->xmlNamespaces['DAV:']; foreach($this->hrefs as $href) { $elem = $dom->ownerDocument->createElement($prefix . ':href'); if ($this->autoPrefix) { $value = $server->getBaseUri() . DAV\URLUtil::encodePath($href); } else { $value = $href; } $elem->appendChild($dom->ownerDocument->createTextNode($value)); $dom->appendChild($elem); } } /** * Unserializes this property from a DOM Element * * This method returns an instance of this class. * It will only decode {DAV:}href values. * * @param \DOMElement $dom * @return DAV\Property\HrefList */ static function unserialize(\DOMElement $dom) { $hrefs = array(); foreach($dom->childNodes as $child) { if (DAV\XMLUtil::toClarkNotation($child)==='{DAV:}href') { $hrefs[] = $child->textContent; } } return new self($hrefs, false); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Property/IHref.php000066400000000000000000000010571361462701300314360ustar00rootroot00000000000000locks = $locks; $this->revealLockToken = $revealLockToken; } /** * serialize * * @param DAV\Server $server * @param \DOMElement $prop * @return void */ public function serialize(DAV\Server $server, \DOMElement $prop) { $doc = $prop->ownerDocument; foreach($this->locks as $lock) { $activeLock = $doc->createElementNS('DAV:','d:activelock'); $prop->appendChild($activeLock); $lockScope = $doc->createElementNS('DAV:','d:lockscope'); $activeLock->appendChild($lockScope); $lockScope->appendChild($doc->createElementNS('DAV:','d:' . ($lock->scope==DAV\Locks\LockInfo::EXCLUSIVE?'exclusive':'shared'))); $lockType = $doc->createElementNS('DAV:','d:locktype'); $activeLock->appendChild($lockType); $lockType->appendChild($doc->createElementNS('DAV:','d:write')); /* {DAV:}lockroot */ if (!self::$hideLockRoot) { $lockRoot = $doc->createElementNS('DAV:','d:lockroot'); $activeLock->appendChild($lockRoot); $href = $doc->createElementNS('DAV:','d:href'); $href->appendChild($doc->createTextNode($server->getBaseUri() . $lock->uri)); $lockRoot->appendChild($href); } $activeLock->appendChild($doc->createElementNS('DAV:','d:depth',($lock->depth == DAV\Server::DEPTH_INFINITY?'infinity':$lock->depth))); $activeLock->appendChild($doc->createElementNS('DAV:','d:timeout','Second-' . $lock->timeout)); if ($this->revealLockToken) { $lockToken = $doc->createElementNS('DAV:','d:locktoken'); $activeLock->appendChild($lockToken); $lockToken->appendChild($doc->createElementNS('DAV:','d:href','opaquelocktoken:' . $lock->token)); } $activeLock->appendChild($doc->createElementNS('DAV:','d:owner',$lock->owner)); } } } ResourceType.php000066400000000000000000000057151361462701300330200ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/PropertyresourceType = array(); elseif ($resourceType === DAV\Server::NODE_DIRECTORY) $this->resourceType = array('{DAV:}collection'); elseif (is_array($resourceType)) $this->resourceType = $resourceType; else $this->resourceType = array($resourceType); } /** * serialize * * @param DAV\Server $server * @param \DOMElement $prop * @return void */ public function serialize(DAV\Server $server, \DOMElement $prop) { $propName = null; $rt = $this->resourceType; foreach($rt as $resourceType) { if (preg_match('/^{([^}]*)}(.*)$/',$resourceType,$propName)) { if (isset($server->xmlNamespaces[$propName[1]])) { $prop->appendChild($prop->ownerDocument->createElement($server->xmlNamespaces[$propName[1]] . ':' . $propName[2])); } else { $prop->appendChild($prop->ownerDocument->createElementNS($propName[1],'custom:' . $propName[2])); } } } } /** * Returns the values in clark-notation * * For example array('{DAV:}collection') * * @return array */ public function getValue() { return $this->resourceType; } /** * Checks if the principal contains a certain value * * @param string $type * @return bool */ public function is($type) { return in_array($type, $this->resourceType); } /** * Adds a resourcetype value to this property * * @param string $type * @return void */ public function add($type) { $this->resourceType[] = $type; $this->resourceType = array_unique($this->resourceType); } /** * Unserializes a DOM element into a ResourceType property. * * @param \DOMElement $dom * @return DAV\Property\ResourceType */ static public function unserialize(\DOMElement $dom) { $value = array(); foreach($dom->childNodes as $child) { $value[] = DAV\XMLUtil::toClarkNotation($child); } return new self($value); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Property/Response.php000066400000000000000000000112241361462701300322340ustar00rootroot00000000000000href = $href; $this->responseProperties = $responseProperties; } /** * Returns the url * * @return string */ public function getHref() { return $this->href; } /** * Returns the property list * * @return array */ public function getResponseProperties() { return $this->responseProperties; } /** * serialize * * @param DAV\Server $server * @param \DOMElement $dom * @return void */ public function serialize(DAV\Server $server, \DOMElement $dom) { $document = $dom->ownerDocument; $properties = $this->responseProperties; $xresponse = $document->createElement('d:response'); $dom->appendChild($xresponse); $uri = DAV\URLUtil::encodePath($this->href); // Adding the baseurl to the beginning of the url $uri = $server->getBaseUri() . $uri; $xresponse->appendChild($document->createElement('d:href',$uri)); // The properties variable is an array containing properties, grouped by // HTTP status foreach($properties as $httpStatus=>$propertyGroup) { // The 'href' is also in this array, and it's special cased. // We will ignore it if ($httpStatus=='href') continue; // If there are no properties in this group, we can also just carry on if (!count($propertyGroup)) continue; $xpropstat = $document->createElement('d:propstat'); $xresponse->appendChild($xpropstat); $xprop = $document->createElement('d:prop'); $xpropstat->appendChild($xprop); $nsList = $server->xmlNamespaces; foreach($propertyGroup as $propertyName=>$propertyValue) { $propName = null; preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); // special case for empty namespaces if ($propName[1]=='') { $currentProperty = $document->createElement($propName[2]); $xprop->appendChild($currentProperty); $currentProperty->setAttribute('xmlns',''); } else { if (!isset($nsList[$propName[1]])) { $nsList[$propName[1]] = 'x' . count($nsList); } // If the namespace was defined in the top-level xml namespaces, it means // there was already a namespace declaration, and we don't have to worry about it. if (isset($server->xmlNamespaces[$propName[1]])) { $currentProperty = $document->createElement($nsList[$propName[1]] . ':' . $propName[2]); } else { $currentProperty = $document->createElementNS($propName[1],$nsList[$propName[1]].':' . $propName[2]); } $xprop->appendChild($currentProperty); } if (is_scalar($propertyValue)) { $text = $document->createTextNode($propertyValue); $currentProperty->appendChild($text); } elseif ($propertyValue instanceof DAV\PropertyInterface) { $propertyValue->serialize($server,$currentProperty); } elseif (!is_null($propertyValue)) { throw new DAV\Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName); } } $xpropstat->appendChild($document->createElement('d:status',$server->httpResponse->getStatusMessage($httpStatus))); } } } ResponseList.php000066400000000000000000000025711361462701300330160ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Propertyresponses = $responses; } /** * serialize * * @param DAV\Server $server * @param \DOMElement $dom * @return void */ public function serialize(DAV\Server $server,\DOMElement $dom) { foreach($this->responses as $response) { $response->serialize($server, $dom); } } } SupportedLock.php000066400000000000000000000042361361462701300331620ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/PropertysupportsLocks = $supportsLocks; } /** * serialize * * @param DAV\Server $server * @param \DOMElement $prop * @return void */ public function serialize(DAV\Server $server,\DOMElement $prop) { $doc = $prop->ownerDocument; if (!$this->supportsLocks) return null; $lockEntry1 = $doc->createElement('d:lockentry'); $lockEntry2 = $doc->createElement('d:lockentry'); $prop->appendChild($lockEntry1); $prop->appendChild($lockEntry2); $lockScope1 = $doc->createElement('d:lockscope'); $lockScope2 = $doc->createElement('d:lockscope'); $lockType1 = $doc->createElement('d:locktype'); $lockType2 = $doc->createElement('d:locktype'); $lockEntry1->appendChild($lockScope1); $lockEntry1->appendChild($lockType1); $lockEntry2->appendChild($lockScope2); $lockEntry2->appendChild($lockType2); $lockScope1->appendChild($doc->createElement('d:exclusive')); $lockScope2->appendChild($doc->createElement('d:shared')); $lockType1->appendChild($doc->createElement('d:write')); $lockType2->appendChild($doc->createElement('d:write')); //$frag->appendXML(''); //$frag->appendXML(''); } } SupportedReportSet.php000066400000000000000000000052561361462701300342240ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/PropertyaddReport($reports); } /** * Adds a report to this property * * The report must be a string in clark-notation. * Multiple reports can be specified as an array. * * @param mixed $report * @return void */ public function addReport($report) { if (!is_array($report)) $report = array($report); foreach($report as $r) { if (!preg_match('/^{([^}]*)}(.*)$/',$r)) throw new DAV\Exception('Reportname must be in clark-notation'); $this->reports[] = $r; } } /** * Returns the list of supported reports * * @return array */ public function getValue() { return $this->reports; } /** * Serializes the node * * @param DAV\Server $server * @param \DOMElement $prop * @return void */ public function serialize(DAV\Server $server, \DOMElement $prop) { foreach($this->reports as $reportName) { $supportedReport = $prop->ownerDocument->createElement('d:supported-report'); $prop->appendChild($supportedReport); $report = $prop->ownerDocument->createElement('d:report'); $supportedReport->appendChild($report); preg_match('/^{([^}]*)}(.*)$/',$reportName,$matches); list(, $namespace, $element) = $matches; $prefix = isset($server->xmlNamespaces[$namespace])?$server->xmlNamespaces[$namespace]:null; if ($prefix) { $report->appendChild($prop->ownerDocument->createElement($prefix . ':' . $element)); } else { $report->appendChild($prop->ownerDocument->createElementNS($namespace, 'x:' . $element)); } } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/PropertyInterface.php000066400000000000000000000007451361462701300322650ustar00rootroot00000000000000 'd', 'http://sabredav.org/ns' => 's', ); /** * The propertymap can be used to map properties from * requests to property classes. * * @var array */ public $propertyMap = array( '{DAV:}resourcetype' => 'SabreForRainLoop\\DAV\\Property\\ResourceType', ); public $protectedProperties = array( // RFC4918 '{DAV:}getcontentlength', '{DAV:}getetag', '{DAV:}getlastmodified', '{DAV:}lockdiscovery', '{DAV:}supportedlock', // RFC4331 '{DAV:}quota-available-bytes', '{DAV:}quota-used-bytes', // RFC3744 '{DAV:}supported-privilege-set', '{DAV:}current-user-privilege-set', '{DAV:}acl', '{DAV:}acl-restrictions', '{DAV:}inherited-acl-set', ); /** * This is a flag that allow or not showing file, line and code * of the exception in the returned XML * * @var bool */ public $debugExceptions = false; /** * This property allows you to automatically add the 'resourcetype' value * based on a node's classname or interface. * * The preset ensures that {DAV:}collection is automaticlly added for nodes * implementing SabreForRainLoop\DAV\ICollection. * * @var array */ public $resourceTypeMapping = array( 'SabreForRainLoop\\DAV\\ICollection' => '{DAV:}collection', ); /** * If this setting is turned off, SabreDAV's version number will be hidden * from various places. * * Some people feel this is a good security measure. * * @var bool */ static public $exposeVersion = true; /** * Sets up the server * * If a SabreForRainLoop\DAV\Tree object is passed as an argument, it will * use it as the directory tree. If a SabreForRainLoop\DAV\INode is passed, it * will create a SabreForRainLoop\DAV\ObjectTree and use the node as the root. * * If nothing is passed, a SabreForRainLoop\DAV\SimpleCollection is created in * a SabreForRainLoop\DAV\ObjectTree. * * If an array is passed, we automatically create a root node, and use * the nodes in the array as top-level children. * * @param Tree|INode|array|null $treeOrNode The tree object */ public function __construct($treeOrNode = null) { if ($treeOrNode instanceof Tree) { $this->tree = $treeOrNode; } elseif ($treeOrNode instanceof INode) { $this->tree = new ObjectTree($treeOrNode); } elseif (is_array($treeOrNode)) { // If it's an array, a list of nodes was passed, and we need to // create the root node. foreach($treeOrNode as $node) { if (!($node instanceof INode)) { throw new Exception('Invalid argument passed to constructor. If you\'re passing an array, all the values must implement SabreForRainLoop\\DAV\\INode'); } } $root = new SimpleCollection('root', $treeOrNode); $this->tree = new ObjectTree($root); } elseif (is_null($treeOrNode)) { $root = new SimpleCollection('root'); $this->tree = new ObjectTree($root); } else { throw new Exception('Invalid argument passed to constructor. Argument must either be an instance of SabreForRainLoop\\DAV\\Tree, SabreForRainLoop\\DAV\\INode, an array or null'); } $this->httpResponse = new HTTP\Response(); $this->httpRequest = new HTTP\Request(); } /** * Starts the DAV Server * * @return void */ public function exec() { try { // If nginx (pre-1.2) is used as a proxy server, and SabreDAV as an // origin, we must make sure we send back HTTP/1.0 if this was // requested. // This is mainly because nginx doesn't support Chunked Transfer // Encoding, and this forces the webserver SabreDAV is running on, // to buffer entire responses to calculate Content-Length. $this->httpResponse->defaultHttpVersion = $this->httpRequest->getHTTPVersion(); $this->invokeMethod($this->httpRequest->getMethod(), $this->getRequestUri()); } catch (Exception $e) { try { $this->broadcastEvent('exception', array($e)); } catch (Exception $ignore) { } $DOM = new \DOMDocument('1.0','utf-8'); $DOM->formatOutput = true; $error = $DOM->createElementNS('DAV:','d:error'); $error->setAttribute('xmlns:s',self::NS_SABREDAV); $DOM->appendChild($error); $h = function($v) { return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8'); }; $error->appendChild($DOM->createElement('s:exception',$h(get_class($e)))); $error->appendChild($DOM->createElement('s:message',$h($e->getMessage()))); if ($this->debugExceptions) { $error->appendChild($DOM->createElement('s:file',$h($e->getFile()))); $error->appendChild($DOM->createElement('s:line',$h($e->getLine()))); $error->appendChild($DOM->createElement('s:code',$h($e->getCode()))); $error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString()))); } if (self::$exposeVersion) { $error->appendChild($DOM->createElement('s:sabredav-version',$h(Version::VERSION))); } if($e instanceof Exception) { $httpCode = $e->getHTTPCode(); $e->serialize($this,$error); $headers = $e->getHTTPHeaders($this); } else { $httpCode = 500; $headers = array(); } $headers['Content-Type'] = 'application/xml; charset=utf-8'; $this->httpResponse->sendStatus($httpCode); $this->httpResponse->setHeaders($headers); $this->httpResponse->sendBody($DOM->saveXML()); } } /** * Sets the base server uri * * @param string $uri * @return void */ public function setBaseUri($uri) { // If the baseUri does not end with a slash, we must add it if ($uri[strlen($uri)-1]!=='/') $uri.='/'; $this->baseUri = $uri; } /** * Returns the base responding uri * * @return string */ public function getBaseUri() { if (is_null($this->baseUri)) $this->baseUri = $this->guessBaseUri(); return $this->baseUri; } /** * This method attempts to detect the base uri. * Only the PATH_INFO variable is considered. * * If this variable is not set, the root (/) is assumed. * * @return string */ public function guessBaseUri() { $pathInfo = $this->httpRequest->getRawServerValue('PATH_INFO'); $uri = $this->httpRequest->getRawServerValue('REQUEST_URI'); // If PATH_INFO is found, we can assume it's accurate. if (!empty($pathInfo)) { // We need to make sure we ignore the QUERY_STRING part if ($pos = strpos($uri,'?')) $uri = substr($uri,0,$pos); // PATH_INFO is only set for urls, such as: /example.php/path // in that case PATH_INFO contains '/path'. // Note that REQUEST_URI is percent encoded, while PATH_INFO is // not, Therefore they are only comparable if we first decode // REQUEST_INFO as well. $decodedUri = URLUtil::decodePath($uri); // A simple sanity check: if(substr($decodedUri,strlen($decodedUri)-strlen($pathInfo))===$pathInfo) { $baseUri = substr($decodedUri,0,strlen($decodedUri)-strlen($pathInfo)); return rtrim($baseUri,'/') . '/'; } throw new Exception('The REQUEST_URI ('. $uri . ') did not end with the contents of PATH_INFO (' . $pathInfo . '). This server might be misconfigured.'); } // The last fallback is that we're just going to assume the server root. return '/'; } /** * Adds a plugin to the server * * For more information, console the documentation of SabreForRainLoop\DAV\ServerPlugin * * @param ServerPlugin $plugin * @return void */ public function addPlugin(ServerPlugin $plugin) { $this->plugins[$plugin->getPluginName()] = $plugin; $plugin->initialize($this); } /** * Returns an initialized plugin by it's name. * * This function returns null if the plugin was not found. * * @param string $name * @return ServerPlugin */ public function getPlugin($name) { if (isset($this->plugins[$name])) return $this->plugins[$name]; // This is a fallback and deprecated. foreach($this->plugins as $plugin) { if (get_class($plugin)===$name) return $plugin; } return null; } /** * Returns all plugins * * @return array */ public function getPlugins() { return $this->plugins; } /** * Subscribe to an event. * * When the event is triggered, we'll call all the specified callbacks. * It is possible to control the order of the callbacks through the * priority argument. * * This is for example used to make sure that the authentication plugin * is triggered before anything else. If it's not needed to change this * number, it is recommended to ommit. * * @param string $event * @param callback $callback * @param int $priority * @return void */ public function subscribeEvent($event, $callback, $priority = 100) { if (!isset($this->eventSubscriptions[$event])) { $this->eventSubscriptions[$event] = array(); } while(isset($this->eventSubscriptions[$event][$priority])) $priority++; $this->eventSubscriptions[$event][$priority] = $callback; ksort($this->eventSubscriptions[$event]); } /** * Broadcasts an event * * This method will call all subscribers. If one of the subscribers returns false, the process stops. * * The arguments parameter will be sent to all subscribers * * @param string $eventName * @param array $arguments * @return bool */ public function broadcastEvent($eventName,$arguments = array()) { if (isset($this->eventSubscriptions[$eventName])) { foreach($this->eventSubscriptions[$eventName] as $subscriber) { $result = call_user_func_array($subscriber,$arguments); if ($result===false) return false; } } return true; } /** * Handles a http request, and execute a method based on its name * * @param string $method * @param string $uri * @return void */ public function invokeMethod($method, $uri) { $method = strtoupper($method); if (!$this->broadcastEvent('beforeMethod',array($method, $uri))) return; // Make sure this is a HTTP method we support $internalMethods = array( 'OPTIONS', 'GET', 'HEAD', 'DELETE', 'PROPFIND', 'MKCOL', 'PUT', 'PROPPATCH', 'COPY', 'MOVE', 'REPORT' ); if (in_array($method,$internalMethods)) { call_user_func(array($this,'http' . $method), $uri); } else { if ($this->broadcastEvent('unknownMethod',array($method, $uri))) { // Unsupported method throw new Exception\NotImplemented('There was no handler found for this "' . $method . '" method'); } } } // {{{ HTTP Method implementations /** * HTTP OPTIONS * * @param string $uri * @return void */ protected function httpOptions($uri) { $methods = $this->getAllowedMethods($uri); $this->httpResponse->setHeader('Allow',strtoupper(implode(', ',$methods))); $features = array('1','3', 'extended-mkcol'); foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); $this->httpResponse->setHeader('DAV',implode(', ',$features)); $this->httpResponse->setHeader('MS-Author-Via','DAV'); $this->httpResponse->setHeader('Accept-Ranges','bytes'); if (self::$exposeVersion) { $this->httpResponse->setHeader('X-Sabre-Version',Version::VERSION); } $this->httpResponse->setHeader('Content-Length',0); $this->httpResponse->sendStatus(200); } /** * HTTP GET * * This method simply fetches the contents of a uri, like normal * * @param string $uri * @return bool */ protected function httpGet($uri) { $node = $this->tree->getNodeForPath($uri,0); if (!$this->checkPreconditions(true)) return false; if (!$node instanceof IFile) throw new Exception\NotImplemented('GET is only implemented on File objects'); $body = $node->get(); // Converting string into stream, if needed. if (is_string($body)) { $stream = fopen('php://temp','r+'); fwrite($stream,$body); rewind($stream); $body = $stream; } /* * TODO: getetag, getlastmodified, getsize should also be used using * this method */ $httpHeaders = $this->getHTTPHeaders($uri); /* ContentType needs to get a default, because many webservers will otherwise * default to text/html, and we don't want this for security reasons. */ if (!isset($httpHeaders['Content-Type'])) { $httpHeaders['Content-Type'] = 'application/octet-stream'; } if (isset($httpHeaders['Content-Length'])) { $nodeSize = $httpHeaders['Content-Length']; // Need to unset Content-Length, because we'll handle that during figuring out the range unset($httpHeaders['Content-Length']); } else { $nodeSize = null; } $this->httpResponse->setHeaders($httpHeaders); $range = $this->getHTTPRange(); $ifRange = $this->httpRequest->getHeader('If-Range'); $ignoreRangeHeader = false; // If ifRange is set, and range is specified, we first need to check // the precondition. if ($nodeSize && $range && $ifRange) { // if IfRange is parsable as a date we'll treat it as a DateTime // otherwise, we must treat it as an etag. try { $ifRangeDate = new \DateTime($ifRange); // It's a date. We must check if the entity is modified since // the specified date. if (!isset($httpHeaders['Last-Modified'])) $ignoreRangeHeader = true; else { $modified = new \DateTime($httpHeaders['Last-Modified']); if($modified > $ifRangeDate) $ignoreRangeHeader = true; } } catch (\Exception $e) { // It's an entity. We can do a simple comparison. if (!isset($httpHeaders['ETag'])) $ignoreRangeHeader = true; elseif ($httpHeaders['ETag']!==$ifRange) $ignoreRangeHeader = true; } } // We're only going to support HTTP ranges if the backend provided a filesize if (!$ignoreRangeHeader && $nodeSize && $range) { // Determining the exact byte offsets if (!is_null($range[0])) { $start = $range[0]; $end = $range[1]?$range[1]:$nodeSize-1; if($start >= $nodeSize) throw new Exception\RequestedRangeNotSatisfiable('The start offset (' . $range[0] . ') exceeded the size of the entity (' . $nodeSize . ')'); if($end < $start) throw new Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')'); if($end >= $nodeSize) $end = $nodeSize-1; } else { $start = $nodeSize-$range[1]; $end = $nodeSize-1; if ($start<0) $start = 0; } // New read/write stream $newStream = fopen('php://temp','r+'); // stream_copy_to_stream() has a bug/feature: the `whence` argument // is interpreted as SEEK_SET (count from absolute offset 0), while // for a stream it should be SEEK_CUR (count from current offset). // If a stream is nonseekable, the function fails. So we *emulate* // the correct behaviour with fseek(): if ($start > 0) { if (($curOffs = ftell($body)) === false) $curOffs = 0; fseek($body, $start - $curOffs, SEEK_CUR); } stream_copy_to_stream($body, $newStream, $end-$start+1); rewind($newStream); $this->httpResponse->setHeader('Content-Length', $end-$start+1); $this->httpResponse->setHeader('Content-Range','bytes ' . $start . '-' . $end . '/' . $nodeSize); $this->httpResponse->sendStatus(206); $this->httpResponse->sendBody($newStream); } else { if ($nodeSize) $this->httpResponse->setHeader('Content-Length',$nodeSize); $this->httpResponse->sendStatus(200); $this->httpResponse->sendBody($body); } } /** * HTTP HEAD * * This method is normally used to take a peak at a url, and only get the HTTP response headers, without the body * This is used by clients to determine if a remote file was changed, so they can use a local cached version, instead of downloading it again * * @param string $uri * @return void */ protected function httpHead($uri) { $node = $this->tree->getNodeForPath($uri); /* This information is only collection for File objects. * Ideally we want to throw 405 Method Not Allowed for every * non-file, but MS Office does not like this */ if ($node instanceof IFile) { $headers = $this->getHTTPHeaders($this->getRequestUri()); if (!isset($headers['Content-Type'])) { $headers['Content-Type'] = 'application/octet-stream'; } $this->httpResponse->setHeaders($headers); } $this->httpResponse->sendStatus(200); } /** * HTTP Delete * * The HTTP delete method, deletes a given uri * * @param string $uri * @return void */ protected function httpDelete($uri) { if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; $this->tree->delete($uri); $this->broadcastEvent('afterUnbind',array($uri)); $this->httpResponse->sendStatus(204); $this->httpResponse->setHeader('Content-Length','0'); } /** * WebDAV PROPFIND * * This WebDAV method requests information about an uri resource, or a list of resources * If a client wants to receive the properties for a single resource it will add an HTTP Depth: header with a 0 value * If the value is 1, it means that it also expects a list of sub-resources (e.g.: files in a directory) * * The request body contains an XML data structure that has a list of properties the client understands * The response body is also an xml document, containing information about every uri resource and the requested properties * * It has to return a HTTP 207 Multi-status status code * * @param string $uri * @return void */ protected function httpPropfind($uri) { $requestedProperties = $this->parsePropFindRequest($this->httpRequest->getBody(true)); $depth = $this->getHTTPDepth(1); // The only two options for the depth of a propfind is 0 or 1 if ($depth!=0) $depth = 1; $newProperties = $this->getPropertiesForPath($uri,$requestedProperties,$depth); // This is a multi-status response $this->httpResponse->sendStatus(207); $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->httpResponse->setHeader('Vary','Brief,Prefer'); // Normally this header is only needed for OPTIONS responses, however.. // iCal seems to also depend on these being set for PROPFIND. Since // this is not harmful, we'll add it. $features = array('1','3', 'extended-mkcol'); foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures()); $this->httpResponse->setHeader('DAV',implode(', ',$features)); $prefer = $this->getHTTPPrefer(); $minimal = $prefer['return-minimal']; $data = $this->generateMultiStatus($newProperties, $minimal); $this->httpResponse->sendBody($data); } /** * WebDAV PROPPATCH * * This method is called to update properties on a Node. The request is an XML body with all the mutations. * In this XML body it is specified which properties should be set/updated and/or deleted * * @param string $uri * @return void */ protected function httpPropPatch($uri) { $newProperties = $this->parsePropPatchRequest($this->httpRequest->getBody(true)); $result = $this->updateProperties($uri, $newProperties); $prefer = $this->getHTTPPrefer(); $this->httpResponse->setHeader('Vary','Brief,Prefer'); if ($prefer['return-minimal']) { // If return-minimal is specified, we only have to check if the // request was succesful, and don't need to return the // multi-status. $ok = true; foreach($result as $code=>$prop) { if ((int)$code > 299) { $ok = false; } } if ($ok) { $this->httpResponse->sendStatus(204); return; } } $this->httpResponse->sendStatus(207); $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->httpResponse->sendBody( $this->generateMultiStatus(array($result)) ); } /** * HTTP PUT method * * This HTTP method updates a file, or creates a new one. * * If a new resource was created, a 201 Created status code should be returned. If an existing resource is updated, it's a 204 No Content * * @param string $uri * @return bool */ protected function httpPut($uri) { $body = $this->httpRequest->getBody(); // Intercepting Content-Range if ($this->httpRequest->getHeader('Content-Range')) { /** Content-Range is dangerous for PUT requests: PUT per definition stores a full resource. draft-ietf-httpbis-p2-semantics-15 says in section 7.6: An origin server SHOULD reject any PUT request that contains a Content-Range header field, since it might be misinterpreted as partial content (or might be partial content that is being mistakenly PUT as a full representation). Partial content updates are possible by targeting a separately identified resource with state that overlaps a portion of the larger resource, or by using a different method that has been specifically defined for partial updates (for example, the PATCH method defined in [RFC5789]). This clarifies RFC2616 section 9.6: The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not understand or implement and MUST return a 501 (Not Implemented) response in such cases. OTOH is a PUT request with a Content-Range currently the only way to continue an aborted upload request and is supported by curl, mod_dav, Tomcat and others. Since some clients do use this feature which results in unexpected behaviour (cf PEAR::HTTP_WebDAV_Client 1.0.1), we reject all PUT requests with a Content-Range for now. */ throw new Exception\NotImplemented('PUT with Content-Range is not allowed.'); } // Intercepting the Finder problem if (($expected = $this->httpRequest->getHeader('X-Expected-Entity-Length')) && $expected > 0) { /** Many webservers will not cooperate well with Finder PUT requests, because it uses 'Chunked' transfer encoding for the request body. The symptom of this problem is that Finder sends files to the server, but they arrive as 0-length files in PHP. If we don't do anything, the user might think they are uploading files successfully, but they end up empty on the server. Instead, we throw back an error if we detect this. The reason Finder uses Chunked, is because it thinks the files might change as it's being uploaded, and therefore the Content-Length can vary. Instead it sends the X-Expected-Entity-Length header with the size of the file at the very start of the request. If this header is set, but we don't get a request body we will fail the request to protect the end-user. */ // Only reading first byte $firstByte = fread($body,1); if (strlen($firstByte)!==1) { throw new Exception\Forbidden('This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.'); } // The body needs to stay intact, so we copy everything to a // temporary stream. $newBody = fopen('php://temp','r+'); fwrite($newBody,$firstByte); stream_copy_to_stream($body, $newBody); rewind($newBody); $body = $newBody; } if ($this->tree->nodeExists($uri)) { $node = $this->tree->getNodeForPath($uri); // Checking If-None-Match and related headers. if (!$this->checkPreconditions()) return; // If the node is a collection, we'll deny it if (!($node instanceof IFile)) throw new Exception\Conflict('PUT is not allowed on non-files.'); if (!$this->broadcastEvent('beforeWriteContent',array($uri, $node, &$body))) return false; $etag = $node->put($body); $this->broadcastEvent('afterWriteContent',array($uri, $node)); $this->httpResponse->setHeader('Content-Length','0'); if ($etag) $this->httpResponse->setHeader('ETag',$etag); $this->httpResponse->sendStatus(204); } else { $etag = null; // If we got here, the resource didn't exist yet. if (!$this->createFile($this->getRequestUri(),$body,$etag)) { // For one reason or another the file was not created. return; } $this->httpResponse->setHeader('Content-Length','0'); if ($etag) $this->httpResponse->setHeader('ETag', $etag); $this->httpResponse->sendStatus(201); } } /** * WebDAV MKCOL * * The MKCOL method is used to create a new collection (directory) on the server * * @param string $uri * @return void */ protected function httpMkcol($uri) { $requestBody = $this->httpRequest->getBody(true); if ($requestBody) { $contentType = $this->httpRequest->getHeader('Content-Type'); if (strpos($contentType,'application/xml')!==0 && strpos($contentType,'text/xml')!==0) { // We must throw 415 for unsupported mkcol bodies throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must have an xml Content-Type'); } $dom = XMLUtil::loadDOMDocument($requestBody); if (XMLUtil::toClarkNotation($dom->firstChild)!=='{DAV:}mkcol') { // We must throw 415 for unsupported mkcol bodies throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must be a {DAV:}mkcol request construct.'); } $properties = array(); foreach($dom->firstChild->childNodes as $childNode) { if (XMLUtil::toClarkNotation($childNode)!=='{DAV:}set') continue; $properties = array_merge($properties, XMLUtil::parseProperties($childNode, $this->propertyMap)); } if (!isset($properties['{DAV:}resourcetype'])) throw new Exception\BadRequest('The mkcol request must include a {DAV:}resourcetype property'); $resourceType = $properties['{DAV:}resourcetype']->getValue(); unset($properties['{DAV:}resourcetype']); } else { $properties = array(); $resourceType = array('{DAV:}collection'); } $result = $this->createCollection($uri, $resourceType, $properties); if (is_array($result)) { $this->httpResponse->sendStatus(207); $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->httpResponse->sendBody( $this->generateMultiStatus(array($result)) ); } else { $this->httpResponse->setHeader('Content-Length','0'); $this->httpResponse->sendStatus(201); } } /** * WebDAV HTTP MOVE method * * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo * * @param string $uri * @return bool */ protected function httpMove($uri) { $moveInfo = $this->getCopyAndMoveInfo(); // If the destination is part of the source tree, we must fail if ($moveInfo['destination']==$uri) throw new Exception\Forbidden('Source and destination uri are identical.'); if ($moveInfo['destinationExists']) { if (!$this->broadcastEvent('beforeUnbind',array($moveInfo['destination']))) return false; $this->tree->delete($moveInfo['destination']); $this->broadcastEvent('afterUnbind',array($moveInfo['destination'])); } if (!$this->broadcastEvent('beforeUnbind',array($uri))) return false; if (!$this->broadcastEvent('beforeBind',array($moveInfo['destination']))) return false; $this->tree->move($uri,$moveInfo['destination']); $this->broadcastEvent('afterUnbind',array($uri)); $this->broadcastEvent('afterBind',array($moveInfo['destination'])); // If a resource was overwritten we should send a 204, otherwise a 201 $this->httpResponse->setHeader('Content-Length','0'); $this->httpResponse->sendStatus($moveInfo['destinationExists']?204:201); } /** * WebDAV HTTP COPY method * * This method copies one uri to a different uri, and works much like the MOVE request * A lot of the actual request processing is done in getCopyMoveInfo * * @param string $uri * @return bool */ protected function httpCopy($uri) { $copyInfo = $this->getCopyAndMoveInfo(); // If the destination is part of the source tree, we must fail if ($copyInfo['destination']==$uri) throw new Exception\Forbidden('Source and destination uri are identical.'); if ($copyInfo['destinationExists']) { if (!$this->broadcastEvent('beforeUnbind',array($copyInfo['destination']))) return false; $this->tree->delete($copyInfo['destination']); } if (!$this->broadcastEvent('beforeBind',array($copyInfo['destination']))) return false; $this->tree->copy($uri,$copyInfo['destination']); $this->broadcastEvent('afterBind',array($copyInfo['destination'])); // If a resource was overwritten we should send a 204, otherwise a 201 $this->httpResponse->setHeader('Content-Length','0'); $this->httpResponse->sendStatus($copyInfo['destinationExists']?204:201); } /** * HTTP REPORT method implementation * * Although the REPORT method is not part of the standard WebDAV spec (it's from rfc3253) * It's used in a lot of extensions, so it made sense to implement it into the core. * * @param string $uri * @return void */ protected function httpReport($uri) { $body = $this->httpRequest->getBody(true); $dom = XMLUtil::loadDOMDocument($body); $reportName = XMLUtil::toClarkNotation($dom->firstChild); if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) { // If broadcastEvent returned true, it means the report was not supported throw new Exception\ReportNotSupported(); } } // }}} // {{{ HTTP/WebDAV protocol helpers /** * Returns an array with all the supported HTTP methods for a specific uri. * * @param string $uri * @return array */ public function getAllowedMethods($uri) { $methods = array( 'OPTIONS', 'GET', 'HEAD', 'DELETE', 'PROPFIND', 'PUT', 'PROPPATCH', 'COPY', 'MOVE', 'REPORT' ); // The MKCOL is only allowed on an unmapped uri try { $this->tree->getNodeForPath($uri); } catch (Exception\NotFound $e) { $methods[] = 'MKCOL'; } // We're also checking if any of the plugins register any new methods foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri)); array_unique($methods); return $methods; } /** * Gets the uri for the request, keeping the base uri into consideration * * @return string */ public function getRequestUri() { return $this->calculateUri($this->httpRequest->getUri()); } /** * Calculates the uri for a request, making sure that the base uri is stripped out * * @param string $uri * @throws Exception\Forbidden A permission denied exception is thrown whenever there was an attempt to supply a uri outside of the base uri * @return string */ public function calculateUri($uri) { if ($uri[0]!='/' && strpos($uri,'://')) { $uri = parse_url($uri,PHP_URL_PATH); } $uri = str_replace('//','/',$uri); if (strpos($uri,$this->getBaseUri())===0) { return trim(URLUtil::decodePath(substr($uri,strlen($this->getBaseUri()))),'/'); // A special case, if the baseUri was accessed without a trailing // slash, we'll accept it as well. } elseif ($uri.'/' === $this->getBaseUri()) { return ''; } else { throw new Exception\Forbidden('Requested uri (' . $uri . ') is out of base uri (' . $this->getBaseUri() . ')'); } } /** * Returns the HTTP depth header * * This method returns the contents of the HTTP depth request header. If the depth header was 'infinity' it will return the SabreForRainLoop\DAV\Server::DEPTH_INFINITY object * It is possible to supply a default depth value, which is used when the depth header has invalid content, or is completely non-existent * * @param mixed $default * @return int */ public function getHTTPDepth($default = self::DEPTH_INFINITY) { // If its not set, we'll grab the default $depth = $this->httpRequest->getHeader('Depth'); if (is_null($depth)) return $default; if ($depth == 'infinity') return self::DEPTH_INFINITY; // If its an unknown value. we'll grab the default if (!ctype_digit($depth)) return $default; return (int)$depth; } /** * Returns the HTTP range header * * This method returns null if there is no well-formed HTTP range request * header or array($start, $end). * * The first number is the offset of the first byte in the range. * The second number is the offset of the last byte in the range. * * If the second offset is null, it should be treated as the offset of the last byte of the entity * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity * * @return array|null */ public function getHTTPRange() { $range = $this->httpRequest->getHeader('range'); if (is_null($range)) return null; // Matching "Range: bytes=1234-5678: both numbers are optional if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null; if ($matches[1]==='' && $matches[2]==='') return null; return array( $matches[1]!==''?$matches[1]:null, $matches[2]!==''?$matches[2]:null, ); } /** * Returns the HTTP Prefer header information. * * The prefer header is defined in: * http://tools.ietf.org/html/draft-snell-http-prefer-14 * * This method will return an array with options. * * Currently, the following options may be returned: * array( * 'return-asynch' => true, * 'return-minimal' => true, * 'return-representation' => true, * 'wait' => 30, * 'strict' => true, * 'lenient' => true, * ) * * This method also supports the Brief header, and will also return * 'return-minimal' if the brief header was set to 't'. * * For the boolean options, false will be returned if the headers are not * specified. For the integer options it will be 'null'. * * @return array */ public function getHTTPPrefer() { $result = array( 'return-asynch' => false, 'return-minimal' => false, 'return-representation' => false, 'wait' => null, 'strict' => false, 'lenient' => false, ); if ($prefer = $this->httpRequest->getHeader('Prefer')) { $parameters = array_map('trim', explode(',', $prefer) ); foreach($parameters as $parameter) { // Right now our regex only supports the tokens actually // specified in the draft. We may need to expand this if new // tokens get registered. if(!preg_match('/^(?P[a-z0-9-]+)(?:=(?P[0-9]+))?$/', $parameter, $matches)) { continue; } switch($matches['token']) { case 'return-asynch' : case 'return-minimal' : case 'return-representation' : case 'strict' : case 'lenient' : $result[$matches['token']] = true; break; case 'wait' : $result[$matches['token']] = $matches['value']; break; } } } if ($this->httpRequest->getHeader('Brief')=='t') { $result['return-minimal'] = true; } return $result; } /** * Returns information about Copy and Move requests * * This function is created to help getting information about the source and the destination for the * WebDAV MOVE and COPY HTTP request. It also validates a lot of information and throws proper exceptions * * The returned value is an array with the following keys: * * destination - Destination path * * destinationExists - Whether or not the destination is an existing url (and should therefore be overwritten) * * @return array */ public function getCopyAndMoveInfo() { // Collecting the relevant HTTP headers if (!$this->httpRequest->getHeader('Destination')) throw new Exception\BadRequest('The destination header was not supplied'); $destination = $this->calculateUri($this->httpRequest->getHeader('Destination')); $overwrite = $this->httpRequest->getHeader('Overwrite'); if (!$overwrite) $overwrite = 'T'; if (strtoupper($overwrite)=='T') $overwrite = true; elseif (strtoupper($overwrite)=='F') $overwrite = false; // We need to throw a bad request exception, if the header was invalid else throw new Exception\BadRequest('The HTTP Overwrite header should be either T or F'); list($destinationDir) = URLUtil::splitPath($destination); try { $destinationParent = $this->tree->getNodeForPath($destinationDir); if (!($destinationParent instanceof ICollection)) throw new Exception\UnsupportedMediaType('The destination node is not a collection'); } catch (Exception\NotFound $e) { // If the destination parent node is not found, we throw a 409 throw new Exception\Conflict('The destination node is not found'); } try { $destinationNode = $this->tree->getNodeForPath($destination); // If this succeeded, it means the destination already exists // we'll need to throw precondition failed in case overwrite is false if (!$overwrite) throw new Exception\PreconditionFailed('The destination node already exists, and the overwrite header is set to false','Overwrite'); } catch (Exception\NotFound $e) { // Destination didn't exist, we're all good $destinationNode = false; } // These are the three relevant properties we need to return return array( 'destination' => $destination, 'destinationExists' => $destinationNode==true, 'destinationNode' => $destinationNode, ); } /** * Returns a list of properties for a path * * This is a simplified version getPropertiesForPath. * if you aren't interested in status codes, but you just * want to have a flat list of properties. Use this method. * * @param string $path * @param array $propertyNames */ public function getProperties($path, $propertyNames) { $result = $this->getPropertiesForPath($path,$propertyNames,0); return $result[0][200]; } /** * A kid-friendly way to fetch properties for a node's children. * * The returned array will be indexed by the path of the of child node. * Only properties that are actually found will be returned. * * The parent node will not be returned. * * @param string $path * @param array $propertyNames * @return array */ public function getPropertiesForChildren($path, $propertyNames) { $result = array(); foreach($this->getPropertiesForPath($path,$propertyNames,1) as $k=>$row) { // Skipping the parent path if ($k === 0) continue; $result[$row['href']] = $row[200]; } return $result; } /** * Returns a list of HTTP headers for a particular resource * * The generated http headers are based on properties provided by the * resource. The method basically provides a simple mapping between * DAV property and HTTP header. * * The headers are intended to be used for HEAD and GET requests. * * @param string $path * @return array */ public function getHTTPHeaders($path) { $propertyMap = array( '{DAV:}getcontenttype' => 'Content-Type', '{DAV:}getcontentlength' => 'Content-Length', '{DAV:}getlastmodified' => 'Last-Modified', '{DAV:}getetag' => 'ETag', ); $properties = $this->getProperties($path,array_keys($propertyMap)); $headers = array(); foreach($propertyMap as $property=>$header) { if (!isset($properties[$property])) continue; if (is_scalar($properties[$property])) { $headers[$header] = $properties[$property]; // GetLastModified gets special cased } elseif ($properties[$property] instanceof Property\GetLastModified) { $headers[$header] = HTTP\Util::toHTTPDate($properties[$property]->getTime()); } } return $headers; } /** * Returns a list of properties for a given path * * The path that should be supplied should have the baseUrl stripped out * The list of properties should be supplied in Clark notation. If the list is empty * 'allprops' is assumed. * * If a depth of 1 is requested child elements will also be returned. * * @param string $path * @param array $propertyNames * @param int $depth * @return array */ public function getPropertiesForPath($path, $propertyNames = array(), $depth = 0) { if ($depth!=0) $depth = 1; $path = rtrim($path,'/'); // This event allows people to intercept these requests early on in the // process. // // We're not doing anything with the result, but this can be helpful to // pre-fetch certain expensive live properties. $this->broadCastEvent('beforeGetPropertiesForPath', array($path, $propertyNames, $depth)); $returnPropertyList = array(); $parentNode = $this->tree->getNodeForPath($path); $nodes = array( $path => $parentNode ); if ($depth==1 && $parentNode instanceof ICollection) { foreach($this->tree->getChildren($path) as $childNode) $nodes[$path . '/' . $childNode->getName()] = $childNode; } // If the propertyNames array is empty, it means all properties are requested. // We shouldn't actually return everything we know though, and only return a // sensible list. $allProperties = count($propertyNames)==0; foreach($nodes as $myPath=>$node) { $currentPropertyNames = $propertyNames; $newProperties = array( '200' => array(), '404' => array(), ); if ($allProperties) { // Default list of propertyNames, when all properties were requested. $currentPropertyNames = array( '{DAV:}getlastmodified', '{DAV:}getcontentlength', '{DAV:}resourcetype', '{DAV:}quota-used-bytes', '{DAV:}quota-available-bytes', '{DAV:}getetag', '{DAV:}getcontenttype', ); } // If the resourceType was not part of the list, we manually add it // and mark it for removal. We need to know the resourcetype in order // to make certain decisions about the entry. // WebDAV dictates we should add a / and the end of href's for collections $removeRT = false; if (!in_array('{DAV:}resourcetype',$currentPropertyNames)) { $currentPropertyNames[] = '{DAV:}resourcetype'; $removeRT = true; } $result = $this->broadcastEvent('beforeGetProperties',array($myPath, $node, &$currentPropertyNames, &$newProperties)); // If this method explicitly returned false, we must ignore this // node as it is inaccessible. if ($result===false) continue; if (count($currentPropertyNames) > 0) { if ($node instanceof IProperties) { $nodeProperties = $node->getProperties($currentPropertyNames); // The getProperties method may give us too much, // properties, in case the implementor was lazy. // // So as we loop through this list, we will only take the // properties that were actually requested and discard the // rest. foreach($currentPropertyNames as $k=>$currentPropertyName) { if (isset($nodeProperties[$currentPropertyName])) { unset($currentPropertyNames[$k]); $newProperties[200][$currentPropertyName] = $nodeProperties[$currentPropertyName]; } } } } foreach($currentPropertyNames as $prop) { if (isset($newProperties[200][$prop])) continue; switch($prop) { case '{DAV:}getlastmodified' : if ($node->getLastModified()) $newProperties[200][$prop] = new Property\GetLastModified($node->getLastModified()); break; case '{DAV:}getcontentlength' : if ($node instanceof IFile) { $size = $node->getSize(); if (!is_null($size)) { $newProperties[200][$prop] = (int)$node->getSize(); } } break; case '{DAV:}quota-used-bytes' : if ($node instanceof IQuota) { $quotaInfo = $node->getQuotaInfo(); $newProperties[200][$prop] = $quotaInfo[0]; } break; case '{DAV:}quota-available-bytes' : if ($node instanceof IQuota) { $quotaInfo = $node->getQuotaInfo(); $newProperties[200][$prop] = $quotaInfo[1]; } break; case '{DAV:}getetag' : if ($node instanceof IFile && $etag = $node->getETag()) $newProperties[200][$prop] = $etag; break; case '{DAV:}getcontenttype' : if ($node instanceof IFile && $ct = $node->getContentType()) $newProperties[200][$prop] = $ct; break; case '{DAV:}supported-report-set' : $reports = array(); foreach($this->plugins as $plugin) { $reports = array_merge($reports, $plugin->getSupportedReportSet($myPath)); } $newProperties[200][$prop] = new Property\SupportedReportSet($reports); break; case '{DAV:}resourcetype' : $newProperties[200]['{DAV:}resourcetype'] = new Property\ResourceType(); foreach($this->resourceTypeMapping as $className => $resourceType) { if ($node instanceof $className) $newProperties[200]['{DAV:}resourcetype']->add($resourceType); } break; } // If we were unable to find the property, we will list it as 404. if (!$allProperties && !isset($newProperties[200][$prop])) $newProperties[404][$prop] = null; } $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties, $node)); $newProperties['href'] = trim($myPath,'/'); // Its is a WebDAV recommendation to add a trailing slash to collectionnames. // Apple's iCal also requires a trailing slash for principals (rfc 3744), though this is non-standard. if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype'])) { $rt = $newProperties[200]['{DAV:}resourcetype']; if ($rt->is('{DAV:}collection') || $rt->is('{DAV:}principal')) { $newProperties['href'] .='/'; } } // If the resourcetype property was manually added to the requested property list, // we will remove it again. if ($removeRT) unset($newProperties[200]['{DAV:}resourcetype']); $returnPropertyList[] = $newProperties; } return $returnPropertyList; } /** * This method is invoked by sub-systems creating a new file. * * Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin). * It was important to get this done through a centralized function, * allowing plugins to intercept this using the beforeCreateFile event. * * This method will return true if the file was actually created * * @param string $uri * @param resource $data * @param string $etag * @return bool */ public function createFile($uri,$data, &$etag = null) { list($dir,$name) = URLUtil::splitPath($uri); if (!$this->broadcastEvent('beforeBind',array($uri))) return false; $parent = $this->tree->getNodeForPath($dir); if (!$parent instanceof ICollection) { throw new Exception\Conflict('Files can only be created as children of collections'); } if (!$this->broadcastEvent('beforeCreateFile',array($uri, &$data, $parent))) return false; $etag = $parent->createFile($name,$data); $this->tree->markDirty($dir . '/' . $name); $this->broadcastEvent('afterBind',array($uri)); $this->broadcastEvent('afterCreateFile',array($uri, $parent)); return true; } /** * This method is invoked by sub-systems creating a new directory. * * @param string $uri * @return void */ public function createDirectory($uri) { $this->createCollection($uri,array('{DAV:}collection'),array()); } /** * Use this method to create a new collection * * The {DAV:}resourcetype is specified using the resourceType array. * At the very least it must contain {DAV:}collection. * * The properties array can contain a list of additional properties. * * @param string $uri The new uri * @param array $resourceType The resourceType(s) * @param array $properties A list of properties * @return array|null */ public function createCollection($uri, array $resourceType, array $properties) { list($parentUri,$newName) = URLUtil::splitPath($uri); // Making sure {DAV:}collection was specified as resourceType if (!in_array('{DAV:}collection', $resourceType)) { throw new Exception\InvalidResourceType('The resourceType for this collection must at least include {DAV:}collection'); } // Making sure the parent exists try { $parent = $this->tree->getNodeForPath($parentUri); } catch (Exception\NotFound $e) { throw new Exception\Conflict('Parent node does not exist'); } // Making sure the parent is a collection if (!$parent instanceof ICollection) { throw new Exception\Conflict('Parent node is not a collection'); } // Making sure the child does not already exist try { $parent->getChild($newName); // If we got here.. it means there's already a node on that url, and we need to throw a 405 throw new Exception\MethodNotAllowed('The resource you tried to create already exists'); } catch (Exception\NotFound $e) { // This is correct } if (!$this->broadcastEvent('beforeBind',array($uri))) return; // There are 2 modes of operation. The standard collection // creates the directory, and then updates properties // the extended collection can create it directly. if ($parent instanceof IExtendedCollection) { $parent->createExtendedCollection($newName, $resourceType, $properties); } else { // No special resourcetypes are supported if (count($resourceType)>1) { throw new Exception\InvalidResourceType('The {DAV:}resourcetype you specified is not supported here.'); } $parent->createDirectory($newName); $rollBack = false; $exception = null; $errorResult = null; if (count($properties)>0) { try { $errorResult = $this->updateProperties($uri, $properties); if (!isset($errorResult[200])) { $rollBack = true; } } catch (Exception $e) { $rollBack = true; $exception = $e; } } if ($rollBack) { if (!$this->broadcastEvent('beforeUnbind',array($uri))) return; $this->tree->delete($uri); // Re-throwing exception if ($exception) throw $exception; return $errorResult; } } $this->tree->markDirty($parentUri); $this->broadcastEvent('afterBind',array($uri)); } /** * This method updates a resource's properties * * The properties array must be a list of properties. Array-keys are * property names in clarknotation, array-values are it's values. * If a property must be deleted, the value should be null. * * Note that this request should either completely succeed, or * completely fail. * * The response is an array with statuscodes for keys, which in turn * contain arrays with propertynames. This response can be used * to generate a multistatus body. * * @param string $uri * @param array $properties * @return array */ public function updateProperties($uri, array $properties) { // we'll start by grabbing the node, this will throw the appropriate // exceptions if it doesn't. $node = $this->tree->getNodeForPath($uri); $result = array( 200 => array(), 403 => array(), 424 => array(), ); $remainingProperties = $properties; $hasError = false; // Running through all properties to make sure none of them are protected if (!$hasError) foreach($properties as $propertyName => $value) { if(in_array($propertyName, $this->protectedProperties)) { $result[403][$propertyName] = null; unset($remainingProperties[$propertyName]); $hasError = true; } } if (!$hasError) { // Allowing plugins to take care of property updating $hasError = !$this->broadcastEvent('updateProperties',array( &$remainingProperties, &$result, $node )); } // If the node is not an instance of SabreForRainLoop\DAV\IProperties, every // property is 403 Forbidden if (!$hasError && count($remainingProperties) && !($node instanceof IProperties)) { $hasError = true; foreach($properties as $propertyName=> $value) { $result[403][$propertyName] = null; } $remainingProperties = array(); } // Only if there were no errors we may attempt to update the resource if (!$hasError) { if (count($remainingProperties)>0) { $updateResult = $node->updateProperties($remainingProperties); if ($updateResult===true) { // success foreach($remainingProperties as $propertyName=>$value) { $result[200][$propertyName] = null; } } elseif ($updateResult===false) { // The node failed to update the properties for an // unknown reason foreach($remainingProperties as $propertyName=>$value) { $result[403][$propertyName] = null; } } elseif (is_array($updateResult)) { // The node has detailed update information // We need to merge the results with the earlier results. foreach($updateResult as $status => $props) { if (is_array($props)) { if (!isset($result[$status])) $result[$status] = array(); $result[$status] = array_merge($result[$status], $updateResult[$status]); } } } else { throw new Exception('Invalid result from updateProperties'); } $remainingProperties = array(); } } foreach($remainingProperties as $propertyName=>$value) { // if there are remaining properties, it must mean // there's a dependency failure $result[424][$propertyName] = null; } // Removing empty array values foreach($result as $status=>$props) { if (count($props)===0) unset($result[$status]); } $result['href'] = $uri; return $result; } /** * This method checks the main HTTP preconditions. * * Currently these are: * * If-Match * * If-None-Match * * If-Modified-Since * * If-Unmodified-Since * * The method will return true if all preconditions are met * The method will return false, or throw an exception if preconditions * failed. If false is returned the operation should be aborted, and * the appropriate HTTP response headers are already set. * * Normally this method will throw 412 Precondition Failed for failures * related to If-None-Match, If-Match and If-Unmodified Since. It will * set the status to 304 Not Modified for If-Modified_since. * * If the $handleAsGET argument is set to true, it will also return 304 * Not Modified for failure of the If-None-Match precondition. This is the * desired behaviour for HTTP GET and HTTP HEAD requests. * * @param bool $handleAsGET * @return bool */ public function checkPreconditions($handleAsGET = false) { $uri = $this->getRequestUri(); $node = null; $lastMod = null; $etag = null; if ($ifMatch = $this->httpRequest->getHeader('If-Match')) { // If-Match contains an entity tag. Only if the entity-tag // matches we are allowed to make the request succeed. // If the entity-tag is '*' we are only allowed to make the // request succeed if a resource exists at that url. try { $node = $this->tree->getNodeForPath($uri); } catch (Exception\NotFound $e) { throw new Exception\PreconditionFailed('An If-Match header was specified and the resource did not exist','If-Match'); } // Only need to check entity tags if they are not * if ($ifMatch!=='*') { // There can be multiple etags $ifMatch = explode(',',$ifMatch); $haveMatch = false; foreach($ifMatch as $ifMatchItem) { // Stripping any extra spaces $ifMatchItem = trim($ifMatchItem,' '); $etag = $node->getETag(); if ($etag===$ifMatchItem) { $haveMatch = true; } else { // Evolution has a bug where it sometimes prepends the " // with a \. This is our workaround. if (str_replace('\\"','"', $ifMatchItem) === $etag) { $haveMatch = true; } } } if (!$haveMatch) { throw new Exception\PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match'); } } } if ($ifNoneMatch = $this->httpRequest->getHeader('If-None-Match')) { // The If-None-Match header contains an etag. // Only if the ETag does not match the current ETag, the request will succeed // The header can also contain *, in which case the request // will only succeed if the entity does not exist at all. $nodeExists = true; if (!$node) { try { $node = $this->tree->getNodeForPath($uri); } catch (Exception\NotFound $e) { $nodeExists = false; } } if ($nodeExists) { $haveMatch = false; if ($ifNoneMatch==='*') $haveMatch = true; else { // There might be multiple etags $ifNoneMatch = explode(',', $ifNoneMatch); $etag = $node->getETag(); foreach($ifNoneMatch as $ifNoneMatchItem) { // Stripping any extra spaces $ifNoneMatchItem = trim($ifNoneMatchItem,' '); if ($etag===$ifNoneMatchItem) $haveMatch = true; } } if ($haveMatch) { if ($handleAsGET) { $this->httpResponse->sendStatus(304); return false; } else { throw new Exception\PreconditionFailed('An If-None-Match header was specified, but the ETag matched (or * was specified).','If-None-Match'); } } } } if (!$ifNoneMatch && ($ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'))) { // The If-Modified-Since header contains a date. We // will only return the entity if it has been changed since // that date. If it hasn't been changed, we return a 304 // header // Note that this header only has to be checked if there was no If-None-Match header // as per the HTTP spec. $date = HTTP\Util::parseHTTPDate($ifModifiedSince); if ($date) { if (is_null($node)) { $node = $this->tree->getNodeForPath($uri); } $lastMod = $node->getLastModified(); if ($lastMod) { $lastMod = new \DateTime('@' . $lastMod); if ($lastMod <= $date) { $this->httpResponse->sendStatus(304); $this->httpResponse->setHeader('Last-Modified', HTTP\Util::toHTTPDate($lastMod)); return false; } } } } if ($ifUnmodifiedSince = $this->httpRequest->getHeader('If-Unmodified-Since')) { // The If-Unmodified-Since will allow allow the request if the // entity has not changed since the specified date. $date = HTTP\Util::parseHTTPDate($ifUnmodifiedSince); // We must only check the date if it's valid if ($date) { if (is_null($node)) { $node = $this->tree->getNodeForPath($uri); } $lastMod = $node->getLastModified(); if ($lastMod) { $lastMod = new \DateTime('@' . $lastMod); if ($lastMod > $date) { throw new Exception\PreconditionFailed('An If-Unmodified-Since header was specified, but the entity has been changed since the specified date.','If-Unmodified-Since'); } } } } return true; } // }}} // {{{ XML Readers & Writers /** * Generates a WebDAV propfind response body based on a list of nodes. * * If 'strip404s' is set to true, all 404 responses will be removed. * * @param array $fileProperties The list with nodes * @param bool strip404s * @return string */ public function generateMultiStatus(array $fileProperties, $strip404s = false) { $dom = new \DOMDocument('1.0','utf-8'); //$dom->formatOutput = true; $multiStatus = $dom->createElement('d:multistatus'); $dom->appendChild($multiStatus); // Adding in default namespaces foreach($this->xmlNamespaces as $namespace=>$prefix) { $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); } foreach($fileProperties as $entry) { $href = $entry['href']; unset($entry['href']); if ($strip404s && isset($entry[404])) { unset($entry[404]); } $response = new Property\Response($href,$entry); $response->serialize($this,$multiStatus); } return $dom->saveXML(); } /** * This method parses a PropPatch request * * PropPatch changes the properties for a resource. This method * returns a list of properties. * * The keys in the returned array contain the property name (e.g.: {DAV:}displayname, * and the value contains the property value. If a property is to be removed the value * will be null. * * @param string $body xml body * @return array list of properties in need of updating or deletion */ public function parsePropPatchRequest($body) { //We'll need to change the DAV namespace declaration to something else in order to make it parsable $dom = XMLUtil::loadDOMDocument($body); $newProperties = array(); foreach($dom->firstChild->childNodes as $child) { if ($child->nodeType !== XML_ELEMENT_NODE) continue; $operation = XMLUtil::toClarkNotation($child); if ($operation!=='{DAV:}set' && $operation!=='{DAV:}remove') continue; $innerProperties = XMLUtil::parseProperties($child, $this->propertyMap); foreach($innerProperties as $propertyName=>$propertyValue) { if ($operation==='{DAV:}remove') { $propertyValue = null; } $newProperties[$propertyName] = $propertyValue; } } return $newProperties; } /** * This method parses the PROPFIND request and returns its information * * This will either be a list of properties, or an empty array; in which case * an {DAV:}allprop was requested. * * @param string $body * @return array */ public function parsePropFindRequest($body) { // If the propfind body was empty, it means IE is requesting 'all' properties if (!$body) return array(); $dom = XMLUtil::loadDOMDocument($body); $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0); return array_keys(XMLUtil::parseProperties($elem)); } // }}} } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/ServerPlugin.php000066400000000000000000000037771361462701300312550ustar00rootroot00000000000000name = $name; foreach($children as $child) { if (!($child instanceof INode)) throw new Exception('Only instances of SabreForRainLoop\DAV\INode are allowed to be passed in the children argument'); $this->addChild($child); } } /** * Adds a new childnode to this collection * * @param INode $child * @return void */ public function addChild(INode $child) { $this->children[$child->getName()] = $child; } /** * Returns the name of the collection * * @return string */ public function getName() { return $this->name; } /** * Returns a child object, by its name. * * This method makes use of the getChildren method to grab all the child nodes, and compares the name. * Generally its wise to override this, as this can usually be optimized * * This method must throw SabreForRainLoop\DAV\Exception\NotFound if the node does not * exist. * * @param string $name * @throws Exception\NotFound * @return INode */ public function getChild($name) { if (isset($this->children[$name])) return $this->children[$name]; throw new Exception\NotFound('File not found: ' . $name . ' in \'' . $this->getName() . '\''); } /** * Returns a list of children for this collection * * @return array */ public function getChildren() { return array_values($this->children); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/SimpleFile.php000066400000000000000000000047271361462701300306550ustar00rootroot00000000000000name = $name; $this->contents = $contents; $this->mimeType = $mimeType; } /** * Returns the node name for this file. * * This name is used to construct the url. * * @return string */ public function getName() { return $this->name; } /** * Returns the data * * This method may either return a string or a readable stream resource * * @return mixed */ public function get() { return $this->contents; } /** * Returns the size of the file, in bytes. * * @return int */ public function getSize() { return strlen($this->contents); } /** * Returns the ETag for a file * * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change. * The ETag is an arbitrary string, but MUST be surrounded by double-quotes. * * Return null if the ETag can not effectively be determined * @return string */ public function getETag() { return '"' . md5($this->contents) . '"'; } /** * Returns the mime-type for a file * * If null is returned, we'll assume application/octet-stream * @return string */ public function getContentType() { return $this->mimeType; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/StringUtil.php000066400000000000000000000053111361462701300307160ustar00rootroot00000000000000dataDir = $dataDir; } /** * Initialize the plugin * * This is called automatically be the Server class after this plugin is * added with SabreForRainLoop\DAV\Server::addPlugin() * * @param Server $server * @return void */ public function initialize(Server $server) { $this->server = $server; $server->subscribeEvent('beforeMethod',array($this,'beforeMethod')); $server->subscribeEvent('beforeCreateFile',array($this,'beforeCreateFile')); } /** * This method is called before any HTTP method handler * * This method intercepts any GET, DELETE, PUT and PROPFIND calls to * filenames that are known to match the 'temporary file' regex. * * @param string $method * @param string $uri * @return bool */ public function beforeMethod($method, $uri) { if (!$tempLocation = $this->isTempFile($uri)) return true; switch($method) { case 'GET' : return $this->httpGet($tempLocation); case 'PUT' : return $this->httpPut($tempLocation); case 'PROPFIND' : return $this->httpPropfind($tempLocation, $uri); case 'DELETE' : return $this->httpDelete($tempLocation); } return true; } /** * This method is invoked if some subsystem creates a new file. * * This is used to deal with HTTP LOCK requests which create a new * file. * * @param string $uri * @param resource $data * @return bool */ public function beforeCreateFile($uri,$data) { if ($tempPath = $this->isTempFile($uri)) { $hR = $this->server->httpResponse; $hR->setHeader('X-Sabre-Temp','true'); file_put_contents($tempPath,$data); return false; } return true; } /** * This method will check if the url matches the temporary file pattern * if it does, it will return an path based on $this->dataDir for the * temporary file storage. * * @param string $path * @return boolean|string */ protected function isTempFile($path) { // We're only interested in the basename. list(, $tempPath) = URLUtil::splitPath($path); foreach($this->temporaryFilePatterns as $tempFile) { if (preg_match($tempFile,$tempPath)) { return $this->getDataDir() . '/sabredav_' . md5($path) . '.tempfile'; } } return false; } /** * This method handles the GET method for temporary files. * If the file doesn't exist, it will return false which will kick in * the regular system for the GET method. * * @param string $tempLocation * @return bool */ public function httpGet($tempLocation) { if (!file_exists($tempLocation)) return true; $hR = $this->server->httpResponse; $hR->setHeader('Content-Type','application/octet-stream'); $hR->setHeader('Content-Length',filesize($tempLocation)); $hR->setHeader('X-Sabre-Temp','true'); $hR->sendStatus(200); $hR->sendBody(fopen($tempLocation,'r')); return false; } /** * This method handles the PUT method. * * @param string $tempLocation * @return bool */ public function httpPut($tempLocation) { $hR = $this->server->httpResponse; $hR->setHeader('X-Sabre-Temp','true'); $newFile = !file_exists($tempLocation); if (!$newFile && ($this->server->httpRequest->getHeader('If-None-Match'))) { throw new Exception\PreconditionFailed('The resource already exists, and an If-None-Match header was supplied'); } file_put_contents($tempLocation,$this->server->httpRequest->getBody()); $hR->sendStatus($newFile?201:200); return false; } /** * This method handles the DELETE method. * * If the file didn't exist, it will return false, which will make the * standard HTTP DELETE handler kick in. * * @param string $tempLocation * @return bool */ public function httpDelete($tempLocation) { if (!file_exists($tempLocation)) return true; unlink($tempLocation); $hR = $this->server->httpResponse; $hR->setHeader('X-Sabre-Temp','true'); $hR->sendStatus(204); return false; } /** * This method handles the PROPFIND method. * * It's a very lazy method, it won't bother checking the request body * for which properties were requested, and just sends back a default * set of properties. * * @param string $tempLocation * @param string $uri * @return bool */ public function httpPropfind($tempLocation, $uri) { if (!file_exists($tempLocation)) return true; $hR = $this->server->httpResponse; $hR->setHeader('X-Sabre-Temp','true'); $hR->sendStatus(207); $hR->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->parsePropFindRequest($this->server->httpRequest->getBody(true)); $properties = array( 'href' => $uri, 200 => array( '{DAV:}getlastmodified' => new Property\GetLastModified(filemtime($tempLocation)), '{DAV:}getcontentlength' => filesize($tempLocation), '{DAV:}resourcetype' => new Property\ResourceType(null), '{'.Server::NS_SABREDAV.'}tempFile' => true, ), ); $data = $this->server->generateMultiStatus(array($properties)); $hR->sendBody($data); return false; } /** * This method returns the directory where the temporary files should be stored. * * @return string */ protected function getDataDir() { return $this->dataDir; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Tree.php000066400000000000000000000116471361462701300275220ustar00rootroot00000000000000getNodeForPath($path); return true; } catch (Exception\NotFound $e) { return false; } } /** * Copies a file from path to another * * @param string $sourcePath The source location * @param string $destinationPath The full destination path * @return void */ public function copy($sourcePath, $destinationPath) { $sourceNode = $this->getNodeForPath($sourcePath); // grab the dirname and basename components list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath); $destinationParent = $this->getNodeForPath($destinationDir); $this->copyNode($sourceNode,$destinationParent,$destinationName); $this->markDirty($destinationDir); } /** * Moves a file from one location to another * * @param string $sourcePath The path to the file which should be moved * @param string $destinationPath The full destination path, so not just the destination parent node * @return int */ public function move($sourcePath, $destinationPath) { list($sourceDir, $sourceName) = URLUtil::splitPath($sourcePath); list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath); if ($sourceDir===$destinationDir) { $renameable = $this->getNodeForPath($sourcePath); $renameable->setName($destinationName); } else { $this->copy($sourcePath,$destinationPath); $this->getNodeForPath($sourcePath)->delete(); } $this->markDirty($sourceDir); $this->markDirty($destinationDir); } /** * Deletes a node from the tree * * @param string $path * @return void */ public function delete($path) { $node = $this->getNodeForPath($path); $node->delete(); list($parent) = URLUtil::splitPath($path); $this->markDirty($parent); } /** * Returns a list of childnodes for a given path. * * @param string $path * @return array */ public function getChildren($path) { $node = $this->getNodeForPath($path); return $node->getChildren(); } /** * This method is called with every tree update * * Examples of tree updates are: * * node deletions * * node creations * * copy * * move * * renaming nodes * * If Tree classes implement a form of caching, this will allow * them to make sure caches will be expired. * * If a path is passed, it is assumed that the entire subtree is dirty * * @param string $path * @return void */ public function markDirty($path) { } /** * copyNode * * @param INode $source * @param ICollection $destinationParent * @param string $destinationName * @return void */ protected function copyNode(INode $source,ICollection $destinationParent,$destinationName = null) { if (!$destinationName) $destinationName = $source->getName(); if ($source instanceof IFile) { $data = $source->get(); // If the body was a string, we need to convert it to a stream if (is_string($data)) { $stream = fopen('php://temp','r+'); fwrite($stream,$data); rewind($stream); $data = $stream; } $destinationParent->createFile($destinationName,$data); $destination = $destinationParent->getChild($destinationName); } elseif ($source instanceof ICollection) { $destinationParent->createDirectory($destinationName); $destination = $destinationParent->getChild($destinationName); foreach($source->getChildren() as $child) { $this->copyNode($child,$destination); } } if ($source instanceof IProperties && $destination instanceof IProperties) { $props = $source->getProperties(array()); $destination->updateProperties($props); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Tree/000077500000000000000000000000001361462701300270005ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/Tree/Filesystem.php000066400000000000000000000061061361462701300316400ustar00rootroot00000000000000basePath = $basePath; } /** * Returns a new node for the given path * * @param string $path * @return DAV\FS\Node */ public function getNodeForPath($path) { $realPath = $this->getRealPath($path); if (!file_exists($realPath)) { throw new DAV\Exception\NotFound('File at location ' . $realPath . ' not found'); } if (is_dir($realPath)) { return new DAV\FS\Directory($realPath); } else { return new DAV\FS\File($realPath); } } /** * Returns the real filesystem path for a webdav url. * * @param string $publicPath * @return string */ protected function getRealPath($publicPath) { return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/'); } /** * Copies a file or directory. * * This method must work recursively and delete the destination * if it exists * * @param string $source * @param string $destination * @return void */ public function copy($source,$destination) { $source = $this->getRealPath($source); $destination = $this->getRealPath($destination); $this->realCopy($source,$destination); } /** * Used by self::copy * * @param string $source * @param string $destination * @return void */ protected function realCopy($source,$destination) { if (is_file($source)) { copy($source,$destination); } else { mkdir($destination); foreach(scandir($source) as $subnode) { if ($subnode=='.' || $subnode=='..') continue; $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode); } } } /** * Moves a file or directory recursively. * * If the destination exists, delete it first. * * @param string $source * @param string $destination * @return void */ public function move($source,$destination) { $source = $this->getRealPath($source); $destination = $this->getRealPath($destination); rename($source,$destination); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAV/URLUtil.php000066400000000000000000000060771361462701300301240ustar00rootroot00000000000000 * will be returned as: * {http://www.example.org}myelem * * This format is used throughout the SabreDAV sourcecode. * Elements encoded with the urn:DAV namespace will * be returned as if they were in the DAV: namespace. This is to avoid * compatibility problems. * * This function will return null if a nodetype other than an Element is passed. * * @param \DOMNode $dom * @return string */ static function toClarkNotation(\DOMNode $dom) { if ($dom->nodeType !== XML_ELEMENT_NODE) return null; // Mapping back to the real namespace, in case it was dav if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI; // Mapping to clark notation return '{' . $ns . '}' . $dom->localName; } /** * Parses a clark-notation string, and returns the namespace and element * name components. * * If the string was invalid, it will throw an InvalidArgumentException. * * @param string $str * @throws InvalidArgumentException * @return array */ static function parseClarkNotation($str) { if (!preg_match('/^{([^}]*)}(.*)$/',$str,$matches)) { throw new \InvalidArgumentException('\'' . $str . '\' is not a valid clark-notation formatted string'); } return array( $matches[1], $matches[2] ); } /** * This method takes an XML document (as string) and converts all instances of the * DAV: namespace to urn:DAV * * This is unfortunately needed, because the DAV: namespace violates the xml namespaces * spec, and causes the DOM to throw errors * * @param string $xmlDocument * @return array|string|null */ static function convertDAVNamespace($xmlDocument) { // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV: // namespace is actually a violation of the XML namespaces specification, and will cause errors return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument); } /** * This method provides a generic way to load a DOMDocument for WebDAV use. * * This method throws a SabreForRainLoop\DAV\Exception\BadRequest exception for any xml errors. * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV. * * @param string $xml * @throws SabreForRainLoop\DAV\Exception\BadRequest * @return DOMDocument */ static function loadDOMDocument($xml) { if (empty($xml)) throw new Exception\BadRequest('Empty XML document sent'); // The BitKinex client sends xml documents as UTF-16. PHP 5.3.1 (and presumably lower) // does not support this, so we must intercept this and convert to UTF-8. if (substr($xml,0,12) === "\x3c\x00\x3f\x00\x78\x00\x6d\x00\x6c\x00\x20\x00") { // Note: the preceeding byte sequence is "]*)encoding="UTF-16"([^>]*)>|u','',$xml); } // Retaining old error setting $oldErrorSetting = libxml_use_internal_errors(true); // Clearing any previous errors libxml_clear_errors(); $dom = new \DOMDocument(); // We don't generally care about any whitespace $dom->preserveWhiteSpace = false; $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR); if ($error = libxml_get_last_error()) { libxml_clear_errors(); throw new Exception\BadRequest('The request body had an invalid XML body. (message: ' . $error->message . ', errorcode: ' . $error->code . ', line: ' . $error->line . ')'); } // Restoring old mechanism for error handling if ($oldErrorSetting===false) libxml_use_internal_errors(false); return $dom; } /** * Parses all WebDAV properties out of a DOM Element * * Generally WebDAV properties are enclosed in {DAV:}prop elements. This * method helps by going through all these and pulling out the actual * propertynames, making them array keys and making the property values, * well.. the array values. * * If no value was given (self-closing element) null will be used as the * value. This is used in for example PROPFIND requests. * * Complex values are supported through the propertyMap argument. The * propertyMap should have the clark-notation properties as it's keys, and * classnames as values. * * When any of these properties are found, the unserialize() method will be * (statically) called. The result of this method is used as the value. * * @param \DOMElement $parentNode * @param array $propertyMap * @return array */ static function parseProperties(\DOMElement $parentNode, array $propertyMap = array()) { $propList = array(); foreach($parentNode->childNodes as $propNode) { if (self::toClarkNotation($propNode)!=='{DAV:}prop') continue; foreach($propNode->childNodes as $propNodeData) { /* If there are no elements in here, we actually get 1 text node, this special case is dedicated to netdrive */ if ($propNodeData->nodeType != XML_ELEMENT_NODE) continue; $propertyName = self::toClarkNotation($propNodeData); if (isset($propertyMap[$propertyName])) { $propList[$propertyName] = call_user_func(array($propertyMap[$propertyName],'unserialize'),$propNodeData); } else { $propList[$propertyName] = $propNodeData->textContent; } } } return $propList; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/000077500000000000000000000000001361462701300264215ustar00rootroot00000000000000AbstractPrincipalCollection.php000066400000000000000000000105561361462701300345030ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACLprincipalPrefix = $principalPrefix; $this->principalBackend = $principalBackend; } /** * This method returns a node for a principal. * * The passed array contains principal information, and is guaranteed to * at least contain a uri item. Other properties may or may not be * supplied by the authentication backend. * * @param array $principalInfo * @return IPrincipal */ abstract function getChildForPrincipal(array $principalInfo); /** * Returns the name of this collection. * * @return string */ public function getName() { list(,$name) = DAV\URLUtil::splitPath($this->principalPrefix); return $name; } /** * Return the list of users * * @return array */ public function getChildren() { if ($this->disableListing) throw new DAV\Exception\MethodNotAllowed('Listing members of this collection is disabled'); $children = array(); foreach($this->principalBackend->getPrincipalsByPrefix($this->principalPrefix) as $principalInfo) { $children[] = $this->getChildForPrincipal($principalInfo); } return $children; } /** * Returns a child object, by its name. * * @param string $name * @throws DAV\Exception\NotFound * @return IPrincipal */ public function getChild($name) { $principalInfo = $this->principalBackend->getPrincipalByPath($this->principalPrefix . '/' . $name); if (!$principalInfo) throw new DAV\Exception\NotFound('Principal with name ' . $name . ' not found'); return $this->getChildForPrincipal($principalInfo); } /** * This method is used to search for principals matching a set of * properties. * * This search is specifically used by RFC3744's principal-property-search * REPORT. You should at least allow searching on * http://sabredav.org/ns}email-address. * * The actual search should be a unicode-non-case-sensitive search. The * keys in searchProperties are the WebDAV property names, while the values * are the property values to search on. * * If multiple properties are being searched on, the search should be * AND'ed. * * This method should simply return a list of 'child names', which may be * used to call $this->getChild in the future. * * @param array $searchProperties * @return array */ public function searchPrincipals(array $searchProperties) { $result = $this->principalBackend->searchPrincipals($this->principalPrefix, $searchProperties); $r = array(); foreach($result as $row) { list(, $r[]) = DAV\URLUtil::splitPath($row); } return $r; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Exception/000077500000000000000000000000001361462701300303575ustar00rootroot00000000000000AceConflict.php000066400000000000000000000016161361462701300331670ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/ExceptionownerDocument; $np = $doc->createElementNS('DAV:','d:no-ace-conflict'); $errorNode->appendChild($np); } } NeedPrivileges.php000066400000000000000000000040711361462701300337200ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Exceptionuri = $uri; $this->privileges = $privileges; parent::__construct('User did not have the required privileges (' . implode(',', $privileges) . ') for path "' . $uri . '"'); } /** * Adds in extra information in the xml response. * * This method adds the {DAV:}need-privileges element as defined in rfc3744 * * @param DAV\Server $server * @param \DOMElement $errorNode * @return void */ public function serialize(DAV\Server $server,\DOMElement $errorNode) { $doc = $errorNode->ownerDocument; $np = $doc->createElementNS('DAV:','d:need-privileges'); $errorNode->appendChild($np); foreach($this->privileges as $privilege) { $resource = $doc->createElementNS('DAV:','d:resource'); $np->appendChild($resource); $resource->appendChild($doc->createElementNS('DAV:','d:href',$server->getBaseUri() . $this->uri)); $priv = $doc->createElementNS('DAV:','d:privilege'); $resource->appendChild($priv); preg_match('/^{([^}]*)}(.*)$/',$privilege,$privilegeParts); $priv->appendChild($doc->createElementNS($privilegeParts[1],'d:' . $privilegeParts[2])); } } } NoAbstract.php000066400000000000000000000016301361462701300330510ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/ExceptionownerDocument; $np = $doc->createElementNS('DAV:','d:no-abstract'); $errorNode->appendChild($np); } } NotRecognizedPrincipal.php000066400000000000000000000017071361462701300354320ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/ExceptionownerDocument; $np = $doc->createElementNS('DAV:','d:recognized-principal'); $errorNode->appendChild($np); } } NotSupportedPrivilege.php000066400000000000000000000016721361462701300353340ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/ExceptionownerDocument; $np = $doc->createElementNS('DAV:','d:not-supported-privilege'); $errorNode->appendChild($np); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/IACL.php000066400000000000000000000036131361462701300276450ustar00rootroot00000000000000getChild in the future. * * @param array $searchProperties * @return array */ function searchPrincipals(array $searchProperties); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Plugin.php000066400000000000000000001264301361462701300303760ustar00rootroot00000000000000 'Display name', '{http://sabredav.org/ns}email-address' => 'Email address', ); /** * Any principal uri's added here, will automatically be added to the list * of ACL's. They will effectively receive {DAV:}all privileges, as a * protected privilege. * * @var array */ public $adminPrincipals = array(); /** * Returns a list of features added by this plugin. * * This list is used in the response of a HTTP OPTIONS request. * * @return array */ public function getFeatures() { return array('access-control', 'calendarserver-principal-property-search'); } /** * Returns a list of available methods for a given url * * @param string $uri * @return array */ public function getMethods($uri) { return array('ACL'); } /** * Returns a plugin name. * * Using this name other plugins will be able to access other plugins * using SabreForRainLoop\DAV\Server::getPlugin * * @return string */ public function getPluginName() { return 'acl'; } /** * Returns a list of reports this plugin supports. * * This will be used in the {DAV:}supported-report-set property. * Note that you still need to subscribe to the 'report' event to actually * implement them * * @param string $uri * @return array */ public function getSupportedReportSet($uri) { return array( '{DAV:}expand-property', '{DAV:}principal-property-search', '{DAV:}principal-search-property-set', ); } /** * Checks if the current user has the specified privilege(s). * * You can specify a single privilege, or a list of privileges. * This method will throw an exception if the privilege is not available * and return true otherwise. * * @param string $uri * @param array|string $privileges * @param int $recursion * @param bool $throwExceptions if set to false, this method won't throw exceptions. * @throws SabreForRainLoop\DAVACL\Exception\NeedPrivileges * @return bool */ public function checkPrivileges($uri, $privileges, $recursion = self::R_PARENT, $throwExceptions = true) { if (!is_array($privileges)) $privileges = array($privileges); $acl = $this->getCurrentUserPrivilegeSet($uri); if (is_null($acl)) { if ($this->allowAccessToNodesWithoutACL) { return true; } else { if ($throwExceptions) throw new Exception\NeedPrivileges($uri,$privileges); else return false; } } $failed = array(); foreach($privileges as $priv) { if (!in_array($priv, $acl)) { $failed[] = $priv; } } if ($failed) { if ($throwExceptions) throw new Exception\NeedPrivileges($uri,$failed); else return false; } return true; } /** * Returns the standard users' principal. * * This is one authorative principal url for the current user. * This method will return null if the user wasn't logged in. * * @return string|null */ public function getCurrentUserPrincipal() { $authPlugin = $this->server->getPlugin('auth'); if (is_null($authPlugin)) return null; /** @var $authPlugin SabreForRainLoop\DAV\Auth\Plugin */ $userName = $authPlugin->getCurrentUser(); if (!$userName) return null; return $this->defaultUsernamePath . '/' . $userName; } /** * Returns a list of principals that's associated to the current * user, either directly or through group membership. * * @return array */ public function getCurrentUserPrincipals() { $currentUser = $this->getCurrentUserPrincipal(); if (is_null($currentUser)) return array(); return array_merge( array($currentUser), $this->getPrincipalMembership($currentUser) ); } /** * This array holds a cache for all the principals that are associated with * a single principal. * * @var array */ protected $principalMembershipCache = array(); /** * Returns all the principal groups the specified principal is a member of. * * @param string $principal * @return array */ public function getPrincipalMembership($mainPrincipal) { // First check our cache if (isset($this->principalMembershipCache[$mainPrincipal])) { return $this->principalMembershipCache[$mainPrincipal]; } $check = array($mainPrincipal); $principals = array(); while(count($check)) { $principal = array_shift($check); $node = $this->server->tree->getNodeForPath($principal); if ($node instanceof IPrincipal) { foreach($node->getGroupMembership() as $groupMember) { if (!in_array($groupMember, $principals)) { $check[] = $groupMember; $principals[] = $groupMember; } } } } // Store the result in the cache $this->principalMembershipCache[$mainPrincipal] = $principals; return $principals; } /** * Returns the supported privilege structure for this ACL plugin. * * See RFC3744 for more details. Currently we default on a simple, * standard structure. * * You can either get the list of privileges by a uri (path) or by * specifying a Node. * * @param string|DAV\INode $node * @return array */ public function getSupportedPrivilegeSet($node) { if (is_string($node)) { $node = $this->server->tree->getNodeForPath($node); } if ($node instanceof IACL) { $result = $node->getSupportedPrivilegeSet(); if ($result) return $result; } return self::getDefaultSupportedPrivilegeSet(); } /** * Returns a fairly standard set of privileges, which may be useful for * other systems to use as a basis. * * @return array */ static function getDefaultSupportedPrivilegeSet() { return array( 'privilege' => '{DAV:}all', 'abstract' => true, 'aggregates' => array( array( 'privilege' => '{DAV:}read', 'aggregates' => array( array( 'privilege' => '{DAV:}read-acl', 'abstract' => true, ), array( 'privilege' => '{DAV:}read-current-user-privilege-set', 'abstract' => true, ), ), ), // {DAV:}read array( 'privilege' => '{DAV:}write', 'aggregates' => array( array( 'privilege' => '{DAV:}write-acl', 'abstract' => true, ), array( 'privilege' => '{DAV:}write-properties', 'abstract' => true, ), array( 'privilege' => '{DAV:}write-content', 'abstract' => true, ), array( 'privilege' => '{DAV:}bind', 'abstract' => true, ), array( 'privilege' => '{DAV:}unbind', 'abstract' => true, ), array( 'privilege' => '{DAV:}unlock', 'abstract' => true, ), ), ), // {DAV:}write ), ); // {DAV:}all } /** * Returns the supported privilege set as a flat list * * This is much easier to parse. * * The returned list will be index by privilege name. * The value is a struct containing the following properties: * - aggregates * - abstract * - concrete * * @param string|DAV\INode $node * @return array */ final public function getFlatPrivilegeSet($node) { $privs = $this->getSupportedPrivilegeSet($node); $flat = array(); $this->getFPSTraverse($privs, null, $flat); return $flat; } /** * Traverses the privilege set tree for reordering * * This function is solely used by getFlatPrivilegeSet, and would have been * a closure if it wasn't for the fact I need to support PHP 5.2. * * @param array $priv * @param $concrete * @param array $flat * @return void */ final private function getFPSTraverse($priv, $concrete, &$flat) { $myPriv = array( 'privilege' => $priv['privilege'], 'abstract' => isset($priv['abstract']) && $priv['abstract'], 'aggregates' => array(), 'concrete' => isset($priv['abstract']) && $priv['abstract']?$concrete:$priv['privilege'], ); if (isset($priv['aggregates'])) foreach($priv['aggregates'] as $subPriv) $myPriv['aggregates'][] = $subPriv['privilege']; $flat[$priv['privilege']] = $myPriv; if (isset($priv['aggregates'])) { foreach($priv['aggregates'] as $subPriv) { $this->getFPSTraverse($subPriv, $myPriv['concrete'], $flat); } } } /** * Returns the full ACL list. * * Either a uri or a DAV\INode may be passed. * * null will be returned if the node doesn't support ACLs. * * @param string|DAV\INode $node * @return array */ public function getACL($node) { if (is_string($node)) { $node = $this->server->tree->getNodeForPath($node); } if (!$node instanceof IACL) { return null; } $acl = $node->getACL(); foreach($this->adminPrincipals as $adminPrincipal) { $acl[] = array( 'principal' => $adminPrincipal, 'privilege' => '{DAV:}all', 'protected' => true, ); } return $acl; } /** * Returns a list of privileges the current user has * on a particular node. * * Either a uri or a DAV\INode may be passed. * * null will be returned if the node doesn't support ACLs. * * @param string|DAV\INode $node * @return array */ public function getCurrentUserPrivilegeSet($node) { if (is_string($node)) { $node = $this->server->tree->getNodeForPath($node); } $acl = $this->getACL($node); if (is_null($acl)) return null; $principals = $this->getCurrentUserPrincipals(); $collected = array(); foreach($acl as $ace) { $principal = $ace['principal']; switch($principal) { case '{DAV:}owner' : $owner = $node->getOwner(); if ($owner && in_array($owner, $principals)) { $collected[] = $ace; } break; // 'all' matches for every user case '{DAV:}all' : // 'authenticated' matched for every user that's logged in. // Since it's not possible to use ACL while not being logged // in, this is also always true. case '{DAV:}authenticated' : $collected[] = $ace; break; // 'unauthenticated' can never occur either, so we simply // ignore these. case '{DAV:}unauthenticated' : break; default : if (in_array($ace['principal'], $principals)) { $collected[] = $ace; } break; } } // Now we deduct all aggregated privileges. $flat = $this->getFlatPrivilegeSet($node); $collected2 = array(); while(count($collected)) { $current = array_pop($collected); $collected2[] = $current['privilege']; foreach($flat[$current['privilege']]['aggregates'] as $subPriv) { $collected2[] = $subPriv; $collected[] = $flat[$subPriv]; } } return array_values(array_unique($collected2)); } /** * Principal property search * * This method can search for principals matching certain values in * properties. * * This method will return a list of properties for the matched properties. * * @param array $searchProperties The properties to search on. This is a * key-value list. The keys are property * names, and the values the strings to * match them on. * @param array $requestedProperties This is the list of properties to * return for every match. * @param string $collectionUri The principal collection to search on. * If this is ommitted, the standard * principal collection-set will be used. * @return array This method returns an array structure similar to * SabreForRainLoop\DAV\Server::getPropertiesForPath. Returned * properties are index by a HTTP status code. * */ public function principalSearch(array $searchProperties, array $requestedProperties, $collectionUri = null) { if (!is_null($collectionUri)) { $uris = array($collectionUri); } else { $uris = $this->principalCollectionSet; } $lookupResults = array(); foreach($uris as $uri) { $principalCollection = $this->server->tree->getNodeForPath($uri); if (!$principalCollection instanceof IPrincipalCollection) { // Not a principal collection, we're simply going to ignore // this. continue; } $results = $principalCollection->searchPrincipals($searchProperties); foreach($results as $result) { $lookupResults[] = rtrim($uri,'/') . '/' . $result; } } $matches = array(); foreach($lookupResults as $lookupResult) { list($matches[]) = $this->server->getPropertiesForPath($lookupResult, $requestedProperties, 0); } return $matches; } /** * Sets up the plugin * * This method is automatically called by the server class. * * @param DAV\Server $server * @return void */ public function initialize(DAV\Server $server) { $this->server = $server; $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties')); $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'),20); $server->subscribeEvent('beforeBind', array($this,'beforeBind'),20); $server->subscribeEvent('beforeUnbind', array($this,'beforeUnbind'),20); $server->subscribeEvent('updateProperties',array($this,'updateProperties')); $server->subscribeEvent('beforeUnlock', array($this,'beforeUnlock'),20); $server->subscribeEvent('report',array($this,'report')); $server->subscribeEvent('unknownMethod', array($this, 'unknownMethod')); array_push($server->protectedProperties, '{DAV:}alternate-URI-set', '{DAV:}principal-URL', '{DAV:}group-membership', '{DAV:}principal-collection-set', '{DAV:}current-user-principal', '{DAV:}supported-privilege-set', '{DAV:}current-user-privilege-set', '{DAV:}acl', '{DAV:}acl-restrictions', '{DAV:}inherited-acl-set', '{DAV:}owner', '{DAV:}group' ); // Automatically mapping nodes implementing IPrincipal to the // {DAV:}principal resourcetype. $server->resourceTypeMapping['SabreForRainLoop\\DAVACL\\IPrincipal'] = '{DAV:}principal'; // Mapping the group-member-set property to the HrefList property // class. $server->propertyMap['{DAV:}group-member-set'] = 'SabreForRainLoop\\DAV\\Property\\HrefList'; } /* {{{ Event handlers */ /** * Triggered before any method is handled * * @param string $method * @param string $uri * @return void */ public function beforeMethod($method, $uri) { $exists = $this->server->tree->nodeExists($uri); // If the node doesn't exists, none of these checks apply if (!$exists) return; switch($method) { case 'GET' : case 'HEAD' : case 'OPTIONS' : // For these 3 we only need to know if the node is readable. $this->checkPrivileges($uri,'{DAV:}read'); break; case 'PUT' : case 'LOCK' : case 'UNLOCK' : // This method requires the write-content priv if the node // already exists, and bind on the parent if the node is being // created. // The bind privilege is handled in the beforeBind event. $this->checkPrivileges($uri,'{DAV:}write-content'); break; case 'PROPPATCH' : $this->checkPrivileges($uri,'{DAV:}write-properties'); break; case 'ACL' : $this->checkPrivileges($uri,'{DAV:}write-acl'); break; case 'COPY' : case 'MOVE' : // Copy requires read privileges on the entire source tree. // If the target exists write-content normally needs to be // checked, however, we're deleting the node beforehand and // creating a new one after, so this is handled by the // beforeUnbind event. // // The creation of the new node is handled by the beforeBind // event. // // If MOVE is used beforeUnbind will also be used to check if // the sourcenode can be deleted. $this->checkPrivileges($uri,'{DAV:}read',self::R_RECURSIVE); break; } } /** * Triggered before a new node is created. * * This allows us to check permissions for any operation that creates a * new node, such as PUT, MKCOL, MKCALENDAR, LOCK, COPY and MOVE. * * @param string $uri * @return void */ public function beforeBind($uri) { list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri); $this->checkPrivileges($parentUri,'{DAV:}bind'); } /** * Triggered before a node is deleted * * This allows us to check permissions for any operation that will delete * an existing node. * * @param string $uri * @return void */ public function beforeUnbind($uri) { list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri); $this->checkPrivileges($parentUri,'{DAV:}unbind',self::R_RECURSIVEPARENTS); } /** * Triggered before a node is unlocked. * * @param string $uri * @param DAV\Locks\LockInfo $lock * @TODO: not yet implemented * @return void */ public function beforeUnlock($uri, DAV\Locks\LockInfo $lock) { } /** * Triggered before properties are looked up in specific nodes. * * @param string $uri * @param DAV\INode $node * @param array $requestedProperties * @param array $returnedProperties * @TODO really should be broken into multiple methods, or even a class. * @return bool */ public function beforeGetProperties($uri, DAV\INode $node, &$requestedProperties, &$returnedProperties) { // Checking the read permission if (!$this->checkPrivileges($uri,'{DAV:}read',self::R_PARENT,false)) { // User is not allowed to read properties if ($this->hideNodesFromListings) { return false; } // Marking all requested properties as '403'. foreach($requestedProperties as $key=>$requestedProperty) { unset($requestedProperties[$key]); $returnedProperties[403][$requestedProperty] = null; } return; } /* Adding principal properties */ if ($node instanceof IPrincipal) { if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}alternate-URI-set'] = new DAV\Property\HrefList($node->getAlternateUriSet()); } if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}principal-URL'] = new DAV\Property\Href($node->getPrincipalUrl() . '/'); } if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}group-member-set'] = new DAV\Property\HrefList($node->getGroupMemberSet()); } if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}group-membership'] = new DAV\Property\HrefList($node->getGroupMembership()); } if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) { $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName(); } } if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) { unset($requestedProperties[$index]); $val = $this->principalCollectionSet; // Ensuring all collections end with a slash foreach($val as $k=>$v) $val[$k] = $v . '/'; $returnedProperties[200]['{DAV:}principal-collection-set'] = new DAV\Property\HrefList($val); } if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) { unset($requestedProperties[$index]); if ($url = $this->getCurrentUserPrincipal()) { $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::HREF, $url . '/'); } else { $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::UNAUTHENTICATED); } } if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Property\SupportedPrivilegeSet($this->getSupportedPrivilegeSet($node)); } if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) { if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) { $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null; unset($requestedProperties[$index]); } else { $val = $this->getCurrentUserPrivilegeSet($node); if (!is_null($val)) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Property\CurrentUserPrivilegeSet($val); } } } /* The ACL property contains all the permissions */ if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) { if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) { unset($requestedProperties[$index]); $returnedProperties[403]['{DAV:}acl'] = null; } else { $acl = $this->getACL($node); if (!is_null($acl)) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}acl'] = new Property\Acl($this->getACL($node)); } } } /* The acl-restrictions property contains information on how privileges * must behave. */ if (false !== ($index = array_search('{DAV:}acl-restrictions', $requestedProperties))) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}acl-restrictions'] = new Property\AclRestrictions(); } /* Adding ACL properties */ if ($node instanceof IACL) { if (false !== ($index = array_search('{DAV:}owner', $requestedProperties))) { unset($requestedProperties[$index]); $returnedProperties[200]['{DAV:}owner'] = new DAV\Property\Href($node->getOwner() . '/'); } } } /** * This method intercepts PROPPATCH methods and make sure the * group-member-set is updated correctly. * * @param array $propertyDelta * @param array $result * @param DAV\INode $node * @return bool */ public function updateProperties(&$propertyDelta, &$result, DAV\INode $node) { if (!array_key_exists('{DAV:}group-member-set', $propertyDelta)) return; if (is_null($propertyDelta['{DAV:}group-member-set'])) { $memberSet = array(); } elseif ($propertyDelta['{DAV:}group-member-set'] instanceof DAV\Property\HrefList) { $memberSet = array_map( array($this->server,'calculateUri'), $propertyDelta['{DAV:}group-member-set']->getHrefs() ); } else { throw new DAV\Exception('The group-member-set property MUST be an instance of SabreForRainLoop\DAV\Property\HrefList or null'); } if (!($node instanceof IPrincipal)) { $result[403]['{DAV:}group-member-set'] = null; unset($propertyDelta['{DAV:}group-member-set']); // Returning false will stop the updateProperties process return false; } $node->setGroupMemberSet($memberSet); // We must also clear our cache, just in case $this->principalMembershipCache = array(); $result[200]['{DAV:}group-member-set'] = null; unset($propertyDelta['{DAV:}group-member-set']); } /** * This method handles HTTP REPORT requests * * @param string $reportName * @param \DOMNode $dom * @return bool */ public function report($reportName, $dom) { switch($reportName) { case '{DAV:}principal-property-search' : $this->principalPropertySearchReport($dom); return false; case '{DAV:}principal-search-property-set' : $this->principalSearchPropertySetReport($dom); return false; case '{DAV:}expand-property' : $this->expandPropertyReport($dom); return false; } } /** * This event is triggered for any HTTP method that is not known by the * webserver. * * @param string $method * @param string $uri * @return bool */ public function unknownMethod($method, $uri) { if ($method!=='ACL') return; $this->httpACL($uri); return false; } /** * This method is responsible for handling the 'ACL' event. * * @param string $uri * @return void */ public function httpACL($uri) { $body = $this->server->httpRequest->getBody(true); $dom = DAV\XMLUtil::loadDOMDocument($body); $newAcl = Property\Acl::unserialize($dom->firstChild) ->getPrivileges(); // Normalizing urls foreach($newAcl as $k=>$newAce) { $newAcl[$k]['principal'] = $this->server->calculateUri($newAce['principal']); } $node = $this->server->tree->getNodeForPath($uri); if (!($node instanceof IACL)) { throw new DAV\Exception\MethodNotAllowed('This node does not support the ACL method'); } $oldAcl = $this->getACL($node); $supportedPrivileges = $this->getFlatPrivilegeSet($node); /* Checking if protected principals from the existing principal set are not overwritten. */ foreach($oldAcl as $oldAce) { if (!isset($oldAce['protected']) || !$oldAce['protected']) continue; $found = false; foreach($newAcl as $newAce) { if ( $newAce['privilege'] === $oldAce['privilege'] && $newAce['principal'] === $oldAce['principal'] && $newAce['protected'] ) $found = true; } if (!$found) throw new Exception\AceConflict('This resource contained a protected {DAV:}ace, but this privilege did not occur in the ACL request'); } foreach($newAcl as $newAce) { // Do we recognize the privilege if (!isset($supportedPrivileges[$newAce['privilege']])) { throw new Exception\NotSupportedPrivilege('The privilege you specified (' . $newAce['privilege'] . ') is not recognized by this server'); } if ($supportedPrivileges[$newAce['privilege']]['abstract']) { throw new Exception\NoAbstract('The privilege you specified (' . $newAce['privilege'] . ') is an abstract privilege'); } // Looking up the principal try { $principal = $this->server->tree->getNodeForPath($newAce['principal']); } catch (DAV\Exception\NotFound $e) { throw new Exception\NotRecognizedPrincipal('The specified principal (' . $newAce['principal'] . ') does not exist'); } if (!($principal instanceof IPrincipal)) { throw new Exception\NotRecognizedPrincipal('The specified uri (' . $newAce['principal'] . ') is not a principal'); } } $node->setACL($newAcl); } /* }}} */ /* Reports {{{ */ /** * The expand-property report is defined in RFC3253 section 3-8. * * This report is very similar to a standard PROPFIND. The difference is * that it has the additional ability to look at properties containing a * {DAV:}href element, follow that property and grab additional elements * there. * * Other rfc's, such as ACL rely on this report, so it made sense to put * it in this plugin. * * @param \DOMElement $dom * @return void */ protected function expandPropertyReport($dom) { $requestedProperties = $this->parseExpandPropertyReportRequest($dom->firstChild->firstChild); $depth = $this->server->getHTTPDepth(0); $requestUri = $this->server->getRequestUri(); $result = $this->expandProperties($requestUri,$requestedProperties,$depth); $dom = new \DOMDocument('1.0','utf-8'); $dom->formatOutput = true; $multiStatus = $dom->createElement('d:multistatus'); $dom->appendChild($multiStatus); // Adding in default namespaces foreach($this->server->xmlNamespaces as $namespace=>$prefix) { $multiStatus->setAttribute('xmlns:' . $prefix,$namespace); } foreach($result as $response) { $response->serialize($this->server, $multiStatus); } $xml = $dom->saveXML(); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->sendBody($xml); } /** * This method is used by expandPropertyReport to parse * out the entire HTTP request. * * @param \DOMElement $node * @return array */ protected function parseExpandPropertyReportRequest($node) { $requestedProperties = array(); do { if (DAV\XMLUtil::toClarkNotation($node)!=='{DAV:}property') continue; if ($node->firstChild) { $children = $this->parseExpandPropertyReportRequest($node->firstChild); } else { $children = array(); } $namespace = $node->getAttribute('namespace'); if (!$namespace) $namespace = 'DAV:'; $propName = '{'.$namespace.'}' . $node->getAttribute('name'); $requestedProperties[$propName] = $children; } while ($node = $node->nextSibling); return $requestedProperties; } /** * This method expands all the properties and returns * a list with property values * * @param array $path * @param array $requestedProperties the list of required properties * @param int $depth * @return array */ protected function expandProperties($path, array $requestedProperties, $depth) { $foundProperties = $this->server->getPropertiesForPath($path, array_keys($requestedProperties), $depth); $result = array(); foreach($foundProperties as $node) { foreach($requestedProperties as $propertyName=>$childRequestedProperties) { // We're only traversing if sub-properties were requested if(count($childRequestedProperties)===0) continue; // We only have to do the expansion if the property was found // and it contains an href element. if (!array_key_exists($propertyName,$node[200])) continue; if ($node[200][$propertyName] instanceof DAV\Property\IHref) { $hrefs = array($node[200][$propertyName]->getHref()); } elseif ($node[200][$propertyName] instanceof DAV\Property\HrefList) { $hrefs = $node[200][$propertyName]->getHrefs(); } $childProps = array(); foreach($hrefs as $href) { $childProps = array_merge($childProps, $this->expandProperties($href, $childRequestedProperties, 0)); } $node[200][$propertyName] = new DAV\Property\ResponseList($childProps); } $result[] = new DAV\Property\Response($node['href'], $node); } return $result; } /** * principalSearchPropertySetReport * * This method responsible for handing the * {DAV:}principal-search-property-set report. This report returns a list * of properties the client may search on, using the * {DAV:}principal-property-search report. * * @param \DOMDocument $dom * @return void */ protected function principalSearchPropertySetReport(\DOMDocument $dom) { $httpDepth = $this->server->getHTTPDepth(0); if ($httpDepth!==0) { throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0'); } if ($dom->firstChild->hasChildNodes()) throw new DAV\Exception\BadRequest('The principal-search-property-set report element is not allowed to have child elements'); $dom = new \DOMDocument('1.0','utf-8'); $dom->formatOutput = true; $root = $dom->createElement('d:principal-search-property-set'); $dom->appendChild($root); // Adding in default namespaces foreach($this->server->xmlNamespaces as $namespace=>$prefix) { $root->setAttribute('xmlns:' . $prefix,$namespace); } $nsList = $this->server->xmlNamespaces; foreach($this->principalSearchPropertySet as $propertyName=>$description) { $psp = $dom->createElement('d:principal-search-property'); $root->appendChild($psp); $prop = $dom->createElement('d:prop'); $psp->appendChild($prop); $propName = null; preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName); $currentProperty = $dom->createElement($nsList[$propName[1]] . ':' . $propName[2]); $prop->appendChild($currentProperty); $descriptionElem = $dom->createElement('d:description'); $descriptionElem->setAttribute('xml:lang','en'); $descriptionElem->appendChild($dom->createTextNode($description)); $psp->appendChild($descriptionElem); } $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->sendStatus(200); $this->server->httpResponse->sendBody($dom->saveXML()); } /** * principalPropertySearchReport * * This method is responsible for handing the * {DAV:}principal-property-search report. This report can be used for * clients to search for groups of principals, based on the value of one * or more properties. * * @param \DOMDocument $dom * @return void */ protected function principalPropertySearchReport(\DOMDocument $dom) { list($searchProperties, $requestedProperties, $applyToPrincipalCollectionSet) = $this->parsePrincipalPropertySearchReportRequest($dom); $uri = null; if (!$applyToPrincipalCollectionSet) { $uri = $this->server->getRequestUri(); } $result = $this->principalSearch($searchProperties, $requestedProperties, $uri); $prefer = $this->server->getHTTPPRefer(); $this->server->httpResponse->sendStatus(207); $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8'); $this->server->httpResponse->setHeader('Vary','Brief,Prefer'); $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal'])); } /** * parsePrincipalPropertySearchReportRequest * * This method parses the request body from a * {DAV:}principal-property-search report. * * This method returns an array with two elements: * 1. an array with properties to search on, and their values * 2. a list of propertyvalues that should be returned for the request. * * @param \DOMDocument $dom * @return array */ protected function parsePrincipalPropertySearchReportRequest($dom) { $httpDepth = $this->server->getHTTPDepth(0); if ($httpDepth!==0) { throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0'); } $searchProperties = array(); $applyToPrincipalCollectionSet = false; // Parsing the search request foreach($dom->firstChild->childNodes as $searchNode) { if (DAV\XMLUtil::toClarkNotation($searchNode) == '{DAV:}apply-to-principal-collection-set') { $applyToPrincipalCollectionSet = true; } if (DAV\XMLUtil::toClarkNotation($searchNode)!=='{DAV:}property-search') continue; $propertyName = null; $propertyValue = null; foreach($searchNode->childNodes as $childNode) { switch(DAV\XMLUtil::toClarkNotation($childNode)) { case '{DAV:}prop' : $property = DAV\XMLUtil::parseProperties($searchNode); reset($property); $propertyName = key($property); break; case '{DAV:}match' : $propertyValue = $childNode->textContent; break; } } if (is_null($propertyName) || is_null($propertyValue)) throw new DAV\Exception\BadRequest('Invalid search request. propertyname: ' . $propertyName . '. propertvvalue: ' . $propertyValue); $searchProperties[$propertyName] = $propertyValue; } return array($searchProperties, array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)), $applyToPrincipalCollectionSet); } /* }}} */ } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Principal.php000066400000000000000000000154071361462701300310620ustar00rootroot00000000000000principalBackend = $principalBackend; $this->principalProperties = $principalProperties; } /** * Returns the full principal url * * @return string */ public function getPrincipalUrl() { return $this->principalProperties['uri']; } /** * Returns a list of alternative urls for a principal * * This can for example be an email address, or ldap url. * * @return array */ public function getAlternateUriSet() { $uris = array(); if (isset($this->principalProperties['{DAV:}alternate-URI-set'])) { $uris = $this->principalProperties['{DAV:}alternate-URI-set']; } if (isset($this->principalProperties['{http://sabredav.org/ns}email-address'])) { $uris[] = 'mailto:' . $this->principalProperties['{http://sabredav.org/ns}email-address']; } return array_unique($uris); } /** * Returns the list of group members * * If this principal is a group, this function should return * all member principal uri's for the group. * * @return array */ public function getGroupMemberSet() { return $this->principalBackend->getGroupMemberSet($this->principalProperties['uri']); } /** * Returns the list of groups this principal is member of * * If this principal is a member of a (list of) groups, this function * should return a list of principal uri's for it's members. * * @return array */ public function getGroupMembership() { return $this->principalBackend->getGroupMemberShip($this->principalProperties['uri']); } /** * Sets a list of group members * * If this principal is a group, this method sets all the group members. * The list of members is always overwritten, never appended to. * * This method should throw an exception if the members could not be set. * * @param array $groupMembers * @return void */ public function setGroupMemberSet(array $groupMembers) { $this->principalBackend->setGroupMemberSet($this->principalProperties['uri'], $groupMembers); } /** * Returns this principals name. * * @return string */ public function getName() { $uri = $this->principalProperties['uri']; list(, $name) = DAV\URLUtil::splitPath($uri); return $name; } /** * Returns the name of the user * * @return string */ public function getDisplayName() { if (isset($this->principalProperties['{DAV:}displayname'])) { return $this->principalProperties['{DAV:}displayname']; } else { return $this->getName(); } } /** * Returns a list of properties * * @param array $requestedProperties * @return array */ public function getProperties($requestedProperties) { $newProperties = array(); foreach($requestedProperties as $propName) { if (isset($this->principalProperties[$propName])) { $newProperties[$propName] = $this->principalProperties[$propName]; } } return $newProperties; } /** * Updates this principals properties. * * @param array $mutations * @see SabreForRainLoop\DAV\IProperties::updateProperties * @return bool|array */ public function updateProperties($mutations) { return $this->principalBackend->updatePrincipal($this->principalProperties['uri'], $mutations); } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->principalProperties['uri']; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->getPrincipalUrl(), 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new DAV\Exception\MethodNotAllowed('Updating ACLs is not allowed here'); } /** * Returns the list of supported privileges for this node. * * The returned data structure is a list of nested privileges. * See SabreForRainLoop\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple * standard structure. * * If null is returned from this method, the default privilege set is used, * which is fine for most common usecases. * * @return array|null */ public function getSupportedPrivilegeSet() { return null; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend/000077500000000000000000000000001361462701300316125ustar00rootroot00000000000000AbstractBackend.php000066400000000000000000000010501361462701300352530ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend array( * '{DAV:}prop1' => null, * ), * 201 => array( * '{DAV:}prop2' => null, * ), * 403 => array( * '{DAV:}prop3' => null, * ), * 424 => array( * '{DAV:}prop4' => null, * ), * ); * * In this previous example prop1 was successfully updated or deleted, and * prop2 was succesfully created. * * prop3 failed to update due to '403 Forbidden' and because of this prop4 * also could not be updated with '424 Failed dependency'. * * This last example was actually incorrect. While 200 and 201 could appear * in 1 response, if there's any error (403) the other properties should * always fail with 423 (failed dependency). * * But anyway, if you don't want to scratch your head over this, just * return true or false. * * @param string $path * @param array $mutations * @return array|bool */ function updatePrincipal($path, $mutations); /** * This method is used to search for principals matching a set of * properties. * * This search is specifically used by RFC3744's principal-property-search * REPORT. You should at least allow searching on * http://sabredav.org/ns}email-address. * * The actual search should be a unicode-non-case-sensitive search. The * keys in searchProperties are the WebDAV property names, while the values * are the property values to search on. * * If multiple properties are being searched on, the search should be * AND'ed. * * This method should simply return an array with full principal uri's. * * If somebody attempted to search on a property the backend does not * support, you should simply return 0 results. * * You can also just return 0 results if you choose to not support * searching at all, but keep in mind that this may stop certain features * from working. * * @param string $prefixPath * @param array $searchProperties * @return array */ function searchPrincipals($prefixPath, array $searchProperties); /** * Returns the list of members for a group-principal * * @param string $principal * @return array */ function getGroupMemberSet($principal); /** * Returns the list of groups a principal is a member of * * @param string $principal * @return array */ function getGroupMembership($principal); /** * Updates the list of group members for a group principal. * * The principals should be passed as a list of uri's. * * @param string $principal * @param array $members * @return void */ function setGroupMemberSet($principal, array $members); } PDO.php000066400000000000000000000313001361462701300326630ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/PrincipalBackend array( 'dbField' => 'displayname', ), /** * This property is actually used by the CardDAV plugin, where it gets * mapped to {http://calendarserver.orgi/ns/}me-card. * * The reason we don't straight-up use that property, is because * me-card is defined as a property on the users' addressbook * collection. */ '{http://sabredav.org/ns}vcard-url' => array( 'dbField' => 'vcardurl', ), /** * This is the users' primary email-address. */ '{http://sabredav.org/ns}email-address' => array( 'dbField' => 'email', ), ); /** * Sets up the backend. * * @param PDO $pdo * @param string $tableName * @param string $groupMembersTableName */ public function __construct(\PDO $pdo, $tableName = 'principals', $groupMembersTableName = 'groupmembers') { $this->pdo = $pdo; $this->tableName = $tableName; $this->groupMembersTableName = $groupMembersTableName; } /** * Returns a list of principals based on a prefix. * * This prefix will often contain something like 'principals'. You are only * expected to return principals that are in this base path. * * You are expected to return at least a 'uri' for every user, you can * return any additional properties if you wish so. Common properties are: * {DAV:}displayname * {http://sabredav.org/ns}email-address - This is a custom SabreDAV * field that's actualy injected in a number of other properties. If * you have an email address, use this property. * * @param string $prefixPath * @return array */ public function getPrincipalsByPrefix($prefixPath) { $fields = array( 'uri', ); foreach($this->fieldMap as $key=>$value) { $fields[] = $value['dbField']; } $result = $this->pdo->query('SELECT '.implode(',', $fields).' FROM '. $this->tableName); $principals = array(); while($row = $result->fetch(\PDO::FETCH_ASSOC)) { // Checking if the principal is in the prefix list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']); if ($rowPrefix !== $prefixPath) continue; $principal = array( 'uri' => $row['uri'], ); foreach($this->fieldMap as $key=>$value) { if ($row[$value['dbField']]) { $principal[$key] = $row[$value['dbField']]; } } $principals[] = $principal; } return $principals; } /** * Returns a specific principal, specified by it's path. * The returned structure should be the exact same as from * getPrincipalsByPrefix. * * @param string $path * @return array */ public function getPrincipalByPath($path) { $fields = array( 'id', 'uri', ); foreach($this->fieldMap as $key=>$value) { $fields[] = $value['dbField']; } $stmt = $this->pdo->prepare('SELECT '.implode(',', $fields).' FROM '. $this->tableName . ' WHERE uri = ?'); $stmt->execute(array($path)); $row = $stmt->fetch(\PDO::FETCH_ASSOC); if (!$row) return; $principal = array( 'id' => $row['id'], 'uri' => $row['uri'], ); foreach($this->fieldMap as $key=>$value) { if ($row[$value['dbField']]) { $principal[$key] = $row[$value['dbField']]; } } return $principal; } /** * Updates one ore more webdav properties on a principal. * * The list of mutations is supplied as an array. Each key in the array is * a propertyname, such as {DAV:}displayname. * * Each value is the actual value to be updated. If a value is null, it * must be deleted. * * This method should be atomic. It must either completely succeed, or * completely fail. Success and failure can simply be returned as 'true' or * 'false'. * * It is also possible to return detailed failure information. In that case * an array such as this should be returned: * * array( * 200 => array( * '{DAV:}prop1' => null, * ), * 201 => array( * '{DAV:}prop2' => null, * ), * 403 => array( * '{DAV:}prop3' => null, * ), * 424 => array( * '{DAV:}prop4' => null, * ), * ); * * In this previous example prop1 was successfully updated or deleted, and * prop2 was succesfully created. * * prop3 failed to update due to '403 Forbidden' and because of this prop4 * also could not be updated with '424 Failed dependency'. * * This last example was actually incorrect. While 200 and 201 could appear * in 1 response, if there's any error (403) the other properties should * always fail with 423 (failed dependency). * * But anyway, if you don't want to scratch your head over this, just * return true or false. * * @param string $path * @param array $mutations * @return array|bool */ public function updatePrincipal($path, $mutations) { $updateAble = array(); foreach($mutations as $key=>$value) { // We are not aware of this field, we must fail. if (!isset($this->fieldMap[$key])) { $response = array( 403 => array( $key => null, ), 424 => array(), ); // Adding the rest to the response as a 424 foreach($mutations as $subKey=>$subValue) { if ($subKey !== $key) { $response[424][$subKey] = null; } } return $response; } $updateAble[$this->fieldMap[$key]['dbField']] = $value; } // No fields to update $query = "UPDATE " . $this->tableName . " SET "; $first = true; foreach($updateAble as $key => $value) { if (!$first) { $query.= ', '; } $first = false; $query.= "$key = :$key "; } $query.='WHERE uri = :uri'; $stmt = $this->pdo->prepare($query); $updateAble['uri'] = $path; $stmt->execute($updateAble); return true; } /** * This method is used to search for principals matching a set of * properties. * * This search is specifically used by RFC3744's principal-property-search * REPORT. You should at least allow searching on * http://sabredav.org/ns}email-address. * * The actual search should be a unicode-non-case-sensitive search. The * keys in searchProperties are the WebDAV property names, while the values * are the property values to search on. * * If multiple properties are being searched on, the search should be * AND'ed. * * This method should simply return an array with full principal uri's. * * If somebody attempted to search on a property the backend does not * support, you should simply return 0 results. * * You can also just return 0 results if you choose to not support * searching at all, but keep in mind that this may stop certain features * from working. * * @param string $prefixPath * @param array $searchProperties * @return array */ public function searchPrincipals($prefixPath, array $searchProperties) { $query = 'SELECT uri FROM ' . $this->tableName . ' WHERE 1=1 '; $values = array(); foreach($searchProperties as $property => $value) { switch($property) { case '{DAV:}displayname' : $query.=' AND displayname LIKE ?'; $values[] = '%' . $value . '%'; break; case '{http://sabredav.org/ns}email-address' : $query.=' AND email LIKE ?'; $values[] = '%' . $value . '%'; break; default : // Unsupported property return array(); } } $stmt = $this->pdo->prepare($query); $stmt->execute($values); $principals = array(); while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { // Checking if the principal is in the prefix list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']); if ($rowPrefix !== $prefixPath) continue; $principals[] = $row['uri']; } return $principals; } /** * Returns the list of members for a group-principal * * @param string $principal * @return array */ public function getGroupMemberSet($principal) { $principal = $this->getPrincipalByPath($principal); if (!$principal) throw new DAV\Exception('Principal not found'); $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?'); $stmt->execute(array($principal['id'])); $result = array(); while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { $result[] = $row['uri']; } return $result; } /** * Returns the list of groups a principal is a member of * * @param string $principal * @return array */ public function getGroupMembership($principal) { $principal = $this->getPrincipalByPath($principal); if (!$principal) throw new DAV\Exception('Principal not found'); $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.principal_id = principals.id WHERE groupmembers.member_id = ?'); $stmt->execute(array($principal['id'])); $result = array(); while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { $result[] = $row['uri']; } return $result; } /** * Updates the list of group members for a group principal. * * The principals should be passed as a list of uri's. * * @param string $principal * @param array $members * @return void */ public function setGroupMemberSet($principal, array $members) { // Grabbing the list of principal id's. $stmt = $this->pdo->prepare('SELECT id, uri FROM '.$this->tableName.' WHERE uri IN (? ' . str_repeat(', ? ', count($members)) . ');'); $stmt->execute(array_merge(array($principal), $members)); $memberIds = array(); $principalId = null; while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { if ($row['uri'] == $principal) { $principalId = $row['id']; } else { $memberIds[] = $row['id']; } } if (!$principalId) throw new DAV\Exception('Principal not found'); // Wiping out old members $stmt = $this->pdo->prepare('DELETE FROM '.$this->groupMembersTableName.' WHERE principal_id = ?;'); $stmt->execute(array($principalId)); foreach($memberIds as $memberId) { $stmt = $this->pdo->prepare('INSERT INTO '.$this->groupMembersTableName.' (principal_id, member_id) VALUES (?, ?);'); $stmt->execute(array($principalId, $memberId)); } } } PrincipalCollection.php000066400000000000000000000016561361462701300330200ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACLprincipalBackend, $principal); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Property/000077500000000000000000000000001361462701300302455ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Property/Acl.php000066400000000000000000000144401361462701300314600ustar00rootroot00000000000000privileges = $privileges; $this->prefixBaseUrl = $prefixBaseUrl; } /** * Returns the list of privileges for this property * * @return array */ public function getPrivileges() { return $this->privileges; } /** * Serializes the property into a DOMElement * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server,\DOMElement $node) { $doc = $node->ownerDocument; foreach($this->privileges as $ace) { $this->serializeAce($doc, $node, $ace, $server); } } /** * Unserializes the {DAV:}acl xml element. * * @param \DOMElement $dom * @return Acl */ static public function unserialize(\DOMElement $dom) { $privileges = array(); $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace'); for($ii=0; $ii < $xaces->length; $ii++) { $xace = $xaces->item($ii); $principal = $xace->getElementsByTagNameNS('urn:DAV','principal'); if ($principal->length !== 1) { throw new DAV\Exception\BadRequest('Each {DAV:}ace element must have one {DAV:}principal element'); } $principal = Principal::unserialize($principal->item(0)); switch($principal->getType()) { case Principal::HREF : $principal = $principal->getHref(); break; case Principal::AUTHENTICATED : $principal = '{DAV:}authenticated'; break; case Principal::UNAUTHENTICATED : $principal = '{DAV:}unauthenticated'; break; case Principal::ALL : $principal = '{DAV:}all'; break; } $protected = false; if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) { $protected = true; } $grants = $xace->getElementsByTagNameNS('urn:DAV','grant'); if ($grants->length < 1) { throw new DAV\Exception\NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported'); } $grant = $grants->item(0); $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege'); for($jj=0; $jj<$xprivs->length; $jj++) { $xpriv = $xprivs->item($jj); $privilegeName = null; for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { $childNode = $xpriv->childNodes->item($kk); if ($t = DAV\XMLUtil::toClarkNotation($childNode)) { $privilegeName = $t; break; } } if (is_null($privilegeName)) { throw new DAV\Exception\BadRequest('{DAV:}privilege elements must have a privilege element contained within them.'); } $privileges[] = array( 'principal' => $principal, 'protected' => $protected, 'privilege' => $privilegeName, ); } } return new self($privileges); } /** * Serializes a single access control entry. * * @param \DOMDocument $doc * @param \DOMElement $node * @param array $ace * @param DAV\Server $server * @return void */ private function serializeAce($doc,$node,$ace, DAV\Server $server) { $xace = $doc->createElementNS('DAV:','d:ace'); $node->appendChild($xace); $principal = $doc->createElementNS('DAV:','d:principal'); $xace->appendChild($principal); switch($ace['principal']) { case '{DAV:}authenticated' : $principal->appendChild($doc->createElementNS('DAV:','d:authenticated')); break; case '{DAV:}unauthenticated' : $principal->appendChild($doc->createElementNS('DAV:','d:unauthenticated')); break; case '{DAV:}all' : $principal->appendChild($doc->createElementNS('DAV:','d:all')); break; default: $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/')); } $grant = $doc->createElementNS('DAV:','d:grant'); $xace->appendChild($grant); $privParts = null; preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts); $xprivilege = $doc->createElementNS('DAV:','d:privilege'); $grant->appendChild($xprivilege); $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); if (isset($ace['protected']) && $ace['protected']) $xace->appendChild($doc->createElement('d:protected')); } } AclRestrictions.php000066400000000000000000000015341361462701300340120ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/PropertyownerDocument; $elem->appendChild($doc->createElementNS('DAV:','d:grant-only')); $elem->appendChild($doc->createElementNS('DAV:','d:no-invert')); } } CurrentUserPrivilegeSet.php000066400000000000000000000054021361462701300355040ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Propertyprivileges = $privileges; } /** * Serializes the property in the DOM * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server,\DOMElement $node) { $doc = $node->ownerDocument; foreach($this->privileges as $privName) { $this->serializePriv($doc,$node,$privName); } } /** * Returns true or false, whether the specified principal appears in the * list. * * @return bool */ public function has($privilegeName) { return in_array($privilegeName, $this->privileges); } /** * Serializes one privilege * * @param \DOMDocument $doc * @param \DOMElement $node * @param string $privName * @return void */ protected function serializePriv($doc,$node,$privName) { $xp = $doc->createElementNS('DAV:','d:privilege'); $node->appendChild($xp); $privParts = null; preg_match('/^{([^}]*)}(.*)$/',$privName,$privParts); $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); } /** * Unserializes the {DAV:}current-user-privilege-set element. * * @param DOMElement $node * @return CurrentUserPrivilegeSet */ static public function unserialize(\DOMElement $node) { $result = array(); $xprivs = $node->getElementsByTagNameNS('urn:DAV','privilege'); for($jj=0; $jj<$xprivs->length; $jj++) { $xpriv = $xprivs->item($jj); $privilegeName = null; for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) { $childNode = $xpriv->childNodes->item($kk); if ($t = DAV\XMLUtil::toClarkNotation($childNode)) { $privilegeName = $t; break; } } $result[] = $privilegeName; } return new self($result); } } Principal.php000066400000000000000000000077051361462701300326310ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Propertytype = $type; if ($type===self::HREF && is_null($href)) { throw new DAV\Exception('The href argument must be specified for the HREF principal type.'); } $this->href = $href; } /** * Returns the principal type * * @return int */ public function getType() { return $this->type; } /** * Returns the principal uri. * * @return string */ public function getHref() { return $this->href; } /** * Serializes the property into a DOMElement. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server, \DOMElement $node) { $prefix = $server->xmlNamespaces['DAV:']; switch($this->type) { case self::UNAUTHENTICATED : $node->appendChild( $node->ownerDocument->createElement($prefix . ':unauthenticated') ); break; case self::AUTHENTICATED : $node->appendChild( $node->ownerDocument->createElement($prefix . ':authenticated') ); break; case self::HREF : $href = $node->ownerDocument->createElement($prefix . ':href'); $href->nodeValue = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href); $node->appendChild($href); break; } } /** * Deserializes a DOM element into a property object. * * @param \DOMElement $dom * @return Principal */ static public function unserialize(\DOMElement $dom) { $parent = $dom->firstChild; while(!DAV\XMLUtil::toClarkNotation($parent)) { $parent = $parent->nextSibling; } switch(DAV\XMLUtil::toClarkNotation($parent)) { case '{DAV:}unauthenticated' : return new self(self::UNAUTHENTICATED); case '{DAV:}authenticated' : return new self(self::AUTHENTICATED); case '{DAV:}href': return new self(self::HREF, $parent->textContent); case '{DAV:}all': return new self(self::ALL); default : throw new DAV\Exception\BadRequest('Unexpected element (' . DAV\XMLUtil::toClarkNotation($parent) . '). Could not deserialize'); } } } SupportedPrivilegeSet.php000066400000000000000000000046501361462701300352140ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Propertyprivileges = $privileges; } /** * Serializes the property into a domdocument. * * @param DAV\Server $server * @param \DOMElement $node * @return void */ public function serialize(DAV\Server $server,\DOMElement $node) { $doc = $node->ownerDocument; $this->serializePriv($doc, $node, $this->privileges); } /** * Serializes a property * * This is a recursive function. * * @param \DOMDocument $doc * @param \DOMElement $node * @param array $privilege * @return void */ private function serializePriv($doc,$node,$privilege) { $xsp = $doc->createElementNS('DAV:','d:supported-privilege'); $node->appendChild($xsp); $xp = $doc->createElementNS('DAV:','d:privilege'); $xsp->appendChild($xp); $privParts = null; preg_match('/^{([^}]*)}(.*)$/',$privilege['privilege'],$privParts); $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2])); if (isset($privilege['abstract']) && $privilege['abstract']) { $xsp->appendChild($doc->createElementNS('DAV:','d:abstract')); } if (isset($privilege['description'])) { $xsp->appendChild($doc->createElementNS('DAV:','d:description',$privilege['description'])); } if (isset($privilege['aggregates'])) { foreach($privilege['aggregates'] as $subPrivilege) { $this->serializePriv($doc,$xsp,$subPrivilege); } } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/DAVACL/Version.php000066400000000000000000000007441361462701300305640ustar00rootroot00000000000000httpRequest->getHeader('Authorization'); $authHeader = explode(' ',$authHeader); if ($authHeader[0]!='AWS' || !isset($authHeader[1])) { $this->errorCode = self::ERR_NOAWSHEADER; return false; } list($this->accessKey,$this->signature) = explode(':',$authHeader[1]); return true; } /** * Returns the username for the request * * @return string */ public function getAccessKey() { return $this->accessKey; } /** * Validates the signature based on the secretKey * * @param string $secretKey * @return bool */ public function validate($secretKey) { $contentMD5 = $this->httpRequest->getHeader('Content-MD5'); if ($contentMD5) { // We need to validate the integrity of the request $body = $this->httpRequest->getBody(true); $this->httpRequest->setBody($body,true); if ($contentMD5!=base64_encode(md5($body,true))) { // content-md5 header did not match md5 signature of body $this->errorCode = self::ERR_MD5CHECKSUMWRONG; return false; } } if (!$requestDate = $this->httpRequest->getHeader('x-amz-date')) $requestDate = $this->httpRequest->getHeader('Date'); if (!$this->validateRFC2616Date($requestDate)) return false; $amzHeaders = $this->getAmzHeaders(); $signature = base64_encode( $this->hmacsha1($secretKey, $this->httpRequest->getMethod() . "\n" . $contentMD5 . "\n" . $this->httpRequest->getHeader('Content-type') . "\n" . $requestDate . "\n" . $amzHeaders . $this->httpRequest->getURI() ) ); if ($this->signature != $signature) { $this->errorCode = self::ERR_INVALIDSIGNATURE; return false; } return true; } /** * Returns an HTTP 401 header, forcing login * * This should be called when username and password are incorrect, or not supplied at all * * @return void */ public function requireLogin() { $this->httpResponse->setHeader('WWW-Authenticate','AWS'); $this->httpResponse->sendStatus(401); } /** * Makes sure the supplied value is a valid RFC2616 date. * * If we would just use strtotime to get a valid timestamp, we have no way of checking if a * user just supplied the word 'now' for the date header. * * This function also makes sure the Date header is within 15 minutes of the operating * system date, to prevent replay attacks. * * @param string $dateHeader * @return bool */ protected function validateRFC2616Date($dateHeader) { $date = Util::parseHTTPDate($dateHeader); // Unknown format if (!$date) { $this->errorCode = self::ERR_INVALIDDATEFORMAT; return false; } $min = new \DateTime('-15 minutes'); $max = new \DateTime('+15 minutes'); // We allow 15 minutes around the current date/time if ($date > $max || $date < $min) { $this->errorCode = self::ERR_REQUESTTIMESKEWED; return false; } return $date; } /** * Returns a list of AMZ headers * * @return string */ protected function getAmzHeaders() { $amzHeaders = array(); $headers = $this->httpRequest->getHeaders(); foreach($headers as $headerName => $headerValue) { if (strpos(strtolower($headerName),'x-amz-')===0) { $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n"; } } ksort($amzHeaders); $headerStr = ''; foreach($amzHeaders as $h=>$v) { $headerStr.=$h.':'.$v; } return $headerStr; } /** * Generates an HMAC-SHA1 signature * * @param string $key * @param string $message * @return string */ private function hmacsha1($key, $message) { $blocksize=64; if (strlen($key)>$blocksize) $key=pack('H*', sha1($key)); $key=str_pad($key,$blocksize,chr(0x00)); $ipad=str_repeat(chr(0x36),$blocksize); $opad=str_repeat(chr(0x5c),$blocksize); $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message)))); return $hmac; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/HTTP/AbstractAuth.php000066400000000000000000000041361361462701300313500ustar00rootroot00000000000000httpResponse = new Response(); $this->httpRequest = new Request(); } /** * Sets an alternative HTTP response object * * @param Response $response * @return void */ public function setHTTPResponse(Response $response) { $this->httpResponse = $response; } /** * Sets an alternative HTTP request object * * @param Request $request * @return void */ public function setHTTPRequest(Request $request) { $this->httpRequest = $request; } /** * Sets the realm * * The realm is often displayed in authentication dialog boxes * Commonly an application name displayed here * * @param string $realm * @return void */ public function setRealm($realm) { $this->realm = $realm; } /** * Returns the realm * * @return string */ public function getRealm() { return $this->realm; } /** * Returns an HTTP 401 header, forcing login * * This should be called when username and password are incorrect, or not supplied at all * * @return void */ abstract public function requireLogin(); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/HTTP/BasicAuth.php000066400000000000000000000034071361462701300306260ustar00rootroot00000000000000httpRequest->getRawServerValue('PHP_AUTH_USER')) && ($pass = $this->httpRequest->getRawServerValue('PHP_AUTH_PW'))) { return array($user,$pass); } // Most other webservers $auth = $this->httpRequest->getHeader('Authorization'); // Apache could prefix environment variables with REDIRECT_ when urls // are passed through mod_rewrite if (!$auth) { $auth = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); } if (!$auth) return false; if (strpos(strtolower($auth),'basic')!==0) return false; return explode(':', base64_decode(substr($auth, 6)),2); } /** * Returns an HTTP 401 header, forcing login * * This should be called when username and password are incorrect, or not supplied at all * * @return void */ public function requireLogin() { $this->httpResponse->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"'); $this->httpResponse->sendStatus(401); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/HTTP/DigestAuth.php000066400000000000000000000150611361462701300310230ustar00rootroot00000000000000nonce = uniqid(); $this->opaque = md5($this->realm); parent::__construct(); } /** * Gathers all information from the headers * * This method needs to be called prior to anything else. * * @return void */ public function init() { $digest = $this->getDigest(); $this->digestParts = $this->parseDigest($digest); } /** * Sets the quality of protection value. * * Possible values are: * SabreForRainLoop\HTTP\DigestAuth::QOP_AUTH * SabreForRainLoop\HTTP\DigestAuth::QOP_AUTHINT * * Multiple values can be specified using logical OR. * * QOP_AUTHINT ensures integrity of the request body, but this is not * supported by most HTTP clients. QOP_AUTHINT also requires the entire * request body to be md5'ed, which can put strains on CPU and memory. * * @param int $qop * @return void */ public function setQOP($qop) { $this->qop = $qop; } /** * Validates the user. * * The A1 parameter should be md5($username . ':' . $realm . ':' . $password); * * @param string $A1 * @return bool */ public function validateA1($A1) { $this->A1 = $A1; return $this->validate(); } /** * Validates authentication through a password. The actual password must be provided here. * It is strongly recommended not store the password in plain-text and use validateA1 instead. * * @param string $password * @return bool */ public function validatePassword($password) { $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password); return $this->validate(); } /** * Returns the username for the request * * @return string */ public function getUsername() { return $this->digestParts['username']; } /** * Validates the digest challenge * * @return bool */ protected function validate() { $A2 = $this->httpRequest->getMethod() . ':' . $this->digestParts['uri']; if ($this->digestParts['qop']=='auth-int') { // Making sure we support this qop value if (!($this->qop & self::QOP_AUTHINT)) return false; // We need to add an md5 of the entire request body to the A2 part of the hash $body = $this->httpRequest->getBody(true); $this->httpRequest->setBody($body,true); $A2 .= ':' . md5($body); } else { // We need to make sure we support this qop value if (!($this->qop & self::QOP_AUTH)) return false; } $A2 = md5($A2); $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}"); return $this->digestParts['response']==$validResponse; } /** * Returns an HTTP 401 header, forcing login * * This should be called when username and password are incorrect, or not supplied at all * * @return void */ public function requireLogin() { $qop = ''; switch($this->qop) { case self::QOP_AUTH : $qop = 'auth'; break; case self::QOP_AUTHINT : $qop = 'auth-int'; break; case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break; } $this->httpResponse->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"'); $this->httpResponse->sendStatus(401); } /** * This method returns the full digest string. * * It should be compatibile with mod_php format and other webservers. * * If the header could not be found, null will be returned * * @return mixed */ public function getDigest() { // mod_php $digest = $this->httpRequest->getRawServerValue('PHP_AUTH_DIGEST'); if ($digest) return $digest; // most other servers $digest = $this->httpRequest->getHeader('Authorization'); // Apache could prefix environment variables with REDIRECT_ when urls // are passed through mod_rewrite if (!$digest) { $digest = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION'); } if ($digest && strpos(strtolower($digest),'digest')===0) { return substr($digest,7); } else { return null; } } /** * Parses the different pieces of the digest string into an array. * * This method returns false if an incomplete digest was supplied * * @param string $digest * @return mixed */ protected function parseDigest($digest) { // protect against missing data $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); $data = array(); preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER); foreach ($matches as $m) { $data[$m[1]] = $m[2] ? $m[2] : $m[3]; unset($needed_parts[$m[1]]); } return $needed_parts ? false : $data; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/HTTP/Request.php000066400000000000000000000155771361462701300304260ustar00rootroot00000000000000_SERVER = $serverData; else $this->_SERVER =& $_SERVER; if ($postData) $this->_POST = $postData; else $this->_POST =& $_POST; } /** * Returns the value for a specific http header. * * This method returns null if the header did not exist. * * @param string $name * @return string */ public function getHeader($name) { $name = strtoupper(str_replace(array('-'),array('_'),$name)); if (isset($this->_SERVER['HTTP_' . $name])) { return $this->_SERVER['HTTP_' . $name]; } // There's a few headers that seem to end up in the top-level // server array. switch($name) { case 'CONTENT_TYPE' : case 'CONTENT_LENGTH' : if (isset($this->_SERVER[$name])) { return $this->_SERVER[$name]; } break; } return; } /** * Returns all (known) HTTP headers. * * All headers are converted to lower-case, and additionally all underscores * are automatically converted to dashes * * @return array */ public function getHeaders() { $hdrs = array(); foreach($this->_SERVER as $key=>$value) { switch($key) { case 'CONTENT_LENGTH' : case 'CONTENT_TYPE' : $hdrs[strtolower(str_replace('_','-',$key))] = $value; break; default : if (strpos($key,'HTTP_')===0) { $hdrs[substr(strtolower(str_replace('_','-',$key)),5)] = $value; } break; } } return $hdrs; } /** * Returns the HTTP request method * * This is for example POST or GET * * @return string */ public function getMethod() { return $this->_SERVER['REQUEST_METHOD']; } /** * Returns the requested uri * * @return string */ public function getUri() { return $this->_SERVER['REQUEST_URI']; } /** * Will return protocol + the hostname + the uri * * @return string */ public function getAbsoluteUri() { // Checking if the request was made through HTTPS. The last in line is for IIS $protocol = isset($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']!='off'); return ($protocol?'https':'http') . '://' . $this->getHeader('Host') . $this->getUri(); } /** * Returns everything after the ? from the current url * * @return string */ public function getQueryString() { return isset($this->_SERVER['QUERY_STRING'])?$this->_SERVER['QUERY_STRING']:''; } /** * Returns the HTTP request body body * * This method returns a readable stream resource. * If the asString parameter is set to true, a string is sent instead. * * @param bool $asString * @return resource */ public function getBody($asString = false) { if (is_null($this->body)) { if (!is_null(self::$defaultInputStream)) { $this->body = self::$defaultInputStream; } else { $this->body = fopen('php://input','r'); self::$defaultInputStream = $this->body; } } if ($asString) { $body = stream_get_contents($this->body); return $body; } else { return $this->body; } } /** * Sets the contents of the HTTP request body * * This method can either accept a string, or a readable stream resource. * * If the setAsDefaultInputStream is set to true, it means for this run of the * script the supplied body will be used instead of php://input. * * @param mixed $body * @param bool $setAsDefaultInputStream * @return void */ public function setBody($body,$setAsDefaultInputStream = false) { if(is_resource($body)) { $this->body = $body; } else { $stream = fopen('php://temp','r+'); fputs($stream,$body); rewind($stream); // String is assumed $this->body = $stream; } if ($setAsDefaultInputStream) { self::$defaultInputStream = $this->body; } } /** * Returns PHP's _POST variable. * * The reason this is in a method is so it can be subclassed and * overridden. * * @return array */ public function getPostVars() { return $this->_POST; } /** * Returns a specific item from the _SERVER array. * * Do not rely on this feature, it is for internal use only. * * @param string $field * @return string */ public function getRawServerValue($field) { return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null; } /** * Returns the HTTP version specified within the request. * * @return string */ public function getHTTPVersion() { $protocol = $this->getRawServerValue('SERVER_PROTOCOL'); if ($protocol==='HTTP/1.0') { return '1.0'; } else { return '1.1'; } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/HTTP/Response.php000066400000000000000000000120551361462701300305600ustar00rootroot00000000000000 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authorative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', // RFC 4918 208 => 'Already Reported', // RFC 5842 226 => 'IM Used', // RFC 3229 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Reserved', 307 => 'Temporary Redirect', 400 => 'Bad request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', // RFC 2324 422 => 'Unprocessable Entity', // RFC 4918 423 => 'Locked', // RFC 4918 424 => 'Failed Dependency', // RFC 4918 426 => 'Upgrade required', 428 => 'Precondition required', // draft-nottingham-http-new-status 429 => 'Too Many Requests', // draft-nottingham-http-new-status 431 => 'Request Header Fields Too Large', // draft-nottingham-http-new-status 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', // RFC 4918 508 => 'Loop Detected', // RFC 5842 509 => 'Bandwidth Limit Exceeded', // non-standard 510 => 'Not extended', 511 => 'Network Authentication Required', // draft-nottingham-http-new-status ); return 'HTTP/' . $httpVersion . ' ' . $code . ' ' . $msg[$code]; } // @codeCoverageIgnoreStart // We cannot reasonably test header() related methods. /** * Sends an HTTP status header to the client. * * @param int $code HTTP status code * @return bool */ public function sendStatus($code) { if (!headers_sent()) return header($this->getStatusMessage($code, $this->defaultHttpVersion)); else return false; } /** * Sets an HTTP header for the response * * @param string $name * @param string $value * @param bool $replace * @return bool */ public function setHeader($name, $value, $replace = true) { $value = str_replace(array("\r","\n"),array('\r','\n'),$value); if (!headers_sent()) return header($name . ': ' . $value, $replace); else return false; } // @codeCoverageIgnoreEnd /** * Sets a bunch of HTTP Headers * * headersnames are specified as keys, value in the array value * * @param array $headers * @return void */ public function setHeaders(array $headers) { foreach($headers as $key=>$value) $this->setHeader($key, $value); } /** * Sends the entire response body * * This method can accept either an open filestream, or a string. * * @param mixed $body * @return void */ public function sendBody($body) { if (is_resource($body)) { fpassthru($body); } else { // We assume a string echo $body; } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/HTTP/Util.php000066400000000000000000000054021361462701300276750ustar00rootroot00000000000000= 0) return new \DateTime('@' . $realDate, new \DateTimeZone('UTC')); } /** * Transforms a DateTime object to HTTP's most common date format. * * We're serializing it as the RFC 1123 date, which, for HTTP must be * specified as GMT. * * @param \DateTime $dateTime * @return string */ static function toHTTPDate(\DateTime $dateTime) { // We need to clone it, as we don't want to affect the existing // DateTime. $dateTime = clone $dateTime; $dateTime->setTimeZone(new \DateTimeZone('GMT')); return $dateTime->format('D, d M Y H:i:s \G\M\T'); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/HTTP/Version.php000066400000000000000000000007571361462701300304150ustar00rootroot00000000000000stderr) { $this->stderr = STDERR; } if (!$this->stdout) { $this->stdout = STDOUT; } if (!$this->stdin) { $this->stdin = STDIN; } // @codeCoverageIgnoreEnd try { list($options, $positional) = $this->parseArguments($argv); if (isset($options['q'])) { $this->quiet = true; } $this->log($this->colorize('green', "sabre-vobject ") . $this->colorize('yellow', Version::VERSION)); foreach($options as $name=>$value) { switch($name) { case 'q' : // Already handled earlier. break; case 'h' : case 'help' : $this->showHelp(); return 0; break; case 'format' : switch($value) { // jcard/jcal documents case 'jcard' : case 'jcal' : // specific document versions case 'vcard21' : case 'vcard30' : case 'vcard40' : case 'icalendar20' : // specific formats case 'json' : case 'mimedir' : // icalendar/vcad case 'icalendar' : case 'vcard' : $this->format = $value; break; default : throw new InvalidArgumentException('Unknown format: ' . $value); } break; case 'pretty' : if (version_compare(PHP_VERSION, '5.4.0') >= 0) { $this->pretty = true; } break; case 'forgiving' : $this->forgiving = true; break; case 'inputformat' : switch($value) { // json formats case 'jcard' : case 'jcal' : case 'json' : $this->inputFormat = 'json'; break; // mimedir formats case 'mimedir' : case 'icalendar' : case 'vcard' : case 'vcard21' : case 'vcard30' : case 'vcard40' : case 'icalendar20' : $this->inputFormat = 'mimedir'; break; default : throw new InvalidArgumentException('Unknown format: ' . $value); } break; default : throw new InvalidArgumentException('Unknown option: ' . $name); } } if (count($positional) === 0) { $this->showHelp(); return 1; } if (count($positional) === 1) { throw new InvalidArgumentException('Inputfile is a required argument'); } if (count($positional) > 3) { throw new InvalidArgumentException('Too many arguments'); } if (!in_array($positional[0], array('validate','repair','convert','color'))) { throw new InvalidArgumentException('Uknown command: ' . $positional[0]); } } catch (InvalidArgumentException $e) { $this->showHelp(); $this->log('Error: ' . $e->getMessage(),'red'); return 1; } $command = $positional[0]; $this->inputPath = $positional[1]; $this->outputPath = isset($positional[2])?$positional[2]:'-'; if ($this->outputPath !== '-') { $this->stdout = fopen($this->outputPath,'w'); } if (!$this->inputFormat) { if (substr($this->inputPath,-5)==='.json') { $this->inputFormat = 'json'; } else { $this->inputFormat = 'mimedir'; } } if (!$this->format) { if (substr($this->outputPath,-5)==='.json') { $this->format = 'json'; } else { $this->format = 'mimedir'; } } $realCode = 0; try { while($input = $this->readInput()) { $returnCode = $this->$command($input); if ($returnCode!==0) $realCode = $returnCode; } } catch (EofException $e) { // end of file } catch (\Exception $e) { $this->log('Error: ' . $e->getMessage(),'red'); return 2; } return $realCode; } /** * Shows the help message. * * @return void */ protected function showHelp() { $this->log('Usage:', 'yellow'); $this->log(" vobject [options] command [arguments]"); $this->log(''); $this->log('Options:', 'yellow'); $this->log($this->colorize('green', ' -q ') . "Don't output anything."); $this->log($this->colorize('green', ' -help -h ') . "Display this help message."); $this->log($this->colorize('green', ' --format ') . "Convert to a specific format. Must be one of: vcard, vcard21,"); $this->log($this->colorize('green', ' --forgiving ') . "Makes the parser less strict."); $this->log(" vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir."); $this->log($this->colorize('green', ' --inputformat ') . "If the input format cannot be guessed from the extension, it"); $this->log(" must be specified here."); // Only PHP 5.4 and up if (version_compare(PHP_VERSION, '5.4.0') >= 0) { $this->log($this->colorize('green', ' --pretty ') . "json pretty-print."); } $this->log(''); $this->log('Commands:', 'yellow'); $this->log($this->colorize('green', ' validate') . ' source_file Validates a file for correctness.'); $this->log($this->colorize('green', ' repair') . ' source_file [output_file] Repairs a file.'); $this->log($this->colorize('green', ' convert') . ' source_file [output_file] Converts a file.'); $this->log($this->colorize('green', ' color') . ' source_file Colorize a file, useful for debbugging.'); $this->log(<<log('Examples:', 'yellow'); $this->log(' vobject convert contact.vcf contact.json'); $this->log(' vobject convert --format=vcard40 old.vcf new.vcf'); $this->log(' vobject convert --inputformat=json --format=mimedir - -'); $this->log(' vobject color calendar.ics'); $this->log(''); $this->log('https://github.com/fruux/sabre-vobject','purple'); } /** * Validates a VObject file * * @param Component $vObj * @return int */ protected function validate($vObj) { $returnCode = 0; switch($vObj->name) { case 'VCALENDAR' : $this->log("iCalendar: " . (string)$vObj->VERSION); break; case 'VCARD' : $this->log("vCard: " . (string)$vObj->VERSION); break; } $warnings = $vObj->validate(); if (!count($warnings)) { $this->log(" No warnings!"); } else { $returnCode = 2; foreach($warnings as $warn) { $this->log(" " . $warn['message']); } } return $returnCode; } /** * Repairs a VObject file * * @param Component $vObj * @return int */ protected function repair($vObj) { $returnCode = 0; switch($vObj->name) { case 'VCALENDAR' : $this->log("iCalendar: " . (string)$vObj->VERSION); break; case 'VCARD' : $this->log("vCard: " . (string)$vObj->VERSION); break; } $warnings = $vObj->validate(Node::REPAIR); if (!count($warnings)) { $this->log(" No warnings!"); } else { foreach($warnings as $warn) { $returnCode = 2; $this->log(" " . $warn['message']); } } fwrite($this->stdout, $vObj->serialize()); return $returnCode; } /** * Converts a vObject file to a new format. * * @param Component $vObj * @return int */ protected function convert($vObj) { $json = false; $convertVersion = null; $forceInput = null; switch($this->format) { case 'json' : $json = true; if ($vObj->name === 'VCARD') { $convertVersion = Document::VCARD40; } break; case 'jcard' : $json = true; $forceInput = 'VCARD'; $convertVersion = Document::VCARD40; break; case 'jcal' : $json = true; $forceInput = 'VCALENDAR'; break; case 'mimedir' : case 'icalendar' : case 'icalendar20' : case 'vcard' : break; case 'vcard21' : $convertVersion = Document::VCARD21; break; case 'vcard30' : $convertVersion = Document::VCARD30; break; case 'vcard40' : $convertVersion = Document::VCARD40; break; } if ($forceInput && $vObj->name !== $forceInput) { throw new \Exception('You cannot convert a ' . strtolower($vObj->name) . ' to ' . $this->format); } if ($convertVersion) { $vObj = $vObj->convert($convertVersion); } if ($json) { $jsonOptions = 0; if ($this->pretty) { $jsonOptions = JSON_PRETTY_PRINT; } fwrite($this->stdout, json_encode($vObj->jsonSerialize(), $jsonOptions)); } else { fwrite($this->stdout, $vObj->serialize()); } return 0; } /** * Colorizes a file * * @param Component $vObj * @return int */ protected function color($vObj) { fwrite($this->stdout, $this->serializeComponent($vObj)); } /** * Returns an ansi color string for a color name. * * @param string $color * @return string */ protected function colorize($color, $str, $resetTo = 'default') { $colors = array( 'cyan' => '1;36', 'red' => '1;31', 'yellow' => '1;33', 'blue' => '0;34', 'green' => '0;32', 'default' => '0', 'purple' => '0;35', ); return "\033[" . $colors[$color] . 'm' . $str . "\033[".$colors[$resetTo]."m"; } /** * Writes out a string in specific color. * * @param string $color * @param string $str * @return void */ protected function cWrite($color, $str) { fwrite($this->stdout, $this->colorize($color, $str)); } protected function serializeComponent(Component $vObj) { $this->cWrite('cyan', 'BEGIN'); $this->cWrite('red', ':'); $this->cWrite('yellow', $vObj->name . "\n"); /** * Gives a component a 'score' for sorting purposes. * * This is solely used by the childrenSort method. * * A higher score means the item will be lower in the list. * To avoid score collisions, each "score category" has a reasonable * space to accomodate elements. The $key is added to the $score to * preserve the original relative order of elements. * * @param int $key * @param array $array * @return int */ $sortScore = function($key, $array) { if ($array[$key] instanceof Component) { // We want to encode VTIMEZONE first, this is a personal // preference. if ($array[$key]->name === 'VTIMEZONE') { $score=300000000; return $score+$key; } else { $score=400000000; return $score+$key; } } else { // Properties get encoded first // VCARD version 4.0 wants the VERSION property to appear first if ($array[$key] instanceof Property) { if ($array[$key]->name === 'VERSION') { $score=100000000; return $score+$key; } else { // All other properties $score=200000000; return $score+$key; } } } }; $tmp = $vObj->children; uksort($vObj->children, function($a, $b) use ($sortScore, $tmp) { $sA = $sortScore($a, $tmp); $sB = $sortScore($b, $tmp); return $sA - $sB; }); foreach($vObj->children as $child) { if ($child instanceof Component) { $this->serializeComponent($child); } else { $this->serializeProperty($child); } } $this->cWrite('cyan', 'END'); $this->cWrite('red', ':'); $this->cWrite('yellow', $vObj->name . "\n"); } /** * Colorizes a property. * * @param Property $property * @return void */ protected function serializeProperty(Property $property) { if ($property->group) { $this->cWrite('default', $property->group); $this->cWrite('red', '.'); } $str = ''; $this->cWrite('yellow', $property->name); foreach($property->parameters as $param) { $this->cWrite('red',';'); $this->cWrite('blue', $param->serialize()); } $this->cWrite('red',':'); if ($property instanceof Property\Binary) { $this->cWrite('default', 'embedded binary stripped. (' . strlen($property->getValue()) . ' bytes)'); } else { $parts = $property->getParts(); $first1 = true; // Looping through property values foreach($parts as $part) { if ($first1) { $first1 = false; } else { $this->cWrite('red', $property->delimiter); } $first2 = true; // Looping through property sub-values foreach((array)$part as $subPart) { if ($first2) { $first2 = false; } else { // The sub-value delimiter is always comma $this->cWrite('red', ','); } $subPart = strtr($subPart, array( '\\' => $this->colorize('purple', '\\\\', 'green'), ';' => $this->colorize('purple', '\;', 'green'), ',' => $this->colorize('purple', '\,', 'green'), "\n" => $this->colorize('purple', "\\n\n\t", 'green'), "\r" => "", )); $this->cWrite('green', $subPart); } } } $this->cWrite("default", "\n"); } /** * Parses the list of arguments. * * @param array $argv * @return void */ protected function parseArguments(array $argv) { $positional = array(); $options = array(); for($ii=0; $ii < count($argv); $ii++) { // Skipping the first argument. if ($ii===0) continue; $v = $argv[$ii]; if (substr($v,0,2)==='--') { // This is a long-form option. $optionName = substr($v,2); $optionValue = true; if (strpos($optionName,'=')) { list($optionName, $optionValue) = explode('=', $optionName); } $options[$optionName] = $optionValue; } elseif (substr($v,0,1) === '-' && strlen($v)>1) { // This is a short-form option. foreach(str_split(substr($v,1)) as $option) { $options[$option] = true; } } else { $positional[] = $v; } } return array($options, $positional); } protected $parser; /** * Reads the input file * * @return Component */ protected function readInput() { if (!$this->parser) { if ($this->inputPath!=='-') { $this->stdin = fopen($this->inputPath,'r'); } if ($this->inputFormat === 'mimedir') { $this->parser = new Parser\MimeDir($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); } else { $this->parser = new Parser\Json($this->stdin, ($this->forgiving?Reader::OPTION_FORGIVING:0)); } } return $this->parser->parse(); } /** * Sends a message to STDERR. * * @param string $msg * @return void */ protected function log($msg, $color = 'default') { if (!$this->quiet) { if ($color!=='default') { $msg = $this->colorize($color, $msg); } fwrite($this->stderr, $msg . "\n"); } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Component.php000066400000000000000000000314561361462701300315070ustar00rootroot00000000000000value syntax, in which case * properties will automatically be created, or you can just pass a list of * Component and Property object. * * By default, a set of sensible values will be added to the component. For * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To * ensure that this does not happen, set $defaults to false. * * @param Document $root * @param string $name such as VCALENDAR, VEVENT. * @param array $children * @param bool $defaults * @return void */ public function __construct(Document $root, $name, array $children = array(), $defaults = true) { $this->name = strtoupper($name); $this->root = $root; if ($defaults) { $children = array_merge($this->getDefaults(), $children); } foreach($children as $k=>$child) { if ($child instanceof Node) { // Component or Property $this->add($child); } else { // Property key=>value $this->add($k, $child); } } } /** * Adds a new property or component, and returns the new item. * * This method has 3 possible signatures: * * add(Component $comp) // Adds a new component * add(Property $prop) // Adds a new property * add($name, $value, array $parameters = array()) // Adds a new property * add($name, array $children = array()) // Adds a new component * by name. * * @return Node */ public function add($a1, $a2 = null, $a3 = null) { if ($a1 instanceof Node) { if (!is_null($a2)) { throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node'); } $a1->parent = $this; $this->children[] = $a1; return $a1; } elseif(is_string($a1)) { $item = $this->root->create($a1, $a2, $a3); $item->parent = $this; $this->children[] = $item; return $item; } else { throw new \InvalidArgumentException('The first argument must either be a \\SabreForRainLoop\\VObject\\Node or a string'); } } /** * This method removes a component or property from this component. * * You can either specify the item by name (like DTSTART), in which case * all properties/components with that name will be removed, or you can * pass an instance of a property or component, in which case only that * exact item will be removed. * * The removed item will be returned. In case there were more than 1 items * removed, only the last one will be returned. * * @param mixed $item * @return void */ public function remove($item) { if (is_string($item)) { $children = $this->select($item); foreach($children as $k=>$child) { unset($this->children[$k]); } return $child; } else { foreach($this->children as $k => $child) { if ($child===$item) { unset($this->children[$k]); return $child; } } throw new \InvalidArgumentException('The item you passed to remove() was not a child of this component'); } } /** * Returns an iterable list of children * * @return array */ public function children() { return $this->children; } /** * This method only returns a list of sub-components. Properties are * ignored. * * @return array */ public function getComponents() { $result = array(); foreach($this->children as $child) { if ($child instanceof Component) { $result[] = $child; } } return $result; } /** * Returns an array with elements that match the specified name. * * This function is also aware of MIME-Directory groups (as they appear in * vcards). This means that if a property is grouped as "HOME.EMAIL", it * will also be returned when searching for just "EMAIL". If you want to * search for a property in a specific group, you can select on the entire * string ("HOME.EMAIL"). If you want to search on a specific property that * has not been assigned a group, specify ".EMAIL". * * Keys are retained from the 'children' array, which may be confusing in * certain cases. * * @param string $name * @return array */ public function select($name) { $group = null; $name = strtoupper($name); if (strpos($name,'.')!==false) { list($group,$name) = explode('.', $name, 2); } $result = array(); foreach($this->children as $key=>$child) { if ( strtoupper($child->name) === $name && (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group)) ) { $result[$key] = $child; } } reset($result); return $result; } /** * Turns the object back into a serialized blob. * * @return string */ public function serialize() { $str = "BEGIN:" . $this->name . "\r\n"; /** * Gives a component a 'score' for sorting purposes. * * This is solely used by the childrenSort method. * * A higher score means the item will be lower in the list. * To avoid score collisions, each "score category" has a reasonable * space to accomodate elements. The $key is added to the $score to * preserve the original relative order of elements. * * @param int $key * @param array $array * @return int */ $sortScore = function($key, $array) { if ($array[$key] instanceof Component) { // We want to encode VTIMEZONE first, this is a personal // preference. if ($array[$key]->name === 'VTIMEZONE') { $score=300000000; return $score+$key; } else { $score=400000000; return $score+$key; } } else { // Properties get encoded first // VCARD version 4.0 wants the VERSION property to appear first if ($array[$key] instanceof Property) { if ($array[$key]->name === 'VERSION') { $score=100000000; return $score+$key; } else { // All other properties $score=200000000; return $score+$key; } } } }; $tmp = $this->children; uksort($this->children, function($a, $b) use ($sortScore, $tmp) { $sA = $sortScore($a, $tmp); $sB = $sortScore($b, $tmp); return $sA - $sB; }); foreach($this->children as $child) $str.=$child->serialize(); $str.= "END:" . $this->name . "\r\n"; return $str; } /** * This method returns an array, with the representation as it should be * encoded in json. This is used to create jCard or jCal documents. * * @return array */ public function jsonSerialize() { $components = array(); $properties = array(); foreach($this->children as $child) { if ($child instanceof Component) { $components[] = $child->jsonSerialize(); } else { $properties[] = $child->jsonSerialize(); } } return array( strtolower($this->name), $properties, $components ); } /** * This method should return a list of default property values. * * @return array */ protected function getDefaults() { return array(); } /* Magic property accessors {{{ */ /** * Using 'get' you will either get a property or component. * * If there were no child-elements found with the specified name, * null is returned. * * To use this, this may look something like this: * * $event = $calendar->VEVENT; * * @param string $name * @return Property */ public function __get($name) { $matches = $this->select($name); if (count($matches)===0) { return null; } else { $firstMatch = current($matches); /** @var $firstMatch Property */ $firstMatch->setIterator(new ElementList(array_values($matches))); return $firstMatch; } } /** * This method checks if a sub-element with the specified name exists. * * @param string $name * @return bool */ public function __isset($name) { $matches = $this->select($name); return count($matches)>0; } /** * Using the setter method you can add properties or subcomponents * * You can either pass a Component, Property * object, or a string to automatically create a Property. * * If the item already exists, it will be removed. If you want to add * a new item with the same name, always use the add() method. * * @param string $name * @param mixed $value * @return void */ public function __set($name, $value) { $matches = $this->select($name); $overWrite = count($matches)?key($matches):null; if ($value instanceof Component || $value instanceof Property) { $value->parent = $this; if (!is_null($overWrite)) { $this->children[$overWrite] = $value; } else { $this->children[] = $value; } } elseif (is_scalar($value) || is_array($value) || is_null($value)) { $property = $this->root->create($name,$value); $property->parent = $this; if (!is_null($overWrite)) { $this->children[$overWrite] = $property; } else { $this->children[] = $property; } } else { throw new \InvalidArgumentException('You must pass a \\SabreForRainLoop\\VObject\\Component, \\SabreForRainLoop\\VObject\\Property or scalar type'); } } /** * Removes all properties and components within this component with the * specified name. * * @param string $name * @return void */ public function __unset($name) { $matches = $this->select($name); foreach($matches as $k=>$child) { unset($this->children[$k]); $child->parent = null; } } /* }}} */ /** * This method is automatically called when the object is cloned. * Specifically, this will ensure all child elements are also cloned. * * @return void */ public function __clone() { foreach($this->children as $key=>$child) { $this->children[$key] = clone $child; $this->children[$key]->parent = $this; } } /** * Validates the node for correctness. * * The following options are supported: * - Node::REPAIR - If something is broken, an automatic repair may * be attempted. * * An array is returned with warnings. * * Every item in the array has the following properties: * * level - (number between 1 and 3 with severity information) * * message - (human readable message) * * node - (reference to the offending node) * * @param int $options * @return array */ public function validate($options = 0) { $result = array(); foreach($this->children as $child) { $result = array_merge($result, $child->validate($options)); } return $result; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Component/000077500000000000000000000000001361462701300307655ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Component/VAlarm.php000066400000000000000000000074621361462701300326710ustar00rootroot00000000000000TRIGGER; if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') { $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER); $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START'; $parentComponent = $this->parent; if ($related === 'START') { if ($parentComponent->name === 'VTODO') { $propName = 'DUE'; } else { $propName = 'DTSTART'; } $effectiveTrigger = clone $parentComponent->$propName->getDateTime(); $effectiveTrigger->add($triggerDuration); } else { if ($parentComponent->name === 'VTODO') { $endProp = 'DUE'; } elseif ($parentComponent->name === 'VEVENT') { $endProp = 'DTEND'; } else { throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT'); } if (isset($parentComponent->$endProp)) { $effectiveTrigger = clone $parentComponent->$endProp->getDateTime(); $effectiveTrigger->add($triggerDuration); } elseif (isset($parentComponent->DURATION)) { $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION); $effectiveTrigger->add($duration); $effectiveTrigger->add($triggerDuration); } else { $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime(); $effectiveTrigger->add($triggerDuration); } } } else { $effectiveTrigger = $trigger->getDateTime(); } return $effectiveTrigger; } /** * Returns true or false depending on if the event falls in the specified * time-range. This is used for filtering purposes. * * The rules used to determine if an event falls within the specified * time-range is based on the CalDAV specification. * * @param \DateTime $start * @param \DateTime $end * @return bool */ public function isInTimeRange(\DateTime $start, \DateTime $end) { $effectiveTrigger = $this->getEffectiveTriggerTime(); if (isset($this->DURATION)) { $duration = VObject\DateTimeParser::parseDuration($this->DURATION); $repeat = (string)$this->repeat; if (!$repeat) { $repeat = 1; } $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat); foreach($period as $occurrence) { if ($start <= $occurrence && $end > $occurrence) { return true; } } return false; } else { return ($start <= $effectiveTrigger && $end > $effectiveTrigger); } } } VCalendar.php000066400000000000000000000330441361462701300332620ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Component 'SabreForRainLoop\\VObject\\Component\\VEvent', 'VFREEBUSY' => 'SabreForRainLoop\\VObject\\Component\\VFreeBusy', 'VJOURNAL' => 'SabreForRainLoop\\VObject\\Component\\VJournal', 'VTODO' => 'SabreForRainLoop\\VObject\\Component\\VTodo', 'VALARM' => 'SabreForRainLoop\\VObject\\Component\\VAlarm', ); /** * List of value-types, and which classes they map to. * * @var array */ static public $valueMap = array( 'BINARY' => 'SabreForRainLoop\\VObject\\Property\\Binary', 'BOOLEAN' => 'SabreForRainLoop\\VObject\\Property\\Boolean', 'CAL-ADDRESS' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', 'DATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Date', 'DATE-TIME' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'DURATION' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', 'FLOAT' => 'SabreForRainLoop\\VObject\\Property\\Float', 'INTEGER' => 'SabreForRainLoop\\VObject\\Property\\Integer', 'PERIOD' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Period', 'RECUR' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', 'TEXT' => 'SabreForRainLoop\\VObject\\Property\\Text', 'TIME' => 'SabreForRainLoop\\VObject\\Property\\Time', 'UNKNOWN' => 'SabreForRainLoop\\VObject\\Property\\Unknown', // jCard / jCal-only. 'URI' => 'SabreForRainLoop\\VObject\\Property\\Uri', 'UTC-OFFSET' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', ); /** * List of properties, and which classes they map to. * * @var array */ static public $propertyMap = array( // Calendar properties 'CALSCALE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'METHOD' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'PRODID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'VERSION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Component properties 'ATTACH' => 'SabreForRainLoop\\VObject\\Property\\Binary', 'CATEGORIES' => 'SabreForRainLoop\\VObject\\Property\\Text', 'CLASS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'COMMENT' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'DESCRIPTION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'GEO' => 'SabreForRainLoop\\VObject\\Property\\Float', 'LOCATION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'PERCENT-COMPLETE' => 'SabreForRainLoop\\VObject\\Property\\Integer', 'PRIORITY' => 'SabreForRainLoop\\VObject\\Property\\Integer', 'RESOURCES' => 'SabreForRainLoop\\VObject\\Property\\Text', 'STATUS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'SUMMARY' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Date and Time Component Properties 'COMPLETED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'DTEND' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'DUE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'DTSTART' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'DURATION' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', 'FREEBUSY' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Period', 'TRANSP' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Time Zone Component Properties 'TZID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'TZNAME' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'TZOFFSETFROM' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', 'TZOFFSETTO' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', 'TZURL' => 'SabreForRainLoop\\VObject\\Property\\Uri', // Relationship Component Properties 'ATTENDEE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', 'CONTACT' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'ORGANIZER' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\CalAddress', 'RECURRENCE-ID' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'RELATED-TO' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', 'UID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Recurrence Component Properties 'EXDATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'RDATE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'RRULE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', 'EXRULE' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545 // Alarm Component Properties 'ACTION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'REPEAT' => 'SabreForRainLoop\\VObject\\Property\\Integer', 'TRIGGER' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\Duration', // Change Management Component Properties 'CREATED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'DTSTAMP' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'LAST-MODIFIED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'SEQUENCE' => 'SabreForRainLoop\\VObject\\Property\\Integer', // Request Status 'REQUEST-STATUS' => 'SabreForRainLoop\\VObject\\Property\\Text', // Additions from draft-daboo-valarm-extensions-04 'ALARM-AGENT' => 'SabreForRainLoop\\VObject\\Property\\Text', 'ACKNOWLEDGED' => 'SabreForRainLoop\\VObject\\Property\\ICalendar\\DateTime', 'PROXIMITY' => 'SabreForRainLoop\\VObject\\Property\\Text', 'DEFAULT-ALARM' => 'SabreForRainLoop\\VObject\\Property\\Boolean', ); /** * Returns the current document type. * * @return void */ public function getDocumentType() { return self::ICALENDAR20; } /** * Returns a list of all 'base components'. For instance, if an Event has * a recurrence rule, and one instance is overridden, the overridden event * will have the same UID, but will be excluded from this list. * * VTIMEZONE components will always be excluded. * * @param string $componentName filter by component name * @return array */ public function getBaseComponents($componentName = null) { $components = array(); foreach($this->children as $component) { if (!$component instanceof VObject\Component) continue; if (isset($component->{'RECURRENCE-ID'})) continue; if ($componentName && $component->name !== strtoupper($componentName)) continue; if ($component->name === 'VTIMEZONE') continue; $components[] = $component; } return $components; } /** * If this calendar object, has events with recurrence rules, this method * can be used to expand the event into multiple sub-events. * * Each event will be stripped from it's recurrence information, and only * the instances of the event in the specified timerange will be left * alone. * * In addition, this method will cause timezone information to be stripped, * and normalized to UTC. * * This method will alter the VCalendar. This cannot be reversed. * * This functionality is specifically used by the CalDAV standard. It is * possible for clients to request expand events, if they are rather simple * clients and do not have the possibility to calculate recurrences. * * @param DateTime $start * @param DateTime $end * @return void */ public function expand(\DateTime $start, \DateTime $end) { $newEvents = array(); foreach($this->select('VEVENT') as $key=>$vevent) { if (isset($vevent->{'RECURRENCE-ID'})) { unset($this->children[$key]); continue; } if (!$vevent->rrule) { unset($this->children[$key]); if ($vevent->isInTimeRange($start, $end)) { $newEvents[] = $vevent; } continue; } $uid = (string)$vevent->uid; if (!$uid) { throw new \LogicException('Event did not have a UID!'); } $it = new VObject\RecurrenceIterator($this, $vevent->uid); $it->fastForward($start); while($it->valid() && $it->getDTStart() < $end) { if ($it->getDTEnd() > $start) { $newEvents[] = $it->getEventObject(); } $it->next(); } unset($this->children[$key]); } // Setting all properties to UTC time. foreach($newEvents as $newEvent) { foreach($newEvent->children as $child) { if ($child instanceof VObject\Property\ICalendar\DateTime && $child->hasTime()) { $dt = $child->getDateTimes(); // We only need to update the first timezone, because // setDateTimes will match all other timezones to the // first. $dt[0]->setTimeZone(new \DateTimeZone('UTC')); $child->setDateTimes($dt); } } $this->add($newEvent); } // Removing all VTIMEZONE components unset($this->VTIMEZONE); } /** * This method should return a list of default property values. * * @return array */ protected function getDefaults() { return array( 'VERSION' => '2.0', 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', 'CALSCALE' => 'GREGORIAN', ); } /** * Validates the node for correctness. * An array is returned with warnings. * * Every item in the array has the following properties: * * level - (number between 1 and 3 with severity information) * * message - (human readable message) * * node - (reference to the offending node) * * @return array */ public function validate($options = 0) { $warnings = array(); $version = $this->select('VERSION'); if (count($version)!==1) { $warnings[] = array( 'level' => 1, 'message' => 'The VERSION property must appear in the VCALENDAR component exactly 1 time', 'node' => $this, ); } else { if ((string)$this->VERSION !== '2.0') { $warnings[] = array( 'level' => 1, 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.', 'node' => $this, ); } } $version = $this->select('PRODID'); if (count($version)!==1) { $warnings[] = array( 'level' => 2, 'message' => 'The PRODID property must appear in the VCALENDAR component exactly 1 time', 'node' => $this, ); } if (count($this->CALSCALE) > 1) { $warnings[] = array( 'level' => 2, 'message' => 'The CALSCALE property must not be specified more than once.', 'node' => $this, ); } if (count($this->METHOD) > 1) { $warnings[] = array( 'level' => 2, 'message' => 'The METHOD property must not be specified more than once.', 'node' => $this, ); } $componentsFound = 0; foreach($this->children as $child) { if($child instanceof Component) { $componentsFound++; } } if ($componentsFound===0) { $warnings[] = array( 'level' => 1, 'message' => 'An iCalendar object must have at least 1 component.', 'node' => $this, ); } return array_merge( $warnings, parent::validate() ); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Component/VCard.php000066400000000000000000000301401361462701300324730ustar00rootroot00000000000000 'SabreForRainLoop\\VObject\\Property\\Binary', 'BOOLEAN' => 'SabreForRainLoop\\VObject\\Property\\Boolean', 'CONTENT-ID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // vCard 2.1 only 'DATE' => 'SabreForRainLoop\\VObject\\Property\\VCard\\Date', 'DATE-TIME' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateTime', 'DATE-AND-OR-TIME' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', // vCard only 'FLOAT' => 'SabreForRainLoop\\VObject\\Property\\Float', 'INTEGER' => 'SabreForRainLoop\\VObject\\Property\\Integer', 'LANGUAGE-TAG' => 'SabreForRainLoop\\VObject\\Property\\VCard\\LanguageTag', 'TIMESTAMP' => 'SabreForRainLoop\\VObject\\Property\\VCard\\TimeStamp', 'TEXT' => 'SabreForRainLoop\\VObject\\Property\\Text', 'TIME' => 'SabreForRainLoop\\VObject\\Property\\Time', 'UNKNOWN' => 'SabreForRainLoop\\VObject\\Property\\Unknown', // jCard / jCal-only. 'URI' => 'SabreForRainLoop\\VObject\\Property\\Uri', 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', // vCard 2.1 only 'UTC-OFFSET' => 'SabreForRainLoop\\VObject\\Property\\UtcOffset', ); /** * List of properties, and which classes they map to. * * @var array */ static public $propertyMap = array( // vCard 2.1 properties and up 'N' => 'SabreForRainLoop\\VObject\\Property\\Text', 'FN' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'PHOTO' => 'SabreForRainLoop\\VObject\\Property\\Binary', // Todo: we should add a class for Binary values. 'BDAY' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', 'ADR' => 'SabreForRainLoop\\VObject\\Property\\Text', 'LABEL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 'TEL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'EMAIL' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'MAILER' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 'GEO' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'TITLE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'ROLE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'LOGO' => 'SabreForRainLoop\\VObject\\Property\\Binary', // 'AGENT' => 'SabreForRainLoop\\VObject\\Property\\', // Todo: is an embedded vCard. Probably rare, so // not supported at the moment 'ORG' => 'SabreForRainLoop\\VObject\\Property\\Text', 'NOTE' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'REV' => 'SabreForRainLoop\\VObject\\Property\\VCard\\TimeStamp', 'SOUND' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'URL' => 'SabreForRainLoop\\VObject\\Property\\Uri', 'UID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'VERSION' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'KEY' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'TZ' => 'SabreForRainLoop\\VObject\\Property\\Text', // vCard 3.0 properties 'CATEGORIES' => 'SabreForRainLoop\\VObject\\Property\\Text', 'SORT-STRING' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'PRODID' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'NICKNAME' => 'SabreForRainLoop\\VObject\\Property\\Text', 'CLASS' => 'SabreForRainLoop\\VObject\\Property\\FlatText', // Removed in vCard 4.0 // rfc2739 properties 'FBURL' => 'SabreForRainLoop\\VObject\\Property\\Uri', 'CAPURI' => 'SabreForRainLoop\\VObject\\Property\\Uri', 'CALURI' => 'SabreForRainLoop\\VObject\\Property\\Uri', // rfc4770 properties 'IMPP' => 'SabreForRainLoop\\VObject\\Property\\Uri', // vCard 4.0 properties 'XML' => 'SabreForRainLoop\\VObject\\Property\\FlatText', 'ANNIVERSARY' => 'SabreForRainLoop\\VObject\\Property\\VCard\\DateAndOrTime', 'CLIENTPIDMAP' => 'SabreForRainLoop\\VObject\\Property\\Text', 'LANG' => 'SabreForRainLoop\\VObject\\Property\\VCard\\LanguageTag', 'GENDER' => 'SabreForRainLoop\\VObject\\Property\\Text', 'KIND' => 'SabreForRainLoop\\VObject\\Property\\FlatText', ); /** * Returns the current document type. * * @return void */ public function getDocumentType() { if (!$this->version) { $version = (string)$this->VERSION; switch($version) { case '2.1' : $this->version = self::VCARD21; break; case '3.0' : $this->version = self::VCARD30; break; case '4.0' : $this->version = self::VCARD40; break; default : $this->version = self::UNKNOWN; break; } } return $this->version; } /** * Converts the document to a different vcard version. * * Use one of the VCARD constants for the target. This method will return * a copy of the vcard in the new version. * * At the moment the only supported conversion is from 3.0 to 4.0. * * If input and output version are identical, a clone is returned. * * @param int $target * @return VCard */ public function convert($target) { $converter = new VObject\VCardConverter(); return $converter->convert($this, $target); } /** * VCards with version 2.1, 3.0 and 4.0 are found. * * If the VCARD doesn't know its version, 2.1 is assumed. */ const DEFAULT_VERSION = self::VCARD21; /** * Validates the node for correctness. * * The following options are supported: * - Node::REPAIR - If something is broken, and automatic repair may * be attempted. * * An array is returned with warnings. * * Every item in the array has the following properties: * * level - (number between 1 and 3 with severity information) * * message - (human readable message) * * node - (reference to the offending node) * * @param int $options * @return array */ public function validate($options = 0) { $warnings = array(); $versionMap = array( self::VCARD21 => '2.1', self::VCARD30 => '3.0', self::VCARD40 => '4.0', ); $version = $this->select('VERSION'); if (count($version)!==1) { $warnings[] = array( 'level' => 1, 'message' => 'The VERSION property must appear in the VCARD component exactly 1 time', 'node' => $this, ); if ($options & self::REPAIR) { $this->VERSION = $versionMap[self::DEFAULT_VERSION]; } } else { $version = (string)$this->VERSION; if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') { $warnings[] = array( 'level' => 1, 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.', 'node' => $this, ); if ($options & self::REPAIR) { $this->VERSION = $versionMap[self::DEFAULT_VERSION]; } } } $fn = $this->select('FN'); if (count($fn)!==1) { $warnings[] = array( 'level' => 1, 'message' => 'The FN property must appear in the VCARD component exactly 1 time', 'node' => $this, ); if (($options & self::REPAIR) && count($fn) === 0) { // We're going to try to see if we can use the contents of the // N property. if (isset($this->N)) { $value = explode(';', (string)$this->N); if (isset($value[1]) && $value[1]) { $this->FN = $value[1] . ' ' . $value[0]; } else { $this->FN = $value[0]; } // Otherwise, the ORG property may work } elseif (isset($this->ORG)) { $this->FN = (string)$this->ORG; } } } return array_merge( parent::validate($options), $warnings ); } /** * Returns a preferred field. * * VCards can indicate wether a field such as ADR, TEL or EMAIL is * preferred by specifying TYPE=PREF (vcard 2.1, 3) or PREF=x (vcard 4, x * being a number between 1 and 100). * * If neither of those parameters are specified, the first is returned, if * a field with that name does not exist, null is returned. * * @param string $fieldName * @return VObject\Property|null */ public function preferred($propertyName) { $preferred = null; $lastPref = 101; foreach($this->select($propertyName) as $field) { $pref = 101; if (isset($field['TYPE']) && $field['TYPE']->has('PREF')) { $pref = 1; } elseif (isset($field['PREF'])) { $pref = $field['PREF']->getValue(); } if ($pref < $lastPref || is_null($preferred)) { $preferred = $field; $lastPref = $pref; } } return $preferred; } /** * This method should return a list of default property values. * * @return array */ protected function getDefaults() { return array( 'VERSION' => '3.0', 'PRODID' => '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN', ); } /** * This method returns an array, with the representation as it should be * encoded in json. This is used to create jCard or jCal documents. * * @return array */ public function jsonSerialize() { // A vcard does not have sub-components, so we're overriding this // method to remove that array element. $properties = array(); foreach($this->children as $child) { $properties[] = $child->jsonSerialize(); } return array( strtolower($this->name), $properties, ); } /** * Returns the default class for a property name. * * @param string $propertyName * @return string */ public function getClassNameForPropertyName($propertyName) { $className = parent::getClassNameForPropertyName($propertyName); // In vCard 4, BINARY no longer exists, and we need URI instead. if ($className == 'SabreForRainLoop\\VObject\\Property\\Binary' && $this->getDocumentType()===self::VCARD40) { return 'SabreForRainLoop\\VObject\\Property\\Uri'; } return $className; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Component/VEvent.php000066400000000000000000000044621361462701300327130ustar00rootroot00000000000000RRULE) { $it = new VObject\RecurrenceIterator($this); $it->fastForward($start); // We fast-forwarded to a spot where the end-time of the // recurrence instance exceeded the start of the requested // time-range. // // If the starttime of the recurrence did not exceed the // end of the time range as well, we have a match. return ($it->getDTStart() < $end && $it->getDTEnd() > $start); } $effectiveStart = $this->DTSTART->getDateTime(); if (isset($this->DTEND)) { // The DTEND property is considered non inclusive. So for a 3 day // event in july, dtstart and dtend would have to be July 1st and // July 4th respectively. // // See: // http://tools.ietf.org/html/rfc5545#page-54 $effectiveEnd = $this->DTEND->getDateTime(); } elseif (isset($this->DURATION)) { $effectiveEnd = clone $effectiveStart; $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) ); } elseif (!$this->DTSTART->hasTime()) { $effectiveEnd = clone $effectiveStart; $effectiveEnd->modify('+1 day'); } else { $effectiveEnd = clone $effectiveStart; } return ( ($start <= $effectiveEnd) && ($end > $effectiveStart) ); } } VFreeBusy.php000066400000000000000000000037741361462701300333040ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Componentselect('FREEBUSY') as $freebusy) { // We are only interested in FBTYPE=BUSY (the default), // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE. if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') { continue; } // The freebusy component can hold more than 1 value, separated by // commas. $periods = explode(',', (string)$freebusy); foreach($periods as $period) { // Every period is formatted as [start]/[end]. The start is an // absolute UTC time, the end may be an absolute UTC time, or // duration (relative) value. list($busyStart, $busyEnd) = explode('/', $period); $busyStart = VObject\DateTimeParser::parse($busyStart); $busyEnd = VObject\DateTimeParser::parse($busyEnd); if ($busyEnd instanceof \DateInterval) { $tmp = clone $busyStart; $tmp->add($busyEnd); $busyEnd = $tmp; } if($start < $busyEnd && $end > $busyStart) { return false; } } } return true; } } VJournal.php000066400000000000000000000023401361462701300331560ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/ComponentDTSTART)?$this->DTSTART->getDateTime():null; if ($dtstart) { $effectiveEnd = clone $dtstart; if (!$this->DTSTART->hasTime()) { $effectiveEnd->modify('+1 day'); } return ($start <= $effectiveEnd && $end > $dtstart); } return false; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Component/VTodo.php000066400000000000000000000043101361462701300325270ustar00rootroot00000000000000DTSTART)?$this->DTSTART->getDateTime():null; $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null; $due = isset($this->DUE)?$this->DUE->getDateTime():null; $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null; $created = isset($this->CREATED)?$this->CREATED->getDateTime():null; if ($dtstart) { if ($duration) { $effectiveEnd = clone $dtstart; $effectiveEnd->add($duration); return $start <= $effectiveEnd && $end > $dtstart; } elseif ($due) { return ($start < $due || $start <= $dtstart) && ($end > $dtstart || $end >= $due); } else { return $start <= $dtstart && $end > $dtstart; } } if ($due) { return ($start < $due && $end >= $due); } if ($completed && $created) { return ($start <= $created || $start <= $completed) && ($end >= $created || $end >= $completed); } if ($completed) { return ($start <= $completed && $end >= $completed); } if ($created) { return ($end > $created); } return true; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/DateTimeParser.php000066400000000000000000000257771361462701300324270ustar00rootroot00000000000000setTimeZone(new \DateTimeZone('UTC')); return $date; } /** * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object * * @param string $date * @return DateTime */ static public function parseDate($date) { // Format is YYYYMMDD $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/',$date,$matches); if (!$result) { throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date); } $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC')); return $date; } /** * Parses an iCalendar (RFC5545) formatted duration value. * * This method will either return a DateTimeInterval object, or a string * suitable for strtotime or DateTime::modify. * * @param string $duration * @param bool $asString * @return DateInterval|string */ static public function parseDuration($duration, $asString = false) { $result = preg_match('/^(?P\+|-)?P((?P\d+)W)?((?P\d+)D)?(T((?P\d+)H)?((?P\d+)M)?((?P\d+)S)?)?$/', $duration, $matches); if (!$result) { throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration); } if (!$asString) { $invert = false; if ($matches['plusminus']==='-') { $invert = true; } $parts = array( 'week', 'day', 'hour', 'minute', 'second', ); foreach($parts as $part) { $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0; } // We need to re-construct the $duration string, because weeks and // days are not supported by DateInterval in the same string. $duration = 'P'; $days = $matches['day']; if ($matches['week']) { $days+=$matches['week']*7; } if ($days) $duration.=$days . 'D'; if ($matches['minute'] || $matches['second'] || $matches['hour']) { $duration.='T'; if ($matches['hour']) $duration.=$matches['hour'].'H'; if ($matches['minute']) $duration.=$matches['minute'].'M'; if ($matches['second']) $duration.=$matches['second'].'S'; } if ($duration==='P') { $duration = 'PT0S'; } $iv = new \DateInterval($duration); if ($invert) $iv->invert = true; return $iv; } $parts = array( 'week', 'day', 'hour', 'minute', 'second', ); $newDur = ''; foreach($parts as $part) { if (isset($matches[$part]) && $matches[$part]) { $newDur.=' '.$matches[$part] . ' ' . $part . 's'; } } $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur); if ($newDur === '+') { $newDur = '+0 seconds'; }; return $newDur; } /** * Parses either a Date or DateTime, or Duration value. * * @param string $date * @param DateTimeZone|string $referenceTZ * @return DateTime|DateInterval */ static public function parse($date, $referenceTZ = null) { if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) { return self::parseDuration($date); } elseif (strlen($date)===8) { return self::parseDate($date); } else { return self::parseDateTime($date, $referenceTZ); } } /** * This method parses a vCard date and or time value. * * This can be used for the DATE, DATE-TIME, TIMESTAMP and * DATE-AND-OR-TIME value. * * This method returns an array, not a DateTime value. * * The elements in the array are in the following order: * year, month, date, hour, minute, second, timezone * * Almost any part of the string may be omitted. It's for example legal to * just specify seconds, leave out the year, etc. * * Timezone is either returned as 'Z' or as '+08:00' * * For any non-specified values null is returned. * * List of date formats that are supported: * YYYY * YYYY-MM * YYYYMMDD * --MMDD * ---DD * * YYYY-MM-DD * --MM-DD * ---DD * * List of supported time formats: * * HH * HHMM * HHMMSS * -MMSS * --SS * * HH * HH:MM * HH:MM:SS * -MM:SS * --SS * * A full basic-format date-time string looks like : * 20130603T133901 * * A full extended-format date-time string looks like : * 2013-06-03T13:39:01 * * Times may be postfixed by a timezone offset. This can be either 'Z' for * UTC, or a string like -0500 or +1100. * * @param string $date * @return array */ static public function parseVCardDateTime($date) { $regex = '/^ (?: # date part (?: (?: (?P [0-9]{4}) (?: -)?| --) (?P [0-9]{2})? |---) (?P [0-9]{2})? )? (?:T # time part (?P [0-9]{2} | -) (?P [0-9]{2} | -)? (?P [0-9]{2})? (?P # timezone offset Z | (?: \+|-)(?: [0-9]{4}) )? )? $/x'; if (!preg_match($regex, $date, $matches)) { // Attempting to parse the extended format. $regex = '/^ (?: # date part (?: (?P [0-9]{4}) - | -- ) (?P [0-9]{2}) - (?P [0-9]{2}) )? (?:T # time part (?: (?P [0-9]{2}) : | -) (?: (?P [0-9]{2}) : | -)? (?P [0-9]{2})? (?P # timezone offset Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) )? )? $/x'; if (!preg_match($regex, $date, $matches)) { throw new \InvalidArgumentException('Invalid vCard date-time string: ' . $date); } } $parts = array( 'year', 'month', 'date', 'hour', 'minute', 'second', 'timezone' ); $result = array(); foreach($parts as $part) { if (empty($matches[$part])) { $result[$part] = null; } elseif ($matches[$part] === '-' || $matches[$part] === '--') { $result[$part] = null; } else { $result[$part] = $matches[$part]; } } return $result; } /** * This method parses a vCard TIME value. * * This method returns an array, not a DateTime value. * * The elements in the array are in the following order: * hour, minute, second, timezone * * Almost any part of the string may be omitted. It's for example legal to * just specify seconds, leave out the hour etc. * * Timezone is either returned as 'Z' or as '+08:00' * * For any non-specified values null is returned. * * List of supported time formats: * * HH * HHMM * HHMMSS * -MMSS * --SS * * HH * HH:MM * HH:MM:SS * -MM:SS * --SS * * A full basic-format time string looks like : * 133901 * * A full extended-format time string looks like : * 13:39:01 * * Times may be postfixed by a timezone offset. This can be either 'Z' for * UTC, or a string like -0500 or +11:00. * * @param string $date * @return array */ static public function parseVCardTime($date) { $regex = '/^ (?P [0-9]{2} | -) (?P [0-9]{2} | -)? (?P [0-9]{2})? (?P # timezone offset Z | (?: \+|-)(?: [0-9]{4}) )? $/x'; if (!preg_match($regex, $date, $matches)) { // Attempting to parse the extended format. $regex = '/^ (?: (?P [0-9]{2}) : | -) (?: (?P [0-9]{2}) : | -)? (?P [0-9]{2})? (?P # timezone offset Z | (?: \+|-)(?: [0-9]{2}:[0-9]{2}) )? $/x'; if (!preg_match($regex, $date, $matches)) { throw new \InvalidArgumentException('Invalid vCard time string: ' . $date); } } $parts = array( 'hour', 'minute', 'second', 'timezone' ); $result = array(); foreach($parts as $part) { if (empty($matches[$part])) { $result[$part] = null; } elseif ($matches[$part] === '-') { $result[$part] = null; } else { $result[$part] = $matches[$part]; } } return $result; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Document.php000066400000000000000000000156341361462701300313230ustar00rootroot00000000000000value syntax, in which case * properties will automatically be created, or you can just pass a list of * Component and Property object. * * By default, a set of sensible values will be added to the component. For * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To * ensure that this does not happen, set $defaults to false. * * @param string $name * @param array $children * @param bool $defaults * @return Component */ public function createComponent($name, array $children = null, $defaults = true) { $name = strtoupper($name); $class = 'SabreForRainLoop\\VObject\\Component'; if (isset(static::$componentMap[$name])) { $class=static::$componentMap[$name]; } if (is_null($children)) $children = array(); return new $class($this, $name, $children, $defaults); } /** * Factory method for creating new properties * * This method automatically searches for the correct property class, based * on its name. * * You can specify the parameters either in key=>value syntax, in which case * parameters will automatically be created, or you can just pass a list of * Parameter objects. * * @param string $name * @param mixed $value * @param array $parameters * @param string $valueType Force a specific valuetype, such as URI or TEXT * @return Property */ public function createProperty($name, $value = null, array $parameters = null, $valueType = null) { // If there's a . in the name, it means it's prefixed by a groupname. if (($i=strpos($name,'.'))!==false) { $group = substr($name, 0, $i); $name = strtoupper(substr($name, $i+1)); } else { $name = strtoupper($name); $group = null; } $class = null; if ($valueType) { // The valueType argument comes first to figure out the correct // class. $class = $this->getClassNameForPropertyValue($valueType); } if (is_null($class) && isset($parameters['VALUE'])) { // If a VALUE parameter is supplied, we should use that. $class = $this->getClassNameForPropertyValue($parameters['VALUE']); } if (is_null($class)) { $class = $this->getClassNameForPropertyName($name); } if (is_null($parameters)) $parameters = array(); return new $class($this, $name, $value, $parameters, $group); } /** * This method returns a full class-name for a value parameter. * * For instance, DTSTART may have VALUE=DATE. In that case we will look in * our valueMap table and return the appropriate class name. * * This method returns null if we don't have a specialized class. * * @param string $valueParam * @return void */ public function getClassNameForPropertyValue($valueParam) { $valueParam = strtoupper($valueParam); if (isset(static::$valueMap[$valueParam])) { return static::$valueMap[$valueParam]; } } /** * Returns the default class for a property name. * * @param string $propertyName * @return string */ public function getClassNameForPropertyName($propertyName) { if (isset(static::$propertyMap[$propertyName])) { return static::$propertyMap[$propertyName]; } else { return 'SabreForRainLoop\\VObject\\Property\\Unknown'; } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/ElementList.php000066400000000000000000000056751361462701300317760ustar00rootroot00000000000000vevent where there's multiple VEVENT objects. * * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/). * @author Evert Pot (http://evertpot.com/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class ElementList implements \Iterator, \Countable, \ArrayAccess { /** * Inner elements * * @var array */ protected $elements = array(); /** * Creates the element list. * * @param array $elements */ public function __construct(array $elements) { $this->elements = $elements; } /* {{{ Iterator interface */ /** * Current position * * @var int */ private $key = 0; /** * Returns current item in iteration * * @return Element */ public function current() { return $this->elements[$this->key]; } /** * To the next item in the iterator * * @return void */ public function next() { $this->key++; } /** * Returns the current iterator key * * @return int */ public function key() { return $this->key; } /** * Returns true if the current position in the iterator is a valid one * * @return bool */ public function valid() { return isset($this->elements[$this->key]); } /** * Rewinds the iterator * * @return void */ public function rewind() { $this->key = 0; } /* }}} */ /* {{{ Countable interface */ /** * Returns the number of elements * * @return int */ public function count() { return count($this->elements); } /* }}} */ /* {{{ ArrayAccess Interface */ /** * Checks if an item exists through ArrayAccess. * * @param int $offset * @return bool */ public function offsetExists($offset) { return isset($this->elements[$offset]); } /** * Gets an item through ArrayAccess. * * @param int $offset * @return mixed */ public function offsetGet($offset) { return $this->elements[$offset]; } /** * Sets an item through ArrayAccess. * * @param int $offset * @param mixed $value * @return void */ public function offsetSet($offset,$value) { throw new \LogicException('You can not add new objects to an ElementList'); } /** * Sets an item through ArrayAccess. * * This method just forwards the request to the inner iterator * * @param int $offset * @return void */ public function offsetUnset($offset) { throw new \LogicException('You can not remove objects from an ElementList'); } /* }}} */ } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/EofException.php000066400000000000000000000006201361462701300321220ustar00rootroot00000000000000setTimeRange($start, $end); } if ($objects) { $this->setObjects($objects); } } /** * Sets the VCALENDAR object. * * If this is set, it will not be generated for you. You are responsible * for setting things like the METHOD, CALSCALE, VERSION, etc.. * * The VFREEBUSY object will be automatically added though. * * @param Component $vcalendar * @return void */ public function setBaseObject(Component $vcalendar) { $this->baseObject = $vcalendar; } /** * Sets the input objects * * You must either specify a valendar object as a strong, or as the parse * Component. * It's also possible to specify multiple objects as an array. * * @param mixed $objects * @return void */ public function setObjects($objects) { if (!is_array($objects)) { $objects = array($objects); } $this->objects = array(); foreach($objects as $object) { if (is_string($object)) { $this->objects[] = Reader::read($object); } elseif ($object instanceof Component) { $this->objects[] = $object; } else { throw new \InvalidArgumentException('You can only pass strings or \\SabreForRainLoop\\VObject\\Component arguments to setObjects'); } } } /** * Sets the time range * * Any freebusy object falling outside of this time range will be ignored. * * @param DateTime $start * @param DateTime $end * @return void */ public function setTimeRange(\DateTime $start = null, \DateTime $end = null) { $this->start = $start; $this->end = $end; } /** * Parses the input data and returns a correct VFREEBUSY object, wrapped in * a VCALENDAR. * * @return Component */ public function getResult() { $busyTimes = array(); foreach($this->objects as $object) { foreach($object->getBaseComponents() as $component) { switch($component->name) { case 'VEVENT' : $FBTYPE = 'BUSY'; if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) { break; } if (isset($component->STATUS)) { $status = strtoupper($component->STATUS); if ($status==='CANCELLED') { break; } if ($status==='TENTATIVE') { $FBTYPE = 'BUSY-TENTATIVE'; } } $times = array(); if ($component->RRULE) { $iterator = new RecurrenceIterator($object, (string)$component->uid); if ($this->start) { $iterator->fastForward($this->start); } $maxRecurrences = 200; while($iterator->valid() && --$maxRecurrences) { $startTime = $iterator->getDTStart(); if ($this->end && $startTime > $this->end) { break; } $times[] = array( $iterator->getDTStart(), $iterator->getDTEnd(), ); $iterator->next(); } } else { $startTime = $component->DTSTART->getDateTime(); if ($this->end && $startTime > $this->end) { break; } $endTime = null; if (isset($component->DTEND)) { $endTime = $component->DTEND->getDateTime(); } elseif (isset($component->DURATION)) { $duration = DateTimeParser::parseDuration((string)$component->DURATION); $endTime = clone $startTime; $endTime->add($duration); } elseif (!$component->DTSTART->hasTime()) { $endTime = clone $startTime; $endTime->modify('+1 day'); } else { // The event had no duration (0 seconds) break; } $times[] = array($startTime, $endTime); } foreach($times as $time) { if ($this->end && $time[0] > $this->end) break; if ($this->start && $time[1] < $this->start) break; $busyTimes[] = array( $time[0], $time[1], $FBTYPE, ); } break; case 'VFREEBUSY' : foreach($component->FREEBUSY as $freebusy) { $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY'; // Skipping intervals marked as 'free' if ($fbType==='FREE') continue; $values = explode(',', $freebusy); foreach($values as $value) { list($startTime, $endTime) = explode('/', $value); $startTime = DateTimeParser::parseDateTime($startTime); if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') { $duration = DateTimeParser::parseDuration($endTime); $endTime = clone $startTime; $endTime->add($duration); } else { $endTime = DateTimeParser::parseDateTime($endTime); } if($this->start && $this->start > $endTime) continue; if($this->end && $this->end < $startTime) continue; $busyTimes[] = array( $startTime, $endTime, $fbType ); } } break; } } } if ($this->baseObject) { $calendar = $this->baseObject; } else { $calendar = new VCalendar(); } $vfreebusy = $calendar->createComponent('VFREEBUSY'); $calendar->add($vfreebusy); if ($this->start) { $dtstart = $calendar->createProperty('DTSTART'); $dtstart->setDateTime($this->start); $vfreebusy->add($dtstart); } if ($this->end) { $dtend = $calendar->createProperty('DTEND'); $dtend->setDateTime($this->end); $vfreebusy->add($dtend); } $dtstamp = $calendar->createProperty('DTSTAMP'); $dtstamp->setDateTime(new \DateTime('now', new \DateTimeZone('UTC'))); $vfreebusy->add($dtstamp); foreach($busyTimes as $busyTime) { $busyTime[0]->setTimeZone(new \DateTimeZone('UTC')); $busyTime[1]->setTimeZone(new \DateTimeZone('UTC')); $prop = $calendar->createProperty( 'FREEBUSY', $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z') ); $prop['FBTYPE'] = $busyTime[2]; $vfreebusy->add($prop); } return $calendar; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Node.php000066400000000000000000000104571361462701300304300ustar00rootroot00000000000000iterator)) return $this->iterator; return new ElementList(array($this)); } /** * Sets the overridden iterator * * Note that this is not actually part of the iterator interface * * @param ElementList $iterator * @return void */ public function setIterator(ElementList $iterator) { $this->iterator = $iterator; } /** * Validates the node for correctness. * * The following options are supported: * - Node::REPAIR - If something is broken, and automatic repair may * be attempted. * * An array is returned with warnings. * * Every item in the array has the following properties: * * level - (number between 1 and 3 with severity information) * * message - (human readable message) * * node - (reference to the offending node) * * @param int $options * @return array */ public function validate($options = 0) { return array(); } /* }}} */ /* {{{ Countable interface */ /** * Returns the number of elements * * @return int */ public function count() { $it = $this->getIterator(); return $it->count(); } /* }}} */ /* {{{ ArrayAccess Interface */ /** * Checks if an item exists through ArrayAccess. * * This method just forwards the request to the inner iterator * * @param int $offset * @return bool */ public function offsetExists($offset) { $iterator = $this->getIterator(); return $iterator->offsetExists($offset); } /** * Gets an item through ArrayAccess. * * This method just forwards the request to the inner iterator * * @param int $offset * @return mixed */ public function offsetGet($offset) { $iterator = $this->getIterator(); return $iterator->offsetGet($offset); } /** * Sets an item through ArrayAccess. * * This method just forwards the request to the inner iterator * * @param int $offset * @param mixed $value * @return void */ public function offsetSet($offset,$value) { $iterator = $this->getIterator(); $iterator->offsetSet($offset,$value); // @codeCoverageIgnoreStart // // This method always throws an exception, so we ignore the closing // brace } // @codeCoverageIgnoreEnd /** * Sets an item through ArrayAccess. * * This method just forwards the request to the inner iterator * * @param int $offset * @return void */ public function offsetUnset($offset) { $iterator = $this->getIterator(); $iterator->offsetUnset($offset); // @codeCoverageIgnoreStart // // This method always throws an exception, so we ignore the closing // brace } // @codeCoverageIgnoreEnd /* }}} */ } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Parameter.php000066400000000000000000000174451361462701300314670ustar00rootroot00000000000000name = strtoupper($name); $this->root = $root; if (is_null($name)) { $this->noName = true; $this->name = static::guessParameterNameByValue($value); } $this->setValue($value); } /** * Try to guess property name by value, can be used for vCard 2.1 nameless parameters. * * Figuring out what the name should have been. Note that a ton of * these are rather silly in 2013 and would probably rarely be * used, but we like to be complete. * * @param string $value * @return string */ public static function guessParameterNameByValue($value) { switch(strtoupper($value)) { // Encodings case '7-BIT' : case 'QUOTED-PRINTABLE' : case 'BASE64' : $name = 'ENCODING'; break; // Common types case 'WORK' : case 'HOME' : case 'PREF' : // Delivery Label Type case 'DOM' : case 'INTL' : case 'POSTAL' : case 'PARCEL' : // Telephone types case 'VOICE' : case 'FAX' : case 'MSG' : case 'CELL' : case 'PAGER' : case 'BBS' : case 'MODEM' : case 'CAR' : case 'ISDN' : case 'VIDEO' : // EMAIL types (lol) case 'AOL' : case 'APPLELINK' : case 'ATTMAIL' : case 'CIS' : case 'EWORLD' : case 'INTERNET' : case 'IBMMAIL' : case 'MCIMAIL' : case 'POWERSHARE' : case 'PRODIGY' : case 'TLX' : case 'X400' : // Photo / Logo format types case 'GIF' : case 'CGM' : case 'WMF' : case 'BMP' : case 'DIB' : case 'PICT' : case 'TIFF' : case 'PDF ': case 'PS' : case 'JPEG' : case 'MPEG' : case 'MPEG2' : case 'AVI' : case 'QTIME' : // Sound Digital Audio Type case 'WAVE' : case 'PCM' : case 'AIFF' : // Key types case 'X509' : case 'PGP' : $name = 'TYPE'; break; // Value types case 'INLINE' : case 'URL' : case 'CONTENT-ID' : case 'CID' : $name = 'VALUE'; break; default: $name = ''; } return $name; } /** * Updates the current value. * * This may be either a single, or multiple strings in an array. * * @param string|array $value * @return void */ public function setValue($value) { $this->value = $value; } /** * Returns the current value * * This method will always return a string, or null. If there were multiple * values, it will automatically concatinate them (separated by comma). * * @return string|null */ public function getValue() { if (is_array($this->value)) { return implode(',' , $this->value); } else { return $this->value; } } /** * Sets multiple values for this parameter. * * @param array $value * @return void */ public function setParts(array $value) { $this->value = $value; } /** * Returns all values for this parameter. * * If there were no values, an empty array will be returned. * * @return array */ public function getParts() { if (is_array($this->value)) { return $this->value; } elseif (is_null($this->value)) { return array(); } else { return array($this->value); } } /** * Adds a value to this parameter * * If the argument is specified as an array, all items will be added to the * parameter value list. * * @param string|array $part * @return void */ public function addValue($part) { if (is_null($this->value)) { $this->value = $part; } else { $this->value = array_merge((array)$this->value, (array)$part); } } /** * Checks if this parameter contains the specified value. * * This is a case-insensitive match. It makes sense to call this for for * instance the TYPE parameter, to see if it contains a keyword such as * 'WORK' or 'FAX'. * * @param string $value * @return bool */ public function has($value) { return in_array( strtolower($value), array_map('strtolower', (array)$this->value) ); } /** * Turns the object back into a serialized blob. * * @return string */ public function serialize() { $value = $this->getParts(); if (count($value)===0) { return $this->name; } if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) { return implode(';', $value); } return $this->name . '=' . array_reduce($value, function($out, $item) { if (!is_null($out)) $out.=','; // If there's no special characters in the string, we'll use the simple // format if (!preg_match('#(?: [\n":;\^,] )#x', $item)) { return $out.$item; } else { // Enclosing in double-quotes, and using RFC6868 for encoding any // special characters $out.='"' . strtr($item, array( '^' => '^^', "\n" => '^n', '"' => '^\'', )) . '"'; return $out; } }); } /** * This method returns an array, with the representation as it should be * encoded in json. This is used to create jCard or jCal documents. * * @return array */ public function jsonSerialize() { return $this->value; } /** * Called when this object is being cast to a string * * @return string */ public function __toString() { return $this->getValue(); } /** * Returns the iterator for this object * * @return ElementList */ public function getIterator() { if (!is_null($this->iterator)) return $this->iterator; return $this->iterator = new ArrayObject((array)$this->value); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/ParseException.php000066400000000000000000000005651361462701300324730ustar00rootroot00000000000000setInput($input); } if (is_null($this->input)) { throw new EofException('End of input stream, or no input supplied'); } if (!is_null($options)) { $this->options = $options; } switch($this->input[0]) { case 'vcalendar' : $this->root = new VCalendar(array(), false); break; case 'vcard' : $this->root = new VCard(array(), false); break; default : throw new ParseException('The root component must either be a vcalendar, or a vcard'); } foreach($this->input[1] as $prop) { $this->root->add($this->parseProperty($prop)); } if (isset($this->input[2])) foreach($this->input[2] as $comp) { $this->root->add($this->parseComponent($comp)); } // Resetting the input so we can throw an feof exception the next time. $this->input = null; return $this->root; } /** * Parses a component * * @param array $jComp * @return \SabreForRainLoop\VObject\Component */ public function parseComponent(array $jComp) { // We can remove $self from PHP 5.4 onward. $self = $this; $properties = array_map(function($jProp) use ($self) { return $self->parseProperty($jProp); }, $jComp[1]); if (isset($jComp[2])) { $components = array_map(function($jComp) use ($self) { return $self->parseComponent($jComp); }, $jComp[2]); } else $components = array(); return $this->root->createComponent( $jComp[0], array_merge( $properties, $components), $defaults = false ); } /** * Parses properties. * * @param array $jProp * @return \SabreForRainLoop\VObject\Property */ public function parseProperty(array $jProp) { list( $propertyName, $parameters, $valueType ) = $jProp; $propertyName = strtoupper($propertyName); // This is the default class we would be using if we didn't know the // value type. We're using this value later in this function. $defaultPropertyClass = $this->root->getClassNameForPropertyName($propertyName); $parameters = (array)$parameters; $value = array_slice($jProp, 3); $valueType = strtoupper($valueType); if (isset($parameters['group'])) { $propertyName = $parameters['group'] . '.' . $propertyName; unset($parameters['group']); } $prop = $this->root->createProperty($propertyName, null, $parameters, $valueType); $prop->setJsonValue($value); // We have to do something awkward here. FlatText as well as Text // represents TEXT values. We have to normalize these here. In the // future we can get rid of FlatText once we're allowed to break BC // again. if ($defaultPropertyClass === 'SabreForRainLoop\VObject\Property\FlatText') { $defaultPropertyClass = 'SabreForRainLoop\VObject\Property\Text'; } // If the value type we received (e.g.: TEXT) was not the default value // type for the given property (e.g.: BDAY), we need to add a VALUE= // parameter. if ($defaultPropertyClass !== get_class($prop)) { $prop["VALUE"] = $valueType; } return $prop; } /** * Sets the input data * * @param resource|string|array $input * @return void */ public function setInput($input) { if (is_resource($input)) { $input = stream_get_contents($input); } if (is_string($input)) { $input = json_decode($input); } $this->input = $input; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Parser/MimeDir.php000066400000000000000000000445571361462701300323350ustar00rootroot00000000000000root = null; if (!is_null($input)) { $this->setInput($input); } if (!is_null($options)) $this->options = $options; $this->parseDocument(); return $this->root; } /** * Sets the input buffer. Must be a string or stream. * * @param resource|string $input * @return void */ public function setInput($input) { // Resetting the parser $this->lineIndex = 0; $this->startLine = 0; if (is_string($input)) { // Convering to a stream. $stream = fopen('php://temp', 'r+'); fwrite($stream, $input); rewind($stream); $this->input = $stream; } else { $this->input = $input; } } /** * Parses an entire document. * * @return void */ protected function parseDocument() { $line = $this->readLine(); switch(strtoupper($line)) { case 'BEGIN:VCALENDAR' : $class = isset(VCalendar::$componentMap['VCALENDAR']) ? VCalendar::$componentMap[$name] : 'SabreForRainLoop\\VObject\\Component\\VCalendar'; break; case 'BEGIN:VCARD' : $class = isset(VCard::$componentMap['VCARD']) ? VCard::$componentMap['VCARD'] : 'SabreForRainLoop\\VObject\\Component\\VCard'; break; default : throw new ParseException('This parser only supports VCARD and VCALENDAR files'); } $this->root = new $class(array(), false); while(true) { // Reading until we hit END: $line = $this->readLine(); if (strtoupper(substr($line,0,4)) === 'END:') { break; } $result = $this->parseLine($line); if ($result) { $this->root->add($result); } } $name = strtoupper(substr($line, 4)); if ($name!==$this->root->name) { throw new ParseException('Invalid MimeDir file. expected: "END:' . $this->root->name . '" got: "END:' . $name . '"'); } } /** * Parses a line, and if it hits a component, it will also attempt to parse * the entire component * * @param string $line Unfolded line * @return Node */ protected function parseLine($line) { // Start of a new component if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') { $component = $this->root->createComponent(substr($line,6), array(), false); while(true) { // Reading until we hit END: $line = $this->readLine(); if (strtoupper(substr($line,0,4)) === 'END:') { break; } $result = $this->parseLine($line); if ($result) { $component->add($result); } } $name = strtoupper(substr($line, 4)); if ($name!==$component->name) { throw new ParseException('Invalid MimeDir file. expected: "END:' . $component->name . '" got: "END:' . $name . '"'); } return $component; } else { // Property reader $property = $this->readProperty($line); if (!$property) { // Ignored line return false; } return $property; } } /** * We need to look ahead 1 line every time to see if we need to 'unfold' * the next line. * * If that was not the case, we store it here. * * @var null|string */ protected $lineBuffer; /** * The real current line number. */ protected $lineIndex = 0; /** * In the case of unfolded lines, this property holds the line number for * the start of the line. * * @var int */ protected $startLine = 0; /** * Contains a 'raw' representation of the current line. * * @var string */ protected $rawLine; /** * Reads a single line from the buffer. * * This method strips any newlines and also takes care of unfolding. * * @throws \SabreForRainLoop\VObject\EofException * @return string */ protected function readLine() { if (!is_null($this->lineBuffer)) { $rawLine = $this->lineBuffer; $this->lineBuffer = null; } else { do { $rawLine = fgets($this->input); if ($rawLine === false && feof($this->input)) { throw new EofException('End of document reached prematurely'); } $rawLine = rtrim($rawLine, "\r\n"); } while ($rawLine === ''); // Skipping empty lines $this->lineIndex++; } $line = $rawLine; $this->startLine = $this->lineIndex; // Looking ahead for folded lines. while (true) { $nextLine = rtrim(fgets($this->input), "\r\n"); $this->lineIndex++; if (!$nextLine) { break; } if ($nextLine[0] === "\t" || $nextLine[0] === " ") { $line .= substr($nextLine, 1); $rawLine .= "\n " . substr($nextLine, 1); } else { $this->lineBuffer = $nextLine; break; } } $this->rawLine = $rawLine; return $line; } /** * Reads a property or component from a line. * * @return void */ protected function readProperty($line) { if ($this->options & self::OPTION_FORGIVING) { $propNameToken = 'A-Z0-9\-\._\\/'; } else { $propNameToken = 'A-Z0-9\-\.'; } $paramNameToken = 'A-Z0-9\-'; $safeChar = '^";:,'; $qSafeChar = '^"'; $regex = "/ ^(?P [$propNameToken]+ ) (?=[;:]) # property name | (?<=:)(?P .*)$ # property value | ;(?P [$paramNameToken]+) (?=[=;:]) # parameter name | (=|,)(?P # parameter value (?: [$safeChar]*) | \"(?: [$qSafeChar]+)\" ) (?=[;:,]) /xi"; //echo $regex, "\n"; die(); preg_match_all($regex, $line, $matches, PREG_SET_ORDER ); $property = array( 'name' => null, 'parameters' => array(), 'value' => null ); $lastParam = null; /** * Looping through all the tokens. * * Note that we are looping through them in reverse order, because if a * sub-pattern matched, the subsequent named patterns will not show up * in the result. */ foreach($matches as $match) { if (isset($match['paramValue'])) { if ($match['paramValue'] && $match['paramValue'][0] === '"') { $value = substr($match['paramValue'], 1, -1); } else { $value = $match['paramValue']; } $value = $this->unescapeParam($value); if (is_null($property['parameters'][$lastParam])) { $property['parameters'][$lastParam] = $value; } elseif (is_array($property['parameters'][$lastParam])) { $property['parameters'][$lastParam][] = $value; } else { $property['parameters'][$lastParam] = array( $property['parameters'][$lastParam], $value ); } continue; } if (isset($match['paramName'])) { $lastParam = strtoupper($match['paramName']); if (!isset($property['parameters'][$lastParam])) { $property['parameters'][$lastParam] = null; } continue; } if (isset($match['propValue'])) { $property['value'] = $match['propValue']; continue; } if (isset($match['name']) && $match['name']) { $property['name'] = strtoupper($match['name']); continue; } // @codeCoverageIgnoreStart throw new \LogicException('This code should not be reachable'); // @codeCoverageIgnoreEnd } if (is_null($property['value']) || !$property['name']) { if ($this->options & self::OPTION_IGNORE_INVALID_LINES) { return false; } throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); } // vCard 2.1 states that parameters may appear without a name, and only // a value. We can deduce the value based on it's name. // // Our parser will get those as parameters without a value instead, so // we're filtering these parameters out first. $namedParameters = array(); $namelessParameters = array(); foreach($property['parameters'] as $name=>$value) { if (!is_null($value)) { $namedParameters[$name] = $value; } else { $namelessParameters[] = $name; } } $propObj = $this->root->createProperty($property['name'], null, $namedParameters); foreach($namelessParameters as $namelessParameter) { $propObj->add(null, $namelessParameter); } if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') { $propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue()); } else { $propObj->setRawMimeDirValue($property['value']); } return $propObj; } /** * Unescapes a property value. * * vCard 2.1 says: * * Semi-colons must be escaped in some property values, specifically * ADR, ORG and N. * * Semi-colons must be escaped in parameter values, because semi-colons * are also use to separate values. * * No mention of escaping backslashes with another backslash. * * newlines are not escaped either, instead QUOTED-PRINTABLE is used to * span values over more than 1 line. * * vCard 3.0 says: * * (rfc2425) Backslashes, newlines (\n or \N) and comma's must be * escaped, all time time. * * Comma's are used for delimeters in multiple values * * (rfc2426) Adds to to this that the semi-colon MUST also be escaped, * as in some properties semi-colon is used for separators. * * Properties using semi-colons: N, ADR, GEO, ORG * * Both ADR and N's individual parts may be broken up further with a * comma. * * Properties using commas: NICKNAME, CATEGORIES * * vCard 4.0 (rfc6350) says: * * Commas must be escaped. * * Semi-colons may be escaped, an unescaped semi-colon _may_ be a * delimiter, depending on the property. * * Backslashes must be escaped * * Newlines must be escaped as either \N or \n. * * Some compound properties may contain multiple parts themselves, so a * comma within a semi-colon delimited property may also be unescaped * to denote multiple parts _within_ the compound property. * * Text-properties using semi-colons: N, ADR, ORG, CLIENTPIDMAP. * * Text-properties using commas: NICKNAME, RELATED, CATEGORIES, PID. * * Even though the spec says that commas must always be escaped, the * example for GEO in Section 6.5.2 seems to violate this. * * iCalendar 2.0 (rfc5545) says: * * Commas or semi-colons may be used as delimiters, depending on the * property. * * Commas, semi-colons, backslashes, newline (\N or \n) are always * escaped, unless they are delimiters. * * Colons shall not be escaped. * * Commas can be considered the 'default delimiter' and is described as * the delimiter in cases where the order of the multiple values is * insignificant. * * Semi-colons are described as the delimiter for 'structured values'. * They are specifically used in Semi-colons are used as a delimiter in * REQUEST-STATUS, RRULE, GEO and EXRULE. EXRULE is deprecated however. * * Now for the parameters * * If delimiter is not set (null) this method will just return a string. * If it's a comma or a semi-colon the string will be split on those * characters, and always return an array. * * @param string $input * @param string $delimiter * @return string|string[] */ static public function unescapeValue($input, $delimiter = ';') { $regex = '# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )'; if ($delimiter) { $regex .= ' | (' . $delimiter . ')'; } $regex .= ') #x'; $matches = preg_split($regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); $resultArray = array(); $result = ''; foreach($matches as $match) { switch ($match) { case '\\\\' : $result .='\\'; break; case '\N' : case '\n' : $result .="\n"; break; case '\;' : $result .=';'; break; case '\,' : $result .=','; break; case $delimiter : $resultArray[] = $result; $result = ''; break; default : $result .= $match; break; } } $resultArray[] = $result; return $delimiter ? $resultArray : $result; } /** * Unescapes a parameter value. * * vCard 2.1: * * Does not mention a mechanism for this. In addition, double quotes * are never used to wrap values. * * This means that parameters can simply not contain colons or * semi-colons. * * vCard 3.0 (rfc2425, rfc2426): * * Parameters _may_ be surrounded by double quotes. * * If this is not the case, semi-colon, colon and comma may simply not * occur (the comma used for multiple parameter values though). * * If it is surrounded by double-quotes, it may simply not contain * double-quotes. * * This means that a parameter can in no case encode double-quotes, or * newlines. * * vCard 4.0 (rfc6350) * * Behavior seems to be identical to vCard 3.0 * * iCalendar 2.0 (rfc5545) * * Behavior seems to be identical to vCard 3.0 * * Parameter escaping mechanism (rfc6868) : * * This rfc describes a new way to escape parameter values. * * New-line is encoded as ^n * * ^ is encoded as ^^. * * " is encoded as ^' * * @param string $input * @return void */ private function unescapeParam($input) { return preg_replace_callback('#(\^(\^|n|\'))#',function($matches) { switch($matches[2]) { case 'n' : return "\n"; case '^' : return '^'; case '\'' : return '"'; // @codeCoverageIgnoreStart } // @codeCoverageIgnoreEnd }, $input); } /** * Gets the full quoted printable value. * * We need a special method for this, because newlines have both a meaning * in vCards, and in QuotedPrintable. * * This method does not do any decoding. * * @return string */ private function extractQuotedPrintableValue() { // We need to parse the raw line again to get the start of the value. // // We are basically looking for the first colon (:), but we need to // skip over the parameters first, as they may contain one. $regex = '/^ (?: [^:])+ # Anything but a colon (?: "[^"]")* # A parameter in double quotes : # start of the value we really care about (.*)$ /xs'; preg_match($regex, $this->rawLine, $matches); $value = $matches[1]; // Removing the first whitespace character from every line. Kind of // like unfolding, but we keep the newline. $value = str_replace("\n ", "\n", $value); // Microsoft products don't always correctly fold lines, they may be // missing a whitespace. So if 'forgiving' is turned on, we will take // those as well. if ($this->options & self::OPTION_FORGIVING) { while(substr($value,-1) === '=') { // Reading the line $this->readLine(); // Grabbing the raw form $value.="\n" . $this->rawLine; } } return $value; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Parser/Parser.php000066400000000000000000000036251361462701300322320ustar00rootroot00000000000000setInput($input); } $this->options = $options; } /** * This method starts the parsing process. * * If the input was not supplied during construction, it's possible to pass * it here instead. * * If either input or options are not supplied, the defaults will be used. * * @param mixed $input * @param int|null $options * @return array */ abstract public function parse($input = null, $options = null); /** * Sets the input data * * @param mixed $input * @return void */ abstract public function setInput($input); } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property.php000066400000000000000000000300501361462701300313560ustar00rootroot00000000000000value syntax. * * @param Component $root The root document * @param string $name * @param string|array|null $value * @param array $parameters List of parameters * @param string $group The vcard property group * @return void */ public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { $this->name = $name; $this->group = $group; $this->root = $root; if (!is_null($value)) { $this->setValue($value); } foreach($parameters as $k=>$v) { $this->add($k, $v); } } /** * Updates the current value. * * This may be either a single, or multiple strings in an array. * * @param string|array $value * @return void */ public function setValue($value) { $this->value = $value; } /** * Returns the current value. * * This method will always return a singular value. If this was a * multi-value object, some decision will be made first on how to represent * it as a string. * * To get the correct multi-value version, use getParts. * * @return string */ public function getValue() { if (is_array($this->value)) { if (count($this->value)==0) { return null; } elseif (count($this->value)===1) { return $this->value[0]; } else { return $this->getRawMimeDirValue($this->value); } } else { return $this->value; } } /** * Sets a multi-valued property. * * @param array $parts * @return void */ public function setParts(array $parts) { $this->value = $parts; } /** * Returns a multi-valued property. * * This method always returns an array, if there was only a single value, * it will still be wrapped in an array. * * @return array */ public function getParts() { if (is_null($this->value)) { return array(); } elseif (is_array($this->value)) { return $this->value; } else { return array($this->value); } } /** * Adds a new parameter, and returns the new item. * * If a parameter with same name already existed, the values will be * combined. * If nameless parameter is added, we try to guess it's name. * * @param string $name * @param string|null|array $value * @return Node */ public function add($name, $value = null) { $noName = false; if ($name === null) { $name = Parameter::guessParameterNameByValue($value); $noName = true; } if (isset($this->parameters[strtoupper($name)])) { $this->parameters[strtoupper($name)]->addValue($value); } else { $param = new Parameter($this->root, $name, $value); $param->noName = $noName; $this->parameters[$param->name] = $param; } } /** * Returns an iterable list of children * * @return array */ public function parameters() { return $this->parameters; } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ abstract public function getValueType(); /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * * This has been 'unfolded', so only 1 line will be passed. Unescaping is * not yet done, but parameters are not included. * * @param string $val * @return void */ abstract public function setRawMimeDirValue($val); /** * Returns a raw mime-dir representation of the value. * * @return string */ abstract public function getRawMimeDirValue(); /** * Turns the object back into a serialized blob. * * @return string */ public function serialize() { $str = $this->name; if ($this->group) $str = $this->group . '.' . $this->name; foreach($this->parameters as $param) { $str.=';' . $param->serialize(); } $str.=':' . $this->getRawMimeDirValue(); $out = ''; while(strlen($str)>0) { if (strlen($str)>75) { $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); } else { $out.=$str . "\r\n"; $str=''; break; } } return $out; } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { return $this->getParts(); } /** * Sets the json value, as it would appear in a jCard or jCal object. * * The value must always be an array. * * @param array $value * @return void */ public function setJsonValue(array $value) { if (count($value)===1) { $this->setValue(reset($value)); } else { $this->setValue($value); } } /** * This method returns an array, with the representation as it should be * encoded in json. This is used to create jCard or jCal documents. * * @return array */ public function jsonSerialize() { $parameters = array(); foreach($this->parameters as $parameter) { if ($parameter->name === 'VALUE') { continue; } $parameters[strtolower($parameter->name)] = $parameter->jsonSerialize(); } // In jCard, we need to encode the property-group as a separate 'group' // parameter. if ($this->group) { $parameters['group'] = $this->group; } return array_merge( array( strtolower($this->name), (object)$parameters, strtolower($this->getValueType()), ), $this->getJsonValue() ); } /** * Called when this object is being cast to a string. * * If the property only had a single value, you will get just that. In the * case the property had multiple values, the contents will be escaped and * combined with ,. * * @return string */ public function __toString() { return (string)$this->getValue(); } /* ArrayAccess interface {{{ */ /** * Checks if an array element exists * * @param mixed $name * @return bool */ public function offsetExists($name) { if (is_int($name)) return parent::offsetExists($name); $name = strtoupper($name); foreach($this->parameters as $parameter) { if ($parameter->name == $name) return true; } return false; } /** * Returns a parameter. * * If the parameter does not exist, null is returned. * * @param string $name * @return Node */ public function offsetGet($name) { if (is_int($name)) return parent::offsetGet($name); $name = strtoupper($name); if (!isset($this->parameters[$name])) { return null; } return $this->parameters[$name]; } /** * Creates a new parameter * * @param string $name * @param mixed $value * @return void */ public function offsetSet($name, $value) { if (is_int($name)) { parent::offsetSet($name, $value); // @codeCoverageIgnoreStart // This will never be reached, because an exception is always // thrown. return; // @codeCoverageIgnoreEnd } $param = new Parameter($this->root, $name, $value); $this->parameters[$param->name] = $param; } /** * Removes one or more parameters with the specified name * * @param string $name * @return void */ public function offsetUnset($name) { if (is_int($name)) { parent::offsetUnset($name); // @codeCoverageIgnoreStart // This will never be reached, because an exception is always // thrown. return; // @codeCoverageIgnoreEnd } unset($this->parameters[strtoupper($name)]); } /* }}} */ /** * This method is automatically called when the object is cloned. * Specifically, this will ensure all child elements are also cloned. * * @return void */ public function __clone() { foreach($this->parameters as $key=>$child) { $this->parameters[$key] = clone $child; $this->parameters[$key]->parent = $this; } } /** * Validates the node for correctness. * * The following options are supported: * - Node::REPAIR - If something is broken, and automatic repair may * be attempted. * * An array is returned with warnings. * * Every item in the array has the following properties: * * level - (number between 1 and 3 with severity information) * * message - (human readable message) * * node - (reference to the offending node) * * @param int $options * @return array */ public function validate($options = 0) { $warnings = array(); // Checking if our value is UTF-8 if (!StringUtil::isUTF8($this->getRawMimeDirValue())) { $warnings[] = array( 'level' => 1, 'message' => 'Property is not valid UTF-8!', 'node' => $this, ); if ($options & self::REPAIR) { $this->setRawMimeDirValue(StringUtil::convertToUTF8($this->getRawMimeDirValue())); } } // Checking if the propertyname does not contain any invalid bytes. if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) { $warnings[] = array( 'level' => 1, 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed', 'node' => $this, ); if ($options & self::REPAIR) { // Uppercasing and converting underscores to dashes. $this->name = strtoupper( str_replace('_', '-', $this->name) ); // Removing every other invalid character $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name); } } // Validating inner parameters foreach($this->parameters as $param) { $warnings = array_merge($warnings, $param->validate($options)); } return $warnings; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/000077500000000000000000000000001361462701300306475ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Binary.php000066400000000000000000000053541361462701300326130ustar00rootroot00000000000000value = $value[0]; } else { throw new \InvalidArgumentException('The argument must either be a string or an array with only one child'); } } else { $this->value = $value; } } /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * * This has been 'unfolded', so only 1 line will be passed. Unescaping is * not yet done, but parameters are not included. * * @param string $val * @return void */ public function setRawMimeDirValue($val) { $this->value = base64_decode($val); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return base64_encode($this->value); } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return 'BINARY'; } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { return array(base64_encode($this->getValue())); } /** * Sets the json value, as it would appear in a jCard or jCal object. * * The value must always be an array. * * @param array $value * @return void */ public function setJsonValue(array $value) { $value = array_map('base64_decode', $value); parent::setJsonValue($value); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Boolean.php000066400000000000000000000025761361462701300327510ustar00rootroot00000000000000setValue($val); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return $this->value?'TRUE':'FALSE'; } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return 'BOOLEAN'; } } FlatText.php000066400000000000000000000024451361462701300330410ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/PropertysetValue($val); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Float.php000066400000000000000000000042521361462701300324300ustar00rootroot00000000000000delimiter, $val); foreach($val as &$item) { $item = (float)$item; } $this->setParts($val); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return implode( $this->delimiter, $this->getParts() ); } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return "FLOAT"; } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { $val = array_map(function($item) { return (float)$item; }, $this->getParts()); // Special-casing the GEO property. // // See: // http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-04#section-3.4.1.2 if ($this->name==='GEO') { return array($val); } else { return $val; } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendar/000077500000000000000000000000001361462701300324715ustar00rootroot00000000000000CalAddress.php000066400000000000000000000015621361462701300351340ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendarsetDateTimes($parts); } else { parent::setParts($parts); } } /** * Updates the current value. * * This may be either a single, or multiple strings in an array. * * Instead of strings, you may also use DateTime here. * * @param string|array|\DateTime $value * @return void */ public function setValue($value) { if (is_array($value) && isset($value[0]) && $value[0] instanceof \DateTime) { $this->setDateTimes($value); } elseif ($value instanceof \DateTime) { $this->setDateTimes(array($value)); } else { parent::setValue($value); } } /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * * This has been 'unfolded', so only 1 line will be passed. Unescaping is * not yet done, but parameters are not included. * * @param string $val * @return void */ public function setRawMimeDirValue($val) { $this->setValue(explode($this->delimiter, $val)); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return implode($this->delimiter, $this->getParts()); } /** * Returns true if this is a DATE-TIME value, false if it's a DATE. * * @return bool */ public function hasTime() { return strtoupper((string)$this['VALUE']) !== 'DATE'; } /** * Returns a date-time value. * * Note that if this property contained more than 1 date-time, only the * first will be returned. To get an array with multiple values, call * getDateTimes. * * @return \DateTime */ public function getDateTime() { $dt = $this->getDateTimes(); if (!$dt) return null; return $dt[0]; } /** * Returns multiple date-time values. * * @return \DateTime[] */ public function getDateTimes() { // Finding the timezone. $tz = $this['TZID']; if ($tz) { $tz = TimeZoneUtil::getTimeZone((string)$tz, $this->root); } $dts = array(); foreach($this->getParts() as $part) { $dts[] = DateTimeParser::parse($part, $tz); } return $dts; } /** * Sets the property as a DateTime object. * * @param \DateTime $dt * @param bool isFloating If set to true, timezones will be ignored. * @return void */ public function setDateTime(\DateTime $dt, $isFloating = false) { $this->setDateTimes(array($dt), $isFloating); } /** * Sets the property as multiple date-time objects. * * The first value will be used as a reference for the timezones, and all * the otehr values will be adjusted for that timezone * * @param \DateTime[] $dt * @param bool isFloating If set to true, timezones will be ignored. * @return void */ public function setDateTimes(array $dt, $isFloating = false) { $values = array(); if($this->hasTime()) { $tz = null; $isUtc = false; foreach($dt as $d) { if ($isFloating) { $values[] = $d->format('Ymd\\THis'); continue; } if (is_null($tz)) { $tz = $d->getTimeZone(); $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); if (!$isUtc) { $this->offsetSet('TZID', $tz->getName()); } } else { $d->setTimeZone($tz); } if ($isUtc) { $values[] = $d->format('Ymd\\THis\\Z'); } else { $values[] = $d->format('Ymd\\THis'); } } if ($isUtc || $isFloating) { $this->offsetUnset('TZID'); } } else { foreach($dt as $d) { $values[] = $d->format('Ymd'); } $this->offsetUnset('TZID'); } $this->value = $values; } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return $this->hasTime()?'DATE-TIME':'DATE'; } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { $dts = $this->getDateTimes(); $hasTime = $this->hasTime(); $tz = $dts[0]->getTimeZone(); $isUtc = in_array($tz->getName() , array('UTC', 'GMT', 'Z')); return array_map(function($dt) use ($hasTime, $isUtc) { if ($hasTime) { return $dt->format('Y-m-d\\TH:i:s') . ($isUtc?'Z':''); } else { return $dt->format('Y-m-d'); } }, $dts); } /** * Sets the json value, as it would appear in a jCard or jCal object. * * The value must always be an array. * * @param array $value * @return void */ public function setJsonValue(array $value) { // dates and times in jCal have one difference to dates and times in // iCalendar. In jCal date-parts are separated by dashes, and // time-parts are separated by colons. It makes sense to just remove // those. $this->setValue(array_map(function($item) { return strtr($item, array(':'=>'', '-'=>'')); }, $value)); } /** * We need to intercept offsetSet, because it may be used to alter the * VALUE from DATE-TIME to DATE or vice-versa. * * @param string $name * @param mixed $value * @return void */ public function offsetSet($name, $value) { parent::offsetSet($name, $value); if (strtoupper($name)!=='VALUE') { return; } // This will ensure that dates are correctly encoded. $this->setDateTimes($this->getDateTimes()); } } Duration.php000066400000000000000000000037131361462701300347140ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendarsetValue(explode($this->delimiter, $val)); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return implode($this->delimiter, $this->getParts()); } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return 'DURATION'; } /** * Returns a DateInterval representation of the Duration property. * * If the property has more than one value, only the first is returned. * * @return \DateInterval */ public function getDateInterval() { $parts = $this->getParts(); $value = $parts[0]; return DateTimeParser::parseDuration($value); } } Period.php000066400000000000000000000056101361462701300343470ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendarsetValue(explode($this->delimiter, $val)); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return implode($this->delimiter, $this->getParts()); } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return "PERIOD"; } /** * Sets the json value, as it would appear in a jCard or jCal object. * * The value must always be an array. * * @param array $value * @return void */ public function setJsonValue(array $value) { $value = array_map(function($item) { return strtr(implode('/', $item), array(':' => '', '-' => '')); }, $value); parent::setJsonValue($value); } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { $return = array(); foreach($this->getParts() as $item) { list($start, $end) = explode('/', $item, 2); $start = DateTimeParser::parseDateTime($start); // This is a duration value. if ($end[0]==='P') { $return[] = array( $start->format('Y-m-d\\TH:i:s'), $end ); } else { $end = DateTimeParser::parseDateTime($end); $return[] = array( $start->format('Y-m-d\\TH:i:s'), $end->format('Y-m-d\\TH:i:s'), ); } } return $return; } } Recur.php000066400000000000000000000112001361462701300341750ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/ICalendarvalue array that is accessible using * getParts, and may be set using setParts. * * @copyright Copyright (C) 2007-2013 fruux GmbH. All rights reserved. * @author Evert Pot (http://evertpot.com/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Recur extends Property { /** * Updates the current value. * * This may be either a single, or multiple strings in an array. * * @param string|array $value * @return void */ public function setValue($value) { // If we're getting the data from json, we'll be receiving an object if ($value instanceof \StdClass) { $value = (array)$value; } if (is_array($value)) { $newVal = array(); foreach($value as $k=>$v) { if (is_string($v)) { $v = strtoupper($v); // The value had multiple sub-values if (strpos($v,',')!==false) { $v = explode(',', $v); } } else { $v = array_map('strtoupper', $v); } $newVal[strtoupper($k)] = $v; } $this->value = $newVal; } elseif (is_string($value)) { $value = strtoupper($value); $newValue = array(); foreach(explode(';', $value) as $part) { // Skipping empty parts. if (empty($part)) { continue; } list($partName, $partValue) = explode('=', $part); // The value itself had multiple values.. if (strpos($partValue,',')!==false) { $partValue=explode(',', $partValue); } $newValue[$partName] = $partValue; } $this->value = $newValue; } else { throw new \InvalidArgumentException('You must either pass a string, or a key=>value array'); } } /** * Returns the current value. * * This method will always return a singular value. If this was a * multi-value object, some decision will be made first on how to represent * it as a string. * * To get the correct multi-value version, use getParts. * * @return string */ public function getValue() { $out = array(); foreach($this->value as $key=>$value) { $out[] = $key . '=' . (is_array($value)?implode(',', $value):$value); } return strtoupper(implode(';',$out)); } /** * Sets a multi-valued property. * * @param array $parts * @return void */ public function setParts(array $parts) { $this->setValue($parts); } /** * Returns a multi-valued property. * * This method always returns an array, if there was only a single value, * it will still be wrapped in an array. * * @return array */ public function getParts() { return $this->value; } /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * * This has been 'unfolded', so only 1 line will be passed. Unescaping is * not yet done, but parameters are not included. * * @param string $val * @return void */ public function setRawMimeDirValue($val) { $this->setValue($val); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return $this->getValue(); } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return "RECUR"; } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { $values = array(); foreach($this->getParts() as $k=>$v) { $values[strtolower($k)] = $v; } return array($values); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Integer.php000066400000000000000000000030271361462701300327570ustar00rootroot00000000000000setValue((int)$val); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return $this->value; } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return "INTEGER"; } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { return array((int)$this->getValue()); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Text.php000066400000000000000000000220151361462701300323040ustar00rootroot00000000000000 5, 'ADR' => 7, ); /** * Creates the property. * * You can specify the parameters either in key=>value syntax, in which case * parameters will automatically be created, or you can just pass a list of * Parameter objects. * * @param Component $root The root document * @param string $name * @param string|array|null $value * @param array $parameters List of parameters * @param string $group The vcard property group * @return void */ public function __construct(Component $root, $name, $value = null, array $parameters = array(), $group = null) { // There's two types of multi-valued text properties: // 1. multivalue properties. // 2. structured value properties // // The former is always separated by a comma, the latter by semi-colon. if (in_array($name, $this->structuredValues)) { $this->delimiter = ';'; } parent::__construct($root, $name, $value, $parameters, $group); } /** * Sets a raw value coming from a mimedir (iCalendar/vCard) file. * * This has been 'unfolded', so only 1 line will be passed. Unescaping is * not yet done, but parameters are not included. * * @param string $val * @return void */ public function setRawMimeDirValue($val) { $this->setValue(MimeDir::unescapeValue($val, $this->delimiter)); } /** * Sets the value as a quoted-printable encoded string. * * @param string $val * @return void */ public function setQuotedPrintableValue($val) { $val = quoted_printable_decode($val); // Quoted printable only appears in vCard 2.1, and the only character // that may be escaped there is ;. So we are simply splitting on just // that. // // We also don't have to unescape \\, so all we need to look for is a ; // that's not preceeded with a \. $regex = '# (?setValue($matches); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { $val = $this->getParts(); if (isset($this->minimumPropertyValues[$this->name])) { $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); } foreach($val as &$item) { if (!is_array($item)) { $item = array($item); } foreach($item as &$subItem) { $subItem = strtr($subItem, array( '\\' => '\\\\', ';' => '\;', ',' => '\,', "\n" => '\n', "\r" => "", )); } $item = implode(',', $item); } return implode($this->delimiter, $val); } /** * Returns the value, in the format it should be encoded for json. * * This method must always return an array. * * @return array */ public function getJsonValue() { // Structured text values should always be returned as a single // array-item. Multi-value text should be returned as multiple items in // the top-array. if (in_array($this->name, $this->structuredValues)) { return array($this->getParts()); } else { return $this->getParts(); } } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return "TEXT"; } /** * Turns the object back into a serialized blob. * * @return string */ public function serialize() { // We need to kick in a special type of encoding, if it's a 2.1 vcard. if ($this->root->getDocumentType() !== Document::VCARD21) { return parent::serialize(); } $val = $this->getParts(); if (isset($this->minimumPropertyValues[$this->name])) { $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); } // Imploding multiple parts into a single value, and splitting the // values with ;. if (count($val)>1) { foreach($val as $k=>$v) { $val[$k] = str_replace(';','\;', $v); } $val = implode(';', $val); } else { $val = $val[0]; } $str = $this->name; if ($this->group) $str = $this->group . '.' . $this->name; foreach($this->parameters as $param) { if ($param->getValue() === 'QUOTED-PRINTABLE') { continue; } $str.=';' . $param->serialize(); } // If the resulting value contains a \n, we must encode it as // quoted-printable. if (strpos($val,"\n") !== false) { $str.=';ENCODING=QUOTED-PRINTABLE:'; $lastLine=$str; $out = null; // The PHP built-in quoted-printable-encode does not correctly // encode newlines for us. Specifically, the \r\n sequence must in // vcards be encoded as =0D=OA and we must insert soft-newlines // every 75 bytes. for($ii=0;$ii= 32 && $ord <=126) { $lastLine.=$val[$ii]; } else { $lastLine.='=' . strtoupper(bin2hex($val[$ii])); } if (strlen($lastLine)>=75) { // Soft line break $out.=$lastLine. "=\r\n "; $lastLine = null; } } if (!is_null($lastLine)) $out.= $lastLine . "\r\n"; return $out; } else { $str.=':' . $val; $out = ''; while(strlen($str)>0) { if (strlen($str)>75) { $out.= mb_strcut($str,0,75,'utf-8') . "\r\n"; $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8'); } else { $out.=$str . "\r\n"; $str=''; break; } } return $out; } } /** * Validates the node for correctness. * * The following options are supported: * - Node::REPAIR - If something is broken, and automatic repair may * be attempted. * * An array is returned with warnings. * * Every item in the array has the following properties: * * level - (number between 1 and 3 with severity information) * * message - (human readable message) * * node - (reference to the offending node) * * @param int $options * @return array */ public function validate($options = 0) { $warnings = parent::validate($options); if (isset($this->minimumPropertyValues[$this->name])) { $minimum = $this->minimumPropertyValues[$this->name]; $parts = $this->getParts(); if (count($parts) < $minimum) { $warnings[] = array( 'level' => 1, 'message' => 'This property must have at least ' . $minimum . ' components. It only has ' . count($parts), 'node' => $this, ); if ($options & self::REPAIR) { $parts = array_pad($parts, $minimum, ''); $this->setParts($parts); } } } return $warnings; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Time.php000066400000000000000000000040611361462701300322570ustar00rootroot00000000000000getValue()); $timeStr = ''; // Hour if (!is_null($parts['hour'])) { $timeStr.=$parts['hour']; if (!is_null($parts['minute'])) { $timeStr.=':'; } } else { // We know either minute or second _must_ be set, so we insert a // dash for an empty value. $timeStr.='-'; } // Minute if (!is_null($parts['minute'])) { $timeStr.=$parts['minute']; if (!is_null($parts['second'])) { $timeStr.=':'; } } else { if (isset($parts['second'])) { // Dash for empty minute $timeStr.='-'; } } // Second if (!is_null($parts['second'])) { $timeStr.=$parts['second']; } // Timezone if (!is_null($parts['timezone'])) { $timeStr.=$parts['timezone']; } return array($timeStr); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Unknown.php000066400000000000000000000021751361462701300330240ustar00rootroot00000000000000getRawMimeDirValue()); } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return "UNKNOWN"; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/Uri.php000066400000000000000000000027271361462701300321270ustar00rootroot00000000000000value = $val; } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { if (is_array($this->value)) { return $this->value[0]; } else { return $this->value; } } } UtcOffset.php000066400000000000000000000014341361462701300332050ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/PropertygetValue()); $dateStr = ''; // Year if (!is_null($parts['year'])) { $dateStr.=$parts['year']; if (!is_null($parts['month'])) { // If a year and a month is set, we need to insert a separator // dash. $dateStr.='-'; } } else { if (!is_null($parts['month']) || !is_null($parts['date'])) { // Inserting two dashes $dateStr.='--'; } } // Month if (!is_null($parts['month'])) { $dateStr.=$parts['month']; if (isset($parts['date'])) { // If month and date are set, we need the separator dash. $dateStr.='-'; } } else { if (isset($parts['date'])) { // If the month is empty, and a date is set, we need a 'empty // dash' $dateStr.='-'; } } // Date if (!is_null($parts['date'])) { $dateStr.=$parts['date']; } // Early exit if we don't have a time string. if (is_null($parts['hour']) && is_null($parts['minute']) && is_null($parts['second'])) { return array($dateStr); } $dateStr.='T'; // Hour if (!is_null($parts['hour'])) { $dateStr.=$parts['hour']; if (!is_null($parts['minute'])) { $dateStr.=':'; } } else { // We know either minute or second _must_ be set, so we insert a // dash for an empty value. $dateStr.='-'; } // Minute if (!is_null($parts['minute'])) { $dateStr.=$parts['minute']; if (!is_null($parts['second'])) { $dateStr.=':'; } } else { if (isset($parts['second'])) { // Dash for empty minute $dateStr.='-'; } } // Second if (!is_null($parts['second'])) { $dateStr.=$parts['second']; } // Timezone if (!is_null($parts['timezone'])) { $dateStr.=$parts['timezone']; } return array($dateStr); } } DateTime.php000066400000000000000000000012701361462701300337740ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/VCardsetValue($val); } /** * Returns a raw mime-dir representation of the value. * * @return string */ public function getRawMimeDirValue() { return $this->value; } /** * Returns the type of value. * * This corresponds to the VALUE= parameter. Every property also has a * 'default' valueType. * * @return string */ public function getValueType() { return "LANGUAGE-TAG"; } } TimeStamp.php000066400000000000000000000030301361462701300341770ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Property/VCardgetValue()); $dateStr = $parts['year'] . '-' . $parts['month'] . '-' . $parts['date'] . 'T' . $parts['hour'] . ':' . $parts['minute'] . ':' . $parts['second']; // Timezone if (!is_null($parts['timezone'])) { $dateStr.=$parts['timezone']; } return array($dateStr); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Reader.php000066400000000000000000000036271361462701300307460ustar00rootroot00000000000000parse($data, $options); return $result; } /** * Parses a jCard or jCal object, and returns the top component. * * The options argument is a bitfield. Pass any of the OPTIONS constant to * alter the parsers' behaviour. * * You can either a string, a readable stream, or an array for it's input. * Specifying the array is useful if json_decode was already called on the * input. * * @param string|resource|array $data * @param int $options * @return Node */ static function readJson($data, $options = 0) { $parser = new Parser\Json(); $result = $parser->parse($data, $options); return $result; } } RecurrenceIterator.php000066400000000000000000001011211361462701300332600ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject 0, 'MO' => 1, 'TU' => 2, 'WE' => 3, 'TH' => 4, 'FR' => 5, 'SA' => 6, ); /** * Mappings between the day number and english day name. * * @var array */ private $dayNames = array( 0 => 'Sunday', 1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', ); /** * If the current iteration of the event is an overriden event, this * property will hold the VObject * * @var Component */ private $currentOverriddenEvent; /** * This property may contain the date of the next not-overridden event. * This date is calculated sometimes a bit early, before overridden events * are evaluated. * * @var DateTime */ private $nextDate; /** * This counts the number of overridden events we've handled so far * * @var int */ private $handledOverridden = 0; /** * Creates the iterator * * You should pass a VCALENDAR component, as well as the UID of the event * we're going to traverse. * * @param Component $vcal * @param string|null $uid */ public function __construct(Component $vcal, $uid=null) { if (is_null($uid)) { if ($vcal instanceof Component\VCalendar) { throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well'); } $components = array($vcal); $uid = (string)$vcal->uid; } else { $components = $vcal->select('VEVENT'); } foreach($components as $component) { if ((string)$component->uid == $uid) { if (isset($component->{'RECURRENCE-ID'})) { $this->overriddenEvents[$component->DTSTART->getDateTime()->getTimeStamp()] = $component; $this->overriddenDates[] = $component->{'RECURRENCE-ID'}->getDateTime(); } else { $this->baseEvent = $component; } } } ksort($this->overriddenEvents); if (!$this->baseEvent) { // No base event was found. CalDAV does allow cases where only // overridden instances are stored. // // In this barticular case, we're just going to grab the first // event and use that instead. This may not always give the // desired result. if (!count($this->overriddenEvents)) { throw new \InvalidArgumentException('Could not find an event with uid: ' . $uid); } ksort($this->overriddenEvents, SORT_NUMERIC); $this->baseEvent = array_shift($this->overriddenEvents); } $this->startDate = clone $this->baseEvent->DTSTART->getDateTime(); $this->endDate = null; if (isset($this->baseEvent->DTEND)) { $this->endDate = clone $this->baseEvent->DTEND->getDateTime(); } else { $this->endDate = clone $this->startDate; if (isset($this->baseEvent->DURATION)) { $this->endDate->add(DateTimeParser::parse((string)$this->baseEvent->DURATION)); } elseif (!$this->baseEvent->DTSTART->hasTime()) { $this->endDate->modify('+1 day'); } } $this->currentDate = clone $this->startDate; $rrule = $this->baseEvent->RRULE; // If no rrule was specified, we create a default setting if (!$rrule) { $this->frequency = 'daily'; $this->count = 1; } else foreach($rrule->getParts() as $key=>$value) { switch($key) { case 'FREQ' : if (!in_array( strtolower($value), array('secondly','minutely','hourly','daily','weekly','monthly','yearly') )) { throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value)); } $this->frequency = strtolower($value); break; case 'UNTIL' : $this->until = DateTimeParser::parse($value); // In some cases events are generated with an UNTIL= // parameter before the actual start of the event. // // Not sure why this is happening. We assume that the // intention was that the event only recurs once. // // So we are modifying the parameter so our code doesn't // break. if($this->until < $this->baseEvent->DTSTART->getDateTime()) { $this->until = $this->baseEvent->DTSTART->getDateTime(); } break; case 'COUNT' : $this->count = (int)$value; break; case 'INTERVAL' : $this->interval = (int)$value; if ($this->interval < 1) { throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!'); } break; case 'BYSECOND' : $this->bySecond = (array)$value; break; case 'BYMINUTE' : $this->byMinute = (array)$value; break; case 'BYHOUR' : $this->byHour = (array)$value; break; case 'BYDAY' : $this->byDay = (array)$value; break; case 'BYMONTHDAY' : $this->byMonthDay = (array)$value; break; case 'BYYEARDAY' : $this->byYearDay = (array)$value; break; case 'BYWEEKNO' : $this->byWeekNo = (array)$value; break; case 'BYMONTH' : $this->byMonth = (array)$value; break; case 'BYSETPOS' : $this->bySetPos = (array)$value; break; case 'WKST' : $this->weekStart = strtoupper($value); break; } } // Parsing exception dates if (isset($this->baseEvent->EXDATE)) { foreach($this->baseEvent->EXDATE as $exDate) { foreach(explode(',', (string)$exDate) as $exceptionDate) { $this->exceptionDates[] = DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone()); } } } } /** * Returns the current item in the list * * @return DateTime */ public function current() { if (!$this->valid()) return null; return clone $this->currentDate; } /** * This method returns the startdate for the current iteration of the * event. * * @return DateTime */ public function getDtStart() { if (!$this->valid()) return null; return clone $this->currentDate; } /** * This method returns the enddate for the current iteration of the * event. * * @return DateTime */ public function getDtEnd() { if (!$this->valid()) return null; $dtEnd = clone $this->currentDate; $dtEnd->add( $this->startDate->diff( $this->endDate ) ); return clone $dtEnd; } /** * Returns a VEVENT object with the updated start and end date. * * Any recurrence information is removed, and this function may return an * 'overridden' event instead. * * This method always returns a cloned instance. * * @return Component\VEvent */ public function getEventObject() { if ($this->currentOverriddenEvent) { return clone $this->currentOverriddenEvent; } $event = clone $this->baseEvent; unset($event->RRULE); unset($event->EXDATE); unset($event->RDATE); unset($event->EXRULE); $event->DTSTART->setDateTime($this->getDTStart()); if (isset($event->DTEND)) { $event->DTEND->setDateTime($this->getDtEnd()); } if ($this->counter > 0) { $event->{'RECURRENCE-ID'} = (string)$event->DTSTART; } return $event; } /** * Returns the current item number * * @return int */ public function key() { return $this->counter; } /** * Whether or not there is a 'next item' * * @return bool */ public function valid() { if (!is_null($this->count)) { return $this->counter < $this->count; } if (!is_null($this->until) && $this->currentDate > $this->until) { // Need to make sure there's no overridden events past the // until date. foreach($this->overriddenEvents as $overriddenEvent) { if ($overriddenEvent->DTSTART->getDateTime() >= $this->currentDate) { return true; } } return false; } return true; } /** * Resets the iterator * * @return void */ public function rewind() { $this->currentDate = clone $this->startDate; $this->counter = 0; } /** * This method allows you to quickly go to the next occurrence after the * specified date. * * Note that this checks the current 'endDate', not the 'stardDate'. This * means that if you forward to January 1st, the iterator will stop at the * first event that ends *after* January 1st. * * @param DateTime $dt * @return void */ public function fastForward(\DateTime $dt) { while($this->valid() && $this->getDTEnd() <= $dt) { $this->next(); } } /** * Returns true if this recurring event never ends. * * @return bool */ public function isInfinite() { return !$this->count && !$this->until; } /** * Goes on to the next iteration * * @return void */ public function next() { $previousStamp = $this->currentDate->getTimeStamp(); // Finding the next overridden event in line, and storing that for // later use. $overriddenEvent = null; $overriddenDate = null; $this->currentOverriddenEvent = null; foreach($this->overriddenEvents as $index=>$event) { if ($index > $previousStamp) { $overriddenEvent = $event; $overriddenDate = clone $event->DTSTART->getDateTime(); break; } } // If we have a stored 'next date', we will use that. if ($this->nextDate) { if (!$overriddenDate || $this->nextDate < $overriddenDate) { $this->currentDate = $this->nextDate; $currentStamp = $this->currentDate->getTimeStamp(); $this->nextDate = null; } else { $this->currentDate = clone $overriddenDate; $this->currentOverriddenEvent = $overriddenEvent; } $this->counter++; return; } while(true) { // Otherwise, we find the next event in the normal RRULE // sequence. switch($this->frequency) { case 'hourly' : $this->nextHourly(); break; case 'daily' : $this->nextDaily(); break; case 'weekly' : $this->nextWeekly(); break; case 'monthly' : $this->nextMonthly(); break; case 'yearly' : $this->nextYearly(); break; } $currentStamp = $this->currentDate->getTimeStamp(); // Checking exception dates foreach($this->exceptionDates as $exceptionDate) { if ($this->currentDate == $exceptionDate) { $this->counter++; continue 2; } } foreach($this->overriddenDates as $check) { if ($this->currentDate == $check) { continue 2; } } break; } // Is the date we have actually higher than the next overiddenEvent? if ($overriddenDate && $this->currentDate > $overriddenDate) { $this->nextDate = clone $this->currentDate; $this->currentDate = clone $overriddenDate; $this->currentOverriddenEvent = $overriddenEvent; $this->handledOverridden++; } $this->counter++; /* * If we have overridden events left in the queue, but our counter is * running out, we should grab one of those. */ if (!is_null($overriddenEvent) && !is_null($this->count) && count($this->overriddenEvents) - $this->handledOverridden >= ($this->count - $this->counter)) { $this->currentOverriddenEvent = $overriddenEvent; $this->currentDate = clone $overriddenDate; $this->handledOverridden++; } } /** * Does the processing for advancing the iterator for hourly frequency. * * @return void */ protected function nextHourly() { if (!$this->byHour) { $this->currentDate->modify('+' . $this->interval . ' hours'); return; } // @codeCoverageIgnoreStart } // @codeCoverageIgnoreEnd /** * Does the processing for advancing the iterator for daily frequency. * * @return void */ protected function nextDaily() { if (!$this->byHour && !$this->byDay) { $this->currentDate->modify('+' . $this->interval . ' days'); return; } if (isset($this->byHour)) { $recurrenceHours = $this->getHours(); } if (isset($this->byDay)) { $recurrenceDays = $this->getDays(); } do { if ($this->byHour) { if ($this->currentDate->format('G') == '23') { // to obey the interval rule $this->currentDate->modify('+' . $this->interval-1 . ' days'); } $this->currentDate->modify('+1 hours'); } else { $this->currentDate->modify('+' . $this->interval . ' days'); } // Current day of the week $currentDay = $this->currentDate->format('w'); // Current hour of the day $currentHour = $this->currentDate->format('G'); } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours))); } /** * Does the processing for advancing the iterator for weekly frequency. * * @return void */ protected function nextWeekly() { if (!$this->byHour && !$this->byDay) { $this->currentDate->modify('+' . $this->interval . ' weeks'); return; } if ($this->byHour) { $recurrenceHours = $this->getHours(); } if ($this->byDay) { $recurrenceDays = $this->getDays(); } // First day of the week: $firstDay = $this->dayMap[$this->weekStart]; do { if ($this->byHour) { $this->currentDate->modify('+1 hours'); } else { $this->currentDate->modify('+1 days'); } // Current day of the week $currentDay = (int) $this->currentDate->format('w'); // Current hour of the day $currentHour = (int) $this->currentDate->format('G'); // We need to roll over to the next week if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) { $this->currentDate->modify('+' . $this->interval-1 . ' weeks'); // We need to go to the first day of this week, but only if we // are not already on this first day of this week. if($this->currentDate->format('w') != $firstDay) { $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]); } } // We have a match } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours))); } /** * Does the processing for advancing the iterator for monthly frequency. * * @return void */ protected function nextMonthly() { $currentDayOfMonth = $this->currentDate->format('j'); if (!$this->byMonthDay && !$this->byDay) { // If the current day is higher than the 28th, rollover can // occur to the next month. We Must skip these invalid // entries. if ($currentDayOfMonth < 29) { $this->currentDate->modify('+' . $this->interval . ' months'); } else { $increase = 0; do { $increase++; $tempDate = clone $this->currentDate; $tempDate->modify('+ ' . ($this->interval*$increase) . ' months'); } while ($tempDate->format('j') != $currentDayOfMonth); $this->currentDate = $tempDate; } return; } while(true) { $occurrences = $this->getMonthlyOccurrences(); foreach($occurrences as $occurrence) { // The first occurrence thats higher than the current // day of the month wins. if ($occurrence > $currentDayOfMonth) { break 2; } } // If we made it all the way here, it means there were no // valid occurrences, and we need to advance to the next // month. $this->currentDate->modify('first day of this month'); $this->currentDate->modify('+ ' . $this->interval . ' months'); // This goes to 0 because we need to start counting at hte // beginning. $currentDayOfMonth = 0; } $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence); } /** * Does the processing for advancing the iterator for yearly frequency. * * @return void */ protected function nextYearly() { $currentMonth = $this->currentDate->format('n'); $currentYear = $this->currentDate->format('Y'); $currentDayOfMonth = $this->currentDate->format('j'); // No sub-rules, so we just advance by year if (!$this->byMonth) { // Unless it was a leap day! if ($currentMonth==2 && $currentDayOfMonth==29) { $counter = 0; do { $counter++; // Here we increase the year count by the interval, until // we hit a date that's also in a leap year. // // We could just find the next interval that's dividable by // 4, but that would ignore the rule that there's no leap // year every year that's dividable by a 100, but not by // 400. (1800, 1900, 2100). So we just rely on the datetime // functions instead. $nextDate = clone $this->currentDate; $nextDate->modify('+ ' . ($this->interval*$counter) . ' years'); } while ($nextDate->format('n')!=2); $this->currentDate = $nextDate; return; } // The easiest form $this->currentDate->modify('+' . $this->interval . ' years'); return; } $currentMonth = $this->currentDate->format('n'); $currentYear = $this->currentDate->format('Y'); $currentDayOfMonth = $this->currentDate->format('j'); $advancedToNewMonth = false; // If we got a byDay or getMonthDay filter, we must first expand // further. if ($this->byDay || $this->byMonthDay) { while(true) { $occurrences = $this->getMonthlyOccurrences(); foreach($occurrences as $occurrence) { // The first occurrence that's higher than the current // day of the month wins. // If we advanced to the next month or year, the first // occurrence is always correct. if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) { break 2; } } // If we made it here, it means we need to advance to // the next month or year. $currentDayOfMonth = 1; $advancedToNewMonth = true; do { $currentMonth++; if ($currentMonth>12) { $currentYear+=$this->interval; $currentMonth = 1; } } while (!in_array($currentMonth, $this->byMonth)); $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); } // If we made it here, it means we got a valid occurrence $this->currentDate->setDate($currentYear, $currentMonth, $occurrence); return; } else { // These are the 'byMonth' rules, if there are no byDay or // byMonthDay sub-rules. do { $currentMonth++; if ($currentMonth>12) { $currentYear+=$this->interval; $currentMonth = 1; } } while (!in_array($currentMonth, $this->byMonth)); $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); return; } } /** * Returns all the occurrences for a monthly frequency with a 'byDay' or * 'byMonthDay' expansion for the current month. * * The returned list is an array of integers with the day of month (1-31). * * @return array */ protected function getMonthlyOccurrences() { $startDate = clone $this->currentDate; $byDayResults = array(); // Our strategy is to simply go through the byDays, advance the date to // that point and add it to the results. if ($this->byDay) foreach($this->byDay as $day) { $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]]; // Dayname will be something like 'wednesday'. Now we need to find // all wednesdays in this month. $dayHits = array(); $checkDate = clone $startDate; $checkDate->modify('first day of this month'); $checkDate->modify($dayName); do { $dayHits[] = $checkDate->format('j'); $checkDate->modify('next ' . $dayName); } while ($checkDate->format('n') === $startDate->format('n')); // So now we have 'all wednesdays' for month. It is however // possible that the user only really wanted the 1st, 2nd or last // wednesday. if (strlen($day)>2) { $offset = (int)substr($day,0,-2); if ($offset>0) { // It is possible that the day does not exist, such as a // 5th or 6th wednesday of the month. if (isset($dayHits[$offset-1])) { $byDayResults[] = $dayHits[$offset-1]; } } else { // if it was negative we count from the end of the array $byDayResults[] = $dayHits[count($dayHits) + $offset]; } } else { // There was no counter (first, second, last wednesdays), so we // just need to add the all to the list). $byDayResults = array_merge($byDayResults, $dayHits); } } $byMonthDayResults = array(); if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) { // Removing values that are out of range for this month if ($monthDay > $startDate->format('t') || $monthDay < 0-$startDate->format('t')) { continue; } if ($monthDay>0) { $byMonthDayResults[] = $monthDay; } else { // Negative values $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay; } } // If there was just byDay or just byMonthDay, they just specify our // (almost) final list. If both were provided, then byDay limits the // list. if ($this->byMonthDay && $this->byDay) { $result = array_intersect($byMonthDayResults, $byDayResults); } elseif ($this->byMonthDay) { $result = $byMonthDayResults; } else { $result = $byDayResults; } $result = array_unique($result); sort($result, SORT_NUMERIC); // The last thing that needs checking is the BYSETPOS. If it's set, it // means only certain items in the set survive the filter. if (!$this->bySetPos) { return $result; } $filteredResult = array(); foreach($this->bySetPos as $setPos) { if ($setPos<0) { $setPos = count($result)-($setPos+1); } if (isset($result[$setPos-1])) { $filteredResult[] = $result[$setPos-1]; } } sort($filteredResult, SORT_NUMERIC); return $filteredResult; } protected function getHours() { $recurrenceHours = array(); foreach($this->byHour as $byHour) { $recurrenceHours[] = $byHour; } return $recurrenceHours; } protected function getDays() { $recurrenceDays = array(); foreach($this->byDay as $byDay) { // The day may be preceeded with a positive (+n) or // negative (-n) integer. However, this does not make // sense in 'weekly' so we ignore it here. $recurrenceDays[] = $this->dayMap[substr($byDay,-2)]; } return $recurrenceDays; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Splitter/000077500000000000000000000000001361462701300306315ustar00rootroot00000000000000ICalendar.php000066400000000000000000000056061361462701300331140ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Splitterchildren() as $component) { if (!$component instanceof VObject\Component) { continue; } // Get all timezones if ($component->name === 'VTIMEZONE') { $this->vtimezones[(string)$component->TZID] = $component; continue; } // Get component UID for recurring Events search if($component->UID) { $uid = (string)$component->UID; } else { // Generating a random UID $uid = sha1(microtime()) . '-vobjectimport'; } // Take care of recurring events if (!array_key_exists($uid, $this->objects)) { $this->objects[$uid] = new VCalendar(); } $this->objects[$uid]->add(clone $component); } } /** * Every time getNext() is called, a new object will be parsed, until we * hit the end of the stream. * * When the end is reached, null will be returned. * * @return SabreForRainLoop\VObject\Component|null */ public function getNext() { if($object=array_shift($this->objects)) { // create our baseobject $object->version = '2.0'; $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN'; $object->calscale = 'GREGORIAN'; // add vtimezone information to obj (if we have it) foreach ($this->vtimezones as $vtimezone) { $object->add($vtimezone); } return $object; } else { return null; } } } SplitterInterface.php000066400000000000000000000020041361462701300347060ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Splitterinput = $input; $this->parser = new MimeDir($input, $options); } /** * Every time getNext() is called, a new object will be parsed, until we * hit the end of the stream. * * When the end is reached, null will be returned. * * @return SabreForRainLoop\VObject\Component|null */ public function getNext() { try { $object = $this->parser->parse(); } catch (VObject\EofException $e) { return null; } return $object; } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/StringUtil.php000066400000000000000000000027101361462701300316400ustar00rootroot00000000000000'Australia/Darwin', 'AUS Eastern Standard Time'=>'Australia/Sydney', 'Afghanistan Standard Time'=>'Asia/Kabul', 'Alaskan Standard Time'=>'America/Anchorage', 'Arab Standard Time'=>'Asia/Riyadh', 'Arabian Standard Time'=>'Asia/Dubai', 'Arabic Standard Time'=>'Asia/Baghdad', 'Argentina Standard Time'=>'America/Buenos_Aires', 'Armenian Standard Time'=>'Asia/Yerevan', 'Atlantic Standard Time'=>'America/Halifax', 'Azerbaijan Standard Time'=>'Asia/Baku', 'Azores Standard Time'=>'Atlantic/Azores', 'Bangladesh Standard Time'=>'Asia/Dhaka', 'Canada Central Standard Time'=>'America/Regina', 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde', 'Caucasus Standard Time'=>'Asia/Yerevan', 'Cen. Australia Standard Time'=>'Australia/Adelaide', 'Central America Standard Time'=>'America/Guatemala', 'Central Asia Standard Time'=>'Asia/Almaty', 'Central Brazilian Standard Time'=>'America/Cuiaba', 'Central Europe Standard Time'=>'Europe/Budapest', 'Central European Standard Time'=>'Europe/Warsaw', 'Central Pacific Standard Time'=>'Pacific/Guadalcanal', 'Central Standard Time'=>'America/Chicago', 'Central Standard Time (Mexico)'=>'America/Mexico_City', 'China Standard Time'=>'Asia/Shanghai', 'Dateline Standard Time'=>'Etc/GMT+12', 'E. Africa Standard Time'=>'Africa/Nairobi', 'E. Australia Standard Time'=>'Australia/Brisbane', 'E. Europe Standard Time'=>'Europe/Minsk', 'E. South America Standard Time'=>'America/Sao_Paulo', 'Eastern Standard Time'=>'America/New_York', 'Egypt Standard Time'=>'Africa/Cairo', 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg', 'FLE Standard Time'=>'Europe/Kiev', 'Fiji Standard Time'=>'Pacific/Fiji', 'GMT Standard Time'=>'Europe/London', 'GTB Standard Time'=>'Europe/Istanbul', 'Georgian Standard Time'=>'Asia/Tbilisi', 'Greenland Standard Time'=>'America/Godthab', 'Greenwich Standard Time'=>'Atlantic/Reykjavik', 'Hawaiian Standard Time'=>'Pacific/Honolulu', 'India Standard Time'=>'Asia/Calcutta', 'Iran Standard Time'=>'Asia/Tehran', 'Israel Standard Time'=>'Asia/Jerusalem', 'Jordan Standard Time'=>'Asia/Amman', 'Kamchatka Standard Time'=>'Asia/Kamchatka', 'Korea Standard Time'=>'Asia/Seoul', 'Magadan Standard Time'=>'Asia/Magadan', 'Mauritius Standard Time'=>'Indian/Mauritius', 'Mexico Standard Time'=>'America/Mexico_City', 'Mexico Standard Time 2'=>'America/Chihuahua', 'Mid-Atlantic Standard Time'=>'Etc/GMT-2', 'Middle East Standard Time'=>'Asia/Beirut', 'Montevideo Standard Time'=>'America/Montevideo', 'Morocco Standard Time'=>'Africa/Casablanca', 'Mountain Standard Time'=>'America/Denver', 'Mountain Standard Time (Mexico)'=>'America/Chihuahua', 'Myanmar Standard Time'=>'Asia/Rangoon', 'N. Central Asia Standard Time'=>'Asia/Novosibirsk', 'Namibia Standard Time'=>'Africa/Windhoek', 'Nepal Standard Time'=>'Asia/Katmandu', 'New Zealand Standard Time'=>'Pacific/Auckland', 'Newfoundland Standard Time'=>'America/St_Johns', 'North Asia East Standard Time'=>'Asia/Irkutsk', 'North Asia Standard Time'=>'Asia/Krasnoyarsk', 'Pacific SA Standard Time'=>'America/Santiago', 'Pacific Standard Time'=>'America/Los_Angeles', 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel', 'Pakistan Standard Time'=>'Asia/Karachi', 'Paraguay Standard Time'=>'America/Asuncion', 'Romance Standard Time'=>'Europe/Paris', 'Russian Standard Time'=>'Europe/Moscow', 'SA Eastern Standard Time'=>'America/Cayenne', 'SA Pacific Standard Time'=>'America/Bogota', 'SA Western Standard Time'=>'America/La_Paz', 'SE Asia Standard Time'=>'Asia/Bangkok', 'Samoa Standard Time'=>'Pacific/Apia', 'Singapore Standard Time'=>'Asia/Singapore', 'South Africa Standard Time'=>'Africa/Johannesburg', 'Sri Lanka Standard Time'=>'Asia/Colombo', 'Syria Standard Time'=>'Asia/Damascus', 'Taipei Standard Time'=>'Asia/Taipei', 'Tasmania Standard Time'=>'Australia/Hobart', 'Tokyo Standard Time'=>'Asia/Tokyo', 'Tonga Standard Time'=>'Pacific/Tongatapu', 'US Eastern Standard Time'=>'America/Indianapolis', 'US Mountain Standard Time'=>'America/Phoenix', 'UTC+12'=>'Etc/GMT-12', 'UTC-02'=>'Etc/GMT+2', 'UTC-11'=>'Etc/GMT+11', 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar', 'Venezuela Standard Time'=>'America/Caracas', 'Vladivostok Standard Time'=>'Asia/Vladivostok', 'W. Australia Standard Time'=>'Australia/Perth', 'W. Central Africa Standard Time'=>'Africa/Lagos', 'W. Europe Standard Time'=>'Europe/Berlin', 'West Asia Standard Time'=>'Asia/Tashkent', 'West Pacific Standard Time'=>'Pacific/Port_Moresby', 'Yakutsk Standard Time'=>'Asia/Yakutsk', // Microsoft exchange timezones // Source: // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx // // Correct timezones deduced with help from: // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones 'Universal Coordinated Time' => 'UTC', 'Casablanca, Monrovia' => 'Africa/Casablanca', 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon', 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London', 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin', 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague', 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris', 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris', 'Prague, Central Europe' => 'Europe/Prague', 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo', 'West Central Africa' => 'Africa/Luanda', // This was a best guess 'Athens, Istanbul, Minsk' => 'Europe/Athens', 'Bucharest' => 'Europe/Bucharest', 'Cairo' => 'Africa/Cairo', 'Harare, Pretoria' => 'Africa/Harare', 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki', 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem', 'Baghdad' => 'Asia/Baghdad', 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait', 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow', 'East Africa, Nairobi' => 'Africa/Nairobi', 'Tehran' => 'Asia/Tehran', 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess 'Baku, Tbilisi, Yerevan' => 'Asia/Baku', 'Kabul' => 'Asia/Kabul', 'Ekaterinburg' => 'Asia/Yekaterinburg', 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi', 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta', 'Kathmandu, Nepal' => 'Asia/Kathmandu', 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty', 'Astana, Dhaka' => 'Asia/Dhaka', 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo', 'Rangoon' => 'Asia/Rangoon', 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok', 'Krasnoyarsk' => 'Asia/Krasnoyarsk', 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai', 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk', 'Kuala Lumpur, Singapore' => 'Asia/Singapore', 'Perth, Western Australia' => 'Australia/Perth', 'Taipei' => 'Asia/Taipei', 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo', 'Seoul, Korea Standard time' => 'Asia/Seoul', 'Yakutsk' => 'Asia/Yakutsk', 'Adelaide, Central Australia' => 'Australia/Adelaide', 'Darwin' => 'Australia/Darwin', 'Brisbane, East Australia' => 'Australia/Brisbane', 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney', 'Guam, Port Moresby' => 'Pacific/Guam', 'Hobart, Tasmania' => 'Australia/Hobart', 'Vladivostok' => 'Asia/Vladivostok', 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan', 'Auckland, Wellington' => 'Pacific/Auckland', 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji', 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu', 'Azores' => 'Atlantic/Azores', 'Cape Verde Is.' => 'Atlantic/Cape_Verde', 'Mid-Atlantic' => 'America/Noronha', 'Brasilia' => 'America/Sao_Paulo', // Best guess 'Buenos Aires' => 'America/Argentina/Buenos_Aires', 'Greenland' => 'America/Godthab', 'Newfoundland' => 'America/St_Johns', 'Atlantic Time (Canada)' => 'America/Halifax', 'Caracas, La Paz' => 'America/Caracas', 'Santiago' => 'America/Santiago', 'Bogota, Lima, Quito' => 'America/Bogota', 'Eastern Time (US & Canada)' => 'America/New_York', 'Indiana (East)' => 'America/Indiana/Indianapolis', 'Central America' => 'America/Guatemala', 'Central Time (US & Canada)' => 'America/Chicago', 'Mexico City, Tegucigalpa' => 'America/Mexico_City', 'Saskatchewan' => 'America/Edmonton', 'Arizona' => 'America/Phoenix', 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess 'Alaska' => 'America/Anchorage', 'Hawaii' => 'Pacific/Honolulu', 'Midway Island, Samoa' => 'Pacific/Midway', 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein', // The following list are timezone names that could be generated by // Lotus / Domino 'Dateline' => 'Etc/GMT-12', 'Samoa' => 'Pacific/Apia', 'Hawaiian' => 'Pacific/Honolulu', 'Alaskan' => 'America/Anchorage', 'Pacific' => 'America/Los_Angeles', 'Pacific Standard Time' => 'America/Los_Angeles', 'Mexico Standard Time 2' => 'America/Chihuahua', 'Mountain' => 'America/Denver', 'Mountain Standard Time' => 'America/Chihuahua', 'US Mountain' => 'America/Phoenix', 'Canada Central' => 'America/Edmonton', 'Central America' => 'America/Guatemala', 'Central' => 'America/Chicago', 'Central Standard Time' => 'America/Mexico_City', 'Mexico' => 'America/Mexico_City', 'Eastern' => 'America/New_York', 'SA Pacific' => 'America/Bogota', 'US Eastern' => 'America/Indiana/Indianapolis', 'Venezuela' => 'America/Caracas', 'Atlantic' => 'America/Halifax', 'Central Brazilian' => 'America/Manaus', 'Pacific SA' => 'America/Santiago', 'SA Western' => 'America/La_Paz', 'Newfoundland' => 'America/St_Johns', 'Argentina' => 'America/Argentina/Buenos_Aires', 'E. South America' => 'America/Belem', 'Greenland' => 'America/Godthab', 'Montevideo' => 'America/Montevideo', 'SA Eastern' => 'America/Belem', 'Mid-Atlantic' => 'Etc/GMT-2', 'Azores' => 'Atlantic/Azores', 'Cape Verde' => 'Atlantic/Cape_Verde', 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT. 'Morocco' => 'Africa/Casablanca', 'Central Europe' => 'Europe/Prague', 'Central European' => 'Europe/Sarajevo', 'Romance' => 'Europe/Paris', 'W. Central Africa' => 'Africa/Lagos', // Best guess 'W. Europe' => 'Europe/Amsterdam', 'E. Europe' => 'Europe/Minsk', 'Egypt' => 'Africa/Cairo', 'FLE' => 'Europe/Helsinki', 'GTB' => 'Europe/Athens', 'Israel' => 'Asia/Jerusalem', 'Jordan' => 'Asia/Amman', 'Middle East' => 'Asia/Beirut', 'Namibia' => 'Africa/Windhoek', 'South Africa' => 'Africa/Harare', 'Arab' => 'Asia/Kuwait', 'Arabic' => 'Asia/Baghdad', 'E. Africa' => 'Africa/Nairobi', 'Georgian' => 'Asia/Tbilisi', 'Russian' => 'Europe/Moscow', 'Iran' => 'Asia/Tehran', 'Arabian' => 'Asia/Muscat', 'Armenian' => 'Asia/Yerevan', 'Azerbijan' => 'Asia/Baku', 'Caucasus' => 'Asia/Yerevan', 'Mauritius' => 'Indian/Mauritius', 'Afghanistan' => 'Asia/Kabul', 'Ekaterinburg' => 'Asia/Yekaterinburg', 'Pakistan' => 'Asia/Karachi', 'West Asia' => 'Asia/Tashkent', 'India' => 'Asia/Calcutta', 'Sri Lanka' => 'Asia/Colombo', 'Nepal' => 'Asia/Kathmandu', 'Central Asia' => 'Asia/Dhaka', 'N. Central Asia' => 'Asia/Almaty', 'Myanmar' => 'Asia/Rangoon', 'North Asia' => 'Asia/Krasnoyarsk', 'SE Asia' => 'Asia/Bangkok', 'China' => 'Asia/Shanghai', 'North Asia East' => 'Asia/Irkutsk', 'Singapore' => 'Asia/Singapore', 'Taipei' => 'Asia/Taipei', 'W. Australia' => 'Australia/Perth', 'Korea' => 'Asia/Seoul', 'Tokyo' => 'Asia/Tokyo', 'Yakutsk' => 'Asia/Yakutsk', 'AUS Central' => 'Australia/Darwin', 'Cen. Australia' => 'Australia/Adelaide', 'AUS Eastern' => 'Australia/Sydney', 'E. Australia' => 'Australia/Brisbane', 'Tasmania' => 'Australia/Hobart', 'Vladivostok' => 'Asia/Vladivostok', 'West Pacific' => 'Pacific/Guam', 'Central Pacific' => 'Asia/Magadan', 'Fiji' => 'Pacific/Fiji', 'New Zealand' => 'Pacific/Auckland', 'Tonga' => 'Pacific/Tongatapu', ); /** * List of microsoft exchange timezone ids. * * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx */ public static $microsoftExchangeMap = array( 0 => 'UTC', 31 => 'Africa/Casablanca', // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo. // I'm not even kidding.. We handle this special case in the // getTimeZone method. 2 => 'Europe/Lisbon', 1 => 'Europe/London', 4 => 'Europe/Berlin', 6 => 'Europe/Prague', 3 => 'Europe/Paris', 69 => 'Africa/Luanda', // This was a best guess 7 => 'Europe/Athens', 5 => 'Europe/Bucharest', 49 => 'Africa/Cairo', 50 => 'Africa/Harare', 59 => 'Europe/Helsinki', 27 => 'Asia/Jerusalem', 26 => 'Asia/Baghdad', 74 => 'Asia/Kuwait', 51 => 'Europe/Moscow', 56 => 'Africa/Nairobi', 25 => 'Asia/Tehran', 24 => 'Asia/Muscat', // Best guess 54 => 'Asia/Baku', 48 => 'Asia/Kabul', 58 => 'Asia/Yekaterinburg', 47 => 'Asia/Karachi', 23 => 'Asia/Calcutta', 62 => 'Asia/Kathmandu', 46 => 'Asia/Almaty', 71 => 'Asia/Dhaka', 66 => 'Asia/Colombo', 61 => 'Asia/Rangoon', 22 => 'Asia/Bangkok', 64 => 'Asia/Krasnoyarsk', 45 => 'Asia/Shanghai', 63 => 'Asia/Irkutsk', 21 => 'Asia/Singapore', 73 => 'Australia/Perth', 75 => 'Asia/Taipei', 20 => 'Asia/Tokyo', 72 => 'Asia/Seoul', 70 => 'Asia/Yakutsk', 19 => 'Australia/Adelaide', 44 => 'Australia/Darwin', 18 => 'Australia/Brisbane', 76 => 'Australia/Sydney', 43 => 'Pacific/Guam', 42 => 'Australia/Hobart', 68 => 'Asia/Vladivostok', 41 => 'Asia/Magadan', 17 => 'Pacific/Auckland', 40 => 'Pacific/Fiji', 67 => 'Pacific/Tongatapu', 29 => 'Atlantic/Azores', 53 => 'Atlantic/Cape_Verde', 30 => 'America/Noronha', 8 => 'America/Sao_Paulo', // Best guess 32 => 'America/Argentina/Buenos_Aires', 60 => 'America/Godthab', 28 => 'America/St_Johns', 9 => 'America/Halifax', 33 => 'America/Caracas', 65 => 'America/Santiago', 35 => 'America/Bogota', 10 => 'America/New_York', 34 => 'America/Indiana/Indianapolis', 55 => 'America/Guatemala', 11 => 'America/Chicago', 37 => 'America/Mexico_City', 36 => 'America/Edmonton', 38 => 'America/Phoenix', 12 => 'America/Denver', // Best guess 13 => 'America/Los_Angeles', // Best guess 14 => 'America/Anchorage', 15 => 'Pacific/Honolulu', 16 => 'Pacific/Midway', 39 => 'Pacific/Kwajalein', ); /** * This method will try to find out the correct timezone for an iCalendar * date-time value. * * You must pass the contents of the TZID parameter, as well as the full * calendar. * * If the lookup fails, this method will return the default PHP timezone * (as configured using date_default_timezone_set, or the date.timezone ini * setting). * * Alternatively, if $failIfUncertain is set to true, it will throw an * exception if we cannot accurately determine the timezone. * * @param string $tzid * @param SabreForRainLoop\VObject\Component $vcalendar * @return DateTimeZone */ static public function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) { // First we will just see if the tzid is a support timezone identifier. try { return new \DateTimeZone($tzid); } catch (\Exception $e) { } // Next, we check if the tzid is somewhere in our tzid map. if (isset(self::$map[$tzid])) { return new \DateTimeZone(self::$map[$tzid]); } // Maybe the author was hyper-lazy and just included an offset. We // support it, but we aren't happy about it. if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) { return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2],0,2),'0')); } if ($vcalendar) { // If that didn't work, we will scan VTIMEZONE objects foreach($vcalendar->select('VTIMEZONE') as $vtimezone) { if ((string)$vtimezone->TZID === $tzid) { // Some clients add 'X-LIC-LOCATION' with the olson name. if (isset($vtimezone->{'X-LIC-LOCATION'})) { $lic = (string)$vtimezone->{'X-LIC-LOCATION'}; // Libical generators may specify strings like // "SystemV/EST5EDT". For those we must remove the // SystemV part. if (substr($lic,0,8)==='SystemV/') { $lic = substr($lic,8); } try { return new \DateTimeZone($lic); } catch (\Exception $e) { } } // Microsoft may add a magic number, which we also have an // answer for. if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) { $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue(); // 2 can mean both Europe/Lisbon and Europe/Sarajevo. if ($cdoId===2 && strpos((string)$vtimezone->TZID, 'Sarajevo')!==false) { return new \DateTimeZone('Europe/Sarajevo'); } if (isset(self::$microsoftExchangeMap[$cdoId])) { return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]); } } } } } if ($failIfUncertain) { throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid); } // If we got all the way here, we default to UTC. return new \DateTimeZone(date_default_timezone_get()); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/VCardConverter.php000066400000000000000000000272271361462701300324350ustar00rootroot00000000000000getDocumentType(); if ($inputVersion===$targetVersion) { return clone $input; } if (!in_array($inputVersion, array(Document::VCARD21, Document::VCARD30, Document::VCARD40))) { throw new \InvalidArgumentException('Only vCard 2.1, 3.0 and 4.0 are supported for the input data'); } if (!in_array($targetVersion, array(Document::VCARD30, Document::VCARD40))) { throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version'); } $newVersion = $targetVersion===Document::VCARD40?'4.0':'3.0'; $output = new Component\VCard(array( 'VERSION' => $newVersion, )); foreach($input->children as $property) { $this->convertProperty($input, $output, $property, $targetVersion); } return $output; } /** * Handles conversion of a single property. * * @param Component\VCard $input * @param Component\VCard $output * @param Property $property * @param int $targetVersion * @return void */ protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) { // Skipping these, those are automatically added. if (in_array($property->name, array('VERSION', 'PRODID'))) { return; } $parameters = $property->parameters(); $valueType = null; if (isset($parameters['VALUE'])) { $valueType = $parameters['VALUE']->getValue(); unset($parameters['VALUE']); } if (!$valueType) { $valueType = $property->getValueType(); } $newProperty = null; if ($targetVersion===Document::VCARD30) { if ($property instanceof Property\Uri && in_array($property->name, array('PHOTO','LOGO','SOUND'))) { $newProperty = $this->convertUriToBinary($output, $property, $parameters); } elseif ($property->name === 'KIND') { switch(strtolower($property->getValue())) { case 'org' : // OS X addressbook property. $newProperty = $output->createProperty('X-ABSHOWAS','COMPANY'); break; case 'individual' : // Individual is implied, so we can just skip it. return; case 'group' : // OS X addressbook property $newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND','GROUP'); break; } } } elseif ($targetVersion===Document::VCARD40) { // These properties were removed in vCard 4.0 if (in_array($property->name, array('NAME', 'MAILER', 'LABEL', 'CLASS'))) { return; } if ($property instanceOf Property\Binary) { $newProperty = $this->convertBinaryToUri($output, $property, $parameters); } else { switch($property->name) { case 'X-ABSHOWAS' : if (strtoupper($property->getValue()) === 'COMPANY') { $newProperty = $output->createProperty('KIND','org'); } break; case 'X-ADDRESSBOOKSERVER-KIND' : if (strtoupper($property->getValue()) === 'GROUP') { $newProperty = $output->createProperty('KIND','group'); } break; } } } if (is_null($newProperty)) { $newProperty = $output->createProperty( $property->name, $property->getParts(), array(), // no parameters yet $valueType ); } // set property group $newProperty->group = $property->group; if ($targetVersion===Document::VCARD40) { $this->convertParameters40($newProperty, $parameters); } else { $this->convertParameters30($newProperty, $parameters); } // Lastly, we need to see if there's a need for a VALUE parameter. // // We can do that by instantating a empty property with that name, and // seeing if the default valueType is identical to the current one. $tempProperty = $output->createProperty($newProperty->name); if ($tempProperty->getValueType() !== $newProperty->getValueType()) { $newProperty['VALUE'] = $newProperty->getValueType(); } $output->add($newProperty); } /** * Converts a BINARY property to a URI property. * * vCard 4.0 no longer supports BINARY properties. * * @param Component\VCard $output * @param Property\Uri $property The input property. * @param $parameters List of parameters that will eventually be added to * the new property. * @return Property\Uri */ protected function convertBinaryToUri(Component\VCard $output, Property\Binary $property, array &$parameters) { $newProperty = $output->createProperty( $property->name, null, // no value array(), // no parameters yet 'URI' // Forcing the BINARY type ); $mimeType = 'application/octet-stream'; // See if we can find a better mimetype. if (isset($parameters['TYPE'])) { $newTypes = array(); foreach($parameters['TYPE']->getParts() as $typePart) { if (in_array( strtoupper($typePart), array('JPEG','PNG','GIF') )) { $mimeType = 'image/' . strtolower($typePart); } else { $newTypes[] = $typePart; } } // If there were any parameters we're not converting to a // mime-type, we need to keep them. if ($newTypes) { $parameters['TYPE']->setParts($newTypes); } else { unset($parameters['TYPE']); } } $newProperty->setValue('data:' . $mimeType . ';base64,' . base64_encode($property->getValue())); return $newProperty; } /** * Converts a URI property to a BINARY property. * * In vCard 4.0 attachments are encoded as data: uri. Even though these may * be valid in vCard 3.0 as well, we should convert those to BINARY if * possible, to improve compatibility. * * @param Component\VCard $output * @param Property\Uri $property The input property. * @param $parameters List of parameters that will eventually be added to * the new property. * @return Property\Binary|null */ protected function convertUriToBinary(Component\VCard $output, Property\Uri $property, array &$parameters) { $value = $property->getValue(); // Only converting data: uris if (substr($value, 0, 5)!=='data:') { return; } $newProperty = $output->createProperty( $property->name, null, // no value array(), // no parameters yet 'BINARY' ); $mimeType = substr($value, 5, strpos($value, ',')-5); if (strpos($mimeType, ';')) { $mimeType = substr($mimeType,0,strpos($mimeType, ';')); $newProperty->setValue(base64_decode(substr($value, strpos($value,',')+1))); } else { $newProperty->setValue(substr($value, strpos($value,',')+1)); } unset($value); $newProperty['ENCODING'] = 'b'; switch($mimeType) { case 'image/jpeg' : $newProperty['TYPE'] = 'JPEG'; break; case 'image/png' : $newProperty['TYPE'] = 'PNG'; break; case 'image/gif' : $newProperty['TYPE'] = 'GIF'; break; } return $newProperty; } /** * Adds parameters to a new property for vCard 4.0 * * @param Property $newProperty * @param array $parameters * @return void */ protected function convertParameters40(Property $newProperty, array $parameters) { // Adding all parameters. foreach($parameters as $param) { // vCard 2.1 allowed parameters with no name if ($param->noName) $param->noName = false; switch($param->name) { // We need to see if there's any TYPE=PREF, because in vCard 4 // that's now PREF=1. case 'TYPE' : foreach($param->getParts() as $paramPart) { if (strtoupper($paramPart)==='PREF') { $newProperty->add('PREF','1'); } else { $newProperty->add($param->name, $paramPart); } } break; // These no longer exist in vCard 4 case 'ENCODING' : case 'CHARSET' : break; default : $newProperty->add($param->name, $param->getParts()); break; } } } /** * Adds parameters to a new property for vCard 3.0 * * @param Property $newProperty * @param array $parameters * @return void */ protected function convertParameters30(Property $newProperty, array $parameters) { // Adding all parameters. foreach($parameters as $param) { // vCard 2.1 allowed parameters with no name if ($param->noName) $param->noName = false; switch($param->name) { case 'ENCODING' : // This value only existed in vCard 2.1, and should be // removed for anything else. if (strtoupper($param->getValue())!=='QUOTED-PRINTABLE') { $newProperty->add($param->name, $param->getParts()); } break; /* * Converting PREF=1 to TYPE=PREF. * * Any other PREF numbers we'll drop. */ case 'PREF' : if ($param->getValue()=='1') { $newProperty->add('TYPE','PREF'); } break; default : $newProperty->add($param->name, $param->getParts()); break; } } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/SabreForRainLoop/VObject/Version.php000066400000000000000000000006301361462701300311600ustar00rootroot00000000000000 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/lessphp/README.md000066400000000000000000000054011361462701300252550ustar00rootroot00000000000000# lessphp v0.3.9 ### [![Build Status](https://secure.travis-ci.org/leafo/lessphp.png)](http://travis-ci.org/leafo/lessphp) `lessphp` is a compiler for LESS written in PHP. The documentation is great, so check it out: . Here's a quick tutorial: ### How to use in your PHP project The only file required is `lessc.inc.php`, so copy that to your include directory. The typical flow of **lessphp** is to create a new instance of `lessc`, configure it how you like, then tell it to compile something using one built in compile methods. The `compile` method compiles a string of LESS code to CSS. ```php compile(".block { padding: 3 + 4px }"); ``` The `compileFile` method reads and compiles a file. It will either return the result or write it to the path specified by an optional second argument. ```php compileFile("input.less"); ``` The `compileChecked` method is like `compileFile`, but it only compiles if the output file doesn't exist or it's older than the input file: ```php checkedCompile("input.less", "output.css"); ``` If there any problem compiling your code, an exception is thrown with a helpful message: ```php compile("invalid LESS } {"); } catch (exception $e) { echo "fatal error: " . $e->getMessage(); } ``` The `lessc` object can be configured through an assortment of instance methods. Some possible configuration options include [changing the output format][1], [setting variables from PHP][2], and [controlling the preservation of comments][3], writing [custom functions][4] and much more. It's all described in [the documentation][0]. [0]: http://leafo.net/lessphp/docs/ [1]: http://leafo.net/lessphp/docs/#output_formatting [2]: http://leafo.net/lessphp/docs/#setting_variables_from_php [3]: http://leafo.net/lessphp/docs/#preserving_comments [4]: http://leafo.net/lessphp/docs/#custom_functions ### How to use from the command line An additional script has been included to use the compiler from the command line. In the simplest invocation, you specify an input file and the compiled css is written to standard out: $ plessc input.less > output.css Using the -r flag, you can specify LESS code directly as an argument or, if the argument is left off, from standard in: $ plessc -r "my less code here" Finally, by using the -w flag you can watch a specified input file and have it compile as needed to the output file: $ plessc -w input-file output-file Errors from watch mode are written to standard out. The -f flag sets the [output formatter][1]. For example, to compress the output run this: $ plessc -f=compressed myfile.less For more help, run `plessc --help` rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/lessphp/ctype.php000066400000000000000000000010631361462701300256330ustar00rootroot00000000000000 * Licensed under MIT or GPLv3, see LICENSE */ /** * The less compiler and parser. * * Converting LESS to CSS is a three stage process. The incoming file is parsed * by `lessc_parser` into a syntax tree, then it is compiled into another tree * representing the CSS structure by `lessc`. The CSS tree is fed into a * formatter, like `lessc_formatter` which then outputs CSS as a string. * * During the first compile, all values are *reduced*, which means that their * types are brought to the lowest form before being dump as strings. This * handles math equations, variable dereferences, and the like. * * The `parse` function of `lessc` is the entry point. * * In summary: * * The `lessc` class creates an intstance of the parser, feeds it LESS code, * then transforms the resulting tree to a CSS tree. This class also holds the * evaluation context, such as all available mixins and variables at any given * time. * * The `lessc_parser` class is only concerned with parsing its input. * * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string, * handling things like indentation. */ class lessc { static public $VERSION = "v0.3.9"; static protected $TRUE = array("keyword", "true"); static protected $FALSE = array("keyword", "false"); protected $libFunctions = array(); protected $registeredVars = array(); protected $preserveComments = false; public $vPrefix = '@'; // prefix of abstract properties public $mPrefix = '$'; // prefix of abstract blocks public $parentSelector = '&'; public $importDisabled = false; public $importDir = ''; protected $numberPrecision = null; // set to the parser that generated the current line when compiling // so we know how to create error messages protected $sourceParser = null; protected $sourceLoc = null; static public $defaultValue = array("keyword", ""); static protected $nextImportId = 0; // uniquely identify imports // attempts to find the path of an import url, returns null for css files protected function findImport($url) { foreach ((array)$this->importDir as $dir) { $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url; if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) { return $file; } } return null; } protected function fileExists($name) { return is_file($name); } static public function compressList($items, $delim) { if (!isset($items[1]) && isset($items[0])) return $items[0]; else return array('list', $delim, $items); } static public function preg_quote($what) { return preg_quote($what, '/'); } protected function tryImport($importPath, $parentBlock, $out) { if ($importPath[0] == "function" && $importPath[1] == "url") { $importPath = $this->flattenList($importPath[2]); } $str = $this->coerceString($importPath); if ($str === null) return false; $url = $this->compileValue($this->lib_e($str)); // don't import if it ends in css if (substr_compare($url, '.css', -4, 4) === 0) return false; $realPath = $this->findImport($url); if ($realPath === null) return false; if ($this->importDisabled) { return array(false, "/* import disabled */"); } $this->addParsedFile($realPath); $parser = $this->makeParser($realPath); $root = $parser->parse(file_get_contents($realPath)); // set the parents of all the block props foreach ($root->props as $prop) { if ($prop[0] == "block") { $prop[1]->parent = $parentBlock; } } // copy mixins into scope, set their parents // bring blocks from import into current block // TODO: need to mark the source parser these came from this file foreach ($root->children as $childName => $child) { if (isset($parentBlock->children[$childName])) { $parentBlock->children[$childName] = array_merge( $parentBlock->children[$childName], $child); } else { $parentBlock->children[$childName] = $child; } } $pi = pathinfo($realPath); $dir = $pi["dirname"]; list($top, $bottom) = $this->sortProps($root->props, true); $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir); return array(true, $bottom, $parser, $dir); } protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) { $oldSourceParser = $this->sourceParser; $oldImport = $this->importDir; // TODO: this is because the importDir api is stupid $this->importDir = (array)$this->importDir; array_unshift($this->importDir, $importDir); foreach ($props as $prop) { $this->compileProp($prop, $block, $out); } $this->importDir = $oldImport; $this->sourceParser = $oldSourceParser; } /** * Recursively compiles a block. * * A block is analogous to a CSS block in most cases. A single LESS document * is encapsulated in a block when parsed, but it does not have parent tags * so all of it's children appear on the root level when compiled. * * Blocks are made up of props and children. * * Props are property instructions, array tuples which describe an action * to be taken, eg. write a property, set a variable, mixin a block. * * The children of a block are just all the blocks that are defined within. * This is used to look up mixins when performing a mixin. * * Compiling the block involves pushing a fresh environment on the stack, * and iterating through the props, compiling each one. * * See lessc::compileProp() * */ protected function compileBlock($block) { switch ($block->type) { case "root": $this->compileRoot($block); break; case null: $this->compileCSSBlock($block); break; case "media": $this->compileMedia($block); break; case "directive": $name = "@" . $block->name; if (!empty($block->value)) { $name .= " " . $this->compileValue($this->reduce($block->value)); } $this->compileNestedBlock($block, array($name)); break; default: $this->throwError("unknown block type: $block->type\n"); } } protected function compileCSSBlock($block) { $env = $this->pushEnv(); $selectors = $this->compileSelectors($block->tags); $env->selectors = $this->multiplySelectors($selectors); $out = $this->makeOutputBlock(null, $env->selectors); $this->scope->children[] = $out; $this->compileProps($block, $out); $block->scope = $env; // mixins carry scope with them! $this->popEnv(); } protected function compileMedia($media) { $env = $this->pushEnv($media); $parentScope = $this->mediaParent($this->scope); $query = $this->compileMediaQuery($this->multiplyMedia($env)); $this->scope = $this->makeOutputBlock($media->type, array($query)); $parentScope->children[] = $this->scope; $this->compileProps($media, $this->scope); if (count($this->scope->lines) > 0) { $orphanSelelectors = $this->findClosestSelectors(); if (!is_null($orphanSelelectors)) { $orphan = $this->makeOutputBlock(null, $orphanSelelectors); $orphan->lines = $this->scope->lines; array_unshift($this->scope->children, $orphan); $this->scope->lines = array(); } } $this->scope = $this->scope->parent; $this->popEnv(); } protected function mediaParent($scope) { while (!empty($scope->parent)) { if (!empty($scope->type) && $scope->type != "media") { break; } $scope = $scope->parent; } return $scope; } protected function compileNestedBlock($block, $selectors) { $this->pushEnv($block); $this->scope = $this->makeOutputBlock($block->type, $selectors); $this->scope->parent->children[] = $this->scope; $this->compileProps($block, $this->scope); $this->scope = $this->scope->parent; $this->popEnv(); } protected function compileRoot($root) { $this->pushEnv(); $this->scope = $this->makeOutputBlock($root->type); $this->compileProps($root, $this->scope); $this->popEnv(); } protected function compileProps($block, $out) { foreach ($this->sortProps($block->props) as $prop) { $this->compileProp($prop, $block, $out); } } protected function sortProps($props, $split = false) { $vars = array(); $imports = array(); $other = array(); foreach ($props as $prop) { switch ($prop[0]) { case "assign": if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) { $vars[] = $prop; } else { $other[] = $prop; } break; case "import": $id = self::$nextImportId++; $prop[] = $id; $imports[] = $prop; $other[] = array("import_mixin", $id); break; default: $other[] = $prop; } } if ($split) { return array(array_merge($vars, $imports), $other); } else { return array_merge($vars, $imports, $other); } } protected function compileMediaQuery($queries) { $compiledQueries = array(); foreach ($queries as $query) { $parts = array(); foreach ($query as $q) { switch ($q[0]) { case "mediaType": $parts[] = implode(" ", array_slice($q, 1)); break; case "mediaExp": if (isset($q[2])) { $parts[] = "($q[1]: " . $this->compileValue($this->reduce($q[2])) . ")"; } else { $parts[] = "($q[1])"; } break; case "variable": $parts[] = $this->compileValue($this->reduce($q)); break; } } if (count($parts) > 0) { $compiledQueries[] = implode(" and ", $parts); } } $out = "@media"; if (!empty($parts)) { $out .= " " . implode($this->formatter->selectorSeparator, $compiledQueries); } return $out; } protected function multiplyMedia($env, $childQueries = null) { if (is_null($env) || !empty($env->block->type) && $env->block->type != "media") { return $childQueries; } // plain old block, skip if (empty($env->block->type)) { return $this->multiplyMedia($env->parent, $childQueries); } $out = array(); $queries = $env->block->queries; if (is_null($childQueries)) { $out = $queries; } else { foreach ($queries as $parent) { foreach ($childQueries as $child) { $out[] = array_merge($parent, $child); } } } return $this->multiplyMedia($env->parent, $out); } protected function expandParentSelectors(&$tag, $replace) { $parts = explode("$&$", $tag); $count = 0; foreach ($parts as &$part) { $part = str_replace($this->parentSelector, $replace, $part, $c); $count += $c; } $tag = implode($this->parentSelector, $parts); return $count; } protected function findClosestSelectors() { $env = $this->env; $selectors = null; while ($env !== null) { if (isset($env->selectors)) { $selectors = $env->selectors; break; } $env = $env->parent; } return $selectors; } // multiply $selectors against the nearest selectors in env protected function multiplySelectors($selectors) { // find parent selectors $parentSelectors = $this->findClosestSelectors(); if (is_null($parentSelectors)) { // kill parent reference in top level selector foreach ($selectors as &$s) { $this->expandParentSelectors($s, ""); } return $selectors; } $out = array(); foreach ($parentSelectors as $parent) { foreach ($selectors as $child) { $count = $this->expandParentSelectors($child, $parent); // don't prepend the parent tag if & was used if ($count > 0) { $out[] = trim($child); } else { $out[] = trim($parent . ' ' . $child); } } } return $out; } // reduces selector expressions protected function compileSelectors($selectors) { $out = array(); foreach ($selectors as $s) { if (is_array($s)) { list(, $value) = $s; $out[] = trim($this->compileValue($this->reduce($value))); } else { $out[] = $s; } } return $out; } protected function eq($left, $right) { return $left == $right; } protected function patternMatch($block, $callingArgs) { // match the guards if it has them // any one of the groups must have all its guards pass for a match if (!empty($block->guards)) { $groupPassed = false; foreach ($block->guards as $guardGroup) { foreach ($guardGroup as $guard) { $this->pushEnv(); $this->zipSetArgs($block->args, $callingArgs); $negate = false; if ($guard[0] == "negate") { $guard = $guard[1]; $negate = true; } $passed = $this->reduce($guard) == self::$TRUE; if ($negate) $passed = !$passed; $this->popEnv(); if ($passed) { $groupPassed = true; } else { $groupPassed = false; break; } } if ($groupPassed) break; } if (!$groupPassed) { return false; } } $numCalling = count($callingArgs); if (empty($block->args)) { return $block->isVararg || $numCalling == 0; } $i = -1; // no args // try to match by arity or by argument literal foreach ($block->args as $i => $arg) { switch ($arg[0]) { case "lit": if (empty($callingArgs[$i]) || !$this->eq($arg[1], $callingArgs[$i])) { return false; } break; case "arg": // no arg and no default value if (!isset($callingArgs[$i]) && !isset($arg[2])) { return false; } break; case "rest": $i--; // rest can be empty break 2; } } if ($block->isVararg) { return true; // not having enough is handled above } else { $numMatched = $i + 1; // greater than becuase default values always match return $numMatched >= $numCalling; } } protected function patternMatchAll($blocks, $callingArgs) { $matches = null; foreach ($blocks as $block) { if ($this->patternMatch($block, $callingArgs)) { $matches[] = $block; } } return $matches; } // attempt to find blocks matched by path and args protected function findBlocks($searchIn, $path, $args, $seen=array()) { if ($searchIn == null) return null; if (isset($seen[$searchIn->id])) return null; $seen[$searchIn->id] = true; $name = $path[0]; if (isset($searchIn->children[$name])) { $blocks = $searchIn->children[$name]; if (count($path) == 1) { $matches = $this->patternMatchAll($blocks, $args); if (!empty($matches)) { // This will return all blocks that match in the closest // scope that has any matching block, like lessjs return $matches; } } else { $matches = array(); foreach ($blocks as $subBlock) { $subMatches = $this->findBlocks($subBlock, array_slice($path, 1), $args, $seen); if (!is_null($subMatches)) { foreach ($subMatches as $sm) { $matches[] = $sm; } } } return count($matches) > 0 ? $matches : null; } } if ($searchIn->parent === $searchIn) return null; return $this->findBlocks($searchIn->parent, $path, $args, $seen); } // sets all argument names in $args to either the default value // or the one passed in through $values protected function zipSetArgs($args, $values) { $i = 0; $assignedValues = array(); foreach ($args as $a) { if ($a[0] == "arg") { if ($i < count($values) && !is_null($values[$i])) { $value = $values[$i]; } elseif (isset($a[2])) { $value = $a[2]; } else $value = null; $value = $this->reduce($value); $this->set($a[1], $value); $assignedValues[] = $value; } $i++; } // check for a rest $last = end($args); if ($last[0] == "rest") { $rest = array_slice($values, count($args) - 1); $this->set($last[1], $this->reduce(array("list", " ", $rest))); } $this->env->arguments = $assignedValues; } // compile a prop and update $lines or $blocks appropriately protected function compileProp($prop, $block, $out) { // set error position context $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1; switch ($prop[0]) { case 'assign': list(, $name, $value) = $prop; if ($name[0] == $this->vPrefix) { $this->set($name, $value); } else { $out->lines[] = $this->formatter->property($name, $this->compileValue($this->reduce($value))); } break; case 'block': list(, $child) = $prop; $this->compileBlock($child); break; case 'mixin': list(, $path, $args, $suffix) = $prop; $args = array_map(array($this, "reduce"), (array)$args); $mixins = $this->findBlocks($block, $path, $args); if ($mixins === null) { // fwrite(STDERR,"failed to find block: ".implode(" > ", $path)."\n"); break; // throw error here?? } foreach ($mixins as $mixin) { $haveScope = false; if (isset($mixin->parent->scope)) { $haveScope = true; $mixinParentEnv = $this->pushEnv(); $mixinParentEnv->storeParent = $mixin->parent->scope; } $haveArgs = false; if (isset($mixin->args)) { $haveArgs = true; $this->pushEnv(); $this->zipSetArgs($mixin->args, $args); } $oldParent = $mixin->parent; if ($mixin != $block) $mixin->parent = $block; foreach ($this->sortProps($mixin->props) as $subProp) { if ($suffix !== null && $subProp[0] == "assign" && is_string($subProp[1]) && $subProp[1]{0} != $this->vPrefix) { $subProp[2] = array( 'list', ' ', array($subProp[2], array('keyword', $suffix)) ); } $this->compileProp($subProp, $mixin, $out); } $mixin->parent = $oldParent; if ($haveArgs) $this->popEnv(); if ($haveScope) $this->popEnv(); } break; case 'raw': $out->lines[] = $prop[1]; break; case "directive": list(, $name, $value) = $prop; $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';'; break; case "comment": $out->lines[] = $prop[1]; break; case "import"; list(, $importPath, $importId) = $prop; $importPath = $this->reduce($importPath); if (!isset($this->env->imports)) { $this->env->imports = array(); } $result = $this->tryImport($importPath, $block, $out); $this->env->imports[$importId] = $result === false ? array(false, "@import " . $this->compileValue($importPath).";") : $result; break; case "import_mixin": list(,$importId) = $prop; $import = $this->env->imports[$importId]; if ($import[0] === false) { $out->lines[] = $import[1]; } else { list(, $bottom, $parser, $importDir) = $import; $this->compileImportedProps($bottom, $block, $out, $parser, $importDir); } break; default: $this->throwError("unknown op: {$prop[0]}\n"); } } /** * Compiles a primitive value into a CSS property value. * * Values in lessphp are typed by being wrapped in arrays, their format is * typically: * * array(type, contents [, additional_contents]*) * * The input is expected to be reduced. This function will not work on * things like expressions and variables. */ protected function compileValue($value) { switch ($value[0]) { case 'list': // [1] - delimiter // [2] - array of values return implode($value[1], array_map(array($this, 'compileValue'), $value[2])); case 'raw_color': if (!empty($this->formatter->compressColors)) { return $this->compileValue($this->coerceColor($value)); } return $value[1]; case 'keyword': // [1] - the keyword return $value[1]; case 'number': list(, $num, $unit) = $value; // [1] - the number // [2] - the unit if ($this->numberPrecision !== null) { $num = round($num, $this->numberPrecision); } return $num . $unit; case 'string': // [1] - contents of string (includes quotes) list(, $delim, $content) = $value; foreach ($content as &$part) { if (is_array($part)) { $part = $this->compileValue($part); } } return $delim . implode($content) . $delim; case 'color': // [1] - red component (either number or a %) // [2] - green component // [3] - blue component // [4] - optional alpha component list(, $r, $g, $b) = $value; $r = round($r); $g = round($g); $b = round($b); if (count($value) == 5 && $value[4] != 1) { // rgba return 'rgba('.$r.','.$g.','.$b.','.$value[4].')'; } $h = sprintf("#%02x%02x%02x", $r, $g, $b); if (!empty($this->formatter->compressColors)) { // Converting hex color to short notation (e.g. #003399 to #039) if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { $h = '#' . $h[1] . $h[3] . $h[5]; } } return $h; case 'function': list(, $name, $args) = $value; return $name.'('.$this->compileValue($args).')'; default: // assumed to be unit $this->throwError("unknown value type: $value[0]"); } } protected function lib_isnumber($value) { return $this->toBool($value[0] == "number"); } protected function lib_isstring($value) { return $this->toBool($value[0] == "string"); } protected function lib_iscolor($value) { return $this->toBool($this->coerceColor($value)); } protected function lib_iskeyword($value) { return $this->toBool($value[0] == "keyword"); } protected function lib_ispixel($value) { return $this->toBool($value[0] == "number" && $value[2] == "px"); } protected function lib_ispercentage($value) { return $this->toBool($value[0] == "number" && $value[2] == "%"); } protected function lib_isem($value) { return $this->toBool($value[0] == "number" && $value[2] == "em"); } protected function lib_isrem($value) { return $this->toBool($value[0] == "number" && $value[2] == "rem"); } protected function lib_rgbahex($color) { $color = $this->coerceColor($color); if (is_null($color)) $this->throwError("color expected for rgbahex"); return sprintf("#%02x%02x%02x%02x", isset($color[4]) ? $color[4]*255 : 255, $color[1],$color[2], $color[3]); } protected function lib_argb($color){ return $this->lib_rgbahex($color); } // utility func to unquote a string protected function lib_e($arg) { switch ($arg[0]) { case "list": $items = $arg[2]; if (isset($items[0])) { return $this->lib_e($items[0]); } return self::$defaultValue; case "string": $arg[1] = ""; return $arg; case "keyword": return $arg; default: return array("keyword", $this->compileValue($arg)); } } protected function lib__sprintf($args) { if ($args[0] != "list") return $args; $values = $args[2]; $string = array_shift($values); $template = $this->compileValue($this->lib_e($string)); $i = 0; if (preg_match_all('/%[dsa]/', $template, $m)) { foreach ($m[0] as $match) { $val = isset($values[$i]) ? $this->reduce($values[$i]) : array('keyword', ''); // lessjs compat, renders fully expanded color, not raw color if ($color = $this->coerceColor($val)) { $val = $color; } $i++; $rep = $this->compileValue($this->lib_e($val)); $template = preg_replace('/'.self::preg_quote($match).'/', $rep, $template, 1); } } $d = $string[0] == "string" ? $string[1] : '"'; return array("string", $d, array($template)); } protected function lib_floor($arg) { $value = $this->assertNumber($arg); return array("number", floor($value), $arg[2]); } protected function lib_ceil($arg) { $value = $this->assertNumber($arg); return array("number", ceil($value), $arg[2]); } protected function lib_round($arg) { $value = $this->assertNumber($arg); return array("number", round($value), $arg[2]); } protected function lib_unit($arg) { if ($arg[0] == "list") { list($number, $newUnit) = $arg[2]; return array("number", $this->assertNumber($number), $this->compileValue($this->lib_e($newUnit))); } else { return array("number", $this->assertNumber($arg), ""); } } /** * Helper function to get arguments for color manipulation functions. * takes a list that contains a color like thing and a percentage */ protected function colorArgs($args) { if ($args[0] != 'list' || count($args[2]) < 2) { return array(array('color', 0, 0, 0), 0); } list($color, $delta) = $args[2]; $color = $this->assertColor($color); $delta = floatval($delta[1]); return array($color, $delta); } protected function lib_darken($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[3] = $this->clamp($hsl[3] - $delta, 100); return $this->toRGB($hsl); } protected function lib_lighten($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[3] = $this->clamp($hsl[3] + $delta, 100); return $this->toRGB($hsl); } protected function lib_saturate($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[2] = $this->clamp($hsl[2] + $delta, 100); return $this->toRGB($hsl); } protected function lib_desaturate($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[2] = $this->clamp($hsl[2] - $delta, 100); return $this->toRGB($hsl); } protected function lib_spin($args) { list($color, $delta) = $this->colorArgs($args); $hsl = $this->toHSL($color); $hsl[1] = $hsl[1] + $delta % 360; if ($hsl[1] < 0) $hsl[1] += 360; return $this->toRGB($hsl); } protected function lib_fadeout($args) { list($color, $delta) = $this->colorArgs($args); $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100); return $color; } protected function lib_fadein($args) { list($color, $delta) = $this->colorArgs($args); $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100); return $color; } protected function lib_hue($color) { $hsl = $this->toHSL($this->assertColor($color)); return round($hsl[1]); } protected function lib_saturation($color) { $hsl = $this->toHSL($this->assertColor($color)); return round($hsl[2]); } protected function lib_lightness($color) { $hsl = $this->toHSL($this->assertColor($color)); return round($hsl[3]); } // get the alpha of a color // defaults to 1 for non-colors or colors without an alpha protected function lib_alpha($value) { if (!is_null($color = $this->coerceColor($value))) { return isset($color[4]) ? $color[4] : 1; } } // set the alpha of the color protected function lib_fade($args) { list($color, $alpha) = $this->colorArgs($args); $color[4] = $this->clamp($alpha / 100.0); return $color; } protected function lib_percentage($arg) { $num = $this->assertNumber($arg); return array("number", $num*100, "%"); } // mixes two colors by weight // mix(@color1, @color2, @weight); // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method protected function lib_mix($args) { if ($args[0] != "list" || count($args[2]) < 3) $this->throwError("mix expects (color1, color2, weight)"); list($first, $second, $weight) = $args[2]; $first = $this->assertColor($first); $second = $this->assertColor($second); $first_a = $this->lib_alpha($first); $second_a = $this->lib_alpha($second); $weight = $weight[1] / 100.0; $w = $weight * 2 - 1; $a = $first_a - $second_a; $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0; $w2 = 1.0 - $w1; $new = array('color', $w1 * $first[1] + $w2 * $second[1], $w1 * $first[2] + $w2 * $second[2], $w1 * $first[3] + $w2 * $second[3], ); if ($first_a != 1.0 || $second_a != 1.0) { $new[] = $first_a * $weight + $second_a * ($weight - 1); } return $this->fixColor($new); } protected function lib_contrast($args) { if ($args[0] != 'list' || count($args[2]) < 3) { return array(array('color', 0, 0, 0), 0); } list($inputColor, $darkColor, $lightColor) = $args[2]; $inputColor = $this->assertColor($inputColor); $darkColor = $this->assertColor($darkColor); $lightColor = $this->assertColor($lightColor); $hsl = $this->toHSL($inputColor); if ($hsl[3] > 50) { return $darkColor; } return $lightColor; } protected function assertColor($value, $error = "expected color value") { $color = $this->coerceColor($value); if (is_null($color)) $this->throwError($error); return $color; } protected function assertNumber($value, $error = "expecting number") { if ($value[0] == "number") return $value[1]; $this->throwError($error); } protected function toHSL($color) { if ($color[0] == 'hsl') return $color; $r = $color[1] / 255; $g = $color[2] / 255; $b = $color[3] / 255; $min = min($r, $g, $b); $max = max($r, $g, $b); $L = ($min + $max) / 2; if ($min == $max) { $S = $H = 0; } else { if ($L < 0.5) $S = ($max - $min)/($max + $min); else $S = ($max - $min)/(2.0 - $max - $min); if ($r == $max) $H = ($g - $b)/($max - $min); elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min); elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min); } $out = array('hsl', ($H < 0 ? $H + 6 : $H)*60, $S*100, $L*100, ); if (count($color) > 4) $out[] = $color[4]; // copy alpha return $out; } protected function toRGB_helper($comp, $temp1, $temp2) { if ($comp < 0) $comp += 1.0; elseif ($comp > 1) $comp -= 1.0; if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp; if (2 * $comp < 1) return $temp2; if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6; return $temp1; } /** * Converts a hsl array into a color value in rgb. * Expects H to be in range of 0 to 360, S and L in 0 to 100 */ protected function toRGB($color) { if ($color[0] == 'color') return $color; $H = $color[1] / 360; $S = $color[2] / 100; $L = $color[3] / 100; if ($S == 0) { $r = $g = $b = $L; } else { $temp2 = $L < 0.5 ? $L*(1.0 + $S) : $L + $S - $L * $S; $temp1 = 2.0 * $L - $temp2; $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2); $g = $this->toRGB_helper($H, $temp1, $temp2); $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2); } // $out = array('color', round($r*255), round($g*255), round($b*255)); $out = array('color', $r*255, $g*255, $b*255); if (count($color) > 4) $out[] = $color[4]; // copy alpha return $out; } protected function clamp($v, $max = 1, $min = 0) { return min($max, max($min, $v)); } /** * Convert the rgb, rgba, hsl color literals of function type * as returned by the parser into values of color type. */ protected function funcToColor($func) { $fname = $func[1]; if ($func[2][0] != 'list') return false; // need a list of arguments $rawComponents = $func[2][2]; if ($fname == 'hsl' || $fname == 'hsla') { $hsl = array('hsl'); $i = 0; foreach ($rawComponents as $c) { $val = $this->reduce($c); $val = isset($val[1]) ? floatval($val[1]) : 0; if ($i == 0) $clamp = 360; elseif ($i < 3) $clamp = 100; else $clamp = 1; $hsl[] = $this->clamp($val, $clamp); $i++; } while (count($hsl) < 4) $hsl[] = 0; return $this->toRGB($hsl); } elseif ($fname == 'rgb' || $fname == 'rgba') { $components = array(); $i = 1; foreach ($rawComponents as $c) { $c = $this->reduce($c); if ($i < 4) { if ($c[0] == "number" && $c[2] == "%") { $components[] = 255 * ($c[1] / 100); } else { $components[] = floatval($c[1]); } } elseif ($i == 4) { if ($c[0] == "number" && $c[2] == "%") { $components[] = 1.0 * ($c[1] / 100); } else { $components[] = floatval($c[1]); } } else break; $i++; } while (count($components) < 3) $components[] = 0; array_unshift($components, 'color'); return $this->fixColor($components); } return false; } protected function reduce($value, $forExpression = false) { switch ($value[0]) { case "interpolate": $reduced = $this->reduce($value[1]); $var = $this->compileValue($reduced); $res = $this->reduce(array("variable", $this->vPrefix . $var)); if (empty($value[2])) $res = $this->lib_e($res); return $res; case "variable": $key = $value[1]; if (is_array($key)) { $key = $this->reduce($key); $key = $this->vPrefix . $this->compileValue($this->lib_e($key)); } $seen =& $this->env->seenNames; if (!empty($seen[$key])) { $this->throwError("infinite loop detected: $key"); } $seen[$key] = true; $out = $this->reduce($this->get($key, self::$defaultValue)); $seen[$key] = false; return $out; case "list": foreach ($value[2] as &$item) { $item = $this->reduce($item, $forExpression); } return $value; case "expression": return $this->evaluate($value); case "string": foreach ($value[2] as &$part) { if (is_array($part)) { $strip = $part[0] == "variable"; $part = $this->reduce($part); if ($strip) $part = $this->lib_e($part); } } return $value; case "escape": list(,$inner) = $value; return $this->lib_e($this->reduce($inner)); case "function": $color = $this->funcToColor($value); if ($color) return $color; list(, $name, $args) = $value; if ($name == "%") $name = "_sprintf"; $f = isset($this->libFunctions[$name]) ? $this->libFunctions[$name] : array($this, 'lib_'.$name); if (is_callable($f)) { if ($args[0] == 'list') $args = self::compressList($args[2], $args[1]); $ret = call_user_func($f, $this->reduce($args, true), $this); if (is_null($ret)) { return array("string", "", array( $name, "(", $args, ")" )); } // convert to a typed value if the result is a php primitive if (is_numeric($ret)) $ret = array('number', $ret, ""); elseif (!is_array($ret)) $ret = array('keyword', $ret); return $ret; } // plain function, reduce args $value[2] = $this->reduce($value[2]); return $value; case "unary": list(, $op, $exp) = $value; $exp = $this->reduce($exp); if ($exp[0] == "number") { switch ($op) { case "+": return $exp; case "-": $exp[1] *= -1; return $exp; } } return array("string", "", array($op, $exp)); } if ($forExpression) { switch ($value[0]) { case "keyword": if ($color = $this->coerceColor($value)) { return $color; } break; case "raw_color": return $this->coerceColor($value); } } return $value; } // coerce a value for use in color operation protected function coerceColor($value) { switch($value[0]) { case 'color': return $value; case 'raw_color': $c = array("color", 0, 0, 0); $colorStr = substr($value[1], 1); $num = hexdec($colorStr); $width = strlen($colorStr) == 3 ? 16 : 256; for ($i = 3; $i > 0; $i--) { // 3 2 1 $t = $num % $width; $num /= $width; $c[$i] = $t * (256/$width) + $t * floor(16/$width); } return $c; case 'keyword': $name = $value[1]; if (isset(self::$cssColors[$name])) { $rgba = explode(',', self::$cssColors[$name]); if(isset($rgba[3])) return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]); return array('color', $rgba[0], $rgba[1], $rgba[2]); } return null; } } // make something string like into a string protected function coerceString($value) { switch ($value[0]) { case "string": return $value; case "keyword": return array("string", "", array($value[1])); } return null; } // turn list of length 1 into value type protected function flattenList($value) { if ($value[0] == "list" && count($value[2]) == 1) { return $this->flattenList($value[2][0]); } return $value; } protected function toBool($a) { if ($a) return self::$TRUE; else return self::$FALSE; } // evaluate an expression protected function evaluate($exp) { list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp; $left = $this->reduce($left, true); $right = $this->reduce($right, true); if ($leftColor = $this->coerceColor($left)) { $left = $leftColor; } if ($rightColor = $this->coerceColor($right)) { $right = $rightColor; } $ltype = $left[0]; $rtype = $right[0]; // operators that work on all types if ($op == "and") { return $this->toBool($left == self::$TRUE && $right == self::$TRUE); } if ($op == "=") { return $this->toBool($this->eq($left, $right) ); } if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) { return $str; } // type based operators $fname = "op_${ltype}_${rtype}"; if (is_callable(array($this, $fname))) { $out = $this->$fname($op, $left, $right); if (!is_null($out)) return $out; } // make the expression look it did before being parsed $paddedOp = $op; if ($whiteBefore) $paddedOp = " " . $paddedOp; if ($whiteAfter) $paddedOp .= " "; return array("string", "", array($left, $paddedOp, $right)); } protected function stringConcatenate($left, $right) { if ($strLeft = $this->coerceString($left)) { if ($right[0] == "string") { $right[1] = ""; } $strLeft[2][] = $right; return $strLeft; } if ($strRight = $this->coerceString($right)) { array_unshift($strRight[2], $left); return $strRight; } } // make sure a color's components don't go out of bounds protected function fixColor($c) { foreach (range(1, 3) as $i) { if ($c[$i] < 0) $c[$i] = 0; if ($c[$i] > 255) $c[$i] = 255; } return $c; } protected function op_number_color($op, $lft, $rgt) { if ($op == '+' || $op == '*') { return $this->op_color_number($op, $rgt, $lft); } } protected function op_color_number($op, $lft, $rgt) { if ($rgt[0] == '%') $rgt[1] /= 100; return $this->op_color_color($op, $lft, array_fill(1, count($lft) - 1, $rgt[1])); } protected function op_color_color($op, $left, $right) { $out = array('color'); $max = count($left) > count($right) ? count($left) : count($right); foreach (range(1, $max - 1) as $i) { $lval = isset($left[$i]) ? $left[$i] : 0; $rval = isset($right[$i]) ? $right[$i] : 0; switch ($op) { case '+': $out[] = $lval + $rval; break; case '-': $out[] = $lval - $rval; break; case '*': $out[] = $lval * $rval; break; case '%': $out[] = $lval % $rval; break; case '/': if ($rval == 0) $this->throwError("evaluate error: can't divide by zero"); $out[] = $lval / $rval; break; default: $this->throwError('evaluate error: color op number failed on op '.$op); } } return $this->fixColor($out); } function lib_red($color){ $color = $this->coerceColor($color); if (is_null($color)) { $this->throwError('color expected for red()'); } return $color[1]; } function lib_green($color){ $color = $this->coerceColor($color); if (is_null($color)) { $this->throwError('color expected for green()'); } return $color[2]; } function lib_blue($color){ $color = $this->coerceColor($color); if (is_null($color)) { $this->throwError('color expected for blue()'); } return $color[3]; } // operator on two numbers protected function op_number_number($op, $left, $right) { $unit = empty($left[2]) ? $right[2] : $left[2]; $value = 0; switch ($op) { case '+': $value = $left[1] + $right[1]; break; case '*': $value = $left[1] * $right[1]; break; case '-': $value = $left[1] - $right[1]; break; case '%': $value = $left[1] % $right[1]; break; case '/': if ($right[1] == 0) $this->throwError('parse error: divide by zero'); $value = $left[1] / $right[1]; break; case '<': return $this->toBool($left[1] < $right[1]); case '>': return $this->toBool($left[1] > $right[1]); case '>=': return $this->toBool($left[1] >= $right[1]); case '=<': return $this->toBool($left[1] <= $right[1]); default: $this->throwError('parse error: unknown number operator: '.$op); } return array("number", $value, $unit); } /* environment functions */ protected function makeOutputBlock($type, $selectors = null) { $b = new stdclass; $b->lines = array(); $b->children = array(); $b->selectors = $selectors; $b->type = $type; $b->parent = $this->scope; return $b; } // the state of execution protected function pushEnv($block = null) { $e = new stdclass; $e->parent = $this->env; $e->store = array(); $e->block = $block; $this->env = $e; return $e; } // pop something off the stack protected function popEnv() { $old = $this->env; $this->env = $this->env->parent; return $old; } // set something in the current env protected function set($name, $value) { $this->env->store[$name] = $value; } // get the highest occurrence entry for a name protected function get($name, $default=null) { $current = $this->env; $isArguments = $name == $this->vPrefix . 'arguments'; while ($current) { if ($isArguments && isset($current->arguments)) { return array('list', ' ', $current->arguments); } if (isset($current->store[$name])) return $current->store[$name]; else { $current = isset($current->storeParent) ? $current->storeParent : $current->parent; } } return $default; } // inject array of unparsed strings into environment as variables protected function injectVariables($args) { $this->pushEnv(); $parser = new lessc_parser($this, __METHOD__); foreach ($args as $name => $strValue) { if ($name{0} != '@') $name = '@'.$name; $parser->count = 0; $parser->buffer = (string)$strValue; if (!$parser->propertyValue($value)) { throw new Exception("failed to parse passed in variable $name: $strValue"); } $this->set($name, $value); } } /** * Initialize any static state, can initialize parser for a file * $opts isn't used yet */ public function __construct($fname = null) { if ($fname !== null) { // used for deprecated parse method $this->_parseFile = $fname; } } public function compile($string, $name = null) { $locale = setlocale(LC_NUMERIC, 0); setlocale(LC_NUMERIC, "C"); $this->parser = $this->makeParser($name); $root = $this->parser->parse($string); $this->env = null; $this->scope = null; $this->formatter = $this->newFormatter(); if (!empty($this->registeredVars)) { $this->injectVariables($this->registeredVars); } $this->sourceParser = $this->parser; // used for error messages $this->compileBlock($root); ob_start(); $this->formatter->block($this->scope); $out = ob_get_clean(); setlocale(LC_NUMERIC, $locale); return $out; } public function compileFile($fname, $outFname = null) { if (!is_readable($fname)) { throw new Exception('load error: failed to find '.$fname); } $pi = pathinfo($fname); $oldImport = $this->importDir; $this->importDir = (array)$this->importDir; $this->importDir[] = $pi['dirname'].'/'; $this->allParsedFiles = array(); $this->addParsedFile($fname); $out = $this->compile(file_get_contents($fname), $fname); $this->importDir = $oldImport; if ($outFname !== null) { return file_put_contents($outFname, $out); } return $out; } // compile only if changed input has changed or output doesn't exist public function checkedCompile($in, $out) { if (!is_file($out) || filemtime($in) > filemtime($out)) { $this->compileFile($in, $out); return true; } return false; } /** * Execute lessphp on a .less file or a lessphp cache structure * * The lessphp cache structure contains information about a specific * less file having been parsed. It can be used as a hint for future * calls to determine whether or not a rebuild is required. * * The cache structure contains two important keys that may be used * externally: * * compiled: The final compiled CSS * updated: The time (in seconds) the CSS was last compiled * * The cache structure is a plain-ol' PHP associative array and can * be serialized and unserialized without a hitch. * * @param mixed $in Input * @param bool $force Force rebuild? * @return array lessphp cache structure */ public function cachedCompile($in, $force = false) { // assume no root $root = null; if (is_string($in)) { $root = $in; } elseif (is_array($in) and isset($in['root'])) { if ($force or ! isset($in['files'])) { // If we are forcing a recompile or if for some reason the // structure does not contain any file information we should // specify the root to trigger a rebuild. $root = $in['root']; } elseif (isset($in['files']) and is_array($in['files'])) { foreach ($in['files'] as $fname => $ftime ) { if (!file_exists($fname) or filemtime($fname) > $ftime) { // One of the files we knew about previously has changed // so we should look at our incoming root again. $root = $in['root']; break; } } } } else { // TODO: Throw an exception? We got neither a string nor something // that looks like a compatible lessphp cache structure. return null; } if ($root !== null) { // If we have a root value which means we should rebuild. $out = array(); $out['root'] = $root; $out['compiled'] = $this->compileFile($root); $out['files'] = $this->allParsedFiles(); $out['updated'] = time(); return $out; } else { // No changes, pass back the structure // we were given initially. return $in; } } // parse and compile buffer // This is deprecated public function parse($str = null, $initialVariables = null) { if (is_array($str)) { $initialVariables = $str; $str = null; } $oldVars = $this->registeredVars; if ($initialVariables !== null) { $this->setVariables($initialVariables); } if ($str == null) { if (empty($this->_parseFile)) { throw new exception("nothing to parse"); } $out = $this->compileFile($this->_parseFile); } else { $out = $this->compile($str); } $this->registeredVars = $oldVars; return $out; } protected function makeParser($name) { $parser = new lessc_parser($this, $name); $parser->writeComments = $this->preserveComments; return $parser; } public function setFormatter($name) { $this->formatterName = $name; } protected function newFormatter() { $className = "lessc_formatter_lessjs"; if (!empty($this->formatterName)) { if (!is_string($this->formatterName)) return $this->formatterName; $className = "lessc_formatter_$this->formatterName"; } $className = 'RainLoopVendor\\'.$className; return new $className; } public function setPreserveComments($preserve) { $this->preserveComments = $preserve; } public function registerFunction($name, $func) { $this->libFunctions[$name] = $func; } public function unregisterFunction($name) { unset($this->libFunctions[$name]); } public function setVariables($variables) { $this->registeredVars = array_merge($this->registeredVars, $variables); } public function unsetVariable($name) { unset($this->registeredVars[$name]); } public function setImportDir($dirs) { $this->importDir = (array)$dirs; } public function addImportDir($dir) { $this->importDir = (array)$this->importDir; $this->importDir[] = $dir; } public function allParsedFiles() { return $this->allParsedFiles; } protected function addParsedFile($file) { $this->allParsedFiles[realpath($file)] = filemtime($file); } /** * Uses the current value of $this->count to show line and line number */ protected function throwError($msg = null) { if ($this->sourceLoc >= 0) { $this->sourceParser->throwError($msg, $this->sourceLoc); } throw new exception($msg); } // compile file $in to file $out if $in is newer than $out // returns true when it compiles, false otherwise public static function ccompile($in, $out, $less = null) { if ($less === null) { $less = new self; } return $less->checkedCompile($in, $out); } public static function cexecute($in, $force = false, $less = null) { if ($less === null) { $less = new self; } return $less->cachedCompile($in, $force); } static protected $cssColors = array( 'aliceblue' => '240,248,255', 'antiquewhite' => '250,235,215', 'aqua' => '0,255,255', 'aquamarine' => '127,255,212', 'azure' => '240,255,255', 'beige' => '245,245,220', 'bisque' => '255,228,196', 'black' => '0,0,0', 'blanchedalmond' => '255,235,205', 'blue' => '0,0,255', 'blueviolet' => '138,43,226', 'brown' => '165,42,42', 'burlywood' => '222,184,135', 'cadetblue' => '95,158,160', 'chartreuse' => '127,255,0', 'chocolate' => '210,105,30', 'coral' => '255,127,80', 'cornflowerblue' => '100,149,237', 'cornsilk' => '255,248,220', 'crimson' => '220,20,60', 'cyan' => '0,255,255', 'darkblue' => '0,0,139', 'darkcyan' => '0,139,139', 'darkgoldenrod' => '184,134,11', 'darkgray' => '169,169,169', 'darkgreen' => '0,100,0', 'darkgrey' => '169,169,169', 'darkkhaki' => '189,183,107', 'darkmagenta' => '139,0,139', 'darkolivegreen' => '85,107,47', 'darkorange' => '255,140,0', 'darkorchid' => '153,50,204', 'darkred' => '139,0,0', 'darksalmon' => '233,150,122', 'darkseagreen' => '143,188,143', 'darkslateblue' => '72,61,139', 'darkslategray' => '47,79,79', 'darkslategrey' => '47,79,79', 'darkturquoise' => '0,206,209', 'darkviolet' => '148,0,211', 'deeppink' => '255,20,147', 'deepskyblue' => '0,191,255', 'dimgray' => '105,105,105', 'dimgrey' => '105,105,105', 'dodgerblue' => '30,144,255', 'firebrick' => '178,34,34', 'floralwhite' => '255,250,240', 'forestgreen' => '34,139,34', 'fuchsia' => '255,0,255', 'gainsboro' => '220,220,220', 'ghostwhite' => '248,248,255', 'gold' => '255,215,0', 'goldenrod' => '218,165,32', 'gray' => '128,128,128', 'green' => '0,128,0', 'greenyellow' => '173,255,47', 'grey' => '128,128,128', 'honeydew' => '240,255,240', 'hotpink' => '255,105,180', 'indianred' => '205,92,92', 'indigo' => '75,0,130', 'ivory' => '255,255,240', 'khaki' => '240,230,140', 'lavender' => '230,230,250', 'lavenderblush' => '255,240,245', 'lawngreen' => '124,252,0', 'lemonchiffon' => '255,250,205', 'lightblue' => '173,216,230', 'lightcoral' => '240,128,128', 'lightcyan' => '224,255,255', 'lightgoldenrodyellow' => '250,250,210', 'lightgray' => '211,211,211', 'lightgreen' => '144,238,144', 'lightgrey' => '211,211,211', 'lightpink' => '255,182,193', 'lightsalmon' => '255,160,122', 'lightseagreen' => '32,178,170', 'lightskyblue' => '135,206,250', 'lightslategray' => '119,136,153', 'lightslategrey' => '119,136,153', 'lightsteelblue' => '176,196,222', 'lightyellow' => '255,255,224', 'lime' => '0,255,0', 'limegreen' => '50,205,50', 'linen' => '250,240,230', 'magenta' => '255,0,255', 'maroon' => '128,0,0', 'mediumaquamarine' => '102,205,170', 'mediumblue' => '0,0,205', 'mediumorchid' => '186,85,211', 'mediumpurple' => '147,112,219', 'mediumseagreen' => '60,179,113', 'mediumslateblue' => '123,104,238', 'mediumspringgreen' => '0,250,154', 'mediumturquoise' => '72,209,204', 'mediumvioletred' => '199,21,133', 'midnightblue' => '25,25,112', 'mintcream' => '245,255,250', 'mistyrose' => '255,228,225', 'moccasin' => '255,228,181', 'navajowhite' => '255,222,173', 'navy' => '0,0,128', 'oldlace' => '253,245,230', 'olive' => '128,128,0', 'olivedrab' => '107,142,35', 'orange' => '255,165,0', 'orangered' => '255,69,0', 'orchid' => '218,112,214', 'palegoldenrod' => '238,232,170', 'palegreen' => '152,251,152', 'paleturquoise' => '175,238,238', 'palevioletred' => '219,112,147', 'papayawhip' => '255,239,213', 'peachpuff' => '255,218,185', 'peru' => '205,133,63', 'pink' => '255,192,203', 'plum' => '221,160,221', 'powderblue' => '176,224,230', 'purple' => '128,0,128', 'red' => '255,0,0', 'rosybrown' => '188,143,143', 'royalblue' => '65,105,225', 'saddlebrown' => '139,69,19', 'salmon' => '250,128,114', 'sandybrown' => '244,164,96', 'seagreen' => '46,139,87', 'seashell' => '255,245,238', 'sienna' => '160,82,45', 'silver' => '192,192,192', 'skyblue' => '135,206,235', 'slateblue' => '106,90,205', 'slategray' => '112,128,144', 'slategrey' => '112,128,144', 'snow' => '255,250,250', 'springgreen' => '0,255,127', 'steelblue' => '70,130,180', 'tan' => '210,180,140', 'teal' => '0,128,128', 'thistle' => '216,191,216', 'tomato' => '255,99,71', 'transparent' => '0,0,0,0', 'turquoise' => '64,224,208', 'violet' => '238,130,238', 'wheat' => '245,222,179', 'white' => '255,255,255', 'whitesmoke' => '245,245,245', 'yellow' => '255,255,0', 'yellowgreen' => '154,205,50' ); } // responsible for taking a string of LESS code and converting it into a // syntax tree class lessc_parser { static protected $nextBlockId = 0; // used to uniquely identify blocks static protected $precedence = array( '=<' => 0, '>=' => 0, '=' => 0, '<' => 0, '>' => 0, '+' => 1, '-' => 1, '*' => 2, '/' => 2, '%' => 2, ); static protected $whitePattern; static protected $commentMulti; static protected $commentSingle = "//"; static protected $commentMultiLeft = "/*"; static protected $commentMultiRight = "*/"; // regex string to match any of the operators static protected $operatorString; // these properties will supress division unless it's inside parenthases static protected $supressDivisionProps = array('/border-radius$/i', '/^font$/i'); protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document"); protected $lineDirectives = array("charset"); /** * if we are in parens we can be more liberal with whitespace around * operators because it must evaluate to a single value and thus is less * ambiguous. * * Consider: * property1: 10 -5; // is two numbers, 10 and -5 * property2: (10 -5); // should evaluate to 5 */ protected $inParens = false; // caches preg escaped literals static protected $literalCache = array(); public function __construct($lessc, $sourceName = null) { $this->eatWhiteDefault = true; // reference to less needed for vPrefix, mPrefix, and parentSelector $this->lessc = $lessc; $this->sourceName = $sourceName; // name used for error messages $this->writeComments = false; if (!self::$operatorString) { self::$operatorString = '('.implode('|', array_map(array('RainLoopVendor\\lessc', 'preg_quote'), array_keys(self::$precedence))).')'; $commentSingle = lessc::preg_quote(self::$commentSingle); $commentMultiLeft = lessc::preg_quote(self::$commentMultiLeft); $commentMultiRight = lessc::preg_quote(self::$commentMultiRight); self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight; self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais'; } } public function parse($buffer) { $this->count = 0; $this->line = 1; $this->env = null; // block stack $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer); $this->pushSpecialBlock("root"); $this->eatWhiteDefault = true; $this->seenComments = array(); // trim whitespace on head // if (preg_match('/^\s+/', $this->buffer, $m)) { // $this->line += substr_count($m[0], "\n"); // $this->buffer = ltrim($this->buffer); // } $this->whitespace(); // parse the entire file $lastCount = $this->count; while (false !== $this->parseChunk()); if ($this->count != strlen($this->buffer)) $this->throwError(); // TODO report where the block was opened if (!is_null($this->env->parent)) throw new exception('parse error: unclosed block'); return $this->env; } /** * Parse a single chunk off the head of the buffer and append it to the * current parse environment. * Returns false when the buffer is empty, or when there is an error. * * This function is called repeatedly until the entire document is * parsed. * * This parser is most similar to a recursive descent parser. Single * functions represent discrete grammatical rules for the language, and * they are able to capture the text that represents those rules. * * Consider the function lessc::keyword(). (all parse functions are * structured the same) * * The function takes a single reference argument. When calling the * function it will attempt to match a keyword on the head of the buffer. * If it is successful, it will place the keyword in the referenced * argument, advance the position in the buffer, and return true. If it * fails then it won't advance the buffer and it will return false. * * All of these parse functions are powered by lessc::match(), which behaves * the same way, but takes a literal regular expression. Sometimes it is * more convenient to use match instead of creating a new function. * * Because of the format of the functions, to parse an entire string of * grammatical rules, you can chain them together using &&. * * But, if some of the rules in the chain succeed before one fails, then * the buffer position will be left at an invalid state. In order to * avoid this, lessc::seek() is used to remember and set buffer positions. * * Before parsing a chain, use $s = $this->seek() to remember the current * position into $s. Then if a chain fails, use $this->seek($s) to * go back where we started. */ protected function parseChunk() { if (empty($this->buffer)) return false; $s = $this->seek(); // setting a property if ($this->keyword($key) && $this->assign() && $this->propertyValue($value, $key) && $this->end()) { $this->append(array('assign', $key, $value), $s); return true; } else { $this->seek($s); } // look for special css blocks if ($this->literal('@', false)) { $this->count--; // media if ($this->literal('@media')) { if (($this->mediaQueryList($mediaQueries) || true) && $this->literal('{')) { $media = $this->pushSpecialBlock("media"); $media->queries = is_null($mediaQueries) ? array() : $mediaQueries; return true; } else { $this->seek($s); return false; } } if ($this->literal("@", false) && $this->keyword($dirName)) { if ($this->isDirective($dirName, $this->blockDirectives)) { if (($this->openString("{", $dirValue, null, array(";")) || true) && $this->literal("{")) { $dir = $this->pushSpecialBlock("directive"); $dir->name = $dirName; if (isset($dirValue)) $dir->value = $dirValue; return true; } } elseif ($this->isDirective($dirName, $this->lineDirectives)) { if ($this->propertyValue($dirValue) && $this->end()) { $this->append(array("directive", $dirName, $dirValue)); return true; } } } $this->seek($s); } // setting a variable if ($this->variable($var) && $this->assign() && $this->propertyValue($value) && $this->end()) { $this->append(array('assign', $var, $value), $s); return true; } else { $this->seek($s); } if ($this->import($importValue)) { $this->append($importValue, $s); return true; } // opening parametric mixin if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) && ($this->guards($guards) || true) && $this->literal('{')) { $block = $this->pushBlock($this->fixTags(array($tag))); $block->args = $args; $block->isVararg = $isVararg; if (!empty($guards)) $block->guards = $guards; return true; } else { $this->seek($s); } // opening a simple block if ($this->tags($tags) && $this->literal('{')) { $tags = $this->fixTags($tags); $this->pushBlock($tags); return true; } else { $this->seek($s); } // closing a block if ($this->literal('}', false)) { try { $block = $this->pop(); } catch (exception $e) { $this->seek($s); $this->throwError($e->getMessage()); } $hidden = false; if (is_null($block->type)) { $hidden = true; if (!isset($block->args)) { foreach ($block->tags as $tag) { if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) { $hidden = false; break; } } } foreach ($block->tags as $tag) { if (is_string($tag)) { $this->env->children[$tag][] = $block; } } } if (!$hidden) { $this->append(array('block', $block), $s); } // this is done here so comments aren't bundled into he block that // was just closed $this->whitespace(); return true; } // mixin if ($this->mixinTags($tags) && ($this->argumentValues($argv) || true) && ($this->keyword($suffix) || true) && $this->end()) { $tags = $this->fixTags($tags); $this->append(array('mixin', $tags, $argv, $suffix), $s); return true; } else { $this->seek($s); } // spare ; if ($this->literal(';')) return true; return false; // got nothing, throw error } protected function isDirective($dirname, $directives) { // TODO: cache pattern in parser $pattern = implode('|', array_map(array('RainLoopVendor\\lessc', 'preg_quote'), $directives)); $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i'; return preg_match($pattern, $dirname); } protected function fixTags($tags) { // move @ tags out of variable namespace foreach ($tags as &$tag) { if ($tag{0} == $this->lessc->vPrefix) $tag[0] = $this->lessc->mPrefix; } return $tags; } // a list of expressions protected function expressionList(&$exps) { $values = array(); while ($this->expression($exp)) { $values[] = $exp; } if (count($values) == 0) return false; $exps = lessc::compressList($values, ' '); return true; } /** * Attempt to consume an expression. * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code */ protected function expression(&$out) { if ($this->value($lhs)) { $out = $this->expHelper($lhs, 0); // look for / shorthand if (!empty($this->env->supressedDivision)) { unset($this->env->supressedDivision); $s = $this->seek(); if ($this->literal("/") && $this->value($rhs)) { $out = array("list", "", array($out, array("keyword", "/"), $rhs)); } else { $this->seek($s); } } return true; } return false; } /** * recursively parse infix equation with $lhs at precedence $minP */ protected function expHelper($lhs, $minP) { $this->inExp = true; $ss = $this->seek(); while (true) { $whiteBefore = isset($this->buffer[$this->count - 1]) && ctype_space($this->buffer[$this->count - 1]); // If there is whitespace before the operator, then we require // whitespace after the operator for it to be an expression $needWhite = $whiteBefore && !$this->inParens; if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) { if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) { foreach (self::$supressDivisionProps as $pattern) { if (preg_match($pattern, $this->env->currentProperty)) { $this->env->supressedDivision = true; break 2; } } } $whiteAfter = isset($this->buffer[$this->count - 1]) && ctype_space($this->buffer[$this->count - 1]); if (!$this->value($rhs)) break; // peek for next operator to see what to do with rhs if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) { $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]); } $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter); $ss = $this->seek(); continue; } break; } $this->seek($ss); return $lhs; } // consume a list of values for a property public function propertyValue(&$value, $keyName = null) { $values = array(); if ($keyName !== null) $this->env->currentProperty = $keyName; $s = null; while ($this->expressionList($v)) { $values[] = $v; $s = $this->seek(); if (!$this->literal(',')) break; } if ($s) $this->seek($s); if ($keyName !== null) unset($this->env->currentProperty); if (count($values) == 0) return false; $value = lessc::compressList($values, ', '); return true; } protected function parenValue(&$out) { $s = $this->seek(); // speed shortcut if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") { return false; } $inParens = $this->inParens; if ($this->literal("(") && ($this->inParens = true) && $this->expression($exp) && $this->literal(")")) { $out = $exp; $this->inParens = $inParens; return true; } else { $this->inParens = $inParens; $this->seek($s); } return false; } // a single value protected function value(&$value) { $s = $this->seek(); // speed shortcut if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") { // negation if ($this->literal("-", false) && (($this->variable($inner) && $inner = array("variable", $inner)) || $this->unit($inner) || $this->parenValue($inner))) { $value = array("unary", "-", $inner); return true; } else { $this->seek($s); } } if ($this->parenValue($value)) return true; if ($this->unit($value)) return true; if ($this->color($value)) return true; if ($this->func($value)) return true; if ($this->string($value)) return true; if ($this->keyword($word)) { $value = array('keyword', $word); return true; } // try a variable if ($this->variable($var)) { $value = array('variable', $var); return true; } // unquote string (should this work on any type? if ($this->literal("~") && $this->string($str)) { $value = array("escape", $str); return true; } else { $this->seek($s); } // css hack: \0 if ($this->literal('\\') && $this->match('([0-9]+)', $m)) { $value = array('keyword', '\\'.$m[1]); return true; } else { $this->seek($s); } return false; } // an import statement protected function import(&$out) { $s = $this->seek(); if (!$this->literal('@import')) return false; // @import "something.css" media; // @import url("something.css") media; // @import url(something.css) media; if ($this->propertyValue($value)) { $out = array("import", $value); return true; } } protected function mediaQueryList(&$out) { if ($this->genericList($list, "mediaQuery", ",", false)) { $out = $list[2]; return true; } return false; } protected function mediaQuery(&$out) { $s = $this->seek(); $expressions = null; $parts = array(); if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) { $prop = array("mediaType"); if (isset($only)) $prop[] = "only"; if (isset($not)) $prop[] = "not"; $prop[] = $mediaType; $parts[] = $prop; } else { $this->seek($s); } if (!empty($mediaType) && !$this->literal("and")) { // ~ } else { $this->genericList($expressions, "mediaExpression", "and", false); if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]); } if (count($parts) == 0) { $this->seek($s); return false; } $out = $parts; return true; } protected function mediaExpression(&$out) { $s = $this->seek(); $value = null; if ($this->literal("(") && $this->keyword($feature) && ($this->literal(":") && $this->expression($value) || true) && $this->literal(")")) { $out = array("mediaExp", $feature); if ($value) $out[] = $value; return true; } elseif ($this->variable($variable)) { $out = array('variable', $variable); return true; } $this->seek($s); return false; } // an unbounded string stopped by $end protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) { $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; $stop = array("'", '"', "@{", $end); $stop = array_map(array('RainLoopVendor\\lessc', 'preg_quote'), $stop); // $stop[] = self::$commentMulti; if (!is_null($rejectStrs)) { $stop = array_merge($stop, $rejectStrs); } $patt = '(.*?)('.implode("|", $stop).')'; $nestingLevel = 0; $content = array(); while ($this->match($patt, $m, false)) { if (!empty($m[1])) { $content[] = $m[1]; if ($nestingOpen) { $nestingLevel += substr_count($m[1], $nestingOpen); } } $tok = $m[2]; $this->count-= strlen($tok); if ($tok == $end) { if ($nestingLevel == 0) { break; } else { $nestingLevel--; } } if (($tok == "'" || $tok == '"') && $this->string($str)) { $content[] = $str; continue; } if ($tok == "@{" && $this->interpolation($inter)) { $content[] = $inter; continue; } if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) { $ount = null; break; } $content[] = $tok; $this->count+= strlen($tok); } $this->eatWhiteDefault = $oldWhite; if (count($content) == 0) return false; // trim the end if (is_string(end($content))) { $content[count($content) - 1] = rtrim(end($content)); } $out = array("string", "", $content); return true; } protected function string(&$out) { $s = $this->seek(); if ($this->literal('"', false)) { $delim = '"'; } elseif ($this->literal("'", false)) { $delim = "'"; } else { return false; } $content = array(); // look for either ending delim , escape, or string interpolation $patt = '([^\n]*?)(@\{|\\\\|' . lessc::preg_quote($delim).')'; $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; while ($this->match($patt, $m, false)) { $content[] = $m[1]; if ($m[2] == "@{") { $this->count -= strlen($m[2]); if ($this->interpolation($inter, false)) { $content[] = $inter; } else { $this->count += strlen($m[2]); $content[] = "@{"; // ignore it } } elseif ($m[2] == '\\') { $content[] = $m[2]; if ($this->literal($delim, false)) { $content[] = $delim; } } else { $this->count -= strlen($delim); break; // delim } } $this->eatWhiteDefault = $oldWhite; if ($this->literal($delim)) { $out = array("string", $delim, $content); return true; } $this->seek($s); return false; } protected function interpolation(&$out) { $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = true; $s = $this->seek(); if ($this->literal("@{") && $this->openString("}", $interp, null, array("'", '"', ";")) && $this->literal("}", false)) { $out = array("interpolate", $interp); $this->eatWhiteDefault = $oldWhite; if ($this->eatWhiteDefault) $this->whitespace(); return true; } $this->eatWhiteDefault = $oldWhite; $this->seek($s); return false; } protected function unit(&$unit) { // speed shortcut if (isset($this->buffer[$this->count])) { $char = $this->buffer[$this->count]; if (!ctype_digit($char) && $char != ".") return false; } if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) { $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]); return true; } return false; } // a # color protected function color(&$out) { if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) { if (strlen($m[1]) > 7) { $out = array("string", "", array($m[1])); } else { $out = array("raw_color", $m[1]); } return true; } return false; } // consume a list of property values delimited by ; and wrapped in () protected function argumentValues(&$args, $delim = ',') { $s = $this->seek(); if (!$this->literal('(')) return false; $values = array(); while (true) { if ($this->expressionList($value)) $values[] = $value; if (!$this->literal($delim)) break; else { if ($value == null) $values[] = null; $value = null; } } if (!$this->literal(')')) { $this->seek($s); return false; } $args = $values; return true; } // consume an argument definition list surrounded by () // each argument is a variable name with optional value // or at the end a ... or a variable named followed by ... protected function argumentDef(&$args, &$isVararg, $delim = ',') { $s = $this->seek(); if (!$this->literal('(')) return false; $values = array(); $isVararg = false; while (true) { if ($this->literal("...")) { $isVararg = true; break; } if ($this->variable($vname)) { $arg = array("arg", $vname); $ss = $this->seek(); if ($this->assign() && $this->expressionList($value)) { $arg[] = $value; } else { $this->seek($ss); if ($this->literal("...")) { $arg[0] = "rest"; $isVararg = true; } } $values[] = $arg; if ($isVararg) break; continue; } if ($this->value($literal)) { $values[] = array("lit", $literal); } if (!$this->literal($delim)) break; } if (!$this->literal(')')) { $this->seek($s); return false; } $args = $values; return true; } // consume a list of tags // this accepts a hanging delimiter protected function tags(&$tags, $simple = false, $delim = ',') { $tags = array(); while ($this->tag($tt, $simple)) { $tags[] = $tt; if (!$this->literal($delim)) break; } if (count($tags) == 0) return false; return true; } // list of tags of specifying mixin path // optionally separated by > (lazy, accepts extra >) protected function mixinTags(&$tags) { $s = $this->seek(); $tags = array(); while ($this->tag($tt, true)) { $tags[] = $tt; $this->literal(">"); } if (count($tags) == 0) return false; return true; } // a bracketed value (contained within in a tag definition) protected function tagBracket(&$value) { // speed shortcut if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") { return false; } $s = $this->seek(); if ($this->literal('[') && $this->to(']', $c, true) && $this->literal(']', false)) { $value = '['.$c.']'; // whitespace? if ($this->whitespace()) $value .= " "; // escape parent selector, (yuck) $value = str_replace($this->lessc->parentSelector, "$&$", $value); return true; } $this->seek($s); return false; } protected function tagExpression(&$value) { $s = $this->seek(); if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { $value = array('exp', $exp); return true; } $this->seek($s); return false; } // a space separated list of selectors protected function tag(&$tag, $simple = false) { if ($simple) $chars = '^@,:;{}\][>\(\) "\''; else $chars = '^@,;{}["\''; $s = $this->seek(); if (!$simple && $this->tagExpression($tag)) { return true; } $hasExpression = false; $parts = array(); while ($this->tagBracket($first)) $parts[] = $first; $oldWhite = $this->eatWhiteDefault; $this->eatWhiteDefault = false; while (true) { if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) { $parts[] = $m[1]; if ($simple) break; while ($this->tagBracket($brack)) { $parts[] = $brack; } continue; } if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") { if ($this->interpolation($interp)) { $hasExpression = true; $interp[2] = true; // don't unescape $parts[] = $interp; continue; } if ($this->literal("@")) { $parts[] = "@"; continue; } } if ($this->unit($unit)) { // for keyframes $parts[] = $unit[1]; $parts[] = $unit[2]; continue; } break; } $this->eatWhiteDefault = $oldWhite; if (!$parts) { $this->seek($s); return false; } if ($hasExpression) { $tag = array("exp", array("string", "", $parts)); } else { $tag = trim(implode($parts)); } $this->whitespace(); return true; } // a css function protected function func(&$func) { $s = $this->seek(); if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) { $fname = $m[1]; $sPreArgs = $this->seek(); $args = array(); while (true) { $ss = $this->seek(); // this ugly nonsense is for ie filter properties if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) { $args[] = array("string", "", array($name, "=", $value)); } else { $this->seek($ss); if ($this->expressionList($value)) { $args[] = $value; } } if (!$this->literal(',')) break; } $args = array('list', ',', $args); if ($this->literal(')')) { $func = array('function', $fname, $args); return true; } elseif ($fname == 'url') { // couldn't parse and in url? treat as string $this->seek($sPreArgs); if ($this->openString(")", $string) && $this->literal(")")) { $func = array('function', $fname, $string); return true; } } } $this->seek($s); return false; } // consume a less variable protected function variable(&$name) { $s = $this->seek(); if ($this->literal($this->lessc->vPrefix, false) && ($this->variable($sub) || $this->keyword($name))) { if (!empty($sub)) { $name = array('variable', $sub); } else { $name = $this->lessc->vPrefix.$name; } return true; } $name = null; $this->seek($s); return false; } /** * Consume an assignment operator * Can optionally take a name that will be set to the current property name */ protected function assign($name = null) { if ($name) $this->currentProperty = $name; return $this->literal(':') || $this->literal('='); } // consume a keyword protected function keyword(&$word) { if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) { $word = $m[1]; return true; } return false; } // consume an end of statement delimiter protected function end() { if ($this->literal(';')) { return true; } elseif ($this->count == strlen($this->buffer) || $this->buffer{$this->count} == '}') { // if there is end of file or a closing block next then we don't need a ; return true; } return false; } protected function guards(&$guards) { $s = $this->seek(); if (!$this->literal("when")) { $this->seek($s); return false; } $guards = array(); while ($this->guardGroup($g)) { $guards[] = $g; if (!$this->literal(",")) break; } if (count($guards) == 0) { $guards = null; $this->seek($s); return false; } return true; } // a bunch of guards that are and'd together // TODO rename to guardGroup protected function guardGroup(&$guardGroup) { $s = $this->seek(); $guardGroup = array(); while ($this->guard($guard)) { $guardGroup[] = $guard; if (!$this->literal("and")) break; } if (count($guardGroup) == 0) { $guardGroup = null; $this->seek($s); return false; } return true; } protected function guard(&$guard) { $s = $this->seek(); $negate = $this->literal("not"); if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { $guard = $exp; if ($negate) $guard = array("negate", $guard); return true; } $this->seek($s); return false; } /* raw parsing functions */ protected function literal($what, $eatWhitespace = null) { if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; // shortcut on single letter if (!isset($what[1]) && isset($this->buffer[$this->count])) { if ($this->buffer[$this->count] == $what) { if (!$eatWhitespace) { $this->count++; return true; } // goes below... } else { return false; } } if (!isset(self::$literalCache[$what])) { self::$literalCache[$what] = lessc::preg_quote($what); } return $this->match(self::$literalCache[$what], $m, $eatWhitespace); } protected function genericList(&$out, $parseItem, $delim="", $flatten=true) { $s = $this->seek(); $items = array(); while ($this->$parseItem($value)) { $items[] = $value; if ($delim) { if (!$this->literal($delim)) break; } } if (count($items) == 0) { $this->seek($s); return false; } if ($flatten && count($items) == 1) { $out = $items[0]; } else { $out = array("list", $delim, $items); } return true; } // advance counter to next occurrence of $what // $until - don't include $what in advance // $allowNewline, if string, will be used as valid char set protected function to($what, &$out, $until = false, $allowNewline = false) { if (is_string($allowNewline)) { $validChars = $allowNewline; } else { $validChars = $allowNewline ? "." : "[^\n]"; } if (!$this->match('('.$validChars.'*?)'.lessc::preg_quote($what), $m, !$until)) return false; if ($until) $this->count -= strlen($what); // give back $what $out = $m[1]; return true; } // try to match something on head of buffer protected function match($regex, &$out, $eatWhitespace = null) { if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais'; if (preg_match($r, $this->buffer, $out, null, $this->count)) { $this->count += strlen($out[0]); if ($eatWhitespace && $this->writeComments) $this->whitespace(); return true; } return false; } // match some whitespace protected function whitespace() { if ($this->writeComments) { $gotWhite = false; while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) { if (isset($m[1]) && empty($this->commentsSeen[$this->count])) { $this->append(array("comment", $m[1])); $this->commentsSeen[$this->count] = true; } $this->count += strlen($m[0]); $gotWhite = true; } return $gotWhite; } else { $this->match("", $m); return strlen($m[0]) > 0; } } // match something without consuming it protected function peek($regex, &$out = null, $from=null) { if (is_null($from)) $from = $this->count; $r = '/'.$regex.'/Ais'; $result = preg_match($r, $this->buffer, $out, null, $from); return $result; } // seek to a spot in the buffer or return where we are on no argument protected function seek($where = null) { if ($where === null) return $this->count; else $this->count = $where; return true; } /* misc functions */ public function throwError($msg = "parse error", $count = null) { $count = is_null($count) ? $this->count : $count; $line = $this->line + substr_count(substr($this->buffer, 0, $count), "\n"); if (!empty($this->sourceName)) { $loc = "$this->sourceName on line $line"; } else { $loc = "line: $line"; } // TODO this depends on $this->count if ($this->peek("(.*?)(\n|$)", $m, $count)) { throw new exception("$msg: failed at `$m[1]` $loc"); } else { throw new exception("$msg: $loc"); } } protected function pushBlock($selectors=null, $type=null) { $b = new stdclass; $b->parent = $this->env; $b->type = $type; $b->id = self::$nextBlockId++; $b->isVararg = false; // TODO: kill me from here $b->tags = $selectors; $b->props = array(); $b->children = array(); $this->env = $b; return $b; } // push a block that doesn't multiply tags protected function pushSpecialBlock($type) { return $this->pushBlock(null, $type); } // append a property to the current block protected function append($prop, $pos = null) { if ($pos !== null) $prop[-1] = $pos; $this->env->props[] = $prop; } // pop something off the stack protected function pop() { $old = $this->env; $this->env = $this->env->parent; return $old; } // remove comments from $text // todo: make it work for all functions, not just url protected function removeComments($text) { $look = array( 'url(', '//', '/*', '"', "'" ); $out = ''; $min = null; while (true) { // find the next item foreach ($look as $token) { $pos = strpos($text, $token); if ($pos !== false) { if (!isset($min) || $pos < $min[1]) $min = array($token, $pos); } } if (is_null($min)) break; $count = $min[1]; $skip = 0; $newlines = 0; switch ($min[0]) { case 'url(': if (preg_match('/url\(.*?\)/', $text, $m, 0, $count)) $count += strlen($m[0]) - strlen($min[0]); break; case '"': case "'": if (preg_match('/'.$min[0].'.*?'.$min[0].'/', $text, $m, 0, $count)) $count += strlen($m[0]) - 1; break; case '//': $skip = strpos($text, "\n", $count); if ($skip === false) $skip = strlen($text) - $count; else $skip -= $count; break; case '/*': if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) { $skip = strlen($m[0]); $newlines = substr_count($m[0], "\n"); } break; } if ($skip == 0) $count += strlen($min[0]); $out .= substr($text, 0, $count).str_repeat("\n", $newlines); $text = substr($text, $count + $skip); $min = null; } return $out.$text; } } class lessc_formatter_classic { public $indentChar = " "; public $break = "\n"; public $open = " {"; public $close = "}"; public $selectorSeparator = ", "; public $assignSeparator = ":"; public $openSingle = " { "; public $closeSingle = " }"; public $disableSingle = false; public $breakSelectors = false; public $compressColors = false; public function __construct() { $this->indentLevel = 0; } public function indentStr($n = 0) { return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); } public function property($name, $value) { return $name . $this->assignSeparator . $value . ";"; } protected function isEmpty($block) { if (empty($block->lines)) { foreach ($block->children as $child) { if (!$this->isEmpty($child)) return false; } return true; } return false; } public function block($block) { if ($this->isEmpty($block)) return; $inner = $pre = $this->indentStr(); $isSingle = !$this->disableSingle && is_null($block->type) && count($block->lines) == 1; if (!empty($block->selectors)) { $this->indentLevel++; if ($this->breakSelectors) { $selectorSeparator = $this->selectorSeparator . $this->break . $pre; } else { $selectorSeparator = $this->selectorSeparator; } echo $pre . implode($selectorSeparator, $block->selectors); if ($isSingle) { echo $this->openSingle; $inner = ""; } else { echo $this->open . $this->break; $inner = $this->indentStr(); } } if (!empty($block->lines)) { $glue = $this->break.$inner; echo $inner . implode($glue, $block->lines); if (!$isSingle && !empty($block->children)) { echo $this->break; } } foreach ($block->children as $child) { $this->block($child); } if (!empty($block->selectors)) { if (!$isSingle && empty($block->children)) echo $this->break; if ($isSingle) { echo $this->closeSingle . $this->break; } else { echo $pre . $this->close . $this->break; } $this->indentLevel--; } } } class lessc_formatter_compressed extends lessc_formatter_classic { public $disableSingle = true; public $open = "{"; public $selectorSeparator = ","; public $assignSeparator = ":"; public $break = ""; public $compressColors = true; public function indentStr($n = 0) { return ""; } } class lessc_formatter_lessjs extends lessc_formatter_classic { public $disableSingle = true; public $breakSelectors = true; public $assignSeparator = ": "; public $selectorSeparator = ","; } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/pclzip/000077500000000000000000000000001361462701300236215ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/pclzip/_pclzip.lib.php000066400000000000000000006010331361462701300265420ustar00rootroot00000000000000zipname = $p_zipname; $this->zip_fd = 0; $this->magic_quotes_status = -1; // ----- Return return; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // create($p_filelist, $p_add_dir="", $p_remove_dir="") // create($p_filelist, $p_option, $p_option_value, ...) // Description : // This method supports two different synopsis. The first one is historical. // This method creates a Zip Archive. The Zip file is created in the // filesystem. The files and directories indicated in $p_filelist // are added in the archive. See the parameters description for the // supported format of $p_filelist. // When a directory is in the list, the directory and its content is added // in the archive. // In this synopsis, the function takes an optional variable list of // options. See bellow the supported options. // Parameters : // $p_filelist : An array containing file or directory names, or // a string containing one filename or one directory name, or // a string containing a list of filenames and/or directory // names separated by spaces. // $p_add_dir : A path to add before the real path of the archived file, // in order to have it memorized in the archive. // $p_remove_dir : A path to remove from the real path of the file to archive, // in order to have a shorter path memorized in the archive. // When $p_add_dir and $p_remove_dir are set, $p_remove_dir // is removed first, before $p_add_dir is added. // Options : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_COMMENT : // PCLZIP_CB_PRE_ADD : // PCLZIP_CB_POST_ADD : // Return Values : // 0 on failure, // The list of the added files, with a status of the add action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function create($p_filelist) { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Set default values $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove from the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' //, PCLZIP_OPT_CRYPT => 'optional' )); if ($v_result != 1) { return 0; } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } else if ($v_size > 2) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Init $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); // ----- Look if the $p_filelist is really an array if (is_array($p_filelist)) { // ----- Look if the first element is also an array // This will mean that this is a file description entry if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; } // ----- The list is a list of string names else { $v_string_list = $p_filelist; } } // ----- Look if the $p_filelist is a string else if (is_string($p_filelist)) { // ----- Create a list from the string $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); } // ----- Invalid variable type for $p_filelist else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); return 0; } // ----- Reformat the string list if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { if ($v_string != '') { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } else { } } } // ----- For each file in the list check the attributes $v_supported_attributes = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } // ----- Expand the filelist (expand directories) $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } // ----- Call the create fct $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } // ----- Return return $p_result_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // add($p_filelist, $p_add_dir="", $p_remove_dir="") // add($p_filelist, $p_option, $p_option_value, ...) // Description : // This method supports two synopsis. The first one is historical. // This methods add the list of files in an existing archive. // If a file with the same name already exists, it is added at the end of the // archive, the first one is still present. // If the archive does not exist, it is created. // Parameters : // $p_filelist : An array containing file or directory names, or // a string containing one filename or one directory name, or // a string containing a list of filenames and/or directory // names separated by spaces. // $p_add_dir : A path to add before the real path of the archived file, // in order to have it memorized in the archive. // $p_remove_dir : A path to remove from the real path of the file to archive, // in order to have a shorter path memorized in the archive. // When $p_add_dir and $p_remove_dir are set, $p_remove_dir // is removed first, before $p_add_dir is added. // Options : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_COMMENT : // PCLZIP_OPT_ADD_COMMENT : // PCLZIP_OPT_PREPEND_COMMENT : // PCLZIP_CB_PRE_ADD : // PCLZIP_CB_POST_ADD : // Return Values : // 0 on failure, // The list of the added files, with a status of the add action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function add($p_filelist) { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Set default values $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove form the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_ADD_COMMENT => 'optional', PCLZIP_OPT_PREPEND_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' //, PCLZIP_OPT_CRYPT => 'optional' )); if ($v_result != 1) { return 0; } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } else if ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Init $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); // ----- Look if the $p_filelist is really an array if (is_array($p_filelist)) { // ----- Look if the first element is also an array // This will mean that this is a file description entry if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; } // ----- The list is a list of string names else { $v_string_list = $p_filelist; } } // ----- Look if the $p_filelist is a string else if (is_string($p_filelist)) { // ----- Create a list from the string $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); } // ----- Invalid variable type for $p_filelist else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); return 0; } // ----- Reformat the string list if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } } // ----- For each file in the list check the attributes $v_supported_attributes = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } // ----- Expand the filelist (expand directories) $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } // ----- Call the create fct $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } // ----- Return return $p_result_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : listContent() // Description : // This public method, gives the list of the files and directories, with their // properties. // The properties of each entries in the list are (used also in other functions) : // filename : Name of the file. For a create or add action it is the filename // given by the user. For an extract function it is the filename // of the extracted file. // stored_filename : Name of the file / directory stored in the archive. // size : Size of the stored file. // compressed_size : Size of the file's data compressed in the archive // (without the headers overhead) // mtime : Last known modification date of the file (UNIX timestamp) // comment : Comment associated with the file // folder : true | false // index : index of the file in the archive // status : status of the action (depending of the action) : // Values are : // ok : OK ! // filtered : the file / dir is not extracted (filtered by user) // already_a_directory : the file can not be extracted because a // directory with the same name already exists // write_protected : the file can not be extracted because a file // with the same name already exists and is // write protected // newer_exist : the file was not extracted because a newer file exists // path_creation_fail : the file is not extracted because the folder // does not exist and can not be created // write_error : the file was not extracted because there was a // error while writing the file // read_error : the file was not extracted because there was a error // while reading the file // invalid_header : the file was not extracted because of an archive // format error (bad file header) // Note that each time a method can continue operating when there // is an action error on a file, the error is only logged in the file status. // Return Values : // 0 on an unrecoverable failure, // The list of the files in the archive. // -------------------------------------------------------------------------------- function listContent() { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Call the extracting fct $p_list = array(); if (($v_result = $this->privList($p_list)) != 1) { unset($p_list); return(0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // extract($p_path="./", $p_remove_path="") // extract([$p_option, $p_option_value, ...]) // Description : // This method supports two synopsis. The first one is historical. // This method extract all the files / directories from the archive to the // folder indicated in $p_path. // If you want to ignore the 'root' part of path of the memorized files // you can indicate this in the optional $p_remove_path parameter. // By default, if a newer file with the same name already exists, the // file is not extracted. // // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append // at the end of the path value of PCLZIP_OPT_PATH. // Parameters : // $p_path : Path where the files and directories are to be extracted // $p_remove_path : First part ('root' part) of the memorized path // (if any similar) to remove while extracting. // Options : // PCLZIP_OPT_PATH : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_CB_PRE_EXTRACT : // PCLZIP_CB_POST_EXTRACT : // Return Values : // 0 or a negative value on failure, // The list of the extracted files, with a status of the action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function extract() { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Set default values $v_options = array(); // $v_path = "./"; $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Default values for option $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; // ----- Look for arguments if ($v_size > 0) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } // ----- Set the arguments if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { // ----- Check for '/' in last path char if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } else if ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Trace // ----- Call the extracting fct $p_list = array(); $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options); if ($v_result < 1) { unset($p_list); return(0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // extractByIndex($p_index, $p_path="./", $p_remove_path="") // extractByIndex($p_index, [$p_option, $p_option_value, ...]) // Description : // This method supports two synopsis. The first one is historical. // This method is doing a partial extract of the archive. // The extracted files or folders are identified by their index in the // archive (from 0 to n). // Note that if the index identify a folder, only the folder entry is // extracted, not all the files included in the archive. // Parameters : // $p_index : A single index (integer) or a string of indexes of files to // extract. The form of the string is "0,4-6,8-12" with only numbers // and '-' for range or ',' to separate ranges. No spaces or ';' // are allowed. // $p_path : Path where the files and directories are to be extracted // $p_remove_path : First part ('root' part) of the memorized path // (if any similar) to remove while extracting. // Options : // PCLZIP_OPT_PATH : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and // not as files. // The resulting content is in a new field 'content' in the file // structure. // This option must be used alone (any other options are ignored). // PCLZIP_CB_PRE_EXTRACT : // PCLZIP_CB_POST_EXTRACT : // Return Values : // 0 on failure, // The list of the extracted files, with a status of the action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- //function extractByIndex($p_index, options...) function extractByIndex($p_index) { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Set default values $v_options = array(); // $v_path = "./"; $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Default values for option $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove form the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } // ----- Set the arguments if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { // ----- Check for '/' in last path char if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; } else { } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } else if ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Trace // ----- Trick // Here I want to reuse extractByRule(), so I need to parse the $p_index // with privParseOptions() $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); $v_options_trick = array(); $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, array (PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Call the extracting fct if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { return(0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // delete([$p_option, $p_option_value, ...]) // Description : // This method removes files from the archive. // If no parameters are given, then all the archive is emptied. // Parameters : // None or optional arguments. // Options : // PCLZIP_OPT_BY_INDEX : // PCLZIP_OPT_BY_NAME : // PCLZIP_OPT_BY_EREG : // PCLZIP_OPT_BY_PREG : // Return Values : // 0 on failure, // The list of the files which are still present in the archive. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function delete() { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Set default values $v_options = array(); // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 0) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } } // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Call the delete fct $v_list = array(); if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { $this->privSwapBackMagicQuotes(); unset($v_list); return(0); } // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : deleteByIndex() // Description : // ***** Deprecated ***** // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. // -------------------------------------------------------------------------------- function deleteByIndex($p_index) { $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : properties() // Description : // This method gives the properties of the archive. // The properties are : // nb : Number of files in the archive // comment : Comment associated with the archive file // status : not_exist, ok // Parameters : // None // Return Values : // 0 on failure, // An array with the archive properties. // -------------------------------------------------------------------------------- function properties() { // ----- Reset the error handler $this->privErrorReset(); // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Check archive if (!$this->privCheckFormat()) { $this->privSwapBackMagicQuotes(); return(0); } // ----- Default properties $v_prop = array(); $v_prop['comment'] = ''; $v_prop['nb'] = 0; $v_prop['status'] = 'not_exist'; // ----- Look if file exists if (@is_file($this->zipname)) { // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); // ----- Return return 0; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return 0; } // ----- Close the zip file $this->privCloseFd(); // ----- Set the user attributes $v_prop['comment'] = $v_central_dir['comment']; $v_prop['nb'] = $v_central_dir['entries']; $v_prop['status'] = 'ok'; } // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_prop; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : duplicate() // Description : // This method creates an archive by copying the content of an other one. If // the archive already exist, it is replaced by the new one without any warning. // Parameters : // $p_archive : The filename of a valid archive, or // a valid PclZip object. // Return Values : // 1 on success. // 0 or a negative value on error (error code). // -------------------------------------------------------------------------------- function duplicate($p_archive) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Look if the $p_archive is a PclZip object if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) { // ----- Duplicate the archive $v_result = $this->privDuplicate($p_archive->zipname); } // ----- Look if the $p_archive is a string (so a filename) else if (is_string($p_archive)) { // ----- Check that $p_archive is a valid zip file // TBC : Should also check the archive format if (!is_file($p_archive)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); $v_result = PCLZIP_ERR_MISSING_FILE; } else { // ----- Duplicate the archive $v_result = $this->privDuplicate($p_archive); } } // ----- Invalid variable else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : merge() // Description : // This method merge the $p_archive_to_add archive at the end of the current // one ($this). // If the archive ($this) does not exist, the merge becomes a duplicate. // If the $p_archive_to_add archive does not exist, the merge is a success. // Parameters : // $p_archive_to_add : It can be directly the filename of a valid zip archive, // or a PclZip object archive. // Return Values : // 1 on success, // 0 or negative values on error (see below). // -------------------------------------------------------------------------------- function merge($p_archive_to_add) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Look if the $p_archive_to_add is a PclZip object if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) { // ----- Merge the archive $v_result = $this->privMerge($p_archive_to_add); } // ----- Look if the $p_archive_to_add is a string (so a filename) else if (is_string($p_archive_to_add)) { // ----- Create a temporary archive $v_object_archive = new PclZip($p_archive_to_add); // ----- Merge the archive $v_result = $this->privMerge($v_object_archive); } // ----- Invalid variable else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorCode() // Description : // Parameters : // -------------------------------------------------------------------------------- function errorCode() { if (PCLZIP_ERROR_EXTERNAL == 1) { return(PclErrorCode()); } else { return($this->error_code); } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorName() // Description : // Parameters : // -------------------------------------------------------------------------------- function errorName($p_with_code=false) { $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' ); if (isset($v_name[$this->error_code])) { $v_value = $v_name[$this->error_code]; } else { $v_value = 'NoName'; } if ($p_with_code) { return($v_value.' ('.$this->error_code.')'); } else { return($v_value); } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorInfo() // Description : // Parameters : // -------------------------------------------------------------------------------- function errorInfo($p_full=false) { if (PCLZIP_ERROR_EXTERNAL == 1) { return(PclErrorString()); } else { if ($p_full) { return($this->errorName(true)." : ".$this->error_string); } else { return($this->error_string." [code ".$this->error_code."]"); } } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** // ***** ***** // ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCheckFormat() // Description : // This method check that the archive exists and is a valid zip archive. // Several level of check exists. (futur) // Parameters : // $p_level : Level of check. Default 0. // 0 : Check the first bytes (magic codes) (default value)) // 1 : 0 + Check the central directory (futur) // 2 : 1 + Check each file header (futur) // Return Values : // true on success, // false on error, the error code is set. // -------------------------------------------------------------------------------- function privCheckFormat($p_level=0) { $v_result = true; // ----- Reset the file system cache clearstatcache(); // ----- Reset the error handler $this->privErrorReset(); // ----- Look if the file exits if (!is_file($this->zipname)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); return(false); } // ----- Check that the file is readeable if (!is_readable($this->zipname)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); return(false); } // ----- Check the magic code // TBC // ----- Check the central header // TBC // ----- Check each file header // TBC // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privParseOptions() // Description : // This internal methods reads the variable list of arguments ($p_options_list, // $p_size) and generate an array with the options and values ($v_result_list). // $v_requested_options contains the options that can be present and those that // must be present. // $v_requested_options is an array, with the option value as key, and 'optional', // or 'mandatory' as value. // Parameters : // See above. // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) { $v_result=1; // ----- Read the options $i=0; while ($i<$p_size) { // ----- Check if the option is supported if (!isset($v_requested_options[$p_options_list[$i]])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); // ----- Return return PclZip::errorCode(); } // ----- Look for next option switch ($p_options_list[$i]) { // ----- Look for options that request a path value case PCLZIP_OPT_PATH : case PCLZIP_OPT_REMOVE_PATH : case PCLZIP_OPT_ADD_PATH : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); $i++; break; case PCLZIP_OPT_TEMP_FILE_THRESHOLD : // ----- Check the number of parameters if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } // ----- Check the value $v_value = $p_options_list[$i+1]; if ((!is_integer($v_value)) || ($v_value<0)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } // ----- Get the value (and convert it in bytes) $v_result_list[$p_options_list[$i]] = $v_value*1048576; $i++; break; case PCLZIP_OPT_TEMP_FILE_ON : // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_TEMP_FILE_OFF : // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); return PclZip::errorCode(); } // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if ( is_string($p_options_list[$i+1]) && ($p_options_list[$i+1] != '')) { $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); $i++; } else { } break; // ----- Look for options that request an array of string for value case PCLZIP_OPT_BY_NAME : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; } else if (is_array($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that request an EREG or PREG expression case PCLZIP_OPT_BY_EREG : // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG // to PCLZIP_OPT_BY_PREG $p_options_list[$i] = PCLZIP_OPT_BY_PREG; case PCLZIP_OPT_BY_PREG : //case PCLZIP_OPT_CRYPT : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that takes a string case PCLZIP_OPT_COMMENT : case PCLZIP_OPT_ADD_COMMENT : case PCLZIP_OPT_PREPEND_COMMENT : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" .PclZipUtilOptionText($p_options_list[$i]) ."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" .PclZipUtilOptionText($p_options_list[$i]) ."'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that request an array of index case PCLZIP_OPT_BY_INDEX : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_work_list = array(); if (is_string($p_options_list[$i+1])) { // ----- Remove spaces $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); // ----- Parse items $v_work_list = explode(",", $p_options_list[$i+1]); } else if (is_integer($p_options_list[$i+1])) { $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; } else if (is_array($p_options_list[$i+1])) { $v_work_list = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Reduce the index list // each index item in the list must be a couple with a start and // an end value : [0,3], [5-5], [8-10], ... // ----- Check the format of each item $v_sort_flag=false; $v_sort_value=0; for ($j=0; $j= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; $i++; break; // ----- Look for options that request a call-back case PCLZIP_CB_PRE_EXTRACT : case PCLZIP_CB_POST_EXTRACT : case PCLZIP_CB_PRE_ADD : case PCLZIP_CB_POST_ADD : /* for futur use case PCLZIP_CB_PRE_DELETE : case PCLZIP_CB_POST_DELETE : case PCLZIP_CB_PRE_LIST : case PCLZIP_CB_POST_LIST : */ // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_function_name = $p_options_list[$i+1]; // ----- Check that the value is a valid existing function if (!function_exists($v_function_name)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Set the attribute $v_result_list[$p_options_list[$i]] = $v_function_name; $i++; break; default : // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" .$p_options_list[$i]."'"); // ----- Return return PclZip::errorCode(); } // ----- Next options $i++; } // ----- Look for mandatory options if ($v_requested_options !== false) { for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { // ----- Look for mandatory option if ($v_requested_options[$key] == 'mandatory') { // ----- Look if present if (!isset($v_result_list[$key])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); // ----- Return return PclZip::errorCode(); } } } } // ----- Look for default values if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privOptionDefaultThreshold() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privOptionDefaultThreshold(&$p_options) { $v_result=1; if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { return $v_result; } // ----- Get 'memory_limit' configuration value $v_memory_limit = ini_get('memory_limit'); $v_memory_limit = trim($v_memory_limit); $last = strtolower(substr($v_memory_limit, -1)); if($last == 'g') //$v_memory_limit = $v_memory_limit*1024*1024*1024; $v_memory_limit = $v_memory_limit*1073741824; if($last == 'm') //$v_memory_limit = $v_memory_limit*1024*1024; $v_memory_limit = $v_memory_limit*1048576; if($last == 'k') $v_memory_limit = $v_memory_limit*1024; $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); // ----- Sanity check : No threshold if value lower than 1M if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privFileDescrParseAtt() // Description : // Parameters : // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) { $v_result=1; // ----- For each file in the list check the attributes foreach ($p_file_list as $v_key => $v_value) { // ----- Check if the option is supported if (!isset($v_requested_options[$v_key])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); // ----- Return return PclZip::errorCode(); } // ----- Look for attribute switch ($v_key) { case PCLZIP_ATT_FILE_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['filename'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_SHORT_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_short_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_FULL_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_full_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; // ----- Look for options that takes a string case PCLZIP_ATT_FILE_COMMENT : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['comment'] = $v_value; break; case PCLZIP_ATT_FILE_MTIME : if (!is_integer($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['mtime'] = $v_value; break; case PCLZIP_ATT_FILE_CONTENT : $p_filedescr['content'] = $v_value; break; default : // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '".$v_key."'"); // ----- Return return PclZip::errorCode(); } // ----- Look for mandatory options if ($v_requested_options !== false) { for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { // ----- Look for mandatory option if ($v_requested_options[$key] == 'mandatory') { // ----- Look if present if (!isset($p_file_list[$key])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); return PclZip::errorCode(); } } } } // end foreach } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privFileDescrExpand() // Description : // This method look for each item of the list to see if its a file, a folder // or a string to be added as file. For any other type of files (link, other) // just ignore the item. // Then prepare the information that will be stored for that file. // When its a folder, expand the folder with all the files that are in that // folder (recursively). // Parameters : // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- function privFileDescrExpand(&$p_filedescr_list, &$p_options) { $v_result=1; // ----- Create a result list $v_result_list = array(); // ----- Look each entry for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); // ----- Add the descriptor in result list $v_result_list[sizeof($v_result_list)] = $v_descr; // ----- Look for folder if ($v_descr['type'] == 'folder') { // ----- List of items in folder $v_dirlist_descr = array(); $v_dirlist_nb = 0; if ($v_folder_handler = @opendir($v_descr['filename'])) { while (($v_item_handler = @readdir($v_folder_handler)) !== false) { // ----- Skip '.' and '..' if (($v_item_handler == '.') || ($v_item_handler == '..')) { continue; } // ----- Compose the full filename $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; // ----- Look for different stored filename // Because the name of the folder was changed, the name of the // files/sub-folders also change if (($v_descr['stored_filename'] != $v_descr['filename']) && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { if ($v_descr['stored_filename'] != '') { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; } else { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; } } $v_dirlist_nb++; } @closedir($v_folder_handler); } else { // TBC : unable to open folder in read mode } // ----- Expand each element of the list if ($v_dirlist_nb != 0) { // ----- Expand if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { return $v_result; } // ----- Concat the resulting list $v_result_list = array_merge($v_result_list, $v_dirlist_descr); } else { } // ----- Free local array unset($v_dirlist_descr); } } // ----- Get the result list $p_filedescr_list = $v_result_list; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCreate() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privCreate($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the file in write mode if (($v_result = $this->privOpenFd('wb')) != 1) { // ----- Return return $v_result; } // ----- Add the list of files $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); // ----- Close $this->privCloseFd(); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAdd() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privAdd($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); // ----- Look if the archive exists or is empty if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) { // ----- Do a create $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); // ----- Return return $v_result; } // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the zip file if (($v_result=$this->privOpenFd('rb')) != 1) { // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Swap the file descriptor // Here is a trick : I swap the temporary fd with the zip fd, in order to use // the following methods on the temporary fil and not the real archive $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Add the files $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Store the offset of the central dir $v_offset = @ftell($this->zip_fd); // ----- Copy the block of file headers from the old archive $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Create the Central Dir files header for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } $v_count++; } // ----- Transform the header to a 'usable' info $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = $v_central_dir['comment']; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; } if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; } // ----- Calculate the size of the central header $v_size = @ftell($this->zip_fd)-$v_offset; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Swap back the file descriptor $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Close $this->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privOpenFd() // Description : // Parameters : // -------------------------------------------------------------------------------- function privOpenFd($p_mode) { $v_result=1; // ----- Look if already open if ($this->zip_fd != 0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); // ----- Return return PclZip::errorCode(); } // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); // ----- Return return PclZip::errorCode(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCloseFd() // Description : // Parameters : // -------------------------------------------------------------------------------- function privCloseFd() { $v_result=1; if ($this->zip_fd != 0) @fclose($this->zip_fd); $this->zip_fd = 0; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddList() // Description : // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is // different from the real path of the file. This is usefull if you want to have PclTar // running in any directory, and memorize relative path from an other directory. // Parameters : // $p_list : An array containing the file or directory names to add in the tar // $p_result_list : list of added files with their properties (specially the status field) // $p_add_dir : Path to add in the filename path archived // $p_remove_dir : Path to remove in the filename path archived // Return Values : // -------------------------------------------------------------------------------- // function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) function privAddList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; // ----- Add the files $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { // ----- Return return $v_result; } // ----- Store the offset of the central dir $v_offset = @ftell($this->zip_fd); // ----- Create the Central Dir files header for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { // ----- Return return $v_result; } $v_count++; } // ----- Transform the header to a 'usable' info $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } // ----- Calculate the size of the central header $v_size = @ftell($this->zip_fd)-$v_offset; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); // ----- Return return $v_result; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFileList() // Description : // Parameters : // $p_filedescr_list : An array containing the file description // or directory names to add in the zip // $p_result_list : list of added files with their properties (specially the status field) // Return Values : // -------------------------------------------------------------------------------- function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_header = array(); // ----- Recuperate the current number of elt in list $v_nb = sizeof($p_result_list); // ----- Loop on the files for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, $p_options); if ($v_result != 1) { return $v_result; } // ----- Store the file infos $p_result_list[$v_nb++] = $v_header; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privAddFile($p_filedescr, &$p_header, &$p_options) { $v_result=1; // ----- Working variable $p_filename = $p_filedescr['filename']; // TBC : Already done in the fileAtt check ... ? if ($p_filename == "") { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); // ----- Return return PclZip::errorCode(); } // ----- Look for a stored different filename /* TBC : Removed if (isset($p_filedescr['stored_filename'])) { $v_stored_filename = $p_filedescr['stored_filename']; } else { $v_stored_filename = $p_filedescr['stored_filename']; } */ // ----- Set the file properties clearstatcache(); $p_header['version'] = 20; $p_header['version_extracted'] = 10; $p_header['flag'] = 0; $p_header['compression'] = 0; $p_header['crc'] = 0; $p_header['compressed_size'] = 0; $p_header['filename_len'] = strlen($p_filename); $p_header['extra_len'] = 0; $p_header['disk'] = 0; $p_header['internal'] = 0; $p_header['offset'] = 0; $p_header['filename'] = $p_filename; // TBC : Removed $p_header['stored_filename'] = $v_stored_filename; $p_header['stored_filename'] = $p_filedescr['stored_filename']; $p_header['extra'] = ''; $p_header['status'] = 'ok'; $p_header['index'] = -1; // ----- Look for regular file if ($p_filedescr['type']=='file') { $p_header['external'] = 0x00000000; $p_header['size'] = filesize($p_filename); } // ----- Look for regular folder else if ($p_filedescr['type']=='folder') { $p_header['external'] = 0x00000010; $p_header['mtime'] = filemtime($p_filename); $p_header['size'] = filesize($p_filename); } // ----- Look for virtual file else if ($p_filedescr['type'] == 'virtual_file') { $p_header['external'] = 0x00000000; $p_header['size'] = strlen($p_filedescr['content']); } // ----- Look for filetime if (isset($p_filedescr['mtime'])) { $p_header['mtime'] = $p_filedescr['mtime']; } else if ($p_filedescr['type'] == 'virtual_file') { $p_header['mtime'] = time(); } else { $p_header['mtime'] = filemtime($p_filename); } // ------ Look for file comment if (isset($p_filedescr['comment'])) { $p_header['comment_len'] = strlen($p_filedescr['comment']); $p_header['comment'] = $p_filedescr['comment']; } else { $p_header['comment_len'] = 0; $p_header['comment'] = ''; } // ----- Look for pre-add callback if (isset($p_options[PCLZIP_CB_PRE_ADD])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_header['status'] = "skipped"; $v_result = 1; } // ----- Update the informations // Only some fields can be modified if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); } } // ----- Look for empty stored filename if ($p_header['stored_filename'] == "") { $p_header['status'] = "filtered"; } // ----- Check the path length if (strlen($p_header['stored_filename']) > 0xFF) { $p_header['status'] = 'filename_too_long'; } // ----- Look if no error, or file not skipped if ($p_header['status'] == 'ok') { // ----- Look for a file if ($p_filedescr['type'] == 'file') { // ----- Look for using temporary file to zip if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } } // ----- Use "in memory" zip algo else { // ----- Open the source file if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } // ----- Read the file content $v_content = @fread($v_file, $p_header['size']); // ----- Close the file @fclose($v_file); // ----- Calculate the CRC $p_header['crc'] = @crc32($v_content); // ----- Look for no compression if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { // ----- Set header parameters $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; } // ----- Look for normal compression else { // ----- Compress the content $v_content = @gzdeflate($v_content); // ----- Set header parameters $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } // ----- Write the compressed (or not) content @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); } } // ----- Look for a virtual file (a file from string) else if ($p_filedescr['type'] == 'virtual_file') { $v_content = $p_filedescr['content']; // ----- Calculate the CRC $p_header['crc'] = @crc32($v_content); // ----- Look for no compression if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { // ----- Set header parameters $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; } // ----- Look for normal compression else { // ----- Compress the content $v_content = @gzdeflate($v_content); // ----- Set header parameters $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } // ----- Write the compressed (or not) content @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); } // ----- Look for a directory else if ($p_filedescr['type'] == 'folder') { // ----- Look for directory last '/' if (@substr($p_header['stored_filename'], -1) != '/') { $p_header['stored_filename'] .= '/'; } // ----- Set the file properties $p_header['size'] = 0; //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked $p_header['external'] = 0x00000010; // Value for a folder : to be checked // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } } } // ----- Look for post-add callback if (isset($p_options[PCLZIP_CB_POST_ADD])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); if ($v_result == 0) { // ----- Ignored $v_result = 1; } // ----- Update the informations // Nothing can be modified } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFileUsingTempFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) { $v_result=PCLZIP_ERR_NO_ERROR; // ----- Working variable $p_filename = $p_filedescr['filename']; // ----- Open the source file if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } // ----- Creates a compressed temporary file $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = filesize($p_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @gzputs($v_file_compressed, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close the file @fclose($v_file); @gzclose($v_file_compressed); // ----- Check the minimum file size if (filesize($v_gzip_temp_name) < 18) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); return PclZip::errorCode(); } // ----- Extract the compressed attributes if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the gzip file header $v_binary_data = @fread($v_file_compressed, 10); $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); // ----- Check some parameters $v_data_header['os'] = bin2hex($v_data_header['os']); // ----- Read the gzip file footer @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); $v_binary_data = @fread($v_file_compressed, 8); $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); // ----- Set the attributes $p_header['compression'] = ord($v_data_header['cm']); //$p_header['mtime'] = $v_data_header['mtime']; $p_header['crc'] = $v_data_footer['crc']; $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; // ----- Close the file @fclose($v_file_compressed); // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } // ----- Add the compressed data if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks fseek($v_file_compressed, 10); $v_size = $p_header['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file_compressed, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close the file @fclose($v_file_compressed); // ----- Unlink the temporary file @unlink($v_gzip_temp_name); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCalculateStoredFilename() // Description : // Based on file descriptor properties and global options, this method // calculate the filename that will be stored in the archive. // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privCalculateStoredFilename(&$p_filedescr, &$p_options) { $v_result=1; // ----- Working variables $p_filename = $p_filedescr['filename']; if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; } else { $p_add_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; } else { $p_remove_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } else { $p_remove_all_dir = 0; } // ----- Look for full name change if (isset($p_filedescr['new_full_name'])) { // ----- Remove drive letter if any $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); } // ----- Look for path and/or short name change else { // ----- Look for short name change // Its when we cahnge just the filename but not the path if (isset($p_filedescr['new_short_name'])) { $v_path_info = pathinfo($p_filename); $v_dir = ''; if ($v_path_info['dirname'] != '') { $v_dir = $v_path_info['dirname'].'/'; } $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; } else { // ----- Calculate the stored filename $v_stored_filename = $p_filename; } // ----- Look for all path to remove if ($p_remove_all_dir) { $v_stored_filename = basename($p_filename); } // ----- Look for partial path remove else if ($p_remove_dir != "") { if (substr($p_remove_dir, -1) != '/') $p_remove_dir .= "/"; if ( (substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) { if ( (substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) { $p_remove_dir = "./".$p_remove_dir; } if ( (substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) { $p_remove_dir = substr($p_remove_dir, 2); } } $v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename); if ($v_compare > 0) { if ($v_compare == 2) { $v_stored_filename = ""; } else { $v_stored_filename = substr($v_stored_filename, strlen($p_remove_dir)); } } } // ----- Remove drive letter if any $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); // ----- Look for path to add if ($p_add_dir != "") { if (substr($p_add_dir, -1) == "/") $v_stored_filename = $p_add_dir.$v_stored_filename; else $v_stored_filename = $p_add_dir."/".$v_stored_filename; } } // ----- Filename (reduce the path of stored name) $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); $p_filedescr['stored_filename'] = $v_stored_filename; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privWriteFileHeader(&$p_header) { $v_result=1; // ----- Store the offset position of the file $p_header['offset'] = ftell($this->zip_fd); // ----- Transform UNIX mtime to DOS format mdate/mtime $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; // ----- Packed data $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len']); // ----- Write the first 148 bytes of the header in the archive fputs($this->zip_fd, $v_binary_data, 30); // ----- Write the variable fields if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteCentralFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privWriteCentralFileHeader(&$p_header) { $v_result=1; // TBC //for(reset($p_header); $key = key($p_header); next($p_header)) { //} // ----- Transform UNIX mtime to DOS format mdate/mtime $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; // ----- Packed data $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, $p_header['version'], $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len'], $p_header['comment_len'], $p_header['disk'], $p_header['internal'], $p_header['external'], $p_header['offset']); // ----- Write the 42 bytes of the header in the zip file fputs($this->zip_fd, $v_binary_data, 46); // ----- Write the variable fields if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } if ($p_header['comment_len'] != 0) { fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteCentralHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) { $v_result=1; // ----- Packed data $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment)); // ----- Write the 22 bytes of the header in the zip file fputs($this->zip_fd, $v_binary_data, 22); // ----- Write the variable fields if (strlen($p_comment) != 0) { fputs($this->zip_fd, $p_comment, strlen($p_comment)); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privList() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privList(&$p_list) { $v_result=1; // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); // ----- Return return PclZip::errorCode(); } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Go to beginning of Central Dir @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_central_dir['offset'])) { $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read each entry for ($i=0; $i<$v_central_dir['entries']; $i++) { // ----- Read the file header if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } $v_header['index'] = $i; // ----- Get the only interesting attributes $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); unset($v_header); } // ----- Close the zip file $this->privCloseFd(); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privConvertHeader2FileInfo() // Description : // This function takes the file informations from the central directory // entries and extract the interesting parameters that will be given back. // The resulting file infos are set in the array $p_info // $p_info['filename'] : Filename with full path. Given by user (add), // extracted in the filesystem (extract). // $p_info['stored_filename'] : Stored filename in the archive. // $p_info['size'] = Size of the file. // $p_info['compressed_size'] = Compressed size of the file. // $p_info['mtime'] = Last modification date of the file. // $p_info['comment'] = Comment associated with the file. // $p_info['folder'] = true/false : indicates if the entry is a folder or not. // $p_info['status'] = status of the action on the file. // $p_info['crc'] = CRC of the file content. // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privConvertHeader2FileInfo($p_header, &$p_info) { $v_result=1; // ----- Get the interesting attributes $v_temp_path = PclZipUtilPathReduction($p_header['filename']); $p_info['filename'] = $v_temp_path; $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); $p_info['stored_filename'] = $v_temp_path; $p_info['size'] = $p_header['size']; $p_info['compressed_size'] = $p_header['compressed_size']; $p_info['mtime'] = $p_header['mtime']; $p_info['comment'] = $p_header['comment']; $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); $p_info['index'] = $p_header['index']; $p_info['status'] = $p_header['status']; $p_info['crc'] = $p_header['crc']; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractByRule() // Description : // Extract a file or directory depending of rules (by index, by name, ...) // Parameters : // $p_file_list : An array where will be placed the properties of each // extracted file // $p_path : Path to add while writing the extracted files // $p_remove_path : Path to remove (from the file memorized path) while writing the // extracted files. If the path does not match the file path, // the file is extracted with its memorized path. // $p_remove_path does not apply to 'list' mode. // $p_path and $p_remove_path are commulative. // Return Values : // 1 on success,0 or less on error (see error code list) // -------------------------------------------------------------------------------- function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result=1; // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Check the path if ( ($p_path == "") || ( (substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path,1,2)!=":/"))) $p_path = "./".$p_path; // ----- Reduce the path last (and duplicated) '/' if (($p_path != "./") && ($p_path != "/")) { // ----- Look for the path end '/' while (substr($p_path, -1) == "/") { $p_path = substr($p_path, 0, strlen($p_path)-1); } } // ----- Look for path to remove format (should end by /) if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { $p_remove_path .= '/'; } $p_remove_path_size = strlen($p_remove_path); // ----- Open the zip file if (($v_result = $this->privOpenFd('rb')) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Start at beginning of Central Dir $v_pos_entry = $v_central_dir['offset']; // ----- Read each entry $j_start = 0; for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { // ----- Read next Central dir entry @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read the file header $v_header = array(); if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Store the index $v_header['index'] = $i; // ----- Store the file position $v_pos_entry = ftell($this->zip_fd); // ----- Look for the specific extract rules $v_extract = false; // ----- Look for extract by name rule if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { // ----- Look if the filename is in the list for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_extract = true; } } // ----- Look for a filename elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_extract = true; } } } // ----- Look for extract by ereg rule // ereg() is deprecated with PHP 5.3 /* else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { $v_extract = true; } } */ // ----- Look for extract by preg rule else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { $v_extract = true; } } // ----- Look for extract by index rule else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { // ----- Look if the index is in the list for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_extract = true; } if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j+1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { break; } } } // ----- Look for no rule, which means extract all the archive else { $v_extract = true; } // ----- Check compression method if ( ($v_extract) && ( ($v_header['compression'] != 8) && ($v_header['compression'] != 0))) { $v_header['status'] = 'unsupported_compression'; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, "Filename '".$v_header['stored_filename']."' is " ."compressed by an unsupported compression " ."method (".$v_header['compression'].") "); return PclZip::errorCode(); } } // ----- Check encrypted files if (($v_extract) && (($v_header['flag'] & 1) == 1)) { $v_header['status'] = 'unsupported_encryption'; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, "Unsupported encryption for " ." filename '".$v_header['stored_filename'] ."'"); return PclZip::errorCode(); } } // ----- Look for real extraction if (($v_extract) && ($v_header['status'] != 'ok')) { $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]); if ($v_result != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } $v_extract = false; } // ----- Look for real extraction if ($v_extract) { // ----- Go to the file position @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_header['offset'])) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Look for extraction as string if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { $v_string = ''; // ----- Extracting the file $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Set the file content $p_file_list[$v_nb_extracted]['content'] = $v_string; // ----- Next extracted file $v_nb_extracted++; // ----- Look for user callback abort if ($v_result1 == 2) { break; } } // ----- Look for extraction in standard output elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { // ----- Extracting the file in standard output $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Look for user callback abort if ($v_result1 == 2) { break; } } // ----- Look for normal extraction else { // ----- Extracting the file $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Look for user callback abort if ($v_result1 == 2) { break; } } } } // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFile() // Description : // Parameters : // Return Values : // // 1 : ... ? // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback // -------------------------------------------------------------------------------- function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result=1; // ----- Read the file header if (($v_result = $this->privReadFileHeader($v_header)) != 1) { // ----- Return return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for all path to remove if ($p_remove_all_path == true) { // ----- Look for folder entry that not need to be extracted if (($p_entry['external']&0x00000010)==0x00000010) { $p_entry['status'] = "filtered"; return $v_result; } // ----- Get the basename of the path $p_entry['filename'] = basename($p_entry['filename']); } // ----- Look for path to remove else if ($p_remove_path != "") { if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) { // ----- Change the file status $p_entry['status'] = "filtered"; // ----- Return return $v_result; } $p_remove_path_size = strlen($p_remove_path); if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) { // ----- Remove the path $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); } } // ----- Add the path if ($p_path != '') { $p_entry['filename'] = $p_path."/".$p_entry['filename']; } // ----- Check a base_dir_restriction if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { $v_inclusion = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']); if ($v_inclusion == 0) { PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, "Filename '".$p_entry['filename']."' is " ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); return PclZip::errorCode(); } } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Look for specific actions while the file exist if (file_exists($p_entry['filename'])) { // ----- Look if file is a directory if (is_dir($p_entry['filename'])) { // ----- Change the file status $p_entry['status'] = "already_a_directory"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, "Filename '".$p_entry['filename']."' is " ."already used by an existing directory"); return PclZip::errorCode(); } } // ----- Look if file is write protected else if (!is_writeable($p_entry['filename'])) { // ----- Change the file status $p_entry['status'] = "write_protected"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Filename '".$p_entry['filename']."' exists " ."and is write protected"); return PclZip::errorCode(); } } // ----- Look if the extracted file is older else if (filemtime($p_entry['filename']) > $p_entry['mtime']) { // ----- Change the file status if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { } else { $p_entry['status'] = "newer_exist"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Newer version of '".$p_entry['filename']."' exists " ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); return PclZip::errorCode(); } } } else { } } // ----- Check the directory availability and create it if necessary else { if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) $v_dir_to_check = $p_entry['filename']; else if (!strstr($p_entry['filename'], "/")) $v_dir_to_check = ""; else $v_dir_to_check = dirname($p_entry['filename']); if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { // ----- Change the file status $p_entry['status'] = "path_creation_fail"; // ----- Return //return $v_result; $v_result = 1; } } } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external']&0x00000010)==0x00000010)) { // ----- Look for not compressed file if ($p_entry['compression'] == 0) { // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { // ----- Change the file status $p_entry['status'] = "write_error"; // ----- Return return $v_result; } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); /* Try to speed up the code $v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_binary_data, $v_read_size); */ @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Closing the destination file fclose($v_dest_file); // ----- Change the file mtime touch($p_entry['filename'], $p_entry['mtime']); } else { // ----- TBC // Need to be finished if (($p_entry['flag'] & 1) == 1) { PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); return PclZip::errorCode(); } // ----- Look for using temporary file to unzip if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } } // ----- Look for extract in memory else { // ----- Read the compressed file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file $v_file_content = @gzinflate($v_buffer); unset($v_buffer); if ($v_file_content === FALSE) { // ----- Change the file status // TBC $p_entry['status'] = "error"; return $v_result; } // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { // ----- Change the file status $p_entry['status'] = "write_error"; return $v_result; } // ----- Write the uncompressed data @fwrite($v_dest_file, $v_file_content, $p_entry['size']); unset($v_file_content); // ----- Closing the destination file @fclose($v_dest_file); } // ----- Change the file mtime @touch($p_entry['filename'], $p_entry['mtime']); } // ----- Look for chmod option if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { // ----- Change the mode of the file @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); } } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } // ----- Look for post-extract callback elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileUsingTempFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privExtractFileUsingTempFile(&$p_entry, &$p_options) { $v_result=1; // ----- Creates a temporary file $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } // ----- Write gz file format header $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); @fwrite($v_dest_file, $v_binary_data, 10); // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Write gz file format footer $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); @fwrite($v_dest_file, $v_binary_data, 8); // ----- Close the temporary file @fclose($v_dest_file); // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { $p_entry['status'] = "write_error"; return $v_result; } // ----- Open the temporary gz file if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { @fclose($v_dest_file); $p_entry['status'] = "read_error"; PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($v_src_file, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } @fclose($v_dest_file); @gzclose($v_src_file); // ----- Delete the temporary file @unlink($v_gzip_temp_name); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileInOutput() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privExtractFileInOutput(&$p_entry, &$p_options) { $v_result=1; // ----- Read the file header if (($v_result = $this->privReadFileHeader($v_header)) != 1) { return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Trace // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external']&0x00000010)==0x00000010)) { // ----- Look for not compressed file if ($p_entry['compressed_size'] == $p_entry['size']) { // ----- Read the file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Send the file to the output echo $v_buffer; unset($v_buffer); } else { // ----- Read the compressed file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file $v_file_content = gzinflate($v_buffer); unset($v_buffer); // ----- Send the file to the output echo $v_file_content; unset($v_file_content); } } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } // ----- Look for post-extract callback elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileAsString() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) { $v_result=1; // ----- Read the file header $v_header = array(); if (($v_result = $this->privReadFileHeader($v_header)) != 1) { // ----- Return return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external']&0x00000010)==0x00000010)) { // ----- Look for not compressed file // if ($p_entry['compressed_size'] == $p_entry['size']) if ($p_entry['compression'] == 0) { // ----- Reading the file $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); } else { // ----- Reading the file $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file if (($p_string = @gzinflate($v_data)) === FALSE) { // TBC } } // ----- Trace } else { // TBC : error : can not extract a folder in a string } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } // ----- Look for post-extract callback elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Swap the content to header $v_local_header['content'] = $p_string; $p_string = ''; // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Swap back the content to header $p_string = $v_local_header['content']; unset($v_local_header['content']); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privReadFileHeader(&$p_header) { $v_result=1; // ----- Read the 4 bytes signature $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] != 0x04034b50) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); // ----- Return return PclZip::errorCode(); } // ----- Read the first 42 bytes of the header $v_binary_data = fread($this->zip_fd, 26); // ----- Look for invalid block size if (strlen($v_binary_data) != 26) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); // ----- Get filename $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); // ----- Get extra_fields if ($v_data['extra_len'] != 0) { $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); } else { $p_header['extra'] = ''; } // ----- Extract properties $p_header['version_extracted'] = $v_data['version']; $p_header['compression'] = $v_data['compression']; $p_header['size'] = $v_data['size']; $p_header['compressed_size'] = $v_data['compressed_size']; $p_header['crc'] = $v_data['crc']; $p_header['flag'] = $v_data['flag']; $p_header['filename_len'] = $v_data['filename_len']; // ----- Recuperate date in UNIX format $p_header['mdate'] = $v_data['mdate']; $p_header['mtime'] = $v_data['mtime']; if ($p_header['mdate'] && $p_header['mtime']) { // ----- Extract time $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F)*2; // ----- Extract date $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; // ----- Get UNIX date format $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } // TBC //for(reset($v_data); $key = key($v_data); next($v_data)) { //} // ----- Set the stored filename $p_header['stored_filename'] = $p_header['filename']; // ----- Set the status field $p_header['status'] = "ok"; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadCentralFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privReadCentralFileHeader(&$p_header) { $v_result=1; // ----- Read the 4 bytes signature $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] != 0x02014b50) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); // ----- Return return PclZip::errorCode(); } // ----- Read the first 42 bytes of the header $v_binary_data = fread($this->zip_fd, 42); // ----- Look for invalid block size if (strlen($v_binary_data) != 42) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); // ----- Get filename if ($p_header['filename_len'] != 0) $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); else $p_header['filename'] = ''; // ----- Get extra if ($p_header['extra_len'] != 0) $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); else $p_header['extra'] = ''; // ----- Get comment if ($p_header['comment_len'] != 0) $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); else $p_header['comment'] = ''; // ----- Extract properties // ----- Recuperate date in UNIX format //if ($p_header['mdate'] && $p_header['mtime']) // TBC : bug : this was ignoring time with 0/0/0 if (1) { // ----- Extract time $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F)*2; // ----- Extract date $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; // ----- Get UNIX date format $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } // ----- Set the stored filename $p_header['stored_filename'] = $p_header['filename']; // ----- Set default status to ok $p_header['status'] = 'ok'; // ----- Look if it is a directory if (substr($p_header['filename'], -1) == '/') { //$p_header['external'] = 0x41FF0010; $p_header['external'] = 0x00000010; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCheckFileHeaders() // Description : // Parameters : // Return Values : // 1 on success, // 0 on error; // -------------------------------------------------------------------------------- function privCheckFileHeaders(&$p_local_header, &$p_central_header) { $v_result=1; // ----- Check the static values // TBC if ($p_local_header['filename'] != $p_central_header['filename']) { } if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { } if ($p_local_header['flag'] != $p_central_header['flag']) { } if ($p_local_header['compression'] != $p_central_header['compression']) { } if ($p_local_header['mtime'] != $p_central_header['mtime']) { } if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { } // ----- Look for flag bit 3 if (($p_local_header['flag'] & 8) == 8) { $p_local_header['size'] = $p_central_header['size']; $p_local_header['compressed_size'] = $p_central_header['compressed_size']; $p_local_header['crc'] = $p_central_header['crc']; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadEndCentralDir() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privReadEndCentralDir(&$p_central_dir) { $v_result=1; // ----- Go to the end of the zip file $v_size = filesize($this->zipname); @fseek($this->zip_fd, $v_size); if (@ftell($this->zip_fd) != $v_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); // ----- Return return PclZip::errorCode(); } // ----- First try : look if this is an archive with no commentaries (most of the time) // in this case the end of central dir is at 22 bytes of the file end $v_found = 0; if ($v_size > 26) { @fseek($this->zip_fd, $v_size-22); if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); // ----- Return return PclZip::errorCode(); } // ----- Read for bytes $v_binary_data = @fread($this->zip_fd, 4); $v_data = @unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] == 0x06054b50) { $v_found = 1; } $v_pos = ftell($this->zip_fd); } // ----- Go back to the maximum possible size of the Central Dir End Record if (!$v_found) { $v_maximum_size = 65557; // 0xFFFF + 22; if ($v_maximum_size > $v_size) $v_maximum_size = $v_size; @fseek($this->zip_fd, $v_size-$v_maximum_size); if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); // ----- Return return PclZip::errorCode(); } // ----- Read byte per byte in order to find the signature $v_pos = ftell($this->zip_fd); $v_bytes = 0x00000000; while ($v_pos < $v_size) { // ----- Read a byte $v_byte = @fread($this->zip_fd, 1); // ----- Add the byte //$v_bytes = ($v_bytes << 8) | Ord($v_byte); // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); // ----- Compare the bytes if ($v_bytes == 0x504b0506) { $v_pos++; break; } $v_pos++; } // ----- Look if not found end of central dir if ($v_pos == $v_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); // ----- Return return PclZip::errorCode(); } } // ----- Read the first 18 bytes of the header $v_binary_data = fread($this->zip_fd, 18); // ----- Look for invalid block size if (strlen($v_binary_data) != 18) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); // ----- Check the global size if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { // ----- Removed in release 2.2 see readme file // The check of the file size is a little too strict. // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. // While decrypted, zip has training 0 bytes if (0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive.' .' Some trailing bytes exists after the archive.'); // ----- Return return PclZip::errorCode(); } } // ----- Get comment if ($v_data['comment_size'] != 0) { $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); } else $p_central_dir['comment'] = ''; $p_central_dir['entries'] = $v_data['entries']; $p_central_dir['disk_entries'] = $v_data['disk_entries']; $p_central_dir['offset'] = $v_data['offset']; $p_central_dir['size'] = $v_data['size']; $p_central_dir['disk'] = $v_data['disk']; $p_central_dir['disk_start'] = $v_data['disk_start']; // TBC //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { //} // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDeleteByRule() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privDeleteByRule(&$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); // ----- Open the zip file if (($v_result=$this->privOpenFd('rb')) != 1) { // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Scan all the files // ----- Start at beginning of Central Dir $v_pos_entry = $v_central_dir['offset']; @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { // ----- Close the zip file $this->privCloseFd(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read each entry $v_header_list = array(); $j_start = 0; for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { // ----- Read the file header $v_header_list[$v_nb_extracted] = array(); if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) { // ----- Close the zip file $this->privCloseFd(); return $v_result; } // ----- Store the index $v_header_list[$v_nb_extracted]['index'] = $i; // ----- Look for the specific extract rules $v_found = false; // ----- Look for extract by name rule if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { // ----- Look if the filename is in the list for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } } // ----- Look for a filename elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_found = true; } } } // ----- Look for extract by ereg rule // ereg() is deprecated with PHP 5.3 /* else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { $v_found = true; } } */ // ----- Look for extract by preg rule else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { $v_found = true; } } // ----- Look for extract by index rule else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { // ----- Look if the index is in the list for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_found = true; } if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j+1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { break; } } } else { $v_found = true; } // ----- Look for deletion if ($v_found) { unset($v_header_list[$v_nb_extracted]); } else { $v_nb_extracted++; } } // ----- Look if something need to be deleted if ($v_nb_extracted > 0) { // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; // ----- Creates a temporary zip archive $v_temp_zip = new PclZip($v_zip_temp_name); // ----- Open the temporary zip file in write mode if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { $this->privCloseFd(); // ----- Return return $v_result; } // ----- Look which file need to be kept for ($i=0; $izip_fd); if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read the file header $v_local_header = array(); if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Check that local file header is same as central file header if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) { // TBC } unset($v_local_header); // ----- Write the file header if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Read/write the data block if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } } // ----- Store the offset of the central dir $v_offset = @ftell($v_temp_zip->zip_fd); // ----- Re-Create the Central Dir files header for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Transform the header to a 'usable' info $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } // ----- Calculate the size of the central header $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; // ----- Create the central dir footer if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Close $v_temp_zip->privCloseFd(); $this->privCloseFd(); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Destroy the temporary archive unset($v_temp_zip); } // ----- Remove every files : reset the file else if ($v_central_dir['entries'] != 0) { $this->privCloseFd(); if (($v_result = $this->privOpenFd('wb')) != 1) { return $v_result; } if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { return $v_result; } $this->privCloseFd(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDirCheck() // Description : // Check if a directory exists, if not it creates it and all the parents directory // which may be useful. // Parameters : // $p_dir : Directory path to check. // Return Values : // 1 : OK // -1 : Unable to create directory // -------------------------------------------------------------------------------- function privDirCheck($p_dir, $p_is_dir=false) { $v_result = 1; // ----- Remove the final '/' if (($p_is_dir) && (substr($p_dir, -1)=='/')) { $p_dir = substr($p_dir, 0, strlen($p_dir)-1); } // ----- Check the directory availability if ((is_dir($p_dir)) || ($p_dir == "")) { return 1; } // ----- Extract parent directory $p_parent_dir = dirname($p_dir); // ----- Just a check if ($p_parent_dir != $p_dir) { // ----- Look for parent directory if ($p_parent_dir != "") { if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) { return $v_result; } } } // ----- Create the directory if (!@mkdir($p_dir, 0777)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); // ----- Return return PclZip::errorCode(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privMerge() // Description : // If $p_archive_to_add does not exist, the function exit with a success result. // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privMerge(&$p_archive_to_add) { $v_result=1; // ----- Look if the archive_to_add exists if (!is_file($p_archive_to_add->zipname)) { // ----- Nothing to merge, so merge is a success $v_result = 1; // ----- Return return $v_result; } // ----- Look if the archive exists if (!is_file($this->zipname)) { // ----- Do a duplicate $v_result = $this->privDuplicate($p_archive_to_add->zipname); // ----- Return return $v_result; } // ----- Open the zip file if (($v_result=$this->privOpenFd('rb')) != 1) { // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Open the archive_to_add file if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) { $this->privCloseFd(); // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir_to_add = array(); if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($p_archive_to_add->zip_fd); // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Copy the files from the archive_to_add into the temporary file $v_size = $v_central_dir_to_add['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Store the offset of the central dir $v_offset = @ftell($v_zip_temp_fd); // ----- Copy the block of file headers from the old archive $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Copy the block of file headers from the archive_to_add $v_size = $v_central_dir_to_add['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Merge the file comments $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; // ----- Calculate the size of the (new) central header $v_size = @ftell($v_zip_temp_fd)-$v_offset; // ----- Swap the file descriptor // Here is a trick : I swap the temporary fd with the zip fd, in order to use // the following methods on the temporary fil and not the real archive fd $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); @fclose($v_zip_temp_fd); $this->zip_fd = null; // ----- Reset the file list unset($v_header_list); // ----- Return return $v_result; } // ----- Swap back the file descriptor $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Close $this->privCloseFd(); $p_archive_to_add->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDuplicate() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privDuplicate($p_archive_filename) { $v_result=1; // ----- Look if the $p_archive_filename exists if (!is_file($p_archive_filename)) { // ----- Nothing to duplicate, so duplicate is a success. $v_result = 1; // ----- Return return $v_result; } // ----- Open the zip file if (($v_result=$this->privOpenFd('wb')) != 1) { // ----- Return return $v_result; } // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) { $this->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = filesize($p_archive_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close $this->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privErrorLog() // Description : // Parameters : // -------------------------------------------------------------------------------- function privErrorLog($p_error_code=0, $p_error_string='') { if (PCLZIP_ERROR_EXTERNAL == 1) { PclError($p_error_code, $p_error_string); } else { $this->error_code = $p_error_code; $this->error_string = $p_error_string; } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privErrorReset() // Description : // Parameters : // -------------------------------------------------------------------------------- function privErrorReset() { if (PCLZIP_ERROR_EXTERNAL == 1) { PclErrorReset(); } else { $this->error_code = 0; $this->error_string = ''; } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDisableMagicQuotes() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privDisableMagicQuotes() { $v_result=1; // ----- Look if function exists if ( (!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } // ----- Look if already done if ($this->magic_quotes_status != -1) { return $v_result; } // ----- Get and memorize the magic_quote value $this->magic_quotes_status = @get_magic_quotes_runtime(); // ----- Disable magic_quotes if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime(0); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privSwapBackMagicQuotes() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privSwapBackMagicQuotes() { $v_result=1; // ----- Look if function exists if ( (!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } // ----- Look if something to do if ($this->magic_quotes_status != -1) { return $v_result; } // ----- Swap back magic_quotes if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime($this->magic_quotes_status); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- } // End of class // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilPathReduction() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function PclZipUtilPathReduction($p_dir) { $v_result = ""; // ----- Look for not empty path if ($p_dir != "") { // ----- Explode path by directory names $v_list = explode("/", $p_dir); // ----- Study directories from last to first $v_skip = 0; for ($i=sizeof($v_list)-1; $i>=0; $i--) { // ----- Look for current path if ($v_list[$i] == ".") { // ----- Ignore this directory // Should be the first $i=0, but no check is done } else if ($v_list[$i] == "..") { $v_skip++; } else if ($v_list[$i] == "") { // ----- First '/' i.e. root slash if ($i == 0) { $v_result = "/".$v_result; if ($v_skip > 0) { // ----- It is an invalid path, so the path is not modified // TBC $v_result = $p_dir; $v_skip = 0; } } // ----- Last '/' i.e. indicates a directory else if ($i == (sizeof($v_list)-1)) { $v_result = $v_list[$i]; } // ----- Double '/' inside the path else { // ----- Ignore only the double '//' in path, // but not the first and last '/' } } else { // ----- Look for item to skip if ($v_skip > 0) { $v_skip--; } else { $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); } } } // ----- Look for skip if ($v_skip > 0) { while ($v_skip > 0) { $v_result = '../'.$v_result; $v_skip--; } } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilPathInclusion() // Description : // This function indicates if the path $p_path is under the $p_dir tree. Or, // said in an other way, if the file or sub-dir $p_path is inside the dir // $p_dir. // The function indicates also if the path is exactly the same as the dir. // This function supports path with duplicated '/' like '//', but does not // support '.' or '..' statements. // Parameters : // Return Values : // 0 if $p_path is not inside directory $p_dir // 1 if $p_path is inside directory $p_dir // 2 if $p_path is exactly the same as $p_dir // -------------------------------------------------------------------------------- function PclZipUtilPathInclusion($p_dir, $p_path) { $v_result = 1; // ----- Look for path beginning by ./ if ( ($p_dir == '.') || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); } if ( ($p_path == '.') || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); } // ----- Explode dir and path by directory separator $v_list_dir = explode("/", $p_dir); $v_list_dir_size = sizeof($v_list_dir); $v_list_path = explode("/", $p_path); $v_list_path_size = sizeof($v_list_path); // ----- Study directories paths $i = 0; $j = 0; while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { // ----- Look for empty dir (path reduction) if ($v_list_dir[$i] == '') { $i++; continue; } if ($v_list_path[$j] == '') { $j++; continue; } // ----- Compare the items if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { $v_result = 0; } // ----- Next items $i++; $j++; } // ----- Look if everything seems to be the same if ($v_result) { // ----- Skip all the empty items while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { // ----- There are exactly the same $v_result = 2; } else if ($i < $v_list_dir_size) { // ----- The path is shorter than the dir $v_result = 0; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilCopyBlock() // Description : // Parameters : // $p_mode : read/write compression mode // 0 : src & dest normal // 1 : src gzip, dest normal // 2 : src normal, dest gzip // 3 : src & dest gzip // Return Values : // -------------------------------------------------------------------------------- function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) { $v_result = 1; if ($p_mode==0) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==1) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==2) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==3) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilRename() // Description : // This function tries to do a simple rename() function. If it fails, it // tries to copy the $p_src file in a new $p_dest file and then unlink the // first one. // Parameters : // $p_src : Old filename // $p_dest : New filename // Return Values : // 1 on success, 0 on failure. // -------------------------------------------------------------------------------- function PclZipUtilRename($p_src, $p_dest) { $v_result = 1; // ----- Try to rename the files if (!@rename($p_src, $p_dest)) { // ----- Try to copy & unlink the src if (!@copy($p_src, $p_dest)) { $v_result = 0; } else if (!@unlink($p_src)) { $v_result = 0; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilOptionText() // Description : // Translate option value in text. Mainly for debug purpose. // Parameters : // $p_option : the option value. // Return Values : // The option text value. // -------------------------------------------------------------------------------- function PclZipUtilOptionText($p_option) { $v_list = get_defined_constants(); for (reset($v_list); $v_key = key($v_list); next($v_list)) { $v_prefix = substr($v_key, 0, 10); if (( ($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list[$v_key] == $p_option)) { return $v_key; } } $v_result = 'Unknown'; return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilTranslateWinPath() // Description : // Translate windows path by replacing '\' by '/' and optionally removing // drive letter. // Parameters : // $p_path : path to translate. // $p_remove_disk_letter : true | false // Return Values : // The path translated. // -------------------------------------------------------------------------------- function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) { if (stristr(php_uname(), 'windows')) { // ----- Look for potential disk letter if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { $p_path = substr($p_path, $v_position+1); } // ----- Change potential windows directory separator if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { $p_path = strtr($p_path, '\\', '/'); } } return $p_path; } // -------------------------------------------------------------------------------- rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/pclzip/gnu-lgpl.txt000066400000000000000000000644661361462701300261270ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/pclzip/pclzip.lib.php000066400000000000000000006010161361462701300264040ustar00rootroot00000000000000bUseGzopen64 = !function_exists('gzopen') && function_exists('gzopen64'); // ----- Set the attributes $this->zipname = $p_zipname; $this->zip_fd = 0; $this->magic_quotes_status = -1; // ----- Return return; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // create($p_filelist, $p_add_dir="", $p_remove_dir="") // create($p_filelist, $p_option, $p_option_value, ...) // Description : // This method supports two different synopsis. The first one is historical. // This method creates a Zip Archive. The Zip file is created in the // filesystem. The files and directories indicated in $p_filelist // are added in the archive. See the parameters description for the // supported format of $p_filelist. // When a directory is in the list, the directory and its content is added // in the archive. // In this synopsis, the function takes an optional variable list of // options. See bellow the supported options. // Parameters : // $p_filelist : An array containing file or directory names, or // a string containing one filename or one directory name, or // a string containing a list of filenames and/or directory // names separated by spaces. // $p_add_dir : A path to add before the real path of the archived file, // in order to have it memorized in the archive. // $p_remove_dir : A path to remove from the real path of the file to archive, // in order to have a shorter path memorized in the archive. // When $p_add_dir and $p_remove_dir are set, $p_remove_dir // is removed first, before $p_add_dir is added. // Options : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_COMMENT : // PCLZIP_CB_PRE_ADD : // PCLZIP_CB_POST_ADD : // Return Values : // 0 on failure, // The list of the added files, with a status of the add action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function create($p_filelist) { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Set default values $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove from the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' //, PCLZIP_OPT_CRYPT => 'optional' )); if ($v_result != 1) { return 0; } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } else if ($v_size > 2) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Init $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); // ----- Look if the $p_filelist is really an array if (is_array($p_filelist)) { // ----- Look if the first element is also an array // This will mean that this is a file description entry if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; } // ----- The list is a list of string names else { $v_string_list = $p_filelist; } } // ----- Look if the $p_filelist is a string else if (is_string($p_filelist)) { // ----- Create a list from the string $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); } // ----- Invalid variable type for $p_filelist else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); return 0; } // ----- Reformat the string list if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { if ($v_string != '') { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } else { } } } // ----- For each file in the list check the attributes $v_supported_attributes = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } // ----- Expand the filelist (expand directories) $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } // ----- Call the create fct $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } // ----- Return return $p_result_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // add($p_filelist, $p_add_dir="", $p_remove_dir="") // add($p_filelist, $p_option, $p_option_value, ...) // Description : // This method supports two synopsis. The first one is historical. // This methods add the list of files in an existing archive. // If a file with the same name already exists, it is added at the end of the // archive, the first one is still present. // If the archive does not exist, it is created. // Parameters : // $p_filelist : An array containing file or directory names, or // a string containing one filename or one directory name, or // a string containing a list of filenames and/or directory // names separated by spaces. // $p_add_dir : A path to add before the real path of the archived file, // in order to have it memorized in the archive. // $p_remove_dir : A path to remove from the real path of the file to archive, // in order to have a shorter path memorized in the archive. // When $p_add_dir and $p_remove_dir are set, $p_remove_dir // is removed first, before $p_add_dir is added. // Options : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_COMMENT : // PCLZIP_OPT_ADD_COMMENT : // PCLZIP_OPT_PREPEND_COMMENT : // PCLZIP_CB_PRE_ADD : // PCLZIP_CB_POST_ADD : // Return Values : // 0 on failure, // The list of the added files, with a status of the add action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function add($p_filelist) { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Set default values $v_options = array(); $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove form the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_ADD => 'optional', PCLZIP_CB_POST_ADD => 'optional', PCLZIP_OPT_NO_COMPRESSION => 'optional', PCLZIP_OPT_COMMENT => 'optional', PCLZIP_OPT_ADD_COMMENT => 'optional', PCLZIP_OPT_PREPEND_COMMENT => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' //, PCLZIP_OPT_CRYPT => 'optional' )); if ($v_result != 1) { return 0; } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; } else if ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Init $v_string_list = array(); $v_att_list = array(); $v_filedescr_list = array(); $p_result_list = array(); // ----- Look if the $p_filelist is really an array if (is_array($p_filelist)) { // ----- Look if the first element is also an array // This will mean that this is a file description entry if (isset($p_filelist[0]) && is_array($p_filelist[0])) { $v_att_list = $p_filelist; } // ----- The list is a list of string names else { $v_string_list = $p_filelist; } } // ----- Look if the $p_filelist is a string else if (is_string($p_filelist)) { // ----- Create a list from the string $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); } // ----- Invalid variable type for $p_filelist else { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); return 0; } // ----- Reformat the string list if (sizeof($v_string_list) != 0) { foreach ($v_string_list as $v_string) { $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; } } // ----- For each file in the list check the attributes $v_supported_attributes = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' ,PCLZIP_ATT_FILE_MTIME => 'optional' ,PCLZIP_ATT_FILE_CONTENT => 'optional' ,PCLZIP_ATT_FILE_COMMENT => 'optional' ); foreach ($v_att_list as $v_entry) { $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); if ($v_result != 1) { return 0; } } // ----- Expand the filelist (expand directories) $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); if ($v_result != 1) { return 0; } // ----- Call the create fct $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); if ($v_result != 1) { return 0; } // ----- Return return $p_result_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : listContent() // Description : // This public method, gives the list of the files and directories, with their // properties. // The properties of each entries in the list are (used also in other functions) : // filename : Name of the file. For a create or add action it is the filename // given by the user. For an extract function it is the filename // of the extracted file. // stored_filename : Name of the file / directory stored in the archive. // size : Size of the stored file. // compressed_size : Size of the file's data compressed in the archive // (without the headers overhead) // mtime : Last known modification date of the file (UNIX timestamp) // comment : Comment associated with the file // folder : true | false // index : index of the file in the archive // status : status of the action (depending of the action) : // Values are : // ok : OK ! // filtered : the file / dir is not extracted (filtered by user) // already_a_directory : the file can not be extracted because a // directory with the same name already exists // write_protected : the file can not be extracted because a file // with the same name already exists and is // write protected // newer_exist : the file was not extracted because a newer file exists // path_creation_fail : the file is not extracted because the folder // does not exist and can not be created // write_error : the file was not extracted because there was a // error while writing the file // read_error : the file was not extracted because there was a error // while reading the file // invalid_header : the file was not extracted because of an archive // format error (bad file header) // Note that each time a method can continue operating when there // is an action error on a file, the error is only logged in the file status. // Return Values : // 0 on an unrecoverable failure, // The list of the files in the archive. // -------------------------------------------------------------------------------- function listContent() { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Call the extracting fct $p_list = array(); if (($v_result = $this->privList($p_list)) != 1) { unset($p_list); return(0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // extract($p_path="./", $p_remove_path="") // extract([$p_option, $p_option_value, ...]) // Description : // This method supports two synopsis. The first one is historical. // This method extract all the files / directories from the archive to the // folder indicated in $p_path. // If you want to ignore the 'root' part of path of the memorized files // you can indicate this in the optional $p_remove_path parameter. // By default, if a newer file with the same name already exists, the // file is not extracted. // // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append // at the end of the path value of PCLZIP_OPT_PATH. // Parameters : // $p_path : Path where the files and directories are to be extracted // $p_remove_path : First part ('root' part) of the memorized path // (if any similar) to remove while extracting. // Options : // PCLZIP_OPT_PATH : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_CB_PRE_EXTRACT : // PCLZIP_CB_POST_EXTRACT : // Return Values : // 0 or a negative value on failure, // The list of the extracted files, with a status of the action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function extract() { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Set default values $v_options = array(); // $v_path = "./"; $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Default values for option $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; // ----- Look for arguments if ($v_size > 0) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } // ----- Set the arguments if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { // ----- Check for '/' in last path char if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } else if ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Trace // ----- Call the extracting fct $p_list = array(); $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options); if ($v_result < 1) { unset($p_list); return(0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // extractByIndex($p_index, $p_path="./", $p_remove_path="") // extractByIndex($p_index, [$p_option, $p_option_value, ...]) // Description : // This method supports two synopsis. The first one is historical. // This method is doing a partial extract of the archive. // The extracted files or folders are identified by their index in the // archive (from 0 to n). // Note that if the index identify a folder, only the folder entry is // extracted, not all the files included in the archive. // Parameters : // $p_index : A single index (integer) or a string of indexes of files to // extract. The form of the string is "0,4-6,8-12" with only numbers // and '-' for range or ',' to separate ranges. No spaces or ';' // are allowed. // $p_path : Path where the files and directories are to be extracted // $p_remove_path : First part ('root' part) of the memorized path // (if any similar) to remove while extracting. // Options : // PCLZIP_OPT_PATH : // PCLZIP_OPT_ADD_PATH : // PCLZIP_OPT_REMOVE_PATH : // PCLZIP_OPT_REMOVE_ALL_PATH : // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and // not as files. // The resulting content is in a new field 'content' in the file // structure. // This option must be used alone (any other options are ignored). // PCLZIP_CB_PRE_EXTRACT : // PCLZIP_CB_POST_EXTRACT : // Return Values : // 0 on failure, // The list of the extracted files, with a status of the action. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- //function extractByIndex($p_index, options...) function extractByIndex($p_index) { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Set default values $v_options = array(); // $v_path = "./"; $v_path = ''; $v_remove_path = ""; $v_remove_all_path = false; // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Default values for option $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; // ----- Look for arguments if ($v_size > 1) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Remove form the options list the first argument array_shift($v_arg_list); $v_size--; // ----- Look for first arg if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_PATH => 'optional', PCLZIP_OPT_REMOVE_PATH => 'optional', PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', PCLZIP_OPT_ADD_PATH => 'optional', PCLZIP_CB_PRE_EXTRACT => 'optional', PCLZIP_CB_POST_EXTRACT => 'optional', PCLZIP_OPT_SET_CHMOD => 'optional', PCLZIP_OPT_REPLACE_NEWER => 'optional' ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', PCLZIP_OPT_TEMP_FILE_ON => 'optional', PCLZIP_OPT_TEMP_FILE_OFF => 'optional' )); if ($v_result != 1) { return 0; } // ----- Set the arguments if (isset($v_options[PCLZIP_OPT_PATH])) { $v_path = $v_options[PCLZIP_OPT_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; } if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { // ----- Check for '/' in last path char if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { $v_path .= '/'; } $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; } if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; } else { } } // ----- Look for 2 args // Here we need to support the first historic synopsis of the // method. else { // ----- Get the first argument $v_path = $v_arg_list[0]; // ----- Look for the optional second argument if ($v_size == 2) { $v_remove_path = $v_arg_list[1]; } else if ($v_size > 2) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); // ----- Return return 0; } } } // ----- Trace // ----- Trick // Here I want to reuse extractByRule(), so I need to parse the $p_index // with privParseOptions() $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); $v_options_trick = array(); $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, array (PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; // ----- Look for default option values $this->privOptionDefaultThreshold($v_options); // ----- Call the extracting fct if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { return(0); } // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : // delete([$p_option, $p_option_value, ...]) // Description : // This method removes files from the archive. // If no parameters are given, then all the archive is emptied. // Parameters : // None or optional arguments. // Options : // PCLZIP_OPT_BY_INDEX : // PCLZIP_OPT_BY_NAME : // PCLZIP_OPT_BY_EREG : // PCLZIP_OPT_BY_PREG : // Return Values : // 0 on failure, // The list of the files which are still present in the archive. // (see PclZip::listContent() for list entry format) // -------------------------------------------------------------------------------- function delete() { $v_result=1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Set default values $v_options = array(); // ----- Look for variable options arguments $v_size = func_num_args(); // ----- Look for arguments if ($v_size > 0) { // ----- Get the arguments $v_arg_list = func_get_args(); // ----- Parse the options $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array (PCLZIP_OPT_BY_NAME => 'optional', PCLZIP_OPT_BY_EREG => 'optional', PCLZIP_OPT_BY_PREG => 'optional', PCLZIP_OPT_BY_INDEX => 'optional' )); if ($v_result != 1) { return 0; } } // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Call the delete fct $v_list = array(); if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { $this->privSwapBackMagicQuotes(); unset($v_list); return(0); } // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : deleteByIndex() // Description : // ***** Deprecated ***** // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. // -------------------------------------------------------------------------------- function deleteByIndex($p_index) { $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); // ----- Return return $p_list; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : properties() // Description : // This method gives the properties of the archive. // The properties are : // nb : Number of files in the archive // comment : Comment associated with the archive file // status : not_exist, ok // Parameters : // None // Return Values : // 0 on failure, // An array with the archive properties. // -------------------------------------------------------------------------------- function properties() { // ----- Reset the error handler $this->privErrorReset(); // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Check archive if (!$this->privCheckFormat()) { $this->privSwapBackMagicQuotes(); return(0); } // ----- Default properties $v_prop = array(); $v_prop['comment'] = ''; $v_prop['nb'] = 0; $v_prop['status'] = 'not_exist'; // ----- Look if file exists if (@is_file($this->zipname)) { // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); // ----- Return return 0; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return 0; } // ----- Close the zip file $this->privCloseFd(); // ----- Set the user attributes $v_prop['comment'] = $v_central_dir['comment']; $v_prop['nb'] = $v_central_dir['entries']; $v_prop['status'] = 'ok'; } // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_prop; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : duplicate() // Description : // This method creates an archive by copying the content of an other one. If // the archive already exist, it is replaced by the new one without any warning. // Parameters : // $p_archive : The filename of a valid archive, or // a valid PclZip object. // Return Values : // 1 on success. // 0 or a negative value on error (error code). // -------------------------------------------------------------------------------- function duplicate($p_archive) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Look if the $p_archive is a PclZip object if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) { // ----- Duplicate the archive $v_result = $this->privDuplicate($p_archive->zipname); } // ----- Look if the $p_archive is a string (so a filename) else if (is_string($p_archive)) { // ----- Check that $p_archive is a valid zip file // TBC : Should also check the archive format if (!is_file($p_archive)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); $v_result = PCLZIP_ERR_MISSING_FILE; } else { // ----- Duplicate the archive $v_result = $this->privDuplicate($p_archive); } } // ----- Invalid variable else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : merge() // Description : // This method merge the $p_archive_to_add archive at the end of the current // one ($this). // If the archive ($this) does not exist, the merge becomes a duplicate. // If the $p_archive_to_add archive does not exist, the merge is a success. // Parameters : // $p_archive_to_add : It can be directly the filename of a valid zip archive, // or a PclZip object archive. // Return Values : // 1 on success, // 0 or negative values on error (see below). // -------------------------------------------------------------------------------- function merge($p_archive_to_add) { $v_result = 1; // ----- Reset the error handler $this->privErrorReset(); // ----- Check archive if (!$this->privCheckFormat()) { return(0); } // ----- Look if the $p_archive_to_add is a PclZip object if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) { // ----- Merge the archive $v_result = $this->privMerge($p_archive_to_add); } // ----- Look if the $p_archive_to_add is a string (so a filename) else if (is_string($p_archive_to_add)) { // ----- Create a temporary archive $v_object_archive = new PclZip($p_archive_to_add); // ----- Merge the archive $v_result = $this->privMerge($v_object_archive); } // ----- Invalid variable else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); $v_result = PCLZIP_ERR_INVALID_PARAMETER; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorCode() // Description : // Parameters : // -------------------------------------------------------------------------------- function errorCode() { if (PCLZIP_ERROR_EXTERNAL == 1) { return(PclErrorCode()); } else { return($this->error_code); } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorName() // Description : // Parameters : // -------------------------------------------------------------------------------- function errorName($p_with_code=false) { $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' ); if (isset($v_name[$this->error_code])) { $v_value = $v_name[$this->error_code]; } else { $v_value = 'NoName'; } if ($p_with_code) { return($v_value.' ('.$this->error_code.')'); } else { return($v_value); } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : errorInfo() // Description : // Parameters : // -------------------------------------------------------------------------------- function errorInfo($p_full=false) { if (PCLZIP_ERROR_EXTERNAL == 1) { return(PclErrorString()); } else { if ($p_full) { return($this->errorName(true)." : ".$this->error_string); } else { return($this->error_string." [code ".$this->error_code."]"); } } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** // ***** ***** // ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCheckFormat() // Description : // This method check that the archive exists and is a valid zip archive. // Several level of check exists. (futur) // Parameters : // $p_level : Level of check. Default 0. // 0 : Check the first bytes (magic codes) (default value)) // 1 : 0 + Check the central directory (futur) // 2 : 1 + Check each file header (futur) // Return Values : // true on success, // false on error, the error code is set. // -------------------------------------------------------------------------------- function privCheckFormat($p_level=0) { $v_result = true; // ----- Reset the file system cache clearstatcache(); // ----- Reset the error handler $this->privErrorReset(); // ----- Look if the file exits if (!is_file($this->zipname)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); return(false); } // ----- Check that the file is readeable if (!is_readable($this->zipname)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); return(false); } // ----- Check the magic code // TBC // ----- Check the central header // TBC // ----- Check each file header // TBC // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privParseOptions() // Description : // This internal methods reads the variable list of arguments ($p_options_list, // $p_size) and generate an array with the options and values ($v_result_list). // $v_requested_options contains the options that can be present and those that // must be present. // $v_requested_options is an array, with the option value as key, and 'optional', // or 'mandatory' as value. // Parameters : // See above. // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) { $v_result=1; // ----- Read the options $i=0; while ($i<$p_size) { // ----- Check if the option is supported if (!isset($v_requested_options[$p_options_list[$i]])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); // ----- Return return PclZip::errorCode(); } // ----- Look for next option switch ($p_options_list[$i]) { // ----- Look for options that request a path value case PCLZIP_OPT_PATH : case PCLZIP_OPT_REMOVE_PATH : case PCLZIP_OPT_ADD_PATH : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); $i++; break; case PCLZIP_OPT_TEMP_FILE_THRESHOLD : // ----- Check the number of parameters if (($i+1) >= $p_size) { PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } // ----- Check the value $v_value = $p_options_list[$i+1]; if ((!is_integer($v_value)) || ($v_value<0)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); return PclZip::errorCode(); } // ----- Get the value (and convert it in bytes) $v_result_list[$p_options_list[$i]] = $v_value*1048576; $i++; break; case PCLZIP_OPT_TEMP_FILE_ON : // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_TEMP_FILE_OFF : // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); return PclZip::errorCode(); } // ----- Check for incompatible options if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); return PclZip::errorCode(); } $v_result_list[$p_options_list[$i]] = true; break; case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if ( is_string($p_options_list[$i+1]) && ($p_options_list[$i+1] != '')) { $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); $i++; } else { } break; // ----- Look for options that request an array of string for value case PCLZIP_OPT_BY_NAME : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; } else if (is_array($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that request an EREG or PREG expression case PCLZIP_OPT_BY_EREG : // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG // to PCLZIP_OPT_BY_PREG $p_options_list[$i] = PCLZIP_OPT_BY_PREG; case PCLZIP_OPT_BY_PREG : //case PCLZIP_OPT_CRYPT : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that takes a string case PCLZIP_OPT_COMMENT : case PCLZIP_OPT_ADD_COMMENT : case PCLZIP_OPT_PREPEND_COMMENT : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '" .PclZipUtilOptionText($p_options_list[$i]) ."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value if (is_string($p_options_list[$i+1])) { $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" .PclZipUtilOptionText($p_options_list[$i]) ."'"); // ----- Return return PclZip::errorCode(); } $i++; break; // ----- Look for options that request an array of index case PCLZIP_OPT_BY_INDEX : // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_work_list = array(); if (is_string($p_options_list[$i+1])) { // ----- Remove spaces $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); // ----- Parse items $v_work_list = explode(",", $p_options_list[$i+1]); } else if (is_integer($p_options_list[$i+1])) { $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; } else if (is_array($p_options_list[$i+1])) { $v_work_list = $p_options_list[$i+1]; } else { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Reduce the index list // each index item in the list must be a couple with a start and // an end value : [0,3], [5-5], [8-10], ... // ----- Check the format of each item $v_sort_flag=false; $v_sort_value=0; for ($j=0; $j= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; $i++; break; // ----- Look for options that request a call-back case PCLZIP_CB_PRE_EXTRACT : case PCLZIP_CB_POST_EXTRACT : case PCLZIP_CB_PRE_ADD : case PCLZIP_CB_POST_ADD : /* for futur use case PCLZIP_CB_PRE_DELETE : case PCLZIP_CB_POST_DELETE : case PCLZIP_CB_PRE_LIST : case PCLZIP_CB_POST_LIST : */ // ----- Check the number of parameters if (($i+1) >= $p_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Get the value $v_function_name = $p_options_list[$i+1]; // ----- Check that the value is a valid existing function if (!function_exists($v_function_name)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); // ----- Return return PclZip::errorCode(); } // ----- Set the attribute $v_result_list[$p_options_list[$i]] = $v_function_name; $i++; break; default : // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" .$p_options_list[$i]."'"); // ----- Return return PclZip::errorCode(); } // ----- Next options $i++; } // ----- Look for mandatory options if ($v_requested_options !== false) { for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { // ----- Look for mandatory option if ($v_requested_options[$key] == 'mandatory') { // ----- Look if present if (!isset($v_result_list[$key])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); // ----- Return return PclZip::errorCode(); } } } } // ----- Look for default values if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privOptionDefaultThreshold() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privOptionDefaultThreshold(&$p_options) { $v_result=1; if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { return $v_result; } // ----- Get 'memory_limit' configuration value $v_memory_limit = ini_get('memory_limit'); $v_memory_limit = trim($v_memory_limit); $last = strtolower(substr($v_memory_limit, -1)); if($last == 'g') //$v_memory_limit = $v_memory_limit*1024*1024*1024; $v_memory_limit = $v_memory_limit*1073741824; if($last == 'm') //$v_memory_limit = $v_memory_limit*1024*1024; $v_memory_limit = $v_memory_limit*1048576; if($last == 'k') $v_memory_limit = $v_memory_limit*1024; $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); // ----- Sanity check : No threshold if value lower than 1M if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privFileDescrParseAtt() // Description : // Parameters : // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) { $v_result=1; // ----- For each file in the list check the attributes foreach ($p_file_list as $v_key => $v_value) { // ----- Check if the option is supported if (!isset($v_requested_options[$v_key])) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); // ----- Return return PclZip::errorCode(); } // ----- Look for attribute switch ($v_key) { case PCLZIP_ATT_FILE_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['filename'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_SHORT_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_short_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; case PCLZIP_ATT_FILE_NEW_FULL_NAME : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); if ($p_filedescr['new_full_name'] == '') { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } break; // ----- Look for options that takes a string case PCLZIP_ATT_FILE_COMMENT : if (!is_string($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['comment'] = $v_value; break; case PCLZIP_ATT_FILE_MTIME : if (!is_integer($v_value)) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); return PclZip::errorCode(); } $p_filedescr['mtime'] = $v_value; break; case PCLZIP_ATT_FILE_CONTENT : $p_filedescr['content'] = $v_value; break; default : // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '".$v_key."'"); // ----- Return return PclZip::errorCode(); } // ----- Look for mandatory options if ($v_requested_options !== false) { for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { // ----- Look for mandatory option if ($v_requested_options[$key] == 'mandatory') { // ----- Look if present if (!isset($p_file_list[$key])) { PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); return PclZip::errorCode(); } } } } // end foreach } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privFileDescrExpand() // Description : // This method look for each item of the list to see if its a file, a folder // or a string to be added as file. For any other type of files (link, other) // just ignore the item. // Then prepare the information that will be stored for that file. // When its a folder, expand the folder with all the files that are in that // folder (recursively). // Parameters : // Return Values : // 1 on success. // 0 on failure. // -------------------------------------------------------------------------------- function privFileDescrExpand(&$p_filedescr_list, &$p_options) { $v_result=1; // ----- Create a result list $v_result_list = array(); // ----- Look each entry for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); // ----- Add the descriptor in result list $v_result_list[sizeof($v_result_list)] = $v_descr; // ----- Look for folder if ($v_descr['type'] == 'folder') { // ----- List of items in folder $v_dirlist_descr = array(); $v_dirlist_nb = 0; if ($v_folder_handler = @opendir($v_descr['filename'])) { while (($v_item_handler = @readdir($v_folder_handler)) !== false) { // ----- Skip '.' and '..' if (($v_item_handler == '.') || ($v_item_handler == '..')) { continue; } // ----- Compose the full filename $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; // ----- Look for different stored filename // Because the name of the folder was changed, the name of the // files/sub-folders also change if (($v_descr['stored_filename'] != $v_descr['filename']) && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { if ($v_descr['stored_filename'] != '') { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; } else { $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; } } $v_dirlist_nb++; } @closedir($v_folder_handler); } else { // TBC : unable to open folder in read mode } // ----- Expand each element of the list if ($v_dirlist_nb != 0) { // ----- Expand if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { return $v_result; } // ----- Concat the resulting list $v_result_list = array_merge($v_result_list, $v_dirlist_descr); } else { } // ----- Free local array unset($v_dirlist_descr); } } // ----- Get the result list $p_filedescr_list = $v_result_list; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCreate() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privCreate($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the file in write mode if (($v_result = $this->privOpenFd('wb')) != 1) { // ----- Return return $v_result; } // ----- Add the list of files $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); // ----- Close $this->privCloseFd(); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAdd() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privAdd($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); // ----- Look if the archive exists or is empty if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) { // ----- Do a create $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); // ----- Return return $v_result; } // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the zip file if (($v_result=$this->privOpenFd('rb')) != 1) { // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Swap the file descriptor // Here is a trick : I swap the temporary fd with the zip fd, in order to use // the following methods on the temporary fil and not the real archive $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Add the files $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Store the offset of the central dir $v_offset = @ftell($this->zip_fd); // ----- Copy the block of file headers from the old archive $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Create the Central Dir files header for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { fclose($v_zip_temp_fd); $this->privCloseFd(); @unlink($v_zip_temp_name); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } $v_count++; } // ----- Transform the header to a 'usable' info $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = $v_central_dir['comment']; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; } if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; } // ----- Calculate the size of the central header $v_size = @ftell($this->zip_fd)-$v_offset; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // ----- Swap back the file descriptor $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Close $this->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privOpenFd() // Description : // Parameters : // -------------------------------------------------------------------------------- function privOpenFd($p_mode) { $v_result=1; // ----- Look if already open if ($this->zip_fd != 0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); // ----- Return return PclZip::errorCode(); } // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); // ----- Return return PclZip::errorCode(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCloseFd() // Description : // Parameters : // -------------------------------------------------------------------------------- function privCloseFd() { $v_result=1; if ($this->zip_fd != 0) @fclose($this->zip_fd); $this->zip_fd = 0; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddList() // Description : // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is // different from the real path of the file. This is usefull if you want to have PclTar // running in any directory, and memorize relative path from an other directory. // Parameters : // $p_list : An array containing the file or directory names to add in the tar // $p_result_list : list of added files with their properties (specially the status field) // $p_add_dir : Path to add in the filename path archived // $p_remove_dir : Path to remove in the filename path archived // Return Values : // -------------------------------------------------------------------------------- // function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) function privAddList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; // ----- Add the files $v_header_list = array(); if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { // ----- Return return $v_result; } // ----- Store the offset of the central dir $v_offset = @ftell($this->zip_fd); // ----- Create the Central Dir files header for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { // ----- Return return $v_result; } $v_count++; } // ----- Transform the header to a 'usable' info $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } // ----- Calculate the size of the central header $v_size = @ftell($this->zip_fd)-$v_offset; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); // ----- Return return $v_result; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFileList() // Description : // Parameters : // $p_filedescr_list : An array containing the file description // or directory names to add in the zip // $p_result_list : list of added files with their properties (specially the status field) // Return Values : // -------------------------------------------------------------------------------- function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) { $v_result=1; $v_header = array(); // ----- Recuperate the current number of elt in list $v_nb = sizeof($p_result_list); // ----- Loop on the files for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, $p_options); if ($v_result != 1) { return $v_result; } // ----- Store the file infos $p_result_list[$v_nb++] = $v_header; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privAddFile($p_filedescr, &$p_header, &$p_options) { $v_result=1; // ----- Working variable $p_filename = $p_filedescr['filename']; // TBC : Already done in the fileAtt check ... ? if ($p_filename == "") { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); // ----- Return return PclZip::errorCode(); } // ----- Look for a stored different filename /* TBC : Removed if (isset($p_filedescr['stored_filename'])) { $v_stored_filename = $p_filedescr['stored_filename']; } else { $v_stored_filename = $p_filedescr['stored_filename']; } */ // ----- Set the file properties clearstatcache(); $p_header['version'] = 20; $p_header['version_extracted'] = 10; $p_header['flag'] = 0; $p_header['compression'] = 0; $p_header['crc'] = 0; $p_header['compressed_size'] = 0; $p_header['filename_len'] = strlen($p_filename); $p_header['extra_len'] = 0; $p_header['disk'] = 0; $p_header['internal'] = 0; $p_header['offset'] = 0; $p_header['filename'] = $p_filename; // TBC : Removed $p_header['stored_filename'] = $v_stored_filename; $p_header['stored_filename'] = $p_filedescr['stored_filename']; $p_header['extra'] = ''; $p_header['status'] = 'ok'; $p_header['index'] = -1; // ----- Look for regular file if ($p_filedescr['type']=='file') { $p_header['external'] = 0x00000000; $p_header['size'] = filesize($p_filename); } // ----- Look for regular folder else if ($p_filedescr['type']=='folder') { $p_header['external'] = 0x00000010; $p_header['mtime'] = filemtime($p_filename); $p_header['size'] = filesize($p_filename); } // ----- Look for virtual file else if ($p_filedescr['type'] == 'virtual_file') { $p_header['external'] = 0x00000000; $p_header['size'] = strlen($p_filedescr['content']); } // ----- Look for filetime if (isset($p_filedescr['mtime'])) { $p_header['mtime'] = $p_filedescr['mtime']; } else if ($p_filedescr['type'] == 'virtual_file') { $p_header['mtime'] = time(); } else { $p_header['mtime'] = filemtime($p_filename); } // ------ Look for file comment if (isset($p_filedescr['comment'])) { $p_header['comment_len'] = strlen($p_filedescr['comment']); $p_header['comment'] = $p_filedescr['comment']; } else { $p_header['comment_len'] = 0; $p_header['comment'] = ''; } // ----- Look for pre-add callback if (isset($p_options[PCLZIP_CB_PRE_ADD])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_header['status'] = "skipped"; $v_result = 1; } // ----- Update the informations // Only some fields can be modified if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); } } // ----- Look for empty stored filename if ($p_header['stored_filename'] == "") { $p_header['status'] = "filtered"; } // ----- Check the path length if (strlen($p_header['stored_filename']) > 0xFF) { $p_header['status'] = 'filename_too_long'; } // ----- Look if no error, or file not skipped if ($p_header['status'] == 'ok') { // ----- Look for a file if ($p_filedescr['type'] == 'file') { // ----- Look for using temporary file to zip if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } } // ----- Use "in memory" zip algo else { // ----- Open the source file if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } // ----- Read the file content $v_content = @fread($v_file, $p_header['size']); // ----- Close the file @fclose($v_file); // ----- Calculate the CRC $p_header['crc'] = @crc32($v_content); // ----- Look for no compression if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { // ----- Set header parameters $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; } // ----- Look for normal compression else { // ----- Compress the content $v_content = @gzdeflate($v_content); // ----- Set header parameters $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } // ----- Write the compressed (or not) content @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); } } // ----- Look for a virtual file (a file from string) else if ($p_filedescr['type'] == 'virtual_file') { $v_content = $p_filedescr['content']; // ----- Calculate the CRC $p_header['crc'] = @crc32($v_content); // ----- Look for no compression if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { // ----- Set header parameters $p_header['compressed_size'] = $p_header['size']; $p_header['compression'] = 0; } // ----- Look for normal compression else { // ----- Compress the content $v_content = @gzdeflate($v_content); // ----- Set header parameters $p_header['compressed_size'] = strlen($v_content); $p_header['compression'] = 8; } // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { @fclose($v_file); return $v_result; } // ----- Write the compressed (or not) content @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); } // ----- Look for a directory else if ($p_filedescr['type'] == 'folder') { // ----- Look for directory last '/' if (@substr($p_header['stored_filename'], -1) != '/') { $p_header['stored_filename'] .= '/'; } // ----- Set the file properties $p_header['size'] = 0; //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked $p_header['external'] = 0x00000010; // Value for a folder : to be checked // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } } } // ----- Look for post-add callback if (isset($p_options[PCLZIP_CB_POST_ADD])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_header, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); if ($v_result == 0) { // ----- Ignored $v_result = 1; } // ----- Update the informations // Nothing can be modified } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privAddFileUsingTempFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) { $v_result=PCLZIP_ERR_NO_ERROR; // ----- Working variable $p_filename = $p_filedescr['filename']; // ----- Open the source file if (($v_file = @fopen($p_filename, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); return PclZip::errorCode(); } // ----- Creates a compressed temporary file $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; if ($this->bUseGzopen64) { if (($v_file_compressed = @gzopen64($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } } else { if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = filesize($p_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @gzputs($v_file_compressed, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close the file @fclose($v_file); @gzclose($v_file_compressed); // ----- Check the minimum file size if (filesize($v_gzip_temp_name) < 18) { PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); return PclZip::errorCode(); } // ----- Extract the compressed attributes if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the gzip file header $v_binary_data = @fread($v_file_compressed, 10); $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); // ----- Check some parameters $v_data_header['os'] = bin2hex($v_data_header['os']); // ----- Read the gzip file footer @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); $v_binary_data = @fread($v_file_compressed, 8); $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); // ----- Set the attributes $p_header['compression'] = ord($v_data_header['cm']); //$p_header['mtime'] = $v_data_header['mtime']; $p_header['crc'] = $v_data_footer['crc']; $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; // ----- Close the file @fclose($v_file_compressed); // ----- Call the header generation if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { return $v_result; } // ----- Add the compressed data if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks fseek($v_file_compressed, 10); $v_size = $p_header['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($v_file_compressed, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close the file @fclose($v_file_compressed); // ----- Unlink the temporary file @unlink($v_gzip_temp_name); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCalculateStoredFilename() // Description : // Based on file descriptor properties and global options, this method // calculate the filename that will be stored in the archive. // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privCalculateStoredFilename(&$p_filedescr, &$p_options) { $v_result=1; // ----- Working variables $p_filename = $p_filedescr['filename']; if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; } else { $p_add_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; } else { $p_remove_dir = ''; } if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; } else { $p_remove_all_dir = 0; } // ----- Look for full name change if (isset($p_filedescr['new_full_name'])) { // ----- Remove drive letter if any $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); } // ----- Look for path and/or short name change else { // ----- Look for short name change // Its when we cahnge just the filename but not the path if (isset($p_filedescr['new_short_name'])) { $v_path_info = pathinfo($p_filename); $v_dir = ''; if ($v_path_info['dirname'] != '') { $v_dir = $v_path_info['dirname'].'/'; } $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; } else { // ----- Calculate the stored filename $v_stored_filename = $p_filename; } // ----- Look for all path to remove if ($p_remove_all_dir) { $v_stored_filename = basename($p_filename); } // ----- Look for partial path remove else if ($p_remove_dir != "") { if (substr($p_remove_dir, -1) != '/') $p_remove_dir .= "/"; if ( (substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) { if ( (substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) { $p_remove_dir = "./".$p_remove_dir; } if ( (substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) { $p_remove_dir = substr($p_remove_dir, 2); } } $v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename); if ($v_compare > 0) { if ($v_compare == 2) { $v_stored_filename = ""; } else { $v_stored_filename = substr($v_stored_filename, strlen($p_remove_dir)); } } } // ----- Remove drive letter if any $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); // ----- Look for path to add if ($p_add_dir != "") { if (substr($p_add_dir, -1) == "/") $v_stored_filename = $p_add_dir.$v_stored_filename; else $v_stored_filename = $p_add_dir."/".$v_stored_filename; } } // ----- Filename (reduce the path of stored name) $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); $p_filedescr['stored_filename'] = $v_stored_filename; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privWriteFileHeader(&$p_header) { $v_result=1; // ----- Store the offset position of the file $p_header['offset'] = ftell($this->zip_fd); // ----- Transform UNIX mtime to DOS format mdate/mtime $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; // ----- Packed data $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len']); // ----- Write the first 148 bytes of the header in the archive fputs($this->zip_fd, $v_binary_data, 30); // ----- Write the variable fields if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteCentralFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privWriteCentralFileHeader(&$p_header) { $v_result=1; // TBC //for(reset($p_header); $key = key($p_header); next($p_header)) { //} // ----- Transform UNIX mtime to DOS format mdate/mtime $v_date = getdate($p_header['mtime']); $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; // ----- Packed data $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, $p_header['version'], $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len'], $p_header['comment_len'], $p_header['disk'], $p_header['internal'], $p_header['external'], $p_header['offset']); // ----- Write the 42 bytes of the header in the zip file fputs($this->zip_fd, $v_binary_data, 46); // ----- Write the variable fields if (strlen($p_header['stored_filename']) != 0) { fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); } if ($p_header['extra_len'] != 0) { fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); } if ($p_header['comment_len'] != 0) { fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privWriteCentralHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) { $v_result=1; // ----- Packed data $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment)); // ----- Write the 22 bytes of the header in the zip file fputs($this->zip_fd, $v_binary_data, 22); // ----- Write the variable fields if (strlen($p_comment) != 0) { fputs($this->zip_fd, $p_comment, strlen($p_comment)); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privList() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privList(&$p_list) { $v_result=1; // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Open the zip file if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); // ----- Return return PclZip::errorCode(); } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Go to beginning of Central Dir @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_central_dir['offset'])) { $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read each entry for ($i=0; $i<$v_central_dir['entries']; $i++) { // ----- Read the file header if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } $v_header['index'] = $i; // ----- Get the only interesting attributes $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); unset($v_header); } // ----- Close the zip file $this->privCloseFd(); // ----- Magic quotes trick $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privConvertHeader2FileInfo() // Description : // This function takes the file informations from the central directory // entries and extract the interesting parameters that will be given back. // The resulting file infos are set in the array $p_info // $p_info['filename'] : Filename with full path. Given by user (add), // extracted in the filesystem (extract). // $p_info['stored_filename'] : Stored filename in the archive. // $p_info['size'] = Size of the file. // $p_info['compressed_size'] = Compressed size of the file. // $p_info['mtime'] = Last modification date of the file. // $p_info['comment'] = Comment associated with the file. // $p_info['folder'] = true/false : indicates if the entry is a folder or not. // $p_info['status'] = status of the action on the file. // $p_info['crc'] = CRC of the file content. // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privConvertHeader2FileInfo($p_header, &$p_info) { $v_result=1; // ----- Get the interesting attributes $v_temp_path = PclZipUtilPathReduction($p_header['filename']); $p_info['filename'] = $v_temp_path; $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); $p_info['stored_filename'] = $v_temp_path; $p_info['size'] = $p_header['size']; $p_info['compressed_size'] = $p_header['compressed_size']; $p_info['mtime'] = $p_header['mtime']; $p_info['comment'] = $p_header['comment']; $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); $p_info['index'] = $p_header['index']; $p_info['status'] = $p_header['status']; $p_info['crc'] = $p_header['crc']; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractByRule() // Description : // Extract a file or directory depending of rules (by index, by name, ...) // Parameters : // $p_file_list : An array where will be placed the properties of each // extracted file // $p_path : Path to add while writing the extracted files // $p_remove_path : Path to remove (from the file memorized path) while writing the // extracted files. If the path does not match the file path, // the file is extracted with its memorized path. // $p_remove_path does not apply to 'list' mode. // $p_path and $p_remove_path are commulative. // Return Values : // 1 on success,0 or less on error (see error code list) // -------------------------------------------------------------------------------- function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result=1; // ----- Magic quotes trick $this->privDisableMagicQuotes(); // ----- Check the path if ( ($p_path == "") || ( (substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path,1,2)!=":/"))) $p_path = "./".$p_path; // ----- Reduce the path last (and duplicated) '/' if (($p_path != "./") && ($p_path != "/")) { // ----- Look for the path end '/' while (substr($p_path, -1) == "/") { $p_path = substr($p_path, 0, strlen($p_path)-1); } } // ----- Look for path to remove format (should end by /) if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { $p_remove_path .= '/'; } $p_remove_path_size = strlen($p_remove_path); // ----- Open the zip file if (($v_result = $this->privOpenFd('rb')) != 1) { $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Start at beginning of Central Dir $v_pos_entry = $v_central_dir['offset']; // ----- Read each entry $j_start = 0; for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { // ----- Read next Central dir entry @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read the file header $v_header = array(); if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Store the index $v_header['index'] = $i; // ----- Store the file position $v_pos_entry = ftell($this->zip_fd); // ----- Look for the specific extract rules $v_extract = false; // ----- Look for extract by name rule if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { // ----- Look if the filename is in the list for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_extract = true; } } // ----- Look for a filename elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_extract = true; } } } // ----- Look for extract by ereg rule // ereg() is deprecated with PHP 5.3 /* else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { $v_extract = true; } } */ // ----- Look for extract by preg rule else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { $v_extract = true; } } // ----- Look for extract by index rule else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { // ----- Look if the index is in the list for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_extract = true; } if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j+1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { break; } } } // ----- Look for no rule, which means extract all the archive else { $v_extract = true; } // ----- Check compression method if ( ($v_extract) && ( ($v_header['compression'] != 8) && ($v_header['compression'] != 0))) { $v_header['status'] = 'unsupported_compression'; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, "Filename '".$v_header['stored_filename']."' is " ."compressed by an unsupported compression " ."method (".$v_header['compression'].") "); return PclZip::errorCode(); } } // ----- Check encrypted files if (($v_extract) && (($v_header['flag'] & 1) == 1)) { $v_header['status'] = 'unsupported_encryption'; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { $this->privSwapBackMagicQuotes(); PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, "Unsupported encryption for " ." filename '".$v_header['stored_filename'] ."'"); return PclZip::errorCode(); } } // ----- Look for real extraction if (($v_extract) && ($v_header['status'] != 'ok')) { $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]); if ($v_result != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } $v_extract = false; } // ----- Look for real extraction if ($v_extract) { // ----- Go to the file position @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_header['offset'])) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Look for extraction as string if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { $v_string = ''; // ----- Extracting the file $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Set the file content $p_file_list[$v_nb_extracted]['content'] = $v_string; // ----- Next extracted file $v_nb_extracted++; // ----- Look for user callback abort if ($v_result1 == 2) { break; } } // ----- Look for extraction in standard output elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { // ----- Extracting the file in standard output $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Look for user callback abort if ($v_result1 == 2) { break; } } // ----- Look for normal extraction else { // ----- Extracting the file $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options); if ($v_result1 < 1) { $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result1; } // ----- Get the only interesting attributes if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); return $v_result; } // ----- Look for user callback abort if ($v_result1 == 2) { break; } } } } // ----- Close the zip file $this->privCloseFd(); $this->privSwapBackMagicQuotes(); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFile() // Description : // Parameters : // Return Values : // // 1 : ... ? // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback // -------------------------------------------------------------------------------- function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { $v_result=1; // ----- Read the file header if (($v_result = $this->privReadFileHeader($v_header)) != 1) { // ----- Return return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for all path to remove if ($p_remove_all_path == true) { // ----- Look for folder entry that not need to be extracted if (($p_entry['external']&0x00000010)==0x00000010) { $p_entry['status'] = "filtered"; return $v_result; } // ----- Get the basename of the path $p_entry['filename'] = basename($p_entry['filename']); } // ----- Look for path to remove else if ($p_remove_path != "") { if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) { // ----- Change the file status $p_entry['status'] = "filtered"; // ----- Return return $v_result; } $p_remove_path_size = strlen($p_remove_path); if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) { // ----- Remove the path $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); } } // ----- Add the path if ($p_path != '') { $p_entry['filename'] = $p_path."/".$p_entry['filename']; } // ----- Check a base_dir_restriction if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { $v_inclusion = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']); if ($v_inclusion == 0) { PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, "Filename '".$p_entry['filename']."' is " ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); return PclZip::errorCode(); } } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Look for specific actions while the file exist if (file_exists($p_entry['filename'])) { // ----- Look if file is a directory if (is_dir($p_entry['filename'])) { // ----- Change the file status $p_entry['status'] = "already_a_directory"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, "Filename '".$p_entry['filename']."' is " ."already used by an existing directory"); return PclZip::errorCode(); } } // ----- Look if file is write protected else if (!is_writeable($p_entry['filename'])) { // ----- Change the file status $p_entry['status'] = "write_protected"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Filename '".$p_entry['filename']."' exists " ."and is write protected"); return PclZip::errorCode(); } } // ----- Look if the extracted file is older else if (filemtime($p_entry['filename']) > $p_entry['mtime']) { // ----- Change the file status if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { } else { $p_entry['status'] = "newer_exist"; // ----- Look for PCLZIP_OPT_STOP_ON_ERROR // For historical reason first PclZip implementation does not stop // when this kind of error occurs. if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Newer version of '".$p_entry['filename']."' exists " ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); return PclZip::errorCode(); } } } else { } } // ----- Check the directory availability and create it if necessary else { if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) $v_dir_to_check = $p_entry['filename']; else if (!strstr($p_entry['filename'], "/")) $v_dir_to_check = ""; else $v_dir_to_check = dirname($p_entry['filename']); if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { // ----- Change the file status $p_entry['status'] = "path_creation_fail"; // ----- Return //return $v_result; $v_result = 1; } } } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external']&0x00000010)==0x00000010)) { // ----- Look for not compressed file if ($p_entry['compression'] == 0) { // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { // ----- Change the file status $p_entry['status'] = "write_error"; // ----- Return return $v_result; } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); /* Try to speed up the code $v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_binary_data, $v_read_size); */ @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Closing the destination file fclose($v_dest_file); // ----- Change the file mtime touch($p_entry['filename'], $p_entry['mtime']); } else { // ----- TBC // Need to be finished if (($p_entry['flag'] & 1) == 1) { PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); return PclZip::errorCode(); } // ----- Look for using temporary file to unzip if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); if ($v_result < PCLZIP_ERR_NO_ERROR) { return $v_result; } } // ----- Look for extract in memory else { // ----- Read the compressed file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file $v_file_content = @gzinflate($v_buffer); unset($v_buffer); if ($v_file_content === FALSE) { // ----- Change the file status // TBC $p_entry['status'] = "error"; return $v_result; } // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { // ----- Change the file status $p_entry['status'] = "write_error"; return $v_result; } // ----- Write the uncompressed data @fwrite($v_dest_file, $v_file_content, $p_entry['size']); unset($v_file_content); // ----- Closing the destination file @fclose($v_dest_file); } // ----- Change the file mtime @touch($p_entry['filename'], $p_entry['mtime']); } // ----- Look for chmod option if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { // ----- Change the mode of the file @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); } } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } // ----- Look for post-extract callback elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileUsingTempFile() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privExtractFileUsingTempFile(&$p_entry, &$p_options) { $v_result=1; // ----- Creates a temporary file $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { fclose($v_file); PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); return PclZip::errorCode(); } // ----- Write gz file format header $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); @fwrite($v_dest_file, $v_binary_data, 10); // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['compressed_size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Write gz file format footer $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); @fwrite($v_dest_file, $v_binary_data, 8); // ----- Close the temporary file @fclose($v_dest_file); // ----- Opening destination file if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { $p_entry['status'] = "write_error"; return $v_result; } // ----- Open the temporary gz file if ($this->bUseGzopen64) { if (($v_src_file = @gzopen64($v_gzip_temp_name, 'rb')) == 0) { @fclose($v_dest_file); $p_entry['status'] = "read_error"; PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } } else { if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { @fclose($v_dest_file); $p_entry['status'] = "read_error"; PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); return PclZip::errorCode(); } } // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks $v_size = $p_entry['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($v_src_file, $v_read_size); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); @fwrite($v_dest_file, $v_buffer, $v_read_size); $v_size -= $v_read_size; } @fclose($v_dest_file); @gzclose($v_src_file); // ----- Delete the temporary file @unlink($v_gzip_temp_name); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileInOutput() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privExtractFileInOutput(&$p_entry, &$p_options) { $v_result=1; // ----- Read the file header if (($v_result = $this->privReadFileHeader($v_header)) != 1) { return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Trace // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external']&0x00000010)==0x00000010)) { // ----- Look for not compressed file if ($p_entry['compressed_size'] == $p_entry['size']) { // ----- Read the file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Send the file to the output echo $v_buffer; unset($v_buffer); } else { // ----- Read the compressed file in a buffer (one shot) $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file $v_file_content = gzinflate($v_buffer); unset($v_buffer); // ----- Send the file to the output echo $v_file_content; unset($v_file_content); } } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } // ----- Look for post-extract callback elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privExtractFileAsString() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) { $v_result=1; // ----- Read the file header $v_header = array(); if (($v_result = $this->privReadFileHeader($v_header)) != 1) { // ----- Return return $v_result; } // ----- Check that the file header is coherent with $p_entry info if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { // TBC } // ----- Look for pre-extract callback if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); if ($v_result == 0) { // ----- Change the file status $p_entry['status'] = "skipped"; $v_result = 1; } // ----- Look for abort result if ($v_result == 2) { // ----- This status is internal and will be changed in 'skipped' $p_entry['status'] = "aborted"; $v_result = PCLZIP_ERR_USER_ABORTED; } // ----- Update the informations // Only some fields can be modified $p_entry['filename'] = $v_local_header['filename']; } // ----- Look if extraction should be done if ($p_entry['status'] == 'ok') { // ----- Do the extraction (if not a folder) if (!(($p_entry['external']&0x00000010)==0x00000010)) { // ----- Look for not compressed file // if ($p_entry['compressed_size'] == $p_entry['size']) if ($p_entry['compression'] == 0) { // ----- Reading the file $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); } else { // ----- Reading the file $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); // ----- Decompress the file if (($p_string = @gzinflate($v_data)) === FALSE) { // TBC } } // ----- Trace } else { // TBC : error : can not extract a folder in a string } } // ----- Change abort status if ($p_entry['status'] == "aborted") { $p_entry['status'] = "skipped"; } // ----- Look for post-extract callback elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { // ----- Generate a local information $v_local_header = array(); $this->privConvertHeader2FileInfo($p_entry, $v_local_header); // ----- Swap the content to header $v_local_header['content'] = $p_string; $p_string = ''; // ----- Call the callback // Here I do not use call_user_func() because I need to send a reference to the // header. // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); // ----- Swap back the content to header $p_string = $v_local_header['content']; unset($v_local_header['content']); // ----- Look for abort result if ($v_result == 2) { $v_result = PCLZIP_ERR_USER_ABORTED; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privReadFileHeader(&$p_header) { $v_result=1; // ----- Read the 4 bytes signature $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] != 0x04034b50) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); // ----- Return return PclZip::errorCode(); } // ----- Read the first 42 bytes of the header $v_binary_data = fread($this->zip_fd, 26); // ----- Look for invalid block size if (strlen($v_binary_data) != 26) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); // ----- Get filename $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); // ----- Get extra_fields if ($v_data['extra_len'] != 0) { $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); } else { $p_header['extra'] = ''; } // ----- Extract properties $p_header['version_extracted'] = $v_data['version']; $p_header['compression'] = $v_data['compression']; $p_header['size'] = $v_data['size']; $p_header['compressed_size'] = $v_data['compressed_size']; $p_header['crc'] = $v_data['crc']; $p_header['flag'] = $v_data['flag']; $p_header['filename_len'] = $v_data['filename_len']; // ----- Recuperate date in UNIX format $p_header['mdate'] = $v_data['mdate']; $p_header['mtime'] = $v_data['mtime']; if ($p_header['mdate'] && $p_header['mtime']) { // ----- Extract time $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F)*2; // ----- Extract date $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; // ----- Get UNIX date format $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } // TBC //for(reset($v_data); $key = key($v_data); next($v_data)) { //} // ----- Set the stored filename $p_header['stored_filename'] = $p_header['filename']; // ----- Set the status field $p_header['status'] = "ok"; // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadCentralFileHeader() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privReadCentralFileHeader(&$p_header) { $v_result=1; // ----- Read the 4 bytes signature $v_binary_data = @fread($this->zip_fd, 4); $v_data = unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] != 0x02014b50) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); // ----- Return return PclZip::errorCode(); } // ----- Read the first 42 bytes of the header $v_binary_data = fread($this->zip_fd, 42); // ----- Look for invalid block size if (strlen($v_binary_data) != 42) { $p_header['filename'] = ""; $p_header['status'] = "invalid_header"; // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); // ----- Get filename if ($p_header['filename_len'] != 0) $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); else $p_header['filename'] = ''; // ----- Get extra if ($p_header['extra_len'] != 0) $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); else $p_header['extra'] = ''; // ----- Get comment if ($p_header['comment_len'] != 0) $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); else $p_header['comment'] = ''; // ----- Extract properties // ----- Recuperate date in UNIX format //if ($p_header['mdate'] && $p_header['mtime']) // TBC : bug : this was ignoring time with 0/0/0 if (1) { // ----- Extract time $v_hour = ($p_header['mtime'] & 0xF800) >> 11; $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; $v_seconde = ($p_header['mtime'] & 0x001F)*2; // ----- Extract date $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; $v_month = ($p_header['mdate'] & 0x01E0) >> 5; $v_day = $p_header['mdate'] & 0x001F; // ----- Get UNIX date format $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); } else { $p_header['mtime'] = time(); } // ----- Set the stored filename $p_header['stored_filename'] = $p_header['filename']; // ----- Set default status to ok $p_header['status'] = 'ok'; // ----- Look if it is a directory if (substr($p_header['filename'], -1) == '/') { //$p_header['external'] = 0x41FF0010; $p_header['external'] = 0x00000010; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privCheckFileHeaders() // Description : // Parameters : // Return Values : // 1 on success, // 0 on error; // -------------------------------------------------------------------------------- function privCheckFileHeaders(&$p_local_header, &$p_central_header) { $v_result=1; // ----- Check the static values // TBC if ($p_local_header['filename'] != $p_central_header['filename']) { } if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { } if ($p_local_header['flag'] != $p_central_header['flag']) { } if ($p_local_header['compression'] != $p_central_header['compression']) { } if ($p_local_header['mtime'] != $p_central_header['mtime']) { } if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { } // ----- Look for flag bit 3 if (($p_local_header['flag'] & 8) == 8) { $p_local_header['size'] = $p_central_header['size']; $p_local_header['compressed_size'] = $p_central_header['compressed_size']; $p_local_header['crc'] = $p_central_header['crc']; } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privReadEndCentralDir() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privReadEndCentralDir(&$p_central_dir) { $v_result=1; // ----- Go to the end of the zip file $v_size = filesize($this->zipname); @fseek($this->zip_fd, $v_size); if (@ftell($this->zip_fd) != $v_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); // ----- Return return PclZip::errorCode(); } // ----- First try : look if this is an archive with no commentaries (most of the time) // in this case the end of central dir is at 22 bytes of the file end $v_found = 0; if ($v_size > 26) { @fseek($this->zip_fd, $v_size-22); if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); // ----- Return return PclZip::errorCode(); } // ----- Read for bytes $v_binary_data = @fread($this->zip_fd, 4); $v_data = @unpack('Vid', $v_binary_data); // ----- Check signature if ($v_data['id'] == 0x06054b50) { $v_found = 1; } $v_pos = ftell($this->zip_fd); } // ----- Go back to the maximum possible size of the Central Dir End Record if (!$v_found) { $v_maximum_size = 65557; // 0xFFFF + 22; if ($v_maximum_size > $v_size) $v_maximum_size = $v_size; @fseek($this->zip_fd, $v_size-$v_maximum_size); if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); // ----- Return return PclZip::errorCode(); } // ----- Read byte per byte in order to find the signature $v_pos = ftell($this->zip_fd); $v_bytes = 0x00000000; while ($v_pos < $v_size) { // ----- Read a byte $v_byte = @fread($this->zip_fd, 1); // ----- Add the byte //$v_bytes = ($v_bytes << 8) | Ord($v_byte); // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); // ----- Compare the bytes if ($v_bytes == 0x504b0506) { $v_pos++; break; } $v_pos++; } // ----- Look if not found end of central dir if ($v_pos == $v_size) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); // ----- Return return PclZip::errorCode(); } } // ----- Read the first 18 bytes of the header $v_binary_data = fread($this->zip_fd, 18); // ----- Look for invalid block size if (strlen($v_binary_data) != 18) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); // ----- Return return PclZip::errorCode(); } // ----- Extract the values $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); // ----- Check the global size if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { // ----- Removed in release 2.2 see readme file // The check of the file size is a little too strict. // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. // While decrypted, zip has training 0 bytes if (0) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive.' .' Some trailing bytes exists after the archive.'); // ----- Return return PclZip::errorCode(); } } // ----- Get comment if ($v_data['comment_size'] != 0) { $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); } else $p_central_dir['comment'] = ''; $p_central_dir['entries'] = $v_data['entries']; $p_central_dir['disk_entries'] = $v_data['disk_entries']; $p_central_dir['offset'] = $v_data['offset']; $p_central_dir['size'] = $v_data['size']; $p_central_dir['disk'] = $v_data['disk']; $p_central_dir['disk_start'] = $v_data['disk_start']; // TBC //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { //} // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDeleteByRule() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privDeleteByRule(&$p_result_list, &$p_options) { $v_result=1; $v_list_detail = array(); // ----- Open the zip file if (($v_result=$this->privOpenFd('rb')) != 1) { // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Scan all the files // ----- Start at beginning of Central Dir $v_pos_entry = $v_central_dir['offset']; @rewind($this->zip_fd); if (@fseek($this->zip_fd, $v_pos_entry)) { // ----- Close the zip file $this->privCloseFd(); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read each entry $v_header_list = array(); $j_start = 0; for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { // ----- Read the file header $v_header_list[$v_nb_extracted] = array(); if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) { // ----- Close the zip file $this->privCloseFd(); return $v_result; } // ----- Store the index $v_header_list[$v_nb_extracted]['index'] = $i; // ----- Look for the specific extract rules $v_found = false; // ----- Look for extract by name rule if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { // ----- Look if the filename is in the list for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { $v_found = true; } } // ----- Look for a filename elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { $v_found = true; } } } // ----- Look for extract by ereg rule // ereg() is deprecated with PHP 5.3 /* else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { $v_found = true; } } */ // ----- Look for extract by preg rule else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { $v_found = true; } } // ----- Look for extract by index rule else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { // ----- Look if the index is in the list for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { $v_found = true; } if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { $j_start = $j+1; } if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { break; } } } else { $v_found = true; } // ----- Look for deletion if ($v_found) { unset($v_header_list[$v_nb_extracted]); } else { $v_nb_extracted++; } } // ----- Look if something need to be deleted if ($v_nb_extracted > 0) { // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; // ----- Creates a temporary zip archive $v_temp_zip = new PclZip($v_zip_temp_name); // ----- Open the temporary zip file in write mode if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { $this->privCloseFd(); // ----- Return return $v_result; } // ----- Look which file need to be kept for ($i=0; $izip_fd); if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); // ----- Return return PclZip::errorCode(); } // ----- Read the file header $v_local_header = array(); if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Check that local file header is same as central file header if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) { // TBC } unset($v_local_header); // ----- Write the file header if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Read/write the data block if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { // ----- Close the zip file $this->privCloseFd(); $v_temp_zip->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } } // ----- Store the offset of the central dir $v_offset = @ftell($v_temp_zip->zip_fd); // ----- Re-Create the Central Dir files header for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Transform the header to a 'usable' info $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); } // ----- Zip file comment $v_comment = ''; if (isset($p_options[PCLZIP_OPT_COMMENT])) { $v_comment = $p_options[PCLZIP_OPT_COMMENT]; } // ----- Calculate the size of the central header $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; // ----- Create the central dir footer if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { // ----- Reset the file list unset($v_header_list); $v_temp_zip->privCloseFd(); $this->privCloseFd(); @unlink($v_zip_temp_name); // ----- Return return $v_result; } // ----- Close $v_temp_zip->privCloseFd(); $this->privCloseFd(); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Destroy the temporary archive unset($v_temp_zip); } // ----- Remove every files : reset the file else if ($v_central_dir['entries'] != 0) { $this->privCloseFd(); if (($v_result = $this->privOpenFd('wb')) != 1) { return $v_result; } if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { return $v_result; } $this->privCloseFd(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDirCheck() // Description : // Check if a directory exists, if not it creates it and all the parents directory // which may be useful. // Parameters : // $p_dir : Directory path to check. // Return Values : // 1 : OK // -1 : Unable to create directory // -------------------------------------------------------------------------------- function privDirCheck($p_dir, $p_is_dir=false) { $v_result = 1; // ----- Remove the final '/' if (($p_is_dir) && (substr($p_dir, -1)=='/')) { $p_dir = substr($p_dir, 0, strlen($p_dir)-1); } // ----- Check the directory availability if ((is_dir($p_dir)) || ($p_dir == "")) { return 1; } // ----- Extract parent directory $p_parent_dir = dirname($p_dir); // ----- Just a check if ($p_parent_dir != $p_dir) { // ----- Look for parent directory if ($p_parent_dir != "") { if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) { return $v_result; } } } // ----- Create the directory if (!@mkdir($p_dir, 0777)) { // ----- Error log PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); // ----- Return return PclZip::errorCode(); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privMerge() // Description : // If $p_archive_to_add does not exist, the function exit with a success result. // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privMerge(&$p_archive_to_add) { $v_result=1; // ----- Look if the archive_to_add exists if (!is_file($p_archive_to_add->zipname)) { // ----- Nothing to merge, so merge is a success $v_result = 1; // ----- Return return $v_result; } // ----- Look if the archive exists if (!is_file($this->zipname)) { // ----- Do a duplicate $v_result = $this->privDuplicate($p_archive_to_add->zipname); // ----- Return return $v_result; } // ----- Open the zip file if (($v_result=$this->privOpenFd('rb')) != 1) { // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir = array(); if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { $this->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($this->zip_fd); // ----- Open the archive_to_add file if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) { $this->privCloseFd(); // ----- Return return $v_result; } // ----- Read the central directory informations $v_central_dir_to_add = array(); if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); return $v_result; } // ----- Go to beginning of File @rewind($p_archive_to_add->zip_fd); // ----- Creates a temporay file $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = $v_central_dir['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Copy the files from the archive_to_add into the temporary file $v_size = $v_central_dir_to_add['offset']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Store the offset of the central dir $v_offset = @ftell($v_zip_temp_fd); // ----- Copy the block of file headers from the old archive $v_size = $v_central_dir['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($this->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Copy the block of file headers from the archive_to_add $v_size = $v_central_dir_to_add['size']; while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Merge the file comments $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; // ----- Calculate the size of the (new) central header $v_size = @ftell($v_zip_temp_fd)-$v_offset; // ----- Swap the file descriptor // Here is a trick : I swap the temporary fd with the zip fd, in order to use // the following methods on the temporary fil and not the real archive fd $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Create the central dir footer if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) { $this->privCloseFd(); $p_archive_to_add->privCloseFd(); @fclose($v_zip_temp_fd); $this->zip_fd = null; // ----- Reset the file list unset($v_header_list); // ----- Return return $v_result; } // ----- Swap back the file descriptor $v_swap = $this->zip_fd; $this->zip_fd = $v_zip_temp_fd; $v_zip_temp_fd = $v_swap; // ----- Close $this->privCloseFd(); $p_archive_to_add->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Delete the zip file // TBC : I should test the result ... @unlink($this->zipname); // ----- Rename the temporary file // TBC : I should test the result ... //@rename($v_zip_temp_name, $this->zipname); PclZipUtilRename($v_zip_temp_name, $this->zipname); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDuplicate() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privDuplicate($p_archive_filename) { $v_result=1; // ----- Look if the $p_archive_filename exists if (!is_file($p_archive_filename)) { // ----- Nothing to duplicate, so duplicate is a success. $v_result = 1; // ----- Return return $v_result; } // ----- Open the zip file if (($v_result=$this->privOpenFd('wb')) != 1) { // ----- Return return $v_result; } // ----- Open the temporary file in write mode if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) { $this->privCloseFd(); PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); // ----- Return return PclZip::errorCode(); } // ----- Copy the files from the archive to the temporary file // TBC : Here I should better append the file and go back to erase the central dir $v_size = filesize($p_archive_filename); while ($v_size != 0) { $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = fread($v_zip_temp_fd, $v_read_size); @fwrite($this->zip_fd, $v_buffer, $v_read_size); $v_size -= $v_read_size; } // ----- Close $this->privCloseFd(); // ----- Close the temporary file @fclose($v_zip_temp_fd); // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privErrorLog() // Description : // Parameters : // -------------------------------------------------------------------------------- function privErrorLog($p_error_code=0, $p_error_string='') { if (PCLZIP_ERROR_EXTERNAL == 1) { PclError($p_error_code, $p_error_string); } else { $this->error_code = $p_error_code; $this->error_string = $p_error_string; } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privErrorReset() // Description : // Parameters : // -------------------------------------------------------------------------------- function privErrorReset() { if (PCLZIP_ERROR_EXTERNAL == 1) { PclErrorReset(); } else { $this->error_code = 0; $this->error_string = ''; } } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privDisableMagicQuotes() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privDisableMagicQuotes() { $v_result=1; // ----- Look if function exists if ( (!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } // ----- Look if already done if ($this->magic_quotes_status != -1) { return $v_result; } // ----- Get and memorize the magic_quote value $this->magic_quotes_status = @get_magic_quotes_runtime(); // ----- Disable magic_quotes if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime(0); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : privSwapBackMagicQuotes() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function privSwapBackMagicQuotes() { $v_result=1; // ----- Look if function exists if ( (!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { return $v_result; } // ----- Look if something to do if ($this->magic_quotes_status != -1) { return $v_result; } // ----- Swap back magic_quotes if ($this->magic_quotes_status == 1) { @set_magic_quotes_runtime($this->magic_quotes_status); } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- } // End of class // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilPathReduction() // Description : // Parameters : // Return Values : // -------------------------------------------------------------------------------- function PclZipUtilPathReduction($p_dir) { $v_result = ""; // ----- Look for not empty path if ($p_dir != "") { // ----- Explode path by directory names $v_list = explode("/", $p_dir); // ----- Study directories from last to first $v_skip = 0; for ($i=sizeof($v_list)-1; $i>=0; $i--) { // ----- Look for current path if ($v_list[$i] == ".") { // ----- Ignore this directory // Should be the first $i=0, but no check is done } else if ($v_list[$i] == "..") { $v_skip++; } else if ($v_list[$i] == "") { // ----- First '/' i.e. root slash if ($i == 0) { $v_result = "/".$v_result; if ($v_skip > 0) { // ----- It is an invalid path, so the path is not modified // TBC $v_result = $p_dir; $v_skip = 0; } } // ----- Last '/' i.e. indicates a directory else if ($i == (sizeof($v_list)-1)) { $v_result = $v_list[$i]; } // ----- Double '/' inside the path else { // ----- Ignore only the double '//' in path, // but not the first and last '/' } } else { // ----- Look for item to skip if ($v_skip > 0) { $v_skip--; } else { $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); } } } // ----- Look for skip if ($v_skip > 0) { while ($v_skip > 0) { $v_result = '../'.$v_result; $v_skip--; } } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilPathInclusion() // Description : // This function indicates if the path $p_path is under the $p_dir tree. Or, // said in an other way, if the file or sub-dir $p_path is inside the dir // $p_dir. // The function indicates also if the path is exactly the same as the dir. // This function supports path with duplicated '/' like '//', but does not // support '.' or '..' statements. // Parameters : // Return Values : // 0 if $p_path is not inside directory $p_dir // 1 if $p_path is inside directory $p_dir // 2 if $p_path is exactly the same as $p_dir // -------------------------------------------------------------------------------- function PclZipUtilPathInclusion($p_dir, $p_path) { $v_result = 1; // ----- Look for path beginning by ./ if ( ($p_dir == '.') || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); } if ( ($p_path == '.') || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); } // ----- Explode dir and path by directory separator $v_list_dir = explode("/", $p_dir); $v_list_dir_size = sizeof($v_list_dir); $v_list_path = explode("/", $p_path); $v_list_path_size = sizeof($v_list_path); // ----- Study directories paths $i = 0; $j = 0; while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { // ----- Look for empty dir (path reduction) if ($v_list_dir[$i] == '') { $i++; continue; } if ($v_list_path[$j] == '') { $j++; continue; } // ----- Compare the items if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { $v_result = 0; } // ----- Next items $i++; $j++; } // ----- Look if everything seems to be the same if ($v_result) { // ----- Skip all the empty items while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { // ----- There are exactly the same $v_result = 2; } else if ($i < $v_list_dir_size) { // ----- The path is shorter than the dir $v_result = 0; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilCopyBlock() // Description : // Parameters : // $p_mode : read/write compression mode // 0 : src & dest normal // 1 : src gzip, dest normal // 2 : src normal, dest gzip // 3 : src & dest gzip // Return Values : // -------------------------------------------------------------------------------- function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) { $v_result = 1; if ($p_mode==0) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==1) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @fwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==2) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @fread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } else if ($p_mode==3) { while ($p_size != 0) { $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); $v_buffer = @gzread($p_src, $v_read_size); @gzwrite($p_dest, $v_buffer, $v_read_size); $p_size -= $v_read_size; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilRename() // Description : // This function tries to do a simple rename() function. If it fails, it // tries to copy the $p_src file in a new $p_dest file and then unlink the // first one. // Parameters : // $p_src : Old filename // $p_dest : New filename // Return Values : // 1 on success, 0 on failure. // -------------------------------------------------------------------------------- function PclZipUtilRename($p_src, $p_dest) { $v_result = 1; // ----- Try to rename the files if (!@rename($p_src, $p_dest)) { // ----- Try to copy & unlink the src if (!@copy($p_src, $p_dest)) { $v_result = 0; } else if (!@unlink($p_src)) { $v_result = 0; } } // ----- Return return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilOptionText() // Description : // Translate option value in text. Mainly for debug purpose. // Parameters : // $p_option : the option value. // Return Values : // The option text value. // -------------------------------------------------------------------------------- function PclZipUtilOptionText($p_option) { $v_list = get_defined_constants(); for (reset($v_list); $v_key = key($v_list); next($v_list)) { $v_prefix = substr($v_key, 0, 10); if (( ($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list[$v_key] == $p_option)) { return $v_key; } } $v_result = 'Unknown'; return $v_result; } // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // Function : PclZipUtilTranslateWinPath() // Description : // Translate windows path by replacing '\' by '/' and optionally removing // drive letter. // Parameters : // $p_path : path to translate. // $p_remove_disk_letter : true | false // Return Values : // The path translated. // -------------------------------------------------------------------------------- function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) { if (stristr(php_uname(), 'windows')) { // ----- Look for potential disk letter if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { $p_path = substr($p_path, $v_position+1); } // ----- Change potential windows directory separator if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { $p_path = strtr($p_path, '\\', '/'); } } return $p_path; } // -------------------------------------------------------------------------------- rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/pclzip/readme.txt000066400000000000000000000527731361462701300256350ustar00rootroot00000000000000// -------------------------------------------------------------------------------- // PclZip 2.8.2 - readme.txt // -------------------------------------------------------------------------------- // License GNU/LGPL - August 2009 // Vincent Blavet - vincent@phpconcept.net // http://www.phpconcept.net // -------------------------------------------------------------------------------- // $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $ // -------------------------------------------------------------------------------- 0 - Sommaire ============ 1 - Introduction 2 - What's new 3 - Corrected bugs 4 - Known bugs or limitations 5 - License 6 - Warning 7 - Documentation 8 - Author 9 - Contribute 1 - Introduction ================ PclZip is a library that allow you to manage a Zip archive. Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip 2 - What's new ============== Version 2.8.2 : - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string can also be modified in the post-extract call back. **Bugs correction : - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly - Remove use of eval() and do direct call to callback functions - Correct support of 64bits systems (Thanks to WordPress team) Version 2.8.1 : - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will automatically replace it by PCLZIP_OPT_BY_PREG. Version 2.8 : - Improve extraction of zip archive for large files by using temporary files This feature is working like the one defined in r2.7. Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, PCLZIP_OPT_TEMP_FILE_THRESHOLD - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto sense of temporary file use. - Bug correction : Reduce filepath in returned file list to remove ennoying './/' preambule in file path. Version 2.7 : - Improve creation of zip archive for large files : PclZip will now autosense the configured memory and use temporary files when large file is suspected. This feature can also ne triggered by manual options in create() and add() methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size threshold to use temporary files. Using "temporary files" rather than "memory" might take more time, but might give the ability to zip very large files : Tested on my win laptop with a 88Mo file : Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) - Replace use of mktime() by time() to limit the E_STRICT error messages. - Bug correction : When adding files with full windows path (drive letter) PclZip is now working. Before, if the drive letter is not the default path, PclZip was not able to add the file. Version 2.6 : - Code optimisation - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to add a comment for a specific file. (Don't really know if this is usefull) - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string as a file. - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with a file. - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted with current time - Add CRC value in the informations returned back for each file after an action. - Add missing closedir() statement. - When adding a folder, and removing the path of this folder, files were incorrectly added with a '/' at the beginning. Which means files are related to root in unix systems. Corrected. - Add conditional if before constant definition. This will allow users to redefine constants without changing the file, and then improve upgrade of pclzip code for new versions. Version 2.5 : - Introduce the ability to add file/folder with individual properties (file descriptor). This gives for example the ability to change the filename of a zipped file. . Able to add files individually . Able to change full name . Able to change short name . Compatible with global options - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE - Add a security control feature. PclZip can extract any file in any folder of a system. People may use this to upload a zip file and try to override a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the ability to forgive any directory transversal behavior. - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend by current path (getcwd()) Version 2.4 : - Code improvment : try to speed up the code by removing unusefull call to pack() - Correct bug in delete() : delete() should be called with no argument. This was not the case in 2.3. This is corrected in 2.4. - Correct a bug in path_inclusion function. When the path has several '../../', the result was bad. - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will disable it while working and det it back to its original value. This resolve a lots of bad formated archive errors. - Bug correction : PclZip now correctly unzip file in some specific situation, when compressed content has same size as uncompressed content. - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', directories are not any more created. - Code improvment : correct unclosed opendir(), better handling of . and .. in loops. Version 2.3 : - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not give the same result in PHP4 and PHP5 .... Version 2.2 : - Try development of PCLZIP_OPT_CRYPT ..... However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, the result (greater than a long) is not supported by PHP. Even the use of bcmath functions does not help. I did not find yet a solution ...; - Add missing '/' at end of directory entries - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. - Corrected : Bad "version need to extract" field in local file header - Add private method privCheckFileHeaders() in order to check local and central file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives the ability to have a local file header without size, compressed size and crc filled. - Add a generic status 'error' for file status - Add control of compression type. PclZip only support deflate compression method. Before v2.2, PclZip does not check the compression method used in an archive while extracting. With v2.2 PclZip returns a new error status for a file using an unsupported compression method. New status is "unsupported_compression". New error code is PCLZIP_ERR_UNSUPPORTED_COMPRESSION. - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files when errors like 'a folder with same name exists' or 'a newer file exists' or 'a write protected file' exists, rather than set a status for the concerning file and resume the extract of the zip. - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the replacement of the file, even if a newer version of the file exists. Note that today if a file with the same name already exists but is older it will be replaced by the extracted one. - Improve PclZipUtilOption() - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central directory structure is the last data in the archive. Crypt encryption/decryption of zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. Version 2.1 : - Add the ability to abort the extraction by using a user callback function. The user can now return the value '2' in its callback which indicates to stop the extraction. For a pre call-back extract is stopped before the extration of the current file. For a post call back, the extraction is stopped after. - Add the ability to extract a file (or several files) directly in the standard output. This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments in the zip archive. - When merging two archives, the comments are not any more lost, but merged, with a blank space separator. - Corrected bug : Files are not deleted when all files are asked to be deleted. - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. Version 2.0 : ***** Warning : Some new features may break the backward compatibility for your scripts. Please carefully read the readme file. - Add the ability to delete by Index, name and regular expression. This feature is performed by the method delete(), which uses the optional parameters PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. - Add the ability to extract by regular expression. To extract by regexp you must use the method extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG (depending if you want to use ereg() or preg_match() syntax) followed by the regular expression pattern. - Add the ability to extract by index, directly with the extract() method. This is a code improvment of the extractByIndex() method. - Add the ability to extract by name. To extract by name you must use the method extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to extract or an array of filenames to extract. To extract all a folder, use the folder name rather than the filename with a '/' at the end. - Add the ability to add files without compression. This is done with a new attribute which is PCLZIP_OPT_NO_COMPRESSION. - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly in a string without using any file (or temporary file). - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. The default separator is now a comma (,) and not any more a blank space. THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with your script. - Improve algorythm performance by removing the use of temporary files when adding or extracting files in an archive. - Add (correct) detection of empty filename zipping. This can occurs when the removed path is the same as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. - Add better support for windows paths (thanks for help from manus@manusfreedom.com). - Corrected bug : When the archive file already exists with size=0, the add() method fails. Corrected in 2.0. - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. - Control the order of index ranges in extract by index feature. - Change the internal management of folders (better handling of internal flag). Version 1.3 : - Removing the double include check. This is now done by include_once() and require_once() PHP directives. - Changing the error handling mecanism : Remove the use of an external error library. The former PclError...() functions are replaced by internal equivalent methods. By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. Introducing the use of constants for error codes rather than integer values. This will help in futur improvment. Introduction of error handling functions like errorCode(), errorName() and errorInfo(). - Remove the deprecated use of calling function with arguments passed by reference. - Add the calling of extract(), extractByIndex(), create() and add() functions with variable options rather than fixed arguments. - Add the ability to remove all the file path while extracting or adding, without any need to specify the path to remove. This is available for extract(), extractByIndex(), create() and add() functionS by using the new variable options parameters : - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. - Ability to change the mode of a file after the extraction (chmod()). This is available for extract() and extractByIndex() functionS by using the new variable options parameters. - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. - Ability to definition call-back options. These call-back will be called during the adding, or the extracting of file (extract(), extractByIndex(), create() and add() functions) : - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user can trigerred the change the filename of the extracted file. The user can triggered the skip of the extraction. This is adding a 'skipped' status in the file list result value. - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. Nothing can be triggered from that point. - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user can trigerred the change the stored filename of the added file. The user can triggered the skip of the add. This is adding a 'skipped' status in the file list result value. - PCLZIP_CB_POST_ADD : will be called after each add of a file. Nothing can be triggered from that point. - Two status are added in the file list returned as function result : skipped & filename_too_long 'skipped' is used when a call-back function ask for skipping the file. 'filename_too_long' is used while adding a file with a too long filename to archive (the file is not added) - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into a directory. - Add a check of the presence of the archive file before some actions (like list, ...) - Add the initialisation of field "index" in header array. This means that by default index will be -1 when not explicitly set by the methods. Version 1.2 : - Adding a duplicate function. - Adding a merge function. The merge function is a "quick merge" function, it just append the content of an archive at the end of the first one. There is no check for duplicate files or more recent files. - Improve the search of the central directory end. Version 1.1.2 : - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license (see License section). - Adding the optional support of a static temporary directory. You will need to configure the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. - Improving the rename() function. In some cases rename() does not work (different Filesystems), so it will be replaced by a copy() + unlink() functions. Version 1.1.1 : - Maintenance release, no new feature. Version 1.1 : - New method Add() : adding files in the archive - New method ExtractByIndex() : partial extract of the archive, files are identified by their index in the archive - New method DeleteByIndex() : delete some files/folder entries from the archive, files are identified by their index in the archive. - Adding a test of the zlib extension presence. If not present abort the script. Version 1.0.1 : - No new feature 3 - Corrected bugs ================== Corrected in Version 2.0 : - Corrected : During an extraction, if a call-back fucntion is used and try to skip a file, all the extraction process is stopped. Corrected in Version 1.3 : - Corrected : Support of static synopsis for method extract() is broken. - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). - Corrected : When an extract is done with a remove_path parameter, the entry for the directory with exactly the same path is not skipped/filtered. - Corrected : extractByIndex() and deleteByIndex() were not managing index in the right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This is due to a sort of the index resulting table that puts 11 before 3-5 (sort on string and not interger). The sort is temporarilly removed, this means that you must provide a sorted list of index ranges. Corrected in Version 1.2 : - Nothing. Corrected in Version 1.1.2 : - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. Corrected in Version 1.1.1 : - Corrected : When archived file is not compressed (0% compression), the extract method fails. Corrected in Version 1.1 : - Corrected : Adding a complete tree of folder may result in a bad archive creation. Corrected in Version 1.0.1 : - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). 4 - Known bugs or limitations ============================= Please publish bugs reports in SourceForge : http://sourceforge.net/tracker/?group_id=40254&atid=427564 In Version 2.x : - PclZip does only support file uncompressed or compressed with deflate (compression method 8) - PclZip does not support password protected zip archive - Some concern were seen when changing mtime of a file while archiving. Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). In Version 1.2 : - merge() methods does not check for duplicate files or last date of modifications. In Version 1.1 : - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to add a file in a PclZip created archive. (Corrected in v.1.2) In Version 1.0.1 : - Adding a complete tree of folder may result in a bad archive creation. (Corrected in V.1.1). - Path given to methods must be in the unix format (/) and not the Windows format (\). Workaround : Use only / directory separators. - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz added suffix. Files with these names may already exist and may be overwritten. Workaround : none. - PclZip does not check if the zlib extension is present. If it is absent, the zip file is not created and the lib abort without warning. Workaround : enable the zlib extension on the php install In Version 1.0 : - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). (Corrected in v.1.0.1) - Limitation : Multi-disk zip archive are not supported. 5 - License =========== Since version 1.1.2, PclZip Library is released under GNU/LGPL license. This library is free, so you can use it at no cost. HOWEVER, if you release a script, an application, a library or any kind of code using PclZip library (or a part of it), YOU MUST : - Indicate in the documentation (or a readme file), that your work uses PclZip Library, and make a reference to the author and the web site http://www.phpconcept.net - Gives the ability to the final user to update the PclZip libary. I will also appreciate that you send me a mail (vincent@phpconcept.net), just to be aware that someone is using PclZip. For more information about GNU/LGPL license : http://www.gnu.org 6 - Warning ================= This library and the associated files are non commercial, non professional work. It should not have unexpected results. However if any damage is caused by this software the author can not be responsible. The use of this software is at the risk of the user. 7 - Documentation ================= PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ 8 - Author ========== This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. 9 - Contribute ============== If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. If you can help in financing PhpConcept hosting service, please go to http://www.phpconcept.net/soutien.php rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/spyc/000077500000000000000000000000001361462701300232765ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/spyc/COPYING000066400000000000000000000020651361462701300243340ustar00rootroot00000000000000The MIT License Copyright (c) 2011 Vladimir Andersen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/spyc/README.md000066400000000000000000000015461361462701300245630ustar00rootroot00000000000000**Spyc** is a YAML loader/dumper written in pure PHP. Given a YAML document, Spyc will return an array that you can use however you see fit. Given an array, Spyc will return a string which contains a YAML document built from your data. **YAML** is an amazingly human friendly and strikingly versatile data serialization language which can be used for log files, config files, custom protocols, the works. For more information, see http://www.yaml.org. Spyc supports YAML 1.0 specification. ## Using Spyc Using Spyc is trivial: ``` * @author Chris Wanstrath * @link https://github.com/mustangostang/spyc/ * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen * @license http://www.opensource.org/licenses/mit-license.php MIT License * @package Spyc */ if (!function_exists('spyc_load')) { /** * Parses YAML to array. * @param string $string YAML string. * @return array */ function spyc_load ($string) { return Spyc::YAMLLoadString($string); } } if (!function_exists('spyc_load_file')) { /** * Parses YAML to array. * @param string $file Path to YAML file. * @return array */ function spyc_load_file ($file) { return Spyc::YAMLLoad($file); } } if (!function_exists('spyc_dump')) { /** * Dumps array to YAML. * @param array $data Array. * @return string */ function spyc_dump ($data) { return Spyc::YAMLDump($data, false, false, true); } } /** * The Simple PHP YAML Class. * * This class can be used to read a YAML file and convert its contents * into a PHP array. It currently supports a very limited subsection of * the YAML spec. * * Usage: * * $Spyc = new Spyc; * $array = $Spyc->load($file); * * or: * * $array = Spyc::YAMLLoad($file); * * or: * * $array = spyc_load_file($file); * * @package Spyc */ class Spyc { // SETTINGS const REMPTY = "\0\0\0\0\0"; /** * Setting this to true will force YAMLDump to enclose any string value in * quotes. False by default. * * @var bool */ public $setting_dump_force_quotes = false; /** * Setting this to true will forse YAMLLoad to use syck_load function when * possible. False by default. * @var bool */ public $setting_use_syck_is_possible = false; /**#@+ * @access private * @var mixed */ private $_dumpIndent; private $_dumpWordWrap; private $_containsGroupAnchor = false; private $_containsGroupAlias = false; private $path; private $result; private $LiteralPlaceHolder = '___YAML_Literal_Block___'; private $SavedGroups = array(); private $indent; /** * Path modifier that should be applied after adding current element. * @var array */ private $delayedPath = array(); /**#@+ * @access public * @var mixed */ public $_nodeId; /** * Load a valid YAML string to Spyc. * @param string $input * @return array */ public function load ($input) { return $this->__loadString($input); } /** * Load a valid YAML file to Spyc. * @param string $file * @return array */ public function loadFile ($file) { return $this->__load($file); } /** * Load YAML into a PHP array statically * * The load method, when supplied with a YAML stream (string or file), * will do its best to convert YAML in a file into a PHP array. Pretty * simple. * Usage: * * $array = Spyc::YAMLLoad('lucky.yaml'); * print_r($array); * * @access public * @return array * @param string $input Path of YAML file or string containing YAML */ public static function YAMLLoad($input) { $Spyc = new Spyc; return $Spyc->__load($input); } /** * Load a string of YAML into a PHP array statically * * The load method, when supplied with a YAML string, will do its best * to convert YAML in a string into a PHP array. Pretty simple. * * Note: use this function if you don't want files from the file system * loaded and processed as YAML. This is of interest to people concerned * about security whose input is from a string. * * Usage: * * $array = Spyc::YAMLLoadString("---\n0: hello world\n"); * print_r($array); * * @access public * @return array * @param string $input String containing YAML */ public static function YAMLLoadString($input) { $Spyc = new Spyc; return $Spyc->__loadString($input); } /** * Dump YAML from PHP array statically * * The dump method, when supplied with an array, will do its best * to convert the array into friendly YAML. Pretty simple. Feel free to * save the returned string as nothing.yaml and pass it around. * * Oh, and you can decide how big the indent is and what the wordwrap * for folding is. Pretty cool -- just pass in 'false' for either if * you want to use the default. * * Indent's default is 2 spaces, wordwrap's default is 40 characters. And * you can turn off wordwrap by passing in 0. * * @access public * @return string * @param array $array PHP array * @param int $indent Pass in false to use the default, which is 2 * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) * @param int $no_opening_dashes Do not start YAML file with "---\n" */ public static function YAMLDump($array, $indent = false, $wordwrap = false, $no_opening_dashes = false) { $spyc = new Spyc; return $spyc->dump($array, $indent, $wordwrap, $no_opening_dashes); } /** * Dump PHP array to YAML * * The dump method, when supplied with an array, will do its best * to convert the array into friendly YAML. Pretty simple. Feel free to * save the returned string as tasteful.yaml and pass it around. * * Oh, and you can decide how big the indent is and what the wordwrap * for folding is. Pretty cool -- just pass in 'false' for either if * you want to use the default. * * Indent's default is 2 spaces, wordwrap's default is 40 characters. And * you can turn off wordwrap by passing in 0. * * @access public * @return string * @param array $array PHP array * @param int $indent Pass in false to use the default, which is 2 * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) */ public function dump($array,$indent = false,$wordwrap = false, $no_opening_dashes = false) { // Dumps to some very clean YAML. We'll have to add some more features // and options soon. And better support for folding. // New features and options. if ($indent === false or !is_numeric($indent)) { $this->_dumpIndent = 2; } else { $this->_dumpIndent = $indent; } if ($wordwrap === false or !is_numeric($wordwrap)) { $this->_dumpWordWrap = 40; } else { $this->_dumpWordWrap = $wordwrap; } // New YAML document $string = ""; if (!$no_opening_dashes) $string = "---\n"; // Start at the base of the array and move through it. if ($array) { $array = (array)$array; $previous_key = -1; foreach ($array as $key => $value) { if (!isset($first_key)) $first_key = $key; $string .= $this->_yamlize($key,$value,0,$previous_key, $first_key, $array); $previous_key = $key; } } return $string; } /** * Attempts to convert a key / value array item to YAML * @access private * @return string * @param $key The name of the key * @param $value The value of the item * @param $indent The indent of the current node */ private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) { if (is_array($value)) { if (empty ($value)) return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); // It has children. What to do? // Make it the right kind of item $string = $this->_dumpNode($key, self::REMPTY, $indent, $previous_key, $first_key, $source_array); // Add the indent $indent += $this->_dumpIndent; // Yamlize the array $string .= $this->_yamlizeArray($value,$indent); } elseif (!is_array($value)) { // It doesn't have children. Yip. $string = $this->_dumpNode($key, $value, $indent, $previous_key, $first_key, $source_array); } return $string; } /** * Attempts to convert an array to YAML * @access private * @return string * @param $array The array you want to convert * @param $indent The indent of the current level */ private function _yamlizeArray($array,$indent) { if (is_array($array)) { $string = ''; $previous_key = -1; foreach ($array as $key => $value) { if (!isset($first_key)) $first_key = $key; $string .= $this->_yamlize($key, $value, $indent, $previous_key, $first_key, $array); $previous_key = $key; } return $string; } else { return false; } } /** * Returns YAML from a key and a value * @access private * @return string * @param $key The name of the key * @param $value The value of the item * @param $indent The indent of the current node */ private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) { // do some folding here, for blocks if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, '%') !== false || strpos ($value, ' ') !== false || strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 || substr ($value, -1, 1) == ':') ) { $value = $this->_doLiteralBlock($value,$indent); } else { $value = $this->_doFolding($value,$indent); } if ($value === array()) $value = '[ ]'; if ($value === "") $value = '""'; if (self::isTranslationWord($value)) { $value = $this->_doLiteralBlock($value, $indent); } if (trim ($value) != $value) $value = $this->_doLiteralBlock($value,$indent); if (is_bool($value)) { $value = $value ? "true" : "false"; } if ($value === null) $value = 'null'; if ($value === "'" . self::REMPTY . "'") $value = null; $spaces = str_repeat(' ',$indent); //if (is_int($key) && $key - 1 == $previous_key && $first_key===0) { if (is_array ($source_array) && array_keys($source_array) === range(0, count($source_array) - 1)) { // It's a sequence $string = $spaces.'- '.$value."\n"; } else { // if ($first_key===0) throw new Exception('Keys are all screwy. The first one was zero, now it\'s "'. $key .'"'); // It's mapped if (strpos($key, ":") !== false || strpos($key, "#") !== false) { $key = '"' . $key . '"'; } $string = rtrim ($spaces.$key.': '.$value)."\n"; } return $string; } /** * Creates a literal block for dumping * @access private * @return string * @param $value * @param $indent int The value of the indent */ private function _doLiteralBlock($value,$indent) { if ($value === "\n") return '\n'; if (strpos($value, "\n") === false && strpos($value, "'") === false) { return sprintf ("'%s'", $value); } if (strpos($value, "\n") === false && strpos($value, '"') === false) { return sprintf ('"%s"', $value); } $exploded = explode("\n",$value); $newValue = '|'; if (isset($exploded[0]) && ($exploded[0] == "|" || $exploded[0] == "|-" || $exploded[0] == ">")) { $newValue = $exploded[0]; unset($exploded[0]); } $indent += $this->_dumpIndent; $spaces = str_repeat(' ',$indent); foreach ($exploded as $line) { $line = trim($line); if (strpos($line, '"') === 0 && strrpos($line, '"') == (strlen($line)-1) || strpos($line, "'") === 0 && strrpos($line, "'") == (strlen($line)-1)) { $line = substr($line, 1, -1); } $newValue .= "\n" . $spaces . ($line); } return $newValue; } /** * Folds a string of text, if necessary * @access private * @return string * @param $value The string you wish to fold */ private function _doFolding($value,$indent) { // Don't do anything if wordwrap is set to 0 if ($this->_dumpWordWrap !== 0 && is_string ($value) && strlen($value) > $this->_dumpWordWrap) { $indent += $this->_dumpIndent; $indent = str_repeat(' ',$indent); $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent"); $value = ">\n".$indent.$wrapped; } else { if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY) $value = '"' . $value . '"'; if (is_numeric($value) && is_string($value)) $value = '"' . $value . '"'; } return $value; } private function isTrueWord($value) { $words = self::getTranslations(array('true', 'on', 'yes', 'y')); return in_array($value, $words, true); } private function isFalseWord($value) { $words = self::getTranslations(array('false', 'off', 'no', 'n')); return in_array($value, $words, true); } private function isNullWord($value) { $words = self::getTranslations(array('null', '~')); return in_array($value, $words, true); } private function isTranslationWord($value) { return ( self::isTrueWord($value) || self::isFalseWord($value) || self::isNullWord($value) ); } /** * Coerce a string into a native type * Reference: http://yaml.org/type/bool.html * TODO: Use only words from the YAML spec. * @access private * @param $value The value to coerce */ private function coerceValue(&$value) { if (self::isTrueWord($value)) { $value = true; } else if (self::isFalseWord($value)) { $value = false; } else if (self::isNullWord($value)) { $value = null; } } /** * Given a set of words, perform the appropriate translations on them to * match the YAML 1.1 specification for type coercing. * @param $words The words to translate * @access private */ private static function getTranslations(array $words) { $result = array(); foreach ($words as $i) { $result = array_merge($result, array(ucfirst($i), strtoupper($i), strtolower($i))); } return $result; } // LOADING FUNCTIONS private function __load($input) { $Source = $this->loadFromSource($input); return $this->loadWithSource($Source); } private function __loadString($input) { $Source = $this->loadFromString($input); return $this->loadWithSource($Source); } private function loadWithSource($Source) { if (empty ($Source)) return array(); if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { $array = syck_load (implode ("\n", $Source)); return is_array($array) ? $array : array(); } $this->path = array(); $this->result = array(); $cnt = count($Source); for ($i = 0; $i < $cnt; $i++) { $line = $Source[$i]; $this->indent = strlen($line) - strlen(ltrim($line)); $tempPath = $this->getParentPathByIndent($this->indent); $line = self::stripIndent($line, $this->indent); if (self::isComment($line)) continue; if (self::isEmpty($line)) continue; $this->path = $tempPath; $literalBlockStyle = self::startsLiteralBlock($line); if ($literalBlockStyle) { $line = rtrim ($line, $literalBlockStyle . " \n"); $literalBlock = ''; $line .= ' '.$this->LiteralPlaceHolder; $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1])); while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); } $i--; } // Strip out comments if (strpos ($line, '#')) { $line = preg_replace('/\s*#([^"\']+)$/','',$line); } while (++$i < $cnt && self::greedilyNeedNextLine($line)) { $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); } $i--; $lineArray = $this->_parseLine($line); if ($literalBlockStyle) $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock); $this->addArray($lineArray, $this->indent); foreach ($this->delayedPath as $indent => $delayedPath) $this->path[$indent] = $delayedPath; $this->delayedPath = array(); } return $this->result; } private function loadFromSource ($input) { if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) $input = file_get_contents($input); return $this->loadFromString($input); } private function loadFromString ($input) { $lines = explode("\n",$input); foreach ($lines as $k => $_) { $lines[$k] = rtrim ($_, "\r"); } return $lines; } /** * Parses YAML code and returns an array for a node * @access private * @return array * @param string $line A line from the YAML file */ private function _parseLine($line) { if (!$line) return array(); $line = trim($line); if (!$line) return array(); $array = array(); $group = $this->nodeContainsGroup($line); if ($group) { $this->addGroup($line, $group); $line = $this->stripGroup ($line, $group); } if ($this->startsMappedSequence($line)) return $this->returnMappedSequence($line); if ($this->startsMappedValue($line)) return $this->returnMappedValue($line); if ($this->isArrayElement($line)) return $this->returnArrayElement($line); if ($this->isPlainArray($line)) return $this->returnPlainArray($line); return $this->returnKeyValuePair($line); } /** * Finds the type of the passed value, returns the value as the new type. * @access private * @param string $value * @return mixed */ private function _toType($value) { if ($value === '') return ""; $first_character = $value[0]; $last_character = substr($value, -1, 1); $is_quoted = false; do { if (!$value) break; if ($first_character != '"' && $first_character != "'") break; if ($last_character != '"' && $last_character != "'") break; $is_quoted = true; } while (0); if ($is_quoted) { $value = str_replace('\n', "\n", $value); return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); } if (strpos($value, ' #') !== false && !$is_quoted) $value = preg_replace('/\s+#(.+)$/','',$value); if ($first_character == '[' && $last_character == ']') { // Take out strings sequences and mappings $innerValue = trim(substr ($value, 1, -1)); if ($innerValue === '') return array(); $explode = $this->_inlineEscape($innerValue); // Propagate value array $value = array(); foreach ($explode as $v) { $value[] = $this->_toType($v); } return $value; } if (strpos($value,': ')!==false && $first_character != '{') { $array = explode(': ',$value); $key = trim($array[0]); array_shift($array); $value = trim(implode(': ',$array)); $value = $this->_toType($value); return array($key => $value); } if ($first_character == '{' && $last_character == '}') { $innerValue = trim(substr ($value, 1, -1)); if ($innerValue === '') return array(); // Inline Mapping // Take out strings sequences and mappings $explode = $this->_inlineEscape($innerValue); // Propagate value array $array = array(); foreach ($explode as $v) { $SubArr = $this->_toType($v); if (empty($SubArr)) continue; if (is_array ($SubArr)) { $array[key($SubArr)] = $SubArr[key($SubArr)]; continue; } $array[] = $SubArr; } return $array; } if ($value == 'null' || $value == 'NULL' || $value == 'Null' || $value == '' || $value == '~') { return null; } if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){ $intvalue = (int)$value; if ($intvalue != PHP_INT_MAX) $value = $intvalue; return $value; } if (is_numeric($value) && preg_match('/^0[xX][0-9a-fA-F]+$/', $value)) { // Hexadecimal value. return hexdec($value); } $this->coerceValue($value); if (is_numeric($value)) { if ($value === '0') return 0; if (rtrim ($value, 0) === $value) $value = (float)$value; return $value; } return $value; } /** * Used in inlines to check for more inlines or quoted strings * @access private * @return array */ private function _inlineEscape($inline) { // There's gotta be a cleaner way to do this... // While pure sequences seem to be nesting just fine, // pure mappings and mappings with sequences inside can't go very // deep. This needs to be fixed. $seqs = array(); $maps = array(); $saved_strings = array(); $saved_empties = array(); // Check for empty strings $regex = '/("")|(\'\')/'; if (preg_match_all($regex,$inline,$strings)) { $saved_empties = $strings[0]; $inline = preg_replace($regex,'YAMLEmpty',$inline); } unset($regex); // Check for strings $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; if (preg_match_all($regex,$inline,$strings)) { $saved_strings = $strings[0]; $inline = preg_replace($regex,'YAMLString',$inline); } unset($regex); // echo $inline; $i = 0; do { // Check for sequences while (preg_match('/\[([^{}\[\]]+)\]/U',$inline,$matchseqs)) { $seqs[] = $matchseqs[0]; $inline = preg_replace('/\[([^{}\[\]]+)\]/U', ('YAMLSeq' . (count($seqs) - 1) . 's'), $inline, 1); } // Check for mappings while (preg_match('/{([^\[\]{}]+)}/U',$inline,$matchmaps)) { $maps[] = $matchmaps[0]; $inline = preg_replace('/{([^\[\]{}]+)}/U', ('YAMLMap' . (count($maps) - 1) . 's'), $inline, 1); } if ($i++ >= 10) break; } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); $explode = explode(',',$inline); $explode = array_map('trim', $explode); $stringi = 0; $i = 0; while (1) { // Re-add the sequences if (!empty($seqs)) { foreach ($explode as $key => $value) { if (strpos($value,'YAMLSeq') !== false) { foreach ($seqs as $seqk => $seq) { $explode[$key] = str_replace(('YAMLSeq'.$seqk.'s'),$seq,$value); $value = $explode[$key]; } } } } // Re-add the mappings if (!empty($maps)) { foreach ($explode as $key => $value) { if (strpos($value,'YAMLMap') !== false) { foreach ($maps as $mapk => $map) { $explode[$key] = str_replace(('YAMLMap'.$mapk.'s'), $map, $value); $value = $explode[$key]; } } } } // Re-add the strings if (!empty($saved_strings)) { foreach ($explode as $key => $value) { while (strpos($value,'YAMLString') !== false) { $explode[$key] = preg_replace('/YAMLString/',$saved_strings[$stringi],$value, 1); unset($saved_strings[$stringi]); ++$stringi; $value = $explode[$key]; } } } // Re-add the empties if (!empty($saved_empties)) { foreach ($explode as $key => $value) { while (strpos($value,'YAMLEmpty') !== false) { $explode[$key] = preg_replace('/YAMLEmpty/', '', $value, 1); $value = $explode[$key]; } } } $finished = true; foreach ($explode as $key => $value) { if (strpos($value,'YAMLSeq') !== false) { $finished = false; break; } if (strpos($value,'YAMLMap') !== false) { $finished = false; break; } if (strpos($value,'YAMLString') !== false) { $finished = false; break; } if (strpos($value,'YAMLEmpty') !== false) { $finished = false; break; } } if ($finished) break; $i++; if ($i > 10) break; // Prevent infinite loops. } return $explode; } private function literalBlockContinues ($line, $lineIndent) { if (!trim($line)) return true; if (strlen($line) - strlen(ltrim($line)) > $lineIndent) return true; return false; } private function referenceContentsByAlias ($alias) { do { if (!isset($this->SavedGroups[$alias])) { echo "Bad group name: $alias."; break; } $groupPath = $this->SavedGroups[$alias]; $value = $this->result; foreach ($groupPath as $k) { $value = $value[$k]; } } while (false); return $value; } private function addArrayInline ($array, $indent) { $CommonGroupPath = $this->path; if (empty ($array)) return false; foreach ($array as $k => $_) { $this->addArray(array($k => $_), $indent); $this->path = $CommonGroupPath; } return true; } private function addArray ($incoming_data, $incoming_indent) { // print_r ($incoming_data); if (count ($incoming_data) > 1) return $this->addArrayInline ($incoming_data, $incoming_indent); $key = key ($incoming_data); $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; if ($key === '__!YAMLZero') $key = '0'; if ($incoming_indent == 0 && !$this->_containsGroupAlias && !$this->_containsGroupAnchor) { // Shortcut for root-level values. if ($key || $key === '' || $key === '0') { $this->result[$key] = $value; } else { $this->result[] = $value; end ($this->result); $key = key ($this->result); } $this->path[$incoming_indent] = $key; return; } $history = array(); // Unfolding inner array tree. $history[] = $_arr = $this->result; foreach ($this->path as $k) { $history[] = $_arr = $_arr[$k]; } if ($this->_containsGroupAlias) { $value = $this->referenceContentsByAlias($this->_containsGroupAlias); $this->_containsGroupAlias = false; } // Adding string or numeric key to the innermost level or $this->arr. if (is_string($key) && $key == '<<') { if (!is_array ($_arr)) { $_arr = array (); } $_arr = array_merge ($_arr, $value); } else if ($key || $key === '' || $key === '0') { if (!is_array ($_arr)) $_arr = array ($key=>$value); else $_arr[$key] = $value; } else { if (!is_array ($_arr)) { $_arr = array ($value); $key = 0; } else { $_arr[] = $value; end ($_arr); $key = key ($_arr); } } $reverse_path = array_reverse($this->path); $reverse_history = array_reverse ($history); $reverse_history[0] = $_arr; $cnt = count($reverse_history) - 1; for ($i = 0; $i < $cnt; $i++) { $reverse_history[$i+1][$reverse_path[$i]] = $reverse_history[$i]; } $this->result = $reverse_history[$cnt]; $this->path[$incoming_indent] = $key; if ($this->_containsGroupAnchor) { $this->SavedGroups[$this->_containsGroupAnchor] = $this->path; if (is_array ($value)) { $k = key ($value); if (!is_int ($k)) { $this->SavedGroups[$this->_containsGroupAnchor][$incoming_indent + 2] = $k; } } $this->_containsGroupAnchor = false; } } private static function startsLiteralBlock ($line) { $lastChar = substr (trim($line), -1); if ($lastChar != '>' && $lastChar != '|') return false; if ($lastChar == '|') return $lastChar; // HTML tags should not be counted as literal blocks. if (preg_match ('#<.*?>$#', $line)) return false; return $lastChar; } private static function greedilyNeedNextLine($line) { $line = trim ($line); if (!strlen($line)) return false; if (substr ($line, -1, 1) == ']') return false; if ($line[0] == '[') return true; if (preg_match ('#^[^:]+?:\s*\[#', $line)) return true; return false; } private function addLiteralLine ($literalBlock, $line, $literalBlockStyle, $indent = -1) { $line = self::stripIndent($line, $indent); if ($literalBlockStyle !== '|') { $line = self::stripIndent($line); } $line = rtrim ($line, "\r\n\t ") . "\n"; if ($literalBlockStyle == '|') { return $literalBlock . $line; } if (strlen($line) == 0) return rtrim($literalBlock, ' ') . "\n"; if ($line == "\n" && $literalBlockStyle == '>') { return rtrim ($literalBlock, " \t") . "\n"; } if ($line != "\n") $line = trim ($line, "\r\n ") . " "; return $literalBlock . $line; } function revertLiteralPlaceHolder ($lineArray, $literalBlock) { foreach ($lineArray as $k => $_) { if (is_array($_)) $lineArray[$k] = $this->revertLiteralPlaceHolder ($_, $literalBlock); else if (substr($_, -1 * strlen ($this->LiteralPlaceHolder)) == $this->LiteralPlaceHolder) $lineArray[$k] = rtrim ($literalBlock, " \r\n"); } return $lineArray; } private static function stripIndent ($line, $indent = -1) { if ($indent == -1) $indent = strlen($line) - strlen(ltrim($line)); return substr ($line, $indent); } private function getParentPathByIndent ($indent) { if ($indent == 0) return array(); $linePath = $this->path; do { end($linePath); $lastIndentInParentPath = key($linePath); if ($indent <= $lastIndentInParentPath) array_pop ($linePath); } while ($indent <= $lastIndentInParentPath); return $linePath; } private function clearBiggerPathValues ($indent) { if ($indent == 0) $this->path = array(); if (empty ($this->path)) return true; foreach ($this->path as $k => $_) { if ($k > $indent) unset ($this->path[$k]); } return true; } private static function isComment ($line) { if (!$line) return false; if ($line[0] == '#') return true; if (trim($line, " \r\n\t") == '---') return true; return false; } private static function isEmpty ($line) { return (trim ($line) === ''); } private function isArrayElement ($line) { if (!$line || !is_scalar($line)) return false; if (substr($line, 0, 2) != '- ') return false; if (strlen ($line) > 3) if (substr($line,0,3) == '---') return false; return true; } private function isHashElement ($line) { return strpos($line, ':'); } private function isLiteral ($line) { if ($this->isArrayElement($line)) return false; if ($this->isHashElement($line)) return false; return true; } private static function unquote ($value) { if (!$value) return $value; if (!is_string($value)) return $value; if ($value[0] == '\'') return trim ($value, '\''); if ($value[0] == '"') return trim ($value, '"'); return $value; } private function startsMappedSequence ($line) { return (substr($line, 0, 2) == '- ' && substr ($line, -1, 1) == ':'); } private function returnMappedSequence ($line) { $array = array(); $key = self::unquote(trim(substr($line,1,-1))); $array[$key] = array(); $this->delayedPath = array(strpos ($line, $key) + $this->indent => $key); return array($array); } private function checkKeysInValue($value) { if (strchr('[{"\'', $value[0]) === false) { if (strchr($value, ': ') !== false) { throw new Exception('Too many keys: '.$value); } } } private function returnMappedValue ($line) { $this->checkKeysInValue($line); $array = array(); $key = self::unquote (trim(substr($line,0,-1))); $array[$key] = ''; return $array; } private function startsMappedValue ($line) { return (substr ($line, -1, 1) == ':'); } private function isPlainArray ($line) { return ($line[0] == '[' && substr ($line, -1, 1) == ']'); } private function returnPlainArray ($line) { return $this->_toType($line); } private function returnKeyValuePair ($line) { $array = array(); $key = ''; if (strpos ($line, ': ')) { // It's a key/value pair most likely // If the key is in double quotes pull it out if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { $value = trim(str_replace($matches[1],'',$line)); $key = $matches[2]; } else { // Do some guesswork as to the key and the value $explode = explode(': ', $line); $key = trim(array_shift($explode)); $value = trim(implode(': ', $explode)); $this->checkKeysInValue($value); } // Set the type of the value. Int, string, etc $value = $this->_toType($value); if ($key === '0') $key = '__!YAMLZero'; $array[$key] = $value; } else { $array = array ($line); } return $array; } private function returnArrayElement ($line) { if (strlen($line) <= 1) return array(array()); // Weird %) $array = array(); $value = trim(substr($line,1)); $value = $this->_toType($value); if ($this->isArrayElement($value)) { $value = $this->returnArrayElement($value); } $array[] = $value; return $array; } private function nodeContainsGroup ($line) { $symbolsForReference = 'A-z0-9_\-'; if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; if ($line[0] == '*' && preg_match('/^(\*['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; if (preg_match('/(&['.$symbolsForReference.']+)$/', $line, $matches)) return $matches[1]; if (preg_match('/(\*['.$symbolsForReference.']+$)/', $line, $matches)) return $matches[1]; if (preg_match ('#^\s*<<\s*:\s*(\*[^\s]+).*$#', $line, $matches)) return $matches[1]; return false; } private function addGroup ($line, $group) { if ($group[0] == '&') $this->_containsGroupAnchor = substr ($group, 1); if ($group[0] == '*') $this->_containsGroupAlias = substr ($group, 1); //print_r ($this->path); } private function stripGroup ($line, $group) { $line = trim(str_replace($group, '', $line)); return $line; } } // Enable use of Spyc from command line // The syntax is the following: php Spyc.php spyc.yaml do { if (PHP_SAPI != 'cli') break; if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; if (empty ($_SERVER['PHP_SELF']) || FALSE === strpos ($_SERVER['PHP_SELF'], 'Spyc.php') ) break; $file = $argv[1]; echo json_encode (spyc_load_file ($file)); } while (0); rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/spyc/composer.json000066400000000000000000000012071361462701300260200ustar00rootroot00000000000000{ "name": "mustangostang/spyc", "description": "A simple YAML loader/dumper class for PHP", "type": "library", "keywords": [ "spyc", "yaml", "yml" ], "homepage": "https://github.com/mustangostang/spyc/", "authors" : [{ "name": "mustangostang", "email": "vlad.andersen@gmail.com" }], "license": "MIT", "require": { "php": ">=5.3.1" }, "autoload": { "files": [ "Spyc.php" ] }, "require-dev": { "phpunit/phpunit": "4.3.*@dev" }, "extra": { "branch-alias": { "dev-master": "0.5.x-dev" } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/tmhOAuth/000077500000000000000000000000001361462701300240515ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/tmhOAuth/LICENSE000066400000000000000000000261361361462701300250660ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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. rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/tmhOAuth/README.md000066400000000000000000000227001361462701300253310ustar00rootroot00000000000000# tmhOAuth An OAuth 1.0A library written in PHP by @themattharris, specifically for use with the Twitter API. **Disclaimer**: This project is a work in progress. Please use the issue tracker to report any enhancements or issues you encounter. ## Goals - Support OAuth 1.0A - Use Authorisation headers instead of query string or POST parameters - Allow uploading of images - Provide enough information to assist with debugging ## Dependencies The library has been tested with PHP 5.3+ and relies on CURL and hash_hmac. The vast majority of hosting providers include these libraries and run with PHP 5.1+. The code makes use of hash_hmac, which was introduced in PHP 5.1.2. If your version of PHP is lower than this you should ask your hosting provider for an update. ## A note about security and SSL Version 0.60 hardened the security of the library and defaulted `curl_ssl_verifypeer` to `true`. As some hosting providers do not provide the most current certificate root file it is now included in this repository. If the version is out of date OR you prefer to download the certificate roots yourself, you can get them from: http://curl.haxx.se/ca/cacert.pem Before upgrading the version of tmhOAuth that you use, be sure to verify the SSL handling works on your server by running the `examples/verify_ssl.php` script. ## Usage This will be built out later but for the moment review the examples repository for ways the library can be used. Each example contains instructions on how to use it. ## Notes for users of previous versions If you previously used version 0.4 be aware the utility functions have now been broken into their own file. Before you use version 0.5+ in your app test locally to ensure your code doesn't need tmhUtilities included. If you used custom HTTP request headers when they were defined as `'key: value'` strings you should now define them as `'key' => 'value'` pairs. Versions prior to 0.7.3 collapsed headers with the same value into one $tmhOAuth->response['headers'] key. Since 0.7.3 headers with the same key will use an array to store their values. ## Change History ### 0.7.5 - 20 Februrary 2013 - tidying up of composer.json. (Issue #112) Props: ceeram ### 0.7.4 - 19 Februrary 2013 - corrections to composer.json to support packagists requirements. (Issue #110) ### 0.7.3 - 18 Februrary 2013 - add support for making requests with the host header being different to the request host. - ensure headers with the same key do not overwrite each other in $tmhOAuth->response['headers']. - removed examples submodule in favor of examples including tmhOAuth, rather than tmhOAuth including examples - made it so that if param values are sent to $tmhOAuth->request as an array (key -> array()) then $tmhOAuth->prepare_params will now implode them using ',' - fixed composer. (Issue #99). Props: rasa - fixed PHPDoc. (Issue #47). Props: trante - instead of void, $tmhOAuth->curlit now returns 0 if 'prevent_request' is set ### 0.7.2 - 01 November 2012 - use DIRECTORY_SEPARATOR for multi-environment support. (Issue #80) Props: whallz - tidied up the curlHeader function to use explode instead of substr and store the keys in the format they are returned from the API - removed content-length hack as it isn't needed if CURLOPT_POSTFIELDS is initialized on all POSTs - removed the expects header hack as Twitter no longer requires it to be there - introduce composer.json. (Issues #39, #77, #85) Props: akandels, conradkleinespel, dguyon, kud, philsturgeon, willdurand - added support for specifying custom headers when using $tmhOAuth->request. (Issue #98) ### 0.7.1 - 27 October 2012 - set content-length to 0 explictly to avoid a bug between libcurl and Twitter. (Issue #94) - allow initialization without a configuration array (default config to array()) - prevent ->url allowing double slashes in paths ### 0.7.0 - 04 September 2012 - changed version numbers to x.y.z format - stronger method scoping (public and private) - Typo fix in depenencies. (Issue #42) Props: tantek - Only lowercase the host and scheme, and not path, in prepare_url. (Issue #56) Props: uzyn - Fixed a number of PHP warnings by changing some tmhUtilty methods to static. (Issue #52) Props: DrayChou - Raw headers and response body are now available as `$tmhOAuth->response['raw']` - Moved the examples to their own repository - Removed the `noexamples` branch as master does not contain examples anymore - Introduced `$tmhOAuth->config['timezone']` and set `date_default_timezone_set`. (Issue #70) Props: iamctodd ### 0.621 - 12 March 2012 - Ensure `$_SERVER['HTTPS']` isset before checking it's value. Props: kud ### 0.62 - 01 March 2012 - Fix array merging bug. Props: julien-c - use is_callable instead of function_exists: Props: samwierema - Allow options to be specified for the entify function. Props: davidcroda - protocol was not inferred correctly for https when ['HTTPS'] == 'on'. Props: ospector - Switched to https for twitter.com display URLs - Improved the search results example ### 0.61 - 16 January 2012 - Removed trailing ?> from tmhOAuth.php and tmhUtilities.php to meet the Zend Framework's coding practices. Props: reedy - Fixed bug where CURLOPT_SSL_VERIFYHOST was defaulted to true when it should have been defaulted to 2. Props: kevinsmcarthur ### 0.60 - 29 December 2011 - Changed any use of implode to the preferred format of implode($glue, $pieces). Props: reedy - Moved oauth_verifier to the authorization header as shown in example of RFC 5849. Props: spacenick - added curl error and error number values to the $tmhOAuth->response object - added an example script for testing the SSL connection to twitter.com with the new SSL configuration of tmhOAuth - added a function to generate the useragent depending on whether SSL is on or not - defaulted CURLOPT_SSL_VERIFYPEER to true - added CURLOPT_SSL_VERIFYHOST and defaulted it to true - added the most current cacert.pem file from http://curl.haxx.se/ca/cacert.pem and configured curl to use it ### 0.58 - 29 December 2011 - Rearranged some configuration variables around to make commenting easier - Standarised on lowercase booleans ### 0.57 - 11 December 2011 - Fixed prevent_request so OAuth Echo requests work again. - Added a TwitPic OAuth Echo example ### 0.56 - 29 September 2011 - Fixed version reference in the UserAgent - Updated tmhUtilities::entify with support for media - Updated tmhUtilities::entify with support for multibyte characters. Props: andersonshatch ### 0.55 - 29 September 2011 - Added support for content encoding. Defaults to whatever localhost supports. Props: yusuke ### 0.54 - 29 September 2011 - User-Agent is now configurable and includes the current version number of the script - Updated the Streaming examples to use SSL ### 0.53 - 15 July 2011 - Fixed issue where headers were being duplicated if the library was called more than once. - Updated examples to fit the new location of access tokens and secrets on dev.twitter.com - Added Photo Tweet example ### 0.52 - 06 July 2011 - Fixed issue where the preference for include_time in create_nonce was being ignored ### 0.51 - 06 July 2011 - Use isset instead of suppress errors. Props: funkatron - Added example of using the Search API - Added example of using friends/ids and users/lookup to get details of a users friends - Added example of the authorize OAuth webflow ### 0.5 - 29 March 2011 - Moved utility functions out of the main class and into the tmhUtilities class. - Added the ability to send OAuth parameters as part of the querystring or POST body. - Section 3.4.1.2 says the url must be lowercase so prepare URL now does this. - Added a convenience method for accessing the safe_encode/decode transforms. - Updated the examples to use the new utilities library. - Added examples for sitestreams and userstreams. - Added a more advanced streaming API example. ### 0.4 - 03 March 2011 - Fixed handling of parameters when using DELETE. Thanks to yusuke for reporting - Fixed php_self to handle port numbers other than 80/443. Props: yusuke - Updated function pr to use pre only when not running in CLI mode - Add support for proxy servers. Props juanchorossi - Function request now returns the HTTP status code. Props: kronenthaler - Documentation fixes for xAuth. Props: 140dev - Some minor code formatting changes ### 0.3 - 28 September 2010 - Moved entities rendering into the library ### 0.2 - 17 September 2010 - Added support for the Streaming API ### 0.14 - 17 September 2010 - Fixed authorisation header for use with OAuth Echo ### 0.13 - 17 September 2010 - Added use_ssl configuration parameter - Fixed config array typo - Removed v from the config - Remove protocol from the host (configured by use_ssl) - Added include for easier debugging ### 0.12 - 17 September 2010 - Moved curl options to config - Added the ability for curl to follow redirects, default false ### 0.11 - 17 September 2010 - Fixed a bug in the GET requests ### 0.1 - 26 August 2010 - Initial beta version ## Community License: Apache 2 (see [included LICENSE file](https://github.com/themattharris/tmhOAuth/blob/master/LICENSE)) Follow [@tmhOAuth](https://twitter.com/intent/follow?screen_name=tmhOAuth) to receive updates on releases, or ask for support Follow me on Twitter: [@themattharris](https://twitter.com/intent/follow?screen_name=themattharris) Check out the Twitter Developer Resources: ## To Do - Add good behavior logic to the Streaming API handler - i.e. on disconnect back off - Async Curl supportrainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/tmhOAuth/cacert.pem000066400000000000000000006467751361462701300260460ustar00rootroot00000000000000## ## ca-bundle.crt -- Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011 ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (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.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the Netscape security libraries. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1994-2000 # the Initial Developer. All Rights Reserved. # # Contributor(s): # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** # @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ GTE CyberTrust Global Root ========================== -----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- Thawte Server CA ================ -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- Thawte Premium Server CA ======================== -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t UCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- Equifax Secure CA ================= -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 70+sB3c4 -----END CERTIFICATE----- Digital Signature Trust Co. Global CA 1 ======================================= -----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 RbyhkwS7hp86W0N6w4pl -----END CERTIFICATE----- Digital Signature Trust Co. Global CA 3 ======================================= -----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 mPnHfxsb1gYgAlihw6ID -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf Tqj/ZA1k -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G2 ============================================================ -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 -----END CERTIFICATE----- Verisign Class 4 Public Primary Certification Authority - G2 ============================================================ -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4 xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp -----END CERTIFICATE----- GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- ValiCert Class 1 VA =================== -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP Orf1LXLI -----END CERTIFICATE----- ValiCert Class 2 VA =================== -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 W9ViH0Pd -----END CERTIFICATE----- RSA Root Certificate 1 ====================== -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td 3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs 3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r on+jjBXu -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Verisign Class 4 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- Entrust.net Secure Server CA ============================ -----BEGIN CERTIFICATE----- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z 2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- Equifax Secure Global eBusiness CA ================================== -----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- Equifax Secure eBusiness CA 1 ============================= -----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ 1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- Equifax Secure eBusiness CA 2 ============================= -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn 2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia 78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm V+GRMOrN -----END CERTIFICATE----- AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- AddTrust Public Services Root ============================= -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- AddTrust Qualified Certificates Root ==================================== -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- RSA Security 2048 v3 ==================== -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA pKnXwiJPZ9d37CAFYd4= -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Global CA 2 ==================== -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF H4z1Ir+rzoPz4iIprn2DQKi6bA== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- America Online Root Certification Authority 1 ============================================= -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- America Online Root Certification Authority 2 ============================================= -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- TC TrustCenter, Germany, Class 2 CA =================================== -----BEGIN CERTIFICATE----- MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf /x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2 9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac ASZ4smZHcFFk -----END CERTIFICATE----- TC TrustCenter, Germany, Class 3 CA =================================== -----BEGIN CERTIFICATE----- MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05 ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN 2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7 7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm 5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS CdS7kjXvD9s0 -----END CERTIFICATE----- Certum Root CA ============== -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- Comodo Secure Services root =========================== -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H RR3B7Hzs/Sk= -----END CERTIFICATE----- Comodo Trusted Services root ============================ -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O 9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- TDC Internet Root CA ==================== -----BEGIN CERTIFICATE----- MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc 5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l -----END CERTIFICATE----- TDC OCES Root CA ================ -----BEGIN CERTIFICATE----- MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO 3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB 5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 +RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== -----END CERTIFICATE----- UTN DATACorp SGC Root CA ======================== -----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 nfhmqA== -----END CERTIFICATE----- Camerfirma Chambers of Commerce Root ==================================== -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 erfutGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- Camerfirma Global Chambersign Root ================================== -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- NetLock Business (Class B) Root =============================== -----BEGIN CERTIFICATE----- MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr 1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM 43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI -----END CERTIFICATE----- NetLock Express (Class C) Root ============================== -----BEGIN CERTIFICATE----- MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro g14= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- Firmaprofesional Root CA ======================== -----BEGIN CERTIFICATE----- MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf 3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm 7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= -----END CERTIFICATE----- Wells Fargo Root CA =================== -----BEGIN CERTIFICATE----- MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= -----END CERTIFICATE----- Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW NY6E0F/6MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- DST ACES CA X6 ============== -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 oKfN5XozNmr6mis= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 1 ============================================== -----BEGIN CERTIFICATE----- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2 ============================================== -----BEGIN CERTIFICATE----- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 UrbnBEI= -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- WellsSecure Public Root Certificate Authority ============================================= -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ tylv2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- IGC/A ===== -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF 0mBWWg== -----END CERTIFICATE----- Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Microsec e-Szigno Root CA ========================= -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. ====================================== -----BEGIN CERTIFICATE----- MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU 2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP 2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm 8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK 5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v /zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f /RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== -----END CERTIFICATE----- TC TrustCenter Class 2 CA II ============================ -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk vQ== -----END CERTIFICATE----- TC TrustCenter Class 3 CA II ============================ -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo 6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk 2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal 092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc 5A== -----END CERTIFICATE----- TC TrustCenter Universal CA I ============================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- ComSign Secured CA ================== -----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 ============================================================================================================================= -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- Buypass Class 2 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- Buypass Class 3 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 -----END CERTIFICATE----- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 ========================================================================== -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- CNNIC ROOT ========== -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- ApplicationCA - Japanese Government =================================== -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) FĂ…â€tanĂÂşsĂ­tvĂ¡ny ============================================ -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- Juur-SK ======= -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 yyqcjg== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- ACEDICOM Root ============= -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ D/xwzoiQ -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi =================================================== -----BEGIN CERTIFICATE----- MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY 8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk 9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- TC TrustCenter Universal CA III =============================== -----BEGIN CERTIFICATE----- MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- Certinomis - AutoritĂ© Racine ============================= -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- Root CA Generalitat Valenciana ============================== -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- A-Trust-nQual-03 ================ -----BEGIN CERTIFICATE----- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 ahq97BvIxYSazQ== -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE-----rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/tmhOAuth/tmhOAuth.php000066400000000000000000000604341361462701300263220ustar00rootroot00000000000000params = array(); $this->headers = array(); $this->auto_fixed_time = false; $this->buffer = null; // default configuration options $this->config = array_merge( array( // leave 'user_agent' blank for default, otherwise set this to // something that clearly identifies your app 'user_agent' => '', // default timezone for requests 'timezone' => 'UTC', 'use_ssl' => true, 'host' => 'api.twitter.com', 'consumer_key' => '', 'consumer_secret' => '', 'user_token' => '', 'user_secret' => '', 'force_nonce' => false, 'nonce' => false, // used for checking signatures. leave as false for auto 'force_timestamp' => false, 'timestamp' => false, // used for checking signatures. leave as false for auto // oauth signing variables that are not dynamic 'oauth_version' => '1.0', 'oauth_signature_method' => 'HMAC-SHA1', // you probably don't want to change any of these curl values 'curl_connecttimeout' => 30, 'curl_timeout' => 10, // for security this should always be set to 2. 'curl_ssl_verifyhost' => 2, // for security this should always be set to true. 'curl_ssl_verifypeer' => true, // you can get the latest cacert.pem from here http://curl.haxx.se/ca/cacert.pem 'curl_cainfo' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem', 'curl_capath' => dirname(__FILE__), 'curl_followlocation' => false, // whether to follow redirects or not // support for proxy servers 'curl_proxy' => false, // really you don't want to use this if you are using streaming 'curl_proxyuserpwd' => false, // format username:password for proxy, if required 'curl_encoding' => '', // leave blank for all supported formats, else use gzip, deflate, identity // streaming API 'is_streaming' => false, 'streaming_eol' => "\r\n", 'streaming_metrics_interval' => 60, // header or querystring. You should always use header! // this is just to help me debug other developers implementations 'as_header' => true, 'debug' => false, ), $config ); $this->set_user_agent(); date_default_timezone_set($this->config['timezone']); } /** * Sets the useragent for PHP to use * If '$this->config['user_agent']' already has a value it is used instead of one * being generated. * * @return void value is stored to the config array class variable */ private function set_user_agent() { if (!empty($this->config['user_agent'])) return; if ($this->config['curl_ssl_verifyhost'] && $this->config['curl_ssl_verifypeer']) { $ssl = '+SSL'; } else { $ssl = '-SSL'; } $ua = 'tmhOAuth ' . self::VERSION . $ssl . ' - //github.com/themattharris/tmhOAuth'; $this->config['user_agent'] = $ua; } /** * Generates a random OAuth nonce. * If 'force_nonce' is true a nonce is not generated and the value in the configuration will be retained. * * @param string $length how many characters the nonce should be before MD5 hashing. default 12 * @param string $include_time whether to include time at the beginning of the nonce. default true * @return void value is stored to the config array class variable */ private function create_nonce($length=12, $include_time=true) { if ($this->config['force_nonce'] == false) { $sequence = array_merge(range(0,9), range('A','Z'), range('a','z')); $length = $length > count($sequence) ? count($sequence) : $length; shuffle($sequence); $prefix = $include_time ? microtime() : ''; $this->config['nonce'] = md5(substr($prefix . implode('', $sequence), 0, $length)); } } /** * Generates a timestamp. * If 'force_timestamp' is true a nonce is not generated and the value in the configuration will be retained. * * @return void value is stored to the config array class variable */ private function create_timestamp() { $this->config['timestamp'] = ($this->config['force_timestamp'] == false ? time() : $this->config['timestamp']); } /** * Encodes the string or array passed in a way compatible with OAuth. * If an array is passed each array value will will be encoded. * * @param mixed $data the scalar or array to encode * @return $data encoded in a way compatible with OAuth */ private function safe_encode($data) { if (is_array($data)) { return array_map(array($this, 'safe_encode'), $data); } else if (is_scalar($data)) { return str_ireplace( array('+', '%7E'), array(' ', '~'), rawurlencode($data) ); } else { return ''; } } /** * Decodes the string or array from it's URL encoded form * If an array is passed each array value will will be decoded. * * @param mixed $data the scalar or array to decode * @return string $data decoded from the URL encoded form */ private function safe_decode($data) { if (is_array($data)) { return array_map(array($this, 'safe_decode'), $data); } else if (is_scalar($data)) { return rawurldecode($data); } else { return ''; } } /** * Returns an array of the standard OAuth parameters. * * @return array all required OAuth parameters, safely encoded */ private function get_defaults() { $defaults = array( 'oauth_version' => $this->config['oauth_version'], 'oauth_nonce' => $this->config['nonce'], 'oauth_timestamp' => $this->config['timestamp'], 'oauth_consumer_key' => $this->config['consumer_key'], 'oauth_signature_method' => $this->config['oauth_signature_method'], ); // include the user token if it exists if ( $this->config['user_token'] ) $defaults['oauth_token'] = $this->config['user_token']; // safely encode foreach ($defaults as $k => $v) { $_defaults[$this->safe_encode($k)] = $this->safe_encode($v); } return $_defaults; } /** * Extracts and decodes OAuth parameters from the passed string * * @param string $body the response body from an OAuth flow method * @return array the response body safely decoded to an array of key => values */ public function extract_params($body) { $kvs = explode('&', $body); $decoded = array(); foreach ($kvs as $kv) { $kv = explode('=', $kv, 2); $kv[0] = $this->safe_decode($kv[0]); $kv[1] = $this->safe_decode($kv[1]); $decoded[$kv[0]] = $kv[1]; } return $decoded; } /** * Prepares the HTTP method for use in the base string by converting it to * uppercase. * * @param string $method an HTTP method such as GET or POST * @return void value is stored to the class variable 'method' */ private function prepare_method($method) { $this->method = strtoupper($method); } /** * Prepares the URL for use in the base string by ripping it apart and * reconstructing it. * * Ref: 3.4.1.2 * * @param string $url the request URL * @return void value is stored to the class variable 'url' */ private function prepare_url($url) { $parts = parse_url($url); $port = isset($parts['port']) ? $parts['port'] : false; $scheme = $parts['scheme']; $host = $parts['host']; $path = isset($parts['path']) ? $parts['path'] : false; $port or $port = ($scheme == 'https') ? '443' : '80'; if (($scheme == 'https' && $port != '443') || ($scheme == 'http' && $port != '80')) { $host = "$host:$port"; } // the scheme and host MUST be lowercase $this->url = strtolower("$scheme://$host"); // but not the path $this->url .= $path; } /** * Prepares all parameters for the base string and request. * Multipart parameters are ignored as they are not defined in the specification, * all other types of parameter are encoded for compatibility with OAuth. * * @param array $params the parameters for the request * @return void prepared values are stored in the class variable 'signing_params' */ private function prepare_params($params) { // do not encode multipart parameters, leave them alone if ($this->config['multipart']) { $this->request_params = $params; $params = array(); } // signing parameters are request parameters + OAuth default parameters $this->signing_params = array_merge($this->get_defaults(), (array)$params); // Remove oauth_signature if present // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") if (isset($this->signing_params['oauth_signature'])) { unset($this->signing_params['oauth_signature']); } // Parameters are sorted by name, using lexicographical byte value ordering. // Ref: Spec: 9.1.1 (1) uksort($this->signing_params, 'strcmp'); // encode. Also sort the signed parameters from the POST parameters foreach ($this->signing_params as $k => $v) { $k = $this->safe_encode($k); if (is_array($v)) $v = implode(',', $v); $v = $this->safe_encode($v); $_signing_params[$k] = $v; $kv[] = "{$k}={$v}"; } // auth params = the default oauth params which are present in our collection of signing params $this->auth_params = array_intersect_key($this->get_defaults(), $_signing_params); if (isset($_signing_params['oauth_callback'])) { $this->auth_params['oauth_callback'] = $_signing_params['oauth_callback']; unset($_signing_params['oauth_callback']); } if (isset($_signing_params['oauth_verifier'])) { $this->auth_params['oauth_verifier'] = $_signing_params['oauth_verifier']; unset($_signing_params['oauth_verifier']); } // request_params is already set if we're doing multipart, if not we need to set them now if ( ! $this->config['multipart']) $this->request_params = array_diff_key($_signing_params, $this->get_defaults()); // create the parameter part of the base string $this->signing_params = implode('&', $kv); } /** * Prepares the OAuth signing key * * @return void prepared signing key is stored in the class variable 'signing_key' */ private function prepare_signing_key() { $this->signing_key = $this->safe_encode($this->config['consumer_secret']) . '&' . $this->safe_encode($this->config['user_secret']); } /** * Prepare the base string. * Ref: Spec: 9.1.3 ("Concatenate Request Elements") * * @return void prepared base string is stored in the class variable 'base_string' */ private function prepare_base_string() { $url = $this->url; # if the host header is set we need to rewrite the basestring to use # that, instead of the request host. otherwise the signature won't match # on the server side if (!empty($this->custom_headers['Host'])) { $url = str_ireplace( $this->config['host'], $this->custom_headers['Host'], $url ); } $base = array( $this->method, $url, $this->signing_params ); $this->base_string = implode('&', $this->safe_encode($base)); } /** * Prepares the Authorization header * * @return void prepared authorization header is stored in the class variable headers['Authorization'] */ private function prepare_auth_header() { unset($this->headers['Authorization']); uksort($this->auth_params, 'strcmp'); if (!$this->config['as_header']) : $this->request_params = array_merge($this->request_params, $this->auth_params); return; endif; foreach ($this->auth_params as $k => $v) { $kv[] = "{$k}=\"{$v}\""; } $this->auth_header = 'OAuth ' . implode(', ', $kv); $this->headers['Authorization'] = $this->auth_header; } /** * Signs the request and adds the OAuth signature. This runs all the request * parameter preparation methods. * * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc * @param string $url the request URL without query string parameters * @param array $params the request parameters as an array of key=value pairs * @param string $useauth whether to use authentication when making the request. * @return void */ private function sign($method, $url, $params, $useauth) { $this->prepare_method($method); $this->prepare_url($url); $this->prepare_params($params); // we don't sign anything is we're not using auth if ($useauth) { $this->prepare_base_string(); $this->prepare_signing_key(); $this->auth_params['oauth_signature'] = $this->safe_encode( base64_encode( hash_hmac( 'sha1', $this->base_string, $this->signing_key, true ))); $this->prepare_auth_header(); } } /** * Make an HTTP request using this library. This method doesn't return anything. * Instead the response should be inspected directly. * * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc * @param string $url the request URL without query string parameters * @param array $params the request parameters as an array of key=value pairs. Default empty array * @param string $useauth whether to use authentication when making the request. Default true * @param string $multipart whether this request contains multipart data. Default false * @param array $headers any custom headers to send with the request. Default empty array * @return int the http response code for the request. 0 is returned if a connection could not be made */ public function request($method, $url, $params=array(), $useauth=true, $multipart=false, $headers=array()) { // reset the request headers (we don't want to reuse them) $this->headers = array(); $this->custom_headers = $headers; $this->config['multipart'] = $multipart; $this->create_nonce(); $this->create_timestamp(); $this->sign($method, $url, $params, $useauth); if (!empty($this->custom_headers)) $this->headers = array_merge((array)$this->headers, (array)$this->custom_headers); return $this->curlit(); } /** * Make a long poll HTTP request using this library. This method is * different to the other request methods as it isn't supposed to disconnect * * Using this method expects a callback which will receive the streaming * responses. * * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc * @param string $url the request URL without query string parameters * @param array $params the request parameters as an array of key=value pairs * @param string $callback the callback function to stream the buffer to. * @return void */ public function streaming_request($method, $url, $params=array(), $callback='') { if ( ! empty($callback) ) { if ( ! is_callable($callback) ) { return false; } $this->config['streaming_callback'] = $callback; } $this->metrics['start'] = time(); $this->metrics['interval_start'] = $this->metrics['start']; $this->metrics['tweets'] = 0; $this->metrics['last_tweets'] = 0; $this->metrics['bytes'] = 0; $this->metrics['last_bytes'] = 0; $this->config['is_streaming'] = true; $this->request($method, $url, $params); } /** * Handles the updating of the current Streaming API metrics. * * @return array the metrics for the streaming api connection */ private function update_metrics() { $now = time(); if (($this->metrics['interval_start'] + $this->config['streaming_metrics_interval']) > $now) return false; $this->metrics['tps'] = round( ($this->metrics['tweets'] - $this->metrics['last_tweets']) / $this->config['streaming_metrics_interval'], 2); $this->metrics['bps'] = round( ($this->metrics['bytes'] - $this->metrics['last_bytes']) / $this->config['streaming_metrics_interval'], 2); $this->metrics['last_bytes'] = $this->metrics['bytes']; $this->metrics['last_tweets'] = $this->metrics['tweets']; $this->metrics['interval_start'] = $now; return $this->metrics; } /** * Utility function to create the request URL in the requested format * * @param string $request the API method without extension * @param string $format the format of the response. Default json. Set to an empty string to exclude the format * @return string the concatenation of the host, API version, API method and format */ public function url($request, $format='json') { $format = strlen($format) > 0 ? ".$format" : ''; $proto = $this->config['use_ssl'] ? 'https:/' : 'http:/'; // backwards compatibility with v0.1 if (isset($this->config['v'])) $this->config['host'] = $this->config['host'] . '/' . $this->config['v']; $request = ltrim($request, '/'); $pos = strlen($request) - strlen($format); if (substr($request, $pos) === $format) $request = substr_replace($request, '', $pos); return implode('/', array( $proto, $this->config['host'], $request . $format )); } /** * Public access to the private safe decode/encode methods * * @param string $text the text to transform * @param string $mode the transformation mode. either encode or decode * @return string $text transformed by the given $mode */ public function transformText($text, $mode='encode') { return $this->{"safe_$mode"}($text); } /** * Utility function to parse the returned curl headers and store them in the * class array variable. * * @param object $ch curl handle * @param string $header the response headers * @return string the length of the header */ private function curlHeader($ch, $header) { $this->response['raw'] .= $header; list($key, $value) = array_pad(explode(':', $header, 2), 2, null); $key = trim($key); $value = trim($value); if ( ! isset($this->response['headers'][$key])) { $this->response['headers'][$key] = $value; } else { if (!is_array($this->response['headers'][$key])) { $this->response['headers'][$key] = array($this->response['headers'][$key]); } $this->response['headers'][$key][] = $value; } return strlen($header); } /** * Utility function to parse the returned curl buffer and store them until * an EOL is found. The buffer for curl is an undefined size so we need * to collect the content until an EOL is found. * * This function calls the previously defined streaming callback method. * * @param object $ch curl handle * @param string $data the current curl buffer * @return int the length of the data string processed in this function */ private function curlWrite($ch, $data) { $l = strlen($data); if (strpos($data, $this->config['streaming_eol']) === false) { $this->buffer .= $data; return $l; } $buffered = explode($this->config['streaming_eol'], $data); $content = $this->buffer . $buffered[0]; $this->metrics['tweets']++; $this->metrics['bytes'] += strlen($content); if ( ! is_callable($this->config['streaming_callback'])) return 0; $metrics = $this->update_metrics(); $stop = call_user_func( $this->config['streaming_callback'], $content, strlen($content), $metrics ); $this->buffer = $buffered[1]; if ($stop) return 0; return $l; } /** * Makes a curl request. Takes no parameters as all should have been prepared * by the request method * * the response data is stored in the class variable 'response' * * @return int the http response code for the request. 0 is returned if a connection could not be made */ private function curlit() { $this->response['raw'] = ''; // method handling switch ($this->method) { case 'POST': break; default: // GET, DELETE request so convert the parameters to a querystring if ( ! empty($this->request_params)) { foreach ($this->request_params as $k => $v) { // Multipart params haven't been encoded yet. // Not sure why you would do a multipart GET but anyway, here's the support for it if ($this->config['multipart']) { $params[] = $this->safe_encode($k) . '=' . $this->safe_encode($v); } else { $params[] = $k . '=' . $v; } } $qs = implode('&', $params); $this->url = strlen($qs) > 0 ? $this->url . '?' . $qs : $this->url; $this->request_params = array(); } break; } // configure curl $c = curl_init(); curl_setopt_array($c, array( CURLOPT_USERAGENT => $this->config['user_agent'], CURLOPT_CONNECTTIMEOUT => $this->config['curl_connecttimeout'], CURLOPT_TIMEOUT => $this->config['curl_timeout'], CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => $this->config['curl_ssl_verifypeer'], CURLOPT_SSL_VERIFYHOST => $this->config['curl_ssl_verifyhost'], CURLOPT_FOLLOWLOCATION => $this->config['curl_followlocation'], CURLOPT_PROXY => $this->config['curl_proxy'], CURLOPT_ENCODING => $this->config['curl_encoding'], CURLOPT_URL => $this->url, // process the headers CURLOPT_HEADERFUNCTION => array($this, 'curlHeader'), CURLOPT_HEADER => false, CURLINFO_HEADER_OUT => true, )); if ($this->config['curl_cainfo'] !== false) curl_setopt($c, CURLOPT_CAINFO, $this->config['curl_cainfo']); if ($this->config['curl_capath'] !== false) curl_setopt($c, CURLOPT_CAPATH, $this->config['curl_capath']); if ($this->config['curl_proxyuserpwd'] !== false) curl_setopt($c, CURLOPT_PROXYUSERPWD, $this->config['curl_proxyuserpwd']); if ($this->config['is_streaming']) { // process the body $this->response['content-length'] = 0; curl_setopt($c, CURLOPT_TIMEOUT, 0); curl_setopt($c, CURLOPT_WRITEFUNCTION, array($this, 'curlWrite')); } switch ($this->method) { case 'GET': break; case 'POST': curl_setopt($c, CURLOPT_POST, true); curl_setopt($c, CURLOPT_POSTFIELDS, $this->request_params); break; default: curl_setopt($c, CURLOPT_CUSTOMREQUEST, $this->method); } if ( ! empty($this->request_params) ) { // if not doing multipart we need to implode the parameters if ( ! $this->config['multipart'] ) { foreach ($this->request_params as $k => $v) { $ps[] = "{$k}={$v}"; } $this->request_params = implode('&', $ps); } curl_setopt($c, CURLOPT_POSTFIELDS, $this->request_params); } if ( ! empty($this->headers)) { foreach ($this->headers as $k => $v) { $headers[] = trim($k . ': ' . $v); } curl_setopt($c, CURLOPT_HTTPHEADER, $headers); } if (isset($this->config['prevent_request']) && (true == $this->config['prevent_request'])) return 0; // do it! $response = curl_exec($c); $code = curl_getinfo($c, CURLINFO_HTTP_CODE); $info = curl_getinfo($c); $error = curl_error($c); $errno = curl_errno($c); curl_close($c); // store the response $this->response['code'] = $code; $this->response['response'] = $response; $this->response['info'] = $info; $this->response['error'] = $error; $this->response['errno'] = $errno; if (!isset($this->response['raw'])) { $this->response['raw'] = ''; } $this->response['raw'] .= $response; return $code; } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/libraries/tmhOAuth/tmhUtilities.php000066400000000000000000000220771361462701300272560ustar00rootroot00000000000000 'UTF-8', 'target' => '', ); $opts = array_merge($default_opts, $options); $encoding = mb_internal_encoding(); mb_internal_encoding($opts['encoding']); $keys = array(); $is_retweet = false; if (isset($tweet['retweeted_status'])) { $tweet = $tweet['retweeted_status']; $is_retweet = true; } if (!isset($tweet['entities'])) { return $tweet['text']; } $target = (!empty($opts['target'])) ? ' target="'.$opts['target'].'"' : ''; // prepare the entities foreach ($tweet['entities'] as $type => $things) { foreach ($things as $entity => $value) { $tweet_link = "{$tweet['created_at']}"; switch ($type) { case 'hashtags': $href = "#{$value['text']}"; break; case 'user_mentions': $href = "@{$value['screen_name']}"; break; case 'urls': case 'media': $url = empty($value['expanded_url']) ? $value['url'] : $value['expanded_url']; $display = isset($value['display_url']) ? $value['display_url'] : str_replace('http://', '', $url); // Not all pages are served in UTF-8 so you may need to do this ... $display = urldecode(str_replace('%E2%80%A6', '…', urlencode($display))); $href = "{$display}"; break; } $keys[$value['indices']['0']] = mb_substr( $tweet['text'], $value['indices']['0'], $value['indices']['1'] - $value['indices']['0'] ); $replacements[$value['indices']['0']] = $href; } } ksort($replacements); $replacements = array_reverse($replacements, true); $entified_tweet = $tweet['text']; foreach ($replacements as $k => $v) { $entified_tweet = mb_substr($entified_tweet, 0, $k).$v.mb_substr($entified_tweet, $k + strlen($keys[$k])); } $replacements = array( 'replacements' => $replacements, 'keys' => $keys ); mb_internal_encoding($encoding); return $entified_tweet; } /** * Returns the current URL. This is instead of PHP_SELF which is unsafe * * @param bool $dropqs whether to drop the querystring or not. Default true * @return string the current URL */ public static function php_self($dropqs=true) { $protocol = 'http'; if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') { $protocol = 'https'; } elseif (isset($_SERVER['SERVER_PORT']) && ($_SERVER['SERVER_PORT'] == '443')) { $protocol = 'https'; } $url = sprintf('%s://%s%s', $protocol, $_SERVER['SERVER_NAME'], $_SERVER['REQUEST_URI'] ); $parts = parse_url($url); $port = $_SERVER['SERVER_PORT']; $scheme = $parts['scheme']; $host = $parts['host']; $path = @$parts['path']; $qs = @$parts['query']; $port or $port = ($scheme == 'https') ? '443' : '80'; if (($scheme == 'https' && $port != '443') || ($scheme == 'http' && $port != '80')) { $host = "$host:$port"; } $url = "$scheme://$host$path"; if ( ! $dropqs) return "{$url}?{$qs}"; else return $url; } public static function is_cli() { return (PHP_SAPI == 'cli' && empty($_SERVER['REMOTE_ADDR'])); } /** * Debug function for printing the content of an object * * @param mixes $obj */ public static function pr($obj) { if (!self::is_cli()) echo '
';
    if ( is_object($obj) )
      print_r($obj);
    elseif ( is_array($obj) )
      print_r($obj);
    else
      echo $obj;
    if (!self::is_cli())
      echo '
'; } /** * Make an HTTP request using this library. This method is different to 'request' * because on a 401 error it will retry the request. * * When a 401 error is returned it is possible the timestamp of the client is * too different to that of the API server. In this situation it is recommended * the request is retried with the OAuth timestamp set to the same as the API * server. This method will automatically try that technique. * * This method doesn't return anything. Instead the response should be * inspected directly. * * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc * @param string $url the request URL without query string parameters * @param array $params the request parameters as an array of key=value pairs * @param string $useauth whether to use authentication when making the request. Default true. * @param string $multipart whether this request contains multipart data. Default false */ public static function auto_fix_time_request($tmhOAuth, $method, $url, $params=array(), $useauth=true, $multipart=false) { $tmhOAuth->request($method, $url, $params, $useauth, $multipart); // if we're not doing auth the timestamp isn't important if ( ! $useauth) return; // some error that isn't a 401 if ($tmhOAuth->response['code'] != 401) return; // some error that is a 401 but isn't because the OAuth token and signature are incorrect // TODO: this check is horrid but helps avoid requesting twice when the username and password are wrong if (stripos($tmhOAuth->response['response'], 'password') !== false) return; // force the timestamp to be the same as the Twitter servers, and re-request $tmhOAuth->auto_fixed_time = true; $tmhOAuth->config['force_timestamp'] = true; $tmhOAuth->config['timestamp'] = strtotime($tmhOAuth->response['headers']['date']); return $tmhOAuth->request($method, $url, $params, $useauth, $multipart); } /** * Asks the user for input and returns the line they enter * * @param string $prompt the text to display to the user * @return the text entered by the user */ public static function read_input($prompt) { echo $prompt; $handle = fopen("php://stdin","r"); $data = fgets($handle); return trim($data); } /** * Get a password from the shell. * * This function works on *nix systems only and requires shell_exec and stty. * * @param boolean $stars Wether or not to output stars for given characters * @return string * @url http://www.dasprids.de/blog/2008/08/22/getting-a-password-hidden-from-stdin-with-php-cli */ public static function read_password($prompt, $stars=false) { echo $prompt; $style = shell_exec('stty -g'); if ($stars === false) { shell_exec('stty -echo'); $password = rtrim(fgets(STDIN), "\n"); } else { shell_exec('stty -icanon -echo min 1 time 0'); $password = ''; while (true) : $char = fgetc(STDIN); if ($char === "\n") : break; elseif (ord($char) === 127) : if (strlen($password) > 0) { fwrite(STDOUT, "\x08 \x08"); $password = substr($password, 0, -1); } else fwrite(STDOUT, "*"); $password .= $char; endif; endwhile; } // Reset shell_exec('stty ' . $style); echo PHP_EOL; return $password; } /** * Check if one string ends with another * * @param string $haystack the string to check inside of * @param string $needle the string to check $haystack ends with * @return true if $haystack ends with $needle, false otherwise */ public static function endswith($haystack, $needle) { $haylen = strlen($haystack); $needlelen = strlen($needle); if ($needlelen > $haylen) return false; return substr_compare($haystack, $needle, -$needlelen) === 0; } }rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/000077500000000000000000000000001361462701300230345ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/README000066400000000000000000000000641361462701300237140ustar00rootroot00000000000000https://www.transifex.com/rainloop/rainloop-webmail/rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/000077500000000000000000000000001361462701300241245ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/README000066400000000000000000000000641361462701300250040ustar00rootroot00000000000000https://www.transifex.com/rainloop/rainloop-webmail/rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/_source.en.yml000066400000000000000000000346651361462701300267250ustar00rootroot00000000000000en: LOGIN: LABEL_LOGIN: "Login" LABEL_PASSWORD: "Password" BUTTON_LOGIN: "Log into the admin panel" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Admin Panel" TABS_LABELS: LABEL_GENERAL_NAME: "General" LABEL_LOGIN_NAME: "Login" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Contacts" LABEL_DOMAINS_NAME: "Domains" LABEL_SECURITY_NAME: "Security" LABEL_INTEGRATION_NAME: "Integrations" LABEL_PLUGINS_NAME: "Plugins" LABEL_PACKAGES_NAME: "Packages" LABEL_LICENSING_NAME: "Licensing" LABEL_ABOUT_NAME: "About" TAB_GENERAL: LEGEND_INTERFACE: "Interface" LABEL_LANGUAGE: "Language" LABEL_LANGUAGE_ADMIN: "Language (admin)" LABEL_THEME: "Theme" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Allow language selection on settings screen" LABEL_ALLOW_THEMES_ON_SETTINGS: "Allow theme selection on settings screen" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" LABEL_NEW_FOLDER_MOVE: "New \"move to folder\" button" LABEL_SHOW_THUMBNAILS: "Show thumbnails (attachments)" LABEL_ALLOW_GRAVATAR: "Allow Gravatar" LEGEND_MAIN: "Main" LABEL_ATTACHMENT_SIZE_LIMIT: "Attachment size limit" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Allow additional accounts" LABEL_ALLOW_IDENTITIES: "Allow multiple identities" LABEL_ALLOW_TEMPLATES: "Allow templates" ALERT_DATA_ACCESS: "RainLoop data folder is accessible. Please configure your web server to hide the data folder from external access. Read more here:" ALERT_WARNING: "Warning!" HTML_ALERT_WEAK_PASSWORD: | You are using the default admin password.
For security reasons please change password to something else now. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Login Screen" LABEL_DEFAULT_DOMAIN: "Default Domain" LABEL_DETERMINE_USER_DOMAIN: "Try to determine user domain" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Allow language selection on login screen" LABEL_DETERMINE_USER_LANGUAGE: "Try to determine user language" TAB_BRANDING: LEGEND_BRANDING: "Branding" LABEL_PAGE_TITLE: "Page Title" LABEL_LOADING_DESCRIPTION: "Loading Description" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Login" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Description" LABEL_LOGIN_BACKGROUND: "Background" LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Show \"Powered by RainLoop\" link" LEGEND_USER: "User" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logo Title" LABEL_USER_LOGO_MESSAGE: "Logo (Message View)" LABEL_USER_CUSTOM_CSS: "Custom CSS" LEGEND_WELCOME_PAGE: "Welcome page" LABEL_WELCOME_PAGE_TITLE: "Title" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Display" OPTION_WELCOME_PAGE_DISPLAY_NONE: "None" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Once" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Always" HTML_ALERT_PREMIUM: "This functionality is available for Premium subscribers." TAB_CONTACTS: LEGEND_CONTACTS: "Contacts" LEGEND_STORAGE: "Storage (PDO)" LABEL_ENABLE_CONTACTS: "Enable contacts" LABEL_ALLOW_SYNC: "Allow contacts sync (with external CardDAV server)" LABEL_STORAGE_TYPE: "Type" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "User" LABEL_STORAGE_PASSWORD: "Password" BUTTON_TEST: "Test" ALERT_NOTICE: "Notice!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." HTML_ALERT_DOES_NOT_SUPPORTED: | Your system doesn't support contacts.
You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. TAB_DOMAINS: LEGEND_DOMAINS: "Domains" BUTTON_ADD_DOMAIN: "Add Domain" BUTTON_ADD_ALIAS: "Add Alias" DELETE_ARE_YOU_SURE: "Are you sure?" HTML_DOMAINS_HELPER: | List of domains webmail is allowed to access.
Click on the name to configure the domain. TAB_SECURITY: LEGEND_SECURITY: "Security" LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" LABEL_FORCE_TWO_STEP: "Enforce 2-Step Verification" LABEL_USE_IMAGE_PROXY: "Use local proxy for external images" LABEL_ALLOW_OPEN_PGP: "Allow OpenPGP" LABEL_SHOW_PHP_INFO: "Show PHP information" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" LABEL_CURRENT_PASSWORD: "Current password" LABEL_NEW_LOGIN: "New login" LABEL_NEW_PASSWORD: "New password" LABEL_REPEAT_PASSWORD: "Repeat" BUTTON_UPDATE_PASSWORD: "Update Password" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Require verification of SSL certificate used (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Allow self signed certificates" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Enable Google Integration" LABEL_GOOGLE_AUTH: "Authorization" LABEL_GOOGLE_AUTH_GMAIL: "Authorization (Gmail)" LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Api Key" HINT_GOOGLE_API_KEY: "Required for Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Enable Facebook Integration (Authorization)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Enable Twitter Integration (Authorization)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Enable Dropbox Integration" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "Detailed information on social integration is found at" TAB_PLUGINS: LEGEND_PLUGINS: "Plugins" LABEL_ENABLE_PLUGINS: "Enable plugins" ALERT_NO_PLUGINS: "No plugins have yet been installed." LINK_INSTALL_NEW: "Click here to install new!" HINT_CLICK_NAME: "Click on the name to configure the plugin." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Available for Update" LEGEND_AVAILABLE_FOR_INSTALLATION: "Available for Installation" LEGEND_INSTALLED_PACKAGES: "Installed Packages" ALERT_CANNOT_ACCESS_REPOSITORY: "Cannot access the repository at the moment." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Your domain" LABEL_VERSION: "Version" LABEL_CHECKING: "Checking" TYPE_BASIC_HINT: "This domain isn't licensed for commercial use (with additional features)." TYPE_BASIC_HINT_2: "This domain can't be licensed." HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" HTML_ALERT_TOP_2: "You are free to use it for your personal projects." HTML_ALERT_TOP_3: | Commercial use (with additional features) of RainLoop Webmail requires getting a subscription. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "Subscription expires" BUTTON_ACTIVATE: "Activate Subscription Key for this domain" BUTTON_PURCHASE: "Purchase" BUTTON_TRIAL: "Trial" TAB_ABOUT: LEGEND_ABOUT: "About" LABEL_TAG_HINT: "Simple, modern & fast web-based email client" LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." HINT_READ_CHANGE_LOG: "Please read the change log before updating." HINT_IS_UP_TO_DATE: "RainLoop is up to date." HTML_NEW_VERSION: "New %VERSION% version is available." LABEL_UPDATING: "Updating" LABEL_CHECKING: "Checking for updates" BUTTON_UPDATE: "Update" BUTTON_DOWNLOAD: "Download" BUTTON_CHANGELOG: "Changelog" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Activate Subscription Key?" TITLE_ACTIVATION: "Activation..." LABEL_DOMAIN: "Domain" LABEL_SUB_KEY: "Subscription Key" BUTTON_ACTIVATE: "Activate" LABEL_ACTIVATED: "Activated" ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" HTML_DESC: | After activation, premium subscription for %DOMAIN% will be extended.
Note that subscription key can be activated for a single domain only.

Once started, the process of activation cannot be aborted or cancelled. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Add Alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domain" BUTTON_CLOSE: "Close" BUTTON_ADD: "Add" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Add Domain" TITLE_ADD_DOMAIN_WITH_NAME: "Add Domain \"%NAME%\"" TITLE_EDIT_DOMAIN: "Edit Domain \"%NAME%\"" LABEL_NAME: "Name" NAME_HELPER: "wildcard supported" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Secure" LABEL_WHITE_LIST: "White List" SECURE_OPTION_NONE: "None" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Allow sieve scripts" LABEL_ALLOW_USER_SCRIPT: "Allow custom user script" LABEL_USE_SHORT_LOGIN: "Use short login" LABEL_USE_AUTH: "Use authentication" LABEL_USE_PHP_MAIL: "Use php mail() function" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "White List" BUTTON_SIEVE_CONFIGURATION: "Sieve configuration" BUTTON_BACK_TO_IMAP: "Back to IMAP settings" BUTTON_BACK: "Back" BUTTON_CLOSE: "Close" BUTTON_ADD: "Add" BUTTON_UPDATE: "Update" NEW_DOMAIN_DESC: "This domain configuration will allow you to work
with %NAME% email addresses." WHITE_LIST_ALERT: | List of domain users webmail is allowed to access. Use a space as delimiter. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" BUTTON_CLOSE: "Close" BUTTON_SAVE: "Save" TOOLTIP_ABOUT_TITLE: "About" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choose your language" HINTS: BETA: "beta" UNSTABLE: "unstable" WARNING: "Warning!" NOT_SUPPORTED: "not supported" REQUIRES_PHP_54: "requires PHP 5.4 or greater" ERRORS: DOMAIN_ALREADY_EXISTS: "Domain already exists" UNKNOWN_ERROR: "Unknown error" NOTIFICATIONS: INVALID_TOKEN: "Invalid token" AUTH_ERROR: "Authentication failed" ACCESS_ERROR: "Access error" CONNECTION_ERROR: "Can't connect to server" CAPTCHA_ERROR: "Incorrect CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "Domain is not allowed" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Can't get message list" CANT_GET_MESSAGE: "Can't get message" CANT_DELETE_MESSAGE: "Can't delete message" CANT_MOVE_MESSAGE: "Can't move message" CANT_SAVE_MESSAGE: "Can't save message" CANT_SEND_MESSAGE: "Can't send message" INVALID_RECIPIENTS: "Invalid recipients" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Can't create folder" CANT_RENAME_FOLDER: "Can't rename folder" CANT_DELETE_FOLDER: "Can't delete folder" CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" CANT_SAVE_SETTINGS: "Can't save settings" CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" DOMAIN_ALREADY_EXISTS: "Domain already exists" CANT_INSTALL_PACKAGE: "Failed to install package" CANT_DELETE_PACKAGE: "Failed to remove package" INVALID_PLUGIN_PACKAGE: "Invalid plugin package" UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Account already exists" ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" MAIL_SERVER_ERROR: "An error has occured while accessing mail server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Unknown error" STATIC: BACK_LINK: "Reload" DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | JavaScript support is not available in your browser. Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | To use all the features of the application, download and install one of these browsers: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml000066400000000000000000000364161361462701300256620ustar00rootroot00000000000000cs_CZ: LOGIN: LABEL_LOGIN: "Login" LABEL_PASSWORD: "Heslo" BUTTON_LOGIN: "Přihlásit do administrace" TOP_PANEL: LABEL_PREMIUM: "Prémium" LABEL_ADMIN_PANEL: "Administrační panel" TABS_LABELS: LABEL_GENERAL_NAME: "Základní" LABEL_LOGIN_NAME: "Login" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Kontakty" LABEL_DOMAINS_NAME: "Domény" LABEL_SECURITY_NAME: "Zabezpečení" LABEL_INTEGRATION_NAME: "Integrace" LABEL_PLUGINS_NAME: "Pluginy" LABEL_PACKAGES_NAME: "Balíčky" LABEL_LICENSING_NAME: "Licence" LABEL_ABOUT_NAME: "Info" TAB_GENERAL: LEGEND_INTERFACE: "Rozhraní" LABEL_LANGUAGE: "Jazyk" LABEL_LANGUAGE_ADMIN: "Jazyk (administrace)" LABEL_THEME: "Motiv" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Povolit výběr jazyka na přihlašovací obrazovce" LABEL_ALLOW_THEMES_ON_SETTINGS: "Povolit výběr motivu na přihlašovací obrazovce" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Povolit výběr pozadí na přihlašovací obrazovce" LABEL_NEW_FOLDER_MOVE: "Nové tlačítko \"přesunout do adresáře\"" LABEL_SHOW_THUMBNAILS: "Zobrazovat miniatury (přílohy)" LABEL_ALLOW_GRAVATAR: "Povolit Gravatar" LEGEND_MAIN: "Hlavní" LABEL_ATTACHMENT_SIZE_LIMIT: "Limit velikosti přílohy" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Povolit přidávat další účty" LABEL_ALLOW_IDENTITIES: "Povolit další identity" LABEL_ALLOW_TEMPLATES: "Povolit šablony" ALERT_DATA_ACCESS: "Adresář s RainLoop daty je veřejně přístupný. Nakonfigurujte prosím webový server tak, aby skryl adresář data z externího přístupu. Více zde:" ALERT_WARNING: "Upozornění!" HTML_ALERT_WEAK_PASSWORD: | Používáte výchozí administrátorské heslo.
Z bezpečnostních důvodů jej prosím změnte. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Přihlašovací obrazovka" LABEL_DEFAULT_DOMAIN: "Výchozí doména" LABEL_DETERMINE_USER_DOMAIN: "Zkoušet odvodit doménu z uživatelského jména" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Povolit výběr jazyka na přihlašovací obrazovce" LABEL_DETERMINE_USER_LANGUAGE: "Zkoušet odvodit jazyk pro uživatele" TAB_BRANDING: LEGEND_BRANDING: "Branding" LABEL_PAGE_TITLE: "Nadpis stránky" LABEL_LOADING_DESCRIPTION: "Načítání popisu" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Login" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Popis" LABEL_LOGIN_BACKGROUND: "Pozadí" LABEL_LOGIN_CUSTOM_CSS: "Vlastní CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Zobrazovat \"Powered by RainLoop\" odkaz" LEGEND_USER: "Uživatel" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Popis loga" LABEL_USER_LOGO_MESSAGE: "Logo (detail zprávy)" LABEL_USER_CUSTOM_CSS: "Vlastní CSS" LEGEND_WELCOME_PAGE: "Uvítací stránka" LABEL_WELCOME_PAGE_TITLE: "Nadpis" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Zobrazení" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nikdy" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Jednou" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vždy" HTML_ALERT_PREMIUM: "Tato funkce je dostupná pouze pro Prémiovou verzi." TAB_CONTACTS: LEGEND_CONTACTS: "Kontakty" LEGEND_STORAGE: "Úložiště (PDO)" LABEL_ENABLE_CONTACTS: "Povolit kontakty" LABEL_ALLOW_SYNC: "Povolit synchronizaci kontaktů (přes externí CardDAV server)" LABEL_STORAGE_TYPE: "Typ" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Uživatel" LABEL_STORAGE_PASSWORD: "Heslo" BUTTON_TEST: "Test" ALERT_NOTICE: "Upozornění!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nepoužívejte tento typ databáze při velkém počtu aktivních uživatelů." HTML_ALERT_DOES_NOT_SUPPORTED: | Váš systém nepodporuje kontakty.
Je potřeba nainstalovat nebo povolit PDO (SQLite / MySQL / PostgreSQL) rozšíření na vašem serveru. TAB_DOMAINS: LEGEND_DOMAINS: "Domény" BUTTON_ADD_DOMAIN: "Přidat Doménu" BUTTON_ADD_ALIAS: "Přidat alias" DELETE_ARE_YOU_SURE: "Jste si jistí?" HTML_DOMAINS_HELPER: | Seznam domén, ke kterým je možné přistupovat přes webmail.
KliknÄ›te na jmĂ©no domĂ©ny pro jejĂ­ konfiguraci. TAB_SECURITY: LEGEND_SECURITY: "ZabezpeÄŤenĂ­" LABEL_ALLOW_TWO_STEP: "Povolit dvoufázovĂ© ověřenĂ­" LABEL_FORCE_TWO_STEP: "Vynucovat dvoufázovĂ© ověřenĂ­" LABEL_USE_IMAGE_PROXY: "Použít lokálnĂ­ proxy pro externĂ­ obrázky" LABEL_ALLOW_OPEN_PGP: "Povolit OpenPGP" LABEL_SHOW_PHP_INFO: "Zobrazit PHP informace (php_info)" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "PřístupovĂ© Ăşdaje administrace" LABEL_CURRENT_PASSWORD: "SouÄŤasnĂ© heslo" LABEL_NEW_LOGIN: "NovĂ˝ login" LABEL_NEW_PASSWORD: "NovĂ© heslo" LABEL_REPEAT_PASSWORD: "Znovu" BUTTON_UPDATE_PASSWORD: "Aktualizovat heslo" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "VyĹľadovat ověřenĂ­ SSL certifikátu (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Povolit self-signed certifikáty" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Povolit Google integraci" LABEL_GOOGLE_AUTH: "Autorizace" LABEL_GOOGLE_DRIVE: "Google Drive integrace (PsanĂ­ zpráv)" LABEL_GOOGLE_PREVIEW: "Google Viewer integrace (náhled pro Microsoft Word, Excel a PowerPoint soubory)" LABEL_GOOGLE_CLIENT_ID: "Klient ID" LABEL_GOOGLE_CLIENT_SECRET: "Klient Secret" LABEL_GOOGLE_API_KEY: "Api klĂ­ÄŤ" HINT_GOOGLE_API_KEY: "VyĹľadováno pro Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Povolit Facebook integraci (Autorizaci)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Povolit Twitter integraci (Autorizaci)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Povolit Dropbox integraci" LABEL_DROPBOX_API_KEY: "Api klĂ­ÄŤ" TOP_ALERT: "DetailnĂ­ informace o integraci sociálnĂ­ch sĂ­tĂ­ jsou dostupnĂ© na adrese" TAB_PLUGINS: LEGEND_PLUGINS: "Pluginy" LABEL_ENABLE_PLUGINS: "Povolit pluginy" ALERT_NO_PLUGINS: "ŽádnĂ© pluginy zatĂ­m nebyly nainstalovány." LINK_INSTALL_NEW: "KliknÄ›te zde pro instalaci novĂ˝ch." HINT_CLICK_NAME: "KliknÄ›te na jmĂ©no pluginu pro jeho konfiguraci." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "DostupnĂ© pro aktualizaci" LEGEND_AVAILABLE_FOR_INSTALLATION: "DostupnĂ© pro instalaci" LEGEND_INSTALLED_PACKAGES: "NainstalovanĂ© balĂ­ÄŤky" ALERT_CANNOT_ACCESS_REPOSITORY: "V tento moment se nelze pĹ™ipojit k repozitáři." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Vaše domĂ©na" LABEL_VERSION: "Verze" LABEL_CHECKING: "KontrolovánĂ­" TYPE_BASIC_HINT: "Tato domĂ©na nenĂ­ licencována pro komerÄŤnĂ­ uĹľitĂ­." TYPE_BASIC_HINT_2: "Tato domĂ©na nemĹŻĹľe bĂ˝t licencována." HTML_ALERT_TOP_1: "RainLoop Webmail je licencován pod" HTML_ALERT_TOP_2: "MĹŻĹľete tento nástroj volnÄ› používat pro vaše osobnĂ­ projekty." HTML_ALERT_TOP_3: | KomerÄŤnĂ­ užívánĂ­ (s pĹ™idanĂ˝mi doplĹky) RainLoop Webmail vyĹľaduje zĂ­skánĂ­ licence. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "Licence vyprší" BUTTON_ACTIVATE: "AktivaÄŤnĂ­ licenÄŤnĂ­ klĂ­ÄŤ pro tuto domĂ©nu" BUTTON_PURCHASE: "Koupit" BUTTON_TRIAL: "Trial" TAB_ABOUT: LEGEND_ABOUT: "Info" LABEL_TAG_HINT: "JednoduchĂ˝, modernĂ­ a rychlĂ˝ webovĂ˝ emailovĂ˝ klient" LABEL_ALL_RIGHTS_RESERVED: "Všechna práva vyhrazena." HINT_READ_CHANGE_LOG: "PĹ™eÄŤtÄ›te si prosĂ­m change log pĹ™edtĂ­m, neĹľ budete chtĂ­t provĂ©st aktualizaci." HINT_IS_UP_TO_DATE: "RainLoop je v aktuálnĂ­ verzi." HTML_NEW_VERSION: "Nová verze %VERSION% je k dispozici." LABEL_UPDATING: "Aktualizuji" LABEL_CHECKING: "Kontroluji novĂ© aktualizace" BUTTON_UPDATE: "Aktualizovat" BUTTON_DOWNLOAD: "Stáhnout" BUTTON_CHANGELOG: "Seznam zmÄ›n" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Aktivovat licenÄŤnĂ­ klĂ­ÄŤ?" TITLE_ACTIVATION: "Aktivace..." LABEL_DOMAIN: "DomĂ©na" LABEL_SUB_KEY: "LicenÄŤnĂ­ klĂ­ÄŤ" BUTTON_ACTIVATE: "Aktivovat" LABEL_ACTIVATED: "Aktivováno" ERROR_INVALID_SUBS_KEY: "NeplatnĂ˝ licenÄŤnĂ­ klĂ­ÄŤ" SUBS_KEY_ACTIVATED: "LicenÄŤnĂ­ klĂ­ÄŤ byl ĂşspěšnÄ› aktivován" HTML_DESC: | Po aktivaci bude prĂ©miová licence pro domĂ©nu %DOMAIN% prodlouĹľena.
Aktivační klíč lze použít pouze pro jednu doménu.

Jakmile začnete proces aktivace, nelze ho přerušit nebo ukončit. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Přidat alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Doména" BUTTON_CLOSE: "Zavřít" BUTTON_ADD: "Přidat" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Přidat Doménu" TITLE_ADD_DOMAIN_WITH_NAME: "Přidat Doménu \"%NAME%\"" TITLE_EDIT_DOMAIN: "Editovat Doménu \"%NAME%\"" LABEL_NAME: "Název" NAME_HELPER: "wildcard podporovány" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Zabezpečení" LABEL_WHITE_LIST: "White List" SECURE_OPTION_NONE: "Žádné" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Povolit SIEVE skripty" LABEL_ALLOW_USER_SCRIPT: "Povolit vlastní uživatelské skripty" LABEL_USE_SHORT_LOGIN: "Používat krátký login" LABEL_USE_AUTH: "Používat authentikaci" LABEL_USE_PHP_MAIL: "Používat php mail() funkci" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "White List" BUTTON_SIEVE_CONFIGURATION: "SIEVE konfigurace" BUTTON_BACK_TO_IMAP: "Zpět na IMAP nastavení" BUTTON_BACK: "Zpět" BUTTON_CLOSE: "Zavřít" BUTTON_ADD: "Přidat" BUTTON_UPDATE: "Aktualizovat" NEW_DOMAIN_DESC: "Konfigurace této domény umožní používat %NAME% adresy." WHITE_LIST_ALERT: | Seznam domén s povoleným uživatelským přístupem Použijte mezeru pro jejich oddělení. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Není zde nic ke konfiguraci" BUTTON_CLOSE: "Zavřít" BUTTON_SAVE: "Uložit" TOOLTIP_ABOUT_TITLE: "Info" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Jste si jistí, že opravdu chcete zavřit toto okno?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Vyberte váš jazyk" HINTS: BETA: "beta" UNSTABLE: "unstable" WARNING: "Varování!" NOT_SUPPORTED: "není podporováno" REQUIRES_PHP_54: "vyžaduje PHP 5.4 nebo vyšší" ERRORS: DOMAIN_ALREADY_EXISTS: "Doména již existuje" UNKNOWN_ERROR: "Neznámá chyba" NOTIFICATIONS: INVALID_TOKEN: "Neplatný token" AUTH_ERROR: "Chyba authentikace" ACCESS_ERROR: "Chyba v přístupu" CONNECTION_ERROR: "Nelze se spojit se serverem" CAPTCHA_ERROR: "Nesprávná CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy a nastavte si tuto možnost. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy a nastavte si tuto možnost. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Toto ID není přiřazeno k žádnému účtu. Přihlašte se pomocí vaší emailové adresy a nastavte si tuto možnost. DOMAIN_NOT_ALLOWED: "Doména není povolená" ACCOUNT_NOT_ALLOWED: "Účet není povolený" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Je vyžadováno dvoufázové ověření" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvoufázového ověření" COULD_NOT_SAVE_NEW_PASSWORD: "Nelze uložit nové heslo" CURRENT_PASSWORD_INCORRECT: "Současné heslo neodpovídá" NEW_PASSWORD_SHORT: "Heslo je krátké" NEW_PASSWORD_WEAK: "Heslo je moc jednoduché" NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje zakázané znaky" CONTACTS_SYNC_ERROR: "Chyba při synchronizaci kontaktů" CANT_GET_MESSAGE_LIST: "Nelze načíst seznam zpráv" CANT_GET_MESSAGE: "Zprávu se nepodařilo načíst" CANT_DELETE_MESSAGE: "Zprávu se nepodařilo odstranit" CANT_MOVE_MESSAGE: "Zprávu se nepodařilo přesunout" CANT_SAVE_MESSAGE: "Zprávu se nepodařilo uložit" CANT_SEND_MESSAGE: "Zprávu se nepodařilo odeslat" INVALID_RECIPIENTS: "Neplatní příjemci" CANT_SAVE_FILTERS: "Nelze uložit filtry" CANT_GET_FILTERS: "Nelze načíst filtry" FILTERS_ARE_NOT_CORRECT: "Filtry nejsou validní" CANT_CREATE_FOLDER: "Složku se nepodařilo vytvořit" CANT_RENAME_FOLDER: "Složku se nepodařilo přejmenovat" CANT_DELETE_FOLDER: "Složku se nepodařilo odstranit" CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou složku" CANT_SUBSCRIBE_FOLDER: "Nelze přihlásit složku" CANT_UNSUBSCRIBE_FOLDER: "Nelze odhlásit složku" CANT_SAVE_SETTINGS: "Nastavení se nepodařilo uložit" CANT_SAVE_PLUGIN_SETTINGS: "Nastavení se nepodařilo uložit" DOMAIN_ALREADY_EXISTS: "Tato doména již existuje" CANT_INSTALL_PACKAGE: "Instalace balíčku se nezdařila" CANT_DELETE_PACKAGE: "Odstranění balíčku se nezdařilo" INVALID_PLUGIN_PACKAGE: "Nevalidní balíček" UNSUPPORTED_PLUGIN_PACKAGE: "Nepodporovaný balíček rozšíření" LICENSING_SERVER_IS_UNAVAILABLE: "Licenční server je nedostupný" LICENSING_DOMAIN_EXPIRED: "Licence pro tuto doménu vypršela." LICENSING_DOMAIN_BANNED: "Licence pro tuto doménu byla zablokována." DEMO_SEND_MESSAGE_ERROR: "Z důvodu bezpečnosti tento demo účet není oprávněn posílat zprávy na externí emaily!" DEMO_ACCOUNT_ERROR: "Z důvodu bezpečnosti tento účet nemá oprávnění k této akci!" ACCOUNT_ALREADY_EXISTS: "Účet již existuje" ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" MAIL_SERVER_ERROR: "Nastala chyba během přístupu na poštovní server" INVALID_INPUT_ARGUMENT: "Neplatný vstupní argument" UNKNOWN_ERROR: "Neznámá chyba" STATIC: BACK_LINK: "Obnovit" DOMAIN_LIST_DESC: "Seznam domén, ke kterým je možné přistupovat přes webmail." PHP_EXSTENSIONS_ERROR_DESC: "Potřebné rošíření PHP nejsou dostupné v konfiguraci PHP!" PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší než požadovaná 5.3.0!" NO_SCRIPT_TITLE: "Tato aplikace vyžaduje JavaScript." NO_SCRIPT_DESC: | Váš internetový prohlížeč nepodporuje JavaScript. Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. NO_COOKIE_TITLE: "Tato aplikace vyžaduje podporu Cookies." NO_COOKIE_DESC: | Váš internetový prohlížeč nepodporuje Cookies. Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. BAD_BROWSER_TITLE: "Používáte zastaralý internetový prohlížeč." BAD_BROWSER_DESC: | Abyste mohli využívat všechny funkcie této aplikace, použijte některý z následujících internetových prohlížečů: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/da_DK.yml000066400000000000000000000346771361462701300256320ustar00rootroot00000000000000da_DK: LOGIN: LABEL_LOGIN: "Log ind" LABEL_PASSWORD: "Adgangskode" BUTTON_LOGIN: "Log ind i administrationspanelet" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Admin Panel" TABS_LABELS: LABEL_GENERAL_NAME: "Generelt" LABEL_LOGIN_NAME: "Log ind" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Kontakter" LABEL_DOMAINS_NAME: "Domæner" LABEL_SECURITY_NAME: "Sikkerhed" LABEL_INTEGRATION_NAME: "Integrationer" LABEL_PLUGINS_NAME: "Plugins" LABEL_PACKAGES_NAME: "Pakker" LABEL_LICENSING_NAME: "Licensering" LABEL_ABOUT_NAME: "Om" TAB_GENERAL: LEGEND_INTERFACE: "Grænseflade" LABEL_LANGUAGE: "Sprog" LABEL_LANGUAGE_ADMIN: "Sprog (admin)" LABEL_THEME: "Tema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Tillad sprogvalg i indstillinger" LABEL_ALLOW_THEMES_ON_SETTINGS: "Tillad temavalg i indstillinger" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Tillad baggrundsvalg i indstillinger" LABEL_NEW_FOLDER_MOVE: "Ny \"flyt til mappe\" knap" LABEL_SHOW_THUMBNAILS: "Vis miniaturer (vedhæftede filer)" LABEL_ALLOW_GRAVATAR: "Tillad Gravatar" LEGEND_MAIN: "Primære" LABEL_ATTACHMENT_SIZE_LIMIT: "Vedhæftede filers størrelsesgrænse" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillad flere konti" LABEL_ALLOW_IDENTITIES: "Tillad flere identiteter" LABEL_ALLOW_TEMPLATES: "Tillad skabeloner" ALERT_WARNING: "Advarsler!" HTML_ALERT_WEAK_PASSWORD: | Du bruger standard admin adgangskoden.
Af sikkerhedsmæssige hensyn bør du venligst ændre adgangskoden til noget andet snarest. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Log ind skærm" LABEL_DEFAULT_DOMAIN: "Standard domæne" LABEL_DETERMINE_USER_DOMAIN: "Forsøg at bestemme brugerens domæne" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Tillad sprogvalg ved log ind" LABEL_DETERMINE_USER_LANGUAGE: "Forsøg at bestemme brugerens sprog" TAB_BRANDING: LEGEND_BRANDING: "Branding" LABEL_PAGE_TITLE: "Sidetitel" LABEL_LOADING_DESCRIPTION: "Indlæsningsbeskrivelse" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Log ind" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Beskrivelse" LABEL_LOGIN_BACKGROUND: "Baggrund" LABEL_LOGIN_CUSTOM_CSS: "Brugerdefinerede CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Vis \"Powered by RainLoop\" link" LEGEND_USER: "Bruger" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logotitel" LABEL_USER_LOGO_MESSAGE: "Logo (meddelelsesvisning)" LABEL_USER_CUSTOM_CSS: "Brugerdefinerede CSS" LEGEND_WELCOME_PAGE: "Velkomstside" LABEL_WELCOME_PAGE_TITLE: "Titel" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Visning" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "én enkelt gang" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Altid" HTML_ALERT_PREMIUM: "Denne funktionalitet er tilgængelig for Premium abonnenter." TAB_CONTACTS: LEGEND_CONTACTS: "Kontakter" LEGEND_STORAGE: "Lagring (PDO)" LABEL_ENABLE_CONTACTS: "Aktivér kontakter" LABEL_ALLOW_SYNC: "Tillad kontaktsynkronisering (med ektern CardDAV server)" LABEL_STORAGE_TYPE: "Type" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Bruger" LABEL_STORAGE_PASSWORD: "Adgangskode" BUTTON_TEST: "Test" ALERT_NOTICE: "Underretning!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Brug ikke denne database type med større antal af aktive brugere." HTML_ALERT_DOES_NOT_SUPPORTED: | Dit system ser ikke ud til at understøtte kontakter.
Du skal installere og aktivere PDO (SQLite / MySQL / PostgreSQL) udvidelsen på din server. TAB_DOMAINS: LEGEND_DOMAINS: "Domæner" BUTTON_ADD_DOMAIN: "Tilføj domæne" BUTTON_ADD_ALIAS: "Tilføj alias" DELETE_ARE_YOU_SURE: "Er du sikker?" HTML_DOMAINS_HELPER: | Liste over domæner webmail er tilladt adgang til.
Klik på navnet for at konfigurere domænet. TAB_SECURITY: LEGEND_SECURITY: "Sikkerhed" LABEL_ALLOW_TWO_STEP: "Tillad 2-trins verifikation" LABEL_FORCE_TWO_STEP: "Gennemtving 2-trins verifikation" LABEL_USE_IMAGE_PROXY: "Brug lokal proxy til eksterne billeder" LABEL_ALLOW_OPEN_PGP: "Tillad OpenPGP" LABEL_SHOW_PHP_INFO: "Vis PHP informationer" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Adgangsoplysninger" LABEL_CURRENT_PASSWORD: "Nuværende adgangskode" LABEL_NEW_LOGIN: "Nyt log ind" LABEL_NEW_PASSWORD: "Ny adgangskode" LABEL_REPEAT_PASSWORD: "Gentag" BUTTON_UPDATE_PASSWORD: "Opdater adgangskode" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Kræv verifikation af brugt SSL certifikat (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Tillad selvsignerede certifikater" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Aktiver Google integration" LABEL_GOOGLE_AUTH: "Autorisation" LABEL_GOOGLE_DRIVE: "Google Drive integration (Komponerede visning)" LABEL_GOOGLE_PREVIEW: "Google Viewer integration (Visning af Microsoft Word, Excel og PowerPoint filer)" LABEL_GOOGLE_CLIENT_ID: "Klient ID" LABEL_GOOGLE_CLIENT_SECRET: "Klient hemmelighed" LABEL_GOOGLE_API_KEY: "API nøgle" HINT_GOOGLE_API_KEY: "Krævet af Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Aktiver Facebook integration (Autorisation)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App hemmelighed" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Aktiver Twitter integrering (Godkendelse)" LABEL_TWITTER_CONSUMER_KEY: "Bruger nøgle" LABEL_TWITTER_CONSUMER_SECRET: "Bruger hemmelighed" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Aktiver Dropbox integrering" LABEL_DROPBOX_API_KEY: "API nøgle" TOP_ALERT: "Mere information omkring integrring med sociale netværk kan finder på" TAB_PLUGINS: LEGEND_PLUGINS: "Plugins" LABEL_ENABLE_PLUGINS: "Aktiver plugins" ALERT_NO_PLUGINS: "Ingen tilføjelser er installeret endnu." LINK_INSTALL_NEW: "Tryk her for at installere nyt!" HINT_CLICK_NAME: "Tryk på navnet for at konfigurere tilføjelse." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Opdatering tilgængelig" LEGEND_AVAILABLE_FOR_INSTALLATION: "Installation tilgængelig" LEGEND_INSTALLED_PACKAGES: "Installerede pakker" ALERT_CANNOT_ACCESS_REPOSITORY: "Kan ikke tilgå depotet lige nu." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Dit domæne" LABEL_VERSION: "Version" LABEL_CHECKING: "Tjekker" TYPE_BASIC_HINT: "Dette domæne er ikke licenseret til kommercielt brug (med ekstra funktioner)." TYPE_BASIC_HINT_2: "Dette domæne kan ikke licenseret." HTML_ALERT_TOP_1: "RainLoop Webmail er licenseret under" HTML_ALERT_TOP_2: "Du er velkommen til at bruge det til personlige projekter." HTML_ALERT_TOP_3: | Kommercielt brug (med ekstra funktioner) af RainLoop Webmail kræver et abonnement. TYPE_PREMIUM_LIFETIME: "Livstid" LABEL_SUB_EXPIRES: "Abonnement udløber" BUTTON_ACTIVATE: "Aktiver abonnements kode for dette domæne" BUTTON_PURCHASE: "Køb" BUTTON_TRIAL: "Prøv" TAB_ABOUT: LEGEND_ABOUT: "Om" LABEL_TAG_HINT: "Simpel, moderne & hurtig web-baseret e-mail klient" LABEL_ALL_RIGHTS_RESERVED: "alle rettigheder forbeholdes." HINT_READ_CHANGE_LOG: "Læs ændrings listen før der opdateres." HINT_IS_UP_TO_DATE: "RainLoop is up to date." HTML_NEW_VERSION: "Ny %VERSION% version tilgængelig" LABEL_UPDATING: "Opdatere" LABEL_CHECKING: "Tjekker for opdateringer" BUTTON_UPDATE: "Opdater" BUTTON_DOWNLOAD: "Download" BUTTON_CHANGELOG: "Ændrings liste" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Aktiver abonnements kode?" TITLE_ACTIVATION: "Aktivering..." LABEL_DOMAIN: "Domæne" LABEL_SUB_KEY: "Abonnements kode" BUTTON_ACTIVATE: "Aktiver" LABEL_ACTIVATED: "Aktiveret" ERROR_INVALID_SUBS_KEY: "Ugyldig abonnements kode" SUBS_KEY_ACTIVATED: "Abonnements kode aktivering var succesfuld" HTML_DESC: | Efter aktiveren, vil abonnementet for %DOMAIN% blive forlænget.
Bemærk at en abonnements kode kun kan blive aktiveret for et enkelt domæne.

Når aktiverings processen er startet kan den ikke afbrydes eller annulleres. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Tilføj alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domæne" BUTTON_CLOSE: "Luk" BUTTON_ADD: "Tilføj" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Tilføj domæne" TITLE_ADD_DOMAIN_WITH_NAME: "Tilføj domæne \"%NAME%\"" TITLE_EDIT_DOMAIN: "Rediger domæne \"%NAME%\"" LABEL_NAME: "Navn" NAME_HELPER: "specieltegn understøttet" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Sikker" LABEL_WHITE_LIST: "Whitelist" SECURE_OPTION_NONE: "Ingen" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Tillad sieve skripts" LABEL_ALLOW_USER_SCRIPT: "Tillad brugerdefinerede skripts" LABEL_USE_SHORT_LOGIN: "Brug kort log ind" LABEL_USE_AUTH: "Brug godkendelse" LABEL_USE_PHP_MAIL: "Brug php mail()" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Whitelist" BUTTON_SIEVE_CONFIGURATION: "Sieve opsætning" BUTTON_BACK_TO_IMAP: "Tilbage til IMAP indstillinger" BUTTON_BACK: "Tilbage" BUTTON_CLOSE: "Luk" BUTTON_ADD: "Tilføj" BUTTON_UPDATE: "Opdater" NEW_DOMAIN_DESC: "Denne domæne konfiguration tillader %NAME% e-mail adresser." WHITE_LIST_ALERT: | Liste med godkendte domæne for webmail opsætning. Brug mellemrum til at separere domæner. POPUPS_PLUGIN: TITLE_PLUGIN: "Tilføjelse" DESC_NOTHING_TO_CONFIGURE: "Intet at opsætte" BUTTON_CLOSE: "Luk" BUTTON_SAVE: "Gem" TOOLTIP_ABOUT_TITLE: "Om" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Vil du lukke vinduet?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Vælg sprog" HINTS: BETA: "beta" UNSTABLE: "ustabil" WARNING: "Advarsel!" NOT_SUPPORTED: "ikke understøttet" REQUIRES_PHP_54: "PHP 5.4 eller højere er et krav" ERRORS: DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" UNKNOWN_ERROR: "Ukendt fejl" NOTIFICATIONS: INVALID_TOKEN: "Ugyldigt tegn" AUTH_ERROR: "Godkendelse fejlede" ACCESS_ERROR: "Adgangsfejl" CONNECTION_ERROR: "Kan ikke kontakte server" CAPTCHA_ERROR: "Forkert CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug af e-mail og tilføj ID'et under konto indstillinger. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug af e-mail og tilføj ID'et under konto indstillinger. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug af e-mail og tilføj ID'et under konto indstillinger. DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation påbudt." ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikationsfejl" COULD_NOT_SAVE_NEW_PASSWORD: "Kunne ikke gemme ny adgangskode" CURRENT_PASSWORD_INCORRECT: "Nuværende adgangskode forkert" NEW_PASSWORD_SHORT: "Adgangskoden for kort" NEW_PASSWORD_WEAK: "Adgangskoden for simpel" NEW_PASSWORD_FORBIDDENT: "Adgangskode indeholder forbudte tegn" CONTACTS_SYNC_ERROR: "Fejl ved synkronisering af kontakter" CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelsesoversigt " CANT_GET_MESSAGE: "Kan ikke indlæse meddelelse" CANT_DELETE_MESSAGE: "Kan ikke slette meddelelse" CANT_MOVE_MESSAGE: "Kan ikke flytte meddelelse" CANT_SAVE_MESSAGE: "Kan ikke gemme meddelelse" CANT_SEND_MESSAGE: "Kan ikke sende meddelelse" INVALID_RECIPIENTS: "Ugyldige modtagere" CANT_SAVE_FILTERS: "Kan ikke gemme filtre" CANT_GET_FILTERS: "Kan ikke indlæse filtre" FILTERS_ARE_NOT_CORRECT: "Fejl i filtre" CANT_CREATE_FOLDER: "Kan ikke oprette mappe" CANT_RENAME_FOLDER: "Kan ikke omdøbe mappe" CANT_DELETE_FOLDER: "Kan ikke slette mappe" CANT_DELETE_NON_EMPTY_FOLDER: "Kan ikke slette mappe som ikke er tom" CANT_SUBSCRIBE_FOLDER: "Kan ikke abonnere på mappe" CANT_UNSUBSCRIBE_FOLDER: "Kan ikke afmelde mappe" CANT_SAVE_SETTINGS: "Kan ikke gemme instillinger" CANT_SAVE_PLUGIN_SETTINGS: "Kan ikke gemme instillinger" DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" CANT_INSTALL_PACKAGE: "Installation af pakke mislykkedes" CANT_DELETE_PACKAGE: "Fjernelse af pakke mislykkedes" INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelsespakke" UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelsespakke ikke understøttet" LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementsserver ikke tilgængelig" LICENSING_DOMAIN_EXPIRED: "Abonnement på domæne udløbet." LICENSING_DOMAIN_BANNED: "Abonnement på domæne forbudt." DEMO_SEND_MESSAGE_ERROR: "Denne konto kan af sikkerheds hensyn ikke sende e-mails til eksterne adresser!" DEMO_ACCOUNT_ERROR: "Denne konto kan af sikkerheds hensyn ikke udføre denne handling!" ACCOUNT_ALREADY_EXISTS: "Kontoen eksisterer allerede" ACCOUNT_DOES_NOT_EXIST: "Kontoen eksisterer ikke" MAIL_SERVER_ERROR: "Der skete en fejl under adgang til e-mail serveren" INVALID_INPUT_ARGUMENT: "Ugyldigt argument" UNKNOWN_ERROR: "Ukendt fejl" STATIC: BACK_LINK: "Genindlæs" DOMAIN_LIST_DESC: "Liste over domæner webmail er tilladt adgang til." PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgængelige!" PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" NO_SCRIPT_TITLE: "JavaScript er nødvendig for dette program." NO_SCRIPT_DESC: | JavaScript er slået fra i din browser. Slå JavaScript til og prøv igen. NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." NO_COOKIE_DESC: | Cookies er slået fra i din browser. Slå Cookies til og prøv igen. BAD_BROWSER_TITLE: "Din browser er forældet." BAD_BROWSER_DESC: | Enkle funktioner fungere ikke med denne browser. For at bruge alle funktioner, hent en af følgende: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/de_DE.yml000066400000000000000000000376741361462701300256300ustar00rootroot00000000000000de_DE: LOGIN: LABEL_LOGIN: "Benutzer" LABEL_PASSWORD: "Passwort" BUTTON_LOGIN: "Im Adminpanel anmelden" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Adminpanel" TABS_LABELS: LABEL_GENERAL_NAME: "Allgemein" LABEL_LOGIN_NAME: "Anmeldung" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Kontakte" LABEL_DOMAINS_NAME: "Domains" LABEL_SECURITY_NAME: "Sicherheit" LABEL_INTEGRATION_NAME: "Integration" LABEL_PLUGINS_NAME: "Plugins" LABEL_PACKAGES_NAME: "Pakete" LABEL_LICENSING_NAME: "Lizenzierung" LABEL_ABOUT_NAME: "Über" TAB_GENERAL: LEGEND_INTERFACE: "Oberfläche" LABEL_LANGUAGE: "Sprache" LABEL_LANGUAGE_ADMIN: "Sprache (Admin)" LABEL_THEME: "Thema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Sprachauswahl in den Einstellungen zulassen" LABEL_ALLOW_THEMES_ON_SETTINGS: "Themaauswahl in den Einstellungen zulassen" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Hintergrundauswahl in den Einstellungen zulassen" LABEL_NEW_FOLDER_MOVE: "Neue \"Verschieben nach\"-Schaltfläche" LABEL_SHOW_THUMBNAILS: "Vorschaubilder anzeigen (Anhänge)" LABEL_ALLOW_GRAVATAR: "Gravatar erlauben" LEGEND_MAIN: "Allgemein" LABEL_ATTACHMENT_SIZE_LIMIT: "Größenlimit für Anhänge" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Zusätzliche Konten erlauben" LABEL_ALLOW_IDENTITIES: "Mehrere Identitäten erlauben" LABEL_ALLOW_TEMPLATES: "Vorlagen erlauben" ALERT_WARNING: "Warnung!" HTML_ALERT_WEAK_PASSWORD: | Sie verwenden das Standard-Admin-Passwort.
Bitte ändern Sie aus Sicherheitsgründen das Passwort jetzt. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Anmeldebildschirm" LABEL_DEFAULT_DOMAIN: "Standarddomain" LABEL_DETERMINE_USER_DOMAIN: "Versuche Domain des Benutzers zu ermitteln" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Sprachauswahl bei der Anmeldung zulassen" LABEL_DETERMINE_USER_LANGUAGE: "Versuche Sprache des Benutzers zu ermitteln" TAB_BRANDING: LEGEND_BRANDING: "Branding" LABEL_PAGE_TITLE: "Seitentitel" LABEL_LOADING_DESCRIPTION: "Ladevorgang-Beschreibung" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Anmeldung" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Beschreibung" LABEL_LOGIN_BACKGROUND: "Hintergrund" LABEL_LOGIN_CUSTOM_CSS: "Benutzerdefiniertes CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\"-Link anzeigen" LEGEND_USER: "Benutzer" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logo Titel" LABEL_USER_LOGO_MESSAGE: "Logo (Nachrichten-Ansicht)" LABEL_USER_CUSTOM_CSS: "Benutzerdefiniertes CSS" LEGEND_WELCOME_PAGE: "Willkommensseite" LABEL_WELCOME_PAGE_TITLE: "Titel" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Anzeigen" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nie" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Einmal" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Immer" HTML_ALERT_PREMIUM: "Diese Funktionalität ist für Premium-Abonnenten verfügbar." TAB_CONTACTS: LEGEND_CONTACTS: "Kontakte" LEGEND_STORAGE: "Speicher (PDO)" LABEL_ENABLE_CONTACTS: "Kontakte akivieren" LABEL_ALLOW_SYNC: "Kontakte-Synchronisierung erlauben (mit externem CardDAV-Server)" LABEL_STORAGE_TYPE: "Typ" LABEL_STORAGE_DSN: "DSN" LABEL_STORAGE_USER: "Benutzer" LABEL_STORAGE_PASSWORD: "Passwort" BUTTON_TEST: "Testen" ALERT_NOTICE: "Hinweis!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Verwenden Sie diesen Datenbanktyp nicht bei einer hohen Anzahl aktiver Benutzer." HTML_ALERT_DOES_NOT_SUPPORTED: | Ihr System unterstützt keine Kontakte.
Sie mĂĽssen die PDO-Erweiterung (SQLite / MySQL / PostgreSQL) auf Ihrem Server installieren oder aktivieren. TAB_DOMAINS: LEGEND_DOMAINS: "Domains" BUTTON_ADD_DOMAIN: "Domain hinzufĂĽgen" BUTTON_ADD_ALIAS: "Alias hinzufĂĽgen" DELETE_ARE_YOU_SURE: "Sind Sie sicher?" HTML_DOMAINS_HELPER: | Liste der Domains, die Webmail abrufen darf.
Klicken Sie auf den Namen, um die Domain zu konfigurieren. TAB_SECURITY: LEGEND_SECURITY: "Sicherheit" LABEL_ALLOW_TWO_STEP: "Zwei-Faktor-Authentifizierung erlauben" LABEL_FORCE_TWO_STEP: "Zwei-Faktor-Authentifizierung erzwingen" LABEL_USE_IMAGE_PROXY: "Lokalen Proxy für externe Bilder verwenden" LABEL_ALLOW_OPEN_PGP: "OpenPGP erlauben" LABEL_SHOW_PHP_INFO: "PHP-Informationen anzeigen" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Adminpanel-Zugangsdaten" LABEL_CURRENT_PASSWORD: "Aktuelles Passwort" LABEL_NEW_LOGIN: "Neuer Benutzer" LABEL_NEW_PASSWORD: "Neues Passwort" LABEL_REPEAT_PASSWORD: "Wiederholen" BUTTON_UPDATE_PASSWORD: "Passwort aktualisieren" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Verlangen, dass das verwendete SSL-Zertifikat beglaubigt ist (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Selbst-signierte Zertifikate erlauben" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Google-Integration aktivieren" LABEL_GOOGLE_AUTH: "Autorisierung" LABEL_GOOGLE_DRIVE: "Google-Drive-Integration (Erstellen-Ansicht)" LABEL_GOOGLE_PREVIEW: "Google-Viewer-Integration (Vorschau für Microsoft Word-, Excel- und PowerPoint-Dateien)" LABEL_GOOGLE_CLIENT_ID: "Client-ID" LABEL_GOOGLE_CLIENT_SECRET: "Client-Geheimnis" LABEL_GOOGLE_API_KEY: "API-Schlüssel" HINT_GOOGLE_API_KEY: "Wird für Google-Drive-Dateiauswahl benötigt" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Facebook-Integration aktivieren (Autorisierung)" LABEL_FACEBOOK_APP_ID: "App-ID" LABEL_FACEBOOK_APP_SECRET: "App-Geheimnis" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Twitter-Integration aktivieren (Autorisierung)" LABEL_TWITTER_CONSUMER_KEY: "Consumer-Schlüssel" LABEL_TWITTER_CONSUMER_SECRET: "Consumer-Geheimnis" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Dropbox-Integration aktivieren" LABEL_DROPBOX_API_KEY: "API-Schlüssel" TOP_ALERT: "Detaillierte Informationen zur Integration von Social-Diensten finden Sie unter" TAB_PLUGINS: LEGEND_PLUGINS: "Plugins" LABEL_ENABLE_PLUGINS: "Plugins aktivieren" ALERT_NO_PLUGINS: "Es wurden noch keine Plugins installiert." LINK_INSTALL_NEW: "Hier klicken, um Plugins zu installieren!" HINT_CLICK_NAME: "Klicken Sie auf den Namen, um das Plugin zu konfigurieren." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Zur Aktualisierung verfügbar" LEGEND_AVAILABLE_FOR_INSTALLATION: "Zur Installation verfügbar" LEGEND_INSTALLED_PACKAGES: "Installierte Pakete" ALERT_CANNOT_ACCESS_REPOSITORY: "Auf das Plugin-Repository kann derzeit nicht zugegriffen werden." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Ihre Domain" LABEL_VERSION: "Version" LABEL_CHECKING: "Überprüfe" TYPE_BASIC_HINT: "Diese Domain ist nicht für die kommerzielle Nutzung (mit zusätzlichen Funktionen) lizenziert." TYPE_BASIC_HINT_2: "Diese Domain kann nicht lizenziert werden." HTML_ALERT_TOP_1: "RainLoop Webmail steht unter folgender Lizenz:" HTML_ALERT_TOP_2: "Sie dürfen es für persönliche Projekte nutzen." HTML_ALERT_TOP_3: | Kommerzielle Nutzung (mit zusätzlichen Funktionen) von RainLoop Webmail erfordert eine Subscription. TYPE_PREMIUM_LIFETIME: "Lebenszeit" LABEL_SUB_EXPIRES: "Ablauf der Subscription" BUTTON_ACTIVATE: "Subscription-Schlüssel für diese Domain aktivieren" BUTTON_PURCHASE: "Erwerben" BUTTON_TRIAL: "Testversion" TAB_ABOUT: LEGEND_ABOUT: "Über" LABEL_TAG_HINT: "Einfacher, moderner und schneller webbasierter E-Mail-Client" LABEL_ALL_RIGHTS_RESERVED: "Alle Rechte vorbehalten." HINT_READ_CHANGE_LOG: "Bitte Lesen Sie das Änderungsprotokoll vor dem Update." HINT_IS_UP_TO_DATE: "RainLoop ist auf dem neusten Stand." HTML_NEW_VERSION: "Neue Version %VERSION% verfügbar." LABEL_UPDATING: "Aktualisiere" LABEL_CHECKING: "Prüfe auf Aktualisierungen" BUTTON_UPDATE: "Aktualisieren" BUTTON_DOWNLOAD: "Herunterladen" BUTTON_CHANGELOG: "Änderungsprotokoll" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Subscription-Schlüssel aktivieren?" TITLE_ACTIVATION: "Aktiviere..." LABEL_DOMAIN: "Domain" LABEL_SUB_KEY: "Subscription-Schlüssel" BUTTON_ACTIVATE: "Aktivieren" LABEL_ACTIVATED: "Aktiviert" ERROR_INVALID_SUBS_KEY: "Ungültiger Subscription-Schlüssel" SUBS_KEY_ACTIVATED: "Subscription-Schlüssel erfolgreich aktiviert" HTML_DESC: | Nach der Aktivierung wird %DOMAIN% um die Premium-Subscription erweitert.
Beachten Sie, dass ein Subscription-SchlĂĽssel nur fĂĽr eine einzelne Domain aktiviert werden kann.

Nach dem Start kann der Aktivierungsprozess nicht unterbrochen oder abgebrochen werden. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Alias hinzufügen" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domain" BUTTON_CLOSE: "Schließen" BUTTON_ADD: "Hinzufügen" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Domain hinzufügen" TITLE_ADD_DOMAIN_WITH_NAME: "Domain \"%NAME%\" hinzufügen" TITLE_EDIT_DOMAIN: "Domain \"%NAME%\" bearbeiten" LABEL_NAME: "Name" NAME_HELPER: "Platzhalter unterstützt" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Sicherheit" LABEL_WHITE_LIST: "Whitelist" SECURE_OPTION_NONE: "Ohne" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Sieve-Skripte erlauben" LABEL_ALLOW_USER_SCRIPT: "Benutzerdefiniertes Skript erlauben" LABEL_USE_SHORT_LOGIN: "Kurze Benutzernamen verwenden" LABEL_USE_AUTH: "Authentifizierung verwenden" LABEL_USE_PHP_MAIL: "PHPs mail()-Funktion verwenden" BUTTON_TEST: "Testen" BUTTON_WHITE_LIST: "Whitelist" BUTTON_SIEVE_CONFIGURATION: "Sieve-Konfiguration" BUTTON_BACK_TO_IMAP: "Zurück zu IMAP-Einstellungen" BUTTON_BACK: "Zurück" BUTTON_CLOSE: "Schließen" BUTTON_ADD: "Hinzufügen" BUTTON_UPDATE: "Aktualisieren" NEW_DOMAIN_DESC: "Diese Domain Konfiguration wird es dir möglich machen
mit %NAME% Mailadressen zu arbeiten." WHITE_LIST_ALERT: | Liste der User, die Webmail abrufen darf. Verwenden Sie Leerzeichen als Trenner. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nichts zu konfigurieren" BUTTON_CLOSE: "Schließen" BUTTON_SAVE: "Speichern" TOOLTIP_ABOUT_TITLE: "Über" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Wählen Sie Ihre Sprache" HINTS: BETA: "Beta" UNSTABLE: "Nicht stabil" WARNING: "Warnung!" NOT_SUPPORTED: "Nicht unterstützt" REQUIRES_PHP_54: "PHP 5.4 oder höher ist erforderlich" ERRORS: DOMAIN_ALREADY_EXISTS: "Domain existiert bereits" UNKNOWN_ERROR: "Unbekannter Fehler" NOTIFICATIONS: INVALID_TOKEN: "Ungültiger Token" AUTH_ERROR: "Authentifizierung fehlgeschlagen" ACCESS_ERROR: "Zugriffsfehler" CONNECTION_ERROR: "Serververbindung kann nicht hergestellt werden" CAPTCHA_ERROR: "Falsche CAPTCHA-Eingabe." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren Konteneinstellungen. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren Konteneinstellungen. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren Konteneinstellungen. DOMAIN_NOT_ALLOWED: "Diese Domain ist nicht zugelassen." ACCOUNT_NOT_ALLOWED: "Konto ist nicht zugelassen." ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Zwei-Faktor-Authentifizierung erforderlich" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Fehler bei Zwei-Faktor-Authentifizierung" COULD_NOT_SAVE_NEW_PASSWORD: "Neues Passwort konnte nicht gespeichert werden" CURRENT_PASSWORD_INCORRECT: "Aktuelles Passwort falsch" NEW_PASSWORD_SHORT: "Passwort ist zu kurz" NEW_PASSWORD_WEAK: "Passwort ist zu einfach" NEW_PASSWORD_FORBIDDENT: "Passwort enthält unzulässige Zeichen" CONTACTS_SYNC_ERROR: "Fehler bei Kontakte-Synchronisierung" CANT_GET_MESSAGE_LIST: "Die Nachrichtenliste ist nicht verfügbar" CANT_GET_MESSAGE: "Diese Nachricht ist nicht verfügbar" CANT_DELETE_MESSAGE: "Diese Nachricht kann nicht gelöscht werden" CANT_MOVE_MESSAGE: "Diese Nachricht kann nicht verschoben werden" CANT_SAVE_MESSAGE: "Diese Nachricht kann nicht gespeichert werden" CANT_SEND_MESSAGE: "Diese Nachricht kann nicht gesendet werden" INVALID_RECIPIENTS: "Ungültige Empfängeradressen" CANT_SAVE_FILTERS: "Die Filter können nicht gespeichert werden" CANT_GET_FILTERS: "Die Filter sind nicht verfügbar" FILTERS_ARE_NOT_CORRECT: "Die Filter sind fehlerhaft" CANT_CREATE_FOLDER: "Dieser Ordner kann nicht angelegt werden" CANT_RENAME_FOLDER: "Dieser Ordner kann nicht umbenannt werden" CANT_DELETE_FOLDER: "Dieser Ordner kann nicht gelöscht werden" CANT_DELETE_NON_EMPTY_FOLDER: "Der Ordner kann nicht gelöscht werden; er ist nicht leer" CANT_SUBSCRIBE_FOLDER: "Dieser Ordner kann nicht abonniert werden" CANT_UNSUBSCRIBE_FOLDER: "Das Abonnement dieses Ordners kann nicht gelöscht werden" CANT_SAVE_SETTINGS: "Einstellungen können nicht gespeichert werden" CANT_SAVE_PLUGIN_SETTINGS: "Einstellungen können nicht gespeichert werden" DOMAIN_ALREADY_EXISTS: "Diese Domain existiert bereits" CANT_INSTALL_PACKAGE: "Paket konnte nicht installiert werden" CANT_DELETE_PACKAGE: "Paket konnte nicht entfernt werden" INVALID_PLUGIN_PACKAGE: "Plugin-Paket ist ungültig" UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-Paket wird nicht unterstützt" LICENSING_SERVER_IS_UNAVAILABLE: "Der Subscription-Server kann nicht erreicht werden" LICENSING_DOMAIN_EXPIRED: "Die Subscription dieser Domain ist abgelaufen." LICENSING_DOMAIN_BANNED: "Die Subscription dieser Domain ist gesperrt." DEMO_SEND_MESSAGE_ERROR: "Dieses Demokonto darf aus Sicherheitsgründen keine Nachrichten an externe E-Mail-Adressen versenden!" DEMO_ACCOUNT_ERROR: "Aus Sicherheitsgründen ist dieses Konto nicht zu dieser Aktion berechtigt!" ACCOUNT_ALREADY_EXISTS: "Dieses Konto existiert bereits" ACCOUNT_DOES_NOT_EXIST: "Dieser Account existiert nicht." MAIL_SERVER_ERROR: "Beim Zugriff auf den E-Mail-Server trat ein Fehler auf." INVALID_INPUT_ARGUMENT: "Ungültige Eingabe" UNKNOWN_ERROR: "Unbekannter Fehler" STATIC: BACK_LINK: "Aktualisieren" DOMAIN_LIST_DESC: "Liste der Domains, auf die zugegriffen werden darf" PHP_EXSTENSIONS_ERROR_DESC: "Notwendige PHP-Erweiterungen sind in Ihrer PHP-Konfiguration nicht vorhanden!" PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." NO_SCRIPT_DESC: | Ihr Browser unterstützt JavaScript nicht. Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." NO_COOKIE_DESC: | Ihr Browser unterstützt Cookies nicht. Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." BAD_BROWSER_DESC: | Um alle Funktionen dieser Anwendung nutzen zu können, sollten Sie einen der folgenden Browser herunterladen und installieren rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/en_US.yml000066400000000000000000000342541361462701300256700ustar00rootroot00000000000000en_US: LOGIN: LABEL_LOGIN: "Login" LABEL_PASSWORD: "Password" BUTTON_LOGIN: "Log into the admin panel" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Admin Panel" TABS_LABELS: LABEL_GENERAL_NAME: "General" LABEL_LOGIN_NAME: "Login" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Contacts" LABEL_DOMAINS_NAME: "Domains" LABEL_SECURITY_NAME: "Security" LABEL_INTEGRATION_NAME: "Integrations" LABEL_PLUGINS_NAME: "Plugins" LABEL_PACKAGES_NAME: "Packages" LABEL_LICENSING_NAME: "Licensing" LABEL_ABOUT_NAME: "About" TAB_GENERAL: LEGEND_INTERFACE: "Interface" LABEL_LANGUAGE: "Language" LABEL_LANGUAGE_ADMIN: "Language (admin)" LABEL_THEME: "Theme" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Allow language selection on settings screen" LABEL_ALLOW_THEMES_ON_SETTINGS: "Allow theme selection on settings screen" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" LABEL_SHOW_THUMBNAILS: "Show thumbnails (attachments)" LABEL_ALLOW_GRAVATAR: "Allow Gravatar" LEGEND_MAIN: "Main" LABEL_ATTACHMENT_SIZE_LIMIT: "Attachment size limit" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Allow additional accounts" LABEL_ALLOW_IDENTITIES: "Allow multiple identities" LABEL_ALLOW_TEMPLATES: "Allow templates" ALERT_WARNING: "Warning!" HTML_ALERT_WEAK_PASSWORD: | You are using the default admin password.
For security reasons please change password to something else now. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Login Screen" LABEL_DEFAULT_DOMAIN: "Default Domain" LABEL_DETERMINE_USER_DOMAIN: "Try to determine user domain" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Allow language selection on login screen" LABEL_DETERMINE_USER_LANGUAGE: "Try to determine user language" TAB_BRANDING: LEGEND_BRANDING: "Branding" LABEL_PAGE_TITLE: "Page Title" LABEL_LOADING_DESCRIPTION: "Loading Description" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Login" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Description" LABEL_LOGIN_BACKGROUND: "Background" LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Show \"Powered by RainLoop\" link" LEGEND_USER: "User" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logo Title" LABEL_USER_LOGO_MESSAGE: "Logo (Message View)" LABEL_USER_CUSTOM_CSS: "Custom CSS" LEGEND_WELCOME_PAGE: "Welcome page" LABEL_WELCOME_PAGE_TITLE: "Title" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Display" OPTION_WELCOME_PAGE_DISPLAY_NONE: "None" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Once" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Always" HTML_ALERT_PREMIUM: "This functionality is available for Premium subscribers." TAB_CONTACTS: LEGEND_CONTACTS: "Contacts" LEGEND_STORAGE: "Storage (PDO)" LABEL_ENABLE_CONTACTS: "Enable contacts" LABEL_ALLOW_SYNC: "Allow contacts sync (with external CardDAV server)" LABEL_STORAGE_TYPE: "Type" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "User" LABEL_STORAGE_PASSWORD: "Password" BUTTON_TEST: "Test" ALERT_NOTICE: "Notice!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." HTML_ALERT_DOES_NOT_SUPPORTED: | Your system doesn't support contacts.
You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. TAB_DOMAINS: LEGEND_DOMAINS: "Domains" BUTTON_ADD_DOMAIN: "Add Domain" BUTTON_ADD_ALIAS: "Add Alias" DELETE_ARE_YOU_SURE: "Are you sure?" HTML_DOMAINS_HELPER: | List of domains webmail is allowed to access.
Click on the name to configure the domain. TAB_SECURITY: LEGEND_SECURITY: "Security" LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" LABEL_FORCE_TWO_STEP: "Enforce 2-Step Verification" LABEL_USE_IMAGE_PROXY: "Use local proxy for external images" LABEL_ALLOW_OPEN_PGP: "Allow OpenPGP" LABEL_SHOW_PHP_INFO: "Show PHP information" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" LABEL_CURRENT_PASSWORD: "Current password" LABEL_NEW_LOGIN: "New login" LABEL_NEW_PASSWORD: "New password" LABEL_REPEAT_PASSWORD: "Repeat" BUTTON_UPDATE_PASSWORD: "Update Password" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Require verification of SSL certificate used (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Allow self signed certificates" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Enable Google Integration" LABEL_GOOGLE_AUTH: "Authorization" LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Api Key" HINT_GOOGLE_API_KEY: "Required for Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Enable Facebook Integration (Authorization)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Enable Twitter Integration (Authorization)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Enable Dropbox Integration" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "Detailed information on social integration is found at" TAB_PLUGINS: LEGEND_PLUGINS: "Plugins" LABEL_ENABLE_PLUGINS: "Enable plugins" ALERT_NO_PLUGINS: "No plugins have yet been installed." LINK_INSTALL_NEW: "Click here to install new!" HINT_CLICK_NAME: "Click on the name to configure the plugin." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Available for Update" LEGEND_AVAILABLE_FOR_INSTALLATION: "Available for Installation" LEGEND_INSTALLED_PACKAGES: "Installed Packages" ALERT_CANNOT_ACCESS_REPOSITORY: "Cannot access the repository at the moment." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Your domain" LABEL_VERSION: "Version" LABEL_CHECKING: "Checking" TYPE_BASIC_HINT: "This domain isn't licensed for commercial use (with additional features)." TYPE_BASIC_HINT_2: "This domain can't be licensed." HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" HTML_ALERT_TOP_2: "You are free to use it for your personal projects." HTML_ALERT_TOP_3: | Commercial use (with additional features) of RainLoop Webmail requires getting a subscription. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "Subscription expires" BUTTON_ACTIVATE: "Activate Subscription Key for this domain" BUTTON_PURCHASE: "Purchase" BUTTON_TRIAL: "Trial" TAB_ABOUT: LEGEND_ABOUT: "About" LABEL_TAG_HINT: "Simple, modern & fast web-based email client" LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." HINT_READ_CHANGE_LOG: "Please read the change log before updating." HINT_IS_UP_TO_DATE: "RainLoop is up to date." HTML_NEW_VERSION: "New %VERSION% version is available." LABEL_UPDATING: "Updating" LABEL_CHECKING: "Checking for updates" BUTTON_UPDATE: "Update" BUTTON_DOWNLOAD: "Download" BUTTON_CHANGELOG: "Changelog" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Activate Subscription Key?" TITLE_ACTIVATION: "Activation..." LABEL_DOMAIN: "Domain" LABEL_SUB_KEY: "Subscription Key" BUTTON_ACTIVATE: "Activate" LABEL_ACTIVATED: "Activated" ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" HTML_DESC: | After activation, premium subscription for %DOMAIN% will be extended.
Note that subscription key can be activated for a single domain only.

Once started, the process of activation cannot be aborted or cancelled. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Add Alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domain" BUTTON_CLOSE: "Close" BUTTON_ADD: "Add" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Add Domain" TITLE_ADD_DOMAIN_WITH_NAME: "Add Domain \"%NAME%\"" TITLE_EDIT_DOMAIN: "Edit Domain \"%NAME%\"" LABEL_NAME: "Name" NAME_HELPER: "wildcard supported" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Secure" LABEL_WHITE_LIST: "White List" SECURE_OPTION_NONE: "None" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Allow sieve scripts" LABEL_ALLOW_USER_SCRIPT: "Allow custom user script" LABEL_USE_SHORT_LOGIN: "Use short login" LABEL_USE_AUTH: "Use authentication" LABEL_USE_PHP_MAIL: "Use php mail() function" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "White List" BUTTON_SIEVE_CONFIGURATION: "Sieve configuration" BUTTON_BACK_TO_IMAP: "Back to IMAP settings" BUTTON_BACK: "Back" BUTTON_CLOSE: "Close" BUTTON_ADD: "Add" BUTTON_UPDATE: "Update" NEW_DOMAIN_DESC: "This domain configuration will allow you to work
with %NAME% email addresses." WHITE_LIST_ALERT: | List of domain users webmail is allowed to access. Use a space as delimiter. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" BUTTON_CLOSE: "Close" BUTTON_SAVE: "Save" TOOLTIP_ABOUT_TITLE: "About" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choose your language" HINTS: BETA: "beta" UNSTABLE: "unstable" WARNING: "Warning!" NOT_SUPPORTED: "not supported" REQUIRES_PHP_54: "requires PHP 5.4 or greater" ERRORS: DOMAIN_ALREADY_EXISTS: "Domain already exists" UNKNOWN_ERROR: "Unknown error" NOTIFICATIONS: INVALID_TOKEN: "Invalid token" AUTH_ERROR: "Authentication failed" ACCESS_ERROR: "Access error" CONNECTION_ERROR: "Can't connect to server" CAPTCHA_ERROR: "Incorrect CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "Domain is not allowed" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Can't get message list" CANT_GET_MESSAGE: "Can't get message" CANT_DELETE_MESSAGE: "Can't delete message" CANT_MOVE_MESSAGE: "Can't move message" CANT_SAVE_MESSAGE: "Can't save message" CANT_SEND_MESSAGE: "Can't send message" INVALID_RECIPIENTS: "Invalid recipients" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Can't create folder" CANT_RENAME_FOLDER: "Can't rename folder" CANT_DELETE_FOLDER: "Can't delete folder" CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" CANT_SAVE_SETTINGS: "Can't save settings" CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" DOMAIN_ALREADY_EXISTS: "Domain already exists" CANT_INSTALL_PACKAGE: "Failed to install package" CANT_DELETE_PACKAGE: "Failed to remove package" INVALID_PLUGIN_PACKAGE: "Invalid plugin package" UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Account already exists" ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" MAIL_SERVER_ERROR: "An error has occured while accessing mail server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Unknown error" STATIC: BACK_LINK: "Reload" DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | JavaScript support is not available in your browser. Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | To use all the features of the application, download and install one of these browsers: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/es_ES.yml000066400000000000000000000374351361462701300256610ustar00rootroot00000000000000es_ES: LOGIN: LABEL_LOGIN: "Ingresar" LABEL_PASSWORD: "Contraseña" BUTTON_LOGIN: "Ingresar al panel de control" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Panel de Control" TABS_LABELS: LABEL_GENERAL_NAME: "General" LABEL_LOGIN_NAME: "Ingresar" LABEL_BRANDING_NAME: "Personalización" LABEL_CONTACTS_NAME: "Contactos" LABEL_DOMAINS_NAME: "Dominios" LABEL_SECURITY_NAME: "Seguridad" LABEL_INTEGRATION_NAME: "Integración" LABEL_PLUGINS_NAME: "Complementos" LABEL_PACKAGES_NAME: "Paquetes" LABEL_LICENSING_NAME: "Licencias" LABEL_ABOUT_NAME: "Acerca" TAB_GENERAL: LEGEND_INTERFACE: "Interfaz" LABEL_LANGUAGE: "Idioma" LABEL_LANGUAGE_ADMIN: "Idioma (Panel de Control)" LABEL_THEME: "Temas" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permitir selección del idioma" LABEL_ALLOW_THEMES_ON_SETTINGS: "Permitir personalización de la interfaz" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permitir cambiar el fondo de pantalla" LABEL_NEW_FOLDER_MOVE: "Nuevo botón \"mover a carpeta\"" LABEL_SHOW_THUMBNAILS: "Mostrar previsualización (adjuntos)" LABEL_ALLOW_GRAVATAR: "Usar Gravatar" LEGEND_MAIN: "Principal" LABEL_ATTACHMENT_SIZE_LIMIT: "Tamaño máximo para adjuntos" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permitir cuentas adicionales" LABEL_ALLOW_IDENTITIES: "Permitir múltiples identidades" LABEL_ALLOW_TEMPLATES: "Permitir plantillas" ALERT_WARNING: "¡Atención!" HTML_ALERT_WEAK_PASSWORD: | Estas utilizando la contraseña por defecto.
Debido a razones de seguridad, debes cambiar tu contraseña inmediatamente. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Pantalla de Ingreso" LABEL_DEFAULT_DOMAIN: "Dominio por defecto" LABEL_DETERMINE_USER_DOMAIN: "Intentar encontrar el dominio del usuario" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permitir la selección de idioma en la pantalla de ingreso" LABEL_DETERMINE_USER_LANGUAGE: "Intentar definir el idioma del usuari" TAB_BRANDING: LEGEND_BRANDING: "Personalización" LABEL_PAGE_TITLE: "Título de la página" LABEL_LOADING_DESCRIPTION: "Descripción" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Ingresar" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Descripción" LABEL_LOGIN_BACKGROUND: "Fondo" LABEL_LOGIN_CUSTOM_CSS: "CSS Personalizado" LABEL_LOGIN_SHOW_POWERED_LINK: "Mostrar el enlace \"Potenciado por RainLoop\" " LEGEND_USER: "Usuario" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Título del Logo" LABEL_USER_LOGO_MESSAGE: "Logo (Vista desde mensaje)" LABEL_USER_CUSTOM_CSS: "CSS Personalizado" LEGEND_WELCOME_PAGE: "Pantalla de bienvenida" LABEL_WELCOME_PAGE_TITLE: "Título" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Mostrar" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ninguno" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Una vez" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Siempre" HTML_ALERT_PREMIUM: "Esta función se encuentra disponible para Usuarios Premium." TAB_CONTACTS: LEGEND_CONTACTS: "Contactos" LEGEND_STORAGE: "Almacenamiento (PDO)" LABEL_ENABLE_CONTACTS: "Permitir contactos" LABEL_ALLOW_SYNC: "Permitir sincronización de contactos (servidor externo de CardDAV)" LABEL_STORAGE_TYPE: "Tip" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Usuario" LABEL_STORAGE_PASSWORD: "Contraseña" BUTTON_TEST: "Probar" ALERT_NOTICE: "¡Advertencia!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "No utilices este tipo de Base de Datos para un número grande de usuarios." HTML_ALERT_DOES_NOT_SUPPORTED: | Tu sistema no soporta el uso de Contactos.
Debes instalar o habilitar el uso de PDO (SQLite / MySQL / PostgreSQL) en tu servidor. TAB_DOMAINS: LEGEND_DOMAINS: "Dominios" BUTTON_ADD_DOMAIN: "Agregar dominio" BUTTON_ADD_ALIAS: "Agregar alias" DELETE_ARE_YOU_SURE: "¿Estás seguro?" HTML_DOMAINS_HELPER: | Lista de los dominios de correo al que se permite ingresar.
Haz click en el nombre de un dominio para modificarlo. TAB_SECURITY: LEGEND_SECURITY: "Seguridad" LABEL_ALLOW_TWO_STEP: "Activar la verificación de 2 pasos" LABEL_FORCE_TWO_STEP: "Forzar la Autenticación en 2 pasos" LABEL_USE_IMAGE_PROXY: "Utilizar un proxy local para mostrar imágenes externas" LABEL_ALLOW_OPEN_PGP: "Permitir OpenPGP" LABEL_SHOW_PHP_INFO: "Mostrar información de PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Credenciales de Acceso al panel de control" LABEL_CURRENT_PASSWORD: "Contraseña actual" LABEL_NEW_LOGIN: "Nuevo login" LABEL_NEW_PASSWORD: "Nueva contraseña" LABEL_REPEAT_PASSWORD: "Re-ingresar" BUTTON_UPDATE_PASSWORD: "Actualizar contraseña" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Requerir verificación del certificado SSL (IMAP / SMTP)" LABEL_ALLOW_SELF_SIGNED: "Permitir certificados auto-firmados" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Activar la integración con Google" LABEL_GOOGLE_AUTH: "Autorización" LABEL_GOOGLE_DRIVE: "Google Drive Integration (vista del editor)" LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Previsualizar archivos de Microsoft Word, Excel y PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "ID del Cliente" LABEL_GOOGLE_CLIENT_SECRET: "Clave secreta de Cliente" LABEL_GOOGLE_API_KEY: "Llave API" HINT_GOOGLE_API_KEY: "Requerido para seleccionar archivos con Google Drive" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Activar la integración con Facebook (Ingreso)" LABEL_FACEBOOK_APP_ID: "ID de la Aplicación" LABEL_FACEBOOK_APP_SECRET: "Clave secreta de la Aplicación" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Activar la integración con Twitter (Ingreso)" LABEL_TWITTER_CONSUMER_KEY: "Llave del Cliente" LABEL_TWITTER_CONSUMER_SECRET: "Llave secreta del Cliente" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Activar la integración con Dropbox" LABEL_DROPBOX_API_KEY: "Llave API" TOP_ALERT: "Puedes encontrar más información sobre integración de redes sociales en" TAB_PLUGINS: LEGEND_PLUGINS: "Complementos" LABEL_ENABLE_PLUGINS: "Activar Plugins" ALERT_NO_PLUGINS: "No hay plugins instalados." LINK_INSTALL_NEW: "¡Haz click aquí para instalar uno nuevo!" HINT_CLICK_NAME: "Haz click en el nombre para configurar el plugin." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Actualización disponible" LEGEND_AVAILABLE_FOR_INSTALLATION: "Instalación disponible" LEGEND_INSTALLED_PACKAGES: "Paquetes instalados" ALERT_CANNOT_ACCESS_REPOSITORY: "No se puede acceder al repositorio en estos momentos." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Tu dominio" LABEL_VERSION: "Versión" LABEL_CHECKING: "Verificando" TYPE_BASIC_HINT: "Este dominio no ha sido licenciado para uso comercial (algunas características no disponibles)." TYPE_BASIC_HINT_2: "Este dominio no puede ser licenciado." HTML_ALERT_TOP_1: "RainLoop Webmail está licenciado bajo" HTML_ALERT_TOP_2: "Eres libre de usarlo para un uso personal." HTML_ALERT_TOP_3: | Para utilizar RainLoop Webmail de forma comercial (con características adicionales) debes adquirir una licencia Premium. TYPE_PREMIUM_LIFETIME: "De por vida" LABEL_SUB_EXPIRES: "La suscripción finaliza" BUTTON_ACTIVATE: "Activar clave de suscripción para este dominio" BUTTON_PURCHASE: "Comprar" BUTTON_TRIAL: "Versión de Prueba" TAB_ABOUT: LEGEND_ABOUT: "Acerca" LABEL_TAG_HINT: "Moderno, simple y rápido cliente web de correo electrónico" LABEL_ALL_RIGHTS_RESERVED: "Todos los Derechos Reservados." HINT_READ_CHANGE_LOG: "Revisa la lista de cambios antes de actualizar." HINT_IS_UP_TO_DATE: "RainLoop está actualizado." HTML_NEW_VERSION: "Nueva versión ( %VERSION% ) está disponible." LABEL_UPDATING: "Actualizando" LABEL_CHECKING: "Buscando actualizaciones" BUTTON_UPDATE: "Actualizar" BUTTON_DOWNLOAD: "Descargar" BUTTON_CHANGELOG: "Lista de Cambios" POPUPS_ACTIVATE: TITLE_ACTIVATE: "¿Activar la clave de suscripción?" TITLE_ACTIVATION: "Activando..." LABEL_DOMAIN: "Dominio" LABEL_SUB_KEY: "Clave de Suscripción" BUTTON_ACTIVATE: "Activar" LABEL_ACTIVATED: "Activado" ERROR_INVALID_SUBS_KEY: "Clave de Suscripción inválida" SUBS_KEY_ACTIVATED: "Clave de Suscripción activada correctamente" HTML_DESC: "Después de la activación, la suscripción para %DOMAIN% será extendida.\n
\nTome nota que esta llave de suscripci\tón podrá\ \ ser activada solo para un dominio.\n

\nUna vez comenzado, el proceso de activación no puede ser abortado ni cancelado.\n" POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Agregar alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Dominio" BUTTON_CLOSE: "Cerrar" BUTTON_ADD: "Agregar" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Agregar dominio" TITLE_ADD_DOMAIN_WITH_NAME: "Agregar \"%NAME%\" como dominio" TITLE_EDIT_DOMAIN: "Editar \"&NAME&\"" LABEL_NAME: "Nombre" NAME_HELPER: "wildcards soportados" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "FILTRO" LABEL_SERVER: "Servidor" LABEL_PORT: "Puerto" LABEL_SECURE: "Seguridad" LABEL_WHITE_LIST: "Lista blanca" SECURE_OPTION_NONE: "Ninguno" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Permitir scripts de filtro" LABEL_ALLOW_USER_SCRIPT: "Permitir scripts propios" LABEL_USE_SHORT_LOGIN: "Inicio de Sesión corto" LABEL_USE_AUTH: "Usar autenticación" LABEL_USE_PHP_MAIL: "Utilizar la función mail() de PHP" BUTTON_TEST: "Probar" BUTTON_WHITE_LIST: "Lista blanca" BUTTON_SIEVE_CONFIGURATION: "Configuraciones de Filtro" BUTTON_BACK_TO_IMAP: "Volver a la configuración IMAP" BUTTON_BACK: "Volver" BUTTON_CLOSE: "Cerrar" BUTTON_ADD: "Agregar" BUTTON_UPDATE: "Actualizar" NEW_DOMAIN_DESC: "Esta configuración de Dominio le permitirá trabajar
con direcciones de correo tipo @%NAME%." WHITE_LIST_ALERT: | Lista de dominios con que los usuarios pueden ingresar. Use un espacio como delimitador. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" BUTTON_CLOSE: "Cerrar" BUTTON_SAVE: "Guardar" TOOLTIP_ABOUT_TITLE: "Acerca" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "ÂżEstás seguro de que deseas cerrar esta ventana?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Seleccionar idioma" HINTS: BETA: "beta" UNSTABLE: "inestable" WARNING: "¡AtenciĂłn!" NOT_SUPPORTED: "no soportado" REQUIRES_PHP_54: "requiere PHP 5.4 o superior" ERRORS: DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" UNKNOWN_ERROR: "Error desconocido" NOTIFICATIONS: INVALID_TOKEN: "Token inválido" AUTH_ERROR: "AutenticaciĂłn fallida" ACCESS_ERROR: "Error de acceso" CONNECTION_ERROR: "No se puede conectar al servidor" CAPTCHA_ERROR: "CAPTCHA Incorrecto." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > La cuenta social (ID) no está asignada a ninguna cuenta de correo todavĂ­a. Inicie sesiĂłn con las credenciales de correo electrĂłnico y habilite esta caracterĂ­stica en la configuraciĂłn de cuenta. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > La cuenta social (ID) no está asignada a ninguna cuenta de correo todavĂ­a. Inicie sesiĂłn con las credenciales de correo electrĂłnico y habilite esta caracterĂ­stica en la configuraciĂłn de cuenta. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >+ La cuenta social (ID) no está asignada a ninguna cuenta de correo todavĂ­a. Inicie sesiĂłn con las credenciales de correo electrĂłnico y habilite esta caracterĂ­stica en la configuraciĂłn de cuenta. DOMAIN_NOT_ALLOWED: "Dominio no permitido" ACCOUNT_NOT_ALLOWED: "La cuenta no está permitida" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "La verificaciĂłn en 2 pasos es obligatoria" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Error en la verificaciĂłn de dos pasos" COULD_NOT_SAVE_NEW_PASSWORD: "No se ha podido guardar la nueva contraseña" CURRENT_PASSWORD_INCORRECT: "La contraseña actual es incorrecta" NEW_PASSWORD_SHORT: "La contraseña es muy corta" NEW_PASSWORD_WEAK: "La contraseña es muy fácil" NEW_PASSWORD_FORBIDDENT: "La contraseña contiene caracteres prohibidos" CONTACTS_SYNC_ERROR: "Error de sincronizaciĂłn de Contactos" CANT_GET_MESSAGE_LIST: "No se puede obtener la lista de mensajes" CANT_GET_MESSAGE: "No se puede obtener el mensaje" CANT_DELETE_MESSAGE: "No se puede eliminar el mensaje" CANT_MOVE_MESSAGE: "No se puede mover el mensaje" CANT_SAVE_MESSAGE: "No se puede guardar el mensaje" CANT_SEND_MESSAGE: "No se puede enviar el mensaje" INVALID_RECIPIENTS: "Los destinatarios no son válidos" CANT_SAVE_FILTERS: "No se han podido guardar los filtros" CANT_GET_FILTERS: "No se pudieron obtener los filtros" FILTERS_ARE_NOT_CORRECT: "Los filtros no son correctos" CANT_CREATE_FOLDER: "No se puede crear la carpeta" CANT_RENAME_FOLDER: "No se puede renombrar la carpeta" CANT_DELETE_FOLDER: "No se puede eliminar la carpeta" CANT_DELETE_NON_EMPTY_FOLDER: "No se puede eliminar una carpeta que no está vacĂ­a" CANT_SUBSCRIBE_FOLDER: "No se pudo suscribir a la carpeta" CANT_UNSUBSCRIBE_FOLDER: "No se pudo dessuscribir a la carpeta" CANT_SAVE_SETTINGS: "No se pudieron guardar las configuraciones" CANT_SAVE_PLUGIN_SETTINGS: "No se pudieron guardar las configuraciones" DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" CANT_INSTALL_PACKAGE: "No se ha podido instalar el paquete" CANT_DELETE_PACKAGE: "No se ha podido eliminar el paquete" INVALID_PLUGIN_PACKAGE: "El paquete del plugin es inválido" UNSUPPORTED_PLUGIN_PACKAGE: "El paquete del plugin es incompatible" LICENSING_SERVER_IS_UNAVAILABLE: "El Servidor de SuscripciĂłn no está disponible" LICENSING_DOMAIN_EXPIRED: "La suscripciĂłn para este dominio ha expirado." LICENSING_DOMAIN_BANNED: "La suscripciĂłn para este dominio se ha bloqueado." DEMO_SEND_MESSAGE_ERROR: "Por razones de seguridad, esta cuenta no permite enviar mensajes a direcciones de correo electrĂłnico externas" DEMO_ACCOUNT_ERROR: "Debido a razones de seguridad, esta cuenta no puede realizar esta acciĂłn" ACCOUNT_ALREADY_EXISTS: "La cuenta ya existe" ACCOUNT_DOES_NOT_EXIST: "La cuenta no existe" MAIL_SERVER_ERROR: "OcurriĂł un error mientras se accedĂ­a al servidor" INVALID_INPUT_ARGUMENT: "Los datos ingresados son inválidos" UNKNOWN_ERROR: "Error desconocido" STATIC: BACK_LINK: "Actualizar" DOMAIN_LIST_DESC: "Lista de dominios de correo web que se le permite acceder." PHP_EXSTENSIONS_ERROR_DESC: "¡La extensiĂłn de PHP requerida no está disponible en su configuraciĂłn de PHP!" PHP_VERSION_ERROR_DESC: "¡La versiĂłn de PHP (%VERSION%) es menor a la mĂ­nima requerida 5.3.0!" NO_SCRIPT_TITLE: "JavaScript es requerido para esta aplicaciĂłn." NO_SCRIPT_DESC: | JavaScript está desactivado. Por favor habilite JavaScript en la configuraciĂłn de su navegador e intĂ©ntelo de nuevo. NO_COOKIE_TITLE: "Las Cookies son requeridas para esta aplicaciĂłn." NO_COOKIE_DESC: | Las Cookies están desactivadas. Por favor habilite las Cookies en la configuraciĂłn de su navegador e intĂ©ntelo de nuevo. BAD_BROWSER_TITLE: "El navegador no está actualizado" BAD_BROWSER_DESC: | Para usar todas las caracterĂ­sticas de esta aplicaciĂłn, descargue e instale uno de estos navegadores: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml000066400000000000000000000500271361462701300256330ustar00rootroot00000000000000fa_IR: LOGIN: LABEL_LOGIN: "ŮرŮŘŻ" LABEL_PASSWORD: "گذرŮاÚه" BUTTON_LOGIN: "ŮرŮŘŻ به صŮحه مدیریت" TOP_PANEL: LABEL_PREMIUM: "پریمیŮŮ…" LABEL_ADMIN_PANEL: "صŮحه مدیریت" TABS_LABELS: LABEL_GENERAL_NAME: "عمŮŮ…ŰŚ" LABEL_LOGIN_NAME: "ŮرŮŘŻ" LABEL_BRANDING_NAME: "برندسازی" LABEL_CONTACTS_NAME: "تماس‌ها" LABEL_DOMAINS_NAME: "دامنه‌ها" LABEL_SECURITY_NAME: "امنیت" LABEL_INTEGRATION_NAME: "یکپارچه‌سازی" LABEL_PLUGINS_NAME: "اŮزŮنه‌ها" LABEL_PACKAGES_NAME: "بسته‌ها" LABEL_LICENSING_NAME: "مجŮزها" LABEL_ABOUT_NAME: "درباره" TAB_GENERAL: LEGEND_INTERFACE: "رابط" LABEL_LANGUAGE: "زبان" LABEL_LANGUAGE_ADMIN: "زبان (مدیر)" LABEL_THEME: "ŮľŮسته" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "زبان در صŮحه تنظیمات قابل انتخاب باشد" LABEL_ALLOW_THEMES_ON_SETTINGS: "ŮľŮسته در صŮحه تنظیمات قابل انتخاب باشد" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "تصŮیر پشت زمینه در صŮحه تنظیمات قابل انتخاب باشد" LABEL_NEW_FOLDER_MOVE: "دکمه جدید «انتقال به ŮľŮشه»" LABEL_SHOW_THUMBNAILS: "اندازه Ú©ŮÚ†Ú© را نشان بده (پیŮست‌ها)" LABEL_ALLOW_GRAVATAR: "اجازه استŮاده از آŮاتار" LEGEND_MAIN: "اصلی" LABEL_ATTACHMENT_SIZE_LIMIT: "Ů…Ř­ŘŻŮŘŻŰŚŘŞ اندازه پیŮست" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "مجŮز استŮاده از نام‌های کاربری دیگر" LABEL_ALLOW_IDENTITIES: "اجازه استŮاده از چندین شناسه" LABEL_ALLOW_TEMPLATES: "اجازه استŮاده از ŮľŮسته‌ها" ALERT_DATA_ACCESS: "شاخه data قابل دسترس هست. تنظیمات Ůب‌سرŮر را Ř·Ůری انجام دهید این شاخه از بیرŮن قابل دسترس نباشد. اطلاعات بیشتر اینجا هست:" ALERT_WARNING: "اخطار!" HTML_ALERT_WEAK_PASSWORD: |+ شما در حال استŮاده از گذرŮاÚه پیش‌Ůرض کاربر مدیر هستید.
بدلیل رعایت مسائل امنیتی گذرŮاÚه را به کلمه دیگری تغییر دهید. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "صŮحه ŮرŮŘŻ" LABEL_DEFAULT_DOMAIN: "دامنه پیش‌Ůرض" LABEL_DETERMINE_USER_DOMAIN: "برای تشخیص دامنه کاربر تلاش Ř´ŮŘŻ" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "انتخاب زبان در صŮحه ŮرŮŘŻ" LABEL_DETERMINE_USER_LANGUAGE: "برای تشخیص زبان کاربر تلاش Ř´ŮŘŻ" TAB_BRANDING: LEGEND_BRANDING: "برندسازی" LABEL_PAGE_TITLE: "عنŮان صŮحه" LABEL_LOADING_DESCRIPTION: "بارگذاری ŘŞŮضیحات" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "ŮرŮŘŻ" LABEL_LOGIN_LOGO: "Ů„ŮÚŻŮ" LABEL_LOGIN_DESCRIPTION: "ŘŞŮضیحات" LABEL_LOGIN_BACKGROUND: "پشت‌زمینه" LABEL_LOGIN_CUSTOM_CSS: "CSS ŘłŮارشی‌سازی" LABEL_LOGIN_SHOW_POWERED_LINK: "نمایش لینک \"قدرت گرŮته از RainLoop\"" LEGEND_USER: "کاربر" LABEL_USER_LOGO: "Ů„ŮÚŻŮ" LABEL_USER_LOGO_TITLE: "عنŮان Ů„ŮÚŻŮ" LABEL_USER_LOGO_MESSAGE: "Ů„ŮÚŻŮ (مشاهده پیام)" LABEL_USER_CUSTOM_CSS: "CSS ŘłŮارشی‌سازی" LEGEND_WELCOME_PAGE: "صŮحه Ř®Ůش‌آمدگŮŰŚŰŚ" LABEL_WELCOME_PAGE_TITLE: "عنŮان" LABEL_WELCOME_PAGE_URL: "تارنما" LABEL_WELCOME_PAGE_DISPLAY: "نمایش" OPTION_WELCOME_PAGE_DISPLAY_NONE: "هیچ‌کدام" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "یک‌بار" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "همیشه" HTML_ALERT_PREMIUM: "این قابلیت برای نسخه Premium مشترکین در دسترس هست." TAB_CONTACTS: LEGEND_CONTACTS: "تماس‌ها" LEGEND_STORAGE: "Ůضای‌ ذخیره‌سازی (pdo)" LABEL_ENABLE_CONTACTS: "Ůعال‌سازی تماس‌ها" LABEL_ALLOW_SYNC: "اجازه‌ همگام‌سازی تماس‌ها (با ŰŚÚ© سرŮŰŚŘł خارجی CardDAV)" LABEL_STORAGE_TYPE: "نŮŘą" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "کاربر" LABEL_STORAGE_PASSWORD: "گذرŮاÚه" BUTTON_TEST: "تست" ALERT_NOTICE: "ŘŞŮجه!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "از این پایگاه داده برای کاربران زیاد استŮاده نکنید." HTML_ALERT_DOES_NOT_SUPPORTED: | سیستم از تماس‌ها پشتیبانی نمی‌کند
شما باید اŮزŮنه PDO (SQLite / MySQL / PostgreSQL) را نصب کنید یا اینکه Ůعال کنید. TAB_DOMAINS: LEGEND_DOMAINS: "دامنه‌ها" BUTTON_ADD_DOMAIN: "اضاŮه‌کردن دامنه" BUTTON_ADD_ALIAS: "اضاŮه‌کردن نام مستعار" DELETE_ARE_YOU_SURE: "آیا مطمئن هستید؟" HTML_DOMAINS_HELPER: | لیستی از دامنه‌هایی که Ůب‌میل اجازه دسترسی به آنها را دارد.
رŮŰŚ دامنه دامنه جهت پیکربندی کلیک کنید. TAB_SECURITY: LEGEND_SECURITY: "امنیت" LABEL_ALLOW_TWO_STEP: "اعتبارسنجی د٠مرحله‌ای" LABEL_FORCE_TWO_STEP: "اعتبارسنجی د٠مرحله‌ای اجباری" LABEL_USE_IMAGE_PROXY: "از پرŮکسی محلی برای عکسهای خارج از سرŮر استŮاده Ř´ŮŘŻ" LABEL_ALLOW_OPEN_PGP: "Ůعال‌سازی OpenPGP" LABEL_SHOW_PHP_INFO: "نمایش اطلاعات PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "اعتبار مجŮز دسترسی به صŮحه مدیریت" LABEL_CURRENT_PASSWORD: "گذرŮاÚه Ůعلی" LABEL_NEW_LOGIN: "نام کاربری جدید" LABEL_NEW_PASSWORD: "گذرŮاÚه جدید" LABEL_REPEAT_PASSWORD: "تکرار" BUTTON_UPDATE_PASSWORD: "برŮز‌رسانی گذرŮاÚه" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "به بررسی ÚŻŮاهینامه SSL نیاز داشته باشد (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "به ÚŻŮاهی‌نامه‌هایی که ŘŞŮسط Ř®Ůدشان امضاء شده‌اند اجازه بده" TAB_INTEGRATIONS: LEGEND_GOOGLE: "ÚŻŮÚŻŮ„" LABEL_ENABLE_GOOGLE: "Ůعال‌سازی یکپارچگی با ÚŻŮÚŻŮ„" LABEL_GOOGLE_AUTH: "احراز مجŮز" LABEL_GOOGLE_DRIVE: "یکپارچگی با ÚŻŮÚŻŮ„ درایŮر (قسمت ایجاد پیام)" LABEL_GOOGLE_PREVIEW: "یکپارچگی با نمایش Ůایلهای اداری ÚŻŮÚŻŮ„ (پیش نمایش برای Work, Excel, PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "شناسه کلاینت" LABEL_GOOGLE_CLIENT_SECRET: "رمز کلاینت" LABEL_GOOGLE_API_KEY: "کلید API" HINT_GOOGLE_API_KEY: "اجباری برای دریاŮŘŞ کننده Ůایل ÚŻŮÚŻŮ„ درایŮ" LEGEND_FACEBOOK: "Ůیس‌بŮÚ©" LABEL_ENABLE_FACEBOOK: "Ůعال‌سازی یکپارچگی با Ůیس‌بŮÚ© (احراز هŮŰŚŘŞ)" LABEL_FACEBOOK_APP_ID: "شناسه برنامه" LABEL_FACEBOOK_APP_SECRET: "رمز برنامه" LEGEND_TWITTER: "ŘŞŮییتر" LABEL_ENABLE_TWITTER: "Ůعال‌سازی یکپارچگی با ŘŞŮییتر (احراز هŮŰŚŘŞ)" LABEL_TWITTER_CONSUMER_KEY: "کلید مشتری" LABEL_TWITTER_CONSUMER_SECRET: "رمز مشتری" LEGEND_DROPBOX: "دارپ‌باکس" LABEL_ENABLE_DROPBOX: "Ůعال‌سازی یکپارچگی با دراپ‌باکس" LABEL_DROPBOX_API_KEY: "کلید API" TOP_ALERT: "جزییات اطلاعات یکپارچگی با شبکه اجتماعی پیدا Ř´ŘŻ" TAB_PLUGINS: LEGEND_PLUGINS: "اŮزŮنه‌ها" LABEL_ENABLE_PLUGINS: "Ůعال‌سازی اŮزŮنه‌ها" ALERT_NO_PLUGINS: "هیچ اŮزŮنه‌ای نصب نشده است" LINK_INSTALL_NEW: "اینجا برای نصب جدید کلیک کنید" HINT_CLICK_NAME: "رŮŰŚ نام هر اŮزŮنه برای پیکربندی آن کلیک کنید" TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "برای برŮزرسانی در دسترس هست" LEGEND_AVAILABLE_FOR_INSTALLATION: "برای نصب در دسترس هست" LEGEND_INSTALLED_PACKAGES: "بسته‌های نصب شده" ALERT_CANNOT_ACCESS_REPOSITORY: "در این لحظه دسترسی به مخزن امکان‌پذیر نیست" TAB_LICENSING: LABEL_YOUR_DOMAIN: "دامنه شما" LABEL_VERSION: "نسخه" LABEL_CHECKING: "در حال Ú†Ú© کردن" TYPE_BASIC_HINT: "این دامنه مجŮز استŮاده تجاری را ندارد (با قابلیت‌های بیشتر)" TYPE_BASIC_HINT_2: "به این دامنه مجŮز داده نشده است." HTML_ALERT_TOP_1: "Ůبمیل RainLoop ŘŞŘ­ŘŞ مجŮز" HTML_ALERT_TOP_2: " شما برای استŮاده از آن آزاد personal projects. هستید" HTML_ALERT_TOP_3: | استŮاده تجاری (با قابلیت‌های بیشتر) از RainLoop Webmail نیاز به پرداخت Ř­Ů‚ اشتراک دارد. TYPE_PREMIUM_LIFETIME: "مادام العمر" LABEL_SUB_EXPIRES: "انقضای Ř­Ů‚ اشتراک" BUTTON_ACTIVATE: "Ůعال‌کردن Ř­Ů‚ اشتراک این دامنه" BUTTON_PURCHASE: "خرید" BUTTON_TRIAL: "آزمایشی" TAB_ABOUT: LEGEND_ABOUT: "درباره" LABEL_TAG_HINT: "ŰŚÚ© رابط کاربری پست الکترŮنیک ساده، پیشرŮته ٠سریع" LABEL_ALL_RIGHTS_RESERVED: "همه Ř­Ů‚ŮŮ‚ Ů…Ř­ŮŮظ هست" HINT_READ_CHANGE_LOG: "Ůایل Ůقایع را قبل از برŮزرسانی بخŮانید." HINT_IS_UP_TO_DATE: "RainLoop برŮز هست" HTML_NEW_VERSION: "نسخه %VERSION% در دسترس هست" LABEL_UPDATING: "در حال برŮزرسانی" LABEL_CHECKING: "Ú†Ú© کردن برای برŮزرسانی" BUTTON_UPDATE: "برŮزرسانی" BUTTON_DOWNLOAD: "دریاŮŘŞ" BUTTON_CHANGELOG: "تغییرات" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Ř­Ů‚ اشتراک Ůعال شده است؟" TITLE_ACTIVATION: "در حال Ůعال‌سازی..." LABEL_DOMAIN: "دامن" LABEL_SUB_KEY: "کلید Ř­Ů‚ اشتراک" BUTTON_ACTIVATE: "Ůعال‌سازی" LABEL_ACTIVATED: "Ůعال شده است" ERROR_INVALID_SUBS_KEY: "کلید Ř­Ů‚ اشتراک نامعتبر" SUBS_KEY_ACTIVATED: "کلید Ř­Ů‚ اشتراک با Ů…ŮŮقیت Ůعال Ř´ŘŻ" HTML_DESC: | بعد از Ůعال‌سازی، سطح بالاتر اشتراک برای %DOMAIN% گسترش Ř®Ůاهد یاŮŘŞ.
ŘŞŮجه کنید که کلید اشتراک Ůقط برای ŰŚÚ© دامنه می‌تŮاند Ůعال Ř´ŮŘŻ.

زمانی که شرŮŘą کردید، Ůرآیند Ůعال‌سازی قابل انصرا٠نیست. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "اضاŮه کردن نام مستعار" LABEL_ALIAS: "مستعار" LABEL_DOMAIN: "دامنه" BUTTON_CLOSE: "بستن" BUTTON_ADD: "اضاŮه‌کردن" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "اضاŮه‌کردن دامنه" TITLE_ADD_DOMAIN_WITH_NAME: "اضاŮه کردن دامنه \"%NAME%\"" TITLE_EDIT_DOMAIN: "Ůیرایش دامنه \"%NAME%\"" LABEL_NAME: "نام" NAME_HELPER: "پشتیبانی از wildcard" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "سرŮر" LABEL_PORT: "ŮľŮرت" LABEL_SECURE: "امن" LABEL_WHITE_LIST: "لیست ŘłŮŰŚŘŻ" SECURE_OPTION_NONE: "هیچ‌کدام" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "اجازه به اجرا‌شŮنده‌های sieve" LABEL_ALLOW_USER_SCRIPT: "اجازه به اجرا‌شŮنده‌های ŘłŮارشی کاربر" LABEL_USE_SHORT_LOGIN: "استŮاده از ŮرŮŘŻ Ú©Ůتاه بدŮن دامنه" LABEL_USE_AUTH: "استŮاده از احراز هŮŰŚŘŞ" LABEL_USE_PHP_MAIL: "استŮاده از تابع mail() زبان PHP" BUTTON_TEST: "تست" BUTTON_WHITE_LIST: "لیست ŘłŮŰŚŘŻ" BUTTON_SIEVE_CONFIGURATION: "پیکربندی Sieve" BUTTON_BACK_TO_IMAP: "برگشت به تنظیمات IMAP" BUTTON_BACK: "برگشت" BUTTON_CLOSE: "بستن" BUTTON_ADD: "اضاŮه‌کردن" BUTTON_UPDATE: "برŮزرسانی" NEW_DOMAIN_DESC: "این تنظیمات دامنه به شما اجازه کار کردن
با پست الکترŮنیک %NAME% را می‌دهد." WHITE_LIST_ALERT: | لیستی از دامنه‌ها که کاربران Ůب‌میل می‌تŮانند به آنها دسترسی داشته باشند. از Ůاصله جهت جدا کردن استŮاده کنید. POPUPS_PLUGIN: TITLE_PLUGIN: "اŮزŮنه" DESC_NOTHING_TO_CONFIGURE: "چیزی برای پیکربندی نیست" BUTTON_CLOSE: "بستن" BUTTON_SAVE: "ذخیره" TOOLTIP_ABOUT_TITLE: "درباره" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "آیا شما از بستن این پنجره اطمینان دارید؟" POPUPS_LANGUAGES: TITLE_LANGUAGES: "زبان Ř®ŮŘŻ را انتخاب کنید" HINTS: BETA: "آزمایشی" UNSTABLE: "ناپایدار" WARNING: "هشدار!" NOT_SUPPORTED: "پشتیبانی نمی‌شŮŘŻ" REQUIRES_PHP_54: "به نسخه PHP 5.4 ٠بالاتر نیاز دارید" ERRORS: DOMAIN_ALREADY_EXISTS: "دامنه ŮجŮŘŻ دارد" UNKNOWN_ERROR: "خطای نامشخص" NOTIFICATIONS: INVALID_TOKEN: "ŘŞŮکن نامعتبر" AUTH_ERROR: "احراز هŮŰŚŘŞ انجام نشد" ACCESS_ERROR: "خطا در دسترسی" CONNECTION_ERROR: "عدم اتصال به سرŮر" CAPTCHA_ERROR: "تصŮیر اشتباه Ůارد شده است" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > این شناسه اجتماعی برای هیچ کاربر پست الکترŮنیکی تاکنŮن تخصیص داده نشده است. با استŮاده از اعتبار کاربر پست الکترŮنیک Ř®ŮŘŻ Ůارد Ř´ŮŰŚŘŻ ٠سپس این ŮŰŚÚÚŻŰŚ را در تنظیمات کاربر Ř®ŮŘŻ Ůعال کنید. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > این شناسه اجتماعی برای هیچ کاربر پست الکترŮنیکی تاکنŮن تخصیص داده نشده است. با استŮاده از اعتبار کاربر پست الکترŮنیک Ř®ŮŘŻ Ůارد Ř´ŮŰŚŘŻ ٠سپس این ŮŰŚÚÚŻŰŚ را در تنظیمات کاربر Ř®ŮŘŻ Ůعال کنید. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > این شناسه اجتماعی برای هیچ کاربر پست الکترŮنیکی تاکنŮن تخصیص داده نشده است. با استŮاده از اعتبار کاربر پست الکترŮنیک Ř®ŮŘŻ Ůارد Ř´ŮŰŚŘŻ ٠سپس این ŮŰŚÚÚŻŰŚ را در تنظیمات کاربر Ř®ŮŘŻ Ůعال کنید. DOMAIN_NOT_ALLOWED: "دامنه اجازه داده نشده است" ACCOUNT_NOT_ALLOWED: "کاربر اجازه داده نشده است" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "اعتبارسنجی د٠مرحله‌ای Ů…Ůرد نیاز است" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطا در اعتبارسنجی د٠مرحله‌ای" COULD_NOT_SAVE_NEW_PASSWORD: "گذرŮاÚه جدید ذخیره نشد" CURRENT_PASSWORD_INCORRECT: "گذرŮاÚه Ůعلی اشتباه است" NEW_PASSWORD_SHORT: "گذرŮاÚه Ú©Ůتاه است" NEW_PASSWORD_WEAK: "گذرŮاÚه بسیار ساده است" NEW_PASSWORD_FORBIDDENT: "گذرŮاÚه شامل کاراکترهای غیرمجاز است" CONTACTS_SYNC_ERROR: "همگام‌سازی تماس‌ها با خطا همراه بŮŘŻ" CANT_GET_MESSAGE_LIST: "امکان دریاŮŘŞ لیست پیام‌ها نیست" CANT_GET_MESSAGE: "امکان دریاŮŘŞ پیام نیست" CANT_DELETE_MESSAGE: "امکان حذ٠پیام نیست" CANT_MOVE_MESSAGE: "امکان انتقال پیام نیست" CANT_SAVE_MESSAGE: "امکان ذخیره پیام نیست" CANT_SEND_MESSAGE: "امکان ارسال پیام نیست" INVALID_RECIPIENTS: "گیرنده نامعتبر" CANT_SAVE_FILTERS: "امکان ذخیره Ůیلترها نیست" CANT_GET_FILTERS: "امکان دریاŮŘŞ Ůیلترها نیست" FILTERS_ARE_NOT_CORRECT: "Ůیلترها صحیح نیستند" CANT_CREATE_FOLDER: "امکان ایجاد شاخه ŮجŮŘŻ ندارد" CANT_RENAME_FOLDER: "امکان تغییر نام شاخه نیست" CANT_DELETE_FOLDER: "امکان حذ٠شاخه نیست" CANT_DELETE_NON_EMPTY_FOLDER: "امکان حذ٠شاخه‌ای که خالی نیست ŮجŮŘŻ ندارد" CANT_SUBSCRIBE_FOLDER: "امکان اشتراک شاخه نیست" CANT_UNSUBSCRIBE_FOLDER: "امکان عدم اشتراک شاخه نیست" CANT_SAVE_SETTINGS: "امکان ذخیره تنظیمات نیست" CANT_SAVE_PLUGIN_SETTINGS: "امکان ذخیره تنظیمات نیست" DOMAIN_ALREADY_EXISTS: "دامنه در حال حاضر Ů…ŮجŮŘŻ است" CANT_INSTALL_PACKAGE: "نصب بسته با خطا همراه بŮŘŻ" CANT_DELETE_PACKAGE: "حذ٠بسته با خطا همراه بŮ" INVALID_PLUGIN_PACKAGE: "بسته اŮزŮنه نامعتبر است" UNSUPPORTED_PLUGIN_PACKAGE: "بسته اŮزŮنه پشتیبانی نمی‌شŮŘŻ" LICENSING_SERVER_IS_UNAVAILABLE: "سرŮر مشترک شدن در دسترس نیست" LICENSING_DOMAIN_EXPIRED: "اشتراک برای این دامنه منقضی شده است" LICENSING_DOMAIN_BANNED: "اشتراک برای این دامنه مسدŮŘŻ شده است" DEMO_SEND_MESSAGE_ERROR: "بنابر اهدا٠امنیتی، این کاربر اجازه ارسال ایمیل به ŰŚÚ© ایمیل خارج از دامنه را ندارد!" DEMO_ACCOUNT_ERROR: "بنابر اهدا٠امنیتی، این کاربر اجازه انجام این عملیات را ندارد!" ACCOUNT_ALREADY_EXISTS: "کاربر ŮجŮŘŻ دارد" ACCOUNT_DOES_NOT_EXIST: "کاربر ŮجŮŘŻ ندارد" MAIL_SERVER_ERROR: "ŰŚÚ© خطا در زمان دسترسی به سرŮŰŚŘł پست الکترŮنیک رخ داد" INVALID_INPUT_ARGUMENT: "پارامترهای ŮرŮŘŻŰŚ نامعتبر" UNKNOWN_ERROR: "خطای نامشخص" STATIC: BACK_LINK: "بارگذاری مجدد" DOMAIN_LIST_DESC: "لیستی از دامنه‌های Ůب‌میل که برای دسترسی مجاز است." PHP_EXSTENSIONS_ERROR_DESC: "به ŰŚÚ© اŮزŮنه PHP نیاز دارد که در تنظیمات مربŮŘ· به PHP شما ŮجŮŘŻ ندارد!" PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه Ů…Ůرد انتظار 5.3.0 هست!" NO_SCRIPT_TITLE: "جاŮا‌اسکریپت برای این برنامه Ů…Ůرد نیاز است." NO_SCRIPT_DESC: | پشتیبانی از جاŮااسکریپت در مرŮرگر شما ŮجŮŘŻ ندارد. لطŮا پشتیبانی از جاŮا‌اسکریپت را در تنظیمات مرŮرگر Ř®ŮŘŻ Ůعال کنید ٠مجددا تلاش کنید. NO_COOKIE_TITLE: "Cookie باید بر رŮŰŚ مرŮرگر شما جهت استŮاده از برنامه Ůعال باشد." NO_COOKIE_DESC: | پشتیبانی از Cookie در مرŮرگر شما Ůعال نیست. لطŮا Cookie را در تنظیمات مرŮرگر Ř®ŮŘŻ Ůعال کنید ٠مجددا تلاش کنید. BAD_BROWSER_TITLE: "نسخه مرŮرگر شما قدیمی است." BAD_BROWSER_DESC: | برای استŮاده از تمام قابلیتهای برنامه، ŰŚÚ©ŰŚ از مرŮرگرهای زیر را دریاŮŘŞ ٠نصب کنید. rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/fi_FI.yml000066400000000000000000000350441361462701300256310ustar00rootroot00000000000000fi_FI: LOGIN: LABEL_LOGIN: "Tunnus" LABEL_PASSWORD: "Salasana" BUTTON_LOGIN: "Kirjaudu hallintapaneliin" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Halintapaneli" TABS_LABELS: LABEL_GENERAL_NAME: "Yleiset" LABEL_LOGIN_NAME: "Kirjautuminen" LABEL_BRANDING_NAME: "Brändäys" LABEL_CONTACTS_NAME: "Yhteystiedot" LABEL_DOMAINS_NAME: "Verkkotunnutkset" LABEL_SECURITY_NAME: "Turvallisuus" LABEL_INTEGRATION_NAME: "Integroinnit" LABEL_PLUGINS_NAME: "Pluginit" LABEL_PACKAGES_NAME: "Paketit" LABEL_LICENSING_NAME: "Lisensointi" LABEL_ABOUT_NAME: "Tietoja" TAB_GENERAL: LEGEND_INTERFACE: "Käyttöliittymä" LABEL_LANGUAGE: "Kieli" LABEL_LANGUAGE_ADMIN: "Kieli (admin)" LABEL_THEME: "Teema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Salli kielivalinta asetuksissa" LABEL_ALLOW_THEMES_ON_SETTINGS: "Salli teemavalinta asetuksissa" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Salli taustavalinta asetuksissa" LABEL_SHOW_THUMBNAILS: "Näytä kuvakkeet (liitteet)" LABEL_ALLOW_GRAVATAR: "Salli Gravatar" LEGEND_MAIN: "Yleiset" LABEL_ATTACHMENT_SIZE_LIMIT: "Liitetiedoston kokorajoitus" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Salli ylimääräiset tilit" LABEL_ALLOW_IDENTITIES: "Salli useat identiteetit" LABEL_ALLOW_TEMPLATES: "Salli mallipohjat" ALERT_WARNING: "Varoitus!" HTML_ALERT_WEAK_PASSWORD: | Sinulla on käytössäsi hallintatunnuksen oletussalasana.
Tietoturvasyistä, ole ystävällinen ja vaihda salasanasi nyt. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Kirjautumissivu" LABEL_DEFAULT_DOMAIN: "Oletus domain" LABEL_DETERMINE_USER_DOMAIN: "Koita päätellä käyttäjän domain" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Salli kielivalinta kirjautumissivulla" LABEL_DETERMINE_USER_LANGUAGE: "Koita päätellä käyttäjän kieli" TAB_BRANDING: LEGEND_BRANDING: "Brändäys" LABEL_PAGE_TITLE: "Sivun otsikko" LABEL_LOADING_DESCRIPTION: "Ladataan kuvausta" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Kirjaudu" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Kuvaus" LABEL_LOGIN_BACKGROUND: "Tausta" LABEL_LOGIN_CUSTOM_CSS: "Muokattu CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Näytä \"Powered by RainLoop\" linkki" LEGEND_USER: "Käyttäjä" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logo otsikko" LABEL_USER_LOGO_MESSAGE: "Logo (Viestinäkymä)" LABEL_USER_CUSTOM_CSS: "Muokattu CSS" LEGEND_WELCOME_PAGE: "Tervetuloa sivu" LABEL_WELCOME_PAGE_TITLE: "Otsikko" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Näytä" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ei mitään" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Kerran" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Aina" HTML_ALERT_PREMIUM: "Tämä toiminto on saatavissa vain Premium tilaajille." TAB_CONTACTS: LEGEND_CONTACTS: "Yhteystiedot" LEGEND_STORAGE: "Tallennus (PDO)" LABEL_ENABLE_CONTACTS: "Salli yhteystiedot" LABEL_ALLOW_SYNC: "Salli yhteystietojen synkronointi (ulkoisella CardDAV palvelimella)" LABEL_STORAGE_TYPE: "Tyyppi" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Käyttäjä" LABEL_STORAGE_PASSWORD: "Salasana" BUTTON_TEST: "Testi" ALERT_NOTICE: "Huomio!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Älä käytä tätä tietokantatyyppiä suurella määrällä aktiivisia käyttäjiä." HTML_ALERT_DOES_NOT_SUPPORTED: | Järjestelmäsi ei tue yhteystietoja.
Asenna tai aktivoi PDO (SQLite / MySQL / PostgreSQL) lisäosa palvelimellasi. TAB_DOMAINS: LEGEND_DOMAINS: "Domainit" BUTTON_ADD_DOMAIN: "Lisää domain" BUTTON_ADD_ALIAS: "Lisää alias" DELETE_ARE_YOU_SURE: "Oletko varma?" HTML_DOMAINS_HELPER: | Lista domaineista joilla webmaililla on pääsy.
Klikkaa nimeä konfiguroidaksesi domain. TAB_SECURITY: LEGEND_SECURITY: "Tietoturva" LABEL_ALLOW_TWO_STEP: "Salli 2 vaiheinen todentaminen" LABEL_FORCE_TWO_STEP: "Pakota 2 vaiheinen todentaminen" LABEL_USE_IMAGE_PROXY: "Käytä paikallista proxya ulkoisille kuville." LABEL_ALLOW_OPEN_PGP: "Salli OpenPGP" LABEL_SHOW_PHP_INFO: "Näytä PHP tiedot" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Hallintapaneeli kirjautumistiedot" LABEL_CURRENT_PASSWORD: "Nykyinen salasana" LABEL_NEW_LOGIN: "Uusi tunnus" LABEL_NEW_PASSWORD: "Uusi salasana" LABEL_REPEAT_PASSWORD: "Toista" BUTTON_UPDATE_PASSWORD: "Päivitä salasana" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Vaadi SSL sertifikaatin varmistus (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Salli itse-allekirjoitetut sertifikaatit" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Aktivoi Google integrointi" LABEL_GOOGLE_AUTH: "Valtuutus" LABEL_GOOGLE_DRIVE: "Google Drive integraatio" LABEL_GOOGLE_PREVIEW: "Google esikatselun integrointi (MS Word, Excel ja PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "Asiakkaan ID" LABEL_GOOGLE_CLIENT_SECRET: "Asiakkaan salasana" LABEL_GOOGLE_API_KEY: "API avain" HINT_GOOGLE_API_KEY: "Vaaditaan Google Drive File Picker:lle" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Aktivoi Facebook integrointi (Tunnistus)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Aktivoi Twitter integrointi (Tunnistus)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Aktivoi Dropbox integrointi" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "Yksityiskohtaiset tiedot some-integraatioista löytyy täältä" TAB_PLUGINS: LEGEND_PLUGINS: "Pluginit" LABEL_ENABLE_PLUGINS: "Aktivoi pluginit" ALERT_NO_PLUGINS: "Yhtään pluginia ei ole asennettu" LINK_INSTALL_NEW: "Asenna tästä uusi!" HINT_CLICK_NAME: "Klikkaa nimeä konfiguroidaksesi plugin" TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Voidaan päivittää" LEGEND_AVAILABLE_FOR_INSTALLATION: "Voidaan asentaa" LEGEND_INSTALLED_PACKAGES: "Aennetut pakkaukset" ALERT_CANNOT_ACCESS_REPOSITORY: "Pääsy varastoon ei toimi tällä hetkellä." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Sinun domain" LABEL_VERSION: "Versio" LABEL_CHECKING: "Tarkastaa" TYPE_BASIC_HINT: "Tämä domain ei ole lisensoitu kaupalliseen käyttöön (lisäominaisuuksilla)." TYPE_BASIC_HINT_2: "Tätä verkkotunnusta ei voi lisensoida." HTML_ALERT_TOP_1: "RainLoop Webmail on lisensoitu" HTML_ALERT_TOP_2: "Voit käyttää ilmaiseksi omissa projekteissasi. " HTML_ALERT_TOP_3: | RainLoop Webmailin kaupallinen käyttö (lisäominaisuuksilla) vaatii tilauksen. TYPE_PREMIUM_LIFETIME: "Kesto" LABEL_SUB_EXPIRES: "Tilaus päättyy" BUTTON_ACTIVATE: "Aktivoi Tilaus Avain tälle verkkotunnukselle" BUTTON_PURCHASE: "Osta" BUTTON_TRIAL: "Koeaika" TAB_ABOUT: LEGEND_ABOUT: "Tietoja" LABEL_TAG_HINT: "Helppo, moderni ja nopea web-pohjainen sähköpostiohjelma" LABEL_ALL_RIGHTS_RESERVED: "Kaikki oikeudet pidätetään." HINT_READ_CHANGE_LOG: "Lue muutosloki ennen päivitystä." HINT_IS_UP_TO_DATE: "RainLoop on ajan tasalla." HTML_NEW_VERSION: "Uusi versio %VERSION% on saatavissa." LABEL_UPDATING: "Päivitetään" LABEL_CHECKING: "Tarkastetaan päivityksiä" BUTTON_UPDATE: "Päivitä" BUTTON_DOWNLOAD: "Lataa" BUTTON_CHANGELOG: "Muutosloki" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Aktivoi tilausavain?" TITLE_ACTIVATION: "Aktivoidaan..." LABEL_DOMAIN: "Verkkotunnus" LABEL_SUB_KEY: "Tilaus avain" BUTTON_ACTIVATE: "Aktivoi" LABEL_ACTIVATED: "Aktivoitu" ERROR_INVALID_SUBS_KEY: "Väärä tilausavain" SUBS_KEY_ACTIVATED: "Tilausavain aktivoitu onnistuneesti" HTML_DESC: | Aktivoinninn jälkeen tilaus %DOMAIN% verkkotunnukselle jatkuu.
Huomioi että tilausavain voidaan aktivoida vain yhdelle verkkotunnukselle.

Aloituksen jälkeen aktivointia ei voi keskeyttää tai peruuttaa. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Lisää Alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Verkkotunnus" BUTTON_CLOSE: "Sulje" BUTTON_ADD: "Lisää" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Lisää verkkotunnus" TITLE_ADD_DOMAIN_WITH_NAME: "Lisää verkkotunnus \"%NAME%\"" TITLE_EDIT_DOMAIN: "Muokkaa verkkotunnusta \"%NAME%\"" LABEL_NAME: "Nimi" NAME_HELPER: "wildcard tuettu" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Palvelin" LABEL_PORT: "Portti" LABEL_SECURE: "Secure" LABEL_WHITE_LIST: "Sallitut Lista" SECURE_OPTION_NONE: "Ei mitään" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Salli sieve skriptit" LABEL_ALLOW_USER_SCRIPT: "Salli käyttäjän omat skriptit" LABEL_USE_SHORT_LOGIN: "Käytä lyhyttä kirjautumista" LABEL_USE_AUTH: "Käytä tunnistautumista" LABEL_USE_PHP_MAIL: "Käytä php mail() funktiota" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Sallitut Lista" BUTTON_SIEVE_CONFIGURATION: "Sieve asetukset" BUTTON_BACK_TO_IMAP: "Takaisin IMAP asetuksiin" BUTTON_BACK: "Takaisin" BUTTON_CLOSE: "Sulje" BUTTON_ADD: "Lisää" BUTTON_UPDATE: "Päivitä" NEW_DOMAIN_DESC: "Tämän verkkotunnuksen asetukset sallivat käyttää
%NAME% säkhöpostiosoitteita." WHITE_LIST_ALERT: | Lista domain käyttäjistä joihin webmaililla on oikeus. Erottele välilyönnillä. POPUPS_PLUGIN: TITLE_PLUGIN: "Lisäosa" DESC_NOTHING_TO_CONFIGURE: "Ei mitään asetettavaa" BUTTON_CLOSE: "Sulje" BUTTON_SAVE: "Tallenna" TOOLTIP_ABOUT_TITLE: "Tietoja" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Haluatko varmasti sulkea tämän ikkunan?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Valitse kieli" HINTS: BETA: "beta" UNSTABLE: "epävakaa" WARNING: "Varoitus!" NOT_SUPPORTED: "ei tuettu" REQUIRES_PHP_54: "Vaatii PHP version 5.4 tai uudemman" ERRORS: DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" UNKNOWN_ERROR: "Tuntematon virhe" NOTIFICATIONS: INVALID_TOKEN: "Väärä token" AUTH_ERROR: "Tunnistautuminen epäonnistui" ACCESS_ERROR: "Pääsyvirhe" CONNECTION_ERROR: "Palvelimeen ei saa yhteyttä" CAPTCHA_ERROR: "Väärä CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Tätä some ID:tä ei ole vielä liitetty mihinkään sähköpostitiliin. Kirjaudu sähköpostitunnuksilla ja aktivoi tämä ominaisuus tilin asetuksissa. DOMAIN_NOT_ALLOWED: "Verkkotunnue ei ole sallittu" ACCOUNT_NOT_ALLOWED: "Tili ei ole sallittu" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kaksiosainen tunnistus vaaditaan" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kaksiosaisen tunnistuksen virhe" COULD_NOT_SAVE_NEW_PASSWORD: "Uutta salasanaa ei voitu tallettaa" CURRENT_PASSWORD_INCORRECT: "Nykyinen salasana on väärin" NEW_PASSWORD_SHORT: "Salasana on liian lyhyt" NEW_PASSWORD_WEAK: "Salasana on liian helppo" NEW_PASSWORD_FORBIDDENT: "Salasana sisältää kielettyjä merkkejä" CONTACTS_SYNC_ERROR: "Yhteystietojen syknronointivirhe" CANT_GET_MESSAGE_LIST: "Viestilistaa ei voi ladata" CANT_GET_MESSAGE: "Viestiä ei voi ladata" CANT_DELETE_MESSAGE: "Viestiä ei voi poistaa" CANT_MOVE_MESSAGE: "Viestiä ei voi siirtää" CANT_SAVE_MESSAGE: "Viestiä ei voi tallentaa" CANT_SEND_MESSAGE: "Viestiä ei voi lähettää" INVALID_RECIPIENTS: "Virheelinen vastaanottaja" CANT_SAVE_FILTERS: "Suodatinta ei voi tallentaa" CANT_GET_FILTERS: "Suodattimia ei voi ladata" FILTERS_ARE_NOT_CORRECT: "Suodattimissa on virhe" CANT_CREATE_FOLDER: "Kansiota ei voi luoda" CANT_RENAME_FOLDER: "Kansiota ei voi uudelleennimetä" CANT_DELETE_FOLDER: "Kasiota ei voi poistaa" CANT_DELETE_NON_EMPTY_FOLDER: "Kansio ei ole tyhjä, ei voida poistaa" CANT_SUBSCRIBE_FOLDER: "Kansiota ei voi tilata" CANT_UNSUBSCRIBE_FOLDER: "Kansion tilausta ei voi purkaa" CANT_SAVE_SETTINGS: "Asetuksia ei voida tallentaa" CANT_SAVE_PLUGIN_SETTINGS: "Asetuksia ei voida tallentaa" DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" CANT_INSTALL_PACKAGE: "Paketin asennus epäonnistui" CANT_DELETE_PACKAGE: "Paketin poisto epäonnistui" INVALID_PLUGIN_PACKAGE: "Virheellinen lisäosa-paketti" UNSUPPORTED_PLUGIN_PACKAGE: "Ei tuettu lisäosa-paketti" LICENSING_SERVER_IS_UNAVAILABLE: "Tilauspalvelimeen ei saa yhteyttä" LICENSING_DOMAIN_EXPIRED: "Tänä verkkotunnuksen tilaus on päättynyt." LICENSING_DOMAIN_BANNED: "Tämän verkkotunnuksen tilaus on estetty." DEMO_SEND_MESSAGE_ERROR: "Turvallisuus syistä tältä tililtä ei saa lähettää sähköposteja ulkoisiin osoitteisiin!" DEMO_ACCOUNT_ERROR: "Turvallisuus syistä tämä toiminto on estettuy tälle tilille!" ACCOUNT_ALREADY_EXISTS: "Tili on jo olemassa." ACCOUNT_DOES_NOT_EXIST: "Tiliä ei ole olemassa" MAIL_SERVER_ERROR: "Palvelin yhteydessä on tapahtunut virhe" INVALID_INPUT_ARGUMENT: "Virheellinen syöte" UNKNOWN_ERROR: "Tuntematon virhe" STATIC: BACK_LINK: "Päivitä" DOMAIN_LIST_DESC: "Lista verkkotunnuksista joihin webmaililla on pääsy." PHP_EXSTENSIONS_ERROR_DESC: "Vaadittavaa PHP lisäosaa ei ole saatavilla PHP määrittelyissäsi!" PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" NO_SCRIPT_TITLE: "Javascript vaaditaan tälle sovellukselle." NO_SCRIPT_DESC: | Selaimesi ei tue JavaScriptiä. Salli JavaScript selaimessasi ja yritä uudelleen. NO_COOKIE_TITLE: "Esvästetuki vaaditaan tässä sovelluksessa." NO_COOKIE_DESC: | Selaimesi ei tue evästeitä. Salli evästeet selaimessasi ja yritä uudelleen. BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." BAD_BROWSER_DESC: | Käyttääksesi kaikki ominaisuuksia lataa ja asenna jokin näistä selaimista: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/fr_FR.yml000066400000000000000000000403621361462701300256520ustar00rootroot00000000000000fr_FR: LOGIN: LABEL_LOGIN: "Identifiant" LABEL_PASSWORD: "Mot de passe" BUTTON_LOGIN: "Se connecter au panneau d'administration" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Panneau d'Administration" TABS_LABELS: LABEL_GENERAL_NAME: "Général" LABEL_LOGIN_NAME: "Identifiant" LABEL_BRANDING_NAME: "Logo & Marque" LABEL_CONTACTS_NAME: "Contacts" LABEL_DOMAINS_NAME: "Domaines" LABEL_SECURITY_NAME: "Sécurité" LABEL_INTEGRATION_NAME: "Intégrations" LABEL_PLUGINS_NAME: "Plugins" LABEL_PACKAGES_NAME: "Paquets" LABEL_LICENSING_NAME: "Licences" LABEL_ABOUT_NAME: "A propos" TAB_GENERAL: LEGEND_INTERFACE: "Interface" LABEL_LANGUAGE: "Langue" LABEL_LANGUAGE_ADMIN: "Langue (admin)" LABEL_THEME: "Thème" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permettre la sélection de la langue dans les paramètres" LABEL_ALLOW_THEMES_ON_SETTINGS: "Permettre la sélection du thème dans les paramètres" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permettre la sélection de l'arrière-plan dans les paramètres" LABEL_NEW_FOLDER_MOVE: "Nouveau bouton \"déplacer vers le dossier\"" LABEL_SHOW_THUMBNAILS: "Montrer les miniatures (pièces jointes)" LABEL_ALLOW_GRAVATAR: "Autoriser Gravatar" LEGEND_MAIN: "Principal" LABEL_ATTACHMENT_SIZE_LIMIT: "Taille limite des pièces jointes" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Autoriser les comptes supplémentaires" LABEL_ALLOW_IDENTITIES: "Autoriser les identités multiples" LABEL_ALLOW_TEMPLATES: "Autoriser les modèles" ALERT_WARNING: "ATTENTION !" HTML_ALERT_WEAK_PASSWORD: | Vous utilisez le mot de passe administrateur par défaut.
Pour des raisons de sécurité, veuillez changer le mot de passe dès maintenant. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Ecran de connexion" LABEL_DEFAULT_DOMAIN: "Domaine par défaut" LABEL_DETERMINE_USER_DOMAIN: "Deviner le domaine de l'utilisateur" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permettre la sélection de la langue sur l'écran de connexion" LABEL_DETERMINE_USER_LANGUAGE: "Deviner la langue de l'utilisateur" TAB_BRANDING: LEGEND_BRANDING: "Logo & Marque" LABEL_PAGE_TITLE: "Titre de la page" LABEL_LOADING_DESCRIPTION: "Description pendant le chargement" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Connexion" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Description" LABEL_LOGIN_BACKGROUND: "Arrière-plan" LABEL_LOGIN_CUSTOM_CSS: "CSS personnalisés" LABEL_LOGIN_SHOW_POWERED_LINK: "Afficher le lien \"Powered by RainLoop\"" LEGEND_USER: "Utilisateur" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Titre du logo" LABEL_USER_LOGO_MESSAGE: "Logo (vue message)" LABEL_USER_CUSTOM_CSS: "CSS personnalisés" LEGEND_WELCOME_PAGE: "Page d'accueil" LABEL_WELCOME_PAGE_TITLE: "Titre" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Affichage" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Aucun" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Une seule fois" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Toujours" HTML_ALERT_PREMIUM: "Cette fonctionnalité est réservé aux utilisateurs Premium." TAB_CONTACTS: LEGEND_CONTACTS: "Contacts" LEGEND_STORAGE: "Stockage (PDO)" LABEL_ENABLE_CONTACTS: "Activer les contacts" LABEL_ALLOW_SYNC: "Autoriser la synchronisation des contacts (avec un serveur CardDAV externe)" LABEL_STORAGE_TYPE: "Type" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Utilisateur" LABEL_STORAGE_PASSWORD: "Mot de passe" BUTTON_TEST: "Test" ALERT_NOTICE: "Avis !" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "N'utilisez pas ce type de base de données avec un grand nombre d'utilisateurs actifs." HTML_ALERT_DOES_NOT_SUPPORTED: | Votre système ne supporte pas les contacts.
Vous devez installer ou autoriser l'extension PDO (SQLite / MySQL / PostgreSQL) sur votre serveur. TAB_DOMAINS: LEGEND_DOMAINS: "Domaines" BUTTON_ADD_DOMAIN: "Ajouter un domaine" BUTTON_ADD_ALIAS: "Ajouter un alias" DELETE_ARE_YOU_SURE: "Êtes-vous sûr ?" HTML_DOMAINS_HELPER: | Liste des domaines autorisés.
Cliquez sur le nom pour configurer le domaine. TAB_SECURITY: LEGEND_SECURITY: "Sécurité" LABEL_ALLOW_TWO_STEP: "Autoriser l'authentification en deux étapes" LABEL_FORCE_TWO_STEP: "Forcer l'authentification en deux étapes" LABEL_USE_IMAGE_PROXY: "Utiliser un proxy local pour les images externes" LABEL_ALLOW_OPEN_PGP: "Autoriser OpenPGP" LABEL_SHOW_PHP_INFO: "Voir les informations PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Codes d'accès au panneau d'administration" LABEL_CURRENT_PASSWORD: "Mot de passe actuel" LABEL_NEW_LOGIN: "Nouvel identifiant" LABEL_NEW_PASSWORD: "Nouveau mot de passe" LABEL_REPEAT_PASSWORD: "Répéter" BUTTON_UPDATE_PASSWORD: "Changer le mot de passe" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "S'assurer qu'un certificat SSL (IMAP/SMTP) est utilisé" LABEL_ALLOW_SELF_SIGNED: "Autoriser les certificats auto-signés" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Activer l'intégration Google" LABEL_GOOGLE_AUTH: "Autorisation" LABEL_GOOGLE_DRIVE: "Intégration de Google Drive (Panneau de rédaction)" LABEL_GOOGLE_PREVIEW: "Intégration de Google Viewer (Prévisualisation pour les fichiers Microsoft Word, Excel and PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Clé API" HINT_GOOGLE_API_KEY: "Nécessaire pour le sélecteur de fichier de Google Drive" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Activer l'intégration Facebook (Autorisation)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Activer l'intégration Twitter (Autorisation)" LABEL_TWITTER_CONSUMER_KEY: "Clé client" LABEL_TWITTER_CONSUMER_SECRET: "Secret client" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Activer l'intégration Dropbox" LABEL_DROPBOX_API_KEY: "Clé API" TOP_ALERT: "Les informations détaillées sur l'intégration des réseaux sociaux se trouve à" TAB_PLUGINS: LEGEND_PLUGINS: "Plugins" LABEL_ENABLE_PLUGINS: "Activer les plugins" ALERT_NO_PLUGINS: "Aucun plugin n'a été installé." LINK_INSTALL_NEW: "Cliquez ici pour installer un nouveau plugin !" HINT_CLICK_NAME: "Cliquez sur le nom pour configurer le plugin." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Disponible pour la mise à jour" LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponible pour l'installation" LEGEND_INSTALLED_PACKAGES: "Paquets installés" ALERT_CANNOT_ACCESS_REPOSITORY: "Impossible d'accéder au dépôt pour l'instant." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Votre domaine" LABEL_VERSION: "Version" LABEL_CHECKING: "Vérification" TYPE_BASIC_HINT: "Ce domaine ne possède pas de licence pour un usage commercial (avec des fonctionnalités supplémentaires)." TYPE_BASIC_HINT_2: "Ce domaine ne peut pas obtenir de licence." HTML_ALERT_TOP_1: "La licence RainLoop Webmail appartient à" HTML_ALERT_TOP_2: "Vous êtes libre de l'utiliser pour vos projets personnels" HTML_ALERT_TOP_3: | L'usage commercial (avec des fonctionnalités supplémentaires) de RainLoop Webmail nécessite une souscription. TYPE_PREMIUM_LIFETIME: "A vie" LABEL_SUB_EXPIRES: "La souscription expire" BUTTON_ACTIVATE: "Activer une clé de souscription pour ce domaine" BUTTON_PURCHASE: "Acheter" BUTTON_TRIAL: "Essai" TAB_ABOUT: LEGEND_ABOUT: "A propos" LABEL_TAG_HINT: "Un client webmail simple, moderne et rapide " LABEL_ALL_RIGHTS_RESERVED: "Tous droits réservés." HINT_READ_CHANGE_LOG: "Veuillez lire le journal des modifications avant de faire la mise à jour." HINT_IS_UP_TO_DATE: "Rainloop est à jour." HTML_NEW_VERSION: "Une nouvelle version %VERSION% est disponible." LABEL_UPDATING: "Mise à jour" LABEL_CHECKING: "Vérification des mises à jour" BUTTON_UPDATE: "Mettre à jour" BUTTON_DOWNLOAD: "Télécharger" BUTTON_CHANGELOG: "Journal des modifications" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Activer une clé de souscription ?" TITLE_ACTIVATION: "Activation..." LABEL_DOMAIN: "Domaine" LABEL_SUB_KEY: "Clé de souscription" BUTTON_ACTIVATE: "Activer" LABEL_ACTIVATED: "Activé" ERROR_INVALID_SUBS_KEY: "Clé de souscription invalide" SUBS_KEY_ACTIVATED: "Activation de la clé de souscription réussie" HTML_DESC: | Après l'activation, la souscription premium pour %DOMAIN% va être prolongée.
Notez que la clé de souscription ne peut être activée que pour un seul domaine.

Une fois lancé, le processus d'activation ne peut pas être annulé ou abandonné. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Ajouter un alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domaine" BUTTON_CLOSE: "Fermer" BUTTON_ADD: "Ajouter" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Ajouter un domaine" TITLE_ADD_DOMAIN_WITH_NAME: "Ajouter le domaine \"%NAME%\"" TITLE_EDIT_DOMAIN: "Modifier le domaine \"%NAME%\"" LABEL_NAME: "Nom" NAME_HELPER: "Jokers autorisés" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Serveur" LABEL_PORT: "Port" LABEL_SECURE: "Sécurité" LABEL_WHITE_LIST: "Liste Blanche" SECURE_OPTION_NONE: "Aucun" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Autoriser les scripts sieve" LABEL_ALLOW_USER_SCRIPT: "Autoriser les scripts personnels" LABEL_USE_SHORT_LOGIN: "Utiliser l'identifiant court" LABEL_USE_AUTH: "Utiliser l'authentification" LABEL_USE_PHP_MAIL: "Utiliser la fonction mail() de php" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Liste Blanche" BUTTON_SIEVE_CONFIGURATION: "Configuration sieve" BUTTON_BACK_TO_IMAP: "Retour à la configuration IMAP" BUTTON_BACK: "Retour" BUTTON_CLOSE: "Fermer" BUTTON_ADD: "Ajouter" BUTTON_UPDATE: "Modifier" NEW_DOMAIN_DESC: "Cette configuration de domaine vous permettra de travailler
avec %NAME% dans les adresses Ă©lectroniques." WHITE_LIST_ALERT: | Liste des utilisateurs du domaine auxquels le webmail est autorisĂ© Ă  accĂ©der. Utilisez un espace comme sĂ©parateur. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Rien Ă  configurer" BUTTON_CLOSE: "Fermer" BUTTON_SAVE: "Enregistrer" TOOLTIP_ABOUT_TITLE: "A propos" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "ĂŠtes-vous sĂ»r de vouloir fermer cette fenĂŞtre ?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choisir la langue" HINTS: BETA: "bĂŞta" UNSTABLE: "instable" WARNING: "ATTENTION !" NOT_SUPPORTED: "non supportĂ©" REQUIRES_PHP_54: "nĂ©cessite PHP 5.4 ou supĂ©rieur" ERRORS: DOMAIN_ALREADY_EXISTS: "Le domaine existe dĂ©jĂ " UNKNOWN_ERROR: "Erreur inconnue" NOTIFICATIONS: INVALID_TOKEN: "Jeton invalide" AUTH_ERROR: "L'authentification a Ă©chouĂ©" ACCESS_ERROR: "Erreur d'accès" CONNECTION_ERROR: "Serveur injoignable" CAPTCHA_ERROR: "CAPTCHA incorrect." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Cet ID social n'est pas encore assignĂ© Ă  une adresse email. Connectez-vous en utilisant les informations d'identification du courrier Ă©lectronique et activez cette fonctionnalitĂ© dans les paramètres de votre compte. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Cet ID social n'est pas encore assignĂ© Ă  une adresse email. Connectez-vous en utilisant les informations d'identification du courrier Ă©lectronique et activez cette fonctionnalitĂ© dans les paramètres de votre compte. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Cet ID social n'est pas encore assignĂ© Ă  une adresse email. Connectez-vous en utilisant les informations d'identification du courrier Ă©lectronique et activez cette fonctionnalitĂ© dans les paramètres de votre compte. DOMAIN_NOT_ALLOWED: "Ce domaine n'est pas autorisĂ©" ACCOUNT_NOT_ALLOWED: "Ce compte n'est pas autorisĂ©" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Double authentification requise" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erreur lors de la double authentification" COULD_NOT_SAVE_NEW_PASSWORD: "Impossible d'enregistrer le nouveau mot de passe" CURRENT_PASSWORD_INCORRECT: "Le mot de passe actuel est incorrect" NEW_PASSWORD_SHORT: "Le mot de passe est trop court" NEW_PASSWORD_WEAK: "Le mot de passe n'est pas assez fort" NEW_PASSWORD_FORBIDDENT: "Le mot de passe contient des caractères invalides" CONTACTS_SYNC_ERROR: "Erreur de synchronisation des contacts" CANT_GET_MESSAGE_LIST: "Impossible d'obtenir la liste des messages" CANT_GET_MESSAGE: "Impossible d'obtenir le message" CANT_DELETE_MESSAGE: "Impossible de supprimer le message" CANT_MOVE_MESSAGE: "Impossible de dĂ©placer le message" CANT_SAVE_MESSAGE: "Impossible d'enregistrer le message" CANT_SEND_MESSAGE: "Impossible d'envoyer le message" INVALID_RECIPIENTS: "Destinataires invalides" CANT_SAVE_FILTERS: "Impossible d'enregistrer les filtres" CANT_GET_FILTERS: "Impossible d'obtenir les filtres" FILTERS_ARE_NOT_CORRECT: "Les filtres ne sont pas corrects" CANT_CREATE_FOLDER: "Impossible de crĂ©er le dossier" CANT_RENAME_FOLDER: "Impossible de renommer le dossier" CANT_DELETE_FOLDER: "Impossible de supprimer le dossier" CANT_DELETE_NON_EMPTY_FOLDER: "Impossible de supprimer un dossier non vide" CANT_SUBSCRIBE_FOLDER: "Impossible de s'abonner au dossier" CANT_UNSUBSCRIBE_FOLDER: "Impossible de se dĂ©sabonner du dossier" CANT_SAVE_SETTINGS: "Vous ne pouvez pas enregistrer les paramètres" CANT_SAVE_PLUGIN_SETTINGS: "Vous ne pouvez pas enregistrer les paramètres" DOMAIN_ALREADY_EXISTS: "Le domaine existe dĂ©jĂ " CANT_INSTALL_PACKAGE: "Impossible d'installer le paquet" CANT_DELETE_PACKAGE: "Impossible de supprimer le paquet" INVALID_PLUGIN_PACKAGE: "Ce plugin est invalide" UNSUPPORTED_PLUGIN_PACKAGE: "Ce plugin n'est pas supportĂ©" LICENSING_SERVER_IS_UNAVAILABLE: "Le serveur d'abonnement est inaccessible" LICENSING_DOMAIN_EXPIRED: "L'abonnement de ce domaine a expirĂ©." LICENSING_DOMAIN_BANNED: "L'abonnement pour ce domaine est interdit." DEMO_SEND_MESSAGE_ERROR: "Pour des raisons de sĂ©curitĂ©, ce compte de dĂ©monstration n'est pas autorisĂ© Ă  envoyer des messages Ă  des adresses e-mail externes !" DEMO_ACCOUNT_ERROR: "Pour des raisons de sĂ©curitĂ©, ce compte n'est pas autorisĂ© Ă  faire cette action !" ACCOUNT_ALREADY_EXISTS: "Ce compte existe dĂ©jĂ " ACCOUNT_DOES_NOT_EXIST: "Ce compte n'existe pas" MAIL_SERVER_ERROR: "Une erreur est survenue lors de l'accès au serveur de messagerie" INVALID_INPUT_ARGUMENT: "Argument invalide" UNKNOWN_ERROR: "Erreur inconnue" STATIC: BACK_LINK: "Recharger" DOMAIN_LIST_DESC: "Liste des domaines autorisĂ©s." PHP_EXSTENSIONS_ERROR_DESC: "Les extensions PHP nĂ©cessaires ne sont pas disponibles dans votre configuration de PHP !" PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est infĂ©rieure au minimum requis 5.3.0!" NO_SCRIPT_TITLE: "JavaScript est nĂ©cessaire pour cette application." NO_SCRIPT_DESC: | Le support de JavaScript n'est pas disponible dans votre navigateur. Veuillez activer le support de JavaScript dans les paramètres de votre navigateur et rĂ©essayer. NO_COOKIE_TITLE: "Le support des cookies est nĂ©cessaire pour cette application." NO_COOKIE_DESC: | Le support des cookies n'est pas disponible dans votre navigateur. Veuillez activer le support des cookies dans les paramètres de votre navigateur et rĂ©essayer. BAD_BROWSER_TITLE: "Votre navigateur n'est pas Ă  jour." BAD_BROWSER_DESC: | Pour utiliser toutes les fonctionnalitĂ©s de l'application, tĂ©lĂ©chargez et installez l'un de ces navigateurs : rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml000066400000000000000000000376141361462701300256720ustar00rootroot00000000000000hu_HU: LOGIN: LABEL_LOGIN: "BelĂ©pĂ©s" LABEL_PASSWORD: "JelszĂł" BUTTON_LOGIN: "BejelentkezĂ©s az admin felĂĽletre" TOP_PANEL: LABEL_PREMIUM: "PrĂ©muim" LABEL_ADMIN_PANEL: "AdminisztráciĂłs felĂĽlet" TABS_LABELS: LABEL_GENERAL_NAME: "Ăltalános" LABEL_LOGIN_NAME: "BelĂ©pĂ©s" LABEL_BRANDING_NAME: "Arculat" LABEL_CONTACTS_NAME: "NĂ©vjegyek" LABEL_DOMAINS_NAME: "Domainek" LABEL_SECURITY_NAME: "Biztonság" LABEL_INTEGRATION_NAME: "IntegráciĂłk" LABEL_PLUGINS_NAME: "BeĂ©pĂĽlĹ‘k" LABEL_PACKAGES_NAME: "Csomagok" LABEL_LICENSING_NAME: "LicencelĂ©s" LABEL_ABOUT_NAME: "NĂ©vjegy" TAB_GENERAL: LEGEND_INTERFACE: "FelĂĽlet" LABEL_LANGUAGE: "Nyelv" LABEL_LANGUAGE_ADMIN: "Nyelv (admin)" LABEL_THEME: "TĂ©ma" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Nyelv választás engedĂ©lyezĂ©s a beállĂ­tásoknál" LABEL_ALLOW_THEMES_ON_SETTINGS: "TĂ©ma választás engedĂ©lyezĂ©s a beállĂ­tásoknál" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "HáttĂ©r választás engedĂ©lyezĂ©s a beállĂ­tásoknál" LABEL_NEW_FOLDER_MOVE: "Ăšj \"áthelyezĂ©s mappába\" gomb" LABEL_SHOW_THUMBNAILS: "ElĹ‘nĂ©zetek megjelenĂ­tĂ©se (mellĂ©kletek)" LABEL_ALLOW_GRAVATAR: "Gravatar engedĂ©lyezĂ©s" LEGEND_MAIN: "Fontos" LABEL_ATTACHMENT_SIZE_LIMIT: "MellĂ©klet mĂ©ret korlát" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "További fiĂłkok engedĂ©lyezĂ©se" LABEL_ALLOW_IDENTITIES: "Több identitás engedĂ©lyezĂ©se" LABEL_ALLOW_TEMPLATES: "Sablonok engedĂ©lyezĂ©se" ALERT_DATA_ACCESS: "A RainLoop adatmappája hozzáfĂ©rhetĹ‘. KĂ©rlek állĂ­tsd be Ăşgy a webszervert, hogy az adatmappát rejtse el a kĂĽlsĹ‘ hozzáfĂ©rĂ©s elĹ‘l. További tudnivalĂłk itt:" ALERT_WARNING: "FigyelmeztetĂ©s!" HTML_ALERT_WEAK_PASSWORD: | Az alapĂ©rtelmezett admin jelszĂłt használod
Biztonsági okokból kérlek változtasd meg a jelszót valami másra! TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Bejelentkező képernyő" LABEL_DEFAULT_DOMAIN: "Alapértelmezett domain" LABEL_DETERMINE_USER_DOMAIN: "Próbálja megállapítani a felhasználó domainjét" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Nyel választás engedélyezése a bejelentkező képernyőn" LABEL_DETERMINE_USER_LANGUAGE: "Próbálja megállapítani a felhasználó nyelvét" TAB_BRANDING: LEGEND_BRANDING: "Arculat" LABEL_PAGE_TITLE: "Oldal címe" LABEL_LOADING_DESCRIPTION: "Betöltés leírás" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Belépés" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Leírás" LABEL_LOGIN_BACKGROUND: "Háttér" LABEL_LOGIN_CUSTOM_CSS: "Saját CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\" link megjelenítése" LEGEND_USER: "Felhasználó" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logo cím" LABEL_USER_LOGO_MESSAGE: "Logo (üzenet nézet)" LABEL_USER_CUSTOM_CSS: "Saját CSS" LEGEND_WELCOME_PAGE: "Üdvözlő oldal" LABEL_WELCOME_PAGE_TITLE: "Cím" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Megjelenítés" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Semmi" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Egyszer" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Mindig" HTML_ALERT_PREMIUM: "Ez a funkció csak a Prémium előfizetők számára érhető el." TAB_CONTACTS: LEGEND_CONTACTS: "Névjegyek" LEGEND_STORAGE: "Tárhely (PDO)" LABEL_ENABLE_CONTACTS: "Címtár engedélyezése" LABEL_ALLOW_SYNC: "Címtár szinkronizálás engedélyezése (külső CardDAV szerverrel)" LABEL_STORAGE_TYPE: "Típus" LABEL_STORAGE_DSN: "DSN" LABEL_STORAGE_USER: "Felhasználó" LABEL_STORAGE_PASSWORD: "Jelszó" BUTTON_TEST: "Teszt" ALERT_NOTICE: "Megjegyzés!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ne használd ezt az adatbázis típust nagy számú aktív felhasználóval." HTML_ALERT_DOES_NOT_SUPPORTED: | A rendszer nem támogatja a címtárat.
TelepĂ­tened vagy engedĂ©lyezned kell egy PDO (SQLite / MySQL / PostgreSQL) kiterjesztĂ©st a szervereden. TAB_DOMAINS: LEGEND_DOMAINS: "Domainek" BUTTON_ADD_DOMAIN: "Domain hozzáadás" BUTTON_ADD_ALIAS: "ĂlnĂ©v hozzáadás" DELETE_ARE_YOU_SURE: "Biztos vagy benne?" HTML_DOMAINS_HELPER: | HozzáfĂ©rĂ©shez engedĂ©lyezett domainek listája:
A domain beállításához kattints a névre. TAB_SECURITY: LEGEND_SECURITY: "Biztonság" LABEL_ALLOW_TWO_STEP: "2 lépcsős hitelesítés engedélyezése" LABEL_FORCE_TWO_STEP: "2 lépcsős hitelesítés kényszerítése" LABEL_USE_IMAGE_PROXY: "Helyi proxy használata a külső képekhez" LABEL_ALLOW_OPEN_PGP: "OpenPGP engedélyezése" LABEL_SHOW_PHP_INFO: "PHP információ megjelenítése" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin panel hozzáférés hitelesítés" LABEL_CURRENT_PASSWORD: "Jelenlegi jelszó" LABEL_NEW_LOGIN: "Új felhasználó" LABEL_NEW_PASSWORD: "Új jelszó" LABEL_REPEAT_PASSWORD: "Újra" BUTTON_UPDATE_PASSWORD: "Jelszó frissítés" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "A használt (IMAP/SMTP) tanúsítvány ellenőrzés megkövetelése" LABEL_ALLOW_SELF_SIGNED: "Saját aláírt tanúsítványok engedélyezése" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Google integráció engedélyezése" LABEL_GOOGLE_AUTH: "Hitelesítés" LABEL_GOOGLE_DRIVE: "Google Drive integráció (levélírás nézet)" LABEL_GOOGLE_PREVIEW: "Google Viewer integráció (Microsoft Word, Excel és PowerPoint fájlok előnézetéhez)" LABEL_GOOGLE_CLIENT_ID: "Kliens ID" LABEL_GOOGLE_CLIENT_SECRET: "Kliens titok" LABEL_GOOGLE_API_KEY: "API kulcs" HINT_GOOGLE_API_KEY: "Google Drive fájl választóhoz szükséges" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Facebook integráció engedélyezése (hitelesítés)" LABEL_FACEBOOK_APP_ID: "Alkalmazás ID" LABEL_FACEBOOK_APP_SECRET: "Alkalmazás titok" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Twitter integráció engedélyezése (hitelesítés)" LABEL_TWITTER_CONSUMER_KEY: "Consumer kulcs" LABEL_TWITTER_CONSUMER_SECRET: "Consumer titok" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Dropbox integráció engedélyezése" LABEL_DROPBOX_API_KEY: "API kulcs" TOP_ALERT: "A közösségi integrációról részletes információkat itt találsz:" TAB_PLUGINS: LEGEND_PLUGINS: "Beépülők" LABEL_ENABLE_PLUGINS: "Beépülők engedélyezése" ALERT_NO_PLUGINS: "Még nincsenek telepítve beépülők." LINK_INSTALL_NEW: "Új telepítéséhez kattints ide!" HINT_CLICK_NAME: "A beépülő beállításához kattints a nevére." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Frissíthető" LEGEND_AVAILABLE_FOR_INSTALLATION: "Telepíthető" LEGEND_INSTALLED_PACKAGES: "Telepített csomagok" ALERT_CANNOT_ACCESS_REPOSITORY: "Jelenleg nem lehet csatlakozni a tárolóhoz" TAB_LICENSING: LABEL_YOUR_DOMAIN: "Domained" LABEL_VERSION: "Verzió" LABEL_CHECKING: "Ellenőrzés" TYPE_BASIC_HINT: "Ez a domain nem licencelt kereskedelmi használatra (hozzáadott funkciókkal)." TYPE_BASIC_HINT_2: "Ez a domain nem licencelhető." HTML_ALERT_TOP_1: "RainLoop Webmail licence:" HTML_ALERT_TOP_2: "Szabadon felhasználható a személyes projektjeidhez." HTML_ALERT_TOP_3: | A RainLoop Webmail kereskedelmi használatához (további funkciókkal) előfizetés szükséges. TYPE_PREMIUM_LIFETIME: "Örökös" LABEL_SUB_EXPIRES: "Előfizetés lejár" BUTTON_ACTIVATE: "Előfizetési kulcs aktiválása ehhez a domainhez" BUTTON_PURCHASE: "Vásárlás" BUTTON_TRIAL: "Próba" TAB_ABOUT: LEGEND_ABOUT: "Névjegy" LABEL_TAG_HINT: "Egyszerű, modern és gyors webes email kliens" LABEL_ALL_RIGHTS_RESERVED: "Minden jog fenntartva." HINT_READ_CHANGE_LOG: "Frissítés előtt kérlek olvasd el a változások listáját." HINT_IS_UP_TO_DATE: "A RainLoop naprakész." HTML_NEW_VERSION: "Új verzió érhető el: %VERSION%" LABEL_UPDATING: "Frissítés" LABEL_CHECKING: "Frissítések ellenőrzése" BUTTON_UPDATE: "Frissítés" BUTTON_DOWNLOAD: "Letöltés" BUTTON_CHANGELOG: "Változások listája" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Előfizetési kulcs aktiválása?" TITLE_ACTIVATION: "Aktiválás..." LABEL_DOMAIN: "Domain" LABEL_SUB_KEY: "Előfizetési kulcs" BUTTON_ACTIVATE: "Aktivál" LABEL_ACTIVATED: "Akitválva" ERROR_INVALID_SUBS_KEY: "Érvénytelen előfizetési kulcs" SUBS_KEY_ACTIVATED: "Előfizetési kulcs sikeresen aktiválva" HTML_DESC: | Aktiválás után a %DOMAIN% prémium előfizetése meg lesz hosszabbítva.
Egy előfizetési kulcs csak egy domainhez aktiválható.

Miután elindult, az aktiválási folyamat nem szakĂ­thatĂł meg vagy vonhatĂł vissza. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "ĂlnĂ©v hozzáadás" LABEL_ALIAS: "ĂlnĂ©v" LABEL_DOMAIN: "Domain" BUTTON_CLOSE: "Bezár" BUTTON_ADD: "Hozzáad" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Domain hozzáadás" TITLE_ADD_DOMAIN_WITH_NAME: "\"%NAME%\" domain hozzáadása" TITLE_EDIT_DOMAIN: "\"%NAME%\" domain szerkesztĂ©se" LABEL_NAME: "NĂ©v" NAME_HELPER: "helyettesĂ­tĹ‘ karakter használhatĂł" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Szerver" LABEL_PORT: "Port" LABEL_SECURE: "Biztonság" LABEL_WHITE_LIST: "FehĂ©r lista" SECURE_OPTION_NONE: "Semmi" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "SIEVE szkriptek engedĂ©lyezĂ©se" LABEL_ALLOW_USER_SCRIPT: "Saját felhasználĂłi szkript engedĂ©lyezĂ©se" LABEL_USE_SHORT_LOGIN: "Rövid felhasználĂłnĂ©v használata" LABEL_USE_AUTH: "HitelesĂ­tĂ©s használata" LABEL_USE_PHP_MAIL: "A PHP mail() funkciĂł használata" BUTTON_TEST: "Teszt" BUTTON_WHITE_LIST: "FehĂ©r lista" BUTTON_SIEVE_CONFIGURATION: "SIEVE beállĂ­tás" BUTTON_BACK_TO_IMAP: "Vissza az IMAP beállĂ­tásokhoz" BUTTON_BACK: "Vissza" BUTTON_CLOSE: "Bezár" BUTTON_ADD: "Hozzáad" BUTTON_UPDATE: "FrissĂ­tĂ©s" NEW_DOMAIN_DESC: "Ez a domain konfiguráciĂł lehetĹ‘vĂ© teszi
a %NAME% email címek használatát." WHITE_LIST_ALERT: | Hozzáféréshez engedélyezett domainek listája. Elválasztáshoz használd a szóközt. POPUPS_PLUGIN: TITLE_PLUGIN: "Beépülő" DESC_NOTHING_TO_CONFIGURE: "Nincs mit beállítani" BUTTON_CLOSE: "Bezár" BUTTON_SAVE: "Mentés" TOOLTIP_ABOUT_TITLE: "Névjegy" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Biztos, hogy be akarod zárni ezt az ablakot?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Válaszd ki a nyelvet" HINTS: BETA: "béta" UNSTABLE: "instabil" WARNING: "Figyelmeztetés!" NOT_SUPPORTED: "nem támogatott" REQUIRES_PHP_54: "PHP 5.4 vagy újabb szükséges" ERRORS: DOMAIN_ALREADY_EXISTS: "A domain már létezik" UNKNOWN_ERROR: "Ismeretlen hiba" NOTIFICATIONS: INVALID_TOKEN: "Érvénytelen token" AUTH_ERROR: "Sikertelen hitelesítés" ACCESS_ERROR: "Hozzáférési hiba" CONNECTION_ERROR: "Nem lehet csatlakozni a szerverhez" CAPTCHA_ERROR: "Helytelen CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Ez a közösségi azonosító még nincs összekapcsolva egy email fiókkal sem. Lépj be az email fiókba és a beállításoknál engedélyezd ezt a funkciót. DOMAIN_NOT_ALLOWED: "A domain nem engedélyezett" ACCOUNT_NOT_ALLOWED: "A fiók nem engedélyezett" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kétlépcsős hitelesítés szükséges" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kétlépcsős hitelesítés hiba" COULD_NOT_SAVE_NEW_PASSWORD: "Nem lehet menteni az új jelszót" CURRENT_PASSWORD_INCORRECT: "A jelenlegi jelszó érvénytelen" NEW_PASSWORD_SHORT: "A jelszó túl rövid" NEW_PASSWORD_WEAK: "A jelszó túl könnyű" NEW_PASSWORD_FORBIDDENT: "A jelszó tiltott karaktereket tartalmaz" CONTACTS_SYNC_ERROR: "Hiba lépett fel a névjegyek szinkronizálása közben" CANT_GET_MESSAGE_LIST: "Nem tudom letölteni az üzenetlistát" CANT_GET_MESSAGE: "Nem tudom letölteni az üzenetet" CANT_DELETE_MESSAGE: "Nem lehet törölni az üzenetet" CANT_MOVE_MESSAGE: "Nem lehet áthelyezni az üzenetet" CANT_SAVE_MESSAGE: "Nem lehet menteni az üzenetet" CANT_SEND_MESSAGE: "Nem lehet elküldeni az üzenetet" INVALID_RECIPIENTS: "Érvénytelent címzettek" CANT_SAVE_FILTERS: "Nem lehet menteni a szűrőket" CANT_GET_FILTERS: "Nem lehet letölteni a szűrőket" FILTERS_ARE_NOT_CORRECT: "A szűrők nem megfelelőek" CANT_CREATE_FOLDER: "Nem lehet létrehozni a mappát" CANT_RENAME_FOLDER: "Nem lehet átnevezni a mappát" CANT_DELETE_FOLDER: "Nem lehet törölni a mappát" CANT_DELETE_NON_EMPTY_FOLDER: "Nem üres mappát nem lehet törölni" CANT_SUBSCRIBE_FOLDER: "Nem lehet feliratkozni mappára" CANT_UNSUBSCRIBE_FOLDER: "Nem lehet leiratkozni mappáról" CANT_SAVE_SETTINGS: "Nem lehet menteni a beállításokat" CANT_SAVE_PLUGIN_SETTINGS: "Nem lehet menteni a beállításokat" DOMAIN_ALREADY_EXISTS: "A domain már létezik" CANT_INSTALL_PACKAGE: "Nem sikerült telepíteni a csomagot" CANT_DELETE_PACKAGE: "Nem sikerült eltávolítani a csomagot" INVALID_PLUGIN_PACKAGE: "Érvénytelen beépülő csomag" UNSUPPORTED_PLUGIN_PACKAGE: "Nem támogatott beépülő csomag" LICENSING_SERVER_IS_UNAVAILABLE: "A előfizetési szerver nem érhető el" LICENSING_DOMAIN_EXPIRED: "A domain előfizetése lejárt." LICENSING_DOMAIN_BANNED: "A domain előfizetése letiltva." DEMO_SEND_MESSAGE_ERROR: "Biztonsági okokból, ebből a demó fiókból nem lehet külső email címekre üzenetet küldeni." DEMO_ACCOUNT_ERROR: "Biztonsági okokból, ebből a fiókból nem lehet elvégezni ezt a műveletet!" ACCOUNT_ALREADY_EXISTS: "A fiók már létezik" ACCOUNT_DOES_NOT_EXIST: "A fiók nem létezik" MAIL_SERVER_ERROR: "Hiba történt a levelező szerverhez történő hozzáférés közben" INVALID_INPUT_ARGUMENT: "Érvénytelen input argumentum" UNKNOWN_ERROR: "Ismeretlen hiba" STATIC: BACK_LINK: "Újratöltés" DOMAIN_LIST_DESC: "A webmailhez hozzáférhető domainek listája." PHP_EXSTENSIONS_ERROR_DESC: "Szükséges PHP kiterjesztés nem érhető el a PHP konfigurációdban!" PHP_VERSION_ERROR_DESC: "A PHP verziód (%VERSION%) kisebb mint a minimálisan szükséges 5.3.0!" NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szükséges." NO_SCRIPT_DESC: | A JavaScript támogatás nem érhető el a böngésződben. Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szükség." NO_COOKIE_DESC: | A Cookie támogatás nem érhető el a böngésződben. Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. BAD_BROWSER_TITLE: "A böngésződ elavult." BAD_BROWSER_DESC: | Az alkalmazás összes funkciójának használatához tölts le és telepítsd az alábbi böngészők egyikét: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/id_ID.yml000066400000000000000000000353001361462701300256200ustar00rootroot00000000000000id_ID: LOGIN: LABEL_LOGIN: "Login" LABEL_PASSWORD: "Password" BUTTON_LOGIN: "Login ke panel admin" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Panel Admin" TABS_LABELS: LABEL_GENERAL_NAME: "Umum" LABEL_LOGIN_NAME: "Login" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Kontak" LABEL_DOMAINS_NAME: "Domain" LABEL_SECURITY_NAME: "Keamanan" LABEL_INTEGRATION_NAME: "Integrasi" LABEL_PLUGINS_NAME: "Plugin" LABEL_PACKAGES_NAME: "Paket" LABEL_LICENSING_NAME: "Lisensi" LABEL_ABOUT_NAME: "Tentang" TAB_GENERAL: LEGEND_INTERFACE: "Antarmuka" LABEL_LANGUAGE: "Bahasa" LABEL_LANGUAGE_ADMIN: "Bahasa (admin)" LABEL_THEME: "Tema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Izinkan pemilihan bahasa pada laman pengaturan" LABEL_ALLOW_THEMES_ON_SETTINGS: "Izinkan pemilihan tema di laman pengaturan" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Izinkan pemilihan gambar latar di laman pengaturan" LABEL_NEW_FOLDER_MOVE: "Tombol \"pindahkan ke folder\" baru" LABEL_SHOW_THUMBNAILS: "Tampikankan gambar kecil (lampiran)" LABEL_ALLOW_GRAVATAR: "Izinkan Gravatar" LEGEND_MAIN: "Utama" LABEL_ATTACHMENT_SIZE_LIMIT: "Batas ukuran lampiran" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Izinkan akun tambahan" LABEL_ALLOW_IDENTITIES: "Izinkan identitas jamak" LABEL_ALLOW_TEMPLATES: "Izinkan penggunaan template" ALERT_DATA_ACCESS: "Data foldel RainLoop bisa diakses. Silahkan atur web server anda untuk menyembunyikan folder data dari akses eksternal. Baca selengkapnya di sini:" ALERT_WARNING: "Peringatan!" HTML_ALERT_WEAK_PASSWORD: | Anda menggunakan password admin bawaan.
Atas alasan keamanan, mohon mengganti password dengan frasa yang lainnya segera. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Laman login" LABEL_DEFAULT_DOMAIN: "Domain bawaan" LABEL_DETERMINE_USER_DOMAIN: "Coba untuk memeriksa user domain" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Izinkan pemilihan bahasa di laman login" LABEL_DETERMINE_USER_LANGUAGE: "Coba untuk memeriksa bahasa user" TAB_BRANDING: LEGEND_BRANDING: "Branding" LABEL_PAGE_TITLE: "Judul laman" LABEL_LOADING_DESCRIPTION: "Deskripsi loading" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Login" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Deskripsi" LABEL_LOGIN_BACKGROUND: "Gambar latar" LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Tampilkan link \"Powered by RainLoop\"" LEGEND_USER: "User" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Judul Logo" LABEL_USER_LOGO_MESSAGE: "Logo (Tampilan Pesan)" LABEL_USER_CUSTOM_CSS: "Custom CSS" LEGEND_WELCOME_PAGE: "Laman selamat datang" LABEL_WELCOME_PAGE_TITLE: "Judul" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Tampilan" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Tidak ada" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Sekali" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Selalu" HTML_ALERT_PREMIUM: "Fungsi ini tersedia hanya untuk pengguna Premium." TAB_CONTACTS: LEGEND_CONTACTS: "Kontak" LEGEND_STORAGE: "Media simpan (PDO)" LABEL_ENABLE_CONTACTS: "Izinkan kontak" LABEL_ALLOW_SYNC: "Izinkan sinkronisasi kontak (dengan server CardDAV eksternal)" LABEL_STORAGE_TYPE: "Tipe" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "User" LABEL_STORAGE_PASSWORD: "Password" BUTTON_TEST: "Ujicoba" ALERT_NOTICE: "Perhatian!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Jangan gunakan tipe database ini untuk jumlah user aktif yang besar." HTML_ALERT_DOES_NOT_SUPPORTED: | Sistem anda tidak mendukung kontak
Anda harus memasang atau mengaktifkan PDO (SQLite / MySQL / PostgreSQL) extension pada server anda. TAB_DOMAINS: LEGEND_DOMAINS: "Domain" BUTTON_ADD_DOMAIN: "Tambah domain" BUTTON_ADD_ALIAS: "Tambah alias" DELETE_ARE_YOU_SURE: "Anda yakin?" HTML_DOMAINS_HELPER: | Daftar domain webmail yang diizinkan mengakses.
Klik pada nama domain untuk mengatur domain. TAB_SECURITY: LEGEND_SECURITY: "Keamanan" LABEL_ALLOW_TWO_STEP: "Izinkan Verifikasi 2-Langkah" LABEL_FORCE_TWO_STEP: "Pasakan Verifikasi 2-Langkah" LABEL_USE_IMAGE_PROXY: "Gunakan proxy lokal untuk gambar dari luar" LABEL_ALLOW_OPEN_PGP: "Izinkan OpenPGP" LABEL_SHOW_PHP_INFO: "Tampilkan informasi PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Hak Akses Panel Admin" LABEL_CURRENT_PASSWORD: "Password saat ini" LABEL_NEW_LOGIN: "Login baru" LABEL_NEW_PASSWORD: "Password baru" LABEL_REPEAT_PASSWORD: "Ulangi" BUTTON_UPDATE_PASSWORD: "Perbarui Password" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Diperlukan verifikasi sertifikat SSL dengan (IMAP/SMTP) " LABEL_ALLOW_SELF_SIGNED: "Izinkan sertifikat yang dibuat sendiri" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Aktifkan Integrasi Google" LABEL_GOOGLE_AUTH: "Otorisasi" LABEL_GOOGLE_DRIVE: "Integrasi Google Drive (Tampilan compose)" LABEL_GOOGLE_PREVIEW: "Intergrasi Google Viewer (Pratinjau untuk Microsoft Word, Excel dan file PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "ID Klien" LABEL_GOOGLE_CLIENT_SECRET: "Kode Rahasia Klien" LABEL_GOOGLE_API_KEY: "Kunci API" HINT_GOOGLE_API_KEY: "Diperlukan untuk Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Aktifkan Integrasi Facebook (Otorisasi)" LABEL_FACEBOOK_APP_ID: "ID App" LABEL_FACEBOOK_APP_SECRET: "Kode rahasia App" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Aktifkan Integrasi Twitter (Otorisasi)" LABEL_TWITTER_CONSUMER_KEY: "Kunci Consumer" LABEL_TWITTER_CONSUMER_SECRET: "Kode Rahasia Consumer" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Aktifkan Integrasi Dropbox" LABEL_DROPBOX_API_KEY: "Kunci API" TOP_ALERT: "Informasi lengkap di Integrasi medsos ditemukan pada" TAB_PLUGINS: LEGEND_PLUGINS: "Plugins" LABEL_ENABLE_PLUGINS: "Aktifkan plugins" ALERT_NO_PLUGINS: "Belum ada plugins yang terinstal" LINK_INSTALL_NEW: "Klik di sini untuk menginstall yang baru" HINT_CLICK_NAME: "Klik pada nama untuk mengatur plugins" TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Tersedia untuk Pembaruan" LEGEND_AVAILABLE_FOR_INSTALLATION: "Tersedia untuk Instalasi" LEGEND_INSTALLED_PACKAGES: "Paket Terinstal" ALERT_CANNOT_ACCESS_REPOSITORY: "Tidak bisa menjangkau repositori saat ini" TAB_LICENSING: LABEL_YOUR_DOMAIN: "Domain anda" LABEL_VERSION: "Versi" LABEL_CHECKING: "Memeriksa" TYPE_BASIC_HINT: "Domain ini belum dilisensikan untuk penggunaan komersil (dengan fitur tambahan)." TYPE_BASIC_HINT_2: "Domain ini tidak bisa dilinsensikan" HTML_ALERT_TOP_1: "RainLoop Webmail dilisensi di bawah" HTML_ALERT_TOP_2: "Anda gratis jika ditujukan proyek pribadi." HTML_ALERT_TOP_3: | Tujuan penggunaan komersil (dengan fitur tambahan) RainLoop Webmail harus langganan. TYPE_PREMIUM_LIFETIME: "Seumur hidup" LABEL_SUB_EXPIRES: "Langganan berakhir" BUTTON_ACTIVATE: "Aktifkan Kunci Langganan untuk domain ini" BUTTON_PURCHASE: "Beli" BUTTON_TRIAL: "Percobaan" TAB_ABOUT: LEGEND_ABOUT: "Tentang" LABEL_TAG_HINT: "Klien web-based email yang simpel, modern & cepat" LABEL_ALL_RIGHTS_RESERVED: "Hak Cipta" HINT_READ_CHANGE_LOG: "Mohon baca log perubahan sebelum melakukan pembaruan" HINT_IS_UP_TO_DATE: "RainLoop sudah terbaru" HTML_NEW_VERSION: "Versi %VERSION% baru tersedia" LABEL_UPDATING: "Memperbarui" LABEL_CHECKING: "Memeriksa pembaruan" BUTTON_UPDATE: "Pembaruan" BUTTON_DOWNLOAD: "Mengunduh" BUTTON_CHANGELOG: "Log Perubahan" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Akifkan kunci berlangganan?" TITLE_ACTIVATION: "Mengaktivasi..." LABEL_DOMAIN: "Domain" LABEL_SUB_KEY: "Kunci Berlangganan" BUTTON_ACTIVATE: "Aktivasi" LABEL_ACTIVATED: "Sudah Diaktivasi" ERROR_INVALID_SUBS_KEY: "Kunci Berlangganan tidak sah" SUBS_KEY_ACTIVATED: "Kunci berlangganan berhasil diaktifkan" HTML_DESC: | Setelah aktivasi, langganan premium untuk %DOMAIN% akan diperpanjang.
Ingat bahwa kunci berlangganan hanya berlaku untuk domain tunggal.

Setelah Dimulai, proses aktivasi tidak bisa dicegah dan dibatalkan. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Tambah Alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domain" BUTTON_CLOSE: "Tutup" BUTTON_ADD: "Tambah" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Tambah Domain" TITLE_ADD_DOMAIN_WITH_NAME: "Tambah \"%NAME%\" Domain" TITLE_EDIT_DOMAIN: "Ubah Domain \"%NAME%\"" LABEL_NAME: "Nama" NAME_HELPER: "Mendukung Wildcard" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Aman" LABEL_WHITE_LIST: "Daftar Putih" SECURE_OPTION_NONE: "Tidak satupun" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Izinkan script sieve" LABEL_ALLOW_USER_SCRIPT: "Izinkan script user yang dikustomisasi" LABEL_USE_SHORT_LOGIN: "Gunakan login singkat" LABEL_USE_AUTH: "Gunakan otentikasi" LABEL_USE_PHP_MAIL: "Gunakan fungsi mail() PHP" BUTTON_TEST: "Ujicoba" BUTTON_WHITE_LIST: "Daftar Putih" BUTTON_SIEVE_CONFIGURATION: "Konfigurasi Sieve" BUTTON_BACK_TO_IMAP: "Kembali ke pengaturan IMAP" BUTTON_BACK: "Kembali" BUTTON_CLOSE: "Tutup" BUTTON_ADD: "Tambah" BUTTON_UPDATE: "Perbarui" NEW_DOMAIN_DESC: "Domain ini mengizinkan anda bekerja dengan alamat email
juga%NAME% " WHITE_LIST_ALERT: | Daftar domain webmail user yang diizinkan diakses. Gunakan spasi untuk pemisahnya POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Tidak ada yang dikonfigurasi" BUTTON_CLOSE: "Tutup" BUTTON_SAVE: "Simpan" TOOLTIP_ABOUT_TITLE: "Tentang" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Anda yakin menutup jendela ini?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Pilih bahasa anda" HINTS: BETA: "beta" UNSTABLE: "Tidak stabil" WARNING: "Peringatan!" NOT_SUPPORTED: "tidak didukung" REQUIRES_PHP_54: "Membutuhkan PHP 5.4 atau terbaru" ERRORS: DOMAIN_ALREADY_EXISTS: "Domain sudah ada" UNKNOWN_ERROR: "Kesalahan tidak diketahui" NOTIFICATIONS: INVALID_TOKEN: "Token invalid" AUTH_ERROR: "Otentikasi gagal" ACCESS_ERROR: "Akses error" CONNECTION_ERROR: "Tidak bisa terhubung ke server" CAPTCHA_ERROR: "CAPTCHA salah" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Social ID ini tidak dipasangkan untuk akun email manapun. Login dengan kredensial email dan aktifkan fitur ini pada seting akun. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Social ID ini tidak dipasangkan untuk akun email manapun. Login dengan kredensial email dan aktifkan fitur ini pada seting akun. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Social ID ini tidak dipasangkan untuk akun email manapun. Login dengan kredensial email dan aktifkan fitur ini pada seting akun. DOMAIN_NOT_ALLOWED: "Domain tidak diizinkan" ACCOUNT_NOT_ALLOWED: "Akun tidak diizinkan" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Dibutuhkan verifikasi dua langkah" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kesalahan verifikasi dua langkah" COULD_NOT_SAVE_NEW_PASSWORD: "Tidak bisa menyimpan password baru" CURRENT_PASSWORD_INCORRECT: "Password saat ini salah" NEW_PASSWORD_SHORT: "Password terlalu pendek" NEW_PASSWORD_WEAK: "Password terlalu mudah" NEW_PASSWORD_FORBIDDENT: "Password mengandung karakter terlarang" CONTACTS_SYNC_ERROR: "Singkronisasi kontak error" CANT_GET_MESSAGE_LIST: "Tidak bisa mengambil daftar pesan" CANT_GET_MESSAGE: "Tidak bisa mengambil pesan" CANT_DELETE_MESSAGE: "Tidak bisa menghapus pesan" CANT_MOVE_MESSAGE: "Tidak bisa memindahkan pesan" CANT_SAVE_MESSAGE: "Tidak bisa menyimpan pesan" CANT_SEND_MESSAGE: "Tidak bisa mengirim pesan" INVALID_RECIPIENTS: "Penerima tidak sah" CANT_SAVE_FILTERS: "Tidak bisa menyimpan filter" CANT_GET_FILTERS: "Tidak bisa mengambil filter" FILTERS_ARE_NOT_CORRECT: "Filter tidak benar" CANT_CREATE_FOLDER: "Tidak bisa membuat folder" CANT_RENAME_FOLDER: "Tidak bisa mengubah nama folder" CANT_DELETE_FOLDER: "Tidak bisa menghapus folder" CANT_DELETE_NON_EMPTY_FOLDER: "Tidak bisa menghapus direktori yang berisi" CANT_SUBSCRIBE_FOLDER: "Tidak bisa mengaitkan folder" CANT_UNSUBSCRIBE_FOLDER: "Tidak bisa memutuskan folder" CANT_SAVE_SETTINGS: "Tidak bisa menyimpan pengaturan" CANT_SAVE_PLUGIN_SETTINGS: "Tidak bisa menyimpan pengaturan" DOMAIN_ALREADY_EXISTS: "Domain sudah ada" CANT_INSTALL_PACKAGE: "Gagal memasang paket" CANT_DELETE_PACKAGE: "Gagal menghapus paket" INVALID_PLUGIN_PACKAGE: "Paket plugin tidak sah" UNSUPPORTED_PLUGIN_PACKAGE: "Paket plugin tidak didukung" LICENSING_SERVER_IS_UNAVAILABLE: "Server berlangganan tidak tersedia" LICENSING_DOMAIN_EXPIRED: "Berlangganan untuk domain ini telah habis." LICENSING_DOMAIN_BANNED: "Berlangganan untuk domain ini ditolak." DEMO_SEND_MESSAGE_ERROR: "Untuk alasan keamanan, akun ini tidak diizinkan untuk mengirim pesan ke alamat e-mail eksternal!" DEMO_ACCOUNT_ERROR: "Untuk alasan keamanan, akun ini tidak diizinkan melakukan aksi ini!" ACCOUNT_ALREADY_EXISTS: "Akun telah ada" ACCOUNT_DOES_NOT_EXIST: "Akun tidak ada" MAIL_SERVER_ERROR: "Terjadi kesalahan saat mengakses mail server" INVALID_INPUT_ARGUMENT: "Argumen input tidak sah" UNKNOWN_ERROR: "Kesalahan tidak diketahui" STATIC: BACK_LINK: "Muat ulang" DOMAIN_LIST_DESC: "Daftar domain yang diizinkan untuk diakses." PHP_EXSTENSIONS_ERROR_DESC: "Ekstensi PHP yang diperlukan tidak tersedia dalam konfigurasi PHP anda!" PHP_VERSION_ERROR_DESC: "Versi PHP anda (%VERSION%) lebih rendah dari syarat minimal 5.3.0!" NO_SCRIPT_TITLE: "Javascript diperlukan oleh aplikasi ini." NO_SCRIPT_DESC: | Dukungan Javascript tidak tersedia pada browser anda Aktifkan Javascript pada pengaturan browser kemudian coba lagi. NO_COOKIE_TITLE: "Dukungan Cookie diperlukan oleh aplikasi ini." NO_COOKIE_DESC: | Dukungan Cookie tidak tersedia pada browser anda Aktifkan Cookie pada pengaturan browser kemudian coba lagi BAD_BROWSER_TITLE: "Browser anda kadaluarsa." BAD_BROWSER_DESC: | Untuk bisa menggunakan seluruh fitur aplikasi, download dan install salah satu browser berikut. rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/it_IT.yml000066400000000000000000000371131361462701300256640ustar00rootroot00000000000000it_IT: LOGIN: LABEL_LOGIN: "Nome utente" LABEL_PASSWORD: "Password" BUTTON_LOGIN: "Accedi all'amministrazione" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Amministrazione" TABS_LABELS: LABEL_GENERAL_NAME: "Generali" LABEL_LOGIN_NAME: "Accesso" LABEL_BRANDING_NAME: "Personalizzazione" LABEL_CONTACTS_NAME: "Contatti" LABEL_DOMAINS_NAME: "Domini" LABEL_SECURITY_NAME: "Sicurezza" LABEL_INTEGRATION_NAME: "Integrazioni" LABEL_PLUGINS_NAME: "Plugin" LABEL_PACKAGES_NAME: "Pacchetti" LABEL_LICENSING_NAME: "Licenze" LABEL_ABOUT_NAME: "Informazioni" TAB_GENERAL: LEGEND_INTERFACE: "Interfaccia" LABEL_LANGUAGE: "Lingua" LABEL_LANGUAGE_ADMIN: "Lingua (amministrazione)" LABEL_THEME: "Tema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permetti di cambiare lingua all'accesso" LABEL_ALLOW_THEMES_ON_SETTINGS: "Permetti di cambiare tema dalle impostazioni" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permetti di scegliere lo sfondo dalle impostazioni" LABEL_NEW_FOLDER_MOVE: "Nuovo bottone \"Sposta in\"" LABEL_SHOW_THUMBNAILS: "Visualizza anteprime degli allegati" LABEL_ALLOW_GRAVATAR: "Abilita Gravatar" LEGEND_MAIN: "Principale" LABEL_ATTACHMENT_SIZE_LIMIT: "Limite di grandezza degli allegati" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permetti di possedere piĂą account" LABEL_ALLOW_IDENTITIES: "Permetti di registrare identitĂ  multiple" LABEL_ALLOW_TEMPLATES: "Permetti di creare template" ALERT_WARNING: "Attenzione!" HTML_ALERT_WEAK_PASSWORD: | Stai usando la password di amministrazione predefinita.
Per ragioni di sicurezza, cambiala con una nuova password immediatamente. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Schermata di accesso" LABEL_DEFAULT_DOMAIN: "Dominio predefinito" LABEL_DETERMINE_USER_DOMAIN: "Prova a determinare il dominio dell'utente" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permetti di cambiare lingua all'accesso" LABEL_DETERMINE_USER_LANGUAGE: "Prova a determinare la lingua dell'utente" TAB_BRANDING: LEGEND_BRANDING: "Personalizzazione" LABEL_PAGE_TITLE: "Titolo della pagina" LABEL_LOADING_DESCRIPTION: "Messaggio di caricamento" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Pagina di accesso" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Descrizione" LABEL_LOGIN_BACKGROUND: "Sfondo" LABEL_LOGIN_CUSTOM_CSS: "CSS personalizzato" LABEL_LOGIN_SHOW_POWERED_LINK: "Visualizza il link \"Powered by RainLoop\"" LEGEND_USER: "Vista utente" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Titolo del logo" LABEL_USER_LOGO_MESSAGE: "Logo (vista del messaggio)" LABEL_USER_CUSTOM_CSS: "CSS personalizzato" LEGEND_WELCOME_PAGE: "Pagina di benvenuto" LABEL_WELCOME_PAGE_TITLE: "Titolo" LABEL_WELCOME_PAGE_URL: "Indirizzo" LABEL_WELCOME_PAGE_DISPLAY: "Visualizza" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Mai" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Solo una volta" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Sempre" HTML_ALERT_PREMIUM: "Questa funzionalità è disponibile solo per coloro che hanno acquistato una licenza Premium.\n" TAB_CONTACTS: LEGEND_CONTACTS: "Contatti" LEGEND_STORAGE: "Metodo di salvataggio (PDO)" LABEL_ENABLE_CONTACTS: "Abilita contatti" LABEL_ALLOW_SYNC: "Abilita la sincronizzazione dei contatti (con un server CardDAV esterno)" LABEL_STORAGE_TYPE: "Tipo" LABEL_STORAGE_DSN: "DSN" LABEL_STORAGE_USER: "Nome utente" LABEL_STORAGE_PASSWORD: "Password" BUTTON_TEST: "Verifica dati" ALERT_NOTICE: "Attenzione!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Non usare questo tipo di database con un alto numero di utenti attivi." HTML_ALERT_DOES_NOT_SUPPORTED: | Il tuo server non supporta il salvataggio dei contatti.
Devi abilitare l'estensione PDO (SQLite / MySQL / PostgreSQL) sul tuo server. TAB_DOMAINS: LEGEND_DOMAINS: "Domini" BUTTON_ADD_DOMAIN: "Aggiungi dominio" BUTTON_ADD_ALIAS: "Aggiungi alias" DELETE_ARE_YOU_SURE: "Ne sei sicuro?" HTML_DOMAINS_HELPER: | Lista di domini a cui la webmail è abilitata ad accedere.
Clicca su un nome per configurare quel dominio. TAB_SECURITY: LEGEND_SECURITY: "Security" LABEL_ALLOW_TWO_STEP: "Abilita l'autenticazione a due fattori" LABEL_FORCE_TWO_STEP: "Forza l'autenticazione a due fattori" LABEL_USE_IMAGE_PROXY: "Usa un proxy locale per le immagini" LABEL_ALLOW_OPEN_PGP: "Abilita OpenPGP" LABEL_SHOW_PHP_INFO: "Visualizza informazioni su PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Dati di accesso al pannello di controllo" LABEL_CURRENT_PASSWORD: "Password corrente" LABEL_NEW_LOGIN: "Nuovo nome utente" LABEL_NEW_PASSWORD: "Nuova password" LABEL_REPEAT_PASSWORD: "Ripeti nuova password" BUTTON_UPDATE_PASSWORD: "Aggiorna password" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Richiedi verifica dei certificati SSL (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Abilita certificati autofirmati" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Abilita integrazione con Google" LABEL_GOOGLE_AUTH: "Autenticazione" LABEL_GOOGLE_DRIVE: "Integrazione con Google Drive (finestra di scrittura)" LABEL_GOOGLE_PREVIEW: "Integrazione con Google Docs (anteprima per i file di Microsoft Word, Excel e PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "API Key" HINT_GOOGLE_API_KEY: "Richiesta per la selezione dei file di Google Drive" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Abilita l'integrazione con Facebook (autenticazione)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Abilita l'integrazione con Twitter (autenticazione)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Abilita l'integrazione con Dropbox" LABEL_DROPBOX_API_KEY: "API Key" TOP_ALERT: "Informazioni dettagliate circa l'integrazione con i social network è disponibile su" TAB_PLUGINS: LEGEND_PLUGINS: "Plugin" LABEL_ENABLE_PLUGINS: "Abilita plugin" ALERT_NO_PLUGINS: "Nessun plugin è stato installato." LINK_INSTALL_NEW: "Clicca qui per installarne di nuovi!" HINT_CLICK_NAME: "Clicca sul nome di un plugin per configurarlo." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Disponibili per l'aggiornamento" LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponibili per l'installazione" LEGEND_INSTALLED_PACKAGES: "Pacchetti installati" ALERT_CANNOT_ACCESS_REPOSITORY: "Impossibile accedere al repository in questo momento." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Il tuo dominio" LABEL_VERSION: "Licenza" LABEL_CHECKING: "Controllo in corso..." TYPE_BASIC_HINT: "Questo dominio non possiede una licenza commerciale (con funzionalità aggiuntive)." TYPE_BASIC_HINT_2: "Questo dominio non può possedere una licenza." HTML_ALERT_TOP_1: "RainLoop Webmail è rilasciato sotto la licenza" HTML_ALERT_TOP_2: "Sei libero di usarla per i tuoi progetti personali." HTML_ALERT_TOP_3: | L'uso commerciale (con funzionalità aggiuntive) di RainLoop Webmail richiede di ottenere una licenza. TYPE_PREMIUM_LIFETIME: "A vita" LABEL_SUB_EXPIRES: "La licenza scade il" BUTTON_ACTIVATE: "Attiva una chiave di licenza per questo dominio" BUTTON_PURCHASE: "Compra una licenza" BUTTON_TRIAL: "Versione di prova" TAB_ABOUT: LEGEND_ABOUT: "Informazioni" LABEL_TAG_HINT: "Semplice, moderno e veloce client email online" LABEL_ALL_RIGHTS_RESERVED: "Tutti i diritti riservati." HINT_READ_CHANGE_LOG: "Leggere il changelog prima di effettuare l'aggiornamento." HINT_IS_UP_TO_DATE: "RainLoop è aggiornato." HTML_NEW_VERSION: "La nuova versione %VERSION% è disponibile." LABEL_UPDATING: "Aggiornamento in corso..." LABEL_CHECKING: "Controllo della presenza di aggiornamenti..." BUTTON_UPDATE: "Aggiorna" BUTTON_DOWNLOAD: "Scarica" BUTTON_CHANGELOG: "Changelog" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Attivare chiave di licenza?" TITLE_ACTIVATION: "Attivazione..." LABEL_DOMAIN: "Dominio" LABEL_SUB_KEY: "Chiave di licenza" BUTTON_ACTIVATE: "Attiva" LABEL_ACTIVATED: "Attivata" ERROR_INVALID_SUBS_KEY: "Chiave di licenza non valida" SUBS_KEY_ACTIVATED: "Chiave di licenza attivata correttamente" HTML_DESC: | Dopo l'attivazione, la licenza Premium per %DOMAIN% sarà estesa.
Una chiave di licenza può essere attivata su un solo dominio.

Una volta iniziato, il processo di attivazione non potrĂ  essere bloccato od annullato. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Aggiungi alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Dominio" BUTTON_CLOSE: "Chiudi" BUTTON_ADD: "Aggiungi" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Aggiungi dominio" TITLE_ADD_DOMAIN_WITH_NAME: "Aggiungi il dominio \"%NAME%\"" TITLE_EDIT_DOMAIN: "Modifica il dominio \"%NAME%\"" LABEL_NAME: "Nome dominio" NAME_HELPER: "asterischi supportati" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "porta" LABEL_SECURE: "Sicuro" LABEL_WHITE_LIST: "Whitelist" SECURE_OPTION_NONE: "Nessuna" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Abilita script sieve" LABEL_ALLOW_USER_SCRIPT: "Abilita script personalizzati" LABEL_USE_SHORT_LOGIN: "Utilizza login corto" LABEL_USE_AUTH: "Utilizza autenticazione" LABEL_USE_PHP_MAIL: "Usa la funzione mail() di PHP" BUTTON_TEST: "Verifica" BUTTON_WHITE_LIST: "Whitelist" BUTTON_SIEVE_CONFIGURATION: "Configurazione di Sieve" BUTTON_BACK_TO_IMAP: "Torna alle impostazioni IMAP" BUTTON_BACK: "Indietro" BUTTON_CLOSE: "Chiudi" BUTTON_ADD: "Aggiungi" BUTTON_UPDATE: "Aggiorna" NEW_DOMAIN_DESC: "La configurazione di questo dominio ti permette di lavorare
con %NAME% indirizzi email." WHITE_LIST_ALERT: | Lista di domini a cui gli utenti sono autorizzati ad accedere. Utilizzare uno spazio come separatore. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Niente da configurare" BUTTON_CLOSE: "Chiudi" BUTTON_SAVE: "Salva" TOOLTIP_ABOUT_TITLE: "Informazioni" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Sei sicuro di voler chiudere questa finestra?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Scegli la tua lingua" HINTS: BETA: "beta" UNSTABLE: "instabile" WARNING: "Attenzione!" NOT_SUPPORTED: "non supportato" REQUIRES_PHP_54: "richiede PHP 5.4 o maggiori" ERRORS: DOMAIN_ALREADY_EXISTS: "Il dominio esiste giĂ " UNKNOWN_ERROR: "Errore sconosciuto" NOTIFICATIONS: INVALID_TOKEN: "Token invalido" AUTH_ERROR: "Autenticazione fallita" ACCESS_ERROR: "Errore di accesso" CONNECTION_ERROR: "Impossibile connettersi al server" CAPTCHA_ERROR: "CAPTCHA non corretto." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Questo account social non è assegnato ancora a nessun indirizzo email. Accedi utilizzando le credenziali dell'indirizzo e abilita la funzionalitĂ  nelle impostazioni. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Questo account social non è assegnato ancora a nessun indirizzo email. Accedi utilizzando le credenziali dell'indirizzo e abilita la funzionalitĂ  nelle impostazioni. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Questo account social non è assegnato ancora a nessun indirizzo email. Accedi utilizzando le credenziali dell'indirizzo e abilita la funzionalitĂ  nelle impostazioni. DOMAIN_NOT_ALLOWED: "Dominio non autorizzato" ACCOUNT_NOT_ALLOWED: "Account non autorizzato" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Autenticazione a due fattori richiesta" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Errore durante l'autenticazione a due fattori" COULD_NOT_SAVE_NEW_PASSWORD: "Impossibile salvare la nuova password" CURRENT_PASSWORD_INCORRECT: "Password corrente incorreta" NEW_PASSWORD_SHORT: "Password troppo corta" NEW_PASSWORD_WEAK: "Password troppo facile" NEW_PASSWORD_FORBIDDENT: "Password vietata" CONTACTS_SYNC_ERROR: "Errore durante la sincronizzazione dei contatti" CANT_GET_MESSAGE_LIST: "Errore durante il caricamento della lista dei messaggi" CANT_GET_MESSAGE: "Errore durante il caricamento del messaggio" CANT_DELETE_MESSAGE: "Impossibile cancellare il messaggio" CANT_MOVE_MESSAGE: "Impossibile spostare il messaggio" CANT_SAVE_MESSAGE: "Impossibile salvare il messaggio" CANT_SEND_MESSAGE: "Impossibile inviare il messaggio" INVALID_RECIPIENTS: "Destinatari invalidi" CANT_SAVE_FILTERS: "Impossibile salvare i filtri" CANT_GET_FILTERS: "Impossibile caricare i filtri" FILTERS_ARE_NOT_CORRECT: "I filtri non sono corretti" CANT_CREATE_FOLDER: "Impossibile creare la cartella" CANT_RENAME_FOLDER: "Impossibile rinominare la cartella" CANT_DELETE_FOLDER: "Impossibile cancellare la cartella" CANT_DELETE_NON_EMPTY_FOLDER: "Non è possibile cancellare cartelle piene" CANT_SUBSCRIBE_FOLDER: "Impossibile sottoscriversi alla cartella" CANT_UNSUBSCRIBE_FOLDER: "Impossibile rimuovere la sottoscrizione dalla cartella" CANT_SAVE_SETTINGS: "Impossibile salvare le impostazioni" CANT_SAVE_PLUGIN_SETTINGS: "Impossibile salvare le impostazioni" DOMAIN_ALREADY_EXISTS: "Il dominio giĂ  esiste" CANT_INSTALL_PACKAGE: "Impossibile installare il pacchetto" CANT_DELETE_PACKAGE: "Impossibile rimuovere il pacchetto" INVALID_PLUGIN_PACKAGE: "Pacchetto non valido" UNSUPPORTED_PLUGIN_PACKAGE: "Pacchetto non supportato" LICENSING_SERVER_IS_UNAVAILABLE: "Il server dlele licenze non è dispobibile" LICENSING_DOMAIN_EXPIRED: "La licenza per questo dominio è scaduta" LICENSING_DOMAIN_BANNED: "La licenza per questo dominio è stata revocata" DEMO_SEND_MESSAGE_ERROR: "Per ragioni di sicurezza, questo account non è abilitato ad inviare email all'esterno." DEMO_ACCOUNT_ERROR: "Per ragioni di sicurezza, questa funzionalitĂ  è bloccata." ACCOUNT_ALREADY_EXISTS: "Questo account esiste giĂ " ACCOUNT_DOES_NOT_EXIST: "L'account non esiste" MAIL_SERVER_ERROR: "Errore durante la connessione con il server mail" INVALID_INPUT_ARGUMENT: "Argomento non valido" UNKNOWN_ERROR: "Errore sconosciuto" STATIC: BACK_LINK: "Ricarica" DOMAIN_LIST_DESC: "Lista di domini a cui la webmail è abilitata ad accedere" PHP_EXSTENSIONS_ERROR_DESC: "Un estensione di PHP richiesta non è disponibile." PHP_VERSION_ERROR_DESC: "La versione di PHP corrente (%VERSION%) è piĂą vecchia di quella minima supportata (PHP 5.3.0)" NO_SCRIPT_TITLE: "Questa applicazione richiede JacaScript" NO_SCRIPT_DESC: | Il supporto a JavaScript è disabilitato nel browser. Abilita JavaScript e ricarica la pagina. NO_COOKIE_TITLE: "Questa applicazione richiede i cookie" NO_COOKIE_DESC: | Il supporto ai cookie è disabilitato nel browser. Abilita i cookie e ricarica la pagina. BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" BAD_BROWSER_DESC: | Per usare tutte le funzionalitĂ  dell'applicazione, scarica ed installa uno dei seguenti browser: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml000066400000000000000000000435571361462701300256500ustar00rootroot00000000000000ja_JP: LOGIN: LABEL_LOGIN: "ă­ă‚°ă‚¤ăł" LABEL_PASSWORD: "ă‘スăŻăĽă‰" BUTTON_LOGIN: "管ç†ç”»éť˘ă¸ă­ă‚°ă‚¤ăł" TOP_PANEL: LABEL_PREMIUM: "ă—ă¬ăźă‚˘ă " LABEL_ADMIN_PANEL: "管ç†ç”»éť˘" TABS_LABELS: LABEL_GENERAL_NAME: "ĺ…¨č¬" LABEL_LOGIN_NAME: "ă­ă‚°ă‚¤ăł" LABEL_BRANDING_NAME: "ă–ă©ăłă‰ĺŚ–" LABEL_CONTACTS_NAME: "連絡ĺ…" LABEL_DOMAINS_NAME: "ă‰ăˇă‚¤ăł" LABEL_SECURITY_NAME: "セキăĄăŞă†ă‚Ł" LABEL_INTEGRATION_NAME: "連ćş" LABEL_PLUGINS_NAME: "ă—ă©ă‚°ă‚¤ăł" LABEL_PACKAGES_NAME: "ă‘ăケăĽă‚¸" LABEL_LICENSING_NAME: "ă©ă‚¤ă‚»ăłă‚ą" LABEL_ABOUT_NAME: "RainLoop ă«ă¤ă„ă¦" TAB_GENERAL: LEGEND_INTERFACE: "イăłă‚żăĽă•ă‚§ăĽă‚ą" LABEL_LANGUAGE: "言語" LABEL_LANGUAGE_ADMIN: "言語 (管ç†ç”»éť˘)" LABEL_THEME: "ă†ăĽăž" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "設定画面ă§č¨€čŞžé¸ćŠžă‚’ä˝żç”¨ă™ă‚‹" LABEL_ALLOW_THEMES_ON_SETTINGS: "設定画面ă§ă†ăĽăžé¸ćŠžă‚’ä˝żç”¨ă™ă‚‹" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "設定画面ă§čŚć™Żé¸ćŠžă‚’ä˝żç”¨ă™ă‚‹" LABEL_NEW_FOLDER_MOVE: "ć–°ă—ă„ \"ă•ă‚©ă«ă€ă¸ç§»ĺ‹•\" ăśă‚żăł" LABEL_SHOW_THUMBNAILS: "サă ăŤă‚¤ă«ă‚’表示 (ć·»ä»ă•ァイă«)" LABEL_ALLOW_GRAVATAR: "Gravatar を使用ă™ă‚‹" LEGEND_MAIN: "ăˇă‚¤ăł" LABEL_ATTACHMENT_SIZE_LIMIT: "ć·»ä»ă‚µă‚¤ă‚şĺ¶é™" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "追加ă®ă‚˘ă‚«ă‚¦ăłăを使用ă™ă‚‹" LABEL_ALLOW_IDENTITIES: "複数ă®čˇ¨ç¤şĺŤă‚’使用ă™ă‚‹" LABEL_ALLOW_TEMPLATES: "ă†ăłă—ă¬ăĽăを許可ă™ă‚‹" ALERT_DATA_ACCESS: "RainLoop ă®ă‡ăĽă‚żă•ă‚©ă«ă€ăŚă‚˘ă‚Żă‚»ă‚ąĺŹŻč˝ă«ăŞăŁă¦ă„ăľă™ă€‚外é¨ă‹ă‚‰ RainLoop ă®ă‡ăĽă‚żă•ă‚©ă«ă€ă«ă‚˘ă‚Żă‚»ă‚ąă§ăŤăŞă„ă‚ă†ă€Web サăĽăăĽă‚’設定ă—ă¦ăŹă ă•ă„。詳ă—ăŹăŻä»Ąä¸‹ă‚’ă”覧ăŹă ă•ă„:" ALERT_WARNING: "警告ďĽ" HTML_ALERT_WEAK_PASSWORD: | ă‡ă•ă‚©ă«ăă®ç®ˇç†č€…ă‘スăŻăĽă‰ă‚’使用ă—ă¦ă„ăľă™ă€‚
セキăĄăŞă†ă‚Łä¸Šă®ç†ç”±ă‹ă‚‰ă€ă„ăľă™ăă‘スăŻăĽă‰ă‚’ 変更 ă—ă¦ăŹă ă•ă„。 TAB_LOGIN: LEGEND_LOGIN_SCREEN: "ă­ă‚°ă‚¤ăłç”»éť˘" LABEL_DEFAULT_DOMAIN: "ă‡ă•ă‚©ă«ăă‰ăˇă‚¤ăł" LABEL_DETERMINE_USER_DOMAIN: "ă¦ăĽă‚¶ăĽă‰ăˇă‚¤ăłă‚’自動ă§é¸ă¶" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "ă­ă‚°ă‚¤ăłç”»éť˘ă§č¨€čŞžé¸ćŠžă‚’ä˝żç”¨ă™ă‚‹" LABEL_DETERMINE_USER_LANGUAGE: "ă¦ăĽă‚¶ăĽč¨€čŞžă‚’č‡Şĺ‹•ă§é¸ă¶" TAB_BRANDING: LEGEND_BRANDING: "ă–ă©ăłă‰ĺŚ–" LABEL_PAGE_TITLE: "ăšăĽă‚¸ă‚żă‚¤ăă«" LABEL_LOADING_DESCRIPTION: "説ćŽă‚’読ăżčľĽăżä¸­" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "ă­ă‚°ă‚¤ăł" LABEL_LOGIN_LOGO: "ă­ă‚´" LABEL_LOGIN_DESCRIPTION: "説ćŽ" LABEL_LOGIN_BACKGROUND: "čŚć™Ż" LABEL_LOGIN_CUSTOM_CSS: "ă‚«ă‚ąă‚żă  CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "\"Powered by RainLoop\" ăŞăłă‚Żă‚’表示ă™ă‚‹" LEGEND_USER: "ă¦ăĽă‚¶ăĽ" LABEL_USER_LOGO: "ă­ă‚´" LABEL_USER_LOGO_TITLE: "ăšăĽă‚¸ă‚żă‚¤ăă«" LABEL_USER_LOGO_MESSAGE: "ă­ă‚´(ăˇăă‚»ăĽă‚¸ç”»éť˘)" LABEL_USER_CUSTOM_CSS: "ă‚«ă‚ąă‚żă  CSS" LEGEND_WELCOME_PAGE: "ă‚ă†ă“ăťăšăĽă‚¸" LABEL_WELCOME_PAGE_TITLE: "タイăă«" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "表示" OPTION_WELCOME_PAGE_DISPLAY_NONE: "ăŞă—" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "1回ă ă‘" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "ă„ă¤ă‚‚" HTML_ALERT_PREMIUM: "ă“ă®ć©źč˝ă«ăŻă—ă¬ăźă‚˘ă ăŚĺż…č¦ă§ă™" TAB_CONTACTS: LEGEND_CONTACTS: "連絡ĺ…" LEGEND_STORAGE: "スăă¬ăĽă‚¸ (PDO)" LABEL_ENABLE_CONTACTS: "連絡ĺ…を有効化" LABEL_ALLOW_SYNC: " (外é¨ă® CardDAV サăĽăăĽă¨) 連絡ĺ…ă®ĺŚćśźă‚’使用ă™ă‚‹" LABEL_STORAGE_TYPE: "タイă—" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "ă¦ăĽă‚¶ăĽ" LABEL_STORAGE_PASSWORD: "ă‘スăŻăĽă‰" BUTTON_TEST: "ă†ă‚ąă" ALERT_NOTICE: "注意ďĽ" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "アクă†ă‚Łă–ă¦ăĽă‚¶ăĽă®ć•°ăŚĺ¤šă„ă¨ăŤă€ă“ă®ă‡ăĽă‚żă™ăĽă‚ąă»ă‚żă‚¤ă—を使用ă—ăŞă„ă§ăŹă ă•ă„。" HTML_ALERT_DOES_NOT_SUPPORTED: | ă“ă®ă‚·ă‚ąă†ă ă§ăŻé€Łçµˇĺ…ăŻă‚µăťăĽăă•れă¦ă„ăľă›ă‚“。
サăĽăăĽă¸PDO (SQLite / MySQL / PostgreSQL) 拡張ă˘ă‚¸ăĄăĽă«ă®ă‚¤ăłă‚ąăăĽă«ăŚĺż…č¦ă§ă™ă€‚ TAB_DOMAINS: LEGEND_DOMAINS: "ă‰ăˇă‚¤ăł" BUTTON_ADD_DOMAIN: "ă‰ăˇă‚¤ăłă‚’追加" BUTTON_ADD_ALIAS: "エイăŞă‚˘ă‚ąă‚’追加" DELETE_ARE_YOU_SURE: "ă‚ろă—ă„ă§ă™ă‹ďĽź" HTML_DOMAINS_HELPER: | ă‰ăˇă‚¤ăłă®ä¸€č¦§ăŻă€Web ăˇăĽă«ă®ă‚˘ă‚Żă‚»ă‚ąă‚’許可ă•れă¦ă„ăľă™ă€‚
ă‰ăˇă‚¤ăłă‚’設定ă™ă‚‹ă«ăŻă€ĺŤĺ‰Ťă‚’クăŞăクă—ă¦ăŹă ă•ă„。 TAB_SECURITY: LEGEND_SECURITY: "セキăĄăŞă†ă‚Ł" LABEL_ALLOW_TWO_STEP: "2段階認証を使用ă™ă‚‹" LABEL_FORCE_TWO_STEP: "ĺż…ăš 2段階認証 を使ă†" LABEL_USE_IMAGE_PROXY: "外é¨ă‚¤ăˇăĽă‚¸ă«ă­ăĽă‚«ă« Proxy を使ă†" LABEL_ALLOW_OPEN_PGP: "OpenPGP を使ă†" LABEL_SHOW_PHP_INFO: "PHP ć…報を表示" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "管ç†ç”»éť˘ă‚˘ă‚Żă‚»ă‚ąć…ĺ ±" LABEL_CURRENT_PASSWORD: "現在ă®ă‘スăŻăĽă‰" LABEL_NEW_LOGIN: "ć–°ă—ă„ă­ă‚°ă‚¤ăłĺŤ" LABEL_NEW_PASSWORD: "ć–°ă—ă„ă‘スăŻăĽă‰" LABEL_REPEAT_PASSWORD: "再入力" BUTTON_UPDATE_PASSWORD: "ă‘スăŻăĽă‰ć›´ć–°" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: " (IMAP/SMTP) ă®SSL 証ćŽć›¸ă®ć¤śč¨Ľă‚’有効ă«ă™ă‚‹" LABEL_ALLOW_SELF_SIGNED: "自己署ĺŤč¨ĽćŽć›¸ă‚’使ă†" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Google 連ćşă‚’有効ă«ă™ă‚‹" LABEL_GOOGLE_AUTH: "Authorization" LABEL_GOOGLE_DRIVE: "Google ă‰ă©ă‚¤ă–é€Łćş (編集画面)" LABEL_GOOGLE_PREVIEW: "Google ă“ăĄăĽă‚˘é€Łćş (Microsoft Word/Excel/PowerPoint ă•ァイă«ă®ă—ă¬ă“ăĄăĽ)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Api Key" HINT_GOOGLE_API_KEY: "Googleă‰ă©ă‚¤ă–ă®ă•ァイă«ă”ăă‚«ăĽă®ĺ ´ĺăŻĺż…é " LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Facebook 連ćşă‚’有効ă«ă™ă‚‹ (Authorization)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Twitter 連ćşă‚’有効ă«ă™ă‚‹ (Authorization)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Dropbox 連ćşă‚’有効ă«ă™ă‚‹" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "SNS 連ćşă®č©łç´°ăŻć…ĺ ±ăŻă€" TAB_PLUGINS: LEGEND_PLUGINS: "ă—ă©ă‚°ă‚¤ăł" LABEL_ENABLE_PLUGINS: "ă—ă©ă‚°ă‚¤ăłćś‰ĺŠą" ALERT_NO_PLUGINS: "ă—ă©ă‚°ă‚¤ăłăŻă€ă‚¤ăłă‚ąăăĽă«ă•れă¦ă„ăľă›ă‚“" LINK_INSTALL_NEW: "ă“ă“をクăŞăクă—ă¦ă‚¤ăłă‚ąăăĽă«" HINT_CLICK_NAME: "ă—ă©ă‚°ă‚¤ăłă‚’設定ă™ă‚‹ă«ăŻĺŤĺ‰Ťă‚’クăŞăクă—ăľă™" TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "ć›´ć–°ăŚă‚りăľă™" LEGEND_AVAILABLE_FOR_INSTALLATION: "イăłă‚ąăăĽă«ĺŹŻč˝ăŞă‘ăケăĽă‚¸" LEGEND_INSTALLED_PACKAGES: "イăłă‚ąăăĽă«ă•れăźă‘ăケăĽă‚¸" ALERT_CANNOT_ACCESS_REPOSITORY: "現時点ă§ăŞăťă‚¸ăăŞă«ă‚˘ă‚Żă‚»ă‚ąă™ă‚‹ă“ă¨ăŻă§ăŤăľă›ă‚“。" TAB_LICENSING: LABEL_YOUR_DOMAIN: "ă‰ăˇă‚¤ăł" LABEL_VERSION: "ăăĽă‚¸ă§ăł" LABEL_CHECKING: "ăă‚§ăク中" TYPE_BASIC_HINT: "ă“ă®ă‰ăˇă‚¤ăłăŻă€ (追加ă®ć©źč˝ă‚’ĺ‚™ăăź)商業的使用ă®ăźă‚ă«ă©ă‚¤ă‚»ăłă‚ąă•れă¦ă„ăľă›ă‚“。" TYPE_BASIC_HINT_2: "ă“ă®ă‰ăˇă‚¤ăłăŻă©ă‚¤ă‚»ăłă‚ąă•れă¦ă„ăľă›ă‚“" HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" HTML_ALERT_TOP_2: "You are free to use it for your personal projects." HTML_ALERT_TOP_3: | RainLoop Webmailă®ďĽä»ĺŠ çš„ăŞć©źč˝ă‚’ĺ‚™ăăźďĽ‰ĺ•†ćĄ­çš„使用ăŻă€ サă–スクăŞă—ă‚·ă§ăłă‚’取得ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚ TYPE_PREMIUM_LIFETIME: "ă©ă‚¤ă•タイă " LABEL_SUB_EXPIRES: "サă–スクăŞă—ă‚·ă§ăłă®ćś‰ĺŠąćśźé™ĺ‡ă‚Ś" BUTTON_ACTIVATE: "ă“ă®ă‰ăˇă‚¤ăłă‚µă–スクăŞă—ă‚·ă§ăłă‚­ăĽă‚’アクă†ă‚Łă™ăĽăă™ă‚‹" BUTTON_PURCHASE: "購入" BUTTON_TRIAL: "試用" TAB_ABOUT: LEGEND_ABOUT: "RainLoop ă«ă¤ă„ă¦" LABEL_TAG_HINT: "ă‚·ăłă—ă«ă»ă˘ă€ăłă»é«é€źăŞă‚¦ă‚§ă–ă™ăĽă‚ąă®ăˇăĽă«ă‚Żă©ă‚¤ă‚˘ăłă" LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." HINT_READ_CHANGE_LOG: "ć›´ć–°ă™ă‚‹ĺ‰Ťă«ĺ¤‰ć›´ă­ă‚°ă‚’ăŠčŞ­ăżăŹă ă•ă„。" HINT_IS_UP_TO_DATE: "RainLoopăŻćś€ć–°ă®ă‚‚ă®ă§ă™ă€‚" HTML_NEW_VERSION: "ć–°ă—ă„ăăĽă‚¸ă§ăł %VERSION% ăŚă‚りăľă™" LABEL_UPDATING: "更新中" LABEL_CHECKING: "アăă—ă‡ăĽăă®ç˘şčŞŤ" BUTTON_UPDATE: "ć›´ć–°" BUTTON_DOWNLOAD: "ă€ă‚¦ăłă­ăĽă‰" BUTTON_CHANGELOG: "変更履歴" POPUPS_ACTIVATE: TITLE_ACTIVATE: "サă–スクăŞă—ă‚·ă§ăłă‚­ăĽă‚’アクă†ă‚Łă™ăĽăă—ăľă™ă‹ďĽź" TITLE_ACTIVATION: "アクă†ă‚Łă™ăĽă‚·ă§ăł ..." LABEL_DOMAIN: "ă‰ăˇă‚¤ăł" LABEL_SUB_KEY: "サă–スクăŞă—ă‚·ă§ăłă‚­ăĽ" BUTTON_ACTIVATE: "アクă†ă‚Łă™ăĽă" LABEL_ACTIVATED: "アクă†ă‚Łă™ăĽăć¸ăż" ERROR_INVALID_SUBS_KEY: "無効ăŞă‚µă–スクăŞă—ă‚·ă§ăłă‚­ăĽ" SUBS_KEY_ACTIVATED: "サă–スクăŞă—ă‚·ă§ăłă‚­ăĽă®ă‚˘ă‚Żă†ă‚Łă™ăĽăă«ć功ă—ăľă—ăź" HTML_DESC: | %DOMAIN% ă®ă—ă¬ăźă‚˘ă ă‚µă–スクăŞă—ă‚·ă§ăłă‚’アクă†ă‚Łă™ăĽăă—ăźĺľŚă€ć‹ˇĺĽµă•れăľă™ă€‚
ăťă®ă‚µă–スクăŞă—ă‚·ă§ăłă‚­ăĽăŻă€1ă¤ă®ă‰ăˇă‚¤ăłă®ăżă‚˘ă‚Żă†ă‚Łă™ăĽăă§ăŤăľă™ă€‚

一度アクă†ă‚Łă™ăĽă‚·ă§ăłă®ĺ‡¦ç†ă‚’é–‹ĺ§‹ă™ă‚‹ă¨ă€ä¸­ć­˘ăľăźăŻă‚­ăŁăłă‚»ă«ă™ă‚‹ă“ă¨ăŻă§ăŤăľă›ă‚“。 POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "エイăŞă‚˘ă‚ąă‚’追加" LABEL_ALIAS: "エイăŞă‚˘ă‚ą" LABEL_DOMAIN: "ă‰ăˇă‚¤ăł" BUTTON_CLOSE: "é–‰ăă‚‹" BUTTON_ADD: "追加" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "ă‰ăˇă‚¤ăłă‚’追加" TITLE_ADD_DOMAIN_WITH_NAME: "ă‰ăˇă‚¤ăł \"%NAME%\" を追加" TITLE_EDIT_DOMAIN: "ă‰ăˇă‚¤ăł \"%NAME%\" を編集" LABEL_NAME: "ĺŤĺ‰Ť" NAME_HELPER: "ăŻă‚¤ă«ă‰ă‚«ăĽă‰ĺ©ç”¨ĺŹŻ" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "サăĽăăĽ" LABEL_PORT: "ăťăĽă" LABEL_SECURE: "セキăĄăŞă†ă‚Ł" LABEL_WHITE_LIST: "ă›ăŻă‚¤ăăŞă‚ąă" SECURE_OPTION_NONE: "ăŞă—" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "SIEVE スクăŞă—ăを使用ă™ă‚‹" LABEL_ALLOW_USER_SCRIPT: "カスタă ă¦ăĽă‚¶ăĽă‚ąă‚ŻăŞă—ăを使用ă™ă‚‹" LABEL_USE_SHORT_LOGIN: "çź­ă„ă­ă‚°ă‚¤ăłĺŤă‚’使ă†" LABEL_USE_AUTH: "認証を使用ă™ă‚‹" LABEL_USE_PHP_MAIL: "PHP mail() 関数を使用ă™ă‚‹" BUTTON_TEST: "接続ă†ă‚ąă" BUTTON_WHITE_LIST: "ă›ăŻă‚¤ăăŞă‚ąă" BUTTON_SIEVE_CONFIGURATION: "SIEVE 設定" BUTTON_BACK_TO_IMAP: "IMAP 設定ă«ć»ă‚‹" BUTTON_BACK: "ć»ă‚‹" BUTTON_CLOSE: "é–‰ăă‚‹" BUTTON_ADD: "追加" BUTTON_UPDATE: "ć›´ć–°" NEW_DOMAIN_DESC: "ă“ă®ă‰ăˇă‚¤ăłč¨­ĺ®šă‚’使用ă™ă‚‹ă¨ă€ %NAME% ăˇăĽă«ă‚˘ă‰ă¬ă‚ąă§ĺ‹•作ă™ă‚‹ă‚ă†ă«ăŞă‚Šăľă™ă€‚" WHITE_LIST_ALERT: | ă‰ăˇă‚¤ăłă®ä¸€č¦§ăŻă€Web ăˇăĽă«ă®ă‚˘ă‚Żă‚»ă‚ąă‚’許可ă•れă¦ă„ăľă™ă€‚ 区ĺ‡ă‚Šć–‡ĺ­—ă¨ă—ă¦ă‚ąăšăĽă‚ąă‚’使用ă—ă¦ăŹă ă•ă„。 POPUPS_PLUGIN: TITLE_PLUGIN: "ă—ă©ă‚°ă‚¤ăł" DESC_NOTHING_TO_CONFIGURE: "何も設定ă•れă¦ă„ăľă›ă‚“" BUTTON_CLOSE: "é–‰ăă‚‹" BUTTON_SAVE: "äżťĺ­" TOOLTIP_ABOUT_TITLE: "RainLoop ă«ă¤ă„ă¦" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "ă“ă®ă‚¦ă‚Łăłă‰ă‚¦ă‚’é–‰ăă¦ă‚‚ă‚ろă—ă„ă§ă™ă‹ďĽź" POPUPS_LANGUAGES: TITLE_LANGUAGES: "言語をé¸ćŠžă—ă¦ăŹă ă•ă„" HINTS: BETA: "beta" UNSTABLE: "unstable" WARNING: "警告ďĽ" NOT_SUPPORTED: "サăťăĽăă•れăľă›ă‚“" REQUIRES_PHP_54: "PHP 5.4 以上ăŚĺż…č¦ă§ă™" ERRORS: DOMAIN_ALREADY_EXISTS: "ă‰ăˇă‚¤ăłăŚć—˘ă«ĺ­ĺś¨ă—ă¦ă„ăľă™" UNKNOWN_ERROR: "不ćŽăŞă‚¨ă©ăĽ" NOTIFICATIONS: INVALID_TOKEN: "無効ăŞăăĽă‚Żăł" AUTH_ERROR: "認証ă«ĺ¤±ć•—ă—ăľă—ăź" ACCESS_ERROR: "アクセスエă©ăĽ" CONNECTION_ERROR: "サăĽăăĽă¸ćŽĄç¶šă§ăŤăľă›ă‚“" CAPTCHA_ERROR: "é–“é•ăŁăź CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > ă“ă®SNSă¦ăĽă‚¶ăĽIDăŻă€ăľă ăˇăĽă«ă‚˘ă‚«ă‚¦ăłă用ă«ĺ‰˛ă‚Šĺ˝“ă¦ă‚‰ă‚Śă¦ă„ăľă›ă‚“。電ĺ­ăˇăĽă«ă®čł‡ć Ľć…報を使用ă—ă¦ă­ă‚°ă‚¤ăłă—ă€ă‚˘ă‚«ă‚¦ăłă設定ă§ă“ă®ć©źč˝ă‚’有効ă«ă—ăľă™ă€‚ SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > ă“ă®SNSă¦ăĽă‚¶ăĽIDăŻă€ăľă ăˇăĽă«ă‚˘ă‚«ă‚¦ăłă用ă«ĺ‰˛ă‚Šĺ˝“ă¦ă‚‰ă‚Śă¦ă„ăľă›ă‚“。電ĺ­ăˇăĽă«ă®čł‡ć Ľć…報を使用ă—ă¦ă­ă‚°ă‚¤ăłă—ă€ă‚˘ă‚«ă‚¦ăłă設定ă§ă“ă®ć©źč˝ă‚’有効ă«ă—ăľă™ă€‚ SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > ă“ă®SNSă¦ăĽă‚¶ăĽIDăŻă€ăľă ăˇăĽă«ă‚˘ă‚«ă‚¦ăłă用ă«ĺ‰˛ă‚Šĺ˝“ă¦ă‚‰ă‚Śă¦ă„ăľă›ă‚“。電ĺ­ăˇăĽă«ă®čł‡ć Ľć…報を使用ă—ă¦ă­ă‚°ă‚¤ăłă—ă€ă‚˘ă‚«ă‚¦ăłă設定ă§ă“ă®ć©źč˝ă‚’有効ă«ă—ăľă™ă€‚ DOMAIN_NOT_ALLOWED: "ă‰ăˇă‚¤ăłăŻă€č¨±ĺŹŻă•れă¦ă„ăľă›ă‚“" ACCOUNT_NOT_ALLOWED: "アカウăłăăŻă€č¨±ĺŹŻă•れă¦ă„ăľă›ă‚“" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2段階認証ăŚĺż…č¦ă§ă™" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2段階認証エă©ăĽ" COULD_NOT_SAVE_NEW_PASSWORD: "ć–°ă—ă„ă‘スăŻăĽă‰ă‚’äżťĺ­ă§ăŤăľă›ă‚“。" CURRENT_PASSWORD_INCORRECT: "現在ă®ă‘スăŻăĽă‰ăŚé–“é•ăŁă¦ă„ăľă™" NEW_PASSWORD_SHORT: "ă‘スăŻăĽă‰ăŚçź­ă™ăŽăľă™" NEW_PASSWORD_WEAK: "ă‘スăŻăĽă‰ăŚç°ˇĺŤă™ăŽăľă™" NEW_PASSWORD_FORBIDDENT: "ă‘スăŻăĽă‰ă«ă€ç¦ć­˘ă•れăźć–‡ĺ­—ăŚĺ«ăľă‚Śă¦ă„ăľă™" CONTACTS_SYNC_ERROR: "é€Łçµˇĺ… ĺŚćśź エă©ăĽ" CANT_GET_MESSAGE_LIST: "ăˇăă‚»ăĽă‚¸ä¸€č¦§ăŚĺŹ–ĺľ—ă§ăŤăľă›ă‚“" CANT_GET_MESSAGE: "ăˇăă‚»ăĽă‚¸ăŚĺŹ–ĺľ—ă§ăŤăľă›ă‚“" CANT_DELETE_MESSAGE: "ăˇăă‚»ăĽă‚¸ăŚĺ‰Šé™¤ă§ăŤăľă›ă‚“" CANT_MOVE_MESSAGE: "ăˇăă‚»ăĽă‚¸ăŚç§»ĺ‹•ă§ăŤăľă›ă‚“" CANT_SAVE_MESSAGE: "ăˇăă‚»ăĽă‚¸ăŚäżťĺ­ă§ăŤăľă›ă‚“" CANT_SEND_MESSAGE: "ăˇăă‚»ăĽă‚¸ăŚé€äżˇă§ăŤăľă›ă‚“" INVALID_RECIPIENTS: "無効ăŞĺŹ—äżˇč€…" CANT_SAVE_FILTERS: "ă•ィă«ă‚żăĽăŚäżťĺ­ă§ăŤăľă›ă‚“" CANT_GET_FILTERS: "ă•ィă«ă‚żăĽă‚’取得ă§ăŤăľă›ă‚“" FILTERS_ARE_NOT_CORRECT: "ă•ィă«ă‚żăĽăŚć­Łă—ăŹă‚りăľă›ă‚“" CANT_CREATE_FOLDER: "ă•ă‚©ă«ă€ăĽă‚’作ćă§ăŤăľă›ă‚“" CANT_RENAME_FOLDER: "ă•ă‚©ă«ă€ă®ĺŤĺ‰ŤăŚĺ¤‰ć›´ă§ăŤăľă›ă‚“" CANT_DELETE_FOLDER: "ă•ă‚©ă«ă€ă‚’削除ă§ăŤăľă›ă‚“" CANT_DELETE_NON_EMPTY_FOLDER: "空ă§ăŻăŞă„ă‡ă‚Łă¬ă‚ŻăăŞă‚’削除ă§ăŤăľă›ă‚“" CANT_SUBSCRIBE_FOLDER: "ă•ă‚©ă«ă€ă‚’購読ă§ăŤăľă›ă‚“" CANT_UNSUBSCRIBE_FOLDER: "ă•ă‚©ă«ă€ă‚’購読解除ă§ăŤăľă›ă‚“" CANT_SAVE_SETTINGS: "設定ăŚäżťĺ­ă§ăŤăľă›ă‚“" CANT_SAVE_PLUGIN_SETTINGS: "設定ăŚäżťĺ­ă§ăŤăľă›ă‚“" DOMAIN_ALREADY_EXISTS: "ă‰ăˇă‚¤ăłăŚć—˘ă«ĺ­ĺś¨ă—ă¦ă„ăľă™" CANT_INSTALL_PACKAGE: "ă‘ăケăĽă‚¸ă®ă‚¤ăłă‚ąăăĽă«ă«ĺ¤±ć•—ă—ăľă—ăź" CANT_DELETE_PACKAGE: "ă‘ăケăĽă‚¸ă®ĺ‰Šé™¤ă«ĺ¤±ć•—ă—ăľă—ăź" INVALID_PLUGIN_PACKAGE: "無効ăŞă—ă©ă‚°ă‚¤ăłă‘ăケăĽă‚¸" UNSUPPORTED_PLUGIN_PACKAGE: "サăťăĽăă•れă¦ă„ăŞă„ă—ă©ă‚°ă‚¤ăłă‘ăケăĽă‚¸" LICENSING_SERVER_IS_UNAVAILABLE: "サă–スクăŞă—ă‚·ă§ăłă‚µăĽăăĽăŚĺ©ç”¨ă§ăŤăľă›ă‚“" LICENSING_DOMAIN_EXPIRED: "ă“ă®ă‰ăˇă‚¤ăłă®ă‚µă–スクăŞă—ă‚·ă§ăłă®ćś‰ĺŠąćśźé™ăŚĺ‡ă‚Śăľă—ăź" LICENSING_DOMAIN_BANNED: "ă“ă®ă‰ăˇă‚¤ăłă®ă‚µă–スクăŞă—ă‚·ă§ăłăŚç„ˇĺŠąĺŚ–ă•れăľă—ăź" DEMO_SEND_MESSAGE_ERROR: "セキăĄăŞă†ă‚Łä¸Šă®ç†ç”±ă‹ă‚‰ă€ă‚˘ă‚«ă‚¦ăłăăŻă€ĺ¤–é¨ă®é›»ĺ­ăˇăĽă«ă‚˘ă‰ă¬ă‚ąă«ăˇăă‚»ăĽă‚¸ă‚’é€äżˇă™ă‚‹ă“ă¨ă‚’許可ă•れă¦ă„ăľă›ă‚“ďĽ" DEMO_ACCOUNT_ERROR: "セキăĄăŞă†ă‚Łä¸Šă®ç†ç”±ă‹ă‚‰ă€ă‚˘ă‚«ă‚¦ăłăă«ăŻă€ă“ă®ă‚˘ă‚Żă‚·ă§ăłăŚč¨±ĺŹŻă•れă¦ă„ăľă›ă‚“ďĽ" ACCOUNT_ALREADY_EXISTS: "アカウăłăăŚă™ă§ă«ĺ­ĺś¨ă—ăľă™" ACCOUNT_DOES_NOT_EXIST: "アカウăłăăŻĺ­ĺś¨ă—ăľă›ă‚“" MAIL_SERVER_ERROR: "ăˇăĽă«ă‚µăĽăăĽă¸ă®ă‚˘ă‚Żă‚»ă‚ąä¸­ă«ă‚¨ă©ăĽăŚç™şç”źă—ăľă—ăź" INVALID_INPUT_ARGUMENT: "無効ăŞĺ…ĄĺŠ›ĺĽ•ć•°" UNKNOWN_ERROR: "不ćŽăŞă‚¨ă©ăĽ" STATIC: BACK_LINK: "ć›´ć–°" DOMAIN_LIST_DESC: "ă‰ăˇă‚¤ăłă®ä¸€č¦§ăŻă€Web ăˇăĽă«ă®ă‚˘ă‚Żă‚»ă‚ąă‚’許可ă•れă¦ă„ăľă™ă€‚" PHP_EXSTENSIONS_ERROR_DESC: "ĺż…č¦ăŞ PHP 拡張ă˘ă‚¸ăĄăĽă«ăŚă€ćś‰ĺŠąă«ăŞăŁă¦ă„ăľă›ă‚“。" PHP_VERSION_ERROR_DESC: "PHP ăăĽă‚¸ă§ăł (%VERSION%) ăŚă€ 最低ăăĽă‚¸ă§ăłă® 5.3.0 ă‚りも低ă„ă§ă™ďĽ" NO_SCRIPT_TITLE: "ă“ă®ă‚˘ă—ăŞă‚±ăĽă‚·ă§ăłă§ăŻ JavaScript ăŚĺż…č¦ă§ă™ă€‚" NO_SCRIPT_DESC: | ă–ă©ă‚¦ă‚¶ă§ JavaScript ăŚă€ćś‰ĺŠąă«ăŞăŁă¦ă„ăľă›ă‚“。 JavaScript を有効ă«ă—ă¦ă€ĺ†Ťĺş¦č©¦ă—ă¦ăŹă ă•ă„。 NO_COOKIE_TITLE: "ă“ă®ă‚˘ă—ăŞă‚±ăĽă‚·ă§ăłă§ăŻ Cookie ăŚĺż…č¦ă§ă™ă€‚" NO_COOKIE_DESC: | ă–ă©ă‚¦ă‚¶ă§ Cookie ăŚă€ćś‰ĺŠąă«ăŞăŁă¦ă„ăľă›ă‚“。 Cookie を有効ă«ă—ă¦ă€ĺ†Ťĺş¦č©¦ă—ă¦ăŹă ă•ă„。 BAD_BROWSER_TITLE: "ăŠä˝żă„ă®ă–ă©ă‚¦ă‚¶ăŚĺʤă„ă§ă™ă€‚" BAD_BROWSER_DESC: | アă—ăŞă‚±ăĽă‚·ă§ăłă®ă™ăąă¦ă®ć©źč˝ă‚’使用ă™ă‚‹ă«ăŻă€ ă“れらă®ă–ă©ă‚¦ă‚¶ă®1ă¤ă‚’ă€ă‚¦ăłă­ăĽă‰ă—ă¦ă‚¤ăłă‚ąăăĽă«ă—ăľă™ďĽš rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/lt_LT.yml000066400000000000000000000363701361462701300256760ustar00rootroot00000000000000lt_LT: LOGIN: LABEL_LOGIN: "Prisijungimo vardas" LABEL_PASSWORD: "SlaptaĹľodis" BUTTON_LOGIN: "Prisijungti prie valdymo skydo" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Administratoriaus valdymo skydas" TABS_LABELS: LABEL_GENERAL_NAME: "Pagrindiniai" LABEL_LOGIN_NAME: "Prisijungimo vardas" LABEL_BRANDING_NAME: "Ä®daguoti" LABEL_CONTACTS_NAME: "Kontaktai" LABEL_DOMAINS_NAME: "Domenai" LABEL_SECURITY_NAME: "Sauga" LABEL_INTEGRATION_NAME: "Integracija" LABEL_PLUGINS_NAME: "Ä®skiepiai" LABEL_PACKAGES_NAME: "Paketai" LABEL_LICENSING_NAME: "Licencijavimas" LABEL_ABOUT_NAME: "Apie" TAB_GENERAL: LEGEND_INTERFACE: "SÄ…saja" LABEL_LANGUAGE: "Kalba" LABEL_LANGUAGE_ADMIN: "Kalba (administravimo pulto)" LABEL_THEME: "Tema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Leisti kalbos keitimÄ… nustatymuose" LABEL_ALLOW_THEMES_ON_SETTINGS: "Leisti temos keitimÄ… nustatymuose" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Leisti keisti fonÄ… nustatymuose" LABEL_NEW_FOLDER_MOVE: "Naujas \"\"perkelti ÄŻ katalogÄ…\" mygtukas" LABEL_SHOW_THUMBNAILS: "Rodyti miniatiĹ«rÄ… (prisegtuko)" LABEL_ALLOW_GRAVATAR: "Leisti naudoti Gravatar'Ä…" LEGEND_MAIN: "Pagrindinis" LABEL_ATTACHMENT_SIZE_LIMIT: "PrisegtukĹł dydĹľio limitas" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Leisti papildomas paskyras" LABEL_ALLOW_IDENTITIES: "Leisti daugiau tapatybiĹł" LABEL_ALLOW_TEMPLATES: "Leisti šablonus" ALERT_WARNING: "DÄ—mesio!" HTML_ALERT_WEAK_PASSWORD: |+ Naudojate numatytÄ…jÄŻ administratoriaus slaptaĹľodÄŻ.
Dėl Jūsų saugumo prašome pakeiskite slaptažodį kitu. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Prisijungimo langas" LABEL_DEFAULT_DOMAIN: "Numatytasis Domenas" LABEL_DETERMINE_USER_DOMAIN: "Bandyti nuspėti vartotojo domeną" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Leisti kalbų keitimą prisijungimo lange" LABEL_DETERMINE_USER_LANGUAGE: "bandyti nuspėti vartotojo kalbą" TAB_BRANDING: LEGEND_BRANDING: "Prekės ženklo derinimas" LABEL_PAGE_TITLE: "Puslapio pavadinimas" LABEL_LOADING_DESCRIPTION: "Krovimosi aprašas" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Prisijungimo vardas" LABEL_LOGIN_LOGO: "Logotipas" LABEL_LOGIN_DESCRIPTION: "Aprašymas" LABEL_LOGIN_BACKGROUND: "Fonas" LABEL_LOGIN_CUSTOM_CSS: "Pritaikytas CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Rodyti \"Powered by RainLoop\" nuorodą" LEGEND_USER: "Vartotojas" LABEL_USER_LOGO: "Logotipas" LABEL_USER_LOGO_TITLE: "Logotipo pavadinimas" LABEL_USER_LOGO_MESSAGE: "Logotipas (Laiško peržiūroje)" LABEL_USER_CUSTOM_CSS: "Pritaikytas CSS" LEGEND_WELCOME_PAGE: "Prisistatymo puslapis" LABEL_WELCOME_PAGE_TITLE: "Pavadinimas" LABEL_WELCOME_PAGE_URL: "Nuoroda" LABEL_WELCOME_PAGE_DISPLAY: "Rodyti" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nieko" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Kartą" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Visada" HTML_ALERT_PREMIUM: "Ši funkcija leidžiama tik Premium vartotojams." TAB_CONTACTS: LEGEND_CONTACTS: "Kontaktai" LEGEND_STORAGE: "Saugykla (PDO)" LABEL_ENABLE_CONTACTS: "Įjungti kontaktus" LABEL_ALLOW_SYNC: "Leisti kontaktų sinchronizavimą (su išoriniu CardDAV serveriu)" LABEL_STORAGE_TYPE: "Tipas" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Vartotojas" LABEL_STORAGE_PASSWORD: "Slaptažodis" BUTTON_TEST: "Bandymas" ALERT_NOTICE: "Pastaba!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nenaudokite šio duomenų bazės tipo, jei turite daug aktyvių vartotojų" HTML_ALERT_DOES_NOT_SUPPORTED: | Jūsų sistema nepalaiko kontaktų sąrašo. Reikia įdiegti ar įjungti PDO (SĄLite / MySQL / PostgreSQL) plėtinius jūsų serveryje. TAB_DOMAINS: LEGEND_DOMAINS: "Domenai" BUTTON_ADD_DOMAIN: "Pridėti Domeną" BUTTON_ADD_ALIAS: "Pridėti Alias" DELETE_ARE_YOU_SURE: "Ar jūs įsitikinę?" HTML_DOMAINS_HELPER: | Leidžiamų Domenų sąrašas
Spauskite ant pavadinimo norėdami redaguoti. TAB_SECURITY: LEGEND_SECURITY: "Sauga" LABEL_ALLOW_TWO_STEP: "Leisti 2-jų žingsnių patikrinimą" LABEL_FORCE_TWO_STEP: "Priverstinai naudoti 2-jų žingsnių patikrinimą" LABEL_USE_IMAGE_PROXY: "naudoti vietinį šliuzą (proxy) išoriniams paveikslėliams" LABEL_ALLOW_OPEN_PGP: "Leisti OpenPGP" LABEL_SHOW_PHP_INFO: "Rodyti PHP informaciją" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Valdymo skydo prieigos rekvizitai" LABEL_CURRENT_PASSWORD: "Dabartinis slaptažodis" LABEL_NEW_LOGIN: "Naujas prisijungimo vardas" LABEL_NEW_PASSWORD: "Naujas slaptažodis" LABEL_REPEAT_PASSWORD: "Pakartokite" BUTTON_UPDATE_PASSWORD: "Atnaujinti slaptažodį" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Reikalauti SSL sertifikato (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Leisti pačių sukurtus sertifikatus" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Įjungti Google integraciją" LABEL_GOOGLE_AUTH: "Authorization" LABEL_GOOGLE_DRIVE: "Google Drive Integracija (Laiško kūrimo rodinys)" LABEL_GOOGLE_PREVIEW: "Google peržiūros įrankių integracija (Galimybė peržiūrėti Microsoft Word, Excel ir Powerpoint failus)" LABEL_GOOGLE_CLIENT_ID: "Kliento ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Api Key" HINT_GOOGLE_API_KEY: "Reikia dėl Google Drive Failų parinkimo" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Įjungt Facebook Integraciją (Autorizavimui)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "jungt Twitter Integraciją (Autorizavimui)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Įjungti Dropbox Integraciją" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "Detalią Informaciją apie socialinių tinklų integraciją rasite čia" TAB_PLUGINS: LEGEND_PLUGINS: "Įskiepiai" LABEL_ENABLE_PLUGINS: "leisti įskiepius" ALERT_NO_PLUGINS: "Nėra įdiegtų įskiepių." LINK_INSTALL_NEW: "Spauskite čia norėdami įdiegti!" HINT_CLICK_NAME: "Spauskite ant vardo norėdami redaguoti įskiepį." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Yra galimybė atnaujinti" LEGEND_AVAILABLE_FOR_INSTALLATION: "Galima diegti" LEGEND_INSTALLED_PACKAGES: "Įdiegti paketai" ALERT_CANNOT_ACCESS_REPOSITORY: "Šiuo momentu negaliu prisijungti prie saugyklos." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Jūsų domenas" LABEL_VERSION: "Versija" LABEL_CHECKING: "Tikrinu" TYPE_BASIC_HINT: "Šis domenas nelicencijuotas komerciniam naudojimui (su papildomomis galimybėmis)" TYPE_BASIC_HINT_2: "Šis domenas negali būti licencijuotas." HTML_ALERT_TOP_1: "RainLoop Webmail licencijuotas" HTML_ALERT_TOP_2: "Jūs galite nemokamai naudoti savo asmeniniams projektams." HTML_ALERT_TOP_3: | Komerciniam RainLoop Webmail naudojimui (su papildomomis galimybėmis) turite įsigyti prenumeratą. TYPE_PREMIUM_LIFETIME: "Visam laikui" LABEL_SUB_EXPIRES: "Prenumerata baigiasi" BUTTON_ACTIVATE: "Aktyvuoti prenumeratos raktą šiam domenui" BUTTON_PURCHASE: "Pirkti" BUTTON_TRIAL: "Bandomasis" TAB_ABOUT: LEGEND_ABOUT: "Apie" LABEL_TAG_HINT: "Paprastas, modernus ir greitas web pašto klientas" LABEL_ALL_RIGHTS_RESERVED: "Visos teisės saugomos." HINT_READ_CHANGE_LOG: "Prašom perskaityti pasikeitimų eigą prieš atnaujinant." HINT_IS_UP_TO_DATE: "RainLoop naujausios laidos." HTML_NEW_VERSION: "Nauja %VERSION% versija jau prieinama." LABEL_UPDATING: "Atnaujinama" LABEL_CHECKING: "Ieškau atnaujinimų" BUTTON_UPDATE: "Atnaujinti" BUTTON_DOWNLOAD: "Atsisiųsti" BUTTON_CHANGELOG: "Pakeitimų žurnalas" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Aktyvuoti prenumeratos raktą?" TITLE_ACTIVATION: "Aktyvavimas..." LABEL_DOMAIN: "Domenas" LABEL_SUB_KEY: "Prenumeratos raktas" BUTTON_ACTIVATE: "Aktyvuoti" LABEL_ACTIVATED: "Aktyvuota" ERROR_INVALID_SUBS_KEY: "Neteisingas prenumeratos raktas" SUBS_KEY_ACTIVATED: "Prenumeratos raktas sėkmingai aktyvuotas" HTML_DESC: | Aktyvavus premium prenumeratą, papildomos galimybės domenui %DOMAIN% bus įjungtos.
Įsidėmėkite, kad prenumeratos raktas gali būti aktyvuotas tik vienam domenui.

Pradėjus aktyvavimo procesą jis nebegalės būti atšauktas. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Pridėti Alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domenas" BUTTON_CLOSE: "Uždaryti" BUTTON_ADD: "Pridėti" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Pridėti Domeną" TITLE_ADD_DOMAIN_WITH_NAME: "Pridėti Domeną \"%NAME%\"" TITLE_EDIT_DOMAIN: "Redaguoti Domeną \"%NAME%\"" LABEL_NAME: "Pavadinimas" NAME_HELPER: "wildcard palaikymas" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Serveris" LABEL_PORT: "Prievadas" LABEL_SECURE: "Sauga" LABEL_WHITE_LIST: "Baltas Sąrašas" SECURE_OPTION_NONE: "Nėra" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Leisti sieve programavimą" LABEL_ALLOW_USER_SCRIPT: "Leisti vartotojo programavimą" LABEL_USE_SHORT_LOGIN: "Naudoti trumpą prisijungimo vardą" LABEL_USE_AUTH: "Naudoti autentifikavimą " LABEL_USE_PHP_MAIL: "Naudoti php mail() funkciją" BUTTON_TEST: "Bandyti" BUTTON_WHITE_LIST: "Baltas sąrašas" BUTTON_SIEVE_CONFIGURATION: "Sieve konfiguracija" BUTTON_BACK_TO_IMAP: "Atgal į IMAP nustatymus" BUTTON_BACK: "Atgal" BUTTON_CLOSE: "Uždaryti" BUTTON_ADD: "Pridėti" BUTTON_UPDATE: "Atnaujinti" NEW_DOMAIN_DESC: "Šie nustatymai leis jums dirbti
su %NAME% domeno pašto adresais." WHITE_LIST_ALERT: | Domeno vartotojų sąrašas, kuriems leista naudotis web paštu. Naudokite tarpo simbolį kaip skyriklį. POPUPS_PLUGIN: TITLE_PLUGIN: "Įskiepis" DESC_NOTHING_TO_CONFIGURE: "Nėra ką konfiguruoti" BUTTON_CLOSE: "Uždaryti" BUTTON_SAVE: "Saugoti" TOOLTIP_ABOUT_TITLE: "Apie" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Ar tikrai norite uždaryti šį langą?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Pasirinkite kalbą" HINTS: BETA: "beta" UNSTABLE: "nestabilus" WARNING: "Dėmesio!" NOT_SUPPORTED: "Nepalaikoma" REQUIRES_PHP_54: "būtina PHP 5.4 ar aukštesnė versija" ERRORS: DOMAIN_ALREADY_EXISTS: "Toks domenas jau yra" UNKNOWN_ERROR: "Nežinoma klaida" NOTIFICATIONS: INVALID_TOKEN: "Neteisingas raktas" AUTH_ERROR: "Autorizacija nepavyko" ACCESS_ERROR: "Prieigos klaida" CONNECTION_ERROR: "Nepavyskta prisijungti prie serverio" CAPTCHA_ERROR: "Neteisingas CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Šis socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant elektroninio pašto rekvizitus ir įjunkite šią funkciją paskyros nustatymuose. DOMAIN_NOT_ALLOWED: "Šis subdomenas neleidžiamas" ACCOUNT_NOT_ALLOWED: "Paskyra neleidžiama" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Būtinas dviejų veiksnių patikrinimas" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Dviejų veiksnių patikrinimo klaida" COULD_NOT_SAVE_NEW_PASSWORD: "Negaliu išsaugoti slaptažodžio" CURRENT_PASSWORD_INCORRECT: "Dabartinis slaptažodis neteisingas" NEW_PASSWORD_SHORT: "Slaptažodis per trumpas" NEW_PASSWORD_WEAK: "Slaptažodis per lengvas" NEW_PASSWORD_FORBIDDENT: "Slaptažodyte bandote naudoti neleistinus simbolius" CONTACTS_SYNC_ERROR: "Kontaktų sinchronizavimo klaida" CANT_GET_MESSAGE_LIST: "Nepavyksta gauti laiškų sąrašo" CANT_GET_MESSAGE: "Nepavyksta gauti laiško" CANT_DELETE_MESSAGE: "Nepavyko pašalinti laiško" CANT_MOVE_MESSAGE: "Nepavyko perkelti laiško" CANT_SAVE_MESSAGE: "Nepavyko išsaugoti laiško" CANT_SEND_MESSAGE: "Nepavyko išsiųsti laiško" INVALID_RECIPIENTS: "Netinkamas gavėjas" CANT_SAVE_FILTERS: "Nepavyko išsaugoti filtrų" CANT_GET_FILTERS: "Nepavyko gauti filtrų" FILTERS_ARE_NOT_CORRECT: "Filtrai neteisingi" CANT_CREATE_FOLDER: "Nepavyksta sukurti katalogo" CANT_RENAME_FOLDER: "Nepavyksta pervadinti katalogo" CANT_DELETE_FOLDER: "Nepavyksta pašalinti katalogo" CANT_DELETE_NON_EMPTY_FOLDER: "Negalima pašalinti ne tuščio katalogo" CANT_SUBSCRIBE_FOLDER: "Nepavyskta užprenumeruoti katalogo" CANT_UNSUBSCRIBE_FOLDER: "Nepavyksta nutraukti katalogo prenumeratos" CANT_SAVE_SETTINGS: "Nepavyksta išsaugoti nustatymų" CANT_SAVE_PLUGIN_SETTINGS: "Nepavyksta išsaugoti nustatymų" DOMAIN_ALREADY_EXISTS: "Toks domenas jau yra" CANT_INSTALL_PACKAGE: "Nepavyksta įdiegti paketo" CANT_DELETE_PACKAGE: "Nepavyksta pašalinti paketo" INVALID_PLUGIN_PACKAGE: "Netinkamas įskiepio paketas" UNSUPPORTED_PLUGIN_PACKAGE: "Nepalaikomas įskiepio paketas" LICENSING_SERVER_IS_UNAVAILABLE: "Prenumeratos serveris nepasiekimas" LICENSING_DOMAIN_EXPIRED: "Šio subdomeno prenumeratos laikas baigėsi." LICENSING_DOMAIN_BANNED: "Šio subdomeno prenumerata uždrausta." DEMO_SEND_MESSAGE_ERROR: "Saugumo sumetimais, ši demo paskyra neleidžia siųsti laiškų išoriniais e-pašto adresais!" DEMO_ACCOUNT_ERROR: "Saugumo sumetimais, su šia paskyra negalima atlikti norimo veiksmo!" ACCOUNT_ALREADY_EXISTS: "Paskyra jau egzistuoja" ACCOUNT_DOES_NOT_EXIST: "Nėra tokios paskyros" MAIL_SERVER_ERROR: "Klaida bandant pasiekti pašto serverį" INVALID_INPUT_ARGUMENT: "Neteisingas įvesties argumentas" UNKNOWN_ERROR: "Nežinoma klaida" STATIC: BACK_LINK: "Perkrauti" DOMAIN_LIST_DESC: "Leidžiamų naudoti subdomenų sąrašas." PHP_EXSTENSIONS_ERROR_DESC: "Trūksta būtinų PHP plėtinių!" PHP_VERSION_ERROR_DESC: "Jūsų PHP versija (%VERSION%) žemesnė, nei reikalaujama 5.3.0!" NO_SCRIPT_TITLE: "Šiai aplikacijai reikalinga JavaScript." NO_SCRIPT_DESC: | JavaScript nepalaikoma Jūsų naršyklėje. Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. NO_COOKIE_TITLE: "Slapukų palaikymas būtinas šiai aplikacijai." NO_COOKIE_DESC: | Slapukų palaikymas negalimas jūsų naršyklėje. Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. BAD_BROWSER_TITLE: "Jūsų naršyklė pasenusi." BAD_BROWSER_DESC: | Norint naudotis visais šios aplikacijos privalumais, parsisiųskite ir įsidiekite vieną iš šių naršyklių: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml000066400000000000000000000355141361462701300256520ustar00rootroot00000000000000nb_NO: LOGIN: LABEL_LOGIN: "Brukernavn" LABEL_PASSWORD: "Passord" BUTTON_LOGIN: "Logg inn på admin-panel" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Admin-panel" TABS_LABELS: LABEL_GENERAL_NAME: "Generelt" LABEL_LOGIN_NAME: "Brukernavn" LABEL_BRANDING_NAME: "Utforming" LABEL_CONTACTS_NAME: "Kontakter" LABEL_DOMAINS_NAME: "Domener" LABEL_SECURITY_NAME: "Sikkerhet" LABEL_INTEGRATION_NAME: "Integrasjon" LABEL_PLUGINS_NAME: "Tillegg" LABEL_PACKAGES_NAME: "Pakker" LABEL_LICENSING_NAME: "Lisens" LABEL_ABOUT_NAME: "Om" TAB_GENERAL: LEGEND_INTERFACE: "Grensesnitt" LABEL_LANGUAGE: "Språk" LABEL_LANGUAGE_ADMIN: "Språk (admin)" LABEL_THEME: "Tema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "La brukere velge språk på oppsettsskjerm" LABEL_ALLOW_THEMES_ON_SETTINGS: "La brukere velge tema på oppsettsskjerm" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "La brukere velge bakgrunn på oppsettsskjerm" LABEL_NEW_FOLDER_MOVE: "Ny «flytt til mappe»-knapp" LABEL_SHOW_THUMBNAILS: "Vis miniatyrer (vedlegg)" LABEL_ALLOW_GRAVATAR: "Tillat Gravatar" LEGEND_MAIN: "Hoved" LABEL_ATTACHMENT_SIZE_LIMIT: "Maksimal størrelse på vedlegg" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillat bruk av flere kontoer" LABEL_ALLOW_IDENTITIES: "Tillat bruk av flere identiteter" LABEL_ALLOW_TEMPLATES: "Tillat bruk av maler" ALERT_DATA_ACCESS: "RainLoop-datamappa di er offentlig tiljgengelig. Sett opp webtjeneren slik at den ikke viser datamappa. Les mer her:" ALERT_WARNING: "Advarsel!" HTML_ALERT_WEAK_PASSWORD: | Du bruker forvalgt admin-passord.
Av sikkerhetshensyn bør du endre passordet umiddelbart. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Innloggingsskjerm" LABEL_DEFAULT_DOMAIN: "Standard-domene" LABEL_DETERMINE_USER_DOMAIN: "Prøv å finne brukerens domene" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "La brukere velge språk på innloggingsskjerm" LABEL_DETERMINE_USER_LANGUAGE: "Prøv å finne brukerens språk" TAB_BRANDING: LEGEND_BRANDING: "Utforming" LABEL_PAGE_TITLE: "Sidetittel" LABEL_LOADING_DESCRIPTION: "Tekst under innlasting" LABEL_FAVICON_URL: "Favorittikon" LEGEND_LOGIN: "Innlogging" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Beskrivelse" LABEL_LOGIN_BACKGROUND: "Bakgrunn" LABEL_LOGIN_CUSTOM_CSS: "Selvvalgt CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Vis «Powered by RainLoop»-lenke" LEGEND_USER: "Bruker" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logotittel" LABEL_USER_LOGO_MESSAGE: "Logo (meldingsvisning)" LABEL_USER_CUSTOM_CSS: "Selvvalgt CSS" LEGEND_WELCOME_PAGE: "Velkomstside" LABEL_WELCOME_PAGE_TITLE: "Tittel" LABEL_WELCOME_PAGE_URL: "Nettadresse" LABEL_WELCOME_PAGE_DISPLAY: "Vis" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Én gang" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Alltid" HTML_ALERT_PREMIUM: "Denne funksjonaliteten er bare tilgjengelig for Premium-brukere." TAB_CONTACTS: LEGEND_CONTACTS: "Kontakter" LEGEND_STORAGE: "Lagring (PDO)" LABEL_ENABLE_CONTACTS: "Slå på kontakter" LABEL_ALLOW_SYNC: "Tillat synkronisering av kontakter (med ekstern CardDAV-tjener)" LABEL_STORAGE_TYPE: "Type" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Bruker" LABEL_STORAGE_PASSWORD: "Passord" BUTTON_TEST: "Test" ALERT_NOTICE: "Varsel!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ikke bruk denne databasetypen hvis dette systemet har mange brukere." HTML_ALERT_DOES_NOT_SUPPORTED: | Dette systemet støtter ikke kontakter.
Du mĂĄ installere eller slĂĄ pĂĄ utvidelsen PDO (SQLite / MySQL / PostgreSQL) pĂĄ tjeneren. TAB_DOMAINS: LEGEND_DOMAINS: "Domener" BUTTON_ADD_DOMAIN: "Legg til domene" BUTTON_ADD_ALIAS: "Legg til alias" DELETE_ARE_YOU_SURE: "Er du sikker?" HTML_DOMAINS_HELPER: | Liste over domener som programmet kan fĂĄ tilgang til.
Trykk på et navn for å sette opp domenet. TAB_SECURITY: LEGEND_SECURITY: "Sikkerhet" LABEL_ALLOW_TWO_STEP: "Tillat tostegsbekreftelse" LABEL_FORCE_TWO_STEP: "Krev tostegsbekreftelse" LABEL_USE_IMAGE_PROXY: "Bruk lokal mellomtjener for eksterne bilder" LABEL_ALLOW_OPEN_PGP: "Tillat OpenPGP" LABEL_SHOW_PHP_INFO: "Vis PHP-informasjon" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Akkreditiver for admin-panel" LABEL_CURRENT_PASSWORD: "Gjeldende passord" LABEL_NEW_LOGIN: "Nytt brukernavn" LABEL_NEW_PASSWORD: "Nytt passord" LABEL_REPEAT_PASSWORD: "Gjenta" BUTTON_UPDATE_PASSWORD: "Oppdater passord" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Krev bekreftelse av SSL-sertifikat (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Tillat selvutstedt sertifikat" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Integrer med Google" LABEL_GOOGLE_AUTH: "Autentisering" LABEL_GOOGLE_DRIVE: "Google Drive-integrasjon (skrivevisning)" LABEL_GOOGLE_PREVIEW: "Google Viewer-integrasjon (forhåndsvisning av Microsoft Word-, Excel- og PowerPoint-filer)" LABEL_GOOGLE_CLIENT_ID: "Klient-ID" LABEL_GOOGLE_CLIENT_SECRET: "Klientnøkkel" LABEL_GOOGLE_API_KEY: "API-nøkkel" HINT_GOOGLE_API_KEY: "Kreves av Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Integrer med Facebook (autentisering)" LABEL_FACEBOOK_APP_ID: "Program-ID" LABEL_FACEBOOK_APP_SECRET: "Programnøkkel" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Integrer med Twitter (autentisering)" LABEL_TWITTER_CONSUMER_KEY: "Brukernummer" LABEL_TWITTER_CONSUMER_SECRET: "Brukernøkkel" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Integrer med Dropbox" LABEL_DROPBOX_API_KEY: "API-nøkkel" TOP_ALERT: "Detaljert informasjon om integrering med sosiale medier finnes på" TAB_PLUGINS: LEGEND_PLUGINS: "Tillegg" LABEL_ENABLE_PLUGINS: "Slå på tillegg" ALERT_NO_PLUGINS: "Ingen tillegg er installert." LINK_INSTALL_NEW: "Trykk her for å installere." HINT_CLICK_NAME: "Trykk på et programtillegg-navn for å sette det opp." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Tilgjengelig for oppdatering" LEGEND_AVAILABLE_FOR_INSTALLATION: "Tilgjengelig for installasjon" LEGEND_INSTALLED_PACKAGES: "Installerte pakker" ALERT_CANNOT_ACCESS_REPOSITORY: "Fikk ikke tilgang til pakkelageret." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Domenenavn" LABEL_VERSION: "Versjon" LABEL_CHECKING: "Sjekker" TYPE_BASIC_HINT: "Dette domenet har ikke lisens for kommersiell bruk (med ekstrafunksjoner)." TYPE_BASIC_HINT_2: "Dette domenet kan ikke brukes med lisens for ekstrafunksjoner." HTML_ALERT_TOP_1: "RainLoop Webmail er utgitt på betingelsene i" HTML_ALERT_TOP_2: "Du står fritt til å bruke programmet til personlige formål." HTML_ALERT_TOP_3: | Hvis du vil bruke RainLoop Webmail kommersielt (med ekstrafunksjoner), må du kjøpe et abonnement. TYPE_PREMIUM_LIFETIME: "Livstid" LABEL_SUB_EXPIRES: "Abonnement utgår" BUTTON_ACTIVATE: "Ta i bruk abonnementsnøkkel for dette domenet" BUTTON_PURCHASE: "Kjøp" BUTTON_TRIAL: "Prøv" TAB_ABOUT: LEGEND_ABOUT: "Om" LABEL_TAG_HINT: "Rask, enkel, moderne og web-basert e-postklient" LABEL_ALL_RIGHTS_RESERVED: "All Rights Reserved." HINT_READ_CHANGE_LOG: "Les endringslogg før du oppdaterer." HINT_IS_UP_TO_DATE: "RainLoop er oppdatert." HTML_NEW_VERSION: "Versjon %VERSION% er nå tilgjengelig." LABEL_UPDATING: "Oppdaterer" LABEL_CHECKING: "Ser etter oppdateringer" BUTTON_UPDATE: "Oppdater" BUTTON_DOWNLOAD: "Last ned" BUTTON_CHANGELOG: "Endringslogg" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Vil du ta abonnementsnøkkelen i bruk?" TITLE_ACTIVATION: "Aktivering …" LABEL_DOMAIN: "Domene" LABEL_SUB_KEY: "Abonnementsnøkkel" BUTTON_ACTIVATE: "Bruk" LABEL_ACTIVATED: "I bruk" ERROR_INVALID_SUBS_KEY: "Ugyldig abonnementsnøkkel" SUBS_KEY_ACTIVATED: "Abonnementsnøkkelen er nå i bruk" HTML_DESC: | Premium-abonnement for %DOMAIN% fonyes.
Nøkkelen kan bare tas i bruk for ett domene.

Du kan ikke angre på å ta en nøkkel i bruk. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Legg til alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domene" BUTTON_CLOSE: "Lukk" BUTTON_ADD: "Legg til" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Legg til domene" TITLE_ADD_DOMAIN_WITH_NAME: "Legg til «%NAME%»" TITLE_EDIT_DOMAIN: "Rediger «%NAME%»" LABEL_NAME: "Navn" NAME_HELPER: "jokertegn støttes" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Tjener" LABEL_PORT: "Port" LABEL_SECURE: "Sikker" LABEL_WHITE_LIST: "Hvitliste" SECURE_OPTION_NONE: "None" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Tillat sieve-skript" LABEL_ALLOW_USER_SCRIPT: "Tillat selvvalgt brukerskript" LABEL_USE_SHORT_LOGIN: "Bruk forkortet brukernavn" LABEL_USE_AUTH: "Bruk autentisering" LABEL_USE_PHP_MAIL: "Bruk php-funksjonen «mail()»" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Hvitliste" BUTTON_SIEVE_CONFIGURATION: "Sieve-oppsett" BUTTON_BACK_TO_IMAP: "Tilbake til IMAP-innstillinger" BUTTON_BACK: "Tilbake" BUTTON_CLOSE: "Lukk" BUTTON_ADD: "Legg til" BUTTON_UPDATE: "Oppdater" NEW_DOMAIN_DESC: "Dette domeneoppsettet lar deg jobbe
med e-postadresser ved %NAME%." WHITE_LIST_ALERT: | Liste over domenebrukere som programmet skal ha tilgang til. Hold verdier adskilt med mellomrom. POPUPS_PLUGIN: TITLE_PLUGIN: "Tillegg" DESC_NOTHING_TO_CONFIGURE: "Ingenting å sette opp" BUTTON_CLOSE: "Lukk" BUTTON_SAVE: "Lagre" TOOLTIP_ABOUT_TITLE: "Om" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Er du sikker på at du vil lukke dette vinduet?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Velg språk" HINTS: BETA: "beta" UNSTABLE: "ustabil" WARNING: "Advarsel!" NOT_SUPPORTED: "støttes ikke" REQUIRES_PHP_54: "krever PHP versjon 5.4 eller nyere" ERRORS: DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" UNKNOWN_ERROR: "Ukjent feil" NOTIFICATIONS: INVALID_TOKEN: "Ugyldig symbol" AUTH_ERROR: "Autentisering mislyktes" ACCESS_ERROR: "Tilgangsfeil" CONNECTION_ERROR: "Klarte ikke å koble til tjener" CAPTCHA_ERROR: "Feil CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Denne sosiale ID-en er ikke knyttet til en e-postkonto enda. Logg inn med e-post-akkreditiver og slå på denne funksjonen i kontooppsettet. DOMAIN_NOT_ALLOWED: "Domenet tillates ikke" ACCOUNT_NOT_ALLOWED: "Kontoen tillates ikke" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "To-stegsbekreftelse kreves" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Feil under to-stegsbekreftelse" COULD_NOT_SAVE_NEW_PASSWORD: "Klarte ikke å lagre nytt passord" CURRENT_PASSWORD_INCORRECT: "Gjeldende passord er feil" NEW_PASSWORD_SHORT: "Passordet er for kort" NEW_PASSWORD_WEAK: "Passordet er for enkelt" NEW_PASSWORD_FORBIDDENT: "Passordet inneholder forbudte tegn" CONTACTS_SYNC_ERROR: "Feil under synkronisering av kontakter" CANT_GET_MESSAGE_LIST: "Klarte ikke å hente meldingsliste" CANT_GET_MESSAGE: "Klarte ikke å hente melding" CANT_DELETE_MESSAGE: "Klarte ikke å slette melding" CANT_MOVE_MESSAGE: "Klarte ikke å flytte melding" CANT_SAVE_MESSAGE: "Klarte ikke å lagre melding" CANT_SEND_MESSAGE: "Klarte ikke å sende melding" INVALID_RECIPIENTS: "Ugyldige mottakere" CANT_SAVE_FILTERS: "Klarte ikke å lagre filtre" CANT_GET_FILTERS: "Klarte ikke å hente filtre" FILTERS_ARE_NOT_CORRECT: "Ugyldige filtre" CANT_CREATE_FOLDER: "Klarte ikke å lage mappe" CANT_RENAME_FOLDER: "Klarte ikke å gi nytt navn til mappe" CANT_DELETE_FOLDER: "Klarte ikke å slette mappe" CANT_DELETE_NON_EMPTY_FOLDER: "Mappa er ikke tom, og kan derfor ikke slettes" CANT_SUBSCRIBE_FOLDER: "Klarte ikke å abonnere på mappe" CANT_UNSUBSCRIBE_FOLDER: "Klarte ikke å avslutte abonnement på mappe" CANT_SAVE_SETTINGS: "Klarte ikke å lagre innstillinger" CANT_SAVE_PLUGIN_SETTINGS: "Klarte ikke å lagre innstillinger" DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" CANT_INSTALL_PACKAGE: "Klarte ikke å installere pakke" CANT_DELETE_PACKAGE: "Klarte ikke å fjerne pakke" INVALID_PLUGIN_PACKAGE: "Ugyldig tilleggspakke" UNSUPPORTED_PLUGIN_PACKAGE: "Tilleggspakke støttes ikke" LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementstjener er utilgjengelig" LICENSING_DOMAIN_EXPIRED: "Abonnementet for dette domenet er utgått." LICENSING_DOMAIN_BANNED: "Abonnementet for dette domenet er blokkert." DEMO_SEND_MESSAGE_ERROR: "Av sikkerhetshensyn er denne demo-kontoen blokkert fra å sende meldinger til eksterne e-postadresser." DEMO_ACCOUNT_ERROR: "Av sikkerhetshensyn er denne demo-kontoen blokkert fra å utføre denne handlinga" ACCOUNT_ALREADY_EXISTS: "Kontoen finnes allerede" ACCOUNT_DOES_NOT_EXIST: "Kontoen finnes ikke" MAIL_SERVER_ERROR: "Det oppstod en feil under tilkobling til e-posttjener" INVALID_INPUT_ARGUMENT: "Ugyldig inndata-argument" UNKNOWN_ERROR: "Ukjent feil" STATIC: BACK_LINK: "Last inn på nytt" DOMAIN_LIST_DESC: "Liste over domener som programmet skal ha tilgang til." PHP_EXSTENSIONS_ERROR_DESC: "PHP-oppsettet ditt mangler en påkrevet utvidelse." PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" NO_SCRIPT_TITLE: "Dette programmet krever Javascript." NO_SCRIPT_DESC: | Nettleseren din støtter ikke Javascript. Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." NO_COOKIE_DESC: | Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. BAD_BROWSER_TITLE: "Nettleseren din er utdatert." BAD_BROWSER_DESC: | Hvis du vil bruke alle funksjonene i programmet, må du laste ned og installere en av disse nettleserne: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/nl_NL.yml000066400000000000000000000361371361462701300256630ustar00rootroot00000000000000nl_NL: LOGIN: LABEL_LOGIN: "Inlognaam" LABEL_PASSWORD: "Wachtwoord" BUTTON_LOGIN: "Aanmelden in het beheer paneel" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Beheer paneel" TABS_LABELS: LABEL_GENERAL_NAME: "Algemeen" LABEL_LOGIN_NAME: "Inlognaam" LABEL_BRANDING_NAME: "Huisstijl" LABEL_CONTACTS_NAME: "Contactpersonen" LABEL_DOMAINS_NAME: "Domeinen" LABEL_SECURITY_NAME: "Beveiliging" LABEL_INTEGRATION_NAME: "Integratie" LABEL_PLUGINS_NAME: "Invoegtoepassingen" LABEL_PACKAGES_NAME: "Paketten" LABEL_LICENSING_NAME: "Licentieovereenkomst" LABEL_ABOUT_NAME: "Over" TAB_GENERAL: LEGEND_INTERFACE: "Interface" LABEL_LANGUAGE: "Taal" LABEL_LANGUAGE_ADMIN: "Taal (admin)" LABEL_THEME: "Thema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Sta taalselectie toe in het instellingen scherm" LABEL_ALLOW_THEMES_ON_SETTINGS: "Sta thema selectie toe in het instellingen scherm" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Sta achtergrond selectie toe in het instellingen scherm" LABEL_NEW_FOLDER_MOVE: "Nieuwe \"verplaats naar map\" knop" LABEL_SHOW_THUMBNAILS: "Toon miniaturen (bijlage)" LABEL_ALLOW_GRAVATAR: "Toon Gravatar" LEGEND_MAIN: "Diverse" LABEL_ATTACHMENT_SIZE_LIMIT: "Maximale bijlage grootte" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Sta extra accounts toe" LABEL_ALLOW_IDENTITIES: "Meerdere identiteiten toestaan" LABEL_ALLOW_TEMPLATES: "Sta templates toe" ALERT_WARNING: "Waarschuwing!" HTML_ALERT_WEAK_PASSWORD: | U gebruikt het standaard beheer wachtwoord.
Wijzig a.u.b. voor uw veiligheid direct het wachtwoord. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Inlogscherm" LABEL_DEFAULT_DOMAIN: "Standaard domein" LABEL_DETERMINE_USER_DOMAIN: "Probeer gebruikersdomein te bepalen" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Sta taal selectie toe in het login scherm" LABEL_DETERMINE_USER_LANGUAGE: "Probeer gebruiker taal te bepalen" TAB_BRANDING: LEGEND_BRANDING: "Huisstijl" LABEL_PAGE_TITLE: "Pagina titel" LABEL_LOADING_DESCRIPTION: "Beschrijving tijdens laden" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Login scherm" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Beschrijving" LABEL_LOGIN_BACKGROUND: "Achtergrond" LABEL_LOGIN_CUSTOM_CSS: "Aangepaste CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Toon \"Powered by RainLoop\" link" LEGEND_USER: "Gebruiker" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logo titel" LABEL_USER_LOGO_MESSAGE: "Logo (berichtweergave)" LABEL_USER_CUSTOM_CSS: "Aangepaste CSS" LEGEND_WELCOME_PAGE: "Welkom pagina" LABEL_WELCOME_PAGE_TITLE: "Titel" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Weergave" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nooit" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Eenmalig" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Altijd" HTML_ALERT_PREMIUM: "Deze functionaliteit is alleen beschikbaar voor Premium abonnees.\n" TAB_CONTACTS: LEGEND_CONTACTS: "Contactpersonen" LEGEND_STORAGE: "Opslag (PDO)" LABEL_ENABLE_CONTACTS: "Contactpersonen inschakelen" LABEL_ALLOW_SYNC: "Contactpersoon synchronisatie (met externe CardDAV server) inschakelen" LABEL_STORAGE_TYPE: "Soort" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Gebruikersnaam" LABEL_STORAGE_PASSWORD: "Wachtwoord" BUTTON_TEST: "Test" ALERT_NOTICE: "Aandacht!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Gegruik deze database soort niet met een groot aantal actieve gebrukers." HTML_ALERT_DOES_NOT_SUPPORTED: | Uw systeem ondersteund geen contactpersonen.
U moet een PDO (SQLite / MySQL / PostgreSQL) extentie op uw server installeren of activeren. TAB_DOMAINS: LEGEND_DOMAINS: "Domeinen" BUTTON_ADD_DOMAIN: "Domein toevoegen" BUTTON_ADD_ALIAS: "Voeg alias toe" DELETE_ARE_YOU_SURE: "Weet u het zeker?" HTML_DOMAINS_HELPER: | Lijst van toegestane domeinen.
Klik op de domeinnaam om deze te configureren. TAB_SECURITY: LEGEND_SECURITY: "Beveiliging" LABEL_ALLOW_TWO_STEP: "2-Stap verificatie toestaan" LABEL_FORCE_TWO_STEP: "2-Stap verificatie afdwingen" LABEL_USE_IMAGE_PROXY: "Gebruik de server als proxy voor externe afbeeldingen" LABEL_ALLOW_OPEN_PGP: "OpenPGP toestaan" LABEL_SHOW_PHP_INFO: "PHP informatie tonen" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Toegangsgegevens beheer paneel" LABEL_CURRENT_PASSWORD: "Huidig wachtwoord" LABEL_NEW_LOGIN: "Nieuwe gebruikersnaam" LABEL_NEW_PASSWORD: "Nieuw wachtwoord" LABEL_REPEAT_PASSWORD: "Herhaal nieuw wachtwoord" BUTTON_UPDATE_PASSWORD: "Gegevens bijwerken" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Verificatie van SSL certificaten (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Sta zelf ondertekende certificaten toe" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Google integratie inschakelen" LABEL_GOOGLE_AUTH: "Autorisatie" LABEL_GOOGLE_DRIVE: "Google Drive integratie (tijdens bericht opstellen)" LABEL_GOOGLE_PREVIEW: "Google Viewer integratie (Microsoft Word, Excel en PowerPoint voorbeelweergave)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Geheime sleutel" LABEL_GOOGLE_API_KEY: "API sleutel" HINT_GOOGLE_API_KEY: "Vereist voor Google Drive bestand verkenner" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Facebook integratie (autorisatie) inschakelen" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App sleutel" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Twitter integratie (autorisatie) inschakelen" LABEL_TWITTER_CONSUMER_KEY: "Consumer sleutel" LABEL_TWITTER_CONSUMER_SECRET: "Consumer geheime sleutel" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Dropbox integratie" LABEL_DROPBOX_API_KEY: "API sleutel" TOP_ALERT: "Gedetaileerde informatie over integraties is te vinden op" TAB_PLUGINS: LEGEND_PLUGINS: "Invoegtoepassingen" LABEL_ENABLE_PLUGINS: "Invoegtoepassingen inschakelen" ALERT_NO_PLUGINS: "Er zijn nog geen invoegtoepassingen geĂŻnstalleerd" LINK_INSTALL_NEW: "Klik hier om een invoegtoepassing te installeren!" HINT_CLICK_NAME: "Klik op de naam om de invoegtoepassing te configuren." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Update beschikbaar" LEGEND_AVAILABLE_FOR_INSTALLATION: "Gereed voor installatie" LEGEND_INSTALLED_PACKAGES: "GeĂŻnstalleerde pakketten" ALERT_CANNOT_ACCESS_REPOSITORY: "De installatie bron is op het moment niet beschikbaar." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Uw domein" LABEL_VERSION: "Versie" LABEL_CHECKING: "Controleren" TYPE_BASIC_HINT: "Dit domein is niet gelicentieerd voor commercieel gebruik (met aditionele functies)." TYPE_BASIC_HINT_2: "Dit domein kan niet worden gelicentieerd." HTML_ALERT_TOP_1: "RainLoop Webmail is gelicentieerd onder de" HTML_ALERT_TOP_2: "U staat u vrij om dit voor uw persoonlijk project te gebruiken." HTML_ALERT_TOP_3: | Voor commercieel gebruik (met additionele functies) van RainLoop Webmail moet u een activatie code. TYPE_PREMIUM_LIFETIME: "Levenslang" LABEL_SUB_EXPIRES: "Activatie verloopt" BUTTON_ACTIVATE: "Activeer de activatie code voor dit domein." BUTTON_PURCHASE: "Aanschaffen" BUTTON_TRIAL: "Proefperiode" TAB_ABOUT: LEGEND_ABOUT: "Over" LABEL_TAG_HINT: "Simpel, modern en snelle web-based e-mail client" LABEL_ALL_RIGHTS_RESERVED: "Alle rechten gereserveerd." HINT_READ_CHANGE_LOG: "Lees a.u.b. het veranderingen logboek alvorens te updaten." HINT_IS_UP_TO_DATE: "De laatste versie van RainLoop is geĂŻnstalleerd." HTML_NEW_VERSION: "Een nieuwe versie %VERSION% is beschikbaar." LABEL_UPDATING: "Bezig met updaten" LABEL_CHECKING: "Controleren op updates" BUTTON_UPDATE: "Bijwerken" BUTTON_DOWNLOAD: "Download" BUTTON_CHANGELOG: "Veranderingen logboek" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Activatie code activeren?" TITLE_ACTIVATION: "Activeren..." LABEL_DOMAIN: "Domein" LABEL_SUB_KEY: "Activatie code" BUTTON_ACTIVATE: "Activeer" LABEL_ACTIVATED: "Geactiveerd" ERROR_INVALID_SUBS_KEY: "Onjuiste activatie code" SUBS_KEY_ACTIVATED: "Activatie code is al succesvol geactiveerd" HTML_DESC: | Na activatie wordt het premium abonnement voor %DOMAIN% verlengd.
Let op: een activatie code kan slechts voor één domein worden gebruikt.

Het activatieproces kan niet meer worden afgebroken of geannuleerd nadat het is gestart. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Voeg alias toe" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domein" BUTTON_CLOSE: "Sluiten" BUTTON_ADD: "Toevoegen" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Voeg domein toe" TITLE_ADD_DOMAIN_WITH_NAME: "Voeg domein \"%NAME%\" toe" TITLE_EDIT_DOMAIN: "Pas domein \"%NAME%\" aan" LABEL_NAME: "Naam" NAME_HELPER: "ondersteunt joker tekens" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Poort" LABEL_SECURE: "Encryptie" LABEL_WHITE_LIST: "Witte lijst" SECURE_OPTION_NONE: "Geen" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Sta Sieve scripts toe" LABEL_ALLOW_USER_SCRIPT: "Sta gebruiker scripts toe" LABEL_USE_SHORT_LOGIN: "Gebruik verkorte login" LABEL_USE_AUTH: "Gebruik authenticatie" LABEL_USE_PHP_MAIL: "Gebruik php mail() functie" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Witte lijst" BUTTON_SIEVE_CONFIGURATION: "Sieve configuratie" BUTTON_BACK_TO_IMAP: "Terug naar IMAP instellingen" BUTTON_BACK: "Terug" BUTTON_CLOSE: "Annuleer" BUTTON_ADD: "Toevoegen" BUTTON_UPDATE: "Update" NEW_DOMAIN_DESC: "Dit domein stelt u in staat om
met %NAME% e-mail adressen te werken." WHITE_LIST_ALERT: | Lijst van gebruikers die dit domein mogen gebruiken. Gebruik een spatie als scheidingsteken. POPUPS_PLUGIN: TITLE_PLUGIN: "Invoegtoepassing" DESC_NOTHING_TO_CONFIGURE: "Niets om te configureren" BUTTON_CLOSE: "Annuleer" BUTTON_SAVE: "Opslaan" TOOLTIP_ABOUT_TITLE: "Over" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Weet u zeker dat u dit venster wilt stuiten?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Kies uw taal" HINTS: BETA: "bèta" UNSTABLE: "onstabiel" WARNING: "Waarschuwing!" NOT_SUPPORTED: "niet ondersteund" REQUIRES_PHP_54: "vereist PHP 5.4 of hoger" ERRORS: DOMAIN_ALREADY_EXISTS: "Domein bestaat al" UNKNOWN_ERROR: "Onbekende fout" NOTIFICATIONS: INVALID_TOKEN: "Onjuiste token" AUTH_ERROR: "Authenticatie mislukt" ACCESS_ERROR: "Fout bij toegang" CONNECTION_ERROR: "Verbinding met Server mislukt" CAPTCHA_ERROR: "Onjuiste CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Deze integratie ID is nog niet gekoppeld aan een e-mail adres. Log in met uw e-mail aanmeldingsgegevens en activeer deze functie in de instellingen. DOMAIN_NOT_ALLOWED: "Domein is niet toegestaan" ACCOUNT_NOT_ALLOWED: "Account is niet toegestaan" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-Stap verificatie is vereist" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-Stap verificatie fout" COULD_NOT_SAVE_NEW_PASSWORD: "Kan het nieuwe wachtwoord niet opslaan" CURRENT_PASSWORD_INCORRECT: "Huidig wachtwoord is onjuist" NEW_PASSWORD_SHORT: "Wachtwoord is te kort" NEW_PASSWORD_WEAK: "Wachtwoord is te gemakkelijk" NEW_PASSWORD_FORBIDDENT: "Wachtwoord bevat verboden karakters" CONTACTS_SYNC_ERROR: "Contactpersonen synchronisatie fout" CANT_GET_MESSAGE_LIST: "Kan berichtenlijst niet ophalen" CANT_GET_MESSAGE: "Kan bericht niet ophalen" CANT_DELETE_MESSAGE: "Kan bericht niet verwijderen" CANT_MOVE_MESSAGE: "Kan bericht niet verplaatsen" CANT_SAVE_MESSAGE: "Kan bericht niet opslaan" CANT_SEND_MESSAGE: "Kan bericht niet verzenden" INVALID_RECIPIENTS: "ongeldige ontvanger(s)" CANT_SAVE_FILTERS: "Kan filters niet opslaan" CANT_GET_FILTERS: "Kan filters niet ophalen" FILTERS_ARE_NOT_CORRECT: "Filters zijn niet correct" CANT_CREATE_FOLDER: "Kan map niet maken" CANT_RENAME_FOLDER: "Kan map geen andere naam geven" CANT_DELETE_FOLDER: "Kan map niet verwijderen" CANT_DELETE_NON_EMPTY_FOLDER: "Kan folder die niet leeg is niet verwijderen" CANT_SUBSCRIBE_FOLDER: "Kan niet abonneren op map" CANT_UNSUBSCRIBE_FOLDER: "Kan abonnement op map niet opheffen" CANT_SAVE_SETTINGS: "Kan instellingen niet opslaan" CANT_SAVE_PLUGIN_SETTINGS: "Kan instellingen niet opslaan" DOMAIN_ALREADY_EXISTS: "Domein bestaat al" CANT_INSTALL_PACKAGE: "Kan pakket niet installeren" CANT_DELETE_PACKAGE: "Kan pakket niet de-installeren" INVALID_PLUGIN_PACKAGE: "Onjuist invoegtoepassing pakket" UNSUPPORTED_PLUGIN_PACKAGE: "niet ondersteund invoegtoepassing pakket" LICENSING_SERVER_IS_UNAVAILABLE: "Activatie server is niet beschikbaar" LICENSING_DOMAIN_EXPIRED: "Activatie voor dit domein is verlopen." LICENSING_DOMAIN_BANNED: "Activatie voor dit domein niet mogelijk." DEMO_SEND_MESSAGE_ERROR: "Vanwege beveiliging is het deze account niet toegestaan om e-mail naar externe adressen te versturen!" DEMO_ACCOUNT_ERROR: "Vanwege beveiliging is het deze account niet toegestaan om deze actie uit te voeren!" ACCOUNT_ALREADY_EXISTS: "Account bestaat al" ACCOUNT_DOES_NOT_EXIST: "Account bestaat niet." MAIL_SERVER_ERROR: "Fout bij toegang tot de mail Server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Unknown error" STATIC: BACK_LINK: "Reload" DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | JavaScript support is not available in your browser. Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | Om alle functies van deze applicatie te gebruiken, download en installeer een van de volgende browsers: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml000066400000000000000000000400001361462701300256470ustar00rootroot00000000000000pl_PL: LOGIN: LABEL_LOGIN: "Login" LABEL_PASSWORD: "Hasło" BUTTON_LOGIN: "Zaloguj do panelu administracjnego" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Panel administracyjny" TABS_LABELS: LABEL_GENERAL_NAME: "Ogólne" LABEL_LOGIN_NAME: "Login" LABEL_BRANDING_NAME: "Personalizacja" LABEL_CONTACTS_NAME: "Kontakty" LABEL_DOMAINS_NAME: "Domeny" LABEL_SECURITY_NAME: "Bezpieczeństwo" LABEL_INTEGRATION_NAME: "Integracje" LABEL_PLUGINS_NAME: "Wtyczki" LABEL_PACKAGES_NAME: "Pakiety" LABEL_LICENSING_NAME: "Licencjonowanie" LABEL_ABOUT_NAME: "O programie" TAB_GENERAL: LEGEND_INTERFACE: "Interfejs" LABEL_LANGUAGE: "Język" LABEL_LANGUAGE_ADMIN: "Język (admin)" LABEL_THEME: "Motyw" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Zezwól użytkownikowi na wybór języka" LABEL_ALLOW_THEMES_ON_SETTINGS: "Zezwól użytkownikowi na zmianę motywu" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Zezwól użytkownikowi na użycie własnego tła" LABEL_NEW_FOLDER_MOVE: "Nowy przycisk „przenieś do folderu”" LABEL_SHOW_THUMBNAILS: "Pokaż miniatury (załączniki)" LABEL_ALLOW_GRAVATAR: "Zezwól na używanie gravatarów" LEGEND_MAIN: "Główne" LABEL_ATTACHMENT_SIZE_LIMIT: "Maksymalny rozmiar załącznika" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Zezwól na dodatkowe konta" LABEL_ALLOW_IDENTITIES: "Zezwól na posiadanie wielu tożsamości" LABEL_ALLOW_TEMPLATES: "Zezwól na używanie szablonów" ALERT_DATA_ACCESS: "Folder data jest osiągalny z poziomu przeglądarki WWW. Zmień konfigurację serwera www, aby ukryć ten folder z zewnątrz. Więcej informacji tutaj: " ALERT_WARNING: "Ostrzeżenie!" HTML_ALERT_WEAK_PASSWORD: | Korzystasz z domyślnego hasła administratora.
Ze względów bezpieczeństwa zmień hasło na inne. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Ekran logowania" LABEL_DEFAULT_DOMAIN: "Domyślna domena" LABEL_DETERMINE_USER_DOMAIN: "Spróbuj określić domenę użytkownika" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Zezwól na zmianę języka na ekranie logowania" LABEL_DETERMINE_USER_LANGUAGE: "Spróbuj określić język użytkownika" TAB_BRANDING: LEGEND_BRANDING: "Personalizacja" LABEL_PAGE_TITLE: "Tytuł strony" LABEL_LOADING_DESCRIPTION: "Komunikat ładowania strony" LABEL_FAVICON_URL: "Favikona" LEGEND_LOGIN: "Login" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Opis" LABEL_LOGIN_BACKGROUND: "Tło" LABEL_LOGIN_CUSTOM_CSS: "Własny arkusz styli CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaż link „Powered by RainLoop”" LEGEND_USER: "Użytkownik" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Tytuł logo" LABEL_USER_LOGO_MESSAGE: "Logo (widok wiadomości)" LABEL_USER_CUSTOM_CSS: "Własny arkusz styli CSS" LEGEND_WELCOME_PAGE: "Strona główna" LABEL_WELCOME_PAGE_TITLE: "Tytuł" LABEL_WELCOME_PAGE_URL: "Adres URL" LABEL_WELCOME_PAGE_DISPLAY: "Wyświetl" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nigdy" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Tylko raz" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Zawsze" HTML_ALERT_PREMIUM: "Ta opcja dostępna jest tylko dla subskrybentów licencji Premium." TAB_CONTACTS: LEGEND_CONTACTS: "Kontakty" LEGEND_STORAGE: "Baza danych (PDO)" LABEL_ENABLE_CONTACTS: "Włącz kontakty" LABEL_ALLOW_SYNC: "Zezwól na synchronizację kontaktów (przy użyciu zewnętrznego serwera CardDAV)" LABEL_STORAGE_TYPE: "Typ" LABEL_STORAGE_DSN: "Adres DSN" LABEL_STORAGE_USER: "Użytkownik" LABEL_STORAGE_PASSWORD: "Hasło" BUTTON_TEST: "Testuj" ALERT_NOTICE: "Powiadomienie!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nie używaj tej bazy danych z dużą ilością aktywnych użytkowników." HTML_ALERT_DOES_NOT_SUPPORTED: | Twój system nie zawiera wsparcia dla obsługi kontaktów.
Musisz zainstalować lub uruchomić na serwerze jedno z rozszerzeń PDO (SQLite / MySQL / PostgreSQL). TAB_DOMAINS: LEGEND_DOMAINS: "Domeny" BUTTON_ADD_DOMAIN: "Dodaj domenę" BUTTON_ADD_ALIAS: "Dodaj Alias" DELETE_ARE_YOU_SURE: "Czy na pewno?" HTML_DOMAINS_HELPER: | Lista domen, do których można uzyskać dostęp poprzez tego klienta.
Kliknij na nazwę, aby skonfigurować domenę. TAB_SECURITY: LEGEND_SECURITY: "Bezpieczeństwo" LABEL_ALLOW_TWO_STEP: "Zezwól na autoryzację 2-etapową" LABEL_FORCE_TWO_STEP: "Wymuś autoryzację 2-etapową" LABEL_USE_IMAGE_PROXY: "Użyj lokalnego serwera proxy dla zewnętrznych obrazów" LABEL_ALLOW_OPEN_PGP: "Zezwalaj na używanie OpenPGP" LABEL_SHOW_PHP_INFO: "Pokaż informacje o wersji PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Dane dostępowe panelu administracyjnego" LABEL_CURRENT_PASSWORD: "Bieżące hasło" LABEL_NEW_LOGIN: "Nowy login" LABEL_NEW_PASSWORD: "Nowe hasło" LABEL_REPEAT_PASSWORD: "Powtórz hasło" BUTTON_UPDATE_PASSWORD: "Zaktualizuj hasło" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Wymagaj sprawdzania poprawności certyfikatów SSL (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Zezwól na używanie certyfikatów podpisanych samodzielnie" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Włącz integrację z Google" LABEL_GOOGLE_AUTH: "Autoryzacja" LABEL_GOOGLE_DRIVE: "Obsługa dysku Google (widok tworzenia wiadomości)" LABEL_GOOGLE_PREVIEW: "Obsługa przeglądarki Google (podgląd dla plików Microsoft Word, Excel i PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "Identyfikator klienta" LABEL_GOOGLE_CLIENT_SECRET: "Hasło" LABEL_GOOGLE_API_KEY: "Klucz API" HINT_GOOGLE_API_KEY: "Wymagane dla obsługi interfejsu usługi „Dysk Google”" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Włącz integrację z Facebook (autoryzacja)" LABEL_FACEBOOK_APP_ID: "Identyfikator aplikacji" LABEL_FACEBOOK_APP_SECRET: "Hasło aplikacji" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Włącz integrację z Twitter (autoryzacja)" LABEL_TWITTER_CONSUMER_KEY: "Klucz użytkownika" LABEL_TWITTER_CONSUMER_SECRET: "Hasło użytkownika" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Włącz integrację z Dropbox" LABEL_DROPBOX_API_KEY: "Klucz API" TOP_ALERT: "Szczegółowe informacje na temat obsługi platform, można znaleźć pod adresem " TAB_PLUGINS: LEGEND_PLUGINS: "Wtyczki" LABEL_ENABLE_PLUGINS: "Włącz obsługę wtyczek" ALERT_NO_PLUGINS: "Nie zainstalowano żadnych wtyczek." LINK_INSTALL_NEW: "Kliknij tutaj, aby zainstalować nowe wtyczki!" HINT_CLICK_NAME: "Kliknij na nazwę, aby skonfigurować wtyczkę." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Dostępne do aktualizacji" LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostępne do zainstalowania" LEGEND_INSTALLED_PACKAGES: "Zainstalowane pakiety" ALERT_CANNOT_ACCESS_REPOSITORY: "Nie można uzyskać dostępu do repozytorium." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Twoja domena" LABEL_VERSION: "Wersja" LABEL_CHECKING: "Sprawdzanie..." TYPE_BASIC_HINT: "Ta domena nie jest licencjonowana do użytku komercyjnego." TYPE_BASIC_HINT_2: "Nie można dodać licencji dla tej domeny." HTML_ALERT_TOP_1: "RainLoop Webmail korzysta z licencji" HTML_ALERT_TOP_2: "Możesz używać tego klienta za darmo, tylko do celów prywatnych." HTML_ALERT_TOP_3: | Do użytku komercyjnego (z dodatkowymi opcjami) RainLoop Webmail, wymagane jest posiadanie ważnej subskrypcji. TYPE_PREMIUM_LIFETIME: "Dożywotnia" LABEL_SUB_EXPIRES: "Subskrypcja wygasa" BUTTON_ACTIVATE: "Aktywuj klucz dla tej domeny" BUTTON_PURCHASE: "Kup klucz" BUTTON_TRIAL: "Wersja testowa" TAB_ABOUT: LEGEND_ABOUT: "O programie" LABEL_TAG_HINT: "Prosty, nowoczesny i szybki klient pocztowy" LABEL_ALL_RIGHTS_RESERVED: "Wszystkie prawa zastrzeżone." HINT_READ_CHANGE_LOG: "Przed aktualizacją przeczytaj proszę listę zmian." HINT_IS_UP_TO_DATE: "RainLoop jest aktualny." HTML_NEW_VERSION: "Dostępna jest nowa wersja: %VERSION%." LABEL_UPDATING: "Aktualizacja w toku..." LABEL_CHECKING: "Szukanie aktualizacji..." BUTTON_UPDATE: "Zaktualizuj" BUTTON_DOWNLOAD: "Pobierz" BUTTON_CHANGELOG: "Lista zmian" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Czy chcesz aktywować klucz subskrypcji?" TITLE_ACTIVATION: "Aktywacja w toku..." LABEL_DOMAIN: "Domena" LABEL_SUB_KEY: "Klucz subskrypcji" BUTTON_ACTIVATE: "Aktywuj" LABEL_ACTIVATED: "Aktywowano" ERROR_INVALID_SUBS_KEY: "Niepoprawny klucz subskrypcji" SUBS_KEY_ACTIVATED: "Poprawnie aktywowano klucz subskrypcji" HTML_DESC: | Subskrypcja premium dla domeny %DOMAIN%, zostanie przedłużona po aktywacji.
Zwróć uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny.

Po uruchomieniu aktywacji, nie można jej przerwać lub anulować. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Dodaj Alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domena" BUTTON_CLOSE: "Zamknij" BUTTON_ADD: "Dodaj" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Dodawanie domeny" TITLE_ADD_DOMAIN_WITH_NAME: "Dodawanie domeny „%NAME%”" TITLE_EDIT_DOMAIN: "Edycja domeny „%NAME%”" LABEL_NAME: "Nazwa" NAME_HELPER: "obsługiwany znak wieloznaczności - *" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Serwer" LABEL_PORT: "Port" LABEL_SECURE: "Rodzaj połączenia" LABEL_WHITE_LIST: "Biała lista" SECURE_OPTION_NONE: "Bez zabezpieczeń" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Zezwól na skrypty sieve" LABEL_ALLOW_USER_SCRIPT: "Zezwól na spersonalizowany skrypt użytkownika" LABEL_USE_SHORT_LOGIN: "Użyj krótkiego loginu" LABEL_USE_AUTH: "Użyj autoryzacji" LABEL_USE_PHP_MAIL: "Użyj funkcji php 'mail()'" BUTTON_TEST: "Testuj" BUTTON_WHITE_LIST: "Biała lista" BUTTON_SIEVE_CONFIGURATION: "Konfiguracja sieve" BUTTON_BACK_TO_IMAP: "Powrót do ustawień serwera IMAP" BUTTON_BACK: "Wstecz" BUTTON_CLOSE: "Zamknij" BUTTON_ADD: "Dodaj" BUTTON_UPDATE: "Zaktualizuj" NEW_DOMAIN_DESC: "Konfiguracja tej domeny pozwala na pracę
z adresami e-mail: %NAME%" WHITE_LIST_ALERT: | Lista użytkowników domeny, którzy mogą uzyskać dostęp z tego webmaila. Użyj spacji do rozdzielenia. POPUPS_PLUGIN: TITLE_PLUGIN: "Wtyczka" DESC_NOTHING_TO_CONFIGURE: "Brak opcji do skonfigurowania" BUTTON_CLOSE: "Zamknij" BUTTON_SAVE: "Zapisz" TOOLTIP_ABOUT_TITLE: "O wtyczce" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Czy na pewno chcesz zamknąć to okno?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Wybierz swój język" HINTS: BETA: "Beta" UNSTABLE: "Niestabilne" WARNING: "Ostrzeżenie!" NOT_SUPPORTED: "nieobsługiwana" REQUIRES_PHP_54: "Wymaga PHP w wersji 5.4 lub wyższej" ERRORS: DOMAIN_ALREADY_EXISTS: "Ta domena już istnieje" UNKNOWN_ERROR: "Nieznany błąd" NOTIFICATIONS: INVALID_TOKEN: "Nieprawidłowy token" AUTH_ERROR: "Autoryzacja zakończona niepowodzeniem" ACCESS_ERROR: "Błąd dostępu" CONNECTION_ERROR: "Nie można połączyć się z serwerem" CAPTCHA_ERROR: "Niepoprawny kod CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Logowanie poprzez tą platformę nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Logowanie poprzez tą platformę nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Logowanie poprzez tą platformę nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta. DOMAIN_NOT_ALLOWED: "Domena niedozwolona" ACCOUNT_NOT_ALLOWED: "Konto jest niedozwolone" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana autoryzacja dwuetapowa" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuetapowej" COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" CURRENT_PASSWORD_INCORRECT: "Bieżące hasło jest niepoprawne" NEW_PASSWORD_SHORT: "Wybrane hasło jest za krótkie" NEW_PASSWORD_WEAK: "Wybrane hasło jest zbyt proste" NEW_PASSWORD_FORBIDDENT: "Wybrane hasło zawiera niedozwolone znaki" CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktów" CANT_GET_MESSAGE_LIST: "Nie można pobrać listy wiadomości" CANT_GET_MESSAGE: "Nie można pobrać wiadomości" CANT_DELETE_MESSAGE: "Nie można usunąć wiadomości" CANT_MOVE_MESSAGE: "Nie można przenieść wiadomości" CANT_SAVE_MESSAGE: "Nie można zapisać wiadomości" CANT_SEND_MESSAGE: "Nie można wysłać wiadomości" INVALID_RECIPIENTS: "Niepoprawny adres odbiorcy" CANT_SAVE_FILTERS: "Nie można zapisać filtrów" CANT_GET_FILTERS: "Nie można pobrać filtrów" FILTERS_ARE_NOT_CORRECT: "Brak poprawności filtrów" CANT_CREATE_FOLDER: "Nie można utworzyć folderu" CANT_RENAME_FOLDER: "Nie można zmienić nazwy folderu" CANT_DELETE_FOLDER: "Nie można usunąć folderu" CANT_DELETE_NON_EMPTY_FOLDER: "Nie można usunąć folderu, w którym znajduje się zawartość" CANT_SUBSCRIBE_FOLDER: "Nie można zasubskrybować folderu" CANT_UNSUBSCRIBE_FOLDER: "Nie można usunąć subskrypcji folderu" CANT_SAVE_SETTINGS: "Nie można zapisać ustawień" CANT_SAVE_PLUGIN_SETTINGS: "Nie można zapisać ustawień wtyczki" DOMAIN_ALREADY_EXISTS: "Ta domena już istnieje" CANT_INSTALL_PACKAGE: "Instalacja wtyczki zakończona niepowodzeniem" CANT_DELETE_PACKAGE: "Usunięcie wtyczki zakończone niepowodzeniem" INVALID_PLUGIN_PACKAGE: "Niepoprawna wtyczka" UNSUPPORTED_PLUGIN_PACKAGE: "Nieobsługiwana wtyczka" LICENSING_SERVER_IS_UNAVAILABLE: "Serwer aktywacji subskrypcji jest niedostępny" LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasła." LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny została zawieszona." DEMO_SEND_MESSAGE_ERROR: "Ze względów bezpieczeństwa, to konto nie posiada zezwolenia na wysyłanie wiadomości na zewnętrzne adresy e-mail!" DEMO_ACCOUNT_ERROR: "Ze względów bezpieczeństwa, to konto nie posiada uprawnień do wykonania tego zadania!" ACCOUNT_ALREADY_EXISTS: "To konto już istnieje" ACCOUNT_DOES_NOT_EXIST: "Konto nie istnieje" MAIL_SERVER_ERROR: "Wystąpił błąd podczas dostępu do serwera" INVALID_INPUT_ARGUMENT: "Niepoprawny argument wejścia" UNKNOWN_ERROR: "Nieznany błąd" STATIC: BACK_LINK: "Odśwież" DOMAIN_LIST_DESC: "Lista domen, do których można uzyskać dostęp za pomocą tego webmaila." PHP_EXSTENSIONS_ERROR_DESC: "Brak wymaganych rozszerzeń w konfiguracji PHP!" PHP_VERSION_ERROR_DESC: "Twoja wersja PHP (%VERSION%) jest niższa niż minimalna: 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacja do poprawnej pracy wymaga JavaScript." NO_SCRIPT_DESC: | Twoja przeglądarka nie obsługuje JavaScript. Włącz obsługę JavaScript i spróbuj ponownie. NO_COOKIE_TITLE: "Obsługa plików cookies jest wymagana dla poprawnego działania skryptu." NO_COOKIE_DESC: | Twoja przeglądarka nie obsługuje plików cookies. Włącz obsługę cookies i spróbuj ponownie. BAD_BROWSER_TITLE: "Posiadasz nieaktualną wersję przeglądarki." BAD_BROWSER_DESC: | W celu wykorzystania wszystkich funkcji tej aplikacji, zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml000066400000000000000000000375211361462701300256650ustar00rootroot00000000000000pt_BR: LOGIN: LABEL_LOGIN: "Usuário" LABEL_PASSWORD: "Senha" BUTTON_LOGIN: "Entrar no painel administrativo" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Painel Administrativo" TABS_LABELS: LABEL_GENERAL_NAME: "Geral" LABEL_LOGIN_NAME: "Login" LABEL_BRANDING_NAME: "Personalizar" LABEL_CONTACTS_NAME: "Contatos" LABEL_DOMAINS_NAME: "Domínios" LABEL_SECURITY_NAME: "Segurança" LABEL_INTEGRATION_NAME: "Integrações" LABEL_PLUGINS_NAME: "Plugins" LABEL_PACKAGES_NAME: "Pacotes" LABEL_LICENSING_NAME: "Licença" LABEL_ABOUT_NAME: "Sobre" TAB_GENERAL: LEGEND_INTERFACE: "Interface" LABEL_LANGUAGE: "Idioma" LABEL_LANGUAGE_ADMIN: "Idioma (admin)" LABEL_THEME: "Tema Padrão" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Permitir escolha do idioma na tela de configurações" LABEL_ALLOW_THEMES_ON_SETTINGS: "Permitir escolha do tema na tela de configurações" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Permitir escolha de Imagem de Fundo na tela de configurações" LABEL_NEW_FOLDER_MOVE: "Novo botão \"Mover para pasta\"" LABEL_SHOW_THUMBNAILS: "Mostrar imagem miniatura (Anexos)" LABEL_ALLOW_GRAVATAR: "Permitir Gravatar" LEGEND_MAIN: "Principal" LABEL_ATTACHMENT_SIZE_LIMIT: "Tamanho limite de anexo" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permitir contas adicionais" LABEL_ALLOW_IDENTITIES: "Permitir identidades multiplas" LABEL_ALLOW_TEMPLATES: "Permitir templates" ALERT_DATA_ACCESS: "A pasta de dados RainLoop está acessível. Por favor configure o seu servidor web para esconder a pasta de dados do acesso externo. Leia mais aqui:" ALERT_WARNING: "Aviso!" HTML_ALERT_WEAK_PASSWORD: | Você está usando a senha administrativa padrão.
Por motivo de segurança por favor troque a senha agora. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Tela de entrada" LABEL_DEFAULT_DOMAIN: "Domínio padrão" LABEL_DETERMINE_USER_DOMAIN: "Tentar determinar o domínio do usuário" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Permitir escolha do idioma na tela de entrada" LABEL_DETERMINE_USER_LANGUAGE: "Tentar determinar o idioma do usuário" TAB_BRANDING: LEGEND_BRANDING: "Personalização" LABEL_PAGE_TITLE: "Título da página" LABEL_LOADING_DESCRIPTION: "Descrição do 'carregando'" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Tela de Entrada" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Descrição" LABEL_LOGIN_BACKGROUND: "Imagem de fundo" LABEL_LOGIN_CUSTOM_CSS: "CSS personalizado" LABEL_LOGIN_SHOW_POWERED_LINK: "Mostrar link \"Powered by RainLoop\"" LEGEND_USER: "Internas" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Título do logo" LABEL_USER_LOGO_MESSAGE: "Logo (Visualização de Mensagens)" LABEL_USER_CUSTOM_CSS: "CSS personalizado" LEGEND_WELCOME_PAGE: "Página de boas-vindas" LABEL_WELCOME_PAGE_TITLE: "Título" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Mostrar" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Nunca" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Única vez" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Sempre" HTML_ALERT_PREMIUM: "Essa funcionalidade está disponível apenas para usuários Premium." TAB_CONTACTS: LEGEND_CONTACTS: "Contatos" LEGEND_STORAGE: "Armazenamento (PDO)" LABEL_ENABLE_CONTACTS: "Habilitar contatos" LABEL_ALLOW_SYNC: "Permitir sincronização de contatos (com servidor externo CardDAV)" LABEL_STORAGE_TYPE: "Tipo" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Usuário" LABEL_STORAGE_PASSWORD: "Senha" BUTTON_TEST: "Testar" ALERT_NOTICE: "Aviso!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Não use este tipo de banco de dados com um grande número de usuários ativos." HTML_ALERT_DOES_NOT_SUPPORTED: | O seu sistema não suporta o uso dos contatos.
VocĂŞ precisa instalar ou habilitar a extensĂŁo PDO (SQLite / MySQL / PostgreSQL) em seu servidor. TAB_DOMAINS: LEGEND_DOMAINS: "DomĂ­nios" BUTTON_ADD_DOMAIN: "Adicionar DomĂ­nio" BUTTON_ADD_ALIAS: "Adicionar apelido (Alias)" DELETE_ARE_YOU_SURE: "VocĂŞ tem certeza?" HTML_DOMAINS_HELPER: | Lista dos domĂ­nios com acesso permitido ao webmail.
Clique no domínio para configurá-lo. TAB_SECURITY: LEGEND_SECURITY: "Segurança" LABEL_ALLOW_TWO_STEP: "Permitir verificação em duas etapas (Login 2-Step)" LABEL_FORCE_TWO_STEP: "Obrigar o uso da verificação em duas etapas" LABEL_USE_IMAGE_PROXY: "Usar proxy local para imagens externas" LABEL_ALLOW_OPEN_PGP: "Permitir OpenPGP" LABEL_SHOW_PHP_INFO: "Mostar informações PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Credenciais de acesso ao Painel Administrativo" LABEL_CURRENT_PASSWORD: "Senha atual" LABEL_NEW_LOGIN: "Usuário" LABEL_NEW_PASSWORD: "Nova senha" LABEL_REPEAT_PASSWORD: "Confirmar nova senha" BUTTON_UPDATE_PASSWORD: "Atualizar" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Exigir verificação do certificado SSL (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Permitir certificados auto-assinados" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Habilitar integração com o Google" LABEL_GOOGLE_AUTH: "Autenticação" LABEL_GOOGLE_DRIVE: "Integração com Google Drive (Anexos)" LABEL_GOOGLE_PREVIEW: "Integração com Leitor Google (Pré-visualização para Microsoft Word, Excel e PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Api Key" HINT_GOOGLE_API_KEY: "Requerido para o uso da seleção de arquivos do Google Drive" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Habilitar integração com o Facebook (Autenticação)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Habilitar integração com o Twitter (Autenticação)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Habilitar integração com o Dropbox" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "Informações detalhadas sobre as integrações em" TAB_PLUGINS: LEGEND_PLUGINS: "Plugins" LABEL_ENABLE_PLUGINS: "Habilitar uso de plugins" ALERT_NO_PLUGINS: "Nenhum plugin instalado." LINK_INSTALL_NEW: "Clique aqui para instalar!" HINT_CLICK_NAME: "Clique no nome para configurar o plugin." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Atualização disponível" LEGEND_AVAILABLE_FOR_INSTALLATION: "Disponíveis para instalação" LEGEND_INSTALLED_PACKAGES: "Pacotes já instalados" ALERT_CANNOT_ACCESS_REPOSITORY: "Não foi possível acessar o repositório no momento." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Seu domínio" LABEL_VERSION: "Versão" LABEL_CHECKING: "Checando" TYPE_BASIC_HINT: "Esse domínio não está licenciado para uso comercial (com recursos adicionais)." TYPE_BASIC_HINT_2: "Esse domínio não pode ser licenciado." HTML_ALERT_TOP_1: "RainLoop Webmail é licenciado sob" HTML_ALERT_TOP_2: "Você é livre para usá-lo em seus projetos pessoais." HTML_ALERT_TOP_3: | Uso comercial (com recursos adicionais) do RainLoop Webmail requer uma assinatura. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "A assinatura expira em" BUTTON_ACTIVATE: "Ative a chave de assinatura para este domínio" BUTTON_PURCHASE: "Comprar assinatura" BUTTON_TRIAL: "Trial" TAB_ABOUT: LEGEND_ABOUT: "Sobre" LABEL_TAG_HINT: "Leitor de email web simples, moderno & rápido." LABEL_ALL_RIGHTS_RESERVED: "Todos os direitos reservados." HINT_READ_CHANGE_LOG: "Por favor, leia o registro de alterações antes de atualizar." HINT_IS_UP_TO_DATE: "RainLoop está atualizado." HTML_NEW_VERSION: "Está disponível uma nova versão: %VERSION%." LABEL_UPDATING: "Atualizando" LABEL_CHECKING: "Checar por atualizações" BUTTON_UPDATE: "Atualizar" BUTTON_DOWNLOAD: "Baixar" BUTTON_CHANGELOG: "Registro de alterações" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Ativar chave de assinatura?" TITLE_ACTIVATION: "Ativação..." LABEL_DOMAIN: "Domínio" LABEL_SUB_KEY: "Chave de assinatura" BUTTON_ACTIVATE: "Ativar" LABEL_ACTIVATED: "Ativado" ERROR_INVALID_SUBS_KEY: "Chave de assinatura inválida" SUBS_KEY_ACTIVATED: "Chave de assinatura ativada com sucesso" HTML_DESC: | Após a ativação, a assinatura premium para %DOMAIN% será extendida.
Note que chave de assinatura Ă© ativada apenas para um Ăşnico domĂ­nio.

Uma vez iniciado, o processo de ativação não poderá ser interrompido ou cancelado. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Adicionar apelido (Alias)" LABEL_ALIAS: "Apelido (Alias)" LABEL_DOMAIN: "Domínio" BUTTON_CLOSE: "Fechar" BUTTON_ADD: "Adicionar" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Adicionar Domínio" TITLE_ADD_DOMAIN_WITH_NAME: "Adicionar Domínio \"%NAME%\"" TITLE_EDIT_DOMAIN: "Editar Domínio \"%NAME%\"" LABEL_NAME: "Domínio" NAME_HELPER: "curinga (wildcard) suportado" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Servidor" LABEL_PORT: "Porta" LABEL_SECURE: "Criptografia" LABEL_WHITE_LIST: "Lista branca" SECURE_OPTION_NONE: "Nenhuma" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Permitir scripts sieve" LABEL_ALLOW_USER_SCRIPT: "Permitir scripts personalizados por usuários" LABEL_USE_SHORT_LOGIN: "Usar login curto" LABEL_USE_AUTH: "Usar autenticação" LABEL_USE_PHP_MAIL: "Usar função php mail()" BUTTON_TEST: "Testar" BUTTON_WHITE_LIST: "Lista branca" BUTTON_SIEVE_CONFIGURATION: "Configurações Sieve" BUTTON_BACK_TO_IMAP: "Voltar para as configurações IMAP" BUTTON_BACK: "Voltar" BUTTON_CLOSE: "Fechar" BUTTON_ADD: "Adicionar" BUTTON_UPDATE: "Atualizar" NEW_DOMAIN_DESC: "Esta configuração de domínio lhe permitirá trabalhar
com endereços de e-mail do %NAME%." WHITE_LIST_ALERT: | Filtrar com lista dos Ăşnicos usuários do domĂ­nio que terĂŁo acesso ao webmail. Use um espaço como delimitador. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" BUTTON_CLOSE: "Fechar" BUTTON_SAVE: "Salvar" TOOLTIP_ABOUT_TITLE: "Sobre" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "VocĂŞ tem certeza que deseja fechar esta janela?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Selecionar idioma" HINTS: BETA: "beta" UNSTABLE: "instável" WARNING: "Aviso!" NOT_SUPPORTED: "nĂŁo suportado" REQUIRES_PHP_54: "requer PHP 5.4 ou superior" ERRORS: DOMAIN_ALREADY_EXISTS: "DomĂ­nio já existente" UNKNOWN_ERROR: "Erro desconhecido" NOTIFICATIONS: INVALID_TOKEN: "Senha inválida" AUTH_ERROR: "Falha na autenticação" ACCESS_ERROR: "Erro ao acessar" CONNECTION_ERROR: "NĂŁo foi possĂ­vel conectar ao servidor" CAPTCHA_ERROR: "Verificação CAPTCHA inválido." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Esse usuário Facebook nĂŁo está associado a nenhuma conta de email ainda. Entre utilizando seu email e senha e habilite essa função em configurações de conta. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Esse usuário Twitter nĂŁo está associado a nenhuma conta de email ainda. Entre utilizando seu email e senha e habilite essa função em configurações de conta. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Esse usuário Google nĂŁo está associado a nenhuma conta de email ainda. Entre utilizando seu email e senha e habilite essa função em configurações de conta. DOMAIN_NOT_ALLOWED: "Este domĂ­nio nĂŁo Ă© permitido" ACCOUNT_NOT_ALLOWED: "Conta nĂŁo permitida" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Verificação de duas etapas requerida" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verificação de duas etapas" COULD_NOT_SAVE_NEW_PASSWORD: "NĂŁo foi possĂ­vel salvar a nova senha" CURRENT_PASSWORD_INCORRECT: "Senha atual incorreta" NEW_PASSWORD_SHORT: "A senha Ă© muito curta" NEW_PASSWORD_WEAK: "A senha Ă© muito fácil" NEW_PASSWORD_FORBIDDENT: "A senha contĂ©m caracteres nĂŁo permitidos" CONTACTS_SYNC_ERROR: "Erro na sincronização dos contatos" CANT_GET_MESSAGE_LIST: "NĂŁo foi possĂ­vel obter a lista de mensagens" CANT_GET_MESSAGE: "NĂŁo foi possĂ­vel obter a mensagem" CANT_DELETE_MESSAGE: "NĂŁo foi possĂ­vel excluir a mensagem" CANT_MOVE_MESSAGE: "NĂŁo foi possĂ­vel mover a mensagem" CANT_SAVE_MESSAGE: "NĂŁo foi possĂ­vel salvar a mensagem" CANT_SEND_MESSAGE: "NĂŁo foi possĂ­vel enviar a mensagem" INVALID_RECIPIENTS: "Destinatário inválido" CANT_SAVE_FILTERS: "NĂŁo Ă© possĂ­vel salvar os filtros" CANT_GET_FILTERS: "NĂŁo Ă© possĂ­vel obter os filtros" FILTERS_ARE_NOT_CORRECT: "Os filtros nĂŁo estĂŁo corretos" CANT_CREATE_FOLDER: "NĂŁo foi possĂ­vel criar a pasta" CANT_RENAME_FOLDER: "NĂŁo foi possĂ­vel renomear a pasta" CANT_DELETE_FOLDER: "NĂŁo foi possĂ­vel exluir a pasta" CANT_DELETE_NON_EMPTY_FOLDER: "NĂŁo Ă© possĂ­vel excluir diretĂłrio nĂŁo vazio" CANT_SUBSCRIBE_FOLDER: "NĂŁo foi possĂ­vel inscrever esta pasta" CANT_UNSUBSCRIBE_FOLDER: "NĂŁo foi possĂ­vel desinscrever esta pasta" CANT_SAVE_SETTINGS: "NĂŁo foi possĂ­vel salvar as configurações" CANT_SAVE_PLUGIN_SETTINGS: "NĂŁo foi possĂ­vel salvar as configurações" DOMAIN_ALREADY_EXISTS: "O domĂ­nio já existe" CANT_INSTALL_PACKAGE: "Erro ao instalar pacote de plugin" CANT_DELETE_PACKAGE: "Erro ao remover pacote de plugin" INVALID_PLUGIN_PACKAGE: "Pacote de plugins inválido" UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugins insuportados" LICENSING_SERVER_IS_UNAVAILABLE: "A assinatura do servidor está indisponĂ­vel" LICENSING_DOMAIN_EXPIRED: "A assinatura para este domĂ­nio expirou." LICENSING_DOMAIN_BANNED: "A assinatura para este domĂ­nio Ă© proibida." DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta demo nĂŁo tem permissĂŁo para enviar mensagens para endereços de e-mail externo!" DEMO_ACCOUNT_ERROR: "Por motivos de segurança, esta conta nĂŁo tem permição para esta ação!" ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" ACCOUNT_DOES_NOT_EXIST: "Conta nĂŁo existente" MAIL_SERVER_ERROR: "Ocorreu um erro ao acessar o servidor de e-mail" INVALID_INPUT_ARGUMENT: "Argumento de entrada inválido" UNKNOWN_ERROR: "Erro desconhecido" STATIC: BACK_LINK: "Recarregar" DOMAIN_LIST_DESC: "A lista de domĂ­nios de webmail tem permissĂŁo para acessar." PHP_EXSTENSIONS_ERROR_DESC: "Extensões necessárias PHP nĂŁo estĂŁo disponĂ­veis na sua configuração do PHP!" PHP_VERSION_ERROR_DESC: "Sua versĂŁo PHP (%VERSION%) Ă© menor do que o mĂ­nimo exigido 5.3.0!" NO_SCRIPT_TITLE: "JavaScript Ă© necessário para esta aplicação." NO_SCRIPT_DESC: | O JavaScript nĂŁo está disponĂ­vel em seu navegador. Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." NO_COOKIE_DESC: | Os Cookies nĂŁo estĂŁo disponĂ­veis em seu navegador. Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. BAD_BROWSER_TITLE: "Seu navegador está desatualizado." BAD_BROWSER_DESC: | Para usar todos os recursos do aplicativo, baixe e instale um desses navegadores: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/ru_RU.yml000066400000000000000000000510671361462701300257140ustar00rootroot00000000000000ru_RU: LOGIN: LABEL_LOGIN: "Логин" LABEL_PASSWORD: "Пароль" BUTTON_LOGIN: "Войти в админ панель" TOP_PANEL: LABEL_PREMIUM: "ПремиŃĐĽ" LABEL_ADMIN_PANEL: "Đдминка" TABS_LABELS: LABEL_GENERAL_NAME: "ĐžŃновные" LABEL_LOGIN_NAME: "Логин" LABEL_BRANDING_NAME: "Брендинг" LABEL_CONTACTS_NAME: "Контакты" LABEL_DOMAINS_NAME: "Домены" LABEL_SECURITY_NAME: "БезопаŃноŃть" LABEL_INTEGRATION_NAME: "Đнтеграция" LABEL_PLUGINS_NAME: "Плагины" LABEL_PACKAGES_NAME: "Пакеты" LABEL_LICENSING_NAME: "Лицензия" LABEL_ABOUT_NAME: "Đž Программе" TAB_GENERAL: LEGEND_INTERFACE: "ĐнтерфейŃ" LABEL_LANGUAGE: "Язык" LABEL_LANGUAGE_ADMIN: "Язык (Đдмин)" LABEL_THEME: "Тема" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "РазреŃить выбор языка на экране наŃтроек" LABEL_ALLOW_THEMES_ON_SETTINGS: "РазреŃить выбор темы на экране наŃтроек" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" LABEL_NEW_FOLDER_MOVE: "Новая кнопка \"перемеŃтить в папкŃ\"" LABEL_SHOW_THUMBNAILS: "Показывать миниатюры (для вложений)" LABEL_ALLOW_GRAVATAR: "РазреŃить граватары" LEGEND_MAIN: "ĐžŃновное" LABEL_ATTACHMENT_SIZE_LIMIT: "Предельный размер вложений" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "РазреŃить дополнительные аккаŃнты" LABEL_ALLOW_IDENTITIES: "РазреŃить множеŃтвенные профили" LABEL_ALLOW_TEMPLATES: "РазреŃить Ńаблоны" ALERT_DATA_ACCESS: "Папка данных RainLoop Đ´ĐľŃŃ‚Ńпна. ПожалŃĐąŃта, наŃтройте Ńвой веб-Ńервер так, чтобы Ńкрыть ĐżĐ°ĐżĐşŃ Đ´Đ°Đ˝Đ˝Ń‹Ń… Ń Đ˛Đ˝ĐµŃнего Đ´ĐľŃŃ‚Ńпа. Подробнее здеŃŃŚ:" ALERT_WARNING: "Внимание!" HTML_ALERT_WEAK_PASSWORD: | Đ’Ń‹ иŃпользŃете пароль админиŃтратора по Ńмолчанию.
По Ńоображениям безопаŃноŃти, пожалŃĐąŃта, измените пароль прямо ŃейчаŃ. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Cтраница Входа" LABEL_DEFAULT_DOMAIN: "ĐžŃновной домен" LABEL_DETERMINE_USER_DOMAIN: "ПытатьŃŃŹ определить домен пользователя" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "РазреŃить выбор языка на Ńтранице входа" LABEL_DETERMINE_USER_LANGUAGE: "ПытатьŃŃŹ определить язык пользователя" TAB_BRANDING: LEGEND_BRANDING: "Брендинг" LABEL_PAGE_TITLE: "Название Ńтраницы" LABEL_LOADING_DESCRIPTION: "ОпиŃание при загрŃзке" LABEL_FAVICON_URL: "Đконка (favicon)" LEGEND_LOGIN: "Экран входа" LABEL_LOGIN_LOGO: "Логотип" LABEL_LOGIN_DESCRIPTION: "ОпиŃание" LABEL_LOGIN_BACKGROUND: "Фоновая картинка" LABEL_LOGIN_CUSTOM_CSS: "КаŃтомный CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Показывать ŃŃŃ‹Đ»ĐşŃ \"Powered by RainLoop\"" LEGEND_USER: "Экран пользователя" LABEL_USER_LOGO: "Логотип" LABEL_USER_LOGO_TITLE: "Название логотипа" LABEL_USER_LOGO_MESSAGE: "Логотип (Message View)" LABEL_USER_CUSTOM_CSS: "КаŃтомный CSS" LEGEND_WELCOME_PAGE: "ПриветŃтвие" LABEL_WELCOME_PAGE_TITLE: "Название" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Показывать" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Никогда" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Один раз" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Đ’Ńегда" HTML_ALERT_PREMIUM: "Эти Ń„Ńнкции Đ´ĐľŃŃ‚Ńпны для премиŃĐĽ подпиŃчиков." TAB_CONTACTS: LEGEND_CONTACTS: "Контакты" LEGEND_STORAGE: "Хранилище (PDO)" LABEL_ENABLE_CONTACTS: "Включить контакты" LABEL_ALLOW_SYNC: "РазреŃить Ńинхронизацию контактов (Ń Đ˛Đ˝ĐµŃним CardDAV Ńервером)" LABEL_STORAGE_TYPE: "Тип" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Пользователь" LABEL_STORAGE_PASSWORD: "Пароль" BUTTON_TEST: "ТеŃŃ‚" ALERT_NOTICE: "Внимание!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Не иŃпользŃйте этот тип базы данных Ń Đ±ĐľĐ»ŃŚŃим чиŃлом активных пользователей." HTML_ALERT_DOES_NOT_SUPPORTED: | ВаŃа ŃиŃтема не поддерживает контакты.
Вам необходимо ŃŃтановить или включить PDO (SQLite / MySQL / PostgreSQL) раŃŃирения на ваŃем Ńервере. TAB_DOMAINS: LEGEND_DOMAINS: "Домены" BUTTON_ADD_DOMAIN: "Добавить домен" BUTTON_ADD_ALIAS: "Добавить ĐлиаŃ" DELETE_ARE_YOU_SURE: "Đ’Ń‹ Ńверены?" HTML_DOMAINS_HELPER: | СпиŃок доменов Đş которым разреŃен Đ´ĐľŃŃ‚ŃĐż.
Нажмите на имя, чтобы наŃтроить домен. TAB_SECURITY: LEGEND_SECURITY: "БезопаŃноŃть" LABEL_ALLOW_TWO_STEP: "РазреŃить 2-ŃаговŃŃŽ проверкŃ" LABEL_FORCE_TWO_STEP: "ФорŃировать 2-ŃаговŃŃŽ проверкŃ" LABEL_USE_IMAGE_PROXY: "ĐŃпользовать локальный прокŃи для внеŃних изображений" LABEL_ALLOW_OPEN_PGP: "РазреŃить OpenPGP" LABEL_SHOW_PHP_INFO: "Показать PHP информацию" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Admin Panel Access Credentials" LABEL_CURRENT_PASSWORD: "ТекŃщий пароль" LABEL_NEW_LOGIN: "Новый логин" LABEL_NEW_PASSWORD: "Новый пароль" LABEL_REPEAT_PASSWORD: "Повторить пароль" BUTTON_UPDATE_PASSWORD: "Обновить пароль" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Требовать ĐżŃ€ĐľĐ˛ĐµŃ€ĐşŃ SSL Ńертификата для IMAP и SMTP" LABEL_ALLOW_SELF_SIGNED: "РазреŃить cамоподпиŃанные Ńертификаты" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Включить Google интеграцию" LABEL_GOOGLE_AUTH: "Đвторизация" LABEL_GOOGLE_DRIVE: "Google диŃĐş интеграция (Экран нового Ńообщения)" LABEL_GOOGLE_PREVIEW: "Google проŃмотрщик интеграция (Превью для Microsoft Word, Excel и PowerPoint файлов)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Api Key" HINT_GOOGLE_API_KEY: "ТребŃетŃŃŹ для Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Включить Facebook интеграцию (Đвторизация)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Включить Twitter интеграцию (Đвторизация)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Включить Dropbox интеграцию" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "Подробная информация Đľ Ńоциальной интеграции находитŃŃŹ на" TAB_PLUGINS: LEGEND_PLUGINS: "Плагины" LABEL_ENABLE_PLUGINS: "Включить плагины" ALERT_NO_PLUGINS: "Плагины пока не ŃŃтановлены." LINK_INSTALL_NEW: "Нажмите здеŃŃŚ, чтобы ŃŃтановить плагин" HINT_CLICK_NAME: "Нажмите на имя, чтобы наŃтроить плагин." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "ДоŃŃ‚Ńпно для обновления" LEGEND_AVAILABLE_FOR_INSTALLATION: "ДоŃŃ‚Ńпно для ŃŃтановки" LEGEND_INSTALLED_PACKAGES: "ĐŁŃтановленные пакеты" ALERT_CANNOT_ACCESS_REPOSITORY: "Не ŃдаетŃŃŹ полŃчить Đ´ĐľŃŃ‚ŃĐż Đş Ń…Ń€Đ°Đ˝Đ¸Đ»Đ¸Ń‰Ń ĐżĐ°ĐşĐµŃ‚ĐľĐ˛ в данный момент." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Đ’Đ°Ń Đ´ĐľĐĽĐµĐ˝" LABEL_VERSION: "ВерŃия" LABEL_CHECKING: "Проверка" TYPE_BASIC_HINT: "Этот домен не имеет лицензию для коммерчеŃкого иŃпользования (Ń Đ´ĐľĐżĐľĐ»Đ˝Đ¸Ń‚ĐµĐ»ŃŚĐ˝Ń‹ĐĽĐ¸ Ń„Ńнкциями)." TYPE_BASIC_HINT_2: "Этот домен не может быть лицензирован." HTML_ALERT_TOP_1: "Код RainLoop Webmail лицензирован под" HTML_ALERT_TOP_2: "Đ’Ń‹ можете Ńвободно иŃпользовать его в Ńвоих личных проектах." HTML_ALERT_TOP_3: | КоммерчеŃкое иŃпользование (Ń Đ´ĐľĐżĐľĐ»Đ˝Đ¸Ń‚ĐµĐ»ŃŚĐ˝Ń‹ĐĽĐ¸ Ń„Ńнкциями) RainLoop Webmail требŃет полŃчение лицензии. TYPE_PREMIUM_LIFETIME: "беŃконечная" LABEL_SUB_EXPIRES: "ПодпиŃка иŃтекает" BUTTON_ACTIVATE: "Đктивировать ключ для этого домена" BUTTON_PURCHASE: "ĐšŃпить" BUTTON_TRIAL: "Пробная лицензия" TAB_ABOUT: LEGEND_ABOUT: "Đž программе" LABEL_TAG_HINT: "ПроŃтой, Ńовременный и быŃтрый веб-клиент электронной почты\n" LABEL_ALL_RIGHTS_RESERVED: "Đ’Ńе права защищены." HINT_READ_CHANGE_LOG: "ПожалŃĐąŃта, ознакомьтеŃŃŚ Ń Đ¸Đ·ĐĽĐµĐ˝ĐµĐ˝Đ¸ŃŹĐĽĐ¸ перед обновлением.\n" HINT_IS_UP_TO_DATE: "ВерŃия RainLoop актŃальна." HTML_NEW_VERSION: "Новая %VERSION% верŃия Đ´ĐľŃŃ‚Ńпна." LABEL_UPDATING: "Обновление" LABEL_CHECKING: "Проверка" BUTTON_UPDATE: "Обновить" BUTTON_DOWNLOAD: "Скачать" BUTTON_CHANGELOG: "Đзменения" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Đктивировать ключ подпиŃки?" TITLE_ACTIVATION: "Đктивация..." LABEL_DOMAIN: "Домен" LABEL_SUB_KEY: "Ключ подпиŃки" BUTTON_ACTIVATE: "Đктивировать" LABEL_ACTIVATED: "Đктивировано" ERROR_INVALID_SUBS_KEY: "Неверный ключ подпиŃки" SUBS_KEY_ACTIVATED: "Ключ подпиŃки активирован Ńдачно" HTML_DESC: | ПоŃле активации премиŃĐĽ подпиŃка для %DOMAIN% бŃдет продлена.
Обратите внимание, что ключ может быть активирован только один раз.

ПоŃле запŃŃка процеŃŃ Đ°ĐşŃ‚Đ¸Đ˛Đ°Ń†Đ¸Đ¸ не может быть прерван или отменен. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Добавить ĐлиаŃ" LABEL_ALIAS: "ĐлиаŃ" LABEL_DOMAIN: "Домен" BUTTON_CLOSE: "Закрыть" BUTTON_ADD: "Добавить" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Добавить домен" TITLE_ADD_DOMAIN_WITH_NAME: "Добавить домен \"%NAME%\"" TITLE_EDIT_DOMAIN: "Редактировать домен \"%NAME%\"" LABEL_NAME: "ĐĐĽŃŹ" NAME_HELPER: "wildcard supported" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Сервер" LABEL_PORT: "Порт" LABEL_SECURE: "БезопаŃноŃть" LABEL_WHITE_LIST: "Белый ŃпиŃок" SECURE_OPTION_NONE: "Нет" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "РазреŃить sieve Ńкрипты" LABEL_ALLOW_USER_SCRIPT: "РазреŃить иŃпользовать пользовательŃкий sieve Ńкрипт" LABEL_USE_SHORT_LOGIN: "ĐŃпользовать короткий логин" LABEL_USE_AUTH: "ĐŃпользовать аŃтентификацию" LABEL_USE_PHP_MAIL: "ĐŃпользовать mail() Ń„Ńнкцию" BUTTON_TEST: "ТеŃŃ‚" BUTTON_WHITE_LIST: "Белый ŃпиŃок" BUTTON_SIEVE_CONFIGURATION: "наŃтройки Sieve" BUTTON_BACK_TO_IMAP: "Назад Đş IMAP наŃтройкам" BUTTON_BACK: "Назад" BUTTON_CLOSE: "Закрыть" BUTTON_ADD: "Добавить" BUTTON_UPDATE: "Обновить" NEW_DOMAIN_DESC: "Эта конфигŃрация позволит вам работать
Ń %NAME% адреŃами." WHITE_LIST_ALERT: | СпиŃок пользователей домена Đş которым разреŃен Đ´ĐľŃŃ‚ŃĐż. ĐŃпользŃйте пробел в качеŃтве разделителя. POPUPS_PLUGIN: TITLE_PLUGIN: "Плагин" DESC_NOTHING_TO_CONFIGURE: "Без наŃтроек" BUTTON_CLOSE: "Закрыть" BUTTON_SAVE: "Сохранить" TOOLTIP_ABOUT_TITLE: "Đž плагине" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Đ’Ń‹ Ńверены, что хотите закрыть это окно?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Выберите язык" HINTS: BETA: "beta" UNSTABLE: "unstable" WARNING: "Внимание!" NOT_SUPPORTED: "не поддерживаетŃŃŹ" REQUIRES_PHP_54: "требŃет PHP 5.4 или выŃе" ERRORS: DOMAIN_ALREADY_EXISTS: "Домен Ńже ŃŃщеŃтвŃет" UNKNOWN_ERROR: "НеизвеŃтная ĐľŃибка" NOTIFICATIONS: INVALID_TOKEN: "Неверный токен запроŃа" AUTH_ERROR: "Не ŃдалоŃŃŚ авторизоватьŃŃŹ" ACCESS_ERROR: "ĐžŃибка Đ´ĐľŃŃ‚Ńпа" CONNECTION_ERROR: "ĐžŃибка Ńоединения Ń Ńервером." CAPTCHA_ERROR: "Неправильное проверочное Ńлово." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Đš Đ´Đ°Đ˝Đ˝ĐľĐĽŃ ŃĐľŃ†Đ¸Đ°Đ»ŃŚĐ˝ĐľĐĽŃ ĐżĐľĐ»ŃŚĐ·ĐľĐ˛Đ°Ń‚ĐµĐ»ŃŽ еще не прикреплен почтовый аккаŃнт. Войдите в ŃиŃŃ‚ĐµĐĽŃ ĐżĐľĐ´ Ńвоим почтовым аккаŃнтом и включите ŃŤŃ‚Ń Đ˛ĐľĐ·ĐĽĐľĐ¶Đ˝ĐľŃть в наŃтройках. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Đš Đ´Đ°Đ˝Đ˝ĐľĐĽŃ ŃĐľŃ†Đ¸Đ°Đ»ŃŚĐ˝ĐľĐĽŃ ĐżĐľĐ»ŃŚĐ·ĐľĐ˛Đ°Ń‚ĐµĐ»ŃŽ еще не прикреплен почтовый аккаŃнт. Войдите в ŃиŃŃ‚ĐµĐĽŃ ĐżĐľĐ´ Ńвоим почтовым аккаŃнтом и включите ŃŤŃ‚Ń Đ˛ĐľĐ·ĐĽĐľĐ¶Đ˝ĐľŃть в наŃтройках. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Đš Đ´Đ°Đ˝Đ˝ĐľĐĽŃ ŃĐľŃ†Đ¸Đ°Đ»ŃŚĐ˝ĐľĐĽŃ ĐżĐľĐ»ŃŚĐ·ĐľĐ˛Đ°Ń‚ĐµĐ»ŃŽ еще не прикреплен почтовый аккаŃнт. Войдите в ŃиŃŃ‚ĐµĐĽŃ ĐżĐľĐ´ Ńвоим почтовым аккаŃнтом и включите ŃŤŃ‚Ń Đ˛ĐľĐ·ĐĽĐľĐ¶Đ˝ĐľŃть в наŃтройках. DOMAIN_NOT_ALLOWED: "Данный домен не разреŃен" ACCOUNT_NOT_ALLOWED: "Данный аккаŃнт не разреŃен" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необходима двŃхфакторная верификация" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "ĐžŃибка двŃхфакторной верификации" COULD_NOT_SAVE_NEW_PASSWORD: "Не ŃдалоŃŃŚ Ńохранить новый пароль" CURRENT_PASSWORD_INCORRECT: "ТекŃщий пароль неверный" NEW_PASSWORD_SHORT: "Пароль ŃлиŃком короткий" NEW_PASSWORD_WEAK: "Пароль ŃлиŃком проŃтой" NEW_PASSWORD_FORBIDDENT: "Пароль Ńодержит запрещенные Ńимволы" CONTACTS_SYNC_ERROR: "ĐžŃибка Ńинхронизации контактов" CANT_GET_MESSAGE_LIST: "Не ĐĽĐľĐłŃ ĐżĐľĐ»Ńчить ŃпиŃок пиŃем" CANT_GET_MESSAGE: "Не ĐĽĐľĐłŃ ĐżĐľĐ»Ńчить пиŃŃŚĐĽĐľ" CANT_DELETE_MESSAGE: "Не ĐĽĐľĐłŃ Ńдалить пиŃŃŚĐĽĐľ" CANT_MOVE_MESSAGE: "Не ĐĽĐľĐłŃ ĐżĐµŃ€ĐµĐĽĐµŃтить пиŃŃŚĐĽĐľ" CANT_SAVE_MESSAGE: "Не ĐĽĐľĐłŃ Ńохранить пиŃŃŚĐĽĐľ" CANT_SEND_MESSAGE: "Не ĐĽĐľĐłŃ ĐľŃ‚ĐżŃ€Đ°Đ˛Đ¸Ń‚ŃŚ пиŃŃŚĐĽĐľ" INVALID_RECIPIENTS: "Проверьте правильноŃть ввода вŃех адреŃов." CANT_SAVE_FILTERS: "Не ĐĽĐľĐłŃ Ńохранить фильтры" CANT_GET_FILTERS: "Не ĐĽĐľĐłŃ Đ·Đ°ĐłŃ€Ńзить фильтры" FILTERS_ARE_NOT_CORRECT: "Фильтры неправильны" CANT_CREATE_FOLDER: "Не ĐĽĐľĐłŃ Ńоздать папкŃ" CANT_RENAME_FOLDER: "Не ĐĽĐľĐłŃ ĐżĐµŃ€ĐµĐ¸ĐĽĐµĐ˝ĐľĐ˛Đ°Ń‚ŃŚ папкŃ" CANT_DELETE_FOLDER: "Не ĐĽĐľĐłŃ Ńдалить папкŃ" CANT_DELETE_NON_EMPTY_FOLDER: "Не ĐĽĐľĐłŃ Ńдалить непŃŃŃ‚ŃŃŽ папкŃ" CANT_SUBSCRIBE_FOLDER: "Не ĐĽĐľĐłŃ ĐżĐľĐ´ĐżĐ¸Ńать папкŃ" CANT_UNSUBSCRIBE_FOLDER: "Не ĐĽĐľĐłŃ ĐľŃ‚ĐżĐ¸Ńать папкŃ" CANT_SAVE_SETTINGS: "Не ĐĽĐľĐłŃ Ńохранить наŃтройки" CANT_SAVE_PLUGIN_SETTINGS: "Не ĐĽĐľĐłŃ Ńохранить наŃтройки" DOMAIN_ALREADY_EXISTS: "Домен Ńже ŃŃщеŃтвŃет" CANT_INSTALL_PACKAGE: "ĐžŃибка ŃŃтановки пакета" CANT_DELETE_PACKAGE: "ĐžŃибка Ńдаления пакета" INVALID_PLUGIN_PACKAGE: "ĐžŃибка пакета плагина" UNSUPPORTED_PLUGIN_PACKAGE: "Для работы плагина необходима полная поддержка Ńервера" LICENSING_SERVER_IS_UNAVAILABLE: "Сервер подпиŃок временно не Đ´ĐľŃŃ‚Ńпен." LICENSING_DOMAIN_EXPIRED: "ПодпиŃка на данный домен ŃŃтарела." LICENSING_DOMAIN_BANNED: "ПодпиŃка на данный домен заблокирована." DEMO_SEND_MESSAGE_ERROR: "Демо аккаŃĐ˝Ń‚Ń ĐľŃ‚ĐżŃ€Đ°Đ˛ĐşĐ° пиŃем на внеŃние почтовые адреŃа запрещена!" DEMO_ACCOUNT_ERROR: "По Ńоображениям безопаŃноŃти данный аккаŃнт не может выполнить это дейŃтвие." ACCOUNT_ALREADY_EXISTS: "ĐккаŃнт Ńже добавлен" ACCOUNT_DOES_NOT_EXIST: "ĐккаŃнт не ŃŃщеŃтвŃет" MAIL_SERVER_ERROR: "ĐžŃибка Đ´ĐľŃŃ‚Ńпа Đş ĐżĐľŃ‡Ń‚ĐľĐ˛ĐľĐĽŃ ŃерверŃ" INVALID_INPUT_ARGUMENT: "Неверный параметр" UNKNOWN_ERROR: "НеизвеŃтная ĐľŃибка" STATIC: BACK_LINK: "Обновить" DOMAIN_LIST_DESC: "СпиŃок доменов, Đş которым разреŃен Đ´ĐľŃŃ‚ŃĐż через веб почтŃ." PHP_EXSTENSIONS_ERROR_DESC: "Необходимые раŃŃирения PHP не ŃŃтановлены на ваŃем Ńервере!" PHP_VERSION_ERROR_DESC: "ВаŃа верŃия PHP (%VERSION%) ниже требŃемой 5.3.0!" NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." NO_SCRIPT_DESC: | По-видимомŃ, JavaScript либо не поддерживаетŃŃŹ ваŃим браŃзером, либо отключен. Включите JavaScript, изменив наŃтройки браŃзера, затем повторите попыткŃ. NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." NO_COOKIE_DESC: | По-видимомŃ, Cookie либо не поддерживаютŃŃŹ ваŃим браŃзером, либо отключены. Включите Cookie, изменив наŃтройки браŃзера, затем повторите попыткŃ. BAD_BROWSER_TITLE: "Đ’Đ°Ń Đ±Ń€Đ°Ńзер ŃŃтарел." BAD_BROWSER_DESC: | Чтобы иŃпользовать вŃе возможноŃти приложения, загрŃзите и ŃŃтановите один из этих браŃзеров rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml000066400000000000000000000255171361462701300256730ustar00rootroot00000000000000sk_SK: LOGIN: LABEL_LOGIN: "Prihlasovanie" LABEL_PASSWORD: "Heslo" BUTTON_LOGIN: "PrihlásiĹĄ sa do admin panelu" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Admin Panel" TABS_LABELS: LABEL_GENERAL_NAME: "VšeobecnĂ©" LABEL_LOGIN_NAME: "PoužívateÄľskĂ© meno" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Kontakty" LABEL_DOMAINS_NAME: "DomĂ©ny" LABEL_SECURITY_NAME: "ZabezpeÄŤenie" LABEL_INTEGRATION_NAME: "Integrácie" LABEL_PLUGINS_NAME: "Doplnky" LABEL_PACKAGES_NAME: "BalĂ­ÄŤky" LABEL_LICENSING_NAME: "Licencovanie" LABEL_ABOUT_NAME: "O programe" TAB_GENERAL: LEGEND_INTERFACE: "Rozhranie" LABEL_LANGUAGE: "Jazyk" LABEL_LANGUAGE_ADMIN: "Jazyk (admin)" LABEL_THEME: "TĂ©ma" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "PovoliĹĄ vĂ˝ber jazyka v nastaveniach" LABEL_ALLOW_THEMES_ON_SETTINGS: "PovoliĹĄ vĂ˝ber tĂ©my v nastaveniach" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "PovoliĹĄ vĂ˝ber pozadia v nastaveniach" LABEL_SHOW_THUMBNAILS: "ZobraziĹĄ náhÄľady (prĂ­lohy)" LABEL_ALLOW_GRAVATAR: "PovoliĹĄ Gravatar" LEGEND_MAIN: "VšeobecnĂ©" LABEL_ATTACHMENT_SIZE_LIMIT: "Maximálna veÄľkosĹĄ prĂ­lohy" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "PovoliĹĄ ÄŹalšie účty" LABEL_ALLOW_IDENTITIES: "PovoliĹĄ viacerĂ© identity" LABEL_ALLOW_TEMPLATES: "PovoliĹĄ šablĂłny" ALERT_DATA_ACCESS: "Adresár data je dostupnĂ˝. ProsĂ­m skonfigurujte svoj webserver tak, aby bol adresár data nedostupnĂ˝. Viac informáciĂ­:" ALERT_WARNING: "Upozornenie!" HTML_ALERT_WEAK_PASSWORD: | Používate predvolenĂ© administrátorskĂ© heslo.
KvĂ´li bezpeÄŤnosti prosĂ­m zmeĹte heslo na inĂ©. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Prihlasovacia obrazovka" LABEL_DEFAULT_DOMAIN: "Predvolená domĂ©na" LABEL_DETERMINE_USER_DOMAIN: "PokĂşsiĹĄ sa urÄŤiĹĄ domĂ©nu používateÄľa" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "PovoliĹĄ vĂ˝ber jazyka na prihlasovacej obrazovke" LABEL_DETERMINE_USER_LANGUAGE: "PokĂşsiĹĄ sa urÄŤiĹĄ používateÄľov jazyk" TAB_BRANDING: LEGEND_BRANDING: "VlastnĂ© oznaÄŤenie" LABEL_PAGE_TITLE: "Názov stránky" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "PoužívateÄľskĂ© meno" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Popis" LABEL_LOGIN_BACKGROUND: "Pozadie" LABEL_LOGIN_CUSTOM_CSS: "VlastnĂ© CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "ZobraziĹĄ link \"Powered by RainLoop\"" LEGEND_USER: "UžívateÄľ" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Nadpis loga" LABEL_USER_LOGO_MESSAGE: "Logo (zobrazenie správy)" LABEL_USER_CUSTOM_CSS: "VlastnĂ© CSS" LEGEND_WELCOME_PAGE: "UvĂ­tacia stránka" LABEL_WELCOME_PAGE_TITLE: "Nadpis" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "ZobraziĹĄ" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ĺ˝iadne" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Jednorázovo" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "VĹľdy" TAB_CONTACTS: LEGEND_CONTACTS: "Kontakty" LEGEND_STORAGE: "ĂšloĹľisko (PDO)" LABEL_ENABLE_CONTACTS: "Zapnúť kontakty" LABEL_ALLOW_SYNC: "PovoliĹĄ synchronizáciu kontaktov (s externĂ˝m CardDAV serverom)" LABEL_STORAGE_TYPE: "Typ" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "UžívateÄľ" LABEL_STORAGE_PASSWORD: "Heslo" BUTTON_TEST: "Test" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nepoužívajte tento typ databázy, ak máte veÄľkĂ˝ poÄŤet aktĂ­vnych používateÄľov." TAB_DOMAINS: LEGEND_DOMAINS: "DomĂ©ny" BUTTON_ADD_DOMAIN: "PridaĹĄ domĂ©nu" BUTTON_ADD_ALIAS: "PridaĹĄ alias" DELETE_ARE_YOU_SURE: "Ste si istĂ­?" TAB_SECURITY: LEGEND_SECURITY: "BezpeÄŤnosĹĄ" LABEL_ALLOW_TWO_STEP: "PovoliĹĄ 2-krokovĂş verifikáciu" LABEL_FORCE_TWO_STEP: "VyĹľadovaĹĄ 2-krokovĂş verifikáciu" LABEL_ALLOW_OPEN_PGP: "PovoliĹĄ OpenPGP" LABEL_SHOW_PHP_INFO: "ZobraziĹĄ informácie o PHP" LABEL_CURRENT_PASSWORD: "SúčasnĂ© heslo" LABEL_NEW_LOGIN: "NovĂ˝ login" LABEL_NEW_PASSWORD: "NovĂ© heslo" LABEL_REPEAT_PASSWORD: "OpakovaĹĄ" BUTTON_UPDATE_PASSWORD: "ZmeniĹĄ heslo" LEGEND_SSL: "SSL" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "PovoliĹĄ integráciu s Google" LABEL_GOOGLE_AUTH: "Overenie" LABEL_GOOGLE_CLIENT_ID: "ID klienta" LABEL_GOOGLE_API_KEY: "Api kľúč" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "PovoliĹĄ integráciu s Facebook (autorizácia)" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "PovoliĹĄ Twitter intergáciu (overenie)" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "PovoliĹĄ integráciu s Dropbox" LABEL_DROPBOX_API_KEY: "Api kľúč" TAB_PLUGINS: LEGEND_PLUGINS: "Doplnky" LABEL_ENABLE_PLUGINS: "PovoliĹĄ doplnky" TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "DostupnĂ© na aktualizáciu" LEGEND_AVAILABLE_FOR_INSTALLATION: "DostupnĂ© na inštaláciu" LEGEND_INSTALLED_PACKAGES: "NainštalovanĂ© balĂ­ÄŤky" TAB_LICENSING: LABEL_YOUR_DOMAIN: "Vaša domĂ©na" LABEL_VERSION: "Verzia" LABEL_CHECKING: "Kontrolujem" TYPE_BASIC_HINT_2: "Táto domĂ©na nemĂ´Ĺľe byĹĄ licencovaná" HTML_ALERT_TOP_1: "RainLoop Webmail je licencovanĂ˝ pod" TYPE_PREMIUM_LIFETIME: "DoĹľivotná" BUTTON_PURCHASE: "KĂşpiĹĄ" BUTTON_TRIAL: "Skúšobná verzia" TAB_ABOUT: LEGEND_ABOUT: "O programe" LABEL_TAG_HINT: "JednoduchĂ˝, modernĂ˝ a rĂ˝chly webmail klient" LABEL_ALL_RIGHTS_RESERVED: "Všetky práva vyhradenĂ©." HINT_READ_CHANGE_LOG: "ProsĂ­m preÄŤĂ­tajte si zoznam zmien pred aktualizáciou." HINT_IS_UP_TO_DATE: "RainLoop je aktuálny." HTML_NEW_VERSION: "Dostupná nová %VERSION% verzia." LABEL_UPDATING: "Aktualizujem" LABEL_CHECKING: "Kontrolujem aktualizácie" BUTTON_UPDATE: "AktualizovaĹĄ" BUTTON_DOWNLOAD: "StiahnuĹĄ" BUTTON_CHANGELOG: "Zoznam zmien" POPUPS_ACTIVATE: TITLE_ACTIVATION: "Aktivácia..." LABEL_DOMAIN: "DomĂ©na" BUTTON_ACTIVATE: "AktivovaĹĄ" LABEL_ACTIVATED: "AktivovanĂ©" POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "PridaĹĄ alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "DomĂ©na" BUTTON_CLOSE: "ZatvoriĹĄ" BUTTON_ADD: "PridaĹĄ" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "PridaĹĄ domĂ©nu" TITLE_ADD_DOMAIN_WITH_NAME: "PridaĹĄ domĂ©nu \"%NAME%\"" TITLE_EDIT_DOMAIN: "UpraviĹĄ domĂ©nu \"%NAME%\"" LABEL_NAME: "Meno" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "BezpeÄŤnĂ©" LABEL_WHITE_LIST: "Zoznam povolenĂ˝ch" SECURE_OPTION_NONE: "Ĺ˝iadne" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "PovoliĹĄ Sieve skripty" LABEL_USE_SHORT_LOGIN: "PouĹľiĹĄ skrátenĂ© prihlásenie" LABEL_USE_AUTH: "PouĹľiĹĄ overenie" LABEL_USE_PHP_MAIL: "PouĹľiĹĄ php mail() funkciu" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Zoznam povolenĂ˝ch" BUTTON_SIEVE_CONFIGURATION: "Nastavenia Sieve" BUTTON_BACK_TO_IMAP: "Späť do IMAP nastavenĂ­" BUTTON_BACK: "Späť" BUTTON_CLOSE: "ZatvoriĹĄ" BUTTON_ADD: "PridaĹĄ" BUTTON_UPDATE: "AktualizovaĹĄ" POPUPS_PLUGIN: TITLE_PLUGIN: "Doplnok" BUTTON_CLOSE: "ZatvoriĹĄ" BUTTON_SAVE: "UloĹľiĹĄ" TOOLTIP_ABOUT_TITLE: "O programe" POPUPS_LANGUAGES: TITLE_LANGUAGES: "ZvoÄľte jazyk" HINTS: BETA: "beta" UNSTABLE: "nestabilnĂ©" WARNING: "Upozornenie!" NOT_SUPPORTED: "nie je podporovanĂ©" REQUIRES_PHP_54: "vyĹľaduje PHP 5.4 alebo vyššie" ERRORS: DOMAIN_ALREADY_EXISTS: "Táto DomĂ©na uĹľ existuje" UNKNOWN_ERROR: "Neznáma chyba" NOTIFICATIONS: INVALID_TOKEN: "NeplatnĂ˝ token" AUTH_ERROR: "Overenie zlyhalo" ACCESS_ERROR: "Chyba prĂ­stupu" CONNECTION_ERROR: "Nepodarilo sa pripojiĹĄ k serveru" CAPTCHA_ERROR: "Nesprávne CAPTCHA." DOMAIN_NOT_ALLOWED: "DomĂ©na nie je povolená" ACCOUNT_NOT_ALLOWED: "Účet nie je povolenĂ˝" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "DvojfaktorovĂ© overenie vyĹľadovanĂ©" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvojfaktorovĂ©ho overenia" COULD_NOT_SAVE_NEW_PASSWORD: "Nepodarilo sa uloĹľiĹĄ novĂ© heslo" CURRENT_PASSWORD_INCORRECT: "ChybnĂ© aktuálne heslo" NEW_PASSWORD_SHORT: "Heslo je prĂ­liš krátke" NEW_PASSWORD_WEAK: "Heslo je prĂ­liš jednoduchĂ©" NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje nepovolenĂ© znaky" CONTACTS_SYNC_ERROR: "Chyba synchronizovania kontaktov" CANT_GET_MESSAGE_LIST: "Chyba pri vytváranĂ­ zoznamu správ." CANT_GET_MESSAGE: "Správu sa nepodarilo naÄŤĂ­taĹĄ" CANT_DELETE_MESSAGE: "Správu sa nepodarilo odstrániĹĄ" CANT_MOVE_MESSAGE: "Správu sa nepodarilo presunúť" CANT_SAVE_MESSAGE: "Správu sa nepodarilo uloĹľiĹĄ" CANT_SEND_MESSAGE: "Správu sa nepodarilo odoslaĹĄ" INVALID_RECIPIENTS: "NeplatnĂ˝ prĂ­jemcovia" CANT_SAVE_FILTERS: "Nepodarilo sa uloĹľiĹĄ filtre" CANT_GET_FILTERS: "Nepodarilo sa naÄŤĂ­taĹĄ filtre" FILTERS_ARE_NOT_CORRECT: "Filtre nie sĂş správne" CANT_CREATE_FOLDER: "PrieÄŤinok sa nepodarilo vytvoriĹĄ" CANT_RENAME_FOLDER: "PrieÄŤinok sa nepodarilo premenovaĹĄ" CANT_DELETE_FOLDER: "PrieÄŤinok sa nepodarilo odstrániĹĄ" CANT_DELETE_NON_EMPTY_FOLDER: "NemĂ´Ĺľem odstrániĹĄ neprázdny prieÄŤinok" CANT_SAVE_SETTINGS: "Nastavenia sa nepodarilo uloĹľiĹĄ" CANT_SAVE_PLUGIN_SETTINGS: "Nastavenia sa nepodarilo uloĹľiĹĄ" DOMAIN_ALREADY_EXISTS: "Táto DomĂ©na uĹľ existuje" CANT_INSTALL_PACKAGE: "Inštalácia balĂ­ÄŤka zlyhala" CANT_DELETE_PACKAGE: "Odstránenie balĂ­ÄŤka zlyhalo" LICENSING_DOMAIN_EXPIRED: "Prihlásenie pre tĂşto domĂ©nu vypršalo." LICENSING_DOMAIN_BANNED: "Prihlásenie pre tĂşto domĂ©nu je zablokovanĂ©." ACCOUNT_ALREADY_EXISTS: "Účet uĹľ existuje" ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" MAIL_SERVER_ERROR: "Nastala chyba poÄŤas prĂ­stupu na poštovĂ˝ server" UNKNOWN_ERROR: "Neznáma chyba" STATIC: BACK_LINK: "ObnoviĹĄ" DOMAIN_LIST_DESC: "Zoznam domĂ©n ku ktorĂ˝m je povolenĂ© pristupovaĹĄ cez webmail." PHP_EXSTENSIONS_ERROR_DESC: "VyĹľadovanĂ© PHP rozšírenia nie sĂş dostupnĂ© vo vašej PHP konfigurácii!" PHP_VERSION_ERROR_DESC: "Vaša PHP verzia (%VERSION%) je nižšia ako minimálne vyĹľadovaná 5.3.0!" NO_SCRIPT_TITLE: "Táto aplikácia vyĹľaduje JavaScript." NO_SCRIPT_DESC: | Váš internetovĂ˝ prehliadaÄŤ nepodporuje JavaScript. ProsĂ­m povoÄľte podporu JavaScriptu v nastaveniach vášho internetovĂ©ho prehliadaÄŤa a skĂşste to znova. NO_COOKIE_TITLE: "Táto aplikácia vyĹľaduje podporu Cookies." NO_COOKIE_DESC: | Váš internetovĂ˝ prehliadaÄŤ nepodporuje Cookies. ProsĂ­m povoÄľte podporu Cookies v nastaveniach vášho internetovĂ©ho prehliadaÄŤa a skĂşste to znova. BAD_BROWSER_TITLE: "Používate zastaralĂ˝ internetovĂ˝ prehliadaÄŤ." rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml000066400000000000000000000354661361462701300256760ustar00rootroot00000000000000sl_SI: LOGIN: LABEL_LOGIN: "Prijava" LABEL_PASSWORD: "Geslo" BUTTON_LOGIN: "Prijava v administracijsko ploščo" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Administracijska plošča" TABS_LABELS: LABEL_GENERAL_NAME: "Splošno" LABEL_LOGIN_NAME: "Prijava" LABEL_BRANDING_NAME: "Prilagoditev" LABEL_CONTACTS_NAME: "Stiki" LABEL_DOMAINS_NAME: "Domene" LABEL_SECURITY_NAME: "Varnost" LABEL_INTEGRATION_NAME: "Integracije" LABEL_PLUGINS_NAME: "VtiÄŤniki" LABEL_PACKAGES_NAME: "Paketi" LABEL_LICENSING_NAME: "Licence" LABEL_ABOUT_NAME: "VeÄŤ o" TAB_GENERAL: LEGEND_INTERFACE: "Vmesnik" LABEL_LANGUAGE: "Jezik" LABEL_LANGUAGE_ADMIN: "Jezik (administrator)" LABEL_THEME: "Tema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Dovoli izbor jezika v nastavitvah" LABEL_ALLOW_THEMES_ON_SETTINGS: "Dovoli izbor teme v nastavitvah" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Dovoli izbor ozadja v nastavitvah" LABEL_NEW_FOLDER_MOVE: "Novi gumb \"Premakni v mapo\"" LABEL_SHOW_THUMBNAILS: "PokaĹľi predoglede (priloge)" LABEL_ALLOW_GRAVATAR: "Dovoli Gravatar" LEGEND_MAIN: "Glavno" LABEL_ATTACHMENT_SIZE_LIMIT: "Omejitev velikosti prilog" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Dovoli dodatne raÄŤune" LABEL_ALLOW_IDENTITIES: "Dovoli veÄŤ identitet" LABEL_ALLOW_TEMPLATES: "Dovoli predloge" ALERT_DATA_ACCESS: "Mapa z RainLoop podatki je prosto ogledljiva. Prosimo, nastavite streĹľnik, da skrije mapo pred zunanjimi dostopi. Preberite veÄŤ tukaj:" ALERT_WARNING: "Pozor!" HTML_ALERT_WEAK_PASSWORD: | V uporabi je privzeto geslo administratorja
Iz varnostnih razlogov spremenite geslo v nekaj drugega. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Prijavni zaslon" LABEL_DEFAULT_DOMAIN: "Privzeta domena" LABEL_DETERMINE_USER_DOMAIN: "Poskusi ugotoviti domeno uporabnika" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Dovoli izbor jezika na prijavnem zaslonu" LABEL_DETERMINE_USER_LANGUAGE: "Poskusi ugotoviti jezik uporabnika" TAB_BRANDING: LEGEND_BRANDING: "Prilagoditev" LABEL_PAGE_TITLE: "Naslov strani" LABEL_LOADING_DESCRIPTION: "Opis med nalaganjem" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Prijava" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Opis" LABEL_LOGIN_BACKGROUND: "Ozadje" LABEL_LOGIN_CUSTOM_CSS: "CSS po meri" LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaži povezavo \"Powered by RainLoop\"" LEGEND_USER: "Uporabnik" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Naziv loga" LABEL_USER_LOGO_MESSAGE: "Logo (pogled sporočil)" LABEL_USER_CUSTOM_CSS: "CSS po meri" LEGEND_WELCOME_PAGE: "Pozdravna stran" LABEL_WELCOME_PAGE_TITLE: "Naslov" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Prikaz" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Brez" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Enkrat" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vedno" HTML_ALERT_PREMIUM: "Ta funkcija je na voljo samo za Premium uporabnike." TAB_CONTACTS: LEGEND_CONTACTS: "Stiki" LEGEND_STORAGE: "Shramba (PDO)" LABEL_ENABLE_CONTACTS: "Omogoči stike" LABEL_ALLOW_SYNC: "Dovoli sinhronizacijo stikov (zunanji CardDAV strežnik)" LABEL_STORAGE_TYPE: "Tip" LABEL_STORAGE_DSN: "Ime podatkovnega vira (DSN)" LABEL_STORAGE_USER: "Uporabnik" LABEL_STORAGE_PASSWORD: "Geslo" BUTTON_TEST: "Preizkus" ALERT_NOTICE: "Obvestilo!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ta tip podatkovne baze ni priporočljiv za večje število uporabnikov." HTML_ALERT_DOES_NOT_SUPPORTED: | Sistem ne podpira stikov.
Namestite ali omogočite PDO (SQLite / MySQL / PostgreSQL) razširitev na strežniku. TAB_DOMAINS: LEGEND_DOMAINS: "Domene" BUTTON_ADD_DOMAIN: "Dodaj domeno" BUTTON_ADD_ALIAS: "Dodaj vzdevek" DELETE_ARE_YOU_SURE: "Ste prepričani?" HTML_DOMAINS_HELPER: | Seznam domen, do katerih je omogočen dostop.
Kliknite ime za konfiguracijo domene. TAB_SECURITY: LEGEND_SECURITY: "Varnost" LABEL_ALLOW_TWO_STEP: "Dovoli 2-stopenjsko overjanje" LABEL_FORCE_TWO_STEP: "Prisili 2-stopenjsko overjanje" LABEL_USE_IMAGE_PROXY: "Uporabni lokalni posredniški strežnik za zunanje slike" LABEL_ALLOW_OPEN_PGP: "Dovoli OpenPGP" LABEL_SHOW_PHP_INFO: "Prikaz PHP informacij" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Prijavni podatki za administracijsko ploščo" LABEL_CURRENT_PASSWORD: "Trenutno geslo" LABEL_NEW_LOGIN: "Novo uporabniško ime" LABEL_NEW_PASSWORD: "Novo geslo" LABEL_REPEAT_PASSWORD: "Ponovno" BUTTON_UPDATE_PASSWORD: "Posodobi geslo" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Obvezno overjanje uporabljenega SSL certifikata (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Dovoli samopodpisane certifikate" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Omogoči integracijo z Google računom" LABEL_GOOGLE_AUTH: "Pooblastilo" LABEL_GOOGLE_DRIVE: "Integracija Google Drive (pogled sestavljanja)" LABEL_GOOGLE_PREVIEW: "Integracija Google Viewer (Predogled za datoteke Microsoft Word, Excel in PowerPoint)" LABEL_GOOGLE_CLIENT_ID: "ID odjemalca" LABEL_GOOGLE_CLIENT_SECRET: "Skrivnost odjemalca" LABEL_GOOGLE_API_KEY: "API ključ" HINT_GOOGLE_API_KEY: "Potrebno za Google Drive izbirnik datotek" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Omogoči Facebook integracijo (Pooblastilo)" LABEL_FACEBOOK_APP_ID: "ID aplikacije" LABEL_FACEBOOK_APP_SECRET: "Skrivnost aplikacije" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Omogoči Twitter integracijo (Pooblastilo)" LABEL_TWITTER_CONSUMER_KEY: "Ključ porabnika" LABEL_TWITTER_CONSUMER_SECRET: "Skrivnost porabnika" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Omogoči Dropbox integracijo" LABEL_DROPBOX_API_KEY: "API ključ" TOP_ALERT: "Podrobne informacije o integraciji z družabnimi omrežji so dostopne na" TAB_PLUGINS: LEGEND_PLUGINS: "Vtičniki" LABEL_ENABLE_PLUGINS: "Omogoči vtičnike" ALERT_NO_PLUGINS: "Ni nameščenih vtičnikov." LINK_INSTALL_NEW: "Kliknite sem za namestitev novih!" HINT_CLICK_NAME: "Kliknite na ime, da konfigurirate vtičnik." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Na voljo za posodobitev" LEGEND_AVAILABLE_FOR_INSTALLATION: "Na voljo za namestitev" LEGEND_INSTALLED_PACKAGES: "Nameščeni paketi" ALERT_CANNOT_ACCESS_REPOSITORY: "Trenutno ni možen dostop do repozitorija" TAB_LICENSING: LABEL_YOUR_DOMAIN: "Vaša domena" LABEL_VERSION: "Verzija" LABEL_CHECKING: "Preverjanje" TYPE_BASIC_HINT: "Ta domena nima licence za komercialno uporabo (z dodatnimi funkcijami)." TYPE_BASIC_HINT_2: "Ni mogoče pridobiti licence za to domeno." HTML_ALERT_TOP_1: "RainLoop Webmail izdana pod licenco" HTML_ALERT_TOP_2: "Smete jo prosto in zastonj uporabljati za osebne projekte." HTML_ALERT_TOP_3: | Za komercialno uporabo (z dodatnimi funkcijami) RainLoop Webmail je potrebno pridobiti naročnino. TYPE_PREMIUM_LIFETIME: "Obdobje" LABEL_SUB_EXPIRES: "Naročnina poteče" BUTTON_ACTIVATE: "Aktiviraj naročniški ključ za to domeno" BUTTON_PURCHASE: "Kupi" BUTTON_TRIAL: "Preizkusi" TAB_ABOUT: LEGEND_ABOUT: "Več o" LABEL_TAG_HINT: "Preprost, sodoben, in hiter spletni e-poštni odjemalec" LABEL_ALL_RIGHTS_RESERVED: "Vse pravice pridržane." HINT_READ_CHANGE_LOG: "Preberite dnevnik sprememb pred posodobitvijo." HINT_IS_UP_TO_DATE: "Ni novih posodobitev." HTML_NEW_VERSION: "Na voljo je nova verzija %VERSION%." LABEL_UPDATING: "Posodabljanje" LABEL_CHECKING: "Preverjanje za posdodobitve" BUTTON_UPDATE: "Posodobi" BUTTON_DOWNLOAD: "Prenesi" BUTTON_CHANGELOG: "Dnevnik sprememb" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Aktiviram naročniški ključ?" TITLE_ACTIVATION: "Aktiviranje..." LABEL_DOMAIN: "Domena" LABEL_SUB_KEY: "Naročniški ključ" BUTTON_ACTIVATE: "Aktiviraj" LABEL_ACTIVATED: "Aktivirano" ERROR_INVALID_SUBS_KEY: "Neveljaven naročniški ključ" SUBS_KEY_ACTIVATED: "Naročniški ključ je bil uspešno aktiviran" HTML_DESC: | Po aktivaciji bo premium naročnina za %DOMAIN% podaljšana.
Naročniški ključ je lahko uporabljen zgolj za eno domeno.

Po začetku procesa aktivacije ni mogoče prekiniti ali preklicati. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Dodajanje domene" LABEL_ALIAS: "Vzdevek" LABEL_DOMAIN: "Domena" BUTTON_CLOSE: "Zapri" BUTTON_ADD: "Dodaj" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Dodajanje domene" TITLE_ADD_DOMAIN_WITH_NAME: "Dodajanje domene \"%NAME%\"" TITLE_EDIT_DOMAIN: "Urejanje domene \"%NAME%\"" LABEL_NAME: "Ime" NAME_HELPER: "podpora za nadomestne znake" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Strežnik" LABEL_PORT: "Vrata" LABEL_SECURE: "Varno" LABEL_WHITE_LIST: "Bela lista" SECURE_OPTION_NONE: "Nobeno" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Dovoljene sieve skripte" LABEL_ALLOW_USER_SCRIPT: "Dovoljene uporabniške skripte po meri" LABEL_USE_SHORT_LOGIN: "Uporaba uporabniškega imena brez domene" LABEL_USE_AUTH: "Uporaba overjanja" LABEL_USE_PHP_MAIL: "Uporaba php mail() funkcije" BUTTON_TEST: "Preizkus" BUTTON_WHITE_LIST: "Dodaj na belo listo" BUTTON_SIEVE_CONFIGURATION: "Konfiguriraj Sieve" BUTTON_BACK_TO_IMAP: "Nazaj na nastavitve IMAP" BUTTON_BACK: "Nazaj" BUTTON_CLOSE: "Zapri" BUTTON_ADD: "Dodaj" BUTTON_UPDATE: "Posodobi" NEW_DOMAIN_DESC: "Ta konfiguiracija domene bo omogočala delo
z %NAME% e-naslovi." WHITE_LIST_ALERT: | Seznam uporabnikov domene, do katerih je omogočen dostop. Uporabnike ločite s presledkom. POPUPS_PLUGIN: TITLE_PLUGIN: "Vtičnik" DESC_NOTHING_TO_CONFIGURE: "Ni nastavitev za spreminjati" BUTTON_CLOSE: "Zapri" BUTTON_SAVE: "Shrani" TOOLTIP_ABOUT_TITLE: "Več o" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Želite zapreti to okno?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Izberite jezik" HINTS: BETA: "beta" UNSTABLE: "nestabilno" WARNING: "Pozor!" NOT_SUPPORTED: "ni podprto" REQUIRES_PHP_54: "zahteva PHP 5.4 ali več" ERRORS: DOMAIN_ALREADY_EXISTS: "Domena že obstaja" UNKNOWN_ERROR: "Neznana napaka" NOTIFICATIONS: INVALID_TOKEN: "Neveljaven žeton" AUTH_ERROR: "Spodletelo overjanje" ACCESS_ERROR: "Napaka dostopa" CONNECTION_ERROR: "Neuspešna povezava s strežnikom" CAPTCHA_ERROR: "Napačen CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki za E-pošto in omogočite to v nastavitvah računa. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki za E-pošto in omogočite to v nastavitvah računa. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Ta družabni ID ni še določen nobenemu E-poštnemu računu. Prijavite se z podatki za E-pošto in omogočite to v nastavitvah računa. DOMAIN_NOT_ALLOWED: "Domena ni dovoljena" ACCOUNT_NOT_ALLOWED: "Račun ni dovoljen" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Obvezno 2-stopenjsko overjanje" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Napaka 2-stopenjskega overjanja" COULD_NOT_SAVE_NEW_PASSWORD: "Ni bilo mogoče shraniti novega gesla" CURRENT_PASSWORD_INCORRECT: "Napačno trenutno geslo" NEW_PASSWORD_SHORT: "Prekratko geslo" NEW_PASSWORD_WEAK: "Preveč enostavno geslo" NEW_PASSWORD_FORBIDDENT: "Geslo vsebuje nedovoljene znake" CONTACTS_SYNC_ERROR: "Napaka sinhronizacije stikov" CANT_GET_MESSAGE_LIST: "Ni bilo mogoče pridobiti seznama sporočil" CANT_GET_MESSAGE: "Ni bilo mogoče pridobiti sporočila" CANT_DELETE_MESSAGE: "Ni bilo mogoče izbrisati sporočila" CANT_MOVE_MESSAGE: "Ni mogoče premakniti sporočila" CANT_SAVE_MESSAGE: "Ni mogoče shraniti sporočila" CANT_SEND_MESSAGE: "Ni mogoče poslati sporočila" INVALID_RECIPIENTS: "Neveljavni prejemniki" CANT_SAVE_FILTERS: "Ni mogoče shraniti filtrov" CANT_GET_FILTERS: "Ni mogoče pridobiti filtrov" FILTERS_ARE_NOT_CORRECT: "Filtri so nepravilni" CANT_CREATE_FOLDER: "Ni mogoče ustvariti mape" CANT_RENAME_FOLDER: "Ni mogoče preimenovati mape" CANT_DELETE_FOLDER: "Ni mogoče izbrisati mape" CANT_DELETE_NON_EMPTY_FOLDER: "Ni mogoče izbrisati neprazne mape" CANT_SUBSCRIBE_FOLDER: "Ni mogoče slediti mapi" CANT_UNSUBSCRIBE_FOLDER: "Ni mogoče prenehati slediti mapi" CANT_SAVE_SETTINGS: "Ni mogoče shraniti nastavitev" CANT_SAVE_PLUGIN_SETTINGS: "Ni mogoče shraniti nastavitev" DOMAIN_ALREADY_EXISTS: "Domena že obstaja" CANT_INSTALL_PACKAGE: "Neuspešna namestitev paketa" CANT_DELETE_PACKAGE: "Neuspešno odstranjevanje paketa" INVALID_PLUGIN_PACKAGE: "Neveljaven paket vtičnika" UNSUPPORTED_PLUGIN_PACKAGE: "Nepodprt paket vtičnika" LICENSING_SERVER_IS_UNAVAILABLE: "Naročniški strežnik ni dosegljiv" LICENSING_DOMAIN_EXPIRED: "Naročnina na to domeno je potekla." LICENSING_DOMAIN_BANNED: "Naročnina na to domeno ni dovoljena" DEMO_SEND_MESSAGE_ERROR: "Iz varnostnih razlogov ta račun ne sme pošiljati pošte na zunanje e-naslove!" DEMO_ACCOUNT_ERROR: "Iz varnostnih razlogov ta račun ne sme izvršiti tega dejanja!" ACCOUNT_ALREADY_EXISTS: "Račun že obstaja" ACCOUNT_DOES_NOT_EXIST: "Račun ne obstaja" MAIL_SERVER_ERROR: "Napaka pri dostopu do poštnega strežnika" INVALID_INPUT_ARGUMENT: "Neveljaven vhodni argument" UNKNOWN_ERROR: "Neznana napaka" STATIC: BACK_LINK: "Ponovno naloži" DOMAIN_LIST_DESC: "Seznam domen, na katere je dovoljen dostop" PHP_EXSTENSIONS_ERROR_DESC: "Potrebne PHP razširitve niso omogočene v vaši PHP nastavitveni datoteki!" PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogočen JavaScript." NO_SCRIPT_DESC: | Brskalnik nima podpore za JavaScript. Omogočite JavaScript v brskalniku in poskusite znova. NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogočene piškotke." NO_COOKIE_DESC: | Brskalnik nima omogočenih piškotkov. Omogočite piškotke v brskalniku in poskusite znova. BAD_BROWSER_TITLE: "Brskalnik je zastarel." BAD_BROWSER_DESC: | Za uporabo vseh funkcij te aplikacije prenesite in namestite enega od teh brskalnikov: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml000066400000000000000000000360331361462701300256730ustar00rootroot00000000000000sv_SE: LOGIN: LABEL_LOGIN: "Logga in" LABEL_PASSWORD: "Lösenord" BUTTON_LOGIN: "Logga in till admin-panelen" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Adminpanel" TABS_LABELS: LABEL_GENERAL_NAME: "Allmän" LABEL_LOGIN_NAME: "Logga in" LABEL_BRANDING_NAME: "Branding" LABEL_CONTACTS_NAME: "Kontakter" LABEL_DOMAINS_NAME: "Domäner" LABEL_SECURITY_NAME: "Säkerhet" LABEL_INTEGRATION_NAME: "integrationer" LABEL_PLUGINS_NAME: "Plugins" LABEL_PACKAGES_NAME: "Paket" LABEL_LICENSING_NAME: "Licensiering" LABEL_ABOUT_NAME: "Om" TAB_GENERAL: LEGEND_INTERFACE: "Gränssnitt" LABEL_LANGUAGE: "Språk" LABEL_LANGUAGE_ADMIN: "Språk (administratör)" LABEL_THEME: "Tema" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Tillåt språkändringar på konfigurationspanelen " LABEL_ALLOW_THEMES_ON_SETTINGS: "Tillåt tema val på konfigurationspanelen" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Tillåt bakgrundsändringar på konfigurationspanelen" LABEL_NEW_FOLDER_MOVE: "Ny \"Flytta mapp\" knapp" LABEL_SHOW_THUMBNAILS: "Visa miniatyrer (bilagor)" LABEL_ALLOW_GRAVATAR: "Tillåt Gravatar" LEGEND_MAIN: "Huvud" LABEL_ATTACHMENT_SIZE_LIMIT: "Bilagor storlek" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillåt ytterligare konton" LABEL_ALLOW_IDENTITIES: "Tillåt multiidentiteter" LABEL_ALLOW_TEMPLATES: "Tillåt mallar" ALERT_DATA_ACCESS: "RainLoops datamapp är åtkomstbar. Var vänlig konfigurera din webb-server för att förhindra extern åtkomst och synlighet. Läs mer här: " ALERT_WARNING: "Varning!" HTML_ALERT_WEAK_PASSWORD: | Du använder standardlösenord.
För säkerhetsskäl ändra lösenord till något annat TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Inloggningsskärm" LABEL_DEFAULT_DOMAIN: "Standarddomän" LABEL_DETERMINE_USER_DOMAIN: "Försök att bestämma användardomän" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Tillåt språkändringar på inloggningsskärmen" LABEL_DETERMINE_USER_LANGUAGE: "Försök att bestämma användarens språk" TAB_BRANDING: LEGEND_BRANDING: "Branding" LABEL_PAGE_TITLE: "Namn på sidan" LABEL_LOADING_DESCRIPTION: "Laddar beskrivning" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Logga in" LABEL_LOGIN_LOGO: "Logotyp" LABEL_LOGIN_DESCRIPTION: "Beskrivning" LABEL_LOGIN_BACKGROUND: "Bakgrund" LABEL_LOGIN_CUSTOM_CSS: "Anpassad CSS" LABEL_LOGIN_SHOW_POWERED_LINK: "Visa \"Powered by RainLoop\" länk" LEGEND_USER: "Användare" LABEL_USER_LOGO: "Logotyp" LABEL_USER_LOGO_TITLE: "Logotyp namn" LABEL_USER_LOGO_MESSAGE: "Logo (Visa meddelande)" LABEL_USER_CUSTOM_CSS: "Anpassad CSS" LEGEND_WELCOME_PAGE: "Välkomstsida" LABEL_WELCOME_PAGE_TITLE: "Titel" LABEL_WELCOME_PAGE_URL: "URL" LABEL_WELCOME_PAGE_DISPLAY: "Visa" OPTION_WELCOME_PAGE_DISPLAY_NONE: "Ingen" OPTION_WELCOME_PAGE_DISPLAY_ONCE: "En gång" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Alltid" HTML_ALERT_PREMIUM: "Denna funktion är tillgänglig för Premium abonnenter." TAB_CONTACTS: LEGEND_CONTACTS: "Kontakter" LEGEND_STORAGE: "Storage (PDO)" LABEL_ENABLE_CONTACTS: "göra det möjligt för kontakterna" LABEL_ALLOW_SYNC: "Tillåt kontakter synkronisering (med extern CardDAV server)" LABEL_STORAGE_TYPE: "Typ" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Användare" LABEL_STORAGE_PASSWORD: "Lösenord" BUTTON_TEST: "Test" ALERT_NOTICE: "Notis" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Använd inte denna typ av databas med ett stort antal aktiva användare." HTML_ALERT_DOES_NOT_SUPPORTED: | Systemet stöder inte kontakter
Du behöver installera eller aktivera SUB (SQLite/MySQL/PostgreSQL) förlängning på server. TAB_DOMAINS: LEGEND_DOMAINS: "Domäner" BUTTON_ADD_DOMAIN: "Lägg till domän" BUTTON_ADD_ALIAS: "Lägg till Alias" DELETE_ARE_YOU_SURE: "Är du säker?" HTML_DOMAINS_HELPER: | Lista med domäner webmail tillåts access.
Klicka på namnet för att konfigurera domain. TAB_SECURITY: LEGEND_SECURITY: "Säkerhet" LABEL_ALLOW_TWO_STEP: "Låt 2-tvåstegsverifiering" LABEL_FORCE_TWO_STEP: "Driva 2-tvåstegsverifiering" LABEL_USE_IMAGE_PROXY: "Använd lokal proxy för externa bilder" LABEL_ALLOW_OPEN_PGP: "Tillåt OpenPGP" LABEL_SHOW_PHP_INFO: "Visa PHP-information" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Administrativsuppgifter" LABEL_CURRENT_PASSWORD: "Nuvarande lösenord" LABEL_NEW_LOGIN: "Ny inloggning" LABEL_NEW_PASSWORD: "Nytt lösenord" LABEL_REPEAT_PASSWORD: "Upprepa" BUTTON_UPDATE_PASSWORD: "Uppdatera lösenord" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Kräver verifiering av SSL-certifikat som används (IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "Låt självsignerade certifikat" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Aktivera Google Integration" LABEL_GOOGLE_AUTH: "Tillstånd" LABEL_GOOGLE_DRIVE: "Google Drive Integration (Compose view)" LABEL_GOOGLE_PREVIEW: "Google Viewer Integration (Preview för Microsoft Word, Excel och PowerPoint-filer)" LABEL_GOOGLE_CLIENT_ID: "Client ID" LABEL_GOOGLE_CLIENT_SECRET: "Client Secret" LABEL_GOOGLE_API_KEY: "Api Nyckel" HINT_GOOGLE_API_KEY: "Nödvändigt för Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Aktivera Facebook Integration (Tillstånd)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Aktivera Twitter Integration (Tillstånd)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Aktivera Dropbok Integration" LABEL_DROPBOX_API_KEY: "Api Key" TOP_ALERT: "Detaljerad information om social integration återfinns på" TAB_PLUGINS: LEGEND_PLUGINS: "Plugin" LABEL_ENABLE_PLUGINS: "Aktivera Plugin" ALERT_NO_PLUGINS: "Inga plugin har ännu blivit installerade" LINK_INSTALL_NEW: "Klicka här för att installera nya" HINT_CLICK_NAME: "Klicka på namnet för att konfigurera pluginet" TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Tillåt uppdateringar" LEGEND_AVAILABLE_FOR_INSTALLATION: "Tillåt installation" LEGEND_INSTALLED_PACKAGES: "installerade paket" ALERT_CANNOT_ACCESS_REPOSITORY: "Det går inte att komma åt arkivet för tillfället." TAB_LICENSING: LABEL_YOUR_DOMAIN: "Din domän" LABEL_VERSION: "Version" LABEL_CHECKING: "Kontroll" TYPE_BASIC_HINT: "Denna domän är inte godkänt för kommersiellt bruk (med ytterligare funktioner)." TYPE_BASIC_HINT_2: "Denna domän kan inte licensieras." HTML_ALERT_TOP_1: "RainLoop Webmail är licensierat under" HTML_ALERT_TOP_2: "Du är gratis för att använda den för dina personliga projekt." HTML_ALERT_TOP_3: | Kommersiellt bruk (med ytterligare funktioner) av RainLoop Webmail kräver att få prenumerations. TYPE_PREMIUM_LIFETIME: "Livstid" LABEL_SUB_EXPIRES: "Abonnemang löper ut" BUTTON_ACTIVATE: "Aktivera prenumerationsnyckel för den här domänen" BUTTON_PURCHASE: "Inköp" BUTTON_TRIAL: "Rättegång" TAB_ABOUT: LEGEND_ABOUT: "Om" LABEL_TAG_HINT: "Enkel, modern & snabb e-postklient" LABEL_ALL_RIGHTS_RESERVED: "Alla rättigheter förbehållna." HINT_READ_CHANGE_LOG: "Vänligen läs ändringsloggen innan du uppdaterar." HINT_IS_UP_TO_DATE: "RainLoop är aktuell." HTML_NEW_VERSION: "Ny %VERSION% version är tillgänglig" LABEL_UPDATING: "Uppdaterar" LABEL_CHECKING: "Letar efter uppdaterar" BUTTON_UPDATE: "Uppdatera" BUTTON_DOWNLOAD: "Ladda ner" BUTTON_CHANGELOG: "Ändringslogg" POPUPS_ACTIVATE: TITLE_ACTIVATE: "Aktivera prenumerationsnyckel?" TITLE_ACTIVATION: "Aktivering..." LABEL_DOMAIN: "Domän" LABEL_SUB_KEY: "Prenumerationsnyckel" BUTTON_ACTIVATE: "Aktivera" LABEL_ACTIVATED: "Aktiverad" ERROR_INVALID_SUBS_KEY: "Ogiltig prenumerationsnyckel" SUBS_KEY_ACTIVATED: "Lyckades aktivera prenumerationsnyckel" HTML_DESC: | Efter aktivering, premium prenumeration för %DOMAIN% kommer att förängas.
Observera att prenumerationsnyckel kan aktiveras för en enda domän.

När processen för aktivering har påbörjats så kan den inte avbrytas. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Lägg till Alias" LABEL_ALIAS: "Alias" LABEL_DOMAIN: "Domän" BUTTON_CLOSE: "Stäng" BUTTON_ADD: "Lägg till" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Lägg till domän" TITLE_ADD_DOMAIN_WITH_NAME: "Lägg till domän \"%NAME%\"" TITLE_EDIT_DOMAIN: "Ändra domän \"%NAME%\"" LABEL_NAME: "Namn" NAME_HELPER: "jokertecken stöds" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Säkerhet" LABEL_WHITE_LIST: "Vitlista" SECURE_OPTION_NONE: "Ingen" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "StartTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "Tillåta sikt skript" LABEL_ALLOW_USER_SCRIPT: "Tillåt anpassade användarskript" LABEL_USE_SHORT_LOGIN: "Använda korta inloggning" LABEL_USE_AUTH: "Använd autentisering" LABEL_USE_PHP_MAIL: "Använd php mail() funktionen" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Vitlista" BUTTON_SIEVE_CONFIGURATION: "sil-konfiguration" BUTTON_BACK_TO_IMAP: "Tillbaka till IMAP inställningar" BUTTON_BACK: "Tillbaka" BUTTON_CLOSE: "Stäng" BUTTON_ADD: "Lägg till" BUTTON_UPDATE: "Uppdatera" NEW_DOMAIN_DESC: "Denna domän konfiguration gör att du kan arbeta
med %NAME% e-postadresser." WHITE_LIST_ALERT: | Lista över domänanvändare som tillĂĄts. Använda ett utrymme som avgränsare. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Inget att konfigurera" BUTTON_CLOSE: "Stäng" BUTTON_SAVE: "Spara" TOOLTIP_ABOUT_TITLE: "Om" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "Ă„r du säker pĂĄ att du vill stänga sidan?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Välj ditt sprĂĄk" HINTS: BETA: "beta" UNSTABLE: "instabil" WARNING: "Varning!" NOT_SUPPORTED: "stöds inte" REQUIRES_PHP_54: "kräver PHP 5.4 eller högre" ERRORS: DOMAIN_ALREADY_EXISTS: "Domänen finns redan" UNKNOWN_ERROR: "Okänt fel" NOTIFICATIONS: INVALID_TOKEN: "ogiltiga symboler" AUTH_ERROR: "Autentisering misslyckades" ACCESS_ERROR: "Ă…tkomstfel" CONNECTION_ERROR: "Kan inte ansluta till servern" CAPTCHA_ERROR: "Felaktigt CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Denna sociala ID inte tilldelas nĂĄgon e-postkonto ännu. Logga in med e-referenser och aktivera den här funktionen pĂĄ kontots inställningar. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >+ Denna sociala ID inte tilldelas nĂĄgon e-postkonto ännu. Logga in med e-referenser och aktivera den här funktionen pĂĄ kontots inställningar. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Denna sociala ID inte tilldelas nĂĄgon e-postkonto ännu. Logga in med e-referenser och aktivera denna funktion i kontoinställningarna. DOMAIN_NOT_ALLOWED: "Domänen är inte tillĂĄten" ACCOUNT_NOT_ALLOWED: "Kontot är inte tillĂĄtet" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "TvĂĄ faktor kontroll som krävs" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "TvĂĄ faktor verifiering fel" COULD_NOT_SAVE_NEW_PASSWORD: "Kan inte spara ditt nya lösenord" CURRENT_PASSWORD_INCORRECT: "Nuvarande lösenord är fel" NEW_PASSWORD_SHORT: "Lösenordet är för kort" NEW_PASSWORD_WEAK: "Lösenordet är för lätt" NEW_PASSWORD_FORBIDDENT: "Lösenordet innehĂĄller otillĂĄtna tecken" CONTACTS_SYNC_ERROR: "Kontaktsynkroniseringsfel" CANT_GET_MESSAGE_LIST: "Kan inte fĂĄ tag i dina meddelanden" CANT_GET_MESSAGE: "Det gĂĄr inte att fĂĄ tag i meddelanden" CANT_DELETE_MESSAGE: "Kan inte ta bort meddelande" CANT_MOVE_MESSAGE: "Kan inte flytta meddelande" CANT_SAVE_MESSAGE: "Kan inte spara meddelande" CANT_SEND_MESSAGE: "Kan inte skicka meddelande" INVALID_RECIPIENTS: "Ogiltiga mottagare" CANT_SAVE_FILTERS: "Kan inte spara filter" CANT_GET_FILTERS: "Det gĂĄr inte att fĂĄ filter" FILTERS_ARE_NOT_CORRECT: "Filter är inte korrekt" CANT_CREATE_FOLDER: "Kan inte skapa mapp" CANT_RENAME_FOLDER: "Kan inte ändra namn pĂĄ mappen" CANT_DELETE_FOLDER: "Kan inte ta bort mappen" CANT_DELETE_NON_EMPTY_FOLDER: "Kan inte ta bort mappar som innehĂĄller meddelanden" CANT_SUBSCRIBE_FOLDER: "Kan inte prenumerera pĂĄ mapp" CANT_UNSUBSCRIBE_FOLDER: "Kan inte avprenumerera pĂĄ mapp" CANT_SAVE_SETTINGS: "Kan inte spara inställningarna" CANT_SAVE_PLUGIN_SETTINGS: "Kan inte spara inställningarna" DOMAIN_ALREADY_EXISTS: "Domänen finns redan" CANT_INSTALL_PACKAGE: "Det gick inte att installera paketet" CANT_DELETE_PACKAGE: "Det gick inte att ta bort paket" INVALID_PLUGIN_PACKAGE: "Ogiltig plugin" UNSUPPORTED_PLUGIN_PACKAGE: "Pluginet stöds inte" LICENSING_SERVER_IS_UNAVAILABLE: "Prenumerations servern inte är tillgänglig" LICENSING_DOMAIN_EXPIRED: "Abonnemang för den här domänen har gĂĄtt ut." LICENSING_DOMAIN_BANNED: "Abonnemang för den här domänen är förbjudet." DEMO_SEND_MESSAGE_ERROR: "Av säkerhetsskäl är det här kontot inte tillĂĄtet att skicka meddelanden till externa e-postadresser!" DEMO_ACCOUNT_ERROR: "Av säkerhetsskäl är det här kontot inte tillĂĄtet för denna ĂĄtgärd!" ACCOUNT_ALREADY_EXISTS: "Kontot finns redan" ACCOUNT_DOES_NOT_EXIST: "Kontot finns inte" MAIL_SERVER_ERROR: "Kunde ansluta till mailservern" INVALID_INPUT_ARGUMENT: "Ogiltig inmatning argument" UNKNOWN_ERROR: "Okänt fel" STATIC: BACK_LINK: "Ladda om" DOMAIN_LIST_DESC: "Lista av domäner som tillĂĄsts" PHP_EXSTENSIONS_ERROR_DESC: "Krävs PHP förlängning inte är tillgängliga i din PHP-konfiguration!" PHP_VERSION_ERROR_DESC: "Din PHP version (%VERSION%) är lägre än den minimala som krävs 5.3.0!" NO_SCRIPT_TITLE: "JavaScript krävs för denna applikation." NO_SCRIPT_DESC: | JavaScript stöd är inte tillgängligt i din webläsare. Vänligen aktivera JavaScript stöd i din webbläsares inställningar och försök igen. NO_COOKIE_TITLE: "Cookies stöd krävs för denna applikation." NO_COOKIE_DESC: | Cookies stöd är inte tillgängligt i din webbläsare. Vänligen aktivera Cookie stöd i webbläsarens inställningar och försök igen. BAD_BROWSER_TITLE: "Din webbläsare är förĂĄldrad." BAD_BROWSER_DESC: | För att kunna använda alla funktioner i ansökan, hämta och installera en av dessa webbläsare: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml000066400000000000000000000325011361462701300256510ustar00rootroot00000000000000zh_CN: LOGIN: LABEL_LOGIN: "登陆" LABEL_PASSWORD: "密ç " BUTTON_LOGIN: "登录ĺ°ćާĺ¶éť˘ćťż" TOP_PANEL: LABEL_PREMIUM: "é«çş§" LABEL_ADMIN_PANEL: "控ĺ¶éť˘ćťż" TABS_LABELS: LABEL_GENERAL_NAME: "常规" LABEL_LOGIN_NAME: "登陆" LABEL_BRANDING_NAME: "Logo" LABEL_CONTACTS_NAME: "č”系人" LABEL_DOMAINS_NAME: "ĺźźĺŤ" LABEL_SECURITY_NAME: "安全" LABEL_INTEGRATION_NAME: "ć•´ĺ" LABEL_PLUGINS_NAME: "插件" LABEL_PACKAGES_NAME: "插件包" LABEL_LICENSING_NAME: "许可čŻ" LABEL_ABOUT_NAME: "关于" TAB_GENERAL: LEGEND_INTERFACE: "界面" LABEL_LANGUAGE: "语言" LABEL_LANGUAGE_ADMIN: "语言(ĺŽĺʰ)" LABEL_THEME: "主é˘" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "ĺ…许在设置界面中选择语言" LABEL_ALLOW_THEMES_ON_SETTINGS: "ĺ…许在设置界面中选择主é˘" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "ĺ…许在设置界面中选择čŚć™Ż" LABEL_SHOW_THUMBNAILS: "ćľç¤şçĽ©ç•Ąĺ›ľ(附件)" LABEL_ALLOW_GRAVATAR: "ĺ…许使用头ĺŹ" LEGEND_MAIN: "主" LABEL_ATTACHMENT_SIZE_LIMIT: "附件大小é™ĺ¶" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "ĺ…许额外的账ć·" LABEL_ALLOW_IDENTITIES: "ĺ…许多重身份" LABEL_ALLOW_TEMPLATES: "ĺ…许使用模板" ALERT_WARNING: "警告" HTML_ALERT_WEAK_PASSWORD: | 您正在使用é»č®¤çš„管ç†ĺ‘密ç 
安全起č§ďĽŚčŻ·ç«‹ĺŤłĺ°†ĺŻ†ç  ć›´ć”ą 为其他的字符串。 TAB_LOGIN: LEGEND_LOGIN_SCREEN: "登陆界面" LABEL_DEFAULT_DOMAIN: "é»č®¤ĺźźĺŤ" LABEL_DETERMINE_USER_DOMAIN: "尝试确定用ć·ĺźźĺŤ" LABEL_ALLOW_LANGUAGES_ON_LOGIN: "ĺ…许在登陆界面选择语言" LABEL_DETERMINE_USER_LANGUAGE: "尝试确定用ć·čݭ荀" TAB_BRANDING: LEGEND_BRANDING: "Logo" LABEL_PAGE_TITLE: "页面标é˘" LABEL_LOADING_DESCRIPTION: "正在加载介绍" LABEL_FAVICON_URL: "图标" LEGEND_LOGIN: "登陆" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "介绍" LABEL_LOGIN_BACKGROUND: "čŚć™Ż" LABEL_LOGIN_CUSTOM_CSS: "自定义CSS样式" LABEL_LOGIN_SHOW_POWERED_LINK: "ćľç¤ş\"Powered by RainLoop\"链接" LEGEND_USER: "用ć·" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logoć ‡é˘" LABEL_USER_LOGO_MESSAGE: "Logo(邮件界面)" LABEL_USER_CUSTOM_CSS: "自定义CSS样式" LEGEND_WELCOME_PAGE: "欢迎页面" LABEL_WELCOME_PAGE_TITLE: "ć ‡é˘" LABEL_WELCOME_PAGE_URL: "URL地址" LABEL_WELCOME_PAGE_DISPLAY: "ćľç¤ş" OPTION_WELCOME_PAGE_DISPLAY_NONE: "ć— " OPTION_WELCOME_PAGE_DISPLAY_ONCE: "一次" OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "永远" HTML_ALERT_PREMIUM: "此功č˝ä»…é™äşŽé«çş§ 订é…者." TAB_CONTACTS: LEGEND_CONTACTS: "č”系人" LEGEND_STORAGE: "ĺ­ĺ‚¨(PDO)" LABEL_ENABLE_CONTACTS: "ĺŻç”¨č”系人" LABEL_ALLOW_SYNC: "ĺ…许ĺŚć­Ąč”系人(依靠外é¨CardDAV服务器)" LABEL_STORAGE_TYPE: "类型" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "用ć·" LABEL_STORAGE_PASSWORD: "密ç " BUTTON_TEST: "测试" ALERT_NOTICE: "ćŹç¤ş!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "如果有大量的活č·ç”¨ć·,请不č¦é€‰ć‹©ć­¤ć•°ćŤ®ĺş“类型." HTML_ALERT_DOES_NOT_SUPPORTED: | 你的系统不支ćŚč”系人
你需č¦ĺś¨ä˝ çš„服务器上安装ć–ĺŻç”¨PDO (SQLite / MySQL / PostgreSQL) 组件. TAB_DOMAINS: LEGEND_DOMAINS: "ĺźźĺŤ" BUTTON_ADD_DOMAIN: "添加域ĺŤ" BUTTON_ADD_ALIAS: "添加ĺ«ĺŤ" DELETE_ARE_YOU_SURE: "你确定ĺ—?" HTML_DOMAINS_HELPER: | ĺ…许访问的域。
点击域ĺŤčż›čˇŚč®ľç˝®ă€‚ TAB_SECURITY: LEGEND_SECURITY: "安全" LABEL_ALLOW_TWO_STEP: "ĺ…许2步验čŻ" LABEL_FORCE_TWO_STEP: "强ĺ¶ä˝żç”¨2步验čŻ" LABEL_USE_IMAGE_PROXY: "对外é¨ĺ›ľç‰‡ä˝żç”¨ćś¬ĺś°ä»Łç†" LABEL_ALLOW_OPEN_PGP: "ĺ…许使用OpenPGP" LABEL_SHOW_PHP_INFO: "ćľç¤şPHP信ćŻ" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "管ç†ĺ‘面板访问凭据" LABEL_CURRENT_PASSWORD: "当前密ç " LABEL_NEW_LOGIN: "新的登陆用ć·ĺŤ" LABEL_NEW_PASSWORD: "新密ç " LABEL_REPEAT_PASSWORD: "重复" BUTTON_UPDATE_PASSWORD: "更新密ç " LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "č¦ć±‚验čŻSSLčŻäą¦ďĽIMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "ĺ…许自签署的čŻäą¦" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "ĺŻç”¨Googleć•´ĺ" LABEL_GOOGLE_AUTH: "认čŻ" LABEL_GOOGLE_DRIVE: "Google Drive ć•´ĺďĽć’°ĺ†™č§†ĺ›ľďĽ‰" LABEL_GOOGLE_PREVIEW: "Google Viewer ć•´ĺďĽé˘„č§Microsoft Word,Excel,和Powerpoint文档)" LABEL_GOOGLE_CLIENT_ID: "用ć·ID" LABEL_GOOGLE_CLIENT_SECRET: "用ć·ĺ݆ç " LABEL_GOOGLE_API_KEY: "Api密钥" HINT_GOOGLE_API_KEY: "č¦ć±‚使用Google Drive文件选择器" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "ĺŻç”¨Facebookć•´ĺ(认čŻ)" LABEL_FACEBOOK_APP_ID: "应用ID" LABEL_FACEBOOK_APP_SECRET: "应用密钥" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "ĺŻç”¨Twitterć•´ĺ(认čŻ)" LABEL_TWITTER_CONSUMER_KEY: "用ć·Key" LABEL_TWITTER_CONSUMER_SECRET: "用ć·Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "ĺŻç”¨Dropboxć•´ĺ" LABEL_DROPBOX_API_KEY: "Api密钥" TOP_ALERT: "社交媒体整ĺ的详细信ćŻć‰ľĺ°äşŽ" TAB_PLUGINS: LEGEND_PLUGINS: "插件" LABEL_ENABLE_PLUGINS: "ĺŻç”¨ćŹ’ä»¶" ALERT_NO_PLUGINS: "当前čżćśŞĺ®‰čŁ…ćŹ’ä»¶." LINK_INSTALL_NEW: "点击此处安装新插件!" HINT_CLICK_NAME: "点击ĺŤç§°ćťĄé…Ťç˝®ćŹ’ä»¶." TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "有更新可用" LEGEND_AVAILABLE_FOR_INSTALLATION: "可用于安装" LEGEND_INSTALLED_PACKAGES: "已安装的插件包" ALERT_CANNOT_ACCESS_REPOSITORY: "目前无法使用仓库" TAB_LICENSING: LABEL_YOUR_DOMAIN: "你的域ĺŤ" LABEL_VERSION: "ç‰ćś¬" LABEL_CHECKING: "检查中" TYPE_BASIC_HINT: "此域ĺŤä¸Ťč˘«č®¸ĺŹŻç”¨äşŽĺ•†ä¸šç”¨é€”(包括额外功č˝)." TYPE_BASIC_HINT_2: "此域ĺŤć— ćł•被许可" HTML_ALERT_TOP_1: "RainLoop Webmail位于的许可čŻä¸‹" HTML_ALERT_TOP_2: "你可以自由地将ĺ®ç”¨äşŽä˝ çš„ ç§äşş 项目." HTML_ALERT_TOP_3: | 商业ç‰çš„RainLoop Webmail自带更多功č˝ďĽŚéś€č¦č®˘é…。 TYPE_PREMIUM_LIFETIME: "永久" LABEL_SUB_EXPIRES: "订é…失ć•" BUTTON_ACTIVATE: "为此域ĺŤĺŻç”¨č®˘é…密钥" BUTTON_PURCHASE: "订购" BUTTON_TRIAL: "试用" TAB_ABOUT: LEGEND_ABOUT: "关于" LABEL_TAG_HINT: "简ć´,现代化&快捷的基于网络的邮件客ć·ç«Ż" LABEL_ALL_RIGHTS_RESERVED: "保留所有ćťĺ©" HINT_READ_CHANGE_LOG: "请在更新前é…读更新日志" HINT_IS_UP_TO_DATE: "RainLoop已经ćŻćś€ć–°ç‰ćś¬çš„" HTML_NEW_VERSION: "有新的%VERSION% ç‰ćś¬ĺŹŻç”¨." LABEL_UPDATING: "更新中" LABEL_CHECKING: "检查更新" BUTTON_UPDATE: "ć›´ć–°" BUTTON_DOWNLOAD: "下载" BUTTON_CHANGELOG: "ć›´ć–°ć—Ąĺż—" POPUPS_ACTIVATE: TITLE_ACTIVATE: "ĺŻç”¨č®˘é…密钥?" TITLE_ACTIVATION: "激活中..." LABEL_DOMAIN: "ĺźźĺŤ" LABEL_SUB_KEY: "订é…密钥" BUTTON_ACTIVATE: "激活" LABEL_ACTIVATED: "已激活" ERROR_INVALID_SUBS_KEY: "ć— ć•的订é…密钥" SUBS_KEY_ACTIVATED: "订é…密钥ć功ĺŻç”¨" HTML_DESC: | 激活ĺŽďĽŚĺźź%DOMAIN%的订é…时间将会续展。 请注意,订é…密匙只可用于一个域。

激活开始ĺŽďĽŚćż€ć´»čż‡ç¨‹ä¸­ä¸ŤĺŹŻč˘«ä¸­ć–­ć–取ć¶ă€‚ POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "添加ĺ«ĺŤ" LABEL_ALIAS: "ĺ«ĺŤ" LABEL_DOMAIN: "ĺźźĺŤ" BUTTON_CLOSE: "ĺ…łé—­" BUTTON_ADD: "添加" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "添加域ĺŤ" TITLE_ADD_DOMAIN_WITH_NAME: "ć·»ĺŠ ĺźźĺŤ \"%NAME%\"" TITLE_EDIT_DOMAIN: "çĽ–čľ‘ĺźźĺŤ \"%NAME%\"" LABEL_NAME: "ĺŤĺ­—" NAME_HELPER: "可使用通配符" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" LABEL_SERVER: "服务器" LABEL_PORT: "端口" LABEL_SECURE: "加密" LABEL_WHITE_LIST: "ç™˝ĺŤĺŤ•" SECURE_OPTION_NONE: "ć— " SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" LABEL_ALLOW_SIEVE_SCRIPTS: "可使用筛选脚本" LABEL_ALLOW_USER_SCRIPT: "ĺ…许用ć·č‡Şĺ®šäą‰č„šćś¬" LABEL_USE_SHORT_LOGIN: "使用短用ć·ĺŤç™»ĺ˝•" LABEL_USE_AUTH: "使用认čŻ" LABEL_USE_PHP_MAIL: "使用 php mail() 函数" BUTTON_TEST: "测试" BUTTON_WHITE_LIST: "ç™˝ĺŤĺŤ•" BUTTON_SIEVE_CONFIGURATION: "筛选设置" BUTTON_BACK_TO_IMAP: "回ĺ°IMAP设置" BUTTON_BACK: "返回" BUTTON_CLOSE: "ĺ…łé—­" BUTTON_ADD: "添加" BUTTON_UPDATE: "ć›´ć–°" NEW_DOMAIN_DESC: "此域ĺŤé…Ťç˝®ĺ°†ĺ…许你
ĺ’Ś%NAME%电ĺ­é‚®ä»¶ĺś°ĺť€ä¸€čµ·ĺ·Ąä˝ś." WHITE_LIST_ALERT: | ĺ…许访问的域用ć·ă€‚ 使用空格ĺ†éš”。 POPUPS_PLUGIN: TITLE_PLUGIN: "插件" DESC_NOTHING_TO_CONFIGURE: "无可用配置" BUTTON_CLOSE: "ĺ…łé—­" BUTTON_SAVE: "äżťĺ­" TOOLTIP_ABOUT_TITLE: "关于" POPUPS_ASK: DESC_WANT_CLOSE_THIS_WINDOW: "你确定č¦ĺ…łé—­ć­¤çŞ—ĺŹŁĺ—?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "选择您的语言" HINTS: BETA: "测试ç‰ćś¬" UNSTABLE: "不稳定ç‰ćś¬" WARNING: "警告" NOT_SUPPORTED: "不支ćŚ" REQUIRES_PHP_54: "č¦ć±‚PHP 5.4ć–ć›´é«ç‰ćś¬" ERRORS: DOMAIN_ALREADY_EXISTS: "ĺźźĺŤĺ·˛ç»Źĺ­ĺś¨" UNKNOWN_ERROR: "未知错误" NOTIFICATIONS: INVALID_TOKEN: "ć— ć•标记" AUTH_ERROR: "认čŻĺ¤±č´Ą" ACCESS_ERROR: "访问错误" CONNECTION_ERROR: "无法连接ĺ°ćśŤĺŠˇĺ™¨" CAPTCHA_ERROR: "验čŻç ä¸Ťć­Łçˇ®ă€‚" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > 这个社交媒体ID并未与任何电邮账ć·ĺ…łč”。请使用电邮登录然ĺŽĺ†Ťĺś¨č´¦ć·č®ľç˝®ç”¨ĺŻç”¨ć­¤ĺŠźč˝ă€‚ SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > 这个社交媒体ID并未与任何电邮账ć·ĺ…łč”。请使用电邮登录然ĺŽĺ†Ťĺś¨č´¦ć·č®ľç˝®ç”¨ĺŻç”¨ć­¤ĺŠźč˝ă€‚ SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > 这个社交媒体ID并未与任何电邮账ć·ĺ…łč”。请使用电邮登录然ĺŽĺ†Ťĺś¨č´¦ć·č®ľç˝®ç”¨ĺŻç”¨ć­¤ĺŠźč˝ă€‚ DOMAIN_NOT_ALLOWED: "ĺźźĺŤä¸Ťč˘«ĺ…许。" ACCOUNT_NOT_ALLOWED: "č´¦ć·ä¸Ťĺ…许" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "需č¦ä¸¤ć­ĄéŞŚčŻ" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "两步验čŻé”™čŻŻ" COULD_NOT_SAVE_NEW_PASSWORD: "无法保ĺ­ć–°ĺ݆ç " CURRENT_PASSWORD_INCORRECT: "当前密ç ä¸Ťć­Łçˇ®" NEW_PASSWORD_SHORT: "密ç ĺ¤Şçź­" NEW_PASSWORD_WEAK: "密ç čż‡äşŽç®€ĺŤ•" NEW_PASSWORD_FORBIDDENT: "密ç ĺŚ…ĺ«ç¦ć­˘ĺ­—符" CONTACTS_SYNC_ERROR: "č”系人ĺŚć­Ąé”™čŻŻ" CANT_GET_MESSAGE_LIST: "无法获取邮件ĺ—表" CANT_GET_MESSAGE: "无法获取邮件" CANT_DELETE_MESSAGE: "ć— ćł•ĺ é™¤é‚®ä»¶" CANT_MOVE_MESSAGE: "无法移动邮件" CANT_SAVE_MESSAGE: "无法保ĺ­é‚®ä»¶" CANT_SEND_MESSAGE: "无法发é€é‚®ä»¶" INVALID_RECIPIENTS: "ć— ć•接收者" CANT_SAVE_FILTERS: "无法保ĺ­čż‡ć»¤ĺ™¨" CANT_GET_FILTERS: "无法获取过滤器" FILTERS_ARE_NOT_CORRECT: "过滤器不正确" CANT_CREATE_FOLDER: "ć— ćł•ĺ›ĺ»şć–‡ä»¶ĺ¤ą" CANT_RENAME_FOLDER: "无法重命ĺŤć–‡ä»¶ĺ¤ą" CANT_DELETE_FOLDER: "ć— ćł•ĺ é™¤ć–‡ä»¶ĺ¤ą" CANT_DELETE_NON_EMPTY_FOLDER: "ć— ćł•ĺ é™¤éťžç©şć–‡ä»¶ĺ¤ą" CANT_SUBSCRIBE_FOLDER: "无法订é…文件夹" CANT_UNSUBSCRIBE_FOLDER: "无法取ć¶č®˘é…文件夹" CANT_SAVE_SETTINGS: "无法保ĺ­č®ľç˝®" CANT_SAVE_PLUGIN_SETTINGS: "无法保ĺ­č®ľç˝®" DOMAIN_ALREADY_EXISTS: "ĺźźĺŤĺ·˛ç»Źĺ­ĺś¨" CANT_INSTALL_PACKAGE: "安装插件包失败" CANT_DELETE_PACKAGE: "移除插件包失败" INVALID_PLUGIN_PACKAGE: "ć— ć•插件包" UNSUPPORTED_PLUGIN_PACKAGE: "不支ćŚçš„插件包" LICENSING_SERVER_IS_UNAVAILABLE: "订é…服务器不可用" LICENSING_DOMAIN_EXPIRED: "此域ĺŤçš„订é…服务已过期。" LICENSING_DOMAIN_BANNED: "此域ĺŤçš„订é…服务已被ç¦ć­˘ă€‚" DEMO_SEND_MESSAGE_ERROR: "出于安全č€č™‘,此账号无法发é€ĺ¤–é¨é‚®ä»¶ďĽ" DEMO_ACCOUNT_ERROR: "出于安全č€č™‘,此账ć·ä¸Ťĺ…许进行此操作。" ACCOUNT_ALREADY_EXISTS: "č´¦ć·ĺ·˛ĺ­ĺś¨" ACCOUNT_DOES_NOT_EXIST: "č´¦ć·ä¸Ťĺ­ĺś¨" MAIL_SERVER_ERROR: "访问邮件服务器时é‡ĺ°é”™čŻŻă€‚" INVALID_INPUT_ARGUMENT: "ć— ć•输入参数" UNKNOWN_ERROR: "未知错误" STATIC: BACK_LINK: "重新加载" DOMAIN_LIST_DESC: "可ĺ…许通过webmail访问的域ĺŤĺ—表" PHP_EXSTENSIONS_ERROR_DESC: "需č¦çš„PHP扩展在你的PHP配置中不可用ďĽ" PHP_VERSION_ERROR_DESC: "您的PHPç‰ćś¬ (%VERSION%) 低于最低所需的 5.3.0ďĽ" NO_SCRIPT_TITLE: "此应用需č¦JavaScript支ćŚďĽ" NO_SCRIPT_DESC: | 您的浏č§ĺ™¨ä¸Ťć”ŻćŚJavaScript。 请ĺŻç”¨ćµŹč§ĺ™¨çš„JavaScript支ćŚĺą¶é‡ŤčŻ•ă€‚ NO_COOKIE_TITLE: "此应用需č¦Cookies支ćŚďĽ" NO_COOKIE_DESC: | 您的浏č§ĺ™¨ä¸Ťć”ŻćŚCookies。 请ĺŻç”¨ćµŹč§ĺ™¨çš„Cookies支ćŚĺą¶é‡ŤčŻ•ă€‚ BAD_BROWSER_TITLE: "您的浏č§ĺ™¨čż‡ć—¶äş†ă€‚" BAD_BROWSER_DESC: | 为了使用所有特性, 下载并安装其中一款浏č§ĺ™¨ďĽš rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/langs.yml000066400000000000000000000053051361462701300246660ustar00rootroot00000000000000 Common: LANGS_NAMES: LANG_EN: English LANG_EN_US: English LANG_EN_GB: English (UK) LANG_EN_UK: English (UK) LANG_EN_CA: English (Canadian) LANG_TH_TH: ภาษาไทย LANG_EL_GR: Ελληνικά LANG_NL_NL: Nederlands LANG_NB_NO: Norsk (bokmĂĄl) LANG_PL_PL: Polski LANG_RU_RU: Đ ŃŃŃкий LANG_RO_RO: RomânÄ LANG_UK_UA: УкраїнŃька LANG_DE_DE: Deutsch LANG_FI_FI: Suomi LANG_FR_FR: Français (France) LANG_FR_CA: Français (Canada) LANG_PT_PT: PortuguĂŞs (Portugal) LANG_PT_BR: PortuguĂŞs (Brasil) LANG_ES_ES: Español (España) LANG_ES_LA: Español LANG_ET_EE: Eesti LANG_FA_IR: ‏Ůارسی‏ LANG_IT_IT: Italiano LANG_LT_LT: LietuviĹł LANG_LV_LV: Latviešu LANG_IS_IS: ĂŤslenska LANG_HU_HU: Magyar LANG_TR_TR: TĂĽrkçe LANG_SK_SK: SlovenÄŤina LANG_SV_SE: Svenska LANG_SL_SI: Slovenščina LANG_JA_JP: 日本語 LANG_ZH_TW: 中文(台çŁ) LANG_ZH_CN: 中文(简体) LANG_ZH_HK: 中文(香港) LANG_KO_KR: 한국어 LANG_BG_BG: БългарŃки LANG_CS_CZ: ÄŚeština LANG_AR_SA: ‏العربية‏ LANG_DA_DK: Dansk LANG_ID_ID: Bahasa Indonesia LANGS_NAMES_EN: LANG_EN: English LANG_EN_US: English (US) LANG_EN_GB: English (UK) LANG_EN_UK: English (UK) LANG_EN_CA: English (Canadian) LANG_TH_TH: Thai LANG_EL_GR: Greek LANG_NL_NL: Dutch LANG_NB_NO: Norwegian (bokmal) LANG_PL_PL: Polish LANG_RU_RU: Russian LANG_RO_RO: Romanian LANG_UK_UA: Ukrainian LANG_DE_DE: German LANG_FI_FI: Finnish LANG_FR_FR: French (France) LANG_FR_CA: France (Canada) LANG_PT_PT: Portuguese (Portugal) LANG_PT_BR: Portuguese (Brazil) LANG_ES_ES: Spanish LANG_ES_LA: Spanish LANG_ET_EE: Estonian LANG_FA_IR: Persian LANG_IT_IT: Italian LANG_LT_LT: Lithuanian LANG_LV_LV: Latvian LANG_IS_IS: Icelandic LANG_HU_HU: Hungarian LANG_TR_TR: Turkish LANG_SK_SK: Slovak LANG_SL_SI: Slovenian LANG_SV_SE: Swedish LANG_JA_JP: Japanese LANG_ZH_TW: Traditional Chinese (Taiwan) LANG_ZH_CN: Simplified Chinese (China) LANG_ZH_HK: Traditional Chinese (Hong Kong) LANG_KO_KR: Korean LANG_BG_BG: Bulgarian LANG_CS_CZ: Czech LANG_AR_SA: Arabic LANG_DA_DK: Danish LANG_ID_ID: Indonesian rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/moment/000077500000000000000000000000001361462701300243335ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/moment/.gitempty000066400000000000000000000000011361462701300261650ustar00rootroot00000000000000 rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/000077500000000000000000000000001361462701300244545ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/README000066400000000000000000000000641361462701300253340ustar00rootroot00000000000000https://www.transifex.com/rainloop/rainloop-webmail/rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml000066400000000000000000000742071361462701300272510ustar00rootroot00000000000000en: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Login" LABEL_PASSWORD: "Password" LABEL_SIGN_ME: "Remember Me" LABEL_VERIFICATION_CODE: "Verification Code" LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" BUTTON_SIGN_IN: "Sign In" TITLE_SIGN_IN_GOOGLE: "Sign In using Google" TITLE_SIGN_IN_GMAIL: "Sign In using Gmail" TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" LABEL_FORGOT_PASSWORD: "Forgot password" LABEL_REGISTRATION: "Registration" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Add Account" BUTTON_SETTINGS: "Settings" BUTTON_HELP: "Help" BUTTON_LOGOUT: "Logout" MOBILE: BUTTON_MOBILE_VERSION: "Mobile version" BUTTON_DESKTOP_VERSION: "Desktop version" SEARCH: MAIN_INPUT_PLACEHOLDER: "Search" TITLE_ADV: "Advanced Search" LABEL_ADV_FROM: "From" LABEL_ADV_TO: "To" LABEL_ADV_SUBJECT: "Subject" LABEL_ADV_TEXT: "Text" LABEL_ADV_HAS_ATTACHMENT: "Has attachment" LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" LABEL_ADV_FLAGGED: "Flagged" LABEL_ADV_UNSEEN: "Unseen" LABEL_ADV_DATE: "Date" LABEL_ADV_DATE_ALL: "All" LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" LABEL_ADV_DATE_MONTH: "Up to 1 month old" LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" LABEL_ADV_DATE_YEAR: "Up to 1 year old" BUTTON_ADV_SEARCH: "Search" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "Close (Esc)" LOADING: "Loading..." GALLERY_PREV: "Previous (arrow left)" GALLERY_NEXT: "Next (arrow right)" GALLERY_COUNTER: "%curr% of %total%" IMAGE_ERROR: "The image could not be loaded." AJAX_ERROR: "The content could not be loaded." FOLDER_LIST: BUTTON_COMPOSE: "Compose" BUTTON_CONTACTS: "Contacts" BUTTON_NEW_MESSAGE: "New message" INBOX_NAME: "Inbox" SENT_NAME: "Sent" DRAFTS_NAME: "Drafts" SPAM_NAME: "Spam" TRASH_NAME: "Trash" ARCHIVE_NAME: "Archive" QUOTA: TITLE: "Quota usage" MESSAGE_LIST: BUTTON_RELOAD: "Reload Message List" BUTTON_MOVE_TO: "Move To" BUTTON_DELETE: "Delete" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_EMPTY_FOLDER: "Clear Folder" BUTTON_MULTY_FORWARD: "Forward as attachment(s)" BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" BUTTON_MORE: "More" MENU_SET_SEEN: "Mark as read" MENU_SET_ALL_SEEN: "Mark all as read" MENU_UNSET_SEEN: "Mark as unread" MENU_SET_FLAG: "Flag" MENU_UNSET_FLAG: "Unflag" MENU_SELECT_ALL: "All" MENU_SELECT_NONE: "None" MENU_SELECT_INVERT: "Invert" MENU_SELECT_UNSEEN: "Unread" MENU_SELECT_SEEN: "Read" MENU_SELECT_FLAGGED: "Flagged" MENU_SELECT_UNFLAGGED: "Unflagged" EMPTY_LIST: "Empty list." EMPTY_SEARCH_LIST: "No messages matched your search." SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "back to message list" LIST_LOADING: "Loading" EMPTY_SUBJECT_TEXT: "(No subject)" PUT_MESSAGE_HERE: "Drop message here to view it in the list" TODAY_AT: "today at %TIME%" YESTERDAY_AT: "yesterday at %TIME%" SEARCH_PLACEHOLDER: "Search" NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" MESSAGE: BUTTON_EDIT: "Edit" BUTTON_BACK: "Back" BUTTON_CLOSE: "Close" BUTTON_DELETE: "Delete" BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_MOVE_TO: "Move To" BUTTON_MORE: "More" BUTTON_REPLY: "Reply" BUTTON_REPLY_ALL: "Reply All" BUTTON_FORWARD: "Forward" BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" BUTTON_EDIT_AS_NEW: "Edit as New" BUTTON_SHOW_IMAGES: "Display external images" BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." BUTTON_IN_NEW_WINDOW: "View in separate window" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "Previous" BUTTON_THREAD_NEXT: "Next" BUTTON_THREAD_MORE: "More messages" MENU_HEADERS: "Show message headers" MENU_VIEW_ORIGINAL: "Show Source" MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" MENU_FILTER_SIMILAR: "Filter messages like this" MENU_PRINT: "Print" EMPTY_SUBJECT_TEXT: "(No subject)" LABEL_SUBJECT: "Subject" LABEL_DATE: "Date" LABEL_FROM: "From" LABEL_FROM_SHORT: "from" LABEL_TO: "To" LABEL_TO_SHORT: "to" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "From" PRINT_LABEL_TO: "To" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "Date" PRINT_LABEL_SUBJECT: "Subject" PRINT_LABEL_ATTACHMENTS: "Attachments" MESSAGE_LOADING: "Loading" MESSAGE_VIEW_DESC: "Select any message in the list to view it here." MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" LINK_SAVE_TO_CLOUD: "Save to Cloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Searching..." CONTACTS: LEGEND_CONTACTS: "Contacts" SEARCH_INPUT_PLACEHOLDER: "Search" BUTTON_ADD_CONTACT: "Add Contact" BUTTON_CREATE_CONTACT: "Create" BUTTON_UPDATE_CONTACT: "Update" BUTTON_IMPORT: "Import (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Import error (invalid file format)" LIST_LOADING: "Loading" EMPTY_LIST: "No contacts here" EMPTY_SEARCH: "No contacts found" CLEAR_SEARCH: "Clear search" CONTACT_VIEW_DESC: "Select contact in the list to view it here." LABEL_DISPLAY_NAME: "Display name" LABEL_EMAIL: "Email" LABEL_PHONE: "Phone" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Birthday" LINK_ADD_EMAIL: "Add an email address" LINK_ADD_PHONE: "Add a phone" LINK_BIRTHDAY: "Birthday" PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" LABEL_READ_ONLY: "Read only" LABEL_SHARE: "Share" ADD_MENU_LABEL: "Add" ADD_MENU_NICKNAME: "Nickname" ADD_MENU_NOTES: "Notes" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Phone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Address" ADD_MENU_BIRTHDAY: "Birthday" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "None" BUTTON_SHARE_ALL: "Everyone" BUTTON_SYNC: "Synchronization (CardDAV)" COMPOSE: TITLE_FROM: "From" TITLE_TO: "To" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Reply-To" TITLE_SUBJECT: "Subject" LINK_SHOW_INPUTS: "show all fields" BUTTON_SEND: "Send" BUTTON_SAVE: "Save" BUTTON_DELETE: "Delete" BUTTON_CANCEL: "Cancel" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "Saved at %TIME%" SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "Attach files" ATTACH_DROP_FILES_DESC: "Drop files here" ATTACH_ITEM_CANCEL: "Cancel" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM: "From" FORWARD_MESSAGE_TOP_TO: "To" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Sent" FORWARD_MESSAGE_TOP_SUBJECT: "Subject" EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Yes" BUTTON_NO: "No" DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choose your language" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Add Account?" BUTTON_ADD_ACCOUNT: "Add" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Add Identity?" TITLE_UPDATE_IDENTITY: "Update Identity?" BUTTON_ADD_IDENTITY: "Add" BUTTON_UPDATE_IDENTITY: "Update" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Create a folder?" LABEL_NAME: "Folder name" LABEL_PARENT: "Parent folder" BUTTON_CREATE: "Create" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" TITLE_CREATING_PROCESS: "Creating a folder" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" BUTTON_CLEAR: "Clear" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" DANGER_DESC_WARNING: "Warning!" DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." TITLE_CLEARING_PROCESS: "Purging the folder..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" BUTTON_SELECT: "Select" BUTTON_CLOSE: "Close" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_PASSWORD: "Password" LABEL_KEY_BIT_LENGTH: "Key length" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "Sign" LABEL_ENCRYPT: "Encrypt" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Sign" BUTTON_ENCRYPT: "Encrypt" BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Step verification test" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Equal To" SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching ANY of the following rules" SELECT_MATCH_ALL: "Matching ALL of the following rules" MARK_AS_READ_LABEL: "Mark as read" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subject (optional)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Reject message" ALL_INCOMING_MESSAGES_DESC: "All incoming messages" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Select system folders" SELECT_CHOOSE_ONE: "Choose one" SELECT_UNUSE_NAME: "Do not use" LABEL_SENT: "Sent" LABEL_DRAFTS: "Drafts" LABEL_SPAM: "Spam" LABEL_TRASH: "Trash" LABEL_ARCHIVE: "Archive" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" NOTIFICATION_SENT: | You haven't selected "Sent" system folder messages are put to after sending. If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." NOTIFICATION_SPAM: | You haven't selected "Spam" system folder spamed messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_TRASH: | You haven't selected "Trash" system folder deleted messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" LABEL_TWO_FACTOR_USER: "User" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" BUTTON_CREATE: "Create a secret" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Clear" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Show Secret" BUTTON_HIDE_SECRET: "Hide Secret" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" TWO_FACTOR_SECRET_DESC: > Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: > If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "Loading" LOGIN: "Login" MAILBOX: "MailBox" SETTINGS: "Settings" COMPOSE: "Compose" UPLOAD: ERROR_FILE_IS_TOO_BIG: "File is too big" ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" ERROR_NO_FILE_UPLOADED: "No file uploaded" ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" ERROR_FILE_TYPE: "Invalid file type" ERROR_UNKNOWN: "An unknown file upload error occurred" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personal" LABEL_GENERAL_NAME: "General" LABEL_CONTACTS_NAME: "Contacts" LABEL_FOLDERS_NAME: "Folders" LABEL_ACCOUNTS_NAME: "Accounts" LABEL_IDENTITY_NAME: "Identity" LABEL_IDENTITIES_NAME: "Identities" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Security" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Themes" LABEL_CHANGE_PASSWORD_NAME: "Password" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Back" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Save" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Delete" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identity" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "General" LABEL_LANGUAGE: "Language" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "Default text editor" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Plain" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "Interface animation" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "None" LABEL_VIEW_OPTIONS: "View options" LABEL_USE_PREVIEW_PANE: "Use preview pane" LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" LABEL_USE_THREADS: "Use threads" LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" LABEL_SHOW_IMAGES: "Always display external images in message body" LABEL_SHOW_ANIMATION: "Show animation" LABEL_MESSAGE_PER_PAGE: "Messages on page" LABEL_NOTIFICATIONS: "Notifications" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contacts" LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" LABEL_CONTACTS_SYNC_USER: "User" LABEL_CONTACTS_SYNC_PASSWORD: "Password" SETTINGS_THEMES: LEGEND_THEMES: "Themes" LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" LABEL_CUSTOM_TYPE: "Type" LABEL_CUSTOM_TYPE_LIGHT: "Light" LABEL_CUSTOM_TYPE_DARK: "Dark" LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "File is too big" ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" ERROR_UNKNOWN: "An unknown file upload error occurred" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Connect Google" BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Connect Facebook" BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Connect Twitter" BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Folder List" BUTTON_CREATE: "Create Folder" BUTTON_SYSTEM: "System Folders" BUTTON_DELETE: "Delete" BUTTON_SUBSCRIBE: "Subscribe" BUTTON_UNSUBSCRIBE: "Unsubscribe" LOADING_PROCESS: "Updating folder list" CREATING_PROCESS: "Creating a folder" DELETING_PROCESS: "Deleting a folder" RENAMING_PROCESS: "Renaming a folder" DELETING_ASK: "Are you sure?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Accounts" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "Add an Account" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "Delete" LOADING_PROCESS: "Updating..." DELETING_ASK: "Are you sure?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identity" LEGEND_IDENTITIES: "Additional Identities" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" BUTTON_ADD_IDENTITY: "Add Identity" BUTTON_DELETE: "Delete" LOADING_PROCESS: "Updating identity list" DELETING_ASK: "Are you sure?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Change Password" LABEL_CURRENT_PASSWORD: "Current password" LABEL_NEW_PASSWORD: "New password" LABEL_REPEAT_PASSWORD: "Confirm New Password" BUTTON_UPDATE_PASSWORD: "Set New Password" ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" TITLE_PRIVATE: "Private" TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Message list" TAB_MESSAGE_VIEW: "Message view" TAB_COMPOSE: "Compose" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "Reply" LABEL_REPLY_ALL: "Reply All" LABEL_FORWARD: "Forward" LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" LABEL_HELP: "Help" LABEL_CHECK_ALL: "Select all messages" LABEL_ARCHIVE: "Archive" LABEL_DELETE: "Delete" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "Move" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" LABEL_IMPORTANT: "Important, flag selected messages" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Print" LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" LABEL_SWITCH_TO_LIST: "Switch focus back to message list" LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" LABEL_SAVE_MESSAGE: "Save message" LABEL_SEND_MESSAGE: "Send message" LABEL_CLOSE_COMPOSE: "Close compose" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "Select a private key" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "Please specify FROM email address" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" NOTIFICATIONS: INVALID_TOKEN: "Invalid token" AUTH_ERROR: "Authentication failed" ACCESS_ERROR: "Access error" CONNECTION_ERROR: "Can't connect to server" CAPTCHA_ERROR: "Incorrect CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "Domain is not allowed" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Can't get message list" CANT_GET_MESSAGE: "Can't get message" CANT_DELETE_MESSAGE: "Can't delete message" CANT_MOVE_MESSAGE: "Can't move message" CANT_SAVE_MESSAGE: "Can't save message" CANT_SEND_MESSAGE: "Can't send message" INVALID_RECIPIENTS: "Invalid recipients" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Can't create folder" CANT_RENAME_FOLDER: "Can't rename folder" CANT_DELETE_FOLDER: "Can't delete folder" CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" CANT_SAVE_SETTINGS: "Can't save settings" CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" DOMAIN_ALREADY_EXISTS: "Domain already exists" CANT_INSTALL_PACKAGE: "Failed to install package" CANT_DELETE_PACKAGE: "Failed to remove package" INVALID_PLUGIN_PACKAGE: "Invalid plugin package" UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Account already exists" ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" MAIL_SERVER_ERROR: "An error has occured while accessing mail server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Unknown error" STATIC: BACK_LINK: "Reload" DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | JavaScript support is not available in your browser. Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | To use all the features of the application, download and install one of these browsers: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/ar_SA.yml000066400000000000000000001113451361462701300261710ustar00rootroot00000000000000ar_SA: LOGIN: LABEL_EMAIL: "ŘĄŮŠŮ…ŮŠŮ„" LABEL_LOGIN: "تسيجيل الدخŮŮ„" LABEL_PASSWORD: "Ůلمة السر" LABEL_SIGN_ME: "تذŮرني" LABEL_VERIFICATION_CODE: "ŮŮŘŻ التحقق" LABEL_DONT_ASK_VERIFICATION_CODE: "لاتسألني عن الŮŮŘŻ الا بعد مرŮر اسبŮعين" BUTTON_SIGN_IN: "الدخŮŮ„" TITLE_SIGN_IN_GOOGLE: "Google+ الدخŮŮ„ باستخدام" TITLE_SIGN_IN_FACEBOOK: "Facebook الدخŮŮ„ باستخدام" TITLE_SIGN_IN_TWITTER: "Twitter الدخŮŮ„ باستخدام" LABEL_FORGOT_PASSWORD: "نسيت Ůلمة السر" LABEL_REGISTRATION: "التسجيل" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "ضŮŮ‘ حساب" BUTTON_SETTINGS: "الإعدادات" BUTTON_HELP: "المساعدة" BUTTON_LOGOUT: "تسجيل الخرŮج" SEARCH: MAIN_INPUT_PLACEHOLDER: "بحث" TITLE_ADV: "البحث المطŮر" LABEL_ADV_FROM: "من" LABEL_ADV_TO: "الى" LABEL_ADV_SUBJECT: "المŮضŮŘą" LABEL_ADV_TEXT: "النص" LABEL_ADV_HAS_ATTACHMENT: "ŮŠŘ­ŘŞŮŮŠ على مرŮŮ‚" LABEL_ADV_HAS_ATTACHMENTS: "ŮŠŘ­ŘŞŮŮŠ مرŮقات" LABEL_ADV_FLAGGED: "عليه علم" LABEL_ADV_UNSEEN: "لم يقرأ" LABEL_ADV_DATE: "التاريخ" LABEL_ADV_DATE_ALL: "الŮŮ„" LABEL_ADV_DATE_3_DAYS: "منذ 3 أيام" LABEL_ADV_DATE_7_DAYS: "منذ أسبŮŘą" LABEL_ADV_DATE_MONTH: "منذ شهر" LABEL_ADV_DATE_3_MONTHS: "منذ 3 أشهر" LABEL_ADV_DATE_6_MONTHS: "منذ 6 أشهر" LABEL_ADV_DATE_YEAR: "منذ سنة" BUTTON_ADV_SEARCH: "إبحث" PREVIEW_POPUP: FULLSCREEN: "إعداد اŮتراضي Ů„Ůضع ملء الشاشة" ZOOM: "Zoom in/out" CLOSE: "أغلق (Esc)" LOADING: "..جاري التحميل" GALLERY_PREV: "السابق( السهم اليسار)" GALLERY_NEXT: "اليمين(السهم اليميني)" GALLERY_COUNTER: "%curr% of %total%" IMAGE_ERROR: "الصŮرة لم نتمŮن من عرض." AJAX_ERROR: "المحتŮى لم نتمŮن من عرض." FOLDER_LIST: BUTTON_COMPOSE: "إنشاء" BUTTON_CONTACTS: "جهات الإتصال" INBOX_NAME: "البريد الŮارد" SENT_NAME: "البريد المرسل" DRAFTS_NAME: "المسŮدات" SPAM_NAME: "الرسائل غير المرغŮب Ůيها" TRASH_NAME: "المهملات" ARCHIVE_NAME: "الأرشيŮ" QUOTA: TITLE: "Quota usage" MESSAGE_LIST: BUTTON_RELOAD: "أعد ŘŞŘ­Ů…ŮŠŮ„ قائمة الرسائل" BUTTON_MOVE_TO: "..انقل الى" BUTTON_DELETE: "حذŮ" BUTTON_ARCHIVE: "Ůضع ŮŮŠ الأرشيŮ" BUTTON_SPAM: "الإبلاغ عن الرسائل غير المرغŮب Ůيها" BUTTON_NOT_SPAM: "ليست رسائل غير مرغŮب Ůيها" BUTTON_EMPTY_FOLDER: "اŮرغ Ů…Ř­ŘŞŮيات المجلد" BUTTON_MULTY_FORWARD: "إعادة ŘŞŮجيه Ůملحقات" BUTTON_DELETE_WITHOUT_MOVE: "الحذ٠نهائياً" BUTTON_MORE: "المزيد" MENU_SET_SEEN: "تعليمها بـ مقرŮءة" MENU_SET_ALL_SEEN: "تعليم جميع الرسائل ŮŮ€ مقرŮءة" MENU_UNSET_SEEN: "تعليمها بـ غير مقرŮءة" MENU_SET_FLAG: "مهمة" MENU_UNSET_FLAG: "إزالة الأهمية" MENU_SELECT_ALL: "الŮŮ„" MENU_SELECT_NONE: "بدŮن" MENU_SELECT_INVERT: "Invert" MENU_SELECT_UNSEEN: "غير مقرŮء" MENU_SELECT_SEEN: "مقرŮء" MENU_SELECT_FLAGGED: "Ů…Ř­ŘŻŘŻ ŮŮ€ مهم" MENU_SELECT_UNFLAGGED: "إزالة الأهمية" EMPTY_LIST: "ŘĄŮراغ القائمة" EMPTY_SEARCH_LIST: "ليست هنا٠أية رسائل تطابق بحثŮ." SEARCH_RESULT_FOR: "نتيجة البحث لـ \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "العŮŘŻŘ© الى قائمة الرسائل" LIST_LOADING: "..جاري التحميل" EMPTY_SUBJECT_TEXT: "(لايŮجدمŮضŮŘą)" PUT_MESSAGE_HERE: "حر٠الرسالة الى هنا.. Ů„ŮŮŠ تراها ŮŮŠ قائمة الرسائل" TODAY_AT: "اليŮŮ… عند %TIME%" YESTERDAY_AT: "البارحة عند %TIME%" SEARCH_PLACEHOLDER: "البحث" NEW_MESSAGE_NOTIFICATION: "ŮŠŮجد لدي٠%COUNT% رسالة جديدة!" QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" MESSAGE: BUTTON_EDIT: "تعديل" BUTTON_BACK: "العŮŘŻŘ©" BUTTON_CLOSE: "إغلاق" BUTTON_DELETE: "حذŮ" BUTTON_ARCHIVE: "أرشيŮ" BUTTON_SPAM: "رسالة غير مرغŮبة" BUTTON_NOT_SPAM: "ليست رسالة غير مرغŮبة" BUTTON_MOVE_TO: "انقل الى" BUTTON_MORE: "المزيد" BUTTON_REPLY: "الرد" BUTTON_REPLY_ALL: "الرد على الجميع" BUTTON_FORWARD: "إعادة ŘŞŮجيه" BUTTON_FORWARD_AS_ATTACHMENT: "إعادة ŘŞŮجيه Ůملحقات" BUTTON_EDIT_AS_NEW: "التعديل ŮŮ€ جديد" BUTTON_SHOW_IMAGES: "عرض الصŮر الخارجية" BUTTON_NOTIFY_READ_RECEIPT: "لقد طلب المرسل أن ŮŠŘŞŮ… إعلامه ŮŮŠ حال قراءة الرسالة" BUTTON_IN_NEW_WINDOW: "العرض ŮŮŠ ناŮذة منŮصلة" BUTTON_THREAD_LIST: "قائمة المŮاضيع" BUTTON_THREAD_PREV: "السابق" BUTTON_THREAD_NEXT: "التالي" BUTTON_THREAD_MORE: "المزيد من الرسائل" MENU_HEADERS: "Show message headers" MENU_VIEW_ORIGINAL: "إظهار المصدر" MENU_DOWNLOAD_ORIGINAL: ".eml التنزيل ŮŮ…Ů„Ů" MENU_FILTER_SIMILAR: "تصŮŮŠŘ© رسائل مثل هذه" MENU_PRINT: "طباعة" EMPTY_SUBJECT_TEXT: "(لايŮجد Ů…ŮضŮŘą)" LABEL_SUBJECT: "المŮضŮŘą" LABEL_DATE: "التاريخ" LABEL_FROM: "من" LABEL_FROM_SHORT: "من" LABEL_TO: "الى" LABEL_TO_SHORT: "الى" LABEL_CC: "نسخة الى" LABEL_BCC: "نسخة Ů…Ř®ŮŮŠŘ© الŮجهة" LABEL_REPLY_TO: "الرد-الى" PRINT_LABEL_FROM: "من" PRINT_LABEL_TO: "الى" PRINT_LABEL_CC: "نسخة الى" PRINT_LABEL_BCC: "نسخة Ů…Ř®ŮŮŠŘ© الŮجهة" PRINT_LABEL_REPLY_TO: "الرد-الى" PRINT_LABEL_DATE: "التاريخ" PRINT_LABEL_SUBJECT: "المŮضŮŘą" PRINT_LABEL_ATTACHMENTS: "الملحقات" MESSAGE_LOADING: "..جاري التحميل" MESSAGE_VIEW_DESC: "Ř­ŘŻŘŻ رسالة من القائمة ليتم عرضها هنا" PGP_PASSWORD_INPUT_PLACEHOLDER: "Ůلمة السر" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "zip تنزيل ŮŮ€" LINK_SAVE_TO_OWNCLOUD: "ownCloud الحŮظ الى" LINK_SAVE_TO_DROPBOX: "Dropbox الحŮظ الى" READ_RECEIPT: SUBJECT: "إعلام بالقراءة (ŘŞŮ… عرضها) - %SUBJECT%" BODY: |- هذا إعلام بأن الرسالة المرسلة قد ŘŞŮ…ŘŞ قرائتها %READ-RECEIPT%. SUGGESTIONS: SEARCHING_DESC: "ŮŠŘŞŮ… البحث..." CONTACTS: LEGEND_CONTACTS: "جهات الإتصال" SEARCH_INPUT_PLACEHOLDER: "بحث" BUTTON_ADD_CONTACT: "إضاŮŘ© جهة إتصال" BUTTON_CREATE_CONTACT: "إنشاء" BUTTON_UPDATE_CONTACT: "ŘŞŘ­ŘŻŮŠŘ«" BUTTON_IMPORT: "إستيراد (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "تصدير ŮŮ€ (vcf, vCard)" BUTTON_EXPORT_CSV: "تصدير ŮŮ€ (csv)" ERROR_IMPORT_FILE: "خطأ ŮŮŠ الإستيراد(نŮŘą مل٠غير صحيح)" LIST_LOADING: "جاري التحميل" EMPTY_LIST: "لايŮجد جهات إتصال" EMPTY_SEARCH: "لم ŮŠŘŞŮ… ايجاد جهة الإتصال" CLEAR_SEARCH: "إزالة البحث" CONTACT_VIEW_DESC: "Ř­ŘŻŘŻ جهة إتصال من القائمة Ů„ŮŮŠ ŮŠŘŞŮ… عرضها هنا" LABEL_DISPLAY_NAME: "الإسم المعرŮض" LABEL_EMAIL: "البريد الإلŮترŮني" LABEL_PHONE: "رقم الهاتŮ" LABEL_WEB: "المŮقع" LABEL_BIRTHDAY: "تاريخ الميلاد" LINK_ADD_EMAIL: "قم باضاŮŘ© البريد الالŮترŮني" LINK_ADD_PHONE: "قم باضاŮŘ© رقم الهاتŮ" LINK_BIRTHDAY: "تاريخ الميلاد" PLACEHOLDER_ENTER_DISPLAY_NAME: "ادخل الاسم المعرŮض" PLACEHOLDER_ENTER_LAST_NAME: "ادخل اسم العائلة" PLACEHOLDER_ENTER_FIRST_NAME: "ادخل الاسم" PLACEHOLDER_ENTER_NICK_NAME: "ادخل اللقب" LABEL_READ_ONLY: "قراءة Ůقط" LABEL_SHARE: "مشارŮŘ©" ADD_MENU_LABEL: "اضاŮŘ©" ADD_MENU_NICKNAME: "اللقب" ADD_MENU_NOTES: "الملاحظات" ADD_MENU_EMAIL: "البريد الإلŮترŮني" ADD_MENU_PHONE: "الهاتŮ" ADD_MENU_URL: "الرابط" ADD_MENU_ADDRESS: "العنŮان" ADD_MENU_BIRTHDAY: "تاريخ الميلاد" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "لاأحد" BUTTON_SHARE_ALL: "الجميع" BUTTON_SYNC: "المزامنة (CardDAV)" COMPOSE: TITLE_FROM: "من" TITLE_TO: "الى" TITLE_CC: "نسخة الى" TITLE_BCC: "نسخة Ů…Ř®ŮŮŠŘ© الŮجهة" TITLE_REPLY_TO: "الرد-الى" TITLE_SUBJECT: "المŮضŮŘą" LINK_SHOW_INPUTS: "إظهار جميع الحقŮŮ„" BUTTON_SEND: "إرسال" BUTTON_SAVE: "Ř­Ůظ" BUTTON_DELETE: "حذŮ" BUTTON_CANCEL: "إلغاء" BUTTON_MINIMIZE: "تصغير" SAVED_TIME: "ŘŞŮ… الحŮظ عند %TIME%" SAVED_ERROR_ON_SEND: "ŘŞŮ… إرسال الرسالة.. ŮŮ„Ůن لم ŮŠŘŞŮ… Ř­Ůظها ŮŮŠ مجلد المرسلات" DISCARD_UNSAVED_DATA: "تجاهل البيانات الغير Ů…Ř­ŮŮظة؟" ATTACH_FILES: "ارŮاق الملŮات" ATTACH_DROP_FILES_DESC: "حر٠الملŮات الى هنا" ATTACH_ITEM_CANCEL: "الغاء" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "-------- رسالة معاد ŘŞŮجيهها -------" FORWARD_MESSAGE_TOP_FROM: "من" FORWARD_MESSAGE_TOP_TO: "الى" FORWARD_MESSAGE_TOP_CC: "نسخة الى" FORWARD_MESSAGE_TOP_SENT: "ŘŞŮ… الإرسال" FORWARD_MESSAGE_TOP_SUBJECT: "المŮضŮŘą" EMPTY_TO_ERROR_DESC: "رجاءً Ř­ŘŻŘŻ مستلم Ůاحد على الأقل." NO_ATTACHMENTS_HERE_DESC: "لايŮجد مرŮقات" ATTACHMENTS_ERROR_DESC: "تحذير! لم ŮŠŘŞŮ… إرŮاق جميع المرŮقات" ATTACHMENTS_UPLOAD_ERROR_DESC: "لم تنتهي عملية الإرŮاق بعد" BUTTON_REQUEST_READ_RECEIPT: "اطلب اعلاماً بالقراءة" BUTTON_MARK_AS_IMPORTANT: "تحديده ŮŮ€ هام" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "اطلب اعلاماً بايصال البريد" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "إغلاق" POPUPS_ASK: BUTTON_YES: "نعم" BUTTON_NO: "لا" DESC_WANT_CLOSE_THIS_WINDOW: "هل أنت Ů…ŘŞŘŁŮŘŻ من رغبت٠باغلاق هذه الناŮذة؟" DESC_WANT_DELETE_MESSAGES: "هل أنت Ů…ŘŞŘŁŮŘŻ من رغبت٠بحذ٠هذه الرسائل؟" POPUPS_LANGUAGES: TITLE_LANGUAGES: "حدّد لغتŮ" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "قم باضاŮŘ© حساب؟" BUTTON_ADD_ACCOUNT: "إضاŮŘ©" TITLE_UPDATE_ACCOUNT: "ŘŞŘ­ŘŻŮŠŘ« الحساب؟" BUTTON_UPDATE_ACCOUNT: "ŘŞŘ­ŘŻŮŠŘ«" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "إضاŮŘ© هŮية؟" TITLE_UPDATE_IDENTITY: "ŘŞŘ­ŘŻŮŠŘ« الهŮية؟" BUTTON_ADD_IDENTITY: "إضاŮŘ©" BUTTON_UPDATE_IDENTITY: "ŘŞŘ­ŘŻŮŠŘ«" LABEL_EMAIL: "البريد الإلŮترŮني" LABEL_NAME: "الإسم" LABEL_REPLY_TO: "الرد-الى" LABEL_SIGNATURE: "التŮقيع" LABEL_CC: "نسخة الى" LABEL_BCC: "نسخة Ů…Ř®ŮŮŠŘ© الŮجهة" LABEL_SIGNATURE_INSERT_BEFORE: "قم بŮضع التŮقيع قبل النص المأخŮذ من الرسائل ŮŮŠ عملية الرد" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "إنشاء مجلد؟" LABEL_NAME: "إسم المجلد" LABEL_PARENT: "المجلد الأساسي" BUTTON_CREATE: "إنشاء" BUTTON_CANCEL: "إلغاء" BUTTON_CLOSE: "إغلاق" TITLE_CREATING_PROCESS: "ŮŠŘŞŮ… إنشاء المجلد" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "دمج جميع الرسائل من المجلد؟" BUTTON_CLEAR: "Clear" BUTTON_CANCEL: "إلغاء" BUTTON_CLOSE: "إغلاق" DANGER_DESC_WARNING: "تحذير!" DANGER_DESC_HTML_1: "هذا الإجراء سينجم عنه إزالة جميع Ů…Ř­ŘŞŮيات المجلد %FOLDER% بشŮŮ„ Ůامل" DANGER_DESC_HTML_2: "ŮŮŠ حال بدء العملية , Ůلا ŮŠŮ…Ůن ايقاŮها ا٠الغائها" TITLE_CLEARING_PROCESS: "...ŮŠŘŞŮ… دمج المجلد" POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP استيراد Ů…Ůتاح" BUTTON_IMPORT_OPEN_PGP_KEY: "استيراد" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "عرض OpenPGP key" BUTTON_SELECT: "ŘŞŘ­ŘŻŮŠŘŻ" BUTTON_CLOSE: "إغلاق" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP ŘŞŮليد Ů…Ůتاح" LABEL_EMAIL: "البريد الإلŮترŮني" LABEL_NAME: "الإسم" LABEL_PASSWORD: "Ůلمة السر" LABEL_KEY_BIT_LENGTH: "Ř·ŮŮ„ المŮتاح" BUTTON_GENERATE_OPEN_PGP_KEYS: "قم بالتŮليد" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "تسجيل" LABEL_ENCRYPT: "ŘŞŘ´Ůير" LABEL_PASSWORD: "Ůلمة السر" BUTTON_SIGN: "تسجيل" BUTTON_ENCRYPT: "ŘŞŘ´Ůير" BUTTON_SIGN_AND_ENCRYPT: "سجل ٠قم بالتشŮير" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP ŮŮ ŘŞŘ´Ůير" LABEL_KEY: "Ů…Ůتاح خاص" LABEL_PASSWORD: "Ůلمة السر" BUTTON_DECRYPT: "ŮŮ ŘŞŘ´Ůير" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "التأŮŘŻ من الهŮŮŠŘ© على مرحلتين" LABEL_CODE: "الŮŮŘŻ" BUTTON_TEST: "تجريب" POPUPS_FILTER: TITLE_CREATE_FILTER: "إنشاء عامل تصŮية؟" TITLE_EDIT_FILTER: "ŘŞŘ­ŘŻŮŠŘ« عامل التصŮية؟" FILTER_NAME: "الإسم" LEGEND_CONDITIONS: "الشرŮŘ·" LEGEND_ACTIONS: "التطبيقات" BUTTON_DONE: "إنتهاء" BUTTON_ADD_CONDITION: "إضاŮŘ© تطبيق" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "إنقل الى" SELECT_ACTION_FORWARD_TO: "أعد التŮجيه الى" SELECT_ACTION_REJECT: "الرŮض" SELECT_ACTION_VACATION_MESSAGE: "رسالة العطلة" SELECT_ACTION_DISCARD: "تجاهل" SELECT_FIELD_FROM: "من" SELECT_FIELD_RECIPIENTS: "المستلمين (الى أ٠نسخة الى)" SELECT_FIELD_SUBJECT: "المŮضŮŘą" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "الحجم" SELECT_TYPE_CONTAINS: "ŮŠŘ­ŘŞŮŮŠ" SELECT_TYPE_NOT_CONTAINS: "لايحتŮŮŠ" SELECT_TYPE_MATCHES: "يطابق (* Ů ? Ů…ŘŻŘąŮŮ…)" SELECT_TYPE_NOT_MATCHES: "لايطابق (* Ů ? Ů…ŘŻŘąŮŮ…)" SELECT_TYPE_REGEXP: "ممنهج" SELECT_TYPE_NOT_REGEXP: "غير ممنهج" SELECT_TYPE_EQUAL_TO: "مساŮŮŠ الى" SELECT_TYPE_NOT_EQUAL_TO: "غير مساŮŮŠ الى" SELECT_TYPE_OVER: "ŮŮŮ‚" SELECT_TYPE_UNDER: "ŘŞŘ­ŘŞ" SELECT_MATCH_ANY: "مطابق لإحدى الشرŮŘ·" SELECT_MATCH_ALL: "مطابق لجميع الشرŮŘ·" MARK_AS_READ_LABEL: "تعليمها بـ مقرŮءة" REPLY_INTERVAL_LABEL: "Ůترة الرد (بلأيام)" KEEP_LABEL: "الإحتŮاظ بها" STOP_LABEL: "لاتتŮق٠عن المعالجة بالشرŮŘ·" EMAIL_LABEL: "البريد الإلŮترŮني" VACATION_SUBJECT_LABEL: "المŮضŮŘą (خياري)" VACATION_MESSAGE_LABEL: "الرسالة" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "رŮض الرسالة" ALL_INCOMING_MESSAGES_DESC: "جميع الرسائل الŮاردة" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Ř­ŘŻŘŻ مجلدات النظام" SELECT_CHOOSE_ONE: "إختر Ůاحد" SELECT_UNUSE_NAME: "لاتستخدم" LABEL_SENT: "أرسلت" LABEL_DRAFTS: "المسŮدات" LABEL_SPAM: "الرسائل غير المرغŮب Ůيها" LABEL_TRASH: "المهملات" LABEL_ARCHIVE: "الأرشيŮ" BUTTON_CANCEL: "إلغاء" BUTTON_CLOSE: "إغلاق" NOTIFICATION_SENT: | You haven't selected "Sent" system folder messages are put to after sending. If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing.\n" NOTIFICATION_SPAM: | You haven't selected "Spam" system folder spamed messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_TRASH: | You haven't selected "Trash" system folder deleted messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "التحقق الثنائي (TOTP)" LABEL_ENABLE_TWO_FACTOR: "ŘŞŮعيل عملية التحقق الثنائي" LABEL_TWO_FACTOR_USER: "المستخدم" LABEL_TWO_FACTOR_STATUS: "الحالة" LABEL_TWO_FACTOR_SECRET: "السر" LABEL_TWO_FACTOR_BACKUP_CODES: "ŮŮŘŻ التحقق الإحتياطي" BUTTON_CREATE: "قم بإنشاء سر" BUTTON_ACTIVATE: "Ůعل" BUTTON_CLEAR: "Clear" BUTTON_LOGOUT: "تسجيل خرŮج" BUTTON_DONE: "إنتهى" BUTTON_TEST: "تجريب" LINK_TEST: "تجريب" BUTTON_SHOW_SECRET: "إظهار السر" BUTTON_HIDE_SECRET: "ŘĄŘ®Ůاء السر" TWO_FACTOR_REQUIRE_DESC: "حساب٠بحاجة الى إعداد مراحل التحقق الثنائية" TWO_FACTOR_SECRET_CONFIGURED_DESC: "ŘŞŮ… التŮŮين" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "لم ŮŠŘŞŮ… التŮŮين" TWO_FACTOR_SECRET_DESC: >- قم باستيراد هذه المعلŮمات لمرŮز ŘŞŮثيق ŘşŮغل باستخدام رمز الŮŮŠŮ-اّر ا٠بنسخ الŮŮŘŻ ŮŠŘŻŮياً (or other TOTP client) TWO_FACTOR_BACKUP_CODES_DESC: >- إذا لم ŘŞŘŞŮ…Ůن من الحصŮŮ„ على الŮŮŘŻ من مرŮز التŮثيق ŮŮŠ ŘşŮغل ŮŠŮ…Ůن٠إستخدام الŮŮŘŻ الإحتياطي لتسجيل الدخŮŮ„,ŮŮ„Ůن سيصبح ŮŮŘŻ الإحتياط غير Ůعال بعد ذل٠TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "لايمŮن٠تغيير هذه الإعدادات بدŮن تجريب." TITLES: LOADING: "..جاري التحميل" LOGIN: "تسجيل الدخŮŮ„" MAILBOX: "صندŮŮ‚ البريد" SETTINGS: "الإعدادات" COMPOSE: "إنشاء" UPLOAD: ERROR_FILE_IS_TOO_BIG: "حجم المل٠Ůبير جداً" ERROR_FILE_PARTIALLY_UPLOADED: "لقد ŘŞŮ… إضاŮŘ© المل٠بشŮŮ„ جزئي ..بسبب خطأ غير معرŮŮ" ERROR_NO_FILE_UPLOADED: "لم ŘŞŘŞŮ… عملية إضاŮŘ© الملŮات" ERROR_MISSING_TEMP_FOLDER: "المل٠المؤقت Ů…ŮŮ‚ŮŘŻ" ERROR_ON_SAVING_FILE: "Ř­ŘŻŘ« خطأ نتيجة إضاŮŘ© مل٠غير معرŮ٠النŮŘą" ERROR_FILE_TYPE: "نŮŘą المل٠مرŮŮض" ERROR_UNKNOWN: "Ř­ŘŻŘ« خطأ نتيجة إضاŮŘ© مل٠غير معرŮ٠النŮŘą" EDITOR: TEXT_SWITCHER_RICH_FORMATTING: "غني بالتنسيقات" TEXT_SWITCHER_CONFIRM: "التنسيقات ٠الصŮر المضاŮŘ© ستزال.. هل أنت Ů…ŘŞŘŁŮŘŻ من الإستمرار" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "الشخصي" LABEL_GENERAL_NAME: "العام" LABEL_CONTACTS_NAME: "جهات الإتصال" LABEL_FOLDERS_NAME: "المجلدات" LABEL_ACCOUNTS_NAME: "الحسابات" LABEL_IDENTITY_NAME: "الهŮŮŠŘ©" LABEL_IDENTITIES_NAME: "الهŮيات" LABEL_FILTERS_NAME: "ŘąŮامل التصŮŮŠŘ©" LABEL_TEMPLATES_NAME: "القŮالب" LABEL_SECURITY_NAME: "الأمان" LABEL_SOCIAL_NAME: "الشبŮات الإجتماعية" LABEL_THEMES_NAME: "المظاهر العامة" LABEL_CHANGE_PASSWORD_NAME: "Ůلمة السر" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "العŮŘŻŘ©" SETTINGS_FILTERS: LEGEND_FILTERS: "ŘąŮامل التصŮŮŠŘ©" BUTTON_SAVE: "Ř­Ůظ" BUTTON_ADD_FILTER: "إضاŮŘ© عامل تصŮŮŠŘ©" BUTTON_DELETE: "حذŮ" BUTTON_RAW_SCRIPT: "إستخدام ŘłŮربت مخصصة للمستخدم" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "\"%FOLDER%\" نقل الى" SUBNAME_FORWARD_TO: "\"%EMAIL%\" إعادة ŘŞŮجيه الى" SUBNAME_REJECT: "رŮض" SUBNAME_VACATION_MESSAGE: "رسالة العطلة" SUBNAME_DISCARD: "تجاهل" CAPABILITY_LABEL: "القدرة" LOADING_PROCESS: "ŘŞŘ­ŘŻŮŠŘ« قائمة ŘąŮامل التصŮŮŠŘ©" DELETING_ASK: "هل أنت Ů…ŘŞŘŁŮŘŻŘź" CHACHES_NEED_TO_BE_SAVED_DESC: "هذه التغييرات بحاجة الى أن ŮŠŘŞŮ… Ř­Ůظها على المخدم." SETTINGS_IDENTITY: LEGEND_IDENTITY: "الهŮŮŠŘ©" LABEL_DISPLAY_NAME: "الإسم" LABEL_REPLY_TO: "الرد-الى" LABEL_SIGNATURE: "التŮقيع" LABEL_ADD_SIGNATURE_TO_ALL: "قم بإضاŮŘ© ŘŞŮقيع٠على جميع الرسائل الصادرة" SETTINGS_SECURITY: LEGEND_SECURITY: "الأمان" LABEL_CONFIGURE_TWO_FACTOR: "ŘŞŮŮين عملية التأŮŘŻ ثنائية المراحل" LABEL_AUTOLOGOUT: "تسجيل الخرŮج التلقائي" AUTOLOGIN_NEVER_OPTION_NAME: "أبداَ" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% دقيقة" SETTINGS_GENERAL: LEGEND_GENERAL: "عام" LABEL_LANGUAGE: "اللغة" LABEL_IDENTITY: "الهŮŮŠŘ©" LABEL_LAYOUT: "التصميم" LABEL_LAYOUT_NO_SPLIT: "بدŮن إنقسام" LABEL_LAYOUT_VERTICAL_SPLIT: "إنقسام عمŮŘŻŮŠ" LABEL_LAYOUT_HORIZONTAL_SPLIT: "إنقسام ŘŁŮقي" LABEL_EDITOR: "المحرر النصي الأساسي" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "عادي" LABEL_EDITOR_HTML_FORCED: "Html (إجباري)" LABEL_EDITOR_PLAIN_FORCED: "عادي (إجباري)" LABEL_ANIMATION: "مؤثرات الŮاجهة الحية" LABEL_ANIMATION_FULL: "Ůامل" LABEL_ANIMATION_NORMAL: "عادي" LABEL_ANIMATION_NONE: "بدŮن" LABEL_VIEW_OPTIONS: "إظهار الخيارات" LABEL_USE_PREVIEW_PANE: "استخدام جزئية العرض الجانبي" LABEL_USE_CHECKBOXES_IN_LIST: "عرض مربعات التحديد ŮŮŠ القائمة" LABEL_USE_THREADS: "إستخدام المŮاضيع" LABEL_REPLY_SAME_FOLDER: "ضع الردŮŘŻ ŮŮŠ مجلد الرسالة التي ŮŠŘŞŮ… الرد عليها" LABEL_SHOW_IMAGES: "قم دائماَ بعرض الصŮر القادمة ŮŮŠ الرسالة" LABEL_SHOW_ANIMATION: "أظهر التأثيرات الخاصة" LABEL_MESSAGE_PER_PAGE: "الرسائل ŮŮŠ الصŮŘ­Ř©" LABEL_NOTIFICATIONS: "التنبيهات" LABEL_SOUND_NOTIFICATION: "صŮŘŞ التنبيهات" LABEL_CHROME_NOTIFICATION_DESC: "إظهار ناŮذة منبثقة ŮŮŠ حالة قدŮŮ… ايميل جديد" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ŘŞŮ… إعتراضها من قبل المتصŮŘ­)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "جهات الإتصال" LABEL_CONTACTS_AUTOSAVE: "قم باضاŮŘ© المستلمين تلقائيا الى ŘŻŮتر العناŮين" LEGEND_CONTACTS_SYNC: "(CardDAV)التزامن عن بعد" LABEL_CONTACTS_SYNC_ENABLE: "ŘŞŮعيل التزامن عن بعد" LABEL_CONTACTS_SYNC_SERVER: "المخدم" LABEL_CONTACTS_SYNC_AB_URL: "Ůصلة ŘŻŮتر العناŮين" LABEL_CONTACTS_SYNC_USER: "المستخدم" LABEL_CONTACTS_SYNC_PASSWORD: "Ůلمة السر" SETTINGS_THEMES: LEGEND_THEMES: "المظاهر العامة" LEGEND_THEMES_CUSTOM: "تجهيز المظهر المخصص" LABEL_CUSTOM_TYPE: "النŮŘą" LABEL_CUSTOM_TYPE_LIGHT: "Ůاتح" LABEL_CUSTOM_TYPE_DARK: "غامق" LABEL_CUSTOM_BACKGROUND_IMAGE: "الخلŮŮŠŘ©" BUTTON_UPLOAD_BACKGROUND_IMAGE: "(JPG, PNG)Ř­Ů…Ů„ صŮرة الخلŮŮŠŘ©" ERROR_FILE_IS_TOO_BIG: "حجم المل٠Ůبير جداً" ERROR_FILE_TYPE_ERROR: "مسمŮŘ­Ř© Ůقط(JPG,PNG)نŮŘą المل٠خطأ" ERROR_UNKNOWN: "Ř­ŘŻŘ« خطأ أثناء رŮŘą الملŮ" SETTINGS_SOCIAL: LEGEND_GOOGLE: "ŘşŮغل" BUTTON_GOOGLE_CONNECT: "إتصل بغŮغل" BUTTON_GOOGLE_DISCONNECT: "ŘĄŮصل الإتصال Ů…Řą ŘşŮغل" MAIN_GOOGLE_DESC: "بعد ŘŞŮعيل الإتصال Ů…Řą ŘşŮغل.. ŮŠŮ…Ůن٠تسجيل الدخŮŮ„ الى حساب٠باستخدام زر ŘşŮغل على صŮŘ­Ř© تسجيل الدخŮŮ„" LEGEND_FACEBOOK: "ŮيسبŮŮ" BUTTON_FACEBOOK_CONNECT: "إتصل بŮيسبŮŮ" BUTTON_FACEBOOK_DISCONNECT: "ŘĄŮصل الإتصال Ů…Řą ŮيسبŮŮ" MAIN_FACEBOOK_DESC: "بعد ŘŞŮعيل الإتصال Ů…Řą ŮيسبŮŮ.. ŮŠŮ…Ůن٠تسجيل الدخŮŮ„ الى حساب٠باستخدام زر ŮيسبŮ٠على صŮŘ­Ř© تسجيل الدخŮŮ„" LEGEND_TWITTER: "ŘŞŮيتر" BUTTON_TWITTER_CONNECT: "إتصل بتŮيتر" BUTTON_TWITTER_DISCONNECT: "ŘĄŮصل الإتصال بتŮيتر" MAIN_TWITTER_DESC: "بعد ŘŞŮعيل الإتصال Ů…Řą ŘŞŮيتر.. ŮŠŮ…Ůن٠تسجيل الدخŮŮ„ الى حساب٠باستخدام زر ŘŞŮيتر على صŮŘ­Ř© تسجيل الدخŮŮ„" SETTINGS_FOLDERS: LEGEND_FOLDERS: "قائمة المجلدات" BUTTON_CREATE: "أنشأ مجلد" BUTTON_DELETE: "حذŮ" BUTTON_SUBSCRIBE: "الإشتراŮ" BUTTON_UNSUBSCRIBE: "الغاء الإشتراŮ" LOADING_PROCESS: "جاري ŘŞŘ­ŘŻŮŠŘ« قائمة المجلدات" CREATING_PROCESS: "جاري إنشاء المجلد" DELETING_PROCESS: "جاري حذ٠المجلد" RENAMING_PROCESS: "جاري إعادة تسمية المجلد" DELETING_ASK: "هل أنت Ů…ŘŞŘŁŮŘŻŘź" TO_MANY_FOLDERS_DESC_1: "لدي٠الŮثير من المجلدات!" TO_MANY_FOLDERS_DESC_2: "لقد قمنا بإظهار جزء منهم ŘŞŮادياَ لضع٠الأداء" HELP_DELETE_FOLDER: "إحذ٠المجلد" HELP_SHOW_HIDE_FOLDER: "ŘĄŘ®Ůاء\\إظهار المجلد" HELP_CHECK_FOR_NEW_MESSAGES: "ŘŞŘŁŮŘŻ\\لاتتأŮŘŻ من ŮصŮŮ„ ايميلات جديدة" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "الحسابات" LEGEND_IDENTITIES: "الهŮيات" LEGEND_ACCOUNTS_AND_IDENTITIES: "الحسابات ٠الهŮيات" BUTTON_ADD_ACCOUNT: "قم باضاŮŘ© حساب" BUTTON_ADD_IDENTITY: "قم باضاŮŘ© هŮŮŠŘ©" BUTTON_DELETE: "إحذŮ" LOADING_PROCESS: "..جاري التحميل" DELETING_ASK: "هل أنت Ů…ŘŞŘŁŮŘŻŘź" DEFAULT_IDENTITY_LABEL: "الاŮتراضي" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "الهŮŮŠŘ©" LEGEND_IDENTITIES: "الهŮيات الإضاŮŮŠŘ©" LABEL_DEFAULT: "الاŮتراضي" LABEL_DISPLAY_NAME: "الإسم" LABEL_REPLY_TO: "الرد-الى" LABEL_SIGNATURE: "التŮŮŮŠŘą" LABEL_ADD_SIGNATURE_TO_ALL: "قم باضاŮŘ© التŮقيع الى جميع الرسائل الصادرة" BUTTON_ADD_IDENTITY: "قم بإضاŮŘ© هŮŮŠŘ©" BUTTON_DELETE: "حذŮ" LOADING_PROCESS: "جاري ŘŞŘ­ŘŻŮŠŘ« قائمة الهŮيات" DELETING_ASK: "هل أنت Ů…ŘŞŘŁŮŘŻŘź" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "غيّر Ůلمة السر" LABEL_CURRENT_PASSWORD: "Ůلمة السر الحالية" LABEL_NEW_PASSWORD: "Ůلمة السر الجديدة" LABEL_REPEAT_PASSWORD: "ŘŞŘŁŮŮŠŘŻ Ůلمة السر الجديدة" BUTTON_UPDATE_PASSWORD: "تعيين Ůلمة السر الجديدة" ERROR_PASSWORD_MISMATCH: "Ůلمات السر غير متطابقة,لطŮاَ أعد Ůتابتها" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP إستيراد Ů…Ůتاح" BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP ŘŞŮليد Ů…Ůتاح" TITLE_PRIVATE: "خاص" TITLE_PUBLIC: "عام" DELETING_ASK: "هل أنت Ů…ŘŞŘŁŮŘŻŘź" GENERATE_ONLY_HTTPS: "HTTPS Ůقط" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "مساعدة ŮŮŠ إختصارات Ů„ŮŘ­Ř© المŮاتيح" TAB_MAILBOX: "صندŮŮ‚ البريد" TAB_MESSAGE_LIST: "قائمة الرسائل" TAB_MESSAGE_VIEW: "عرض الرسائل" TAB_COMPOSE: "إنشاء" LABEL_OPEN_USER_DROPDOWN: "ŮŘŞŘ­ ناŮذة الأعضاء المنبثقة" LABEL_REPLY: "الرد" LABEL_REPLY_ALL: "الرد للجميع" LABEL_FORWARD: "إعادة التŮجيه" LABEL_FORWARD_MULTIPLY: "إعادة التŮجيه Ůمل٠مرŮŮ‚" LABEL_HELP: "المساعدة" LABEL_CHECK_ALL: "ŘŞŘ­ŘŻŮŠŘŻ جميع الرسائل" LABEL_ARCHIVE: "أرشيŮ" LABEL_DELETE: "حذŮ" LABEL_OPEN_THREAD: "ŮŘŞŘ­ المŮاضيع المحددة" LABEL_MOVE: "نقل" LABEL_READ: "إقرأ الرسائل المحددة" LABEL_UNREAD: "لاتقم بقراءة الرسائل المحددة" LABEL_IMPORTANT: "هام, النجمة/العلم الرسائل المحددة" LABEL_SEARCH: "بحث" LABEL_CANCEL_SEARCH: "إلغاء البحث" LABEL_FULLSCREEN_ENTER: "Ůضع ملء الشاشة" LABEL_VIEW_MESSAGE_ENTER: "مشاهدة الرسائل (بدŮن ناŮذة المشاهدة)" LABEL_SWITCH_TO_MESSAGE: "ŘŞŘ­ŮŮŠŮ„ الترŮيز الى الرسائل المحددة" LABEL_SWITCH_TO_FOLDER_LIST: "ŘŞŘ­ŮŮŠŮ„ الترŮيز الى قائمة المجلدات" LABEL_FULLSCREEN_TOGGLE: "ŘŞŮعيل Ůضعية ملء الشاشة" LABEL_BLOCKQUOTES_TOGGLE: "إقتباس الرسائل" LABEL_THREAD_NEXT: "الرسالة التالية ŮŮŠ المŮضŮŘą" LABEL_THREAD_PREV: "الرسالة السابقة من المŮضŮŘą" LABEL_PRINT: "طباعة" LABEL_EXIT_FULLSCREEN: "الخرŮج من Ůضع ملء الشاشة" LABEL_CLOSE_MESSAGE: "إغلاق الرسالة (بدŮن ناŮذة العرض)" LABEL_SWITCH_TO_LIST: "ŘŞŘ­ŮŮŠŮ„ الترŮيز الى قائمة الرسائل" LABEL_OPEN_COMPOSE_POPUP: "ŘĄŮŘŞŘ­ ناŮذة خاصة لإنشاء الرسائل" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "ŮŘŞŘ­ قائمة الهŮيات" LABEL_SAVE_MESSAGE: "Ř­Ůظ الرسالة" LABEL_SEND_MESSAGE: "إرسال الرسالة" LABEL_CLOSE_COMPOSE: "إغلاق الرسالة" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "لم ŮŠŘŞŮ… إيجاد المŮتاح العام" NO_PUBLIC_KEYS_FOUND_FOR: "لم ŮŠŘŞŮ… إيجاد Ů…Ůتاح عام\"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "لم ŮŠŘŞŮ… إيجاد Ů…Ůتاح خاص" NO_PRIVATE_KEY_FOUND_FOR: "لم ŮŠŘŞŮ… إيجاد المŮتاح الخاص لـ \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" UNVERIFIRED_SIGNATURE: "ŘŞŮقيع غير Ů…Ůثق" DECRYPTION_ERROR: "OpenPGP خطأ ŮŮ ŘŞŘ´Ůير" GOOD_SIGNATURE: "ŘŞŮقيع جيد من %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "يرجى التأŮŘŻ من الإيميل" SPECIFY_AT_LEAST_ONE_RECIPIENT: "يرجى ŘŞŘ­ŘŻŮŠŘŻ مستلم Ůاحد على الأقل" NOTIFICATIONS: INVALID_TOKEN: "خاطىء token" AUTH_ERROR: "خطأ ŮŮŠ Ůلمة السر \\اسم المستخدم" ACCESS_ERROR: "خطأ ŮŮŠ الŮصŮŮ„" CONNECTION_ERROR: "لايمŮن الإتصال بالمخدم" CAPTCHA_ERROR: "رمز تحقق خاطىء." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- إن المعر٠الإجتماعي غير مرتبط بـ ŘŁŮŠ حساب حالياَ. سجل الدخŮŮ„ الى مرŮز التŮثيق ŮŮŠ بريد٠الإلŮترŮني ŮŮعل هذه الخاصية ŮŮŠ إعدادات حساب٠SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- إن المعر٠الإجتماعي غير مرتبط بـ ŘŁŮŠ حساب حالياَ. سجل الدخŮŮ„ الى مرŮز التŮثيق ŮŮŠ بريد٠الإلŮترŮني ŮŮعل هذه الخاصية ŮŮŠ إعدادات حساب٠SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- إن المعر٠الإجتماعي غير مرتبط بـ ŘŁŮŠ حساب حالياَ. سجل الدخŮŮ„ الى مرŮز التŮثيق ŮŮŠ بريد٠الإلŮترŮني ŮŮعل هذه الخاصية ŮŮŠ إعدادات حساب٠DOMAIN_NOT_ALLOWED: "غير مسمŮŘ­ لهذا المŮقع" ACCOUNT_NOT_ALLOWED: "الحساب غير مسمŮŘ­ له" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "عامل التحقق الثنائي من الهŮŮŠŘ© Ů…Ř·Ů„Ůب" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطأ ŮŮŠ عملية التحقق الثنائية" COULD_NOT_SAVE_NEW_PASSWORD: "لم نتمŮن من Ř­Ůظ Ůلمة السر الجديدة" CURRENT_PASSWORD_INCORRECT: "Ůلمة السر الحالية خاطئة" NEW_PASSWORD_SHORT: "Ůلمة السر قصيرة جداً" NEW_PASSWORD_WEAK: "Ůلمة السر سهلة جداً" NEW_PASSWORD_FORBIDDENT: "Ůلمة السر ŘŞŘ­ŘŞŮŮŠ على محار٠غير مسمŮŘ­ بها" CONTACTS_SYNC_ERROR: "خطأ ŮŮŠ مزامنة جهات الإتصال" CANT_GET_MESSAGE_LIST: "لايمŮن الŮصŮŮ„ الى قائمة الرسائل" CANT_GET_MESSAGE: "لايمŮن الŮصŮŮ„ الى الرسالة" CANT_DELETE_MESSAGE: "لايمŮن حذ٠الرسالة" CANT_MOVE_MESSAGE: "لايمŮن نقل الرسالة" CANT_SAVE_MESSAGE: "لايمŮن Ř­Ůظ الرسالة" CANT_SEND_MESSAGE: "لايمŮن إرسال الرسالة" INVALID_RECIPIENTS: "يرجى التأŮŘŻ من عناŮين المرسل اليهم" CANT_SAVE_FILTERS: "لايمŮن Ř­Ůظ عامل التصŮŮŠŘ©" CANT_GET_FILTERS: "لايمŮن الŮصŮŮ„ الى ŘąŮامل التصŮŮŠŘ©" FILTERS_ARE_NOT_CORRECT: "ŘąŮامل التصŮŮŠŘ© خطأ" CANT_CREATE_FOLDER: "لايمŮن إنشاء مجلد" CANT_RENAME_FOLDER: "لايمŮن إعادة تسمية المجلد" CANT_DELETE_FOLDER: "لايمŮن حذ٠المجلد" CANT_DELETE_NON_EMPTY_FOLDER: "لايمŮن حذ٠مجلد ممتلأ" CANT_SUBSCRIBE_FOLDER: "لايمŮن الإشترا٠بالمجلد" CANT_UNSUBSCRIBE_FOLDER: "لايمŮن حذ٠الإشترا٠من المجلد" CANT_SAVE_SETTINGS: "لايمŮن Ř­Ůظ الإعدادات" CANT_SAVE_PLUGIN_SETTINGS: "لايمŮن Ř­Ůظ الإعدادات" DOMAIN_ALREADY_EXISTS: "المŮقع Ů…ŮجŮŘŻ مسبقاَ" CANT_INSTALL_PACKAGE: "ŮŘ´Ů„ ŮŮŠ تنزيل الحزمة" CANT_DELETE_PACKAGE: "ŮŘ´Ů„ ŮŮŠ إزالة الحزمة" INVALID_PLUGIN_PACKAGE: "خطأ ŮŮŠ الحزمة المراد تنزيلها" UNSUPPORTED_PLUGIN_PACKAGE: "حزمة غير Ů…ŘŻŘąŮŮ…Ř©" LICENSING_SERVER_IS_UNAVAILABLE: "مخدم الإشتراŮات غير Ů…ŘŞŮŮر" LICENSING_DOMAIN_EXPIRED: "الإشترا٠لهذا المŮقع قد انتهى" LICENSING_DOMAIN_BANNED: "الإشترا٠لهذا المŮقع قد ŘŞŮ… حجبه" DEMO_SEND_MESSAGE_ERROR: "لأسباب أمنية, هذا الحساب غير مسمŮŘ­ له إرسال رسائل" DEMO_ACCOUNT_ERROR: "لأسباب أمنية , هذا الحساب قد منع من هذا الإجراء" ACCOUNT_ALREADY_EXISTS: "الحساب Ů…ŮجŮŘŻ مسبقاَ" ACCOUNT_DOES_NOT_EXIST: "الحساب المطلŮب غير Ů…ŮجŮŘŻ" MAIL_SERVER_ERROR: "Ř­ŘŻŘ« خطأ أثناء محاŮلة الŮصŮŮ„ الى المخدم البريدي" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "خطأ غير معرŮŮ" STATIC: BACK_LINK: "إعادة التحميل" DOMAIN_LIST_DESC: "قائمة المŮاقع البريدية المسمŮŘ­ Ůيها لهذا البريد بالŮصŮŮ„" PHP_EXSTENSIONS_ERROR_DESC: "!إضاŮات الـ بي ŘĄŘŞŘ´ بي المطلŮبة,غير Ů…ŘŞŮاŮرة ŮŮŠ إعدادات الـ بي ŘĄŘŞŘ´ بي لديŮ" PHP_VERSION_ERROR_DESC: "أقل من الإصدار المطلŮب 5.3.0!(%VERSION%) PHP إصدار" NO_SCRIPT_TITLE: "الجاŮا ŘłŮريبت Ů…Ř·Ů„Ůبة لهذا البرنامج" NO_SCRIPT_DESC: |- إن متصŮح٠لايدعم الجاŮا ŘłŮريبت . يرجى ŘŞŮعيل الدعم أ٠تجريب متصŮŘ­ أخر NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "متصŮح٠بحاجة الى ŘŞŘ­ŘŻŮŠŘ«" BAD_BROWSER_DESC: |- لإصتخدام جميع ميزات هذا البرنامج يرجى تنزيل ŘŁŘ­ŘŻ المتصŮحات التالية الداعمة: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml000066400000000000000000001242561361462701300261510ustar00rootroot00000000000000bg_BG: LOGIN: LABEL_EMAIL: "ĐкаŃнт" LABEL_LOGIN: "Логин" LABEL_PASSWORD: "Парола" LABEL_SIGN_ME: "ВпиŃи ме" LABEL_VERIFICATION_CODE: "Код за потвърждение" LABEL_DONT_ASK_VERIFICATION_CODE: "Не питай за код в продължение на 2 Ńедмици" BUTTON_SIGN_IN: "Вход" TITLE_SIGN_IN_GOOGLE: "Вход Ń Google" TITLE_SIGN_IN_FACEBOOK: "Вход Ń Facebook" TITLE_SIGN_IN_TWITTER: "Вход Ń Twitter" LABEL_FORGOT_PASSWORD: "Забравена парола" LABEL_REGISTRATION: "РегиŃтрация" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Добави акаŃнт" BUTTON_SETTINGS: "НаŃтройки" BUTTON_HELP: "Помощ" BUTTON_LOGOUT: "Đзход" MOBILE: BUTTON_MOBILE_VERSION: "Мобилна верŃия" BUTTON_DESKTOP_VERSION: "ДеŃктоп верŃия" SEARCH: MAIN_INPUT_PLACEHOLDER: "ТърŃене" TITLE_ADV: "РазŃирено търŃене" LABEL_ADV_FROM: "От" LABEL_ADV_TO: "За" LABEL_ADV_SUBJECT: "Заглавие" LABEL_ADV_TEXT: "ТекŃŃ‚" LABEL_ADV_HAS_ATTACHMENT: "Đма приложен файл" LABEL_ADV_HAS_ATTACHMENTS: "Đма приложени файлове" LABEL_ADV_FLAGGED: "Отбелязано Ń Ń„Đ»Đ°Đł" LABEL_ADV_UNSEEN: "Невидяно" LABEL_ADV_DATE: "Дата" LABEL_ADV_DATE_ALL: "Đ’Ńички" LABEL_ADV_DATE_3_DAYS: "До 3 дена" LABEL_ADV_DATE_7_DAYS: "До 1 Ńедмица" LABEL_ADV_DATE_MONTH: "До 1 меŃец" LABEL_ADV_DATE_3_MONTHS: "До 3 меŃеца" LABEL_ADV_DATE_6_MONTHS: "До 6 меŃеца" LABEL_ADV_DATE_YEAR: "До 1 година" BUTTON_ADV_SEARCH: "ТърŃи" PREVIEW_POPUP: FULLSCREEN: "На цял екран" ZOOM: "Приближи/отдалечи" CLOSE: "Затваряне (Esc)" LOADING: "Зареждане..." GALLERY_PREV: "ПредиŃно (Đ‘Ńтон лява Ńтрелка)" GALLERY_NEXT: "Следващо (Đ‘Ńтон Đ´ŃŹŃна Ńтрелка)" GALLERY_COUNTER: "%curr% от %total%" IMAGE_ERROR: "Đзображението не беŃе заредено." AJAX_ERROR: "Съдържанието не беŃе заредено." FOLDER_LIST: BUTTON_COMPOSE: "Създай" BUTTON_CONTACTS: "Контакти" BUTTON_NEW_MESSAGE: "Ново Ńъобщение" INBOX_NAME: "Đ’Ń…. ĐşŃтия" SENT_NAME: "Đзпратени" DRAFTS_NAME: "Чернови" SPAM_NAME: "Спам" TRASH_NAME: "КоŃче" ARCHIVE_NAME: "Đрхив" QUOTA: TITLE: "Đзползване по дялове" MESSAGE_LIST: BUTTON_RELOAD: "Презареди ŃпиŃъка ŃŃŠŃ Ńъобщения" BUTTON_MOVE_TO: "ПремеŃти в" BUTTON_DELETE: "Đзтрий" BUTTON_ARCHIVE: "Đрхивирай" BUTTON_SPAM: "Спам" BUTTON_NOT_SPAM: "Не е Ńпам" BUTTON_EMPTY_FOLDER: "ĐзчиŃти папката" BUTTON_MULTY_FORWARD: "Препрати като прикачен/и файл/ове" BUTTON_DELETE_WITHOUT_MOVE: "Đзтриване завинаги" BUTTON_MORE: "Още" MENU_SET_SEEN: "Маркирай като прочетено" MENU_SET_ALL_SEEN: "Маркирай вŃички като прочетени" MENU_UNSET_SEEN: "Маркиране като непрочетено" MENU_SET_FLAG: "Отбележи Ń Ń„Đ»Đ°Đł" MENU_UNSET_FLAG: "Премахни флага" MENU_SELECT_ALL: "Đ’Ńичко" MENU_SELECT_NONE: "Нито едно" MENU_SELECT_INVERT: "Размени" MENU_SELECT_UNSEEN: "Непрочетени" MENU_SELECT_SEEN: "Прочетени" MENU_SELECT_FLAGGED: "Маркирани Ń Ń„Đ»Đ°Đł" MENU_SELECT_UNFLAGGED: "С премахнат флаг" EMPTY_LIST: "Празен ŃпиŃŃŠĐş." EMPTY_SEARCH_LIST: "Няма Ńъобщения, които да отговарят на търŃенето." SEARCH_RESULT_FOR: "РезŃлтати от търŃенето за \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "Обратно при Ńъобщенията" LIST_LOADING: "Зареждане" EMPTY_SUBJECT_TEXT: "(Няма заглавие)" PUT_MESSAGE_HERE: "ĐźŃŃнете Ńъобщението Ń‚ŃĐş, за да го видите в ŃпиŃъка" TODAY_AT: "Đ´Đ˝ĐµŃ Đ˛ %TIME%" YESTERDAY_AT: "вчера в %TIME%" SEARCH_PLACEHOLDER: "ТърŃене" NEW_MESSAGE_NOTIFICATION: "Đмате %COUNT% нови Ńъобщения!" QUOTA_SIZE: "Đзползване на %SIZE% (%PROC%%) от ваŃите %LIMIT%" MESSAGE: BUTTON_EDIT: "Редактирай" BUTTON_BACK: "Назад" BUTTON_CLOSE: "Затвори" BUTTON_DELETE: "Đзтрий" BUTTON_UNSUBSCRIBE: "ОтпиŃване от този лиŃŃ‚" BUTTON_ARCHIVE: "Đрхивирай" BUTTON_SPAM: "Спам" BUTTON_NOT_SPAM: "Не е Ńпам" BUTTON_MOVE_TO: "ПремеŃти в" BUTTON_MORE: "Още" BUTTON_REPLY: "Отговори" BUTTON_REPLY_ALL: "Отговори на вŃички" BUTTON_FORWARD: "Препрати" BUTTON_FORWARD_AS_ATTACHMENT: "Препрати като прикрепен файл" BUTTON_EDIT_AS_NEW: "Редактирай като ново" BUTTON_SHOW_IMAGES: "Показване на вънŃните изображения" BUTTON_NOTIFY_READ_RECEIPT: "Đзпращачът е помолил да бъде Ńведомен, когато прочетете това Ńъобщение." BUTTON_IN_NEW_WINDOW: "Прегледай в отделен прозорец" BUTTON_THREAD_LIST: "СпиŃŃŠĐş Ń Ń€Đ°Đ·ĐłĐľĐ˛ĐľŃ€Đ¸" BUTTON_THREAD_PREV: "ПредиŃно" BUTTON_THREAD_NEXT: "Следващо" BUTTON_THREAD_MORE: "Още Ńъобщения" MENU_HEADERS: "Покажи хедъра на Ńъобщението" MENU_VIEW_ORIGINAL: "Покажи източника" MENU_DOWNLOAD_ORIGINAL: "Đзтегли като .eml файл" MENU_FILTER_SIMILAR: "Филтрирай Ńъобщения като това" MENU_PRINT: "Принтирай" EMPTY_SUBJECT_TEXT: "(Няма заглавие)" LABEL_SUBJECT: "Заглавие" LABEL_DATE: "Дата" LABEL_FROM: "От" LABEL_FROM_SHORT: "от" LABEL_TO: "До" LABEL_TO_SHORT: "Đ´Đľ" LABEL_CC: "Копие Đ´Đľ" LABEL_BCC: "Скрито копие Đ´Đľ" LABEL_REPLY_TO: "Отговори на" PRINT_LABEL_FROM: "От" PRINT_LABEL_TO: "До" PRINT_LABEL_CC: "Копие Đ´Đľ" PRINT_LABEL_BCC: "Скрито копие Đ´Đľ" PRINT_LABEL_REPLY_TO: "Отговори на" PRINT_LABEL_DATE: "Дата" PRINT_LABEL_SUBJECT: "Заглавие" PRINT_LABEL_ATTACHMENTS: "Прикрепени файлове" MESSAGE_LOADING: "Зареждане" MESSAGE_VIEW_DESC: "Đзберете Ńъобщение, за да го видите Ń‚ŃĐş." MESSAGE_VIEW_MOVE_DESC: "Đзберете цел от папките в лявото поле" PGP_PASSWORD_INPUT_PLACEHOLDER: "Парола" PGP_SIGNED_MESSAGE_DESC: "ПодпиŃано Ń OpenPGP (кликни за проверка)" PGP_ENCRYPTED_MESSAGE_DESC: "Шифровано Ń OpenPGP (кликни за проверка)" LINK_DOWNLOAD_AS_ZIP: "Свали като ZIP файл" LINK_SAVE_TO_OWNCLOUD: "Запази в ownCloud" LINK_SAVE_TO_CLOUD: "Запазване в облака" LINK_SAVE_TO_DROPBOX: "Запази в Dropbox" READ_RECEIPT: SUBJECT: "Обратна разпиŃка (видяно) - %SUBJECT%" BODY: | Това е обратна разпиŃка за Ńъобщението, което изпратихте Đ´Đľ %READ-RECEIPT%. Note: Тази обратна разпиŃка Ńамо Ńказва, че Ńъобщението е показано на компютъра на полŃчателя. Няма гаранция, че полŃчателят е прочел или разбрал Ńъдържанието на Ńъобщението. SUGGESTIONS: SEARCHING_DESC: "ТърŃене..." CONTACTS: LEGEND_CONTACTS: "Контакти" SEARCH_INPUT_PLACEHOLDER: "ТърŃене" BUTTON_ADD_CONTACT: "Добави контакт" BUTTON_CREATE_CONTACT: "Създай" BUTTON_UPDATE_CONTACT: "Обнови" BUTTON_IMPORT: "Đмпортирай (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "ЕкŃпортирай (vcf, vCard)" BUTTON_EXPORT_CSV: "ЕкŃпортирай (csv)" ERROR_IMPORT_FILE: "ГреŃка при импортирането (невалиден формат на файла)" LIST_LOADING: "Зареждане" EMPTY_LIST: "ТŃĐş няма контакти" EMPTY_SEARCH: "Не Ńа намерени контакти" CLEAR_SEARCH: "ĐзчиŃтване на търŃенето" CONTACT_VIEW_DESC: "Đзберете контакт от ŃпиŃъка, за да го видите Ń‚ŃĐş." LABEL_DISPLAY_NAME: "Показване на име" LABEL_EMAIL: "Đмейл" LABEL_PHONE: "Телефон" LABEL_WEB: "Страница" LABEL_BIRTHDAY: "Рожден ден" LINK_ADD_EMAIL: "Добави имейл адреŃ" LINK_ADD_PHONE: "Добави телефон" LINK_BIRTHDAY: "Рожден ден" PLACEHOLDER_ENTER_DISPLAY_NAME: "Въвеждете името, което ще Ńе показва" PLACEHOLDER_ENTER_LAST_NAME: "Въведете фамилия" PLACEHOLDER_ENTER_FIRST_NAME: "Въведете име" PLACEHOLDER_ENTER_NICK_NAME: "Въведете прякор" LABEL_READ_ONLY: "Само за четене" LABEL_SHARE: "Сподели" ADD_MENU_LABEL: "Добави" ADD_MENU_NICKNAME: "Прякор" ADD_MENU_NOTES: "Бележки" ADD_MENU_EMAIL: "Đмейл" ADD_MENU_PHONE: "Телефон" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "ĐдреŃ" ADD_MENU_BIRTHDAY: "Рожден ден" ADD_MENU_TAGS: "Етикети" BUTTON_SHARE_NONE: "Няма" BUTTON_SHARE_ALL: "Đ’Ńички" BUTTON_SYNC: "Синхронизация (CardDAV)" COMPOSE: TITLE_FROM: "От" TITLE_TO: "За" TITLE_CC: "Копие Đ´Đľ" TITLE_BCC: "Скрито копие Đ´Đľ" TITLE_REPLY_TO: "Отговори на" TITLE_SUBJECT: "Заглавие" LINK_SHOW_INPUTS: "покажи вŃички полета" BUTTON_SEND: "Đзпрати" BUTTON_SAVE: "Запази" BUTTON_DELETE: "Đзтрий" BUTTON_CANCEL: "Отказ" BUTTON_MINIMIZE: "Свий прозореца" SAVED_TIME: "Запазено в %TIME%" SAVED_ERROR_ON_SEND: "Съобщението беŃе изпратено, но не беŃе запазено в папката Ń Đ¸Đ·ĐżŃ€Đ°Ń‚ĐµĐ˝Đ¸ Ńъобщения" DISCARD_UNSAVED_DATA: "Đзтрий незапаметеното?" ATTACH_FILES: "Прикрепете файлове" ATTACH_DROP_FILES_DESC: "ĐźŃŃнете файловете Ń‚ŃĐş" ATTACH_ITEM_CANCEL: "Отказ" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% напиŃа" FORWARD_MESSAGE_TOP_TITLE: "-------- Препратено Ńъобщение -------" FORWARD_MESSAGE_TOP_FROM: "От" FORWARD_MESSAGE_TOP_TO: "За" FORWARD_MESSAGE_TOP_CC: "Копие Đ´Đľ" FORWARD_MESSAGE_TOP_SENT: "Đзпратено" FORWARD_MESSAGE_TOP_SUBJECT: "Заглавие" EMPTY_TO_ERROR_DESC: "Моля, изберте поне един полŃчател" NO_ATTACHMENTS_HERE_DESC: "Няма прикрепени файлове." ATTACHMENTS_ERROR_DESC: "Внимание! Не вŃички прикачени файлове Ńа качени." ATTACHMENTS_UPLOAD_ERROR_DESC: "Đ’Ńе още не Ńа качени вŃички прикрепени файлове" BUTTON_REQUEST_READ_RECEIPT: "ПоиŃкайте разпиŃка за прочитане на Ńъобщението" BUTTON_MARK_AS_IMPORTANT: "Отбележи като важно" BUTTON_OPEN_PGP: "OpenPGP (ЧиŃŃ‚ текŃŃ‚)" BUTTON_REQUEST_DSN: "Уведомяване при Đ´ĐľŃтавка" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Затвори" POPUPS_ASK: BUTTON_YES: "Да" BUTTON_NO: "Не" DESC_WANT_CLOSE_THIS_WINDOW: "СигŃрни ли Ńте, че желаете да затворите този прозорец?" DESC_WANT_DELETE_MESSAGES: "СигŃрни ли Ńте, че желаете да изтриете Ńъобщението/Ńъобщенията?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Đзбери език" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Добавяне на акаŃнт?" BUTTON_ADD_ACCOUNT: "Добави" TITLE_UPDATE_ACCOUNT: "Обнови акаŃнта?" BUTTON_UPDATE_ACCOUNT: "Обнови" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Добавяне на идентичноŃŃ‚?" TITLE_UPDATE_IDENTITY: "Обновяване на идентичноŃŃ‚?" BUTTON_ADD_IDENTITY: "Добавяне" BUTTON_UPDATE_IDENTITY: "Обновяване" LABEL_EMAIL: "Đмейл" LABEL_NAME: "Đме" LABEL_REPLY_TO: "Отговорете на" LABEL_SIGNATURE: "ПодпиŃ" LABEL_CC: "Копие Đ´Đľ" LABEL_BCC: "Скрито копие Đ´Đľ" LABEL_SIGNATURE_INSERT_BEFORE: "ПодпиŃа да Ńе поŃтавя преди цитирания текŃŃ‚ при отговор" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Създаване на папка?" LABEL_NAME: "Đме на папка" LABEL_PARENT: "РодителŃка папка" BUTTON_CREATE: "Създай" BUTTON_CANCEL: "Отказ" BUTTON_CLOSE: "Затвори" TITLE_CREATING_PROCESS: "Създаване на папка" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "ПрочиŃтване на вŃички Ńъобщения от папката?" BUTTON_CLEAR: "ĐзчиŃти" BUTTON_CANCEL: "Отказ" BUTTON_CLOSE: "Затвори" DANGER_DESC_WARNING: "Внимание!" DANGER_DESC_HTML_1: "Това дейŃтвие ще доведе Đ´Đľ премахването на вŃички мейли от папката %FOLDER%." DANGER_DESC_HTML_2: "Веднъж започнат, този ĐżŃ€ĐľŃ†ĐµŃ Đ˝Đµ може да бъде прекратен или отказан." TITLE_CLEARING_PROCESS: "ПрочиŃтване на папката..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "ВнаŃяне на OpenPGP ключ" BUTTON_IMPORT_OPEN_PGP_KEY: "ВнеŃи" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Виж OpenPGP ключа" BUTTON_SELECT: "Đзбери" BUTTON_CLOSE: "Затвори" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Създаване на OpenPGP ключове" LABEL_EMAIL: "Email" LABEL_NAME: "Đме" LABEL_PASSWORD: "Парола" LABEL_KEY_BIT_LENGTH: "Дължина на ключа" BUTTON_GENERATE_OPEN_PGP_KEYS: "Създай" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "ПодпиŃи/Ńифровай Ń OpenPGP" LABEL_SIGN: "ПодпиŃи" LABEL_ENCRYPT: "Шифровай" LABEL_PASSWORD: "Парола" BUTTON_SIGN: "ПодпиŃи" BUTTON_ENCRYPT: "Шифровай" BUTTON_SIGN_AND_ENCRYPT: "ПодпиŃи и Ńифровай" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "ДеŃифриране Ń OpenPGP" LABEL_KEY: "ЧаŃтен ключ" LABEL_PASSWORD: "Парола" BUTTON_DECRYPT: "ДеŃифрирай" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "ДвŃŃтъпков теŃŃ‚ за ŃĐ´ĐľŃтоверяване" LABEL_CODE: "Код" BUTTON_TEST: "ТеŃŃ‚" POPUPS_FILTER: TITLE_CREATE_FILTER: "Създай филтър?" TITLE_EDIT_FILTER: "Обнови филтъра?" FILTER_NAME: "Đме" LEGEND_CONDITIONS: "ĐŁŃловия" LEGEND_ACTIONS: "ДейŃтвия" BUTTON_DONE: "Готово" BUTTON_ADD_CONDITION: "Добави ŃŃловие" SELECT_ACTION_NONE: "Няма" SELECT_ACTION_MOVE_TO: "ПремеŃти в" SELECT_ACTION_FORWARD_TO: "Препрати към" SELECT_ACTION_REJECT: "Отхвърли" SELECT_ACTION_VACATION_MESSAGE: "Съобщение в отпŃŃка" SELECT_ACTION_DISCARD: "Отхвърли" SELECT_FIELD_FROM: "От" SELECT_FIELD_RECIPIENTS: "ПолŃчатели (\"До\" и \"Копие Đ´Đľ\")" SELECT_FIELD_SUBJECT: "Тема" SELECT_FIELD_HEADER: "Заглавие" SELECT_FIELD_SIZE: "Размер" SELECT_TYPE_CONTAINS: "Съдържа" SELECT_TYPE_NOT_CONTAINS: "Не Ńъдържа" SELECT_TYPE_MATCHES: "Съвпада Ń (поддържат Ńе ? и *)" SELECT_TYPE_NOT_MATCHES: "Не Ńъвпада Ń (поддържат Ńе ? и *)" SELECT_TYPE_REGEXP: "РегŃлярен израз" SELECT_TYPE_NOT_REGEXP: "Не регŃлярен израз" SELECT_TYPE_EQUAL_TO: "Равно на" SELECT_TYPE_NOT_EQUAL_TO: "Не е равно на" SELECT_TYPE_OVER: "Над" SELECT_TYPE_UNDER: "Под" SELECT_MATCH_ANY: "Съвпада Ń ĐšĐžĐ•Đ˘Đž РДРЕ правило от" SELECT_MATCH_ALL: "Съвпада Ń Đ’ĐˇĐЧКРправила от" MARK_AS_READ_LABEL: "Отбележи като прочетено" REPLY_INTERVAL_LABEL: "За колко време (дни)" KEEP_LABEL: "Запази" STOP_LABEL: "Да не Ńпира да обработва правилата" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Тема (незадължително)" VACATION_MESSAGE_LABEL: "Съобщение" VACATION_RECIPIENTS_LABEL: "ПолŃчатели (разделени ŃŃŠŃ Đ·Đ°ĐżĐµŃ‚Đ°ŃŹ)" REJECT_MESSAGE_LABEL: "Отхвърли Ńъобщението" ALL_INCOMING_MESSAGES_DESC: "Đ’Ńички приŃтигащи Ńъобщения" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Đзбери ŃиŃтемни папки" SELECT_CHOOSE_ONE: "Đзбери един" SELECT_UNUSE_NAME: "Не използвай" LABEL_SENT: "Đзпратени" LABEL_DRAFTS: "Чернови" LABEL_SPAM: "Спам" LABEL_TRASH: "КоŃче" LABEL_ARCHIVE: "Đрхив" BUTTON_CANCEL: "Отказ" BUTTON_CLOSE: "Затвори" NOTIFICATION_SENT: | Не Ńте избрали ŃиŃтемна папка, в която изпратените Ńъобщения "Đзпратени" да бъдат Ńъхранявани Ńлед изпращането им. Đко нежелаете да запазвате изпратено Ńъобщение, моля, изберете опцията "Не използвай". NOTIFICATION_DRAFTS: "Не Ńте избрали ŃиŃтемна папка, в която Ńъобщенията \"Чернови\" да бъдат Ńъхранявани по време на ŃŃŠŃтавянето на имейл." NOTIFICATION_SPAM: | Не Ńте избрали ŃиŃтемна папка, в която Ńъобщенията "Спам" да бъдат поŃтавяни. Đко желаете да премахнете Ńъобщенията окончателно, моля, изберете опцята "Не използвай". NOTIFICATION_TRASH: | Не Ńте избрали ŃиŃтемна папка, в която изтритите Ńъобщения "Отпадък" да бъдат поŃтавяни. Đко желаете да премахнете Ńъобщенията окончателно, моля изберете опцията "Не използвай". NOTIFICATION_ARCHIVE: "Не Ńте избрали иŃтемна папка, в която архивираните Ńъобщения \"Đрхив\" да бъдат поŃтавяни." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "ДвŃŃтъпкова проверка" LABEL_ENABLE_TWO_FACTOR: "Включи двŃŃтъпковата проверка" LABEL_TWO_FACTOR_USER: "Потребител" LABEL_TWO_FACTOR_STATUS: "СъŃтояние" LABEL_TWO_FACTOR_SECRET: "Тайна" LABEL_TWO_FACTOR_BACKUP_CODES: "Резервни кодове" BUTTON_CREATE: "Създай нова тайна" BUTTON_ACTIVATE: "Đктивирай" BUTTON_CLEAR: "ĐзчиŃти" BUTTON_LOGOUT: "Đзлез" BUTTON_DONE: "Готово" BUTTON_TEST: "ТеŃŃ‚" LINK_TEST: "теŃŃ‚" BUTTON_SHOW_SECRET: "Покажи тайната" BUTTON_HIDE_SECRET: "Скрий тайната" TWO_FACTOR_REQUIRE_DESC: "ВаŃият акаŃнт изиŃква двŃŃтъпкова проверка." TWO_FACTOR_SECRET_CONFIGURED_DESC: "НаŃтроена" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не е наŃтроена" TWO_FACTOR_SECRET_DESC: > ВнеŃете тази информация във ваŃият Google Authenticator клиент (или Đ´Ń€ŃĐł TOTP клиент) чрез предоŃтавения QR код или чрез въвеждане на кода ръчно. TWO_FACTOR_BACKUP_CODES_DESC: > Đко не можете да полŃчавате кодове от Google Authenticator (или Đ´Ń€ŃĐł TOTP клиент), можете да използвате резервни кодове за влизане. След като използвате някой, той Ńтава невалиден. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Не можете да промените наŃтройките, преди да ги теŃтвате." TITLES: LOADING: "Зареждане" LOGIN: "ВпиŃване" MAILBOX: "ПощенŃка ĐşŃтия" SETTINGS: "НаŃтройки" COMPOSE: "Ново Ńъобщение" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Файлът е твърде голям" ERROR_FILE_PARTIALLY_UPLOADED: "Файлът е чаŃтично качен поради неизвеŃтна греŃка" ERROR_NO_FILE_UPLOADED: "Няма качен файл" ERROR_MISSING_TEMP_FOLDER: "Временният файл липŃва" ERROR_ON_SAVING_FILE: "Възникна неизвеŃтна греŃка при запиŃването на файла" ERROR_FILE_TYPE: "Невалиден тип на файла" ERROR_UNKNOWN: "Възникна неизвеŃтна греŃка при качването на файла" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> ТЕКСТ" TEXT_SWITCHER_RICH_FORMATTING: "Форматиран текŃŃ‚" TEXT_SWITCHER_CONFIRM: "Форматирането и изображенията ще бъдат изгŃбени. СигŃрни ли Ńте, че желаете да продължите?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Лични" LABEL_GENERAL_NAME: "Общи" LABEL_CONTACTS_NAME: "Контакти" LABEL_FOLDERS_NAME: "Папки" LABEL_ACCOUNTS_NAME: "ĐкаŃнти" LABEL_IDENTITY_NAME: "ĐдентичноŃŃ‚" LABEL_IDENTITIES_NAME: "ĐдентичноŃти" LABEL_FILTERS_NAME: "Филтри" LABEL_TEMPLATES_NAME: "Шаблони" LABEL_SECURITY_NAME: "СигŃрноŃŃ‚" LABEL_SOCIAL_NAME: "Социални" LABEL_THEMES_NAME: "Теми" LABEL_CHANGE_PASSWORD_NAME: "Парола" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Назад" SETTINGS_FILTERS: LEGEND_FILTERS: "Филтри" BUTTON_SAVE: "Запази" BUTTON_ADD_FILTER: "Добави филтър" BUTTON_DELETE: "Đзтрий" BUTTON_RAW_SCRIPT: "Đзползвай Ńпецифичен потребителŃки Ńкрипт" SUBNAME_NONE: "Няма" SUBNAME_MOVE_TO: "ПремеŃти в \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Препрати към \"%EMAIL%\"" SUBNAME_REJECT: "Откажи" SUBNAME_VACATION_MESSAGE: "Съобщение в отпŃŃка" SUBNAME_DISCARD: "Отхвърли" CAPABILITY_LABEL: "СпоŃобноŃти" LOADING_PROCESS: "Обнови ŃпиŃъка Ń Ń„Đ¸Đ»Ń‚Ń€Đ¸" DELETING_ASK: "СигŃрни ли Ńи?" CHACHES_NEED_TO_BE_SAVED_DESC: "Промените трябва да Ńе запаметят на Ńървъра." SETTINGS_IDENTITY: LEGEND_IDENTITY: "ĐдентичноŃŃ‚" LABEL_DISPLAY_NAME: "Đме" LABEL_REPLY_TO: "Отговори на" LABEL_SIGNATURE: "ПодпиŃ" LABEL_ADD_SIGNATURE_TO_ALL: "Добави ĐżĐľĐ´ĐżĐ¸Ń ĐşŃŠĐĽ вŃички изходящи Ńъобщения" SETTINGS_SECURITY: LEGEND_SECURITY: "СигŃрноŃŃ‚" LABEL_CONFIGURE_TWO_FACTOR: "КонфигŃрирай двŃŃтъпкова проверка" LABEL_AUTOLOGOUT: "Đвтоматично излизане" AUTOLOGIN_NEVER_OPTION_NAME: "Никога" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% минŃта(и)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% чаŃ(а)" SETTINGS_GENERAL: LEGEND_GENERAL: "Общи" LABEL_LANGUAGE: "Език" LABEL_IDENTITY: "ĐдентичноŃŃ‚" LABEL_LAYOUT: "Стил" LABEL_LAYOUT_NO_SPLIT: "Не разделяй" LABEL_LAYOUT_VERTICAL_SPLIT: "Вертикално разделяне" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Хоризонтално разделяне" LABEL_EDITOR: "ТекŃтов редактор по подразбиране" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "ЧиŃŃ‚ текŃŃ‚" LABEL_EDITOR_HTML_FORCED: "HTML (задължително)" LABEL_EDITOR_PLAIN_FORCED: "ЧиŃŃ‚ текŃŃ‚ (задължително)" LABEL_ANIMATION: "Đнимация в интерфейŃа" LABEL_ANIMATION_FULL: "Пълна" LABEL_ANIMATION_NORMAL: "Нормална" LABEL_ANIMATION_NONE: "Никаква" LABEL_VIEW_OPTIONS: "НаŃтройки на изгледа" LABEL_USE_PREVIEW_PANE: "Đзползвай поле за преглед" LABEL_USE_CHECKBOXES_IN_LIST: "Показавай отметките в ŃпиŃъка" LABEL_USE_THREADS: "Đзползвай грŃпиране на Ńъобщенията" LABEL_REPLY_SAME_FOLDER: "ПоŃтави отговорите Ń ĐżĐ°ĐżĐşĐ°Ń‚Đ° на отговаряното Ńъобщение" LABEL_SHOW_IMAGES: "Винаги показвай вънŃни картинки в текŃта на Ńъобщението" LABEL_SHOW_ANIMATION: "Покажи анимация" LABEL_MESSAGE_PER_PAGE: "Съобщения на Ńтраница" LABEL_NOTIFICATIONS: "ĐзвеŃтия" LABEL_SOUND_NOTIFICATION: "ЗвŃково извеŃтяване" LABEL_CHROME_NOTIFICATION_DESC: "Покажи извеŃтие при ново Ńъобщение" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Блокирано от браŃзъра)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Контакти" LABEL_CONTACTS_AUTOSAVE: "Đвтоматично добавяне на полŃчателите към адреŃната ви книга" LEGEND_CONTACTS_SYNC: "Отдалечено Ńинхронизиране (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "РазреŃаване на отдалечено Ńинхронизиране" LABEL_CONTACTS_SYNC_SERVER: "Сървър" LABEL_CONTACTS_SYNC_AB_URL: "URL на адреŃната книга" LABEL_CONTACTS_SYNC_USER: "Потребител" LABEL_CONTACTS_SYNC_PASSWORD: "Парола" SETTINGS_THEMES: LEGEND_THEMES: "Теми" LEGEND_THEMES_CUSTOM: "Специфична наŃтройка на темата" LABEL_CUSTOM_TYPE: "Тип" LABEL_CUSTOM_TYPE_LIGHT: "Светла" LABEL_CUSTOM_TYPE_DARK: "Тъмна" LABEL_CUSTOM_BACKGROUND_IMAGE: "Фон" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Качи Ńнимка за фон (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Файла е прекалено голям" ERROR_FILE_TYPE_ERROR: "Невалиден тип (Само JPG или PNG)" ERROR_UNKNOWN: "Възникна неизвеŃтна греŃка при качването на файла" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Свържи Google" BUTTON_GOOGLE_DISCONNECT: "Разкачи Google" MAIN_GOOGLE_DESC: "След включването на влизане чрез Google, можете да влизате в този акаŃнт чрез бŃтона Google на началния екран." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Свържи Facebook" BUTTON_FACEBOOK_DISCONNECT: "Рзкачи Facebook" MAIN_FACEBOOK_DESC: "След включването на влизане чрез Facebook, можете да влизате в този акаŃнт чрез бŃтона Facebook на началния екран." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Свържи Twitter" BUTTON_TWITTER_DISCONNECT: "Разкачи Twitter" MAIN_TWITTER_DESC: "След включването на влизане чрез Twitter, можете да влизате в този акаŃнт чрез бŃтона Twitter на началния екран." SETTINGS_FOLDERS: LEGEND_FOLDERS: "СпиŃŃŠĐş Ń ĐżĐ°ĐżĐşĐ¸" BUTTON_CREATE: "Създай папка" BUTTON_SYSTEM: "СиŃтемни папки" BUTTON_DELETE: "Đзтриване" BUTTON_SUBSCRIBE: "Đбонирай Ńе" BUTTON_UNSUBSCRIBE: "ОтпиŃване" LOADING_PROCESS: "Обнови ŃпиŃъка Ń ĐżĐ°ĐżĐşĐ¸" CREATING_PROCESS: "Създаване на папка" DELETING_PROCESS: "Đзтриване на папка" RENAMING_PROCESS: "ПреименŃване на папка" DELETING_ASK: "СигŃрни ли Ńте?" TO_MANY_FOLDERS_DESC_1: "Đмате прекалено много папки!" TO_MANY_FOLDERS_DESC_2: "Ще Ńе показват Ńамо чаŃŃ‚ от тях, за да Ńе избегнат проблеми Ń ĐżŃ€ĐľĐ¸Đ·Đ˛ĐľĐ´Đ¸Ń‚ĐµĐ»Đ˝ĐľŃтта." HELP_DELETE_FOLDER: "Đзтрий папка" HELP_SHOW_HIDE_FOLDER: "Покажи/Ńкрий папка" HELP_CHECK_FOR_NEW_MESSAGES: "Провери/не проверявай за нови Ńъобщения" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "СпиŃŃŠĐş Ń Đ°ĐşĐ°Ńнти" LEGEND_IDENTITIES: "ĐдентичноŃти" LEGEND_ACCOUNTS_AND_IDENTITIES: "ĐкаŃнти и идентичноŃти" BUTTON_ADD_ACCOUNT: "Добавяне на акаŃнт" BUTTON_ADD_IDENTITY: "Добавяне на идентичноŃŃ‚" BUTTON_DELETE: "Đзтрий" LOADING_PROCESS: "Обновяване на ŃпиŃъка Ń Đ°ĐşĐ°Ńнти" DELETING_ASK: "СигŃрни ли Ńте?" DEFAULT_IDENTITY_LABEL: "по подразбиране" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "ĐдентичноŃŃ‚" LEGEND_IDENTITIES: "Допълнителни идентичноŃти" LABEL_DEFAULT: "По подразбиране" LABEL_DISPLAY_NAME: "Đме" LABEL_REPLY_TO: "Отговори на" LABEL_SIGNATURE: "ПодпиŃ" LABEL_ADD_SIGNATURE_TO_ALL: "Добавяне на ваŃия ĐżĐľĐ´ĐżĐ¸Ń ĐşŃŠĐĽ вŃички изходящи Ńъобщения" BUTTON_ADD_IDENTITY: "Добавяне на идентичноŃŃ‚" BUTTON_DELETE: "Đзтрий" LOADING_PROCESS: "Обновяване на ŃпиŃъка Ń Đ¸Đ´ĐµĐ˝Ń‚Đ¸Ń‡Đ˝ĐľŃти" DELETING_ASK: "СигŃрни ли Ńте?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Промяна на парола" LABEL_CURRENT_PASSWORD: "НаŃтояща парола" LABEL_NEW_PASSWORD: "Нова парола" LABEL_REPEAT_PASSWORD: "Потвърдете новата парола" BUTTON_UPDATE_PASSWORD: "Задайте нова парола" ERROR_PASSWORD_MISMATCH: "Паролите не Ńъвпадат, моля, опитайте отново" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "ВнеŃи OpenPGP ключ" BUTTON_GENERATE_OPEN_PGP_KEYS: "Генерирай OpenPGP ключ" TITLE_PRIVATE: "ЧаŃтен" TITLE_PUBLIC: "ĐźŃбличен" DELETING_ASK: "СигŃрни ли Ńте?" GENERATE_ONLY_HTTPS: "Само през HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Đвтоматично запазване на чернова" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Помощ за клавиŃните комбинации" TAB_MAILBOX: "ПощенŃка ĐşŃтия" TAB_MESSAGE_LIST: "СпиŃŃŠĐş ŃŃŠŃ Ńъобщения" TAB_MESSAGE_VIEW: "Đзглед на Ńъобщение" TAB_COMPOSE: "ПиŃане" LABEL_OPEN_USER_DROPDOWN: "Отваряне на падащото меню за потребители" LABEL_REPLY: "Отговори" LABEL_REPLY_ALL: "Отговори Đ´Đľ вŃички" LABEL_FORWARD: "Препрати" LABEL_FORWARD_MULTIPLY: "Препрати като прикачен файл" LABEL_HELP: "Помощ" LABEL_CHECK_ALL: "Провери вŃички Ńъобщения" LABEL_ARCHIVE: "Đрхивирай" LABEL_DELETE: "Đзтрий" LABEL_OPEN_THREAD: "Отвори избраната ниŃка" LABEL_MOVE: "ПремеŃти" LABEL_READ: "Прочети избраните Ńъобщения" LABEL_UNREAD: "Маркирай като непрочетени избраните Ńъобщения" LABEL_IMPORTANT: "Важно, отбележи ŃŃŠŃ Ń„Đ»Đ°Đł избраните Ńъобщения" LABEL_SEARCH: "ТърŃене" LABEL_CANCEL_SEARCH: "Отказ от търŃенето" LABEL_FULLSCREEN_ENTER: "Цял екран (Đзглед за преглед)" LABEL_VIEW_MESSAGE_ENTER: "Преглед на Ńъобщението (без изглед за преглед)" LABEL_SWITCH_TO_MESSAGE: "Превключи фокŃŃа Đ˛ŃŠŃ€Ń…Ń Đ¸Đ·Đ±Ń€Đ°Đ˝ĐľŃ‚Đľ Ńъобщение" LABEL_SWITCH_TO_FOLDER_LIST: "Превключи фокŃŃа Đ˛ŃŠŃ€Ń…Ń ŃпиŃъка Ń ĐżĐ°ĐżĐşĐ¸" LABEL_FULLSCREEN_TOGGLE: "Превключи на режим на цял екран" LABEL_BLOCKQUOTES_TOGGLE: "Включи цитатите в Ńъобщението" LABEL_THREAD_NEXT: "Следващо Ńъобщение в грŃпираните" LABEL_THREAD_PREV: "Предно Ńъобщение в грŃпираните" LABEL_PRINT: "Принтиране" LABEL_EXIT_FULLSCREEN: "Đзлез от режим на цял екран" LABEL_CLOSE_MESSAGE: "Затвори Ńъобщението (Няма изглед за преглед)" LABEL_SWITCH_TO_LIST: "Превключи фокŃŃа обратно към ŃпиŃъка ŃŃŠŃ Ńъобщения" LABEL_OPEN_COMPOSE_POPUP: "Отвори прозорец за пиŃане" LABEL_MINIMIZE_COMPOSE_POPUP: "Намали прозореца за пиŃане" LABEL_OPEN_IDENTITIES_DROPDOWN: "отвори падащото меню Ń Đ¸Đ´ĐµĐ˝Ń‚Đ¸Ń‡Đ˝ĐľŃти" LABEL_SAVE_MESSAGE: "Запази Ńъобщението" LABEL_SEND_MESSAGE: "Đзпрати Ńъобщението" LABEL_CLOSE_COMPOSE: "Затвори Ńъздаването" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Няма ĐżŃблични ключове" NO_PUBLIC_KEYS_FOUND_FOR: "Няма ĐżŃбличен ключ за \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Няма чаŃтен ключ" NO_PRIVATE_KEY_FOUND_FOR: "Няма чаŃтен ключ за \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Добави ĐżŃбличен ключ" SELECT_A_PRIVATE_KEY: "Đзбери чаŃтен ключ" UNVERIFIRED_SIGNATURE: "Непроверен подпиŃ" DECRYPTION_ERROR: "ГреŃка при деŃифрирането" GOOD_SIGNATURE: "Валиден ĐżĐľĐ´ĐżĐ¸Ń Đ·Đ° %USER%" PGP_ERROR: "OpenPGP греŃка: %ERROR%" SPECIFY_FROM_EMAIL: "Моля въведете email Đ°Đ´Ń€ĐµŃ ĐžŃ‚" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Моля въведете поне един полŃчател" NOTIFICATIONS: INVALID_TOKEN: "Невалиден токен" AUTH_ERROR: "НеŃŃпеŃно ŃĐ´ĐľŃтоверяване" ACCESS_ERROR: "ГреŃка при опит за Đ´ĐľŃтъп" CONNECTION_ERROR: "Не може да Ńе Ńвърже ŃŃŠŃ Ńървъра" CAPTCHA_ERROR: "Некорекно въведена CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Това Ńоциално ID не е приŃвоено към никой email акаŃнт. Влезте чрез email-а и ĐżŃŃнете тази опция чрез НаŃтройки. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Това Ńоциално ID не е приŃвоено към никой email акаŃнт. Влезте чрез email-а и ĐżŃŃнете тази опция чрез НаŃтройки. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Това Ńоциално ID не е приŃвоено към никой email акаŃнт. Влезте чрез email-а и ĐżŃŃнете тази опция чрез НаŃтройки. DOMAIN_NOT_ALLOWED: "Този домейн не е разреŃен" ACCOUNT_NOT_ALLOWED: "Този акаŃнт не е разреŃен" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Задължителна е двŃŃтъпкова проверка" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "ГреŃка при двŃŃтъпковата проверка" COULD_NOT_SAVE_NEW_PASSWORD: "НеŃŃпеŃно запазване на новата парола" CURRENT_PASSWORD_INCORRECT: "ТекŃщата парола не е правилна" NEW_PASSWORD_SHORT: "Паролата е твърде къŃа" NEW_PASSWORD_WEAK: "Паролата е твърде леŃна" NEW_PASSWORD_FORBIDDENT: "Паролата Ńъдържа забранени Ńимволи" CONTACTS_SYNC_ERROR: "ГреŃка при Ńинхронизацията" CANT_GET_MESSAGE_LIST: "Не може да Ńе изтегли ŃпиŃъка ŃŃŠŃ Ńъобщения" CANT_GET_MESSAGE: "Не може да Ńе изтегли Ńъобщението" CANT_DELETE_MESSAGE: "Не може да Ńе изтрие Ńъобщението" CANT_MOVE_MESSAGE: "Не може да Ńе премеŃти Ńъобщението" CANT_SAVE_MESSAGE: "Не може да Ńе запамети Ńъобщението" CANT_SEND_MESSAGE: "Не може да Ńе изпрати Ńъобщението" INVALID_RECIPIENTS: "Невалидни полŃчатели" CANT_SAVE_FILTERS: "Не може да Ńе запаметят филтрите" CANT_GET_FILTERS: "Не могат да Ńе изтеглят филтрите" FILTERS_ARE_NOT_CORRECT: "ГреŃни филтри" CANT_CREATE_FOLDER: "Не може да Ńе Ńъздаде папка" CANT_RENAME_FOLDER: "Не може да Ńе преименŃва папка" CANT_DELETE_FOLDER: "Не може да Ńе изтрие папка" CANT_DELETE_NON_EMPTY_FOLDER: "Не може да Ńе изтрие папка, която не е празна" CANT_SUBSCRIBE_FOLDER: "Не може да Ńе абонира за папка" CANT_UNSUBSCRIBE_FOLDER: "Не може да Ńе махне абонамента за папка" CANT_SAVE_SETTINGS: "Не могат да Ńе запаметят наŃтройките" CANT_SAVE_PLUGIN_SETTINGS: "Не могат да Ńе запаметят наŃтройките" DOMAIN_ALREADY_EXISTS: "Домейна вече ŃъщеŃтвŃва" CANT_INSTALL_PACKAGE: "Не е възможно да Ńе инŃталира пакета" CANT_DELETE_PACKAGE: "Не е възможно да Ńе премахне пакета" INVALID_PLUGIN_PACKAGE: "Невалиден пакет Ń ĐżŃ€Đ¸Ńтавка" UNSUPPORTED_PLUGIN_PACKAGE: "Неподдържан пакет Ń ĐżŃ€Đ¸Ńтавка" LICENSING_SERVER_IS_UNAVAILABLE: "Сървъра за абонамент е недоŃтъпен" LICENSING_DOMAIN_EXPIRED: "Đбонаментът за този домейн е изтекъл." LICENSING_DOMAIN_BANNED: "Đбонаментът за този домейн е забранен." DEMO_SEND_MESSAGE_ERROR: "С цел ŃŃĐłŃрноŃŃ‚, на този акаŃнт е забранено да изпраща Ńъобщения Đ´Đľ вънŃни email адреŃи!" DEMO_ACCOUNT_ERROR: "С цел ŃигŃрноŃŃ‚, това дейŃтвие не е разреŃено за този акаŃнт!" ACCOUNT_ALREADY_EXISTS: "ĐкаŃнта вече ŃъщеŃтвŃва" ACCOUNT_DOES_NOT_EXIST: "ĐкаŃнта не ŃъщеŃтвŃва" MAIL_SERVER_ERROR: "Възникна греŃка при комŃникацията Ń ĐżĐľŃ‰ĐµĐ˝Ńкия Ńървър" INVALID_INPUT_ARGUMENT: "Невалидни входни аргŃменти" UNKNOWN_ERROR: "НеизвеŃтна греŃка" STATIC: BACK_LINK: "Презареди" DOMAIN_LIST_DESC: "СпиŃŃŠĐş то домейни, Đ´ĐľŃтъпни за тази поща" PHP_EXSTENSIONS_ERROR_DESC: "Задължително PHP разŃирение не е налично във ваŃата PHP конфигŃрация!" PHP_VERSION_ERROR_DESC: "ВаŃата перŃия на PHP (%VERSION%) е по-Ńтара от минималната 5.3.0!" NO_SCRIPT_TITLE: "За това приложение е необходим JavaScript." NO_SCRIPT_DESC: | Поддръжката на JavaScript не е налична във ваŃия браŃĐ·ŃŠŃ€. Моля, разреŃете поддръжката на JavaScript в наŃтройките на ваŃия браŃĐ·ŃŠŃ€ и опитайте отново. NO_COOKIE_TITLE: "За това приложение е необходимо да Ńе поддъжат БиŃквитки." NO_COOKIE_DESC: | Поддръжката на БиŃквитки не е налична във ваŃия браŃĐ·ŃŠŃ€. Моля, разреŃете поддръжката на БиŃквитки в наŃтройките на ваŃия браŃĐ·ŃŠŃ€ и опитайте отново. BAD_BROWSER_TITLE: "ВаŃият браŃĐ·ŃŠŃ€ е ĐľŃтарял." BAD_BROWSER_DESC: | За да използвате вŃички Ń„Ńнкции на приложението, изтеглете и инŃталирайте един от тези браŃзъри: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml000066400000000000000000000770401361462701300262100ustar00rootroot00000000000000cs_CZ: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "UĹľivatelskĂ© jmĂ©no" LABEL_PASSWORD: "Heslo" LABEL_SIGN_ME: "Zapamatovat" LABEL_VERIFICATION_CODE: "OvěřovacĂ­ kĂłd" LABEL_DONT_ASK_VERIFICATION_CODE: "NepoĹľadovat ověřovacĂ­ kĂłd 2 tĂ˝dny." BUTTON_SIGN_IN: "PĹ™ihlásit" TITLE_SIGN_IN_GOOGLE: "PĹ™ihlásit pomocĂ­ Google" TITLE_SIGN_IN_FACEBOOK: "PĹ™ihlásit pomocĂ­ Facebook" TITLE_SIGN_IN_TWITTER: "PĹ™ihlásit pomocĂ­ Twitter" LABEL_FORGOT_PASSWORD: "Zapomenout heslo" LABEL_REGISTRATION: "Registrace" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "PĹ™idat účet" BUTTON_SETTINGS: "NastavenĂ­" BUTTON_HELP: "NápovÄ›da" BUTTON_LOGOUT: "Odhlásit" MOBILE: BUTTON_MOBILE_VERSION: "MobilnĂ­ verze" BUTTON_DESKTOP_VERSION: "Desktop verze" SEARCH: MAIN_INPUT_PLACEHOLDER: "Hledat" TITLE_ADV: "RozšířenĂ© hledánĂ­" LABEL_ADV_FROM: "OdesĂ­latel" LABEL_ADV_TO: "Příjemce" LABEL_ADV_SUBJECT: "PĹ™edmÄ›t" LABEL_ADV_TEXT: "Text" LABEL_ADV_HAS_ATTACHMENT: "S přílohou" LABEL_ADV_HAS_ATTACHMENTS: "S přílohami" LABEL_ADV_FLAGGED: "OznaÄŤenĂ© hvÄ›zdiÄŤkou" LABEL_ADV_UNSEEN: "NepĹ™eÄŤtenĂ©" LABEL_ADV_DATE: "Datum" LABEL_ADV_DATE_ALL: "Kdykoliv" LABEL_ADV_DATE_3_DAYS: "Ne starší neĹľ 3 dny" LABEL_ADV_DATE_7_DAYS: "Ne starší neĹľ tĂ˝den" LABEL_ADV_DATE_MONTH: "Ne starší neĹľ mÄ›sĂ­c" LABEL_ADV_DATE_3_MONTHS: "Ne starší neĹľ 3 mÄ›sĂ­ce" LABEL_ADV_DATE_6_MONTHS: "Ne starší neĹľ 6 mÄ›sĂ­cĹŻ" LABEL_ADV_DATE_YEAR: "Ne starší neĹľ 1 rok" BUTTON_ADV_SEARCH: "Hledat" PREVIEW_POPUP: FULLSCREEN: "Celá obrazovka" ZOOM: "ZvÄ›tšit/zmenšit" CLOSE: "Zavřít (Esc)" LOADING: "NaÄŤĂ­tám..." GALLERY_PREV: "PĹ™edchozĂ­" GALLERY_NEXT: "Další" GALLERY_COUNTER: "%curr% z %total%" IMAGE_ERROR: "Obrázek se nepodaĹ™ilo naÄŤĂ­st." AJAX_ERROR: "Obsah sa nepodaĹ™ilo naÄŤĂ­st." FOLDER_LIST: BUTTON_COMPOSE: "VytvoĹ™it" BUTTON_CONTACTS: "Adresář" BUTTON_NEW_MESSAGE: "Nová zpráva" INBOX_NAME: "PĹ™ijatĂ©" SENT_NAME: "OdeslanĂ©" DRAFTS_NAME: "Koncepty" SPAM_NAME: "Spam" TRASH_NAME: "Koš" ARCHIVE_NAME: "Archiv" QUOTA: TITLE: "VyuĹľitĂ­ kvĂłty" MESSAGE_LIST: BUTTON_RELOAD: "Obnovit seznam zpráv" BUTTON_MOVE_TO: "PĹ™esunout do" BUTTON_DELETE: "Odstranit" BUTTON_ARCHIVE: "Archivovat" BUTTON_SPAM: "Je to spam" BUTTON_NOT_SPAM: "NenĂ­ to spam" BUTTON_EMPTY_FOLDER: "Vyprázdnit sloĹľku" BUTTON_MULTY_FORWARD: "PĹ™eposlat zprávy" BUTTON_DELETE_WITHOUT_MOVE: "NavĹľdy odstranit" BUTTON_MORE: "VĂ­ce" MENU_SET_SEEN: "OznaÄŤit jako pĹ™eÄŤtenĂ©" MENU_SET_ALL_SEEN: "OznaÄŤit vše jako pĹ™eÄŤtenĂ©" MENU_UNSET_SEEN: "OznaÄŤit jako nepreÄŤtenĂ©" MENU_SET_FLAG: "OznaÄŤit hvÄ›zdiÄŤkou" MENU_UNSET_FLAG: "Zrušit oznaÄŤenĂ­ hvÄ›zdiÄŤkou" MENU_SELECT_ALL: "Vše" MENU_SELECT_NONE: "ŽádnĂ©" MENU_SELECT_INVERT: "Invertovat" MENU_SELECT_UNSEEN: "NepĹ™eÄŤtenĂ©" MENU_SELECT_SEEN: "PĹ™eÄŤtenĂ©" MENU_SELECT_FLAGGED: "OznaÄŤenĂ©" MENU_SELECT_UNFLAGGED: "NeoznaÄŤenĂ©" EMPTY_LIST: "Seznam je prázdnĂ˝" EMPTY_SEARCH_LIST: "Vašemu vyhledávánĂ­ neodpovĂ­dajĂ­ žádnĂ© zprávy." SEARCH_RESULT_FOR: "VĂ˝sledky vyhledávánĂ­ pro \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "ZpÄ›t na seznam zpráv" LIST_LOADING: "NaÄŤĂ­tám" EMPTY_SUBJECT_TEXT: "(Bez pĹ™edmÄ›tu)" PUT_MESSAGE_HERE: "PĹ™esuĹte zprávu sem pro jejĂ­ zobrazenĂ­ v seznamu" TODAY_AT: "Dnes v %TIME%" YESTERDAY_AT: "VÄŤera v %TIME%" SEARCH_PLACEHOLDER: "Hledat" NEW_MESSAGE_NOTIFICATION: "Máte %COUNT% novĂ˝ch zpráv!" QUOTA_SIZE: "Používáte %SIZE% (%PROC%%) z vašich %LIMIT%" MESSAGE: BUTTON_EDIT: "Editovat" BUTTON_BACK: "ZpÄ›t" BUTTON_CLOSE: "Zavřít" BUTTON_DELETE: "Odstranit" BUTTON_UNSUBSCRIBE: "Odhlásit se z odbÄ›ru" BUTTON_ARCHIVE: "Archivovat" BUTTON_SPAM: "Je to SPAM" BUTTON_NOT_SPAM: "NenĂ­ to SPAM" BUTTON_MOVE_TO: "PĹ™esunout do" BUTTON_MORE: "VĂ­ce" BUTTON_REPLY: "OdpovÄ›dÄ›t" BUTTON_REPLY_ALL: "OdpovÄ›dÄ›t všem" BUTTON_FORWARD: "PĹ™eposlat" BUTTON_FORWARD_AS_ATTACHMENT: "PĹ™eposlat jako přílohu" BUTTON_EDIT_AS_NEW: "PouĹľit jako šablonu" BUTTON_SHOW_IMAGES: "Zobrazit externĂ­ obrázky" BUTTON_NOTIFY_READ_RECEIPT: "OdesĂ­latel požádal o potvrzenĂ­ pĹ™eÄŤtenĂ­ tĂ©to zprávy." BUTTON_IN_NEW_WINDOW: "Zobrazit v novĂ©m oknÄ›" BUTTON_THREAD_LIST: "Konverzace" BUTTON_THREAD_PREV: "PĹ™edchozĂ­" BUTTON_THREAD_NEXT: "Další" BUTTON_THREAD_MORE: "VĂ­ce zpráv" MENU_HEADERS: "Zobrazit hlaviÄŤku zprávy" MENU_VIEW_ORIGINAL: "Zobrazit zdroj" MENU_DOWNLOAD_ORIGINAL: "Stáhnout jako soubor .eml" MENU_FILTER_SIMILAR: "Filtrovat zprávy jako tato" MENU_PRINT: "Tisknout" EMPTY_SUBJECT_TEXT: "(Bez pĹ™edmÄ›tu)" LABEL_SUBJECT: "PĹ™edmÄ›t" LABEL_DATE: "Datum" LABEL_FROM: "OdesĂ­latel" LABEL_FROM_SHORT: "Od" LABEL_TO: "Příjemce" LABEL_TO_SHORT: "Komu" LABEL_CC: "Kopie" LABEL_BCC: "Skrytá kopie" LABEL_REPLY_TO: "Adresa odpovÄ›di" PRINT_LABEL_FROM: "OdesĂ­latel" PRINT_LABEL_TO: "Příjemce" PRINT_LABEL_CC: "Kopie" PRINT_LABEL_BCC: "Skrytá kopie" PRINT_LABEL_REPLY_TO: "Adresa odpovÄ›di" PRINT_LABEL_DATE: "Datum" PRINT_LABEL_SUBJECT: "PĹ™edmÄ›t" PRINT_LABEL_ATTACHMENTS: "Přílohy" MESSAGE_LOADING: "NaÄŤĂ­tám" MESSAGE_VIEW_DESC: "Vyberte zprávu ze seznamu pro jejĂ­ zobrazenĂ­ zde." MESSAGE_VIEW_MOVE_DESC: "Vyberte cĂ­lovou sloĹľku v levĂ©m panelu." PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" PGP_SIGNED_MESSAGE_DESC: "Zpráva podepsaná OpenPGP (kliknÄ›te pro ověřenĂ­)" PGP_ENCRYPTED_MESSAGE_DESC: "Zpráva šifrovaná OpenPGP (kliknÄ›te pro dešifraci)" LINK_DOWNLOAD_AS_ZIP: "Stáhnout jako zip" LINK_SAVE_TO_OWNCLOUD: "UloĹľit do ownCloud" LINK_SAVE_TO_CLOUD: "UloĹľit do Cloudu" LINK_SAVE_TO_DROPBOX: "UloĹľit do Dropbox" READ_RECEIPT: SUBJECT: "PotvrzenĂ­ o zobrazenĂ­ zprávy - %SUBJECT%" BODY: | Toto je potrvzenĂ­ o zaslánĂ­ emailu na adresu %READ-RECEIPT%. Poznámka: Toto potvrzenĂ­ zajišťuje, Ĺľe zpráva byla zobrazena v poštovnĂ­ schránce příjemce. Nezajišťuje, Ĺľe ji příjemce ÄŤetl a rozumÄ›l jĂ­. SUGGESTIONS: SEARCHING_DESC: "Hledám..." CONTACTS: LEGEND_CONTACTS: "Adresář" SEARCH_INPUT_PLACEHOLDER: "Hledat" BUTTON_ADD_CONTACT: "PĹ™idat kontakt" BUTTON_CREATE_CONTACT: "VytvoĹ™it" BUTTON_UPDATE_CONTACT: "Aktualizovat" BUTTON_IMPORT: "Importovat (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exportovat (vcf, vCard)" BUTTON_EXPORT_CSV: "Exportovat (csv)" ERROR_IMPORT_FILE: "Chyba importu (nesprávny formát souboru)" LIST_LOADING: "NaÄŤĂ­tám" EMPTY_LIST: "Nemáte žádnĂ© kontakty" EMPTY_SEARCH: "Nebyly nalezeny žádnĂ© kontakty" CLEAR_SEARCH: "Smazat vyhledávánĂ­" CONTACT_VIEW_DESC: "Vyberte kontakt ze seznamu pro zobrazenĂ­ zde." LABEL_DISPLAY_NAME: "Zobrazit jako" LABEL_EMAIL: "Email" LABEL_PHONE: "Telefon" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Narozeniny" LINK_ADD_EMAIL: "PĹ™idat email" LINK_ADD_PHONE: "PĹ™idat telefon" LINK_BIRTHDAY: "Narozeniny" PLACEHOLDER_ENTER_DISPLAY_NAME: "Zadejte zobrazovanĂ© jmĂ©no" PLACEHOLDER_ENTER_LAST_NAME: "Zadejte příjmenĂ­" PLACEHOLDER_ENTER_FIRST_NAME: "Zadejte jmĂ©no" PLACEHOLDER_ENTER_NICK_NAME: "Zadejte pĹ™ezdĂ­vku" LABEL_READ_ONLY: "Jen pro ÄŤtÄ›nĂ­" LABEL_SHARE: "SdĂ­let" ADD_MENU_LABEL: "PĹ™idat" ADD_MENU_NICKNAME: "PĹ™ezdĂ­vka" ADD_MENU_NOTES: "Poznámka" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adresa" ADD_MENU_BIRTHDAY: "Narozeniny" ADD_MENU_TAGS: "Tagy" BUTTON_SHARE_NONE: "ŽádnĂ©" BUTTON_SHARE_ALL: "Vše" BUTTON_SYNC: "Synchronizace (CardDAV)" COMPOSE: TITLE_FROM: "OdesĂ­latel" TITLE_TO: "Příjemce" TITLE_CC: "Kopie" TITLE_BCC: "Skrytá kopie" TITLE_REPLY_TO: "OdpovÄ›dÄ›t" TITLE_SUBJECT: "PĹ™edmÄ›t" LINK_SHOW_INPUTS: "zobrazit všechna pole" BUTTON_SEND: "Odeslat" BUTTON_SAVE: "UloĹľit" BUTTON_DELETE: "Odstranit" BUTTON_CANCEL: "Zrušit" BUTTON_MINIMIZE: "Minimalizovat" SAVED_TIME: "UloĹľenĂ© v %TIME%" SAVED_ERROR_ON_SEND: "Zpráva byla odesláná, ale nebyla uloĹľená do sloĹľky odeslanĂ˝ch zpráv." DISCARD_UNSAVED_DATA: "NeuloĹľit zmÄ›ny?" ATTACH_FILES: "PĹ™ipojit soubory" ATTACH_DROP_FILES_DESC: "Soubory pĹ™etáhnÄ›te sem" ATTACH_ITEM_CANCEL: "Zrušit" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM: "OdesĂ­latel" FORWARD_MESSAGE_TOP_TO: "Příjemce" FORWARD_MESSAGE_TOP_CC: "Kopie" FORWARD_MESSAGE_TOP_SENT: "Odeslat" FORWARD_MESSAGE_TOP_SUBJECT: "PĹ™edmÄ›t" EMPTY_TO_ERROR_DESC: "Zadejte prosĂ­m alespoĹ jednoho příjemce" NO_ATTACHMENTS_HERE_DESC: "ŽádnĂ© přílohy." ATTACHMENTS_ERROR_DESC: "UpozornÄ›nĂ­! NÄ›kterĂ© přílohy nebyly nahrány." ATTACHMENTS_UPLOAD_ERROR_DESC: "NÄ›kterĂ© přílohy ještÄ› nebyly nahrány" BUTTON_REQUEST_READ_RECEIPT: "Vyžádat si potvrzenĂ­ o pĹ™eÄŤtenĂ­" BUTTON_MARK_AS_IMPORTANT: "OznaÄŤit jako dĹŻleĹľitĂ©" BUTTON_OPEN_PGP: "OpenPGP (jen Plain Text)" BUTTON_REQUEST_DSN: "Vyžádat si potvrzenĂ­ o pĹ™ijetĂ­" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Zavřít" POPUPS_ASK: BUTTON_YES: "Ano" BUTTON_NO: "Ne" DESC_WANT_CLOSE_THIS_WINDOW: "Opravdu chcete zavřít toto okno?" DESC_WANT_DELETE_MESSAGES: "Opravdu chcete odstranit tyto zprávy?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Zvolte jazyk" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "PĹ™idat účet?" BUTTON_ADD_ACCOUNT: "PĹ™idat" TITLE_UPDATE_ACCOUNT: "Upravit účet?" BUTTON_UPDATE_ACCOUNT: "Upravit" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Opravdu pĹ™idat?" TITLE_UPDATE_IDENTITY: "UloĹľit zmÄ›ny?" BUTTON_ADD_IDENTITY: "PĹ™idat" BUTTON_UPDATE_IDENTITY: "UloĹľit" LABEL_EMAIL: "Email" LABEL_NAME: "JmĂ©no" LABEL_REPLY_TO: "Adresa odpovÄ›di" LABEL_SIGNATURE: "Podpis" LABEL_CC: "Kopie" LABEL_BCC: "Skrytá" LABEL_SIGNATURE_INSERT_BEFORE: "V odpovÄ›dĂ­ch vloĹľit podpis pĹ™ed citovanĂ˝ text." POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "VytvoĹ™it sloĹľku?" LABEL_NAME: "Název sloĹľky" LABEL_PARENT: "NadĹ™azená sloĹľka" BUTTON_CREATE: "VytvoĹ™it" BUTTON_CANCEL: "Zrušit" BUTTON_CLOSE: "Zavřít" TITLE_CREATING_PROCESS: "Vytvářím sloĹľku" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Odstranit všechny zprávy ve sloĹľce?" BUTTON_CLEAR: "VyÄŤistit" BUTTON_CANCEL: "Zrušit" BUTTON_CLOSE: "Zavřít" DANGER_DESC_WARNING: "UpozornÄ›nĂ­!" DANGER_DESC_HTML_1: "Chystáte se nenávratnÄ› odstranit všechny zprávy ze sloĹľky %FOLDER%." DANGER_DESC_HTML_2: "Tento proces nenĂ­ moĹľnĂ© pĹ™erušit." TITLE_CLEARING_PROCESS: "OdstraĹuje se sloĹľka..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP klĂ­ÄŤe" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Zobrazit OpenPGP klĂ­ÄŤ" BUTTON_SELECT: "Vybart" BUTTON_CLOSE: "Zavřít" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generovat OpenPGP klĂ­ÄŤe" LABEL_EMAIL: "Email" LABEL_NAME: "JmĂ©no" LABEL_PASSWORD: "Heslo" LABEL_KEY_BIT_LENGTH: "DĂ©lka klĂ­ÄŤe" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generovat" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Podpis/Ĺ ifrovánĂ­" LABEL_SIGN: "Podpis" LABEL_ENCRYPT: "Ĺ ifrovánĂ­" LABEL_PASSWORD: "Heslo" BUTTON_SIGN: "Podepsat" BUTTON_ENCRYPT: "Ĺ ifrovat" BUTTON_SIGN_AND_ENCRYPT: "Podepsat a šifrovat" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP DešifrovánĂ­" LABEL_KEY: "SoukromĂ˝ klĂ­ÄŤ" LABEL_PASSWORD: "Heslo" BUTTON_DECRYPT: "Dešifrovat" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "DvoufázovĂ© ověřenĂ­" LABEL_CODE: "KĂłd" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "VytvoĹ™it filtr?" TITLE_EDIT_FILTER: "ZmÄ›nit filtr?" FILTER_NAME: "JmĂ©no" LEGEND_CONDITIONS: "PodmĂ­nka" LEGEND_ACTIONS: "Akce" BUTTON_DONE: "DokonÄŤit" BUTTON_ADD_CONDITION: "PĹ™idat podmĂ­nku" SELECT_ACTION_NONE: "Nic" SELECT_ACTION_MOVE_TO: "PĹ™esunout do" SELECT_ACTION_FORWARD_TO: "PĹ™esmÄ›rovat do" SELECT_ACTION_REJECT: "OdmĂ­tnout" SELECT_ACTION_VACATION_MESSAGE: "Odpověď v nepřítomnosti" SELECT_ACTION_DISCARD: "Zahodit" SELECT_FIELD_FROM: "Od" SELECT_FIELD_RECIPIENTS: "PĹ™ijemci (Komu nebo Kopie)" SELECT_FIELD_SUBJECT: "PĹ™edmÄ›t" SELECT_FIELD_HEADER: "HlaviÄŤka" SELECT_FIELD_SIZE: "Velikost" SELECT_TYPE_CONTAINS: "Obsahuje" SELECT_TYPE_NOT_CONTAINS: "Neobsahuje" SELECT_TYPE_MATCHES: "OdpovĂ­dá (mĹŻĹľete pouĹľit * a ? )" SELECT_TYPE_NOT_MATCHES: "NeodpovĂ­dá (mĹŻĹľete pouĹľit * a ? )" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Rovná se" SELECT_TYPE_NOT_EQUAL_TO: "Nerovná se" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Vyhovuje alespoĹ jednomu pravidlu" SELECT_MATCH_ALL: "Vyhovuje všem pravidlĹŻm" MARK_AS_READ_LABEL: "OdznaÄŤit jako pĹ™eÄŤtenĂ©" REPLY_INTERVAL_LABEL: "Interval odpovÄ›di (dny)" KEEP_LABEL: "Zachovat" STOP_LABEL: "NeukonÄŤovat zpracovánĂ­ pravidel" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "PĹ™edmÄ›t (volitelnĂ˝)" VACATION_MESSAGE_LABEL: "Zpráva" VACATION_RECIPIENTS_LABEL: "Příjemci (oddÄ›leni čárkou)" REJECT_MESSAGE_LABEL: "OdmĂ­tnout zprávu" ALL_INCOMING_MESSAGES_DESC: "Všechny příchozĂ­ zprávy" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Spravovat systĂ©movĂ© sloĹľky" SELECT_CHOOSE_ONE: "Vybrat" SELECT_UNUSE_NAME: "Nepoužívat" LABEL_SENT: "OdeslanĂ©" LABEL_DRAFTS: "Koncepty" LABEL_SPAM: "Spam" LABEL_TRASH: "Koš" LABEL_ARCHIVE: "Archiv" BUTTON_CANCEL: "Zrušit" BUTTON_CLOSE: "Zavřít" NOTIFICATION_SENT: | Nevybrali jste systĂ©movou sloĹľku "OdeslanĂ©" kam budou uloĹľenĂ© zprávy po jejich odeslánĂ­. Pokud nechcete ukládat odeslanĂ© zprávy, vyberete moĹľnost "Nepoužívat". NOTIFICATION_DRAFTS: "Nevybrali jste systĂ©movou sloĹľku pro \"Koncepty\" kam jsou ukládány zprávy bÄ›hem jejich psanĂ­." NOTIFICATION_SPAM: | Nevybrali jste systĂ©movou sloĹľku pro "Spam" kam je ukládána nevyžádaná pošta. Pokud chcete tyto zprávy odstranit natrvalo, vyberte prosĂ­m moĹľnost "Nepoužívat". NOTIFICATION_TRASH: | Nevybrali jste systĂ©movou sloĹľku pro "Koš" kam jsou zprávy pĹ™esunutĂ© pro jejich odstranÄ›nĂ­. Pokud chcete zprávy odstranit natrvalo, vyberte prosĂ­m moĹľnost "Nepoužívat". NOTIFICATION_ARCHIVE: "Nevybrali jste systĂ©movou sloĹľku \"Archiv\", kam se ukládajĂ­ archivovanĂ© zprávy." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "DvoufázovĂ© ověřenĂ­" LABEL_ENABLE_TWO_FACTOR: "Povlit dvoufázovĂ© ověřenĂ­" LABEL_TWO_FACTOR_USER: "UĹľivatel" LABEL_TWO_FACTOR_STATUS: "Stav" LABEL_TWO_FACTOR_SECRET: "TajnĂ˝ klĂ­ÄŤ" LABEL_TWO_FACTOR_BACKUP_CODES: "ZáloĹľnĂ­ kĂłdy" BUTTON_CREATE: "Aktivovat dvoustupĹovĂ© pĹ™ihlašovánĂ­" BUTTON_ACTIVATE: "Aktivovat" BUTTON_CLEAR: "Zrušit dvoustupĹovĂ© pĹ™ihlašovánĂ­" BUTTON_LOGOUT: "Odhlásit" BUTTON_DONE: "Hotovo" BUTTON_TEST: "Test" LINK_TEST: "Otestovat" BUTTON_SHOW_SECRET: "Zobrazit tajnĂ© klĂ­ÄŤe" BUTTON_HIDE_SECRET: "SkrĂ˝t tajnĂ© klĂ­ÄŤe" TWO_FACTOR_REQUIRE_DESC: "Váš účet vyĹľaduje nastavenĂ­ dvoufázovĂ©ho ověřenĂ­" TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nastaveno" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nenastaveno" TWO_FACTOR_SECRET_DESC: > Importujte klĂ­ÄŤ do Vašeho Google Authenticatoru (nebo jinĂ©ho TOTP klienta) pomocĂ­ nĂ­Ĺľe uvedenĂ©ho QR kĂłdu nebo zadánĂ­m kĂłdu ruÄŤnÄ›. TWO_FACTOR_BACKUP_CODES_DESC: > Pokud nemĹŻĹľete zĂ­skat kĂłdy skrze Google Authenticator (nebo jinĂ©ho TOTP klienta), mĹŻĹľete použít záloĹľnĂ­ kĂłdy k pĹ™ihlášenĂ­. PotĂ©, co pouĹľijete záloĹľnĂ­ klĂ­ÄŤ, stane se nadále neaktivnĂ­m. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Toto nastavenĂ­ nelze zmÄ›nit pĹ™ed otestovánĂ­m." TITLES: LOADING: "NaÄŤĂ­tám" LOGIN: "UĹľivatelskĂ© jmĂ©no" MAILBOX: "Schránka zpráv" SETTINGS: "NastavenĂ­" COMPOSE: "Napsat" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Soubor je příliš velkĂ˝." ERROR_FILE_PARTIALLY_UPLOADED: "Z dĹŻvodu neznámĂ© chyby byl soubor nahrán jen částeÄŤnÄ›" ERROR_NO_FILE_UPLOADED: "Soubor nebyl nahrán" ERROR_MISSING_TEMP_FOLDER: "ChybĂ­ doÄŤasnĂ˝ soubor" ERROR_ON_SAVING_FILE: "Nastala neznámá chyba pĹ™i ukládánĂ­" ERROR_FILE_TYPE: "NeplatnĂ˝ typ souboru" ERROR_UNKNOWN: "Nastala neznámá chyba pĹ™i nahrávanĂ­" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "FormátovanĂ˝ text" TEXT_SWITCHER_CONFIRM: "FormátovánĂ­ textu a obrázky budou odstranÄ›nĂ©. Chcete pokraÄŤovat?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "OsobnĂ­" LABEL_GENERAL_NAME: "VšeobecnĂ©" LABEL_CONTACTS_NAME: "Kontakty" LABEL_FOLDERS_NAME: "SloĹľky" LABEL_ACCOUNTS_NAME: "Účty" LABEL_IDENTITY_NAME: "Alias" LABEL_IDENTITIES_NAME: "Aliasy" LABEL_FILTERS_NAME: "Filtry" LABEL_TEMPLATES_NAME: "Ĺ ablony" LABEL_SECURITY_NAME: "ZabezpeÄŤenĂ­" LABEL_SOCIAL_NAME: "SociálnĂ­" LABEL_THEMES_NAME: "Motivy" LABEL_CHANGE_PASSWORD_NAME: "Heslo" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "ZpÄ›t" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtry" BUTTON_SAVE: "UloĹľit" BUTTON_ADD_FILTER: "PĹ™idat filtr" BUTTON_DELETE: "Smazat" BUTTON_RAW_SCRIPT: "Použít uĹľivatelskĂ˝ skript" SUBNAME_NONE: "ŽádnĂ˝" SUBNAME_MOVE_TO: "PĹ™esunout do \"%FOLDER%\"" SUBNAME_FORWARD_TO: "PĹ™eposlat to \"%EMAIL%\"" SUBNAME_REJECT: "OdmĂ­tnout" SUBNAME_VACATION_MESSAGE: "Odpověď v nepřítomnosti" SUBNAME_DISCARD: "Zahodit" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Aktualizovat seznam filtrĹŻ" DELETING_ASK: "Jste si jisti?" CHACHES_NEED_TO_BE_SAVED_DESC: "ZmÄ›ny musĂ­ bĂ˝t uloĹľeny na serveru." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Aliasy" LABEL_DISPLAY_NAME: "JmĂ©no" LABEL_REPLY_TO: "Adresa pro odpovÄ›di" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "PĹ™ipojit podpis ke všem odchozĂ­m zprávám" SETTINGS_SECURITY: LEGEND_SECURITY: "ZapezpeÄŤenĂ­" LABEL_CONFIGURE_TWO_FACTOR: "NastavenĂ­ dvoufázovĂ©ho ověřenĂ­" LABEL_AUTOLOGOUT: "AutomatickĂ© odhlášenĂ­" AUTOLOGIN_NEVER_OPTION_NAME: "Nikdy" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hodin" SETTINGS_GENERAL: LEGEND_GENERAL: "VšeobecnĂ©" LABEL_LANGUAGE: "Jazyk" LABEL_IDENTITY: "UĹľivatel" LABEL_LAYOUT: "RozloĹľenĂ­" LABEL_LAYOUT_NO_SPLIT: "NerozdÄ›lovat" LABEL_LAYOUT_VERTICAL_SPLIT: "VertikálnĂ­ rozdÄ›lenĂ­" LABEL_LAYOUT_HORIZONTAL_SPLIT: "HorizontálnĂ­ rozdÄ›lÄ›nĂ­" LABEL_EDITOR: "PĹ™ednastavenĂ˝ editor zpráv" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Text" LABEL_EDITOR_HTML_FORCED: "Html (vynucenĂ˝)" LABEL_EDITOR_PLAIN_FORCED: "Text (vynucenĂ˝)" LABEL_ANIMATION: "Animace prostĹ™edĂ­" LABEL_ANIMATION_FULL: "Všechny" LABEL_ANIMATION_NORMAL: "NormálnĂ­" LABEL_ANIMATION_NONE: "ŽádnĂ©" LABEL_VIEW_OPTIONS: "MoĹľnosti zobrazenĂ­" LABEL_USE_PREVIEW_PANE: "Používate panel rychlĂ©ho zobrazenĂ­" LABEL_USE_CHECKBOXES_IN_LIST: "ZobrazenĂ­ zaškrtávacĂ­ch polĂ­ÄŤek v seznamu" LABEL_USE_THREADS: "Zobrazit jako konverzace" LABEL_REPLY_SAME_FOLDER: "Ukládat odpovÄ›di do sloĹľky se zprávou, kterĂ© se tĂ˝kajĂ­" LABEL_SHOW_IMAGES: "VĹľdy zobrazovat obrázky v tÄ›le správy" LABEL_SHOW_ANIMATION: "Animovat" LABEL_MESSAGE_PER_PAGE: "Zpráv na stranu" LABEL_NOTIFICATIONS: "Notifikace" LABEL_SOUND_NOTIFICATION: "ZvukovĂ© notifikace" LABEL_CHROME_NOTIFICATION_DESC: "Zobrazovat upozornÄ›nĂ­ na novĂ© zprávy" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ZablokovanĂ© prohlĂ­ĹľeÄŤem)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakty" LABEL_CONTACTS_AUTOSAVE: "Automaticky pĹ™idávat adresy příjemcĹŻ do Adresáře" LEGEND_CONTACTS_SYNC: "Vzdálená synchronizace (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Povolit vzdálenou synchronizaci" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "URL adresáře" LABEL_CONTACTS_SYNC_USER: "UĹľivatel" LABEL_CONTACTS_SYNC_PASSWORD: "Heslo" SETTINGS_THEMES: LEGEND_THEMES: "Motivy" LEGEND_THEMES_CUSTOM: "Správa vlastnĂ­ho motivu" LABEL_CUSTOM_TYPE: "Typ" LABEL_CUSTOM_TYPE_LIGHT: "SvÄ›tlĂ˝" LABEL_CUSTOM_TYPE_DARK: "TmavĂ˝" LABEL_CUSTOM_BACKGROUND_IMAGE: "PozadĂ­" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Nahrát obrázek pozadĂ­ (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Soubor je příliš velkĂ˝" ERROR_FILE_TYPE_ERROR: "NesprávnĂ˝ typ souboru (povolenĂ© jsou pouze JPG a PNG)" ERROR_UNKNOWN: "Nastala neznámá chyba pĹ™i nahrávánĂ­ souboru" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Propojit Google" BUTTON_GOOGLE_DISCONNECT: "Odpojit Google" MAIN_GOOGLE_DESC: "Po povolenĂ­ pĹ™ihlášenĂ­ pĹ™es Google se mĹŻĹľete na ĂşvodnĂ­ stránce pĹ™ihlásit pĹ™es tlaÄŤĂ­tko Google." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Propojit Facebook" BUTTON_FACEBOOK_DISCONNECT: "Odpojit Facebook" MAIN_FACEBOOK_DESC: "Po povolenĂ­ pĹ™ihlášenĂ­ pĹ™es Facebook se mĹŻĹľete na ĂşvodnĂ­ stránce pĹ™ihlásit pĹ™es tlaÄŤĂ­tko Facebook." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Propojit Twitter" BUTTON_TWITTER_DISCONNECT: "Odpojit Twitter" MAIN_TWITTER_DESC: "Po povolenĂ­ pĹ™ihlášenĂ­ pĹ™es Twitter se mĹŻĹľete na ĂşvodnĂ­ stránce pĹ™ihlásit pĹ™es tlaÄŤĂ­tko Twitter." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Seznam sloĹľek" BUTTON_CREATE: "VytvoĹ™it sloĹľku" BUTTON_SYSTEM: "SystĂ©movĂ© sloĹľky" BUTTON_DELETE: "Odstranit" BUTTON_SUBSCRIBE: "PĹ™ihlásit se" BUTTON_UNSUBSCRIBE: "Odhlásit se" LOADING_PROCESS: "Aktualizuji seznam sloĹľek" CREATING_PROCESS: "Vytvářím sloĹľku" DELETING_PROCESS: "OdstraĹuji sloĹľku" RENAMING_PROCESS: "PĹ™ejmenovávám sloĹľku" DELETING_ASK: "Jste si jisti?" TO_MANY_FOLDERS_DESC_1: "Máte moc sloĹľek!" TO_MANY_FOLDERS_DESC_2: "MĹŻĹľeme zobrazit jen část z nich, abychom zabránili problĂ©mĹŻm s vĂ˝konem." HELP_DELETE_FOLDER: "Smazat sloĹľku" HELP_SHOW_HIDE_FOLDER: "Zobrazit/skrĂ˝t sloĹľku" HELP_CHECK_FOR_NEW_MESSAGES: "Kontrovat/nekontrolovat novĂ© příchozĂ­ zprávy" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Seznam účtĹŻ" LEGEND_IDENTITIES: "Aliasy" LEGEND_ACCOUNTS_AND_IDENTITIES: "Účty a aliasy" BUTTON_ADD_ACCOUNT: "PĹ™idat účet" BUTTON_ADD_IDENTITY: "PĹ™idat alias" BUTTON_DELETE: "Odstranit" LOADING_PROCESS: "Aktualizace seznamu účtĹŻ" DELETING_ASK: "Opravdu to chcete?" DEFAULT_IDENTITY_LABEL: "vĂ˝chozĂ­" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Alias" LEGEND_IDENTITIES: "Další aliasy" LABEL_DEFAULT: "VĂ˝chozĂ­" LABEL_DISPLAY_NAME: "JmĂ©no" LABEL_REPLY_TO: "Adresa pro odpověď" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "PĹ™ipojit ke všem odeslanĂ˝m zprávám" BUTTON_ADD_IDENTITY: "PĹ™idat alias" BUTTON_DELETE: "Odstranit" LOADING_PROCESS: "Aktualizace seznamu aliasĹŻ" DELETING_ASK: "Opravdu to chcete?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "ZmÄ›nit heslo" LABEL_CURRENT_PASSWORD: "SouÄŤasnĂ© heslo" LABEL_NEW_PASSWORD: "NovĂ© heslo" LABEL_REPEAT_PASSWORD: "NovĂ© heslo znovu" BUTTON_UPDATE_PASSWORD: "Nastavit novĂ© heslo" ERROR_PASSWORD_MISMATCH: "Hesla nejsou stejná, zkuste to znovu" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importovat OpenPGP klĂ­ÄŤ" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generovat OpenPGP klĂ­ÄŤe" TITLE_PRIVATE: "SoukromĂ˝" TITLE_PUBLIC: "VeĹ™ejnĂ˝" DELETING_ASK: "Opravdu to chcete?" GENERATE_ONLY_HTTPS: "Pouze HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Automaticky uloĹľit koncept" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "KlávesovĂ© zkratky" TAB_MAILBOX: "Schránka" TAB_MESSAGE_LIST: "Seznam zpráv" TAB_MESSAGE_VIEW: "Detail zprávy" TAB_COMPOSE: "Napsat" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "OdpovÄ›dÄ›t" LABEL_REPLY_ALL: "OdpovÄ›dÄ›t všem" LABEL_FORWARD: "PĹ™eposlat" LABEL_FORWARD_MULTIPLY: "PĹ™eposlat jako přílohu" LABEL_HELP: "NápovÄ›da" LABEL_CHECK_ALL: "Zjistit novĂ© zprávy" LABEL_ARCHIVE: "Archivovat" LABEL_DELETE: "Smazat" LABEL_OPEN_THREAD: "Otevřít oznaÄŤenou konverzaci" LABEL_MOVE: "PĹ™esunout" LABEL_READ: "OznaÄŤit vybranĂ© zprávy jako pĹ™eÄŤtenĂ©" LABEL_UNREAD: "OznaÄŤit vybranĂ© zprávy jako nepĹ™eÄŤtenĂ©" LABEL_IMPORTANT: "OznaÄŤit vybranĂ© zprávy jako dĹŻleĹľitĂ©" LABEL_SEARCH: "Hledat" LABEL_CANCEL_SEARCH: "Zrušit hledánĂ­" LABEL_FULLSCREEN_ENTER: "CeloobrazovkovĂ© rozloĹľenĂ­ (náhled)" LABEL_VIEW_MESSAGE_ENTER: "Zobrazit zprávu (bez náhledu)" LABEL_SWITCH_TO_MESSAGE: "Zobrazit vybranou zprávu" LABEL_SWITCH_TO_FOLDER_LIST: "SkoÄŤit do panelu adresářů" LABEL_FULLSCREEN_TOGGLE: "PĹ™epnout reĹľim celĂ© obrazovky" LABEL_BLOCKQUOTES_TOGGLE: "PĹ™epnout zobrazenĂ­ pĹ™iloĹľenĂ˝ch zpráv" LABEL_THREAD_NEXT: "NásledujĂ­cĂ­ zpráva ve vláknÄ›" LABEL_THREAD_PREV: "PĹ™edchozĂ­ zpráva ve vláknÄ›" LABEL_PRINT: "Tisk" LABEL_EXIT_FULLSCREEN: "UkonÄŤit reĹľim celĂ© obrazovky" LABEL_CLOSE_MESSAGE: "Zavřít zprávu (bez náhledu)" LABEL_SWITCH_TO_LIST: "Vrátit se zpÄ›t do seznamu zpráv" LABEL_OPEN_COMPOSE_POPUP: "Nová zpráva v oknÄ›" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimalizovat otevĹ™enĂ© okno" LABEL_OPEN_IDENTITIES_DROPDOWN: "Otevřít seznam aliasĹŻ" LABEL_SAVE_MESSAGE: "UloĹľit zprávu" LABEL_SEND_MESSAGE: "Odeslat zprávu" LABEL_CLOSE_COMPOSE: "Zavřít okno se zprávou" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Nenalezen žádnĂ˝ veĹ™ejnĂ˝ klĂ­ÄŤ" NO_PUBLIC_KEYS_FOUND_FOR: "ŽádnĂ˝ veĹ™ejnĂ˝ klĂ­ÄŤ pro \"%EMAIL%\" nenalezen" NO_PRIVATE_KEY_FOUND: "Nenalezen žádnĂ˝ soukromĂ˝ klĂ­ÄŤ" NO_PRIVATE_KEY_FOUND_FOR: "ŽádnĂ˝ soukromĂ˝ klĂ­ÄŤ pro \"%EMAIL%\" nenalezen" ADD_A_PUBLICK_KEY: "PĹ™idat veĹ™ejnĂ˝ klĂ­ÄŤ" SELECT_A_PRIVATE_KEY: "Vyberte soukromĂ˝ klĂ­ÄŤ" UNVERIFIRED_SIGNATURE: "NeověřenĂ˝ podpis" DECRYPTION_ERROR: "OpenPGP chyba dešifrovánĂ­" GOOD_SIGNATURE: "OvěřenĂ˝ podpis od %USER%" PGP_ERROR: "OpenPGP chyba: %ERROR%" SPECIFY_FROM_EMAIL: "Zadejte emailovou adresu odesĂ­latele" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Zadejte prosĂ­m alespoĹ jednoho příjemce" NOTIFICATIONS: INVALID_TOKEN: "NeplatnĂ˝ token" AUTH_ERROR: "OvěřenĂ­ selhalo" ACCESS_ERROR: "Chyba přístupu" CONNECTION_ERROR: "NepodaĹ™ilo se pĹ™ipojit k serveru" CAPTCHA_ERROR: "Nesprávná CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Toto ID nenĂ­ pĹ™iĹ™azeno k žádnĂ©mu účtu. PĹ™ihlašte se pomocĂ­ vaší emailovĂ© adresy a nastavte si tuto moĹľnost. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Toto ID nenĂ­ pĹ™iĹ™azeno k žádnĂ©mu účtu. PĹ™ihlašte se pomocĂ­ vaší emailovĂ© adresy a nastavte si tuto moĹľnost. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Toto ID nenĂ­ pĹ™iĹ™azeno k žádnĂ©mu účtu. PĹ™ihlašte se pomocĂ­ vaší emailovĂ© adresy a nastavte si tuto moĹľnost. DOMAIN_NOT_ALLOWED: "DomĂ©na nenĂ­ povolená" ACCOUNT_NOT_ALLOWED: "Účet nenĂ­ povolenĂ˝" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Je vyĹľadováno dvoufázovĂ© ověřenĂ­" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvoufázovĂ©ho ověřenĂ­" COULD_NOT_SAVE_NEW_PASSWORD: "Nelze uloĹľit novĂ© heslo" CURRENT_PASSWORD_INCORRECT: "SouÄŤasnĂ© heslo neodpovĂ­dá" NEW_PASSWORD_SHORT: "Heslo je krátkĂ©" NEW_PASSWORD_WEAK: "Heslo je moc jednoduchĂ©" NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje zakázanĂ© znaky" CONTACTS_SYNC_ERROR: "Chyba pĹ™i synchronizaci kontaktĹŻ" CANT_GET_MESSAGE_LIST: "Chyba pĹ™i vytvářenĂ­ seznamu zpráv" CANT_GET_MESSAGE: "Zprávu se nepodaĹ™ilo naÄŤĂ­st" CANT_DELETE_MESSAGE: "Zprávu se nepodaĹ™ilo odstranit" CANT_MOVE_MESSAGE: "Zprávu se nepodaĹ™ilo pĹ™esunout" CANT_SAVE_MESSAGE: "Zprávu se nepodaĹ™ilo uloĹľit" CANT_SEND_MESSAGE: "Zprávu se nepodaĹ™ilo odeslat" INVALID_RECIPIENTS: "NeplatnĂ˝ příjemci" CANT_SAVE_FILTERS: "Nelze uloĹľit filtry" CANT_GET_FILTERS: "Nelze naÄŤĂ­st filtry" FILTERS_ARE_NOT_CORRECT: "Filtry nejsou validnĂ­" CANT_CREATE_FOLDER: "SloĹľku se nepodaĹ™ilo vytvoĹ™it" CANT_RENAME_FOLDER: "SloĹľku se nepodaĹ™ilo pĹ™ejmenovat" CANT_DELETE_FOLDER: "SloĹľku se nepodaĹ™ilo odstranit" CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou sloĹľku" CANT_SUBSCRIBE_FOLDER: "Nelze pĹ™ihlásit adresář" CANT_UNSUBSCRIBE_FOLDER: "Nelze odhlásit adresář" CANT_SAVE_SETTINGS: "NastavenĂ­ se nepodaĹ™ilo uloĹľit" CANT_SAVE_PLUGIN_SETTINGS: "NastavenĂ­ se nepodaĹ™ilo uloĹľit" DOMAIN_ALREADY_EXISTS: "Táto domĂ©na jiĹľ existuje" CANT_INSTALL_PACKAGE: "Instalace balĂ­ÄŤku se nezdaĹ™ila" CANT_DELETE_PACKAGE: "OdstranÄ›nĂ­ balĂ­ÄŤku se nezdaĹ™ilo" INVALID_PLUGIN_PACKAGE: "NevalidnĂ­ balĂ­ÄŤek" UNSUPPORTED_PLUGIN_PACKAGE: "NepodporovanĂ˝ balĂ­ÄŤek rozšířenĂ­" LICENSING_SERVER_IS_UNAVAILABLE: "LicenÄŤnĂ­ server je nedostupnĂ˝" LICENSING_DOMAIN_EXPIRED: "Licence pro tuto domĂ©nu vypršela." LICENSING_DOMAIN_BANNED: "Licence pro tuto domĂ©nu byla zablokována." DEMO_SEND_MESSAGE_ERROR: "Z dĹŻvodu bezpeÄŤnosti tento demo účet nenĂ­ oprávnÄ›n posĂ­lat zprávy na externĂ­ emaily!" DEMO_ACCOUNT_ERROR: "Z dĹŻvodu bezpeÄŤnosti tento účet nemá oprávnÄ›nĂ­ toto provĂ©st!" ACCOUNT_ALREADY_EXISTS: "Účet uĹľ existuje" ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" MAIL_SERVER_ERROR: "Nastala chyba bÄ›hem přístupu na poštovnĂ­ server" INVALID_INPUT_ARGUMENT: "NevalidnĂ­ vstupnĂ­ argument" UNKNOWN_ERROR: "Neznámá chyba" STATIC: BACK_LINK: "Obnovit" DOMAIN_LIST_DESC: "Seznam domĂ©n, ke kterĂ˝m je moĹľnĂ© pĹ™istupovat pĹ™es webmail." PHP_EXSTENSIONS_ERROR_DESC: "PotĹ™ebnĂ© rošířenĂ­ PHP nejsou dostupnĂ© v konfiguraci PHP!" PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší neĹľ poĹľadovaná 5.3.0!" NO_SCRIPT_TITLE: "Tato aplikace vyĹľaduje JavaScript." NO_SCRIPT_DESC: | Váš internetovĂ˝ prohlĂ­ĹľeÄŤ nepodporuje JavaScript. ProsĂ­m povolte podporu JavaScriptu v nastavenĂ­ vašeho internetovĂ©ho prohlĂ­ĹľeÄŤe a zkuste to znovu. NO_COOKIE_TITLE: "Tato aplikace vyĹľaduje podporu Cookies." NO_COOKIE_DESC: | Váš internetovĂ˝ prohlĂ­ĹľeÄŤ nepodporuje Cookies. ProsĂ­m povolte podporu Cookies v nastavenĂ­ vašeho internetovĂ©ho prohlĂ­ĹľeÄŤe a zkuste to znovu. BAD_BROWSER_TITLE: "Používáte zastaralĂ˝ internetovĂ˝ prohlĂ­ĹľeÄŤ." BAD_BROWSER_DESC: | Abyste mohli využívat všechny funkcie tĂ©to aplikace, pouĹľijte nÄ›kterĂ˝ z následujĂ­cĂ­ch internetovĂ˝ch prohlĂ­ĹľeÄŤĹŻ: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml000066400000000000000000000727751361462701300261630ustar00rootroot00000000000000da_DK: LOGIN: LABEL_EMAIL: "E-mail" LABEL_LOGIN: "Brugernavn" LABEL_PASSWORD: "Adgangskode" LABEL_SIGN_ME: "Husk mig" LABEL_VERIFICATION_CODE: "Verifikationskode" LABEL_DONT_ASK_VERIFICATION_CODE: "Husk kode i 2 uger" BUTTON_SIGN_IN: "Log ind" TITLE_SIGN_IN_GOOGLE: "Log ind med Google" TITLE_SIGN_IN_FACEBOOK: "Log ind med Facebook" TITLE_SIGN_IN_TWITTER: "Log ind med Twitter" LABEL_FORGOT_PASSWORD: "Glemt adgangskode" LABEL_REGISTRATION: "Registrering" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Tilføj konto" BUTTON_SETTINGS: "Indstillinger" BUTTON_HELP: "Hjælp" BUTTON_LOGOUT: "Log ud" MOBILE: BUTTON_MOBILE_VERSION: "Mobil udgave" BUTTON_DESKTOP_VERSION: "Desktop udgave" SEARCH: MAIN_INPUT_PLACEHOLDER: "Søg" TITLE_ADV: "Avanceret søgning" LABEL_ADV_FROM: "Fra" LABEL_ADV_TO: "Til" LABEL_ADV_SUBJECT: "Emne" LABEL_ADV_TEXT: "Tekst" LABEL_ADV_HAS_ATTACHMENT: "Har vedhæftet fil" LABEL_ADV_HAS_ATTACHMENTS: "Har vedhæftede filer" LABEL_ADV_FLAGGED: "Markeret med flag" LABEL_ADV_UNSEEN: "Ulæst" LABEL_ADV_DATE: "Dato" LABEL_ADV_DATE_ALL: "Alle" LABEL_ADV_DATE_3_DAYS: "Nyere end 3 dage" LABEL_ADV_DATE_7_DAYS: "Nyere end 1 uge" LABEL_ADV_DATE_MONTH: "Nyere end 1 mĂĄned" LABEL_ADV_DATE_3_MONTHS: "Nyere end 3 mĂĄneder" LABEL_ADV_DATE_6_MONTHS: "Nyere end 6 mĂĄneder" LABEL_ADV_DATE_YEAR: "Nyere end 1 ĂĄr" BUTTON_ADV_SEARCH: "Søg" PREVIEW_POPUP: FULLSCREEN: "Fuld skærm" ZOOM: "Zoom ind/ud" CLOSE: "Luk (Esc)" LOADING: "Indlæser..." GALLERY_PREV: "Forrige (venstrepil)" GALLERY_NEXT: "Næste (højrepil)" GALLERY_COUNTER: "%curr% af %total%" IMAGE_ERROR: "Billedet kunne ikke indlæses." AJAX_ERROR: "Indholdet kunne ikke indlæses." FOLDER_LIST: BUTTON_COMPOSE: "Forfat" BUTTON_CONTACTS: "Kontakter" BUTTON_NEW_MESSAGE: "Ny meddelelse" INBOX_NAME: "Indbakke" SENT_NAME: "Sendte meddelelser" DRAFTS_NAME: "Kladder" SPAM_NAME: "Uønskede meddelelser" TRASH_NAME: "Slettede meddelelser" ARCHIVE_NAME: "Arkiverede meddelelser" QUOTA: TITLE: "Forbrug" MESSAGE_LIST: BUTTON_RELOAD: "Genindlæs meddelelser" BUTTON_MOVE_TO: "Flyt til" BUTTON_DELETE: "Slet" BUTTON_ARCHIVE: "ArkivĂ©r" BUTTON_SPAM: "Uønsket" BUTTON_NOT_SPAM: "Ikke uønsket" BUTTON_EMPTY_FOLDER: "Tøm mappe" BUTTON_MULTY_FORWARD: "Videresend som vedhæftning(er)" BUTTON_DELETE_WITHOUT_MOVE: "Slet permanent" BUTTON_MORE: "Mere" MENU_SET_SEEN: "MarkĂ©r som læst" MENU_SET_ALL_SEEN: "MarkĂ©r alle som læst" MENU_UNSET_SEEN: "MarkĂ©r som ulæst" MENU_SET_FLAG: "MarkĂ©r med flag" MENU_UNSET_FLAG: "Fjern flag" MENU_SELECT_ALL: "Alle" MENU_SELECT_NONE: "Ingen" MENU_SELECT_INVERT: "Vend valg" MENU_SELECT_UNSEEN: "Ulæst" MENU_SELECT_SEEN: "Læst" MENU_SELECT_FLAGGED: "Markeret med flag" MENU_SELECT_UNFLAGGED: "Ikke markeret med flag" EMPTY_LIST: "Ingen meddelelser." EMPTY_SEARCH_LIST: "Ingen meddelelser passede pĂĄ søgningen." SEARCH_RESULT_FOR: "Resultat for søgningen pĂĄ \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "Tilbage til meddelelsesoversigt" LIST_LOADING: "Indlæser" EMPTY_SUBJECT_TEXT: "(Intet emne)" PUT_MESSAGE_HERE: "Slip meddelelse her for visning i oversigten" TODAY_AT: "i dag klokken %TIME%" YESTERDAY_AT: "i gĂĄr klokken %TIME%" SEARCH_PLACEHOLDER: "Søg" NEW_MESSAGE_NOTIFICATION: "%COUNT% nye meddelelser!" QUOTA_SIZE: "Du bruger %SIZE% (%PROC%%) af %LIMIT%" MESSAGE: BUTTON_EDIT: "Rediger" BUTTON_BACK: "Tilbage" BUTTON_CLOSE: "Luk" BUTTON_DELETE: "Slet" BUTTON_UNSUBSCRIBE: "Frameld liste" BUTTON_ARCHIVE: "ArkivĂ©r" BUTTON_SPAM: "Uønsket" BUTTON_NOT_SPAM: "Ikke uønsket" BUTTON_MOVE_TO: "Flyt til" BUTTON_MORE: "Mere" BUTTON_REPLY: "Svar" BUTTON_REPLY_ALL: "Svar alle" BUTTON_FORWARD: "Videresend" BUTTON_FORWARD_AS_ATTACHMENT: "Videresend som vedhæftning" BUTTON_EDIT_AS_NEW: "Rediger som ny" BUTTON_SHOW_IMAGES: "Vis eksterne billeder" BUTTON_NOTIFY_READ_RECEIPT: "Afsender har bedt om modtagelseskvittering." BUTTON_IN_NEW_WINDOW: "Vis i separat vindue" BUTTON_THREAD_LIST: "Samtaleoversigt" BUTTON_THREAD_PREV: "Forrige" BUTTON_THREAD_NEXT: "Næste" BUTTON_THREAD_MORE: "Flere meddelelser" MENU_HEADERS: "Vis meddelelseoplysninger" MENU_VIEW_ORIGINAL: "Vis kilder" MENU_DOWNLOAD_ORIGINAL: "Hent som .eml fil" MENU_FILTER_SIMILAR: "Find lignende meddelelser" MENU_PRINT: "Udskriv" EMPTY_SUBJECT_TEXT: "(Intet emne)" LABEL_SUBJECT: "Emne" LABEL_DATE: "Dato" LABEL_FROM: "Fra" LABEL_FROM_SHORT: "fra" LABEL_TO: "Til" LABEL_TO_SHORT: "til" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Svar til" PRINT_LABEL_FROM: "Fra" PRINT_LABEL_TO: "Til" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Svar til" PRINT_LABEL_DATE: "Dato" PRINT_LABEL_SUBJECT: "Emne" PRINT_LABEL_ATTACHMENTS: "Vedhæftninger" MESSAGE_LOADING: "Indlæser" MESSAGE_VIEW_DESC: "Vælg meddelelse i oversigten for visning." MESSAGE_VIEW_MOVE_DESC: "Vælg modtagemappe i panelet til venstre." PGP_PASSWORD_INPUT_PLACEHOLDER: "Adgangskode" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signeret meddelelse (tryk for at verificere)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP krypteret meddelelse (tryk for at dekryptere)" LINK_DOWNLOAD_AS_ZIP: "Hent som zip-fil" LINK_SAVE_TO_OWNCLOUD: "Gem til ownCloud" LINK_SAVE_TO_DROPBOX: "Gem til Dropbox" READ_RECEIPT: SUBJECT: "Kvittering for læsning af - %SUBJECT%" BODY: | Kvittering for læsning af %READ-RECEIPT%. Bemærk: "Dette bekræfter bare at meddelelsen er blevet vist pĂĄ modtagerens computer." Der er ingen garanti for at modtager har læst meddelelsen. SUGGESTIONS: SEARCHING_DESC: "Søger..." CONTACTS: LEGEND_CONTACTS: "Kontakter" SEARCH_INPUT_PLACEHOLDER: "Søg" BUTTON_ADD_CONTACT: "Tilføj kontakt" BUTTON_CREATE_CONTACT: "Ny kontakt" BUTTON_UPDATE_CONTACT: "Opdater kontakt" BUTTON_IMPORT: "Importer kontakter (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Eksporter kontakter (vcf, vCard)" BUTTON_EXPORT_CSV: "Eksporter kontakter (csv)" ERROR_IMPORT_FILE: "Importfejl (forkert fil type)" LIST_LOADING: "Indlæser" EMPTY_LIST: "Ingen kontakter" EMPTY_SEARCH: "Ingen kontakter fundet" CLEAR_SEARCH: "Fjern søgning" CONTACT_VIEW_DESC: "Vælg kontakt i oversigten for visning." LABEL_DISPLAY_NAME: "Visningsnavn" LABEL_EMAIL: "E-mail" LABEL_PHONE: "Telefon" LABEL_WEB: "Hjemmeside" LABEL_BIRTHDAY: "Fødselsdag" LINK_ADD_EMAIL: "Tilføj e-mail adresse" LINK_ADD_PHONE: "Tilføj telefonnummer" LINK_BIRTHDAY: "Fødselsdag" PLACEHOLDER_ENTER_DISPLAY_NAME: "Indtast kaldenavn" PLACEHOLDER_ENTER_LAST_NAME: "Indtast efternavn" PLACEHOLDER_ENTER_FIRST_NAME: "Indtast fornavn(e)" PLACEHOLDER_ENTER_NICK_NAME: "Indtast kaldenavn" LABEL_READ_ONLY: "Skrivebeskyttet" LABEL_SHARE: "Del" ADD_MENU_LABEL: "Tilføj" ADD_MENU_NICKNAME: "Kaldenavn" ADD_MENU_NOTES: "Noter" ADD_MENU_EMAIL: "E-mail" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adresse" ADD_MENU_BIRTHDAY: "Fødselsdag" ADD_MENU_TAGS: "Mærkater" BUTTON_SHARE_NONE: "Ingen" BUTTON_SHARE_ALL: "Alle" BUTTON_SYNC: "Synkronisering (CardDAV)" COMPOSE: TITLE_FROM: "Fra" TITLE_TO: "Til" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Svar til" TITLE_SUBJECT: "Emne" LINK_SHOW_INPUTS: "Vis alle felter" BUTTON_SEND: "Send" BUTTON_SAVE: "Gem" BUTTON_DELETE: "Slet" BUTTON_CANCEL: "Annuller" BUTTON_MINIMIZE: "Minimer" SAVED_TIME: "Gemt klokken %TIME%" SAVED_ERROR_ON_SEND: "Meddelelse blev afsendt, men ikke gemt i mappen for sendte meddelelser" DISCARD_UNSAVED_DATA: "Slet ikke gemt data?" ATTACH_FILES: "Vedhæft filer" ATTACH_DROP_FILES_DESC: "Slip filer her" ATTACH_ITEM_CANCEL: "Annuller" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drev" REPLY_MESSAGE_TITLE: "Den %DATE% klokken %TIME%, skrev %EMAIL%:" FORWARD_MESSAGE_TOP_TITLE: "-------- Videresendt meddelelse -------" FORWARD_MESSAGE_TOP_FROM: "Fra" FORWARD_MESSAGE_TOP_TO: "Til" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Sendt" FORWARD_MESSAGE_TOP_SUBJECT: "Emne" EMPTY_TO_ERROR_DESC: "Tilføj minimum en modtager" NO_ATTACHMENTS_HERE_DESC: "Ingen vedhæftninger." ATTACHMENTS_ERROR_DESC: "Advarsels! Ikke alle vedhæftninger er overført." ATTACHMENTS_UPLOAD_ERROR_DESC: "Overførsel af vedhæftninger igang." BUTTON_REQUEST_READ_RECEIPT: "Bed om kvittering for læsning" BUTTON_MARK_AS_IMPORTANT: "MarkĂ©r som vigtig" BUTTON_OPEN_PGP: "OpenPGP (kun plain tekst)" BUTTON_REQUEST_DSN: "Bed om kvittering for modtagelse" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Luk" POPUPS_ASK: BUTTON_YES: "Ja" BUTTON_NO: "Nej" DESC_WANT_CLOSE_THIS_WINDOW: "Vil du lukke vinduet?" DESC_WANT_DELETE_MESSAGES: "Vil du slette denne/disse meddelelse(r)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Vælg sprog" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Tilføj konto?" BUTTON_ADD_ACCOUNT: "Tilføj" TITLE_UPDATE_ACCOUNT: "Opdater konto?" BUTTON_UPDATE_ACCOUNT: "Opdater" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Tilføj identitet?" TITLE_UPDATE_IDENTITY: "Opdater identitet?" BUTTON_ADD_IDENTITY: "Tilføj" BUTTON_UPDATE_IDENTITY: "Opdater" LABEL_EMAIL: "E-mail" LABEL_NAME: "Navn" LABEL_REPLY_TO: "Svar til" LABEL_SIGNATURE: "Signatur" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Indsæt signatur før citeret tekst" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Opret ny mappe?" LABEL_NAME: "Mappenavn" LABEL_PARENT: "Hovedmappe" BUTTON_CREATE: "Opret ny mappe" BUTTON_CANCEL: "Annuller" BUTTON_CLOSE: "Luk" TITLE_CREATING_PROCESS: "Opretter mappe" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Tøm mappe?" BUTTON_CLEAR: "Tøm mappe" BUTTON_CANCEL: "Annuller" BUTTON_CLOSE: "Luk" DANGER_DESC_WARNING: "Advarsel!" DANGER_DESC_HTML_1: "Dette vil slette alle e-mails i %FOLDER%." DANGER_DESC_HTML_2: "Handlingen kan ikke afbrydes nĂĄr den er startet." TITLE_CLEARING_PROCESS: "Tømmer mappe..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importer OpenPGP nøgle" BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Vis OpenPGP nøgle" BUTTON_SELECT: "Vælg" BUTTON_CLOSE: "Luk" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "GenerĂ©r OpenPGP nøgler" LABEL_EMAIL: "E-mail" LABEL_NAME: "Navn" LABEL_PASSWORD: "Adgangskode" LABEL_KEY_BIT_LENGTH: "Nøglelængde" BUTTON_GENERATE_OPEN_PGP_KEYS: "GenerĂ©r" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP signĂ©r/krypter" LABEL_SIGN: "SignĂ©r" LABEL_ENCRYPT: "Krypter" LABEL_PASSWORD: "Adgangskode" BUTTON_SIGN: "SignĂ©r" BUTTON_ENCRYPT: "Krypter" BUTTON_SIGN_AND_ENCRYPT: "SignĂ©r og krypter" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP dekrypter" LABEL_KEY: "Privat nøgle" LABEL_PASSWORD: "Adgangskode" BUTTON_DECRYPT: "Dekrypter" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-trins verifikationstest" LABEL_CODE: "Kode" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Opret filter?" TITLE_EDIT_FILTER: "Opdater filter?" FILTER_NAME: "Navn" LEGEND_CONDITIONS: "Betingelser" LEGEND_ACTIONS: "Handlinger" BUTTON_DONE: "Færdig" BUTTON_ADD_CONDITION: "Tilføj betingelse" SELECT_ACTION_NONE: "Ingen" SELECT_ACTION_MOVE_TO: "Flyt til" SELECT_ACTION_FORWARD_TO: "Videresend til" SELECT_ACTION_REJECT: "Afvis" SELECT_ACTION_VACATION_MESSAGE: "Feriemeddelelse" SELECT_ACTION_DISCARD: "KassĂ©r" SELECT_FIELD_FROM: "Fra" SELECT_FIELD_RECIPIENTS: "Modtagere (Til eller CC)" SELECT_FIELD_SUBJECT: "Emne" SELECT_FIELD_HEADER: "Meddelelsesoplysninger" SELECT_FIELD_SIZE: "Størrelse" SELECT_TYPE_CONTAINS: "Indeholder" SELECT_TYPE_NOT_CONTAINS: "Indeholder ikke" SELECT_TYPE_MATCHES: "Svarer til (* og ? kan bruges)" SELECT_TYPE_NOT_MATCHES: "Svarer ikke til (* og ? kan bruges)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Ikke regexp" SELECT_TYPE_EQUAL_TO: "Lig med" SELECT_TYPE_NOT_EQUAL_TO: "Ikke lige med" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Passer til en af følgende regler" SELECT_MATCH_ALL: "Passer til alle følgende regler" MARK_AS_READ_LABEL: "MarkĂ©r som læst" REPLY_INTERVAL_LABEL: "Svarinterval (dage)" KEEP_LABEL: "Behold" STOP_LABEL: "Forsæt med at tjekke regler" EMAIL_LABEL: "E-mail" VACATION_SUBJECT_LABEL: "Emne (valgfrit)" VACATION_MESSAGE_LABEL: "Meddelelse" VACATION_RECIPIENTS_LABEL: "Modtagere (kommaseparerede)" REJECT_MESSAGE_LABEL: "Afvis meddelelse" ALL_INCOMING_MESSAGES_DESC: "Alle modtagne meddelelser" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Vælg systemmapper" SELECT_CHOOSE_ONE: "Vælg en" SELECT_UNUSE_NAME: "Brug ikke" LABEL_SENT: "Sendte meddelelser" LABEL_DRAFTS: "Kladder" LABEL_SPAM: "Uønskede meddelelser" LABEL_TRASH: "Slettede meddelelser" LABEL_ARCHIVE: "Arkiverede meddelelser" BUTTON_CANCEL: "Annuller" BUTTON_CLOSE: "Luk" NOTIFICATION_SENT: | Du har ikke valgt en systemmappe til sendte meddelelser. NOTIFICATION_DRAFTS: "Du har ikke valgt en systemmappe til kladder." NOTIFICATION_SPAM: | Du har ikke valgt en systemmappe til uønskede meddelelser. NOTIFICATION_TRASH: | Du har ikke valgt en systemmappe til slettede meddelelser. Hvis du vil slette meddelelser permanent, vælg "Brug ikke". NOTIFICATION_ARCHIVE: "Du har ikke valgt en systemmappe til arkiverede meddelelser." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-trins verifikation (TOTP)" LABEL_ENABLE_TWO_FACTOR: "AktivĂ©r 2-trins verifikation" LABEL_TWO_FACTOR_USER: "Bruger" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "2-trins verificeringshemmelighed" LABEL_TWO_FACTOR_BACKUP_CODES: "Tag backup af 2-trins verificeringshemmeligheder" BUTTON_CREATE: "Opret en hemmelighed" BUTTON_ACTIVATE: "AktivĂ©r" BUTTON_CLEAR: "Slet" BUTTON_LOGOUT: "Log ud" BUTTON_DONE: "Færdig" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Vis hemmelighed" BUTTON_HIDE_SECRET: "Skjul hemmelighed" TWO_FACTOR_REQUIRE_DESC: "Din konto kræver 2-trins verifikation." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfigureret" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ikke konfigureret" TWO_FACTOR_SECRET_DESC: > Importer denne information til din Google Autentificering app (eller en anden TOTP klient) ved hjælp af QR koden herunder eller ved at indtaste koden manuelt. TWO_FACTOR_BACKUP_CODES_DESC: > Hvis du ikke kan modtage koder ved hjælp af Google Autentificering appen (eller en anden TOTP klient), kan du bruge backup koder til at logge ind med. NĂĄr en backup kode er brugt en gang bliver den inaktiv. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Indstillingen kan ikke ændres før den er testet." TITLES: LOADING: "Indlæser" LOGIN: "Log ind" MAILBOX: "Postkasse" SETTINGS: "Indstillinger" COMPOSE: "Forfat" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Filen er for stor" ERROR_FILE_PARTIALLY_UPLOADED: "Upload ufuldent, ukendt fejl." ERROR_NO_FILE_UPLOADED: "Ingen fil uploaded" ERROR_MISSING_TEMP_FOLDER: "Midlertidig fil findes ikke" ERROR_ON_SAVING_FILE: "Ukendt upload fejl" ERROR_FILE_TYPE: "Forkert filtype" ERROR_UNKNOWN: "Ukendt upload fejl" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Rig formatering" TEXT_SWITCHER_CONFIRM: "Formatering og billeder vil gĂĄ tabt. Forsæt?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personlig" LABEL_GENERAL_NAME: "Generelt" LABEL_CONTACTS_NAME: "Kontakter" LABEL_FOLDERS_NAME: "Mapper" LABEL_ACCOUNTS_NAME: "Kontoer" LABEL_IDENTITY_NAME: "Identitet" LABEL_IDENTITIES_NAME: "Identiteter" LABEL_FILTERS_NAME: "Filtre" LABEL_TEMPLATES_NAME: "Skabeloner" LABEL_SECURITY_NAME: "Sikkerhed" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Temaer" LABEL_CHANGE_PASSWORD_NAME: "Adgangskode" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Tilbage" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtre" BUTTON_SAVE: "Gem" BUTTON_ADD_FILTER: "Tilføj filter" BUTTON_DELETE: "Slet" BUTTON_RAW_SCRIPT: "Anvend brugerdefineret script" SUBNAME_NONE: "Ingen" SUBNAME_MOVE_TO: "Flyt til \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Videresend til \"%EMAIL%\"" SUBNAME_REJECT: "Afvis" SUBNAME_VACATION_MESSAGE: "Feriemeddelelse" SUBNAME_DISCARD: "KassĂ©r" CAPABILITY_LABEL: "Evner" LOADING_PROCESS: "Opdater oversigten over filtre" DELETING_ASK: "Er du sikker?" CHACHES_NEED_TO_BE_SAVED_DESC: "Ændringerne skal gemmes til serveren." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identitet" LABEL_DISPLAY_NAME: "Navn" LABEL_REPLY_TO: "Svar til" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Tilføj din signatur til alle meddelelser" SETTINGS_SECURITY: LEGEND_SECURITY: "Sikkerhed" LABEL_CONFIGURE_TWO_FACTOR: "Opsæt 2-trins verifikation" LABEL_AUTOLOGOUT: "Automatisk log ud" AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(ter)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% time(r)" SETTINGS_GENERAL: LEGEND_GENERAL: "Generelt" LABEL_LANGUAGE: "Sprog" LABEL_IDENTITY: "Identitet" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "Del ikke" LABEL_LAYOUT_VERTICAL_SPLIT: "Del lodret" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Del vandret" LABEL_EDITOR: "Standard tekst program" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Plain" LABEL_EDITOR_HTML_FORCED: "Html (gennemtvunget)" LABEL_EDITOR_PLAIN_FORCED: "Plain (gennemtvunget)" LABEL_ANIMATION: "Grænsefladeanimation" LABEL_ANIMATION_FULL: "Fuld" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Ingen" LABEL_VIEW_OPTIONS: "Visningsindstillinger" LABEL_USE_PREVIEW_PANE: "Brug preview panel" LABEL_USE_CHECKBOXES_IN_LIST: "Vis afkrydsningsfelt i oversigten" LABEL_USE_THREADS: "Brug samtaler" LABEL_REPLY_SAME_FOLDER: "Placer svar i samme mappe som oprindelig meddelelse" LABEL_SHOW_IMAGES: "Vis altid eksterne billeder" LABEL_SHOW_ANIMATION: "Vis animationer" LABEL_MESSAGE_PER_PAGE: "Meddelelser per side" LABEL_NOTIFICATIONS: "Notifikationer" LABEL_SOUND_NOTIFICATION: "Lyd notifikationer" LABEL_CHROME_NOTIFICATION_DESC: "Vis ny meddelelses notifikations popup" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokeret af browseren)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakter" LABEL_CONTACTS_AUTOSAVE: "Tilføj automatisk modtager til adressebog" LEGEND_CONTACTS_SYNC: "Synkronisering (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "AktivĂ©r synkronisering" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Adressebogs URL" LABEL_CONTACTS_SYNC_USER: "Bruger" LABEL_CONTACTS_SYNC_PASSWORD: "Adgangskode" SETTINGS_THEMES: LEGEND_THEMES: "Temaer" LEGEND_THEMES_CUSTOM: "Brugerdefineret temakonfiguration" LABEL_CUSTOM_TYPE: "Type" LABEL_CUSTOM_TYPE_LIGHT: "Lys" LABEL_CUSTOM_TYPE_DARK: "Mørk" LABEL_CUSTOM_BACKGROUND_IMAGE: "Baggrund" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload baggrundsbillede (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Fil for stor" ERROR_FILE_TYPE_ERROR: "Forkert filtype (kun JPG og PNG )" ERROR_UNKNOWN: "Ukendt upload fejl" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Forbind til Google" BUTTON_GOOGLE_DISCONNECT: "Afbryd forbindelse til Google" MAIN_GOOGLE_DESC: "Ved aktivering af log ind via Google, kan der logges ind ved hjælp af Google knappen pĂĄ log ind skærmen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Forbind til Facebook" BUTTON_FACEBOOK_DISCONNECT: "Afbryd forbindelse til Facebook" MAIN_FACEBOOK_DESC: "Ved aktivering af log ind via Facebook, kan der logges ind ved hjælp af Facebook knappen pĂĄ log ind skærmen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Forbind til Twitter" BUTTON_TWITTER_DISCONNECT: "Afbryd forbindelse til Twitter" MAIN_TWITTER_DESC: "Ved aktivering af log ind via Twitter, kan der logges ind ved hjælp af Twitter knappen pĂĄ log ind skærmen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Mappeoversigt" BUTTON_CREATE: "Opret ny mappe" BUTTON_SYSTEM: "Systemmapper" BUTTON_DELETE: "Slet" BUTTON_SUBSCRIBE: "Tilmeld" BUTTON_UNSUBSCRIBE: "Afmeld" LOADING_PROCESS: "Opdaterer mappeoversigt" CREATING_PROCESS: "Opretter mappe" DELETING_PROCESS: "Sletter mappe" RENAMING_PROCESS: "Omdøber mappe" DELETING_ASK: "Er du sikker?" TO_MANY_FOLDERS_DESC_1: "For mange mapper!" TO_MANY_FOLDERS_DESC_2: "Kun nogle mapper vises for at undgĂĄ problemer." HELP_DELETE_FOLDER: "Slet mappe" HELP_SHOW_HIDE_FOLDER: "Vis/skjul mappe" HELP_CHECK_FOR_NEW_MESSAGES: "MarkĂ©r/fjern markering for nye meddelelser" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Kontoer" LEGEND_IDENTITIES: "Identiteter" LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontoer og identiteter" BUTTON_ADD_ACCOUNT: "Tilføj konto" BUTTON_ADD_IDENTITY: "Tilføj identitet?" BUTTON_DELETE: "Slet" LOADING_PROCESS: "Opdaterer..." DELETING_ASK: "Er du sikker?" DEFAULT_IDENTITY_LABEL: "standard" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identitet" LEGEND_IDENTITIES: "Ekstra identiteter" LABEL_DEFAULT: "Standard" LABEL_DISPLAY_NAME: "Navn" LABEL_REPLY_TO: "Svar til" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Tilføj din signatur til alle meddelelser" BUTTON_ADD_IDENTITY: "Tilføj identitet" BUTTON_DELETE: "Slet" LOADING_PROCESS: "Opdaterer identitetsoversigt" DELETING_ASK: "Er du sikker?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Skift adgangskode" LABEL_CURRENT_PASSWORD: "Nuværende adgangskode" LABEL_NEW_PASSWORD: "Ny adgangskode" LABEL_REPEAT_PASSWORD: "Bekræft ny adgangskode" BUTTON_UPDATE_PASSWORD: "Ny adgangskode" ERROR_PASSWORD_MISMATCH: "Adgangskoder er ikke ens, prøv igen" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importer OpenPGP nøgle" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generer OpenPGP nøgler" TITLE_PRIVATE: "Privat" TITLE_PUBLIC: "Offentlig" DELETING_ASK: "Er du sikker?" GENERATE_ONLY_HTTPS: "Kun HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Gem kladde automatisk" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Hjælp til tasteturgenveje" TAB_MAILBOX: "Postkasse" TAB_MESSAGE_LIST: "Meddelelsesoversigt" TAB_MESSAGE_VIEW: "Meddelelsesvisning" TAB_COMPOSE: "Forfat" LABEL_OPEN_USER_DROPDOWN: "Ă…ben brugermenu" LABEL_REPLY: "Svar" LABEL_REPLY_ALL: "Svar alle" LABEL_FORWARD: "Videresend" LABEL_FORWARD_MULTIPLY: "Videresend som vedhæftning(er)" LABEL_HELP: "Hjælp" LABEL_CHECK_ALL: "Vælg alle meddelelser" LABEL_ARCHIVE: "ArkivĂ©r" LABEL_DELETE: "Slet" LABEL_OPEN_THREAD: "Ă…ben valgte samtale" LABEL_MOVE: "Flyt" LABEL_READ: "MarkĂ©r valgte meddelelser som læste" LABEL_UNREAD: "MarkĂ©r valgte meddelelser som ulæste" LABEL_IMPORTANT: "MarkĂ©r valgte meddelelser som vigtige" LABEL_SEARCH: "Søg" LABEL_CANCEL_SEARCH: "Annuller søgning" LABEL_FULLSCREEN_ENTER: "Fuld skærm (Preview panel layout)" LABEL_VIEW_MESSAGE_ENTER: "Vis meddelelser (Uden preview panel layout)" LABEL_SWITCH_TO_MESSAGE: "Fokuser pĂĄ valgte meddelelser" LABEL_SWITCH_TO_FOLDER_LIST: "Fokuser pĂĄ mappeoversigt" LABEL_FULLSCREEN_TOGGLE: "Fuld skærm" LABEL_BLOCKQUOTES_TOGGLE: "SlĂĄ blokcitater til/fra i meddelelser" LABEL_THREAD_NEXT: "Næste besked i samtale" LABEL_THREAD_PREV: "Forrige besked i samtale" LABEL_PRINT: "Udskriv" LABEL_EXIT_FULLSCREEN: "Luk fuld skærm" LABEL_CLOSE_MESSAGE: "Luk meddelelse (Uden preview panel layout)" LABEL_SWITCH_TO_LIST: "Fokuser pĂĄ meddelelsesoversigt" LABEL_OPEN_COMPOSE_POPUP: "Ă…ben forfatter popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimer forfatter popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Ă…ben identitetsmenu" LABEL_SAVE_MESSAGE: "Gem meddelelse" LABEL_SEND_MESSAGE: "Send meddelelse" LABEL_CLOSE_COMPOSE: "Luk forfatter mode" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Ingen offentlige nøgler fundet" NO_PUBLIC_KEYS_FOUND_FOR: "Ingen offentlige nøgler fundet tilhørende \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Ingen privat nøgle fundet" NO_PRIVATE_KEY_FOUND_FOR: "Ingen privat nøgle fundet tilhørende \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Tilføj privat nøgle" SELECT_A_PRIVATE_KEY: "Vælg privat nøgle" UNVERIFIRED_SIGNATURE: "Ikke verificeret signatur" DECRYPTION_ERROR: "OpenPGP dekrypteringsfejl" GOOD_SIGNATURE: "Accepteret signatur for %USER\"" PGP_ERROR: "OpenPGP fejl: %ERROR%" SPECIFY_FROM_EMAIL: "Udfyld afsenderadresse" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Angiv mindst en modtager" NOTIFICATIONS: INVALID_TOKEN: "Ugyldigt tegn" AUTH_ERROR: "Godkendelse fejlede" ACCESS_ERROR: "Adgangsfejl" CONNECTION_ERROR: "Kan ikke kontakte server" CAPTCHA_ERROR: "Forkert CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug af e-mail og tilføj ID'et under kontoindstillinger. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug af e-mail og tilføj ID'et under kontoindstillinger. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug af e-mail og tilføj ID'et under kontoindstillinger. DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation pĂĄbudt." ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikationsfejl" COULD_NOT_SAVE_NEW_PASSWORD: "Kunne ikke gemme ny adgangskode" CURRENT_PASSWORD_INCORRECT: "Nuværende adgangskode forkert" NEW_PASSWORD_SHORT: "Adgangskoden for kort" NEW_PASSWORD_WEAK: "Adgangskoden for simpel" NEW_PASSWORD_FORBIDDENT: "Adgangskode indeholder forbudte tegn" CONTACTS_SYNC_ERROR: "Fejl ved synkronisering af kontakter" CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelsesoversigt " CANT_GET_MESSAGE: "Kan ikke indlæse meddelelse" CANT_DELETE_MESSAGE: "Kan ikke slette meddelelse" CANT_MOVE_MESSAGE: "Kan ikke flytte meddelelse" CANT_SAVE_MESSAGE: "Kan ikke gemme meddelelse" CANT_SEND_MESSAGE: "Kan ikke sende meddelelse" INVALID_RECIPIENTS: "Ugyldige modtagere" CANT_SAVE_FILTERS: "Kan ikke gemme filtre" CANT_GET_FILTERS: "Kan ikke indlæse filtre" FILTERS_ARE_NOT_CORRECT: "Fejl i filtre" CANT_CREATE_FOLDER: "Kan ikke oprette mappe" CANT_RENAME_FOLDER: "Kan ikke omdøbe mappe" CANT_DELETE_FOLDER: "Kan ikke slette mappe" CANT_DELETE_NON_EMPTY_FOLDER: "Kan ikke slette mappe som ikke er tom" CANT_SUBSCRIBE_FOLDER: "Kan ikke abonnere pĂĄ mappe" CANT_UNSUBSCRIBE_FOLDER: "Kan ikke afmelde mappe" CANT_SAVE_SETTINGS: "Kan ikke gemme instillinger" CANT_SAVE_PLUGIN_SETTINGS: "Kan ikke gemme instillinger" DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" CANT_INSTALL_PACKAGE: "Installation af pakke mislykkedes" CANT_DELETE_PACKAGE: "Fjernelse af pakke mislykkedes" INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelsespakke" UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelsespakke ikke understøttet" LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementsserver ikke tilgængelig" LICENSING_DOMAIN_EXPIRED: "Abonnement pĂĄ domæne udløbet." LICENSING_DOMAIN_BANNED: "Abonnement pĂĄ domæne forbudt." DEMO_SEND_MESSAGE_ERROR: "Denne konto kan af sikkerhedshensyn ikke sende e-mails til eksterne adresser!" DEMO_ACCOUNT_ERROR: "Denne konto kan af sikkerhedshensyn ikke udføre denne handling!" ACCOUNT_ALREADY_EXISTS: "Kontoen eksisterer allerede" ACCOUNT_DOES_NOT_EXIST: "Kontoen eksisterer ikke" MAIL_SERVER_ERROR: "Der skete en fejl under adgang til e-mail serveren" INVALID_INPUT_ARGUMENT: "Ugyldigt argument" UNKNOWN_ERROR: "Ukendt fejl" STATIC: BACK_LINK: "Genindlæs" DOMAIN_LIST_DESC: "Liste over domæner webmail er tilladt adgang til." PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgængelige!" PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" NO_SCRIPT_TITLE: "JavaScript er nødvendigt for dette program." NO_SCRIPT_DESC: | JavaScript er slĂĄet fra i din browser. SlĂĄ JavaScript til og prøv igen. NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." NO_COOKIE_DESC: | Cookies er slĂĄet fra i din browser. SlĂĄ Cookies til og prøv igen. BAD_BROWSER_TITLE: "Din browser er forældet." BAD_BROWSER_DESC: | Enkelte funktioner fungerer ikke med denne browser. For at bruge alle funktioner, hent en af følgende: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/de_DE.yml000066400000000000000000001015531361462701300261440ustar00rootroot00000000000000de_DE: LOGIN: LABEL_EMAIL: "E-Mail" LABEL_LOGIN: "Login" LABEL_PASSWORD: "Passwort" LABEL_SIGN_ME: "Anmeldung merken" LABEL_VERIFICATION_CODE: "Verifizierungscode" LABEL_DONT_ASK_VERIFICATION_CODE: "FĂĽr zwei Wochen nicht nach dem Code fragen" BUTTON_SIGN_IN: "Anmelden" TITLE_SIGN_IN_GOOGLE: "Mit Google anmelden" TITLE_SIGN_IN_FACEBOOK: "Mit Facebook anmelden" TITLE_SIGN_IN_TWITTER: "Mit Twitter anmelden" LABEL_FORGOT_PASSWORD: "Passwort vergessen" LABEL_REGISTRATION: "Registrierung" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Konto hinzufĂĽgen" BUTTON_SETTINGS: "Einstellungen" BUTTON_HELP: "Hilfe" BUTTON_LOGOUT: "Abmelden" MOBILE: BUTTON_MOBILE_VERSION: "mobile Version" BUTTON_DESKTOP_VERSION: "Desktop Version" SEARCH: MAIN_INPUT_PLACEHOLDER: "Suche" TITLE_ADV: "Erweiterte Suche" LABEL_ADV_FROM: "Von" LABEL_ADV_TO: "An" LABEL_ADV_SUBJECT: "Betreff" LABEL_ADV_TEXT: "Text" LABEL_ADV_HAS_ATTACHMENT: "Anhang vorhanden" LABEL_ADV_HAS_ATTACHMENTS: "Anhänge vorhanden" LABEL_ADV_FLAGGED: "Markiert" LABEL_ADV_UNSEEN: "Ungelesen" LABEL_ADV_DATE: "Datum" LABEL_ADV_DATE_ALL: "Alle" LABEL_ADV_DATE_3_DAYS: "Nicht älter als 3 Tage" LABEL_ADV_DATE_7_DAYS: "Nicht älter als 1 Woche" LABEL_ADV_DATE_MONTH: "Nicht älter als 1 Monat" LABEL_ADV_DATE_3_MONTHS: "Nicht älter als 3 Monate" LABEL_ADV_DATE_6_MONTHS: "Nicht älter als 6 Monate" LABEL_ADV_DATE_YEAR: "Nicht älter als 1 Jahr" BUTTON_ADV_SEARCH: "Suchen" PREVIEW_POPUP: FULLSCREEN: "Vollbild umschalten" ZOOM: "Herein-/Herauszoomen" CLOSE: "SchlieĂźen (Esc)" LOADING: "Wird geladen ..." GALLERY_PREV: "ZurĂĽck (Linke Pfeil-Taste)" GALLERY_NEXT: "Weiter (Rechte Pfeil-Taste)" GALLERY_COUNTER: "%curr% von %total%" IMAGE_ERROR: "Die Grafikdatei konnte nicht geladen werden." AJAX_ERROR: "Der Inhalt konnte nicht geladen werden." FOLDER_LIST: BUTTON_COMPOSE: "Erstellen" BUTTON_CONTACTS: "Kontakte" BUTTON_NEW_MESSAGE: "Neue Nachricht" INBOX_NAME: "Posteingang" SENT_NAME: "Gesendet" DRAFTS_NAME: "EntwĂĽrfe" SPAM_NAME: "Spam" TRASH_NAME: "Papierkorb" ARCHIVE_NAME: "Archiv" QUOTA: TITLE: "Speicherplatz-Nutzung" MESSAGE_LIST: BUTTON_RELOAD: "Nachrichtenliste neu laden" BUTTON_MOVE_TO: "Verschieben nach" BUTTON_DELETE: "Löschen" BUTTON_ARCHIVE: "Archiv" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Kein Spam" BUTTON_EMPTY_FOLDER: "Ordner leeren" BUTTON_MULTY_FORWARD: "Nachrichten weiterleiten" BUTTON_DELETE_WITHOUT_MOVE: "EndgĂĽltig löschen" BUTTON_MORE: "Mehr" MENU_SET_SEEN: "Als gelesen markieren" MENU_SET_ALL_SEEN: "Alle als gelesen markieren" MENU_UNSET_SEEN: "Als ungelesen markieren" MENU_SET_FLAG: "Markieren" MENU_UNSET_FLAG: "Markierung entfernen" MENU_SELECT_ALL: "Alle" MENU_SELECT_NONE: "Keine" MENU_SELECT_INVERT: "Umkehren" MENU_SELECT_UNSEEN: "Ungelesen" MENU_SELECT_SEEN: "Gelesen" MENU_SELECT_FLAGGED: "Markiert" MENU_SELECT_UNFLAGGED: "Nicht markiert" EMPTY_LIST: "Liste ist leer." EMPTY_SEARCH_LIST: "Keine Treffer fĂĽr Ihre Suche." SEARCH_RESULT_FOR: "Suchergebnisse fĂĽr \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "ZurĂĽck zur Nachrichtenliste" LIST_LOADING: "Die Liste wird geladen" EMPTY_SUBJECT_TEXT: "(Kein Betreff)" PUT_MESSAGE_HERE: "Ziehen Sie die Nachricht hierhin, um sie in der Liste anzuzeigen" TODAY_AT: "Heute um %TIME%" YESTERDAY_AT: "Gestern um %TIME%" SEARCH_PLACEHOLDER: "Suche" NEW_MESSAGE_NOTIFICATION: "Sie haben %COUNT% neue Nachrichten!" QUOTA_SIZE: "Sie nutzen %SIZE% (%PROC%%) von %LIMIT%." MESSAGE: BUTTON_EDIT: "Bearbeiten" BUTTON_BACK: "ZurĂĽck" BUTTON_CLOSE: "SchlieĂźen" BUTTON_DELETE: "Löschen" BUTTON_UNSUBSCRIBE: "Diese Liste abbestellen" BUTTON_ARCHIVE: "Archiv" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Kein Spam" BUTTON_MOVE_TO: "Verschieben nach" BUTTON_MORE: "Mehr" BUTTON_REPLY: "Antworten" BUTTON_REPLY_ALL: "Allen antworten" BUTTON_FORWARD: "Weiterleiten" BUTTON_FORWARD_AS_ATTACHMENT: "Als Anhang weiterleiten" BUTTON_EDIT_AS_NEW: "Als neue Nachricht öffnen" BUTTON_SHOW_IMAGES: "Bilder anzeigen" BUTTON_NOTIFY_READ_RECEIPT: "Der Absender hat darum gebeten, benachrichtigt zu werden, wenn Sie diese Nachricht lesen." BUTTON_IN_NEW_WINDOW: "In neuem Fenster anzeigen" BUTTON_THREAD_LIST: "Unterhaltungsliste" BUTTON_THREAD_PREV: "ZurĂĽck" BUTTON_THREAD_NEXT: "Weiter" BUTTON_THREAD_MORE: "Mehr Nachrichten" MENU_HEADERS: "Kopfzeilen anzeigen" MENU_VIEW_ORIGINAL: "Original anzeigen" MENU_DOWNLOAD_ORIGINAL: "Als .eml-Datei herunterladen" MENU_FILTER_SIMILAR: "Ă„hnliche Nachrichten" MENU_PRINT: "Drucken" EMPTY_SUBJECT_TEXT: "(Kein Betreff)" LABEL_SUBJECT: "Betreff" LABEL_DATE: "Datum" LABEL_FROM: "Von" LABEL_FROM_SHORT: "von" LABEL_TO: "An" LABEL_TO_SHORT: "an" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Antwort an" PRINT_LABEL_FROM: "Von" PRINT_LABEL_TO: "An" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Antwort an" PRINT_LABEL_DATE: "Datum" PRINT_LABEL_SUBJECT: "Betreff" PRINT_LABEL_ATTACHMENTS: "Anhänge" MESSAGE_LOADING: "Nachricht wird geladen" MESSAGE_VIEW_DESC: "Wählen Sie eine Nachricht aus der Liste aus, um sie anzuzeigen." MESSAGE_VIEW_MOVE_DESC: "Klicke auf den Ordnernamen auf der linken Seite, um die Nachricht zu verschieben." PGP_PASSWORD_INPUT_PLACEHOLDER: "Passwort" PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signierte Nachricht (klicken, um zu ĂĽberprĂĽfen)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-verschlĂĽsselte Nachricht (klicken, um zu entschlĂĽsseln)" LINK_DOWNLOAD_AS_ZIP: "Als ZIP-Datei herunterladen" LINK_SAVE_TO_OWNCLOUD: "In ownCloud speichern" LINK_SAVE_TO_DROPBOX: "In Dropbox speichern" READ_RECEIPT: SUBJECT: "Empfangsbestätigung (angezeigt) - %SUBJECT%" BODY: | Dies ist eine Empfangsbestätigung fĂĽr die Nachricht, die Sie an %READ-RECEIPT% gesendet haben. Hinweis: Diese Empfangsbestätigung bestätigt nur, dass die Nachricht auf dem Computer des Empfängers angezeigt wurde. Es besteht keine Garantie, dass der Empfänger den Inhalt der Nachricht gelesen oder verstanden hat. SUGGESTIONS: SEARCHING_DESC: "Suche läuft..." CONTACTS: LEGEND_CONTACTS: "Kontakte" SEARCH_INPUT_PLACEHOLDER: "Suche" BUTTON_ADD_CONTACT: "Kontakt hinzufĂĽgen" BUTTON_CREATE_CONTACT: "Kontakt anlegen" BUTTON_UPDATE_CONTACT: "Kontakt aktualisieren" BUTTON_IMPORT: "Import (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Importfehler (ungĂĽltiges Dateiformat)" LIST_LOADING: "Kontakte werden geladen" EMPTY_LIST: "Keine Kontakte" EMPTY_SEARCH: "Keine Kontakte gefunden" CLEAR_SEARCH: "Suche leeren" CONTACT_VIEW_DESC: "Kontakt aus der Liste wählen, um ihn anzuzeigen." LABEL_DISPLAY_NAME: "Anzeigename" LABEL_EMAIL: "E-Mail" LABEL_PHONE: "Telefon" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Geburtstag" LINK_ADD_EMAIL: "E-Mail-Adresse hinzufĂĽgen" LINK_ADD_PHONE: "Nummer hinzufĂĽgen" LINK_BIRTHDAY: "Geburtstag" PLACEHOLDER_ENTER_DISPLAY_NAME: "Anzeigename eingeben" PLACEHOLDER_ENTER_LAST_NAME: "Nachnamen eingeben" PLACEHOLDER_ENTER_FIRST_NAME: "Vornamen eingeben" PLACEHOLDER_ENTER_NICK_NAME: "Spitzname eingeben" LABEL_READ_ONLY: "SchreibgeschĂĽtzt" LABEL_SHARE: "Teilen" ADD_MENU_LABEL: "HinzufĂĽgen" ADD_MENU_NICKNAME: "Spitzname" ADD_MENU_NOTES: "Anmerkung" ADD_MENU_EMAIL: "E-Mail" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adresse" ADD_MENU_BIRTHDAY: "Geburtstag" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "Niemand" BUTTON_SHARE_ALL: "Jeder" BUTTON_SYNC: "Synchronisierung (CardDAV)" COMPOSE: TITLE_FROM: "Von" TITLE_TO: "An" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Antwort an" TITLE_SUBJECT: "Betreff" LINK_SHOW_INPUTS: "alle Felder anzeigen" BUTTON_SEND: "Senden" BUTTON_SAVE: "Speichern" BUTTON_DELETE: "Löschen" BUTTON_CANCEL: "Abbrechen" BUTTON_MINIMIZE: "Minimieren" SAVED_TIME: "Gespeichert um %TIME%" SAVED_ERROR_ON_SEND: "Die Nachricht wurde gesendet, konnte aber nicht im Gesendet-Ordner gespeichert werden." DISCARD_UNSAVED_DATA: "Nicht gespeicherte Daten löschen?" ATTACH_FILES: "Dateien anhängen" ATTACH_DROP_FILES_DESC: "FĂĽgen Sie hier Dateien ein" ATTACH_ITEM_CANCEL: "Abbrechen" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% schrieb" FORWARD_MESSAGE_TOP_TITLE: "-------- Weitergeleitete Nachricht -------" FORWARD_MESSAGE_TOP_FROM: "Von" FORWARD_MESSAGE_TOP_TO: "An" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Gesendet" FORWARD_MESSAGE_TOP_SUBJECT: "Betreff" EMPTY_TO_ERROR_DESC: "Geben Sie bitte mindestens einen Empfänger an" NO_ATTACHMENTS_HERE_DESC: "Keine Anhänge vorhanden." ATTACHMENTS_ERROR_DESC: "Warnung! Nicht alle Anhänge wurden hochgeladen." ATTACHMENTS_UPLOAD_ERROR_DESC: "Es wurden noch nicht alle Anhänge hochgeladen." BUTTON_REQUEST_READ_RECEIPT: "Empfangsbestätigung anfordern" BUTTON_MARK_AS_IMPORTANT: "Als Wichtig markieren" BUTTON_OPEN_PGP: "OpenPGP (nur bei unformatiertem Text)" BUTTON_REQUEST_DSN: "Ăśbermittlungsstatus anfordern" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "SchlieĂźen" POPUPS_ASK: BUTTON_YES: "Ja" BUTTON_NO: "Nein" DESC_WANT_CLOSE_THIS_WINDOW: "Sind Sie sicher, dass Sie dieses Fenster schlieĂźen möchten?" DESC_WANT_DELETE_MESSAGES: "Sind Sie sicher, dass Sie diese Nachricht(en) löschen möchten?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Sprache auswählen" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Konto hinzufĂĽgen?" BUTTON_ADD_ACCOUNT: "HinzufĂĽgen" TITLE_UPDATE_ACCOUNT: "Konto aktualisieren?" BUTTON_UPDATE_ACCOUNT: "Aktualisieren" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Identität hinzufĂĽgen?" TITLE_UPDATE_IDENTITY: "Identität aktualisieren?" BUTTON_ADD_IDENTITY: "HinzufĂĽgen" BUTTON_UPDATE_IDENTITY: "Aktualisieren" LABEL_EMAIL: "E-Mail" LABEL_NAME: "Name" LABEL_REPLY_TO: "Antwort an" LABEL_SIGNATURE: "Signatur" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_SIGNATURE_INSERT_BEFORE: "Diese Signatur in Antworten vor dem zitierten Text einfĂĽgen" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Ordner anlegen?" LABEL_NAME: "Ordnername" LABEL_PARENT: "Ăśbergeordneter Ordner" BUTTON_CREATE: "Anlegen" BUTTON_CANCEL: "Abbrechen" BUTTON_CLOSE: "SchlieĂźen" TITLE_CREATING_PROCESS: "Ordner wird angelegt" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Alle Nachrichten in diesem Ordner löschen?" BUTTON_CLEAR: "Bereinigen" BUTTON_CANCEL: "Abbrechen" BUTTON_CLOSE: "SchlieĂźen" DANGER_DESC_WARNING: "Achtung!" DANGER_DESC_HTML_1: "Dieser Schritt wird alle Nachrichten im Ordner %FOLDER% endgĂĽltig löschen." DANGER_DESC_HTML_2: "Einmal begonnen, kann dieser Vorgang nicht mehr abgebrochen oder beendet werden." TITLE_CLEARING_PROCESS: "Ordner wird gelöscht ..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP-SchlĂĽssel importieren" BUTTON_IMPORT_OPEN_PGP_KEY: "Importieren" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP-SchlĂĽssel anzeigen" BUTTON_SELECT: "Auswählen" BUTTON_CLOSE: "SchlieĂźen" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP-SchlĂĽssel generieren" LABEL_EMAIL: "E-Mail" LABEL_NAME: "Name" LABEL_PASSWORD: "Passwort" LABEL_KEY_BIT_LENGTH: "SchlĂĽssellänge" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generieren" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP unterschreiben/verschlĂĽsseln" LABEL_SIGN: "Unterschrift" LABEL_ENCRYPT: "VerschlĂĽsselung" LABEL_PASSWORD: "Passwort" BUTTON_SIGN: "Unterschreiben" BUTTON_ENCRYPT: "VerschlĂĽsseln" BUTTON_SIGN_AND_ENCRYPT: "Unterschreiben und verschlĂĽsseln" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Zwei-Faktor-Authentifizierung" LABEL_CODE: "Code" BUTTON_TEST: "Testen" POPUPS_FILTER: TITLE_CREATE_FILTER: "Filter erstellen?" TITLE_EDIT_FILTER: "Filter bearbeiten?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Bedingungen" LEGEND_ACTIONS: "Aktionen" BUTTON_DONE: "Erledigt" BUTTON_ADD_CONDITION: "Bedingung hinzufĂĽgen" SELECT_ACTION_NONE: "Keine" SELECT_ACTION_MOVE_TO: "Verschieben nach" SELECT_ACTION_FORWARD_TO: "Weiterleiten nach" SELECT_ACTION_REJECT: "Ablehnen" SELECT_ACTION_VACATION_MESSAGE: "Urlaubsbenachrichtigung" SELECT_ACTION_DISCARD: "Verwerfen" SELECT_FIELD_FROM: "Von" SELECT_FIELD_RECIPIENTS: "Empfänger (An oder CC)" SELECT_FIELD_SUBJECT: "Betreff" SELECT_FIELD_HEADER: "Nachrichtenkopf" SELECT_FIELD_SIZE: "Größe" SELECT_TYPE_CONTAINS: "Enthält" SELECT_TYPE_NOT_CONTAINS: "Enthält nicht" SELECT_TYPE_MATCHES: "Ăśbereinstimmung (* und ? unterstĂĽtzt)" SELECT_TYPE_NOT_MATCHES: "Keine Ăśbereinstimmung (* und ? unterstĂĽtzt)" SELECT_TYPE_REGEXP: "Regulärer Ausdruck" SELECT_TYPE_NOT_REGEXP: "Regulärer Ausdruck (negiert)" SELECT_TYPE_EQUAL_TO: "Gleich" SELECT_TYPE_NOT_EQUAL_TO: "Ungleich" SELECT_TYPE_OVER: "Ăśber" SELECT_TYPE_UNDER: "Unter" SELECT_MATCH_ANY: "Eine der folgenden Regeln trifft zu" SELECT_MATCH_ALL: "Alle folgenden Regeln treffen zu" MARK_AS_READ_LABEL: "Als Gelesen markieren" REPLY_INTERVAL_LABEL: "Antwortintervall (Tage)" KEEP_LABEL: "Behalten" STOP_LABEL: "Weiterverarbeitung der Regeln nicht verhindern" EMAIL_LABEL: "E-Mail" VACATION_SUBJECT_LABEL: "Betreff (optional)" VACATION_MESSAGE_LABEL: "Nachricht" VACATION_RECIPIENTS_LABEL: "Empfänger (durch Komma getrennt)" REJECT_MESSAGE_LABEL: "Ablehnnachricht" ALL_INCOMING_MESSAGES_DESC: "Alle eingehenden Nachrichten" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Wählen Sie die Systemordner aus" SELECT_CHOOSE_ONE: "Wählen Sie einen aus" SELECT_UNUSE_NAME: "Nicht anwenden" LABEL_SENT: "Gesendet" LABEL_DRAFTS: "EntwĂĽrfe" LABEL_SPAM: "Spam" LABEL_TRASH: "Papierkorb" LABEL_ARCHIVE: "Archiv" BUTTON_CANCEL: "Abbrechen" BUTTON_CLOSE: "SchlieĂźen" NOTIFICATION_SENT: | Sie haben keinen "Gesendet"-Systemordner gewählt, in dem Nachrichten nach dem Versenden gespeichert werden. Falls Sie versandte Nachrichten nicht speichern möchten, wählen Sie die Option "Nicht anwenden". NOTIFICATION_DRAFTS: "Sie haben keinen \"EntwĂĽrfe\"-Systemordner gewählt, in dem Nachrichten beim Erstellen gespeichert werden." NOTIFICATION_SPAM: | Sie haben keinen "Spam"-Systemordner gewählt, in dem die Spam-Nachrichten abgelegt werden. Falls Sie Spam-Nachrichten endgĂĽltig löschen möchten, wählen Sie die Option "Nicht anwenden". NOTIFICATION_TRASH: | Sie haben keinen "Papierkorb"-Systemordner gewählt, in dem die gelöschten Nachrichten abgelegt werden. Falls Sie gelöschte Nachrichten endgĂĽltig löschen möchten, wählen Sie die Option "Nicht anwenden". NOTIFICATION_ARCHIVE: "Sie haben keinen \"Archiv\"-Systemordner gewählt, in dem die archivierten Nachrichten abgelegt werden." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Zwei-Faktor-Authentifizierung" LABEL_ENABLE_TWO_FACTOR: "Zwei-Faktor-Authentifizierung aktivieren" LABEL_TWO_FACTOR_USER: "Benutzer" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Geheimnis" LABEL_TWO_FACTOR_BACKUP_CODES: "Sicherungscodes" BUTTON_CREATE: "Neues Geheimnis erstellen" BUTTON_ACTIVATE: "Aktivieren" BUTTON_CLEAR: "Löschen" BUTTON_LOGOUT: "Abmelden" BUTTON_DONE: "Erledigt" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Geheimnis einblenden" BUTTON_HIDE_SECRET: "Geheminis ausblenden" TWO_FACTOR_REQUIRE_DESC: "Ihr Benutzerkonto erfordert die Einrichtung der Zwei-Faktor-Authentifizierung." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfiguriert" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nicht konfiguriert" TWO_FACTOR_SECRET_DESC: >- Importieren Sie diese Information in Ihre Google-Authenticator-Anwendung (oder andere TOTP-Anwendung), indem Sie den unten bereitgestellten QR-Code verwenden oder den Code manuell eingeben. TWO_FACTOR_BACKUP_CODES_DESC: >- Sollten Sie keine Codes ĂĽber den Google Authenticator erhalten, können Sie einen Sicherungscode zur Anmeldung verwenden. Der Sicherungscode wird inaktiv, sobald Sie ihn zur Anmeldung verwendet haben. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Sie können diese Einstellung nicht ohne vorherigen Test verändern." TITLES: LOADING: "Wird geladen" LOGIN: "Anmeldung" MAILBOX: "Postfach" SETTINGS: "Einstellungen" COMPOSE: "Erstellen" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Datei ist zu groĂź" ERROR_FILE_PARTIALLY_UPLOADED: "Die Datei wurde aus einem unbekannten Grund unvollständig hochgeladen." ERROR_NO_FILE_UPLOADED: "Keine Datei hochgeladen" ERROR_MISSING_TEMP_FOLDER: "Die temporäre Datei fehlt" ERROR_ON_SAVING_FILE: "Ein unbekannter Fehler trat beim Hochladen auf" ERROR_FILE_TYPE: "UngĂĽltiger Dateityp" ERROR_UNKNOWN: "Ein unbekannter Fehler trat beim Hochladen auf" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Formatierter Text (Rich Text)" TEXT_SWITCHER_CONFIRM: "Alle Textformatierungen und Grafiken gehen verloren. Wollen Sie wirklich fortfahren?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Persönlich" LABEL_GENERAL_NAME: "Allgemein" LABEL_CONTACTS_NAME: "Kontakte" LABEL_FOLDERS_NAME: "Ordner" LABEL_ACCOUNTS_NAME: "Konten" LABEL_IDENTITY_NAME: "Identität" LABEL_IDENTITIES_NAME: "Identitäten" LABEL_FILTERS_NAME: "Filter" LABEL_TEMPLATES_NAME: "Vorlagen" LABEL_SECURITY_NAME: "Sicherheit" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Themen" LABEL_CHANGE_PASSWORD_NAME: "Passwort" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "ZurĂĽck" SETTINGS_FILTERS: LEGEND_FILTERS: "Filter" BUTTON_SAVE: "Speichern" BUTTON_ADD_FILTER: "Filter hinzufĂĽgen" BUTTON_DELETE: "Löschen" BUTTON_RAW_SCRIPT: "Benutzerdefiniertes Skript verwenden" SUBNAME_NONE: "Keine" SUBNAME_MOVE_TO: "Verschieben nach \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Weiterleiten nach \"%EMAIL%\"" SUBNAME_REJECT: "Ablehnen" SUBNAME_VACATION_MESSAGE: "Urlaubsbenachrichtigung" SUBNAME_DISCARD: "Verwerfen" CAPABILITY_LABEL: "UnterstĂĽtzte Module" LOADING_PROCESS: "Aktualisiere Filterliste" DELETING_ASK: "Sind Sie sicher?" CHACHES_NEED_TO_BE_SAVED_DESC: "Die Ă„nderungen mĂĽssen auf dem Server gespeichert werden." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identität" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Antwort an" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Signatur zu allen ausgehenden Nachrichten hinzufĂĽgen" SETTINGS_SECURITY: LEGEND_SECURITY: "Sicherheit" LABEL_CONFIGURE_TWO_FACTOR: "Zwei-Faktor-Authentifizierung konfigurieren" LABEL_AUTOLOGOUT: "Automatische Abmeldung" AUTOLOGIN_NEVER_OPTION_NAME: "Nie" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% Minute(n)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% Stunde(n)" SETTINGS_GENERAL: LEGEND_GENERAL: "Allgemein" LABEL_LANGUAGE: "Sprache" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "Keine Aufteilung" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikale Aufteilung" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontale Aufteilung" LABEL_EDITOR: "Standard-Texteditor" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Unformatierter Text" LABEL_EDITOR_HTML_FORCED: "HTML (erzwungen)" LABEL_EDITOR_PLAIN_FORCED: "Unformatierter Text (erzwungen)" LABEL_ANIMATION: "Interface-Animation" LABEL_ANIMATION_FULL: "Komplett" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Keine" LABEL_VIEW_OPTIONS: "Optionen anzeigen" LABEL_USE_PREVIEW_PANE: "Vorschaufenster nutzen" LABEL_USE_CHECKBOXES_IN_LIST: "Kontrollkästchen in der Liste anzeigen" LABEL_USE_THREADS: "Als Unterhaltungen anzeigen" LABEL_REPLY_SAME_FOLDER: "Antworten im gleichen Ordner wie die Nachricht, auf die geantwortet wurde, abspeichern" LABEL_SHOW_IMAGES: "In der Nachricht enthaltene Bilder immer anzeigen" LABEL_SHOW_ANIMATION: "Animation anzeigen" LABEL_MESSAGE_PER_PAGE: "Nachrichten pro Seite" LABEL_NOTIFICATIONS: "Benachrichtigungen" LABEL_SOUND_NOTIFICATION: "Benachrichtigungston" LABEL_CHROME_NOTIFICATION_DESC: "Popups einblenden, wenn neue Nachrichten vorhanden sind" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Vom Browser blockiert.)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakte" LABEL_CONTACTS_AUTOSAVE: "Empfänger automatisch zu Ihrem Adressbuch hinzuzufĂĽgen" LEGEND_CONTACTS_SYNC: "Remote-Synchronisierung (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Remote-Synchronisierung aktivieren" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Adressbuch-URL" LABEL_CONTACTS_SYNC_USER: "Benutzer" LABEL_CONTACTS_SYNC_PASSWORD: "Passwort" SETTINGS_THEMES: LEGEND_THEMES: "Themen" LEGEND_THEMES_CUSTOM: "Konfiguration der selbsterstellten Themen" LABEL_CUSTOM_TYPE: "Typ" LABEL_CUSTOM_TYPE_LIGHT: "Hell" LABEL_CUSTOM_TYPE_DARK: "Dunkel" LABEL_CUSTOM_BACKGROUND_IMAGE: "Hintergrund" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Hintergrundbild hochladen (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Datei ist zu groĂź" ERROR_FILE_TYPE_ERROR: "UngĂĽltiger Dateityp (nur JPG und PNG)" ERROR_UNKNOWN: "Ein unbekannter Fehler trat beim Hochladen auf" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Mit Google verbinden" BUTTON_GOOGLE_DISCONNECT: "Von Google abmelden" MAIN_GOOGLE_DESC: "Nach der Aktivierung der Anmeldung per Google können Sie sich hier mit dem Google-Button im Anmeldedialog anmelden." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Mit Facebook verbinden" BUTTON_FACEBOOK_DISCONNECT: "Von Facebook abmelden" MAIN_FACEBOOK_DESC: "Nach der Aktivierung der Anmeldung per Facebook können Sie sich hier mit dem Facebook-Button im Anmeldedialog anmelden." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Mit Twitter verbinden" BUTTON_TWITTER_DISCONNECT: "Von Twitter abmelden" MAIN_TWITTER_DESC: "Nach der Aktivierung der Anmeldung per Twitter können Sie sich hier mit dem Twitter-Button im Anmeldedialog anmelden." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Ordnerliste" BUTTON_CREATE: "Ordner anlegen" BUTTON_SYSTEM: "Systemordner" BUTTON_DELETE: "Löschen" BUTTON_SUBSCRIBE: "Abonnieren" BUTTON_UNSUBSCRIBE: "Abonnement beenden" LOADING_PROCESS: "Ordnerliste wird geladen" CREATING_PROCESS: "Ordner wird angelegt" DELETING_PROCESS: "Ordner wird gelöscht" RENAMING_PROCESS: "Ordner wird umbenannt" DELETING_ASK: "Sind Sie sicher?" TO_MANY_FOLDERS_DESC_1: "Sie haben zu viele Ordner!" TO_MANY_FOLDERS_DESC_2: "Aus LeistungsgrĂĽnden zeigen wir nur einen Teil davon an." HELP_DELETE_FOLDER: "Ordner löschen" HELP_SHOW_HIDE_FOLDER: "Ordner ein-/ausblenden" HELP_CHECK_FOR_NEW_MESSAGES: "Auf neue Nachrichten prĂĽfen/nicht prĂĽfen" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Konten" LEGEND_IDENTITIES: "Identitäten" LEGEND_ACCOUNTS_AND_IDENTITIES: "Konten und Identitäten" BUTTON_ADD_ACCOUNT: "Konto hinzufĂĽgen" BUTTON_ADD_IDENTITY: "Identität hinzufĂĽgen" BUTTON_DELETE: "Löschen" LOADING_PROCESS: "Aktualisiere Kontenliste" DELETING_ASK: "Sind Sie sicher?" DEFAULT_IDENTITY_LABEL: "Standard" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identität" LEGEND_IDENTITIES: "Zusätzliche Identitäten" LABEL_DEFAULT: "Standard" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Antwort an" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Signatur zu allen ausgehenden Nachrichten hinzufĂĽgen" BUTTON_ADD_IDENTITY: "Identität hinzufĂĽgen" BUTTON_DELETE: "Löschen" LOADING_PROCESS: "Aktualisiere Identitätsliste" DELETING_ASK: "Sind Sie sicher?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Passwort ändern" LABEL_CURRENT_PASSWORD: "Aktuelles Passwort" LABEL_NEW_PASSWORD: "Neues Passwort" LABEL_REPEAT_PASSWORD: "Neues Passwort bestätigen" BUTTON_UPDATE_PASSWORD: "Neues Passwort setzen" ERROR_PASSWORD_MISMATCH: "Passwörter stimmen nicht ĂĽberein; versuchen Sie es bitte erneut" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP-SchlĂĽssel importieren" BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP-SchlĂĽssel generieren" TITLE_PRIVATE: "Privat" TITLE_PUBLIC: "Ă–ffentlich" DELETING_ASK: "Sind Sie sicher?" GENERATE_ONLY_HTTPS: "Nur HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "TastaturkĂĽrzel-Hilfe" TAB_MAILBOX: "Postfach" TAB_MESSAGE_LIST: "Nachrichtenliste" TAB_MESSAGE_VIEW: "Nachrichtenansicht" TAB_COMPOSE: "Nachricht schreiben" LABEL_OPEN_USER_DROPDOWN: "Benutzerauswahl öffnen" LABEL_REPLY: "Antworten" LABEL_REPLY_ALL: "Allen Antworten" LABEL_FORWARD: "Weiterleiten" LABEL_FORWARD_MULTIPLY: "Als Anhang/Anhänge weiterleiten" LABEL_HELP: "Hilfe" LABEL_CHECK_ALL: "Alle Nachrichten auswählen" LABEL_ARCHIVE: "Archivieren" LABEL_DELETE: "Löschen" LABEL_OPEN_THREAD: "Ausgewählte Unterhaltung öffnen" LABEL_MOVE: "Verschieben" LABEL_READ: "Ausgewählte Nachrichten als gelesen markieren" LABEL_UNREAD: "Ausgewählte Nachrichten als ungelesen markieren" LABEL_IMPORTANT: "Wichtig, ausgewählte Nachrichten markieren" LABEL_SEARCH: "Suchen" LABEL_CANCEL_SEARCH: "Suche abbrechen" LABEL_FULLSCREEN_ENTER: "Vollbild (Vorschaubereich-Layout)" LABEL_VIEW_MESSAGE_ENTER: "Nachricht anzeigen (kein Vorschaubereich-Layout)" LABEL_SWITCH_TO_MESSAGE: "Fokus auf ausgewählte Nachricht schalten" LABEL_SWITCH_TO_FOLDER_LIST: "Fokus auf Ordnerliste schalten" LABEL_FULLSCREEN_TOGGLE: "Vollbildmodus umschalten" LABEL_BLOCKQUOTES_TOGGLE: "Nachrichten-Blockzitate umschalten" LABEL_THREAD_NEXT: "Nächste Nachricht in Unterhaltung" LABEL_THREAD_PREV: "Vorherige Nachricht in Unterhaltung" LABEL_PRINT: "Drucken" LABEL_EXIT_FULLSCREEN: "Vollbildmodus verlassen" LABEL_CLOSE_MESSAGE: "Nachricht schlieĂźen (kein Vorschaubereich-Layout)" LABEL_SWITCH_TO_LIST: "Fokus auf Nachrichtenliste zurĂĽckschalten" LABEL_OPEN_COMPOSE_POPUP: "Erstellen-Popup öffnen" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Identitätsauswahl öffnen" LABEL_SAVE_MESSAGE: "Nachricht speichern" LABEL_SEND_MESSAGE: "Nachricht senden" LABEL_CLOSE_COMPOSE: "Popup schlieĂźen" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Keine öffentlichen SchlĂĽssel gefunden" NO_PUBLIC_KEYS_FOUND_FOR: "Keine öffentlichen SchlĂĽssel fĂĽr die E-Mail \"%EMAIL%\" gefunden" NO_PRIVATE_KEY_FOUND: "Keine privaten SchlĂĽssel gefunden" NO_PRIVATE_KEY_FOUND_FOR: "Keine privaten SchlĂĽssel fĂĽr die E-Mail \"%EMAIL%\" gefunden" ADD_A_PUBLICK_KEY: "Ă–ffentlicher SchlĂĽssel hinzufĂĽgen" SELECT_A_PRIVATE_KEY: "Privaten SchlĂĽssel auswählen" UNVERIFIRED_SIGNATURE: "Nich verifizierte Unterschrift" DECRYPTION_ERROR: "OpenPGP-EntschlĂĽsselungsfehler" GOOD_SIGNATURE: "GĂĽltige Unterschrift von %USER%" PGP_ERROR: "OpenPGP-Fehler: %ERROR%" SPECIFY_FROM_EMAIL: "Bitte die VON-E-Mail-Adresse angeben" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Bitte geben Sie mindestens einen Empfänger an" NOTIFICATIONS: INVALID_TOKEN: "UngĂĽltiger Token" AUTH_ERROR: "Authentifizierung fehlgeschlagen" ACCESS_ERROR: "Zugriffsfehler" CONNECTION_ERROR: "Serververbindung kann nicht hergestellt werden" CAPTCHA_ERROR: "Falsche CAPTCHA-Eingabe." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren Konteneinstellungen. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren Konteneinstellungen. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Diese Social-ID ist bisher mit keinem E-Mail-Konto verbunden. Melden Sie sich mit Ihren E-Mail-Anmeldedaten an und aktivieren Sie diese Funktion in Ihren Konteneinstellungen. DOMAIN_NOT_ALLOWED: "Diese Domain ist nicht zugelassen." ACCOUNT_NOT_ALLOWED: "Konto ist nicht zugelassen." ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Zwei-Faktor-Authentifizierung erforderlich" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Fehler bei Zwei-Faktor-Authentifizierung" COULD_NOT_SAVE_NEW_PASSWORD: "Neues Passwort konnte nicht gespeichert werden" CURRENT_PASSWORD_INCORRECT: "Aktuelles Passwort falsch" NEW_PASSWORD_SHORT: "Passwort ist zu kurz" NEW_PASSWORD_WEAK: "Passwort ist zu einfach" NEW_PASSWORD_FORBIDDENT: "Passwort enthält unzulässige Zeichen" CONTACTS_SYNC_ERROR: "Fehler bei Kontakte-Synchronisierung" CANT_GET_MESSAGE_LIST: "Die Nachrichtenliste ist nicht verfĂĽgbar" CANT_GET_MESSAGE: "Diese Nachricht ist nicht verfĂĽgbar" CANT_DELETE_MESSAGE: "Diese Nachricht kann nicht gelöscht werden" CANT_MOVE_MESSAGE: "Diese Nachricht kann nicht verschoben werden" CANT_SAVE_MESSAGE: "Diese Nachricht kann nicht gespeichert werden" CANT_SEND_MESSAGE: "Diese Nachricht kann nicht gesendet werden" INVALID_RECIPIENTS: "UngĂĽltige Empfängeradressen" CANT_SAVE_FILTERS: "Die Filter können nicht gespeichert werden" CANT_GET_FILTERS: "Die Filter sind nicht verfĂĽgbar" FILTERS_ARE_NOT_CORRECT: "Die Filter sind fehlerhaft" CANT_CREATE_FOLDER: "Dieser Ordner kann nicht angelegt werden" CANT_RENAME_FOLDER: "Dieser Ordner kann nicht umbenannt werden" CANT_DELETE_FOLDER: "Dieser Ordner kann nicht gelöscht werden" CANT_DELETE_NON_EMPTY_FOLDER: "Der Ordner kann nicht gelöscht werden; er ist nicht leer" CANT_SUBSCRIBE_FOLDER: "Dieser Ordner kann nicht abonniert werden" CANT_UNSUBSCRIBE_FOLDER: "Das Abonnement dieses Ordners kann nicht gelöscht werden" CANT_SAVE_SETTINGS: "Einstellungen können nicht gespeichert werden" CANT_SAVE_PLUGIN_SETTINGS: "Einstellungen können nicht gespeichert werden" DOMAIN_ALREADY_EXISTS: "Diese Domain existiert bereits" CANT_INSTALL_PACKAGE: "Paket konnte nicht installiert werden" CANT_DELETE_PACKAGE: "Paket konnte nicht entfernt werden" INVALID_PLUGIN_PACKAGE: "Plugin-Paket ist ungĂĽltig" UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-Paket wird nicht unterstĂĽtzt" LICENSING_SERVER_IS_UNAVAILABLE: "Der Subscription-Server kann nicht erreicht werden" LICENSING_DOMAIN_EXPIRED: "Die Subscription dieser Domain ist abgelaufen." LICENSING_DOMAIN_BANNED: "Die Subscription dieser Domain ist gesperrt." DEMO_SEND_MESSAGE_ERROR: "Dieses Demokonto darf aus SicherheitsgrĂĽnden keine Nachrichten an externe E-Mail-Adressen versenden!" DEMO_ACCOUNT_ERROR: "Aus SicherheitsgrĂĽnden ist dieses Konto nicht zu dieser Aktion berechtigt!" ACCOUNT_ALREADY_EXISTS: "Dieses Konto existiert bereits" ACCOUNT_DOES_NOT_EXIST: "Dieser Account existiert nicht." MAIL_SERVER_ERROR: "Beim Zugriff auf den E-Mail-Server trat ein Fehler auf." INVALID_INPUT_ARGUMENT: "UngĂĽltige Eingabe" UNKNOWN_ERROR: "Unbekannter Fehler" STATIC: BACK_LINK: "Aktualisieren" DOMAIN_LIST_DESC: "Liste der Domains, auf die zugegriffen werden darf" PHP_EXSTENSIONS_ERROR_DESC: "Notwendige PHP-Erweiterungen sind in Ihrer PHP-Konfiguration nicht vorhanden!" PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." NO_SCRIPT_DESC: | Ihr Browser unterstĂĽtzt JavaScript nicht. Aktivieren Sie bitte die JavaScript-UnterstĂĽtzung in Ihrem Browser und versuchen Sie es erneut. NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." NO_COOKIE_DESC: | Ihr Browser unterstĂĽtzt Cookies nicht. Aktivieren Sie bitte die Cookie-UnterstĂĽtzung in Ihrem Browser und versuchen Sie es erneut. BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." BAD_BROWSER_DESC: | Um alle Funktionen dieser Anwendung nutzen zu können, sollten Sie einen der folgenden Browser herunterladen und installieren rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/el_GR.yml000066400000000000000000000765371361462701300262110ustar00rootroot00000000000000el_GR: LOGIN: LABEL_EMAIL: "ΔιεύθυνĎη ηλεκτĎονικού ταχυδĎομείου" LABEL_LOGIN: "ΕίĎοδος" LABEL_PASSWORD: "Κωδικός Ď€ĎĎŚĎβαĎης" LABEL_SIGN_ME: "Μείνετε Ďυνδεδεμένοι" LABEL_VERIFICATION_CODE: "Κωδικός επαλήθευĎης" LABEL_DONT_ASK_VERIFICATION_CODE: "Να μην ζητηθεί κωδικός για 2 εβδομάδες" BUTTON_SIGN_IN: "ΣύνδεĎη" TITLE_SIGN_IN_GOOGLE: "ΣύνδεĎη με χĎήĎη του Google" TITLE_SIGN_IN_FACEBOOK: "ΣύνδεĎη με χĎήĎη του Facebook" TITLE_SIGN_IN_TWITTER: "ΣύνδεĎη με χĎήĎη του Twitter" LABEL_FORGOT_PASSWORD: "ΞέχαĎα τον κωδικό μου" LABEL_REGISTRATION: "ΕγγĎαφή" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "ΠĎÎżĎθήκη λογαĎιαĎμού" BUTTON_SETTINGS: "ΡυθμίĎεις" BUTTON_HELP: "Βοήθεια" BUTTON_LOGOUT: "Îξοδος" SEARCH: MAIN_INPUT_PLACEHOLDER: "ΑναζήτηĎη" TITLE_ADV: "ΠĎοχωĎημένη αναζήτηĎη" LABEL_ADV_FROM: "Από" LABEL_ADV_TO: "ΠĎος" LABEL_ADV_SUBJECT: "Îέμα" LABEL_ADV_TEXT: "Κείμενο" LABEL_ADV_HAS_ATTACHMENT: "Îχει Ďυνημμένο" LABEL_ADV_HAS_ATTACHMENTS: "Îχει Ďυνημμένα" LABEL_ADV_FLAGGED: "Με Ďημαία" LABEL_ADV_UNSEEN: "Δεν έχουν διαβαĎτεί" LABEL_ADV_DATE: "ΗμεĎομηνία" LABEL_ADV_DATE_ALL: "Όλα" LABEL_ADV_DATE_3_DAYS: "Îως 3 ημέĎες Ď€Ďίν" LABEL_ADV_DATE_7_DAYS: "Îως 1 εβδομάδα Ď€Ďιν" LABEL_ADV_DATE_MONTH: "Îως 1 μήνα Ď€Ďιν" LABEL_ADV_DATE_3_MONTHS: "Îως 3 μήνες Ď€Ďιν" LABEL_ADV_DATE_6_MONTHS: "Îως 6 μήνες Ď€Ďιν" LABEL_ADV_DATE_YEAR: "Îως 1 χĎόνο Ď€Ďιν" BUTTON_ADV_SEARCH: "ΑναζήτηĎη" PREVIEW_POPUP: FULLSCREEN: "Ενναλαγή πλήĎους οθόνης" ZOOM: "ΜεγέθυνĎη/ÎŁÎĽÎŻÎşĎυνĎη" CLOSE: "ΚλείĎιμο (Esc)" LOADING: "ΦοĎτώνει..." GALLERY_PREV: "ΠĎοηγούμενο (αĎÎąĎτεĎĎŚ βέλος)" GALLERY_NEXT: "Επόμενο (δεξί βέλος)" GALLERY_COUNTER: "%curr% από %total%" IMAGE_ERROR: "Η εικόνα δεν μπόĎεĎε να φοĎτωθεί." AJAX_ERROR: "Το πεĎιεχόμενο δεν μπόĎεĎε να φοĎτωθεί." FOLDER_LIST: BUTTON_COMPOSE: "Νέο μήνυμα" BUTTON_CONTACTS: "Επαφές" INBOX_NAME: "ΕιĎεĎχόμενα" SENT_NAME: "ΑπεĎταλμένα" DRAFTS_NAME: "ΠĎόχειĎα" SPAM_NAME: "Ανεπιθύμητα" TRASH_NAME: "ΆχĎηĎτα" ARCHIVE_NAME: "ΑĎχείο" QUOTA: TITLE: "ΧĎήĎη αποθηκευτικού χώĎου" MESSAGE_LIST: BUTTON_RELOAD: "ΦόĎτωĎε ξανά τη λίĎτα των μηνυμάτων" BUTTON_MOVE_TO: "ΜετακίνηĎε Ďε" BUTTON_DELETE: "ΔιαγĎαφή" BUTTON_ARCHIVE: "ΑĎχειοθέτηĎη" BUTTON_SPAM: "Ανεπιθύμητο" BUTTON_NOT_SPAM: "Όχι ανεπιθύμητο" BUTTON_EMPTY_FOLDER: "ΚαθάĎÎąĎε το φάκελο" BUTTON_MULTY_FORWARD: "ΠĎοώθηĎε Ďαν Ďυνημμένο(α)" BUTTON_DELETE_WITHOUT_MOVE: "ΔιέγĎαĎε μόνιμα" BUTTON_MORE: "ΠεĎÎąĎĎότεĎα" MENU_SET_SEEN: "Σήμανε Ďαν διαβαĎμένο" MENU_SET_ALL_SEEN: "ΣήμανĎη όλων Ďαν διαβαĎμένα" MENU_UNSET_SEEN: "ΣήμανĎη Ďαν μη διαβαĎμένο" MENU_SET_FLAG: "ΣήμανĎη" MENU_UNSET_FLAG: "ΔιαγĎαφή ĎήμανĎης" MENU_SELECT_ALL: "Όλα" MENU_SELECT_NONE: "Κανένα" MENU_SELECT_INVERT: "ΑντέĎĎ„ĎεĎε" MENU_SELECT_UNSEEN: "Μη διαβαĎμένο" MENU_SELECT_SEEN: "ΔιαβαĎμένο" MENU_SELECT_FLAGGED: "Σημαδεμένο" MENU_SELECT_UNFLAGGED: "Μη Ďημαδεμένο" EMPTY_LIST: "Άδεια λίĎτα." EMPTY_SEARCH_LIST: "Δεν υπάĎχουν μηνύματα που να ταιĎιάζουν Ďτην αναζήτηĎη." SEARCH_RESULT_FOR: "ΑποτελέĎματα αναζήτηĎης για \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "πίĎω Ďτη λίĎτα των μηνυμάτων" LIST_LOADING: "ΦοĎτώνει" EMPTY_SUBJECT_TEXT: "(Κανένα θέμα)" PUT_MESSAGE_HERE: "ÎŁĎŤĎετε εδώ το μήνυμα για να φανεί Ďτη λίĎτα" TODAY_AT: "ĎήμεĎα Ďτις %TIME%" YESTERDAY_AT: "εχθές Ďτις %TIME% " SEARCH_PLACEHOLDER: "ΑναζήτηĎη" NEW_MESSAGE_NOTIFICATION: "Îχετε %COUNT% νέα μηνύματα!" QUOTA_SIZE: "ΧĎηĎιμοποιούνται %SIZE% (%PROC%%) από %LIMIT%" MESSAGE: BUTTON_EDIT: "Σύνταξη" BUTTON_BACK: "ΠίĎω" BUTTON_CLOSE: "ΚλείĎιμο" BUTTON_DELETE: "ΔιαγĎαφή" BUTTON_ARCHIVE: "ΑĎχειοθέτηĎη" BUTTON_SPAM: "Ανεπιθύμητο" BUTTON_NOT_SPAM: "Όχι ανεπιθύμητο" BUTTON_MOVE_TO: "ΜετακίνηĎε Ďε" BUTTON_MORE: "ΠεĎÎąĎĎότεĎα" BUTTON_REPLY: "ΑπάντηĎη" BUTTON_REPLY_ALL: "ΑπάντηĎη Ďε όλους" BUTTON_FORWARD: "ΠĎοώθηĎη" BUTTON_FORWARD_AS_ATTACHMENT: "ΠĎοώθηĎη ως Ďυνημμένο" BUTTON_EDIT_AS_NEW: "Σύνταξη Ďαν νέο" BUTTON_SHOW_IMAGES: "ΕμφάνιĎη εξωτεĎικών εικόνων" BUTTON_NOTIFY_READ_RECEIPT: "Îź αποĎτολέας ζήτηĎε να ειδοποιηθεί όταν διαβάĎετε αυτό το μήνυμα." BUTTON_IN_NEW_WINDOW: "Άνοιγμα Ďε ξεχωĎÎąĎτό παĎάθυĎÎż" BUTTON_THREAD_LIST: "ΛίĎτα νημάτων" BUTTON_THREAD_PREV: "ΠĎοηγούμενο" BUTTON_THREAD_NEXT: "Επόμενο" BUTTON_THREAD_MORE: "ΠεĎÎąĎĎότεĎα μηνύματα" MENU_HEADERS: "ΕμφάνιĎη των επικεφαλίδων του μηνύματος" MENU_VIEW_ORIGINAL: "ΕμφάνιĎη πηγαίου μηνύματος" MENU_DOWNLOAD_ORIGINAL: "ΜεταφόĎτωĎη Ďαν αĎχείο .eml" MENU_FILTER_SIMILAR: "ΦιλτĎάĎÎąĎμα μηνυμάτων όπως αυτό" MENU_PRINT: "ΕκτύπωĎη" EMPTY_SUBJECT_TEXT: "(Κανένα θέμα)" LABEL_SUBJECT: "Îέμα" LABEL_DATE: "ΗμεĎομηνία" LABEL_FROM: "Από" LABEL_FROM_SHORT: "από" LABEL_TO: "ΠĎος" LABEL_TO_SHORT: "Ď€Ďος" LABEL_CC: "ΚοινοποίηĎη" LABEL_BCC: "Τυφλή κοινοποίηĎη" LABEL_REPLY_TO: "ΑπάντηĎη Ďτον" PRINT_LABEL_FROM: "Από" PRINT_LABEL_TO: "ΠĎος" PRINT_LABEL_CC: "ΚοινοποίηĎη" PRINT_LABEL_BCC: "Τυφλή κοινοποίηĎη" PRINT_LABEL_REPLY_TO: "ΑπάντηĎη Ďτον" PRINT_LABEL_DATE: "ΗμεĎομηνία" PRINT_LABEL_SUBJECT: "Îέμα" PRINT_LABEL_ATTACHMENTS: "Συνημμένα" MESSAGE_LOADING: "ΦοĎτώνει" MESSAGE_VIEW_DESC: "Επιλέξτε ένα μήνυμα από τη λίĎτα για να εμφανιĎτεί εδώ." PGP_PASSWORD_INPUT_PLACEHOLDER: "Κωδικός" PGP_SIGNED_MESSAGE_DESC: "Μήνυμα υπογεγĎαμμένο με OpenPGP (κάντε κλικ για έλεγχο)" PGP_ENCRYPTED_MESSAGE_DESC: "Μήνυμα κωδικοποιημένο με OpenPGP (κάντε κλίκ για αποκωδικοποίηĎη)" LINK_DOWNLOAD_AS_ZIP: "ΜεταφόĎτωĎη Ďαν zip" LINK_SAVE_TO_OWNCLOUD: "ΑποθήκευĎη Ďτο ownCloud" LINK_SAVE_TO_DROPBOX: "ΑποθήκευĎη Ďτο Dropbox" READ_RECEIPT: SUBJECT: "Αποδεικτικό ΑνάγνωĎης (παĎουĎιάĎτηκε) - %SUBJECT%" BODY: | Αυτή είναι ένα αποδεικτικό ανάγωĎης από το μήνυμα που Ďτείλατε Ď€Ďος %READ-RECEIPT%. ΠαĎατήĎηĎη: "Αυτή το αποδεικτικό ανάγνωĎης είναι απλώς μια ένδειξη ότι το μήνυμα παĎουĎιάĎτηκε Ďτον υπολογιĎτή του παĎαλήπτη." Δεν υπάĎχει καμία εγγύηĎη πως Îż παĎαλήπτης διάβαĎε ή κατανόηĎε το πεĎιεχόμενο του μηνύματος. SUGGESTIONS: SEARCHING_DESC: "ΑναζήτηĎη..." CONTACTS: LEGEND_CONTACTS: "Επαφές" SEARCH_INPUT_PLACEHOLDER: "ΑναζήτηĎη" BUTTON_ADD_CONTACT: "ΠĎÎżĎθήκη επαφής" BUTTON_CREATE_CONTACT: "ΔημιουĎγία" BUTTON_UPDATE_CONTACT: "ΕνημέĎωĎη" BUTTON_IMPORT: "ΕιĎαγωγή (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Εξαγωγή (csv, vcf, vCard)" BUTTON_EXPORT_CSV: "Εξαγωγή (csv)" ERROR_IMPORT_FILE: "Λάθος ειĎαγωγής (άκυĎη ÎĽÎżĎφοποίηĎη αĎχείου)" LIST_LOADING: "ΦοĎτώνει" EMPTY_LIST: "Δεν υπάĎχουν επαφές εδώ" EMPTY_SEARCH: "Δεν βĎέθηκαν επαφές" CLEAR_SEARCH: "ΚαθαĎÎąĎÎĽĎŚĎ‚ αναζήτηĎης" CONTACT_VIEW_DESC: "Επιλέξτε μια επαφή από τη λίĎτα για να εμφανιĎτεί εδώ." LABEL_DISPLAY_NAME: "ΕμφάνιĎη ονόματος" LABEL_EMAIL: "ΗλεκτĎονική αλληλογĎαφία" LABEL_PHONE: "Τηλέφωνο" LABEL_WEB: "ΙĎτός" LABEL_BIRTHDAY: "Γενέθλια" LINK_ADD_EMAIL: "ΠĎÎżĎθήκη ηλεκτĎονικής διεύθυνĎης αλληλογĎαφίας" LINK_ADD_PHONE: "ΠĎÎżĎθήκη τηλεφώνου" LINK_BIRTHDAY: "Γενέθλια" PLACEHOLDER_ENTER_DISPLAY_NAME: "ΕιĎαγωγή ονόματος εμφάνιĎης" PLACEHOLDER_ENTER_LAST_NAME: "ΕιĎαγωγή επωνύμου" PLACEHOLDER_ENTER_FIRST_NAME: "ΕιĎαγωγή ονόματος" PLACEHOLDER_ENTER_NICK_NAME: "ΕιĎαγωγή Ď€ĎĎŚĎθετου ονόματος" LABEL_READ_ONLY: "Μόνο για ανάγνωĎη" LABEL_SHARE: "ΔιαμοιĎαĎÎĽĎŚĎ‚ " ADD_MENU_LABEL: "ΠĎÎżĎθήκη" ADD_MENU_NICKNAME: "ΠĎĎŚĎθετο όνομα" ADD_MENU_NOTES: "ΣημειώĎεις" ADD_MENU_EMAIL: "ΗλεκτĎονική αλληλογĎαφία" ADD_MENU_PHONE: "Τηλέφωνο" ADD_MENU_URL: "ΤοποθεĎία ÎąĎτού" ADD_MENU_ADDRESS: "ΔιεύθυνĎη" ADD_MENU_BIRTHDAY: "Γενέθλια" ADD_MENU_TAGS: "Ετικέτες" BUTTON_SHARE_NONE: "Κανένα" BUTTON_SHARE_ALL: "Όλοι" BUTTON_SYNC: "ΣυγχĎονιĎÎĽĎŚĎ‚ (CardDAV)" COMPOSE: TITLE_FROM: "Από" TITLE_TO: "ΠĎος" TITLE_CC: "ΚοινοποίηĎη" TITLE_BCC: "Τυφλή κοινοποίηĎη" TITLE_REPLY_TO: "ΑπάντηĎη Ďτον" TITLE_SUBJECT: "Îέμα" LINK_SHOW_INPUTS: "ΕμφάνιĎε όλα τα πεδία" BUTTON_SEND: "ΑποĎτολή" BUTTON_SAVE: "ΑποθήκευĎη" BUTTON_DELETE: "ΔιαγĎαφή" BUTTON_CANCEL: "ΑκύĎωĎη" BUTTON_MINIMIZE: "ΕλαχιĎτοποίηĎη" SAVED_TIME: "Αποθηκεύτηκε Ďτις %TIME%" SAVED_ERROR_ON_SEND: "Το μήνυμα απεĎτάλη αλλά δεν αποθηκεύτηκε Ďτο φάκελο απεĎταλμένων " DISCARD_UNSAVED_DATA: "Να αποĎĎιφθούν τα μη αποθηκευμένα δεδομένα;" ATTACH_FILES: "ΕπιĎύναĎη αĎχείων" ATTACH_DROP_FILES_DESC: "ÎŁĎŤĎετε εδώ αĎχεία" ATTACH_ITEM_CANCEL: "ΑκύĎωĎη" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% έγĎαĎε" FORWARD_MESSAGE_TOP_TITLE: "-------- ΠĎοωθημένο μήνυμα -------" FORWARD_MESSAGE_TOP_FROM: "Από" FORWARD_MESSAGE_TOP_TO: "ΠĎος" FORWARD_MESSAGE_TOP_CC: "ΚοινοποίηĎη" FORWARD_MESSAGE_TOP_SENT: "ΑπεĎταλμένα" FORWARD_MESSAGE_TOP_SUBJECT: "Îέμα" EMPTY_TO_ERROR_DESC: "ΠαĎακαλώ ÎżĎÎŻĎτε τουλάχιĎτον ένα παĎαλήπτη" NO_ATTACHMENTS_HERE_DESC: "Δεν υπάĎχουν Ďυνημμένα εδώ." ATTACHMENTS_ERROR_DESC: "ΠĎοειδοποίηĎη! Δεν έχουν μεταφοĎτωθεί όλα τα Ďυνημμένα." ATTACHMENTS_UPLOAD_ERROR_DESC: "Δεν έχουν μεταφοĎτωθεί ακόμη όλα τα Ďυνημμένα." BUTTON_REQUEST_READ_RECEIPT: "ΖητήĎτε αποδεικτικό ανάγνωĎης" BUTTON_MARK_AS_IMPORTANT: "ΣημειώĎτε το Ďαν Ďημαντικό" BUTTON_OPEN_PGP: "OpenPGP (Απλό κείμενο μόνο)" BUTTON_REQUEST_DSN: "ΖητήĎτε αποδεικτικό παĎάδοĎης" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "ΚλείĎιμο" POPUPS_ASK: BUTTON_YES: "Ναι" BUTTON_NO: "Όχι" DESC_WANT_CLOSE_THIS_WINDOW: "ΕίĎτε ĎίγουĎοι πως θέλετε να κλείĎετε αυτό το παĎάθυĎÎż;" DESC_WANT_DELETE_MESSAGES: "ΕίĎτε ĎίγουĎοι πως θέλετε να διαγĎάĎετε το (τα) μήνυμα(τα);" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Επιλέξτε τη γλώĎĎα Ďας" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "ΠĎÎżĎθήκη λογαĎιαĎμού;" BUTTON_ADD_ACCOUNT: "ΠĎÎżĎθήκη" TITLE_UPDATE_ACCOUNT: "ΕνημέĎωĎη λογαĎιαĎμού;" BUTTON_UPDATE_ACCOUNT: "ΕνημέĎωĎη" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "ΠĎÎżĎθήκη ταυτότητας;" TITLE_UPDATE_IDENTITY: "ΕνημέĎωĎη ταυτότητας;" BUTTON_ADD_IDENTITY: "ΠĎÎżĎθήκη" BUTTON_UPDATE_IDENTITY: "ΕνημέĎωĎη" LABEL_EMAIL: "ΗλεκτĎονική αλληλογĎαφία" LABEL_NAME: "Όνομα" LABEL_REPLY_TO: "ΑπάντηĎη Ďτον" LABEL_SIGNATURE: "ΥπογĎαφή" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "ΠĎÎżĎθήκη της υπογĎαφής Ď€Ďιν το Ď€Ďοτότυπο κείμενο Ďτις απαντήĎεις" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "ΔημιουĎγία φακέλου;" LABEL_NAME: "Όνομα φακέλου" LABEL_PARENT: "Φάκελος γονέας" BUTTON_CREATE: "ΔημιουĎγία" BUTTON_CANCEL: "ΑκύĎωĎη" BUTTON_CLOSE: "ΚλείĎιμο" TITLE_CREATING_PROCESS: "ΔημιουĎγία φακέλου" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "ΔιαγĎαφή όλων των μηνυμάτων Ďτο φάκελο;" BUTTON_CLEAR: "ΚαθαĎÎąĎÎĽĎŚĎ‚" BUTTON_CANCEL: "ΑκύĎωĎη" BUTTON_CLOSE: "ΚλείĎιμο" DANGER_DESC_WARNING: "ΠĎοειδοποίηĎη!" DANGER_DESC_HTML_1: "Το αποτέλεĎμα της ενέĎγειας θα είναι η πλήĎης μετακίνηĎη των μηνυμάτων από το φάκελο %FOLDER%." DANGER_DESC_HTML_2: "Αφού ξεκινήĎει, η διαδικαĎία δεν Ďταματά ή ακυĎώνεται." TITLE_CLEARING_PROCESS: "ΔιαγĎαφή όλων των μηνυμάτων Ďτο φάκελο..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "ΕιĎαγωγή κλειδιού OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "ΕιĎαγωγή" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "ΠĎοβολή κλειδιού OpenPGP" BUTTON_SELECT: "Επιλογή" BUTTON_CLOSE: "ΚλείĎιμο" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "ΔημιουĎγία κλειδιών OpenPGP" LABEL_EMAIL: "ΔιεύθυνĎη ηλεκτĎονικής αλληλογĎαφίας" LABEL_NAME: "Όνομα" LABEL_PASSWORD: "Κωδικός" LABEL_KEY_BIT_LENGTH: "Μήκος κλειδιού" BUTTON_GENERATE_OPEN_PGP_KEYS: "ΔημιουĎγία" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP ΥπογĎαφή/ΚĎĎ…Ď€ĎογĎάφηĎη" LABEL_SIGN: "ΥπογĎαφή" LABEL_ENCRYPT: "ΚĎυπτογĎάφηĎη" LABEL_PASSWORD: "Κωδικός" BUTTON_SIGN: "ΥπογĎαφή" BUTTON_ENCRYPT: "ΚĎυπτογĎάφηĎη" BUTTON_SIGN_AND_ENCRYPT: "ΥπογĎαφή και ÎşĎυπτογĎάφηĎη" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "ΑποκĎυπτογĎάφηĎη OpenPGP" LABEL_KEY: "ΠĎÎżĎωπικό κλειδί" LABEL_PASSWORD: "Κωδικός" BUTTON_DECRYPT: "ΑποκĎυπτογĎάφηĎη" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "ΤεĎĎ„ ελέγχου 2 βημάτων" LABEL_CODE: "Κώδικας" BUTTON_TEST: "ΤεĎĎ„" POPUPS_FILTER: TITLE_CREATE_FILTER: "ΔημιουĎγία φίλτĎου;" TITLE_EDIT_FILTER: "ΕνημέĎωĎη φίλτĎου;" FILTER_NAME: "Όνομα" LEGEND_CONDITIONS: "Συνθήκες" LEGEND_ACTIONS: "ΕνέĎγειες" BUTTON_DONE: "Îγινε" BUTTON_ADD_CONDITION: "ΠĎÎżĎθήκη Ďυνθήκης" SELECT_ACTION_NONE: "Κανένα" SELECT_ACTION_MOVE_TO: "ΜετακίνηĎη Ďε" SELECT_ACTION_FORWARD_TO: "ΠĎοώθηĎη Ďε" SELECT_ACTION_REJECT: "ΑπόĎĎÎąĎη" SELECT_ACTION_VACATION_MESSAGE: "Μήνυμα διακοπών" SELECT_ACTION_DISCARD: "ΑπόĎĎÎąĎη" SELECT_FIELD_FROM: "Από" SELECT_FIELD_RECIPIENTS: "ΠαĎαλήπτες (ΠĎος ή κοινοποίηĎη)" SELECT_FIELD_SUBJECT: "Îέμα" SELECT_FIELD_HEADER: "Επικεφαλίδα" SELECT_FIELD_SIZE: "Μέγεθος" SELECT_TYPE_CONTAINS: "ΠεĎιέχει" SELECT_TYPE_NOT_CONTAINS: "Δεν πεĎιέχει" SELECT_TYPE_MATCHES: "ΤαιĎιάζει (* και ? υποĎτηĎίζονται)" SELECT_TYPE_NOT_MATCHES: "Δεν ταιĎιάζει (* και ? υποĎτηĎίζονται)" SELECT_TYPE_REGEXP: "Κανονική έκφĎαĎη" SELECT_TYPE_NOT_REGEXP: "Μη κανονική έκφĎαĎη" SELECT_TYPE_EQUAL_TO: "ΊĎÎż με" SELECT_TYPE_NOT_EQUAL_TO: "Δεν είναι ÎŻĎÎż με" SELECT_TYPE_OVER: "Πάνω" SELECT_TYPE_UNDER: "Κάτω" SELECT_MATCH_ANY: "ΤαιĎιάζει ΜΕ ΟΠΟΙΟΝΔΗΠΟΤΕ από τους επόμενους κανόνες" SELECT_MATCH_ALL: "ΤαιĎιάζει ΜΕ ΟΛΟΥΣ τους επόμενους κανόνες" MARK_AS_READ_LABEL: "Σήμανε Ďαν διαβαĎμένο" REPLY_INTERVAL_LABEL: "ΜεĎοδιάĎτημα απαντήĎεων (Ďε ημέĎες)" KEEP_LABEL: "ΚĎάτηĎε" STOP_LABEL: "Μην Ďταματάς να επεξεĎγάζεĎαι κανόνες" EMAIL_LABEL: "ΗλεκτĎονική αλληλογĎαφία" VACATION_SUBJECT_LABEL: "Îέμα (Ď€ĎοαιĎετικό)" VACATION_MESSAGE_LABEL: "Μήνυμα" VACATION_RECIPIENTS_LABEL: "ΠαĎαλήπτες (χωĎÎąĎμένοι με κόμμα)" REJECT_MESSAGE_LABEL: "ΑπόĎĎÎąĎη μηνύματος" ALL_INCOMING_MESSAGES_DESC: "Όλα τα ειĎεĎχόμενα μηνύματα" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Επιλογή φακέλων ĎĎ…Ďτήματος" SELECT_CHOOSE_ONE: "Επέλεξε ένα" SELECT_UNUSE_NAME: "Μην χĎηĎιμοποιείς" LABEL_SENT: "ΑπεĎταλμένα" LABEL_DRAFTS: "ΠĎόχειĎα" LABEL_SPAM: "Ανεπιθύμητα" LABEL_TRASH: "ΆχĎηĎτα" LABEL_ARCHIVE: "ΑĎχείο" BUTTON_CANCEL: "ΑκύĎωĎη" BUTTON_CLOSE: "ΚλείĎιμο" NOTIFICATION_SENT: | Δεν έχετε επιλέξει το φάκελο ĎĎ…Ďτήματος "ΑπεĎταλμένα" όπου θα τοποθετούνται τα μηνύματα μετά την αποĎτολή. Αν δεν θέλετε να ĎĎŽĎετε τα απεĎταλμένα μηνύματα, παĎακαλώ επιλέξτε "Μην το χĎηĎιμοποιείς". NOTIFICATION_DRAFTS: "Δεν έχετε επιλέξει το φάκελο ĎĎ…Ďτήματος \"ΠĎόχειĎα\" όπου θα Ďώζονται τα μηνύματα κατά τη ĎύνθεĎή τους." NOTIFICATION_SPAM: | Δεν έχετε επιλέξει το φάκελο ĎĎ…Ďτήματος "Ανεπιθύμητα" όπου θα τοποθετούνται τα ανεπιθύμητα μηνύματα. Αν θέλετε να αποĎĎίπτονται τα μηνύματα ÎżĎÎąĎτικά, παĎακαλώ επιλέξτε "Μην τον χĎηĎιμοποιείς". NOTIFICATION_TRASH: | Δεν έχετε επιλέξει τα φάκελο ĎĎ…Ďτήματος "ΑποĎĎίμματα" όπου θα τοποθετούνται τα διαγĎαμμένα μηνύματα. Αν επιθυμείτε να αποĎĎίπτονται τα μηνύματα ÎżĎÎąĎτικά, παĎακαλώ επιλέξτε "Μην το χĎηĎιμοποιείς". NOTIFICATION_ARCHIVE: "Δεν έχετε επιλέξει το φάκελο ĎĎ…Ďτήματος \"ΑĎχείο\" όπου θα τοποθετούνται τα αĎχειοθετημένα μηνύματα." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "ΕπαλήθευĎη 2 επιπέδων (TOTP)" LABEL_ENABLE_TWO_FACTOR: "ΕνεĎγοποίηĎη επαλήθευĎης 2 επιπέδων" LABEL_TWO_FACTOR_USER: "ΧĎήĎτης" LABEL_TWO_FACTOR_STATUS: "ΚατάĎταĎη" LABEL_TWO_FACTOR_SECRET: "ΜυĎτικό" LABEL_TWO_FACTOR_BACKUP_CODES: "ΕφεδĎικοί κωδικοί" BUTTON_CREATE: "ΔημιουĎγία ÎĽĎ…Ďτικού" BUTTON_ACTIVATE: "ΕνεĎγοποίηĎη" BUTTON_CLEAR: "ΚαθαĎÎąĎÎĽĎŚĎ‚" BUTTON_LOGOUT: "Îξοδος" BUTTON_DONE: "Îγινε" BUTTON_TEST: "ΤεĎĎ„" LINK_TEST: "τέĎĎ„" BUTTON_SHOW_SECRET: "Δείξε το ÎĽĎ…Ďτικό" BUTTON_HIDE_SECRET: "ΚĎĎŤĎε το ÎĽĎ…Ďτικό" TWO_FACTOR_REQUIRE_DESC: "Îź λογαĎιαĎÎĽĎŚĎ‚ Ďας απαιτεί να διαμοĎφώĎετε την επαλήθευĎη 2 επιπέδων" TWO_FACTOR_SECRET_CONFIGURED_DESC: "ΔιαμοĎφωμένος" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Μη διαμοĎφωμένος" TWO_FACTOR_SECRET_DESC: > ΕιĎάγετε την πληĎοφοĎία Ďτον πελάτη Google Authenticator (ή οποιοδήποτε άλλο πελάτη TOTP) χĎηĎιμοποιώντας τον κωδικό QR που φαίνεται παĎακάτω ή πληκτĎολογήĎτε τον κωδικό χειĎοκίνητα. TWO_FACTOR_BACKUP_CODES_DESC: > Αν δεν μποĎείτε να παĎαλάβετε κωδικούς μέĎω του Google Authenticator (ή οποιουδήποτε άλλου πελάτη TOTP), μποĎείτε να χĎηĎιμοποιήĎετε εφεδĎικούς κωδικούς για την είĎοδό Ďας. Μετά τη χĎήĎη ενός εφεδĎικού κωδικού για είĎοδο, αυτός γίνεται ανενεĎγός. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Δεν μποĎείτε να αλλάξετε αυτή τη ĎύθμιĎη Ď€Ďιν τον έλεγχο." TITLES: LOADING: "ΦοĎτώνει" LOGIN: "ΕίĎοδος" MAILBOX: "ΓĎαμματοθυĎίδα" SETTINGS: "ΡυθμίĎεις" COMPOSE: "Νέο μήνυμα" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Το αĎχείο είναι πολύ μεγάλο" ERROR_FILE_PARTIALLY_UPLOADED: "Το αĎχείο μεταφοĎτώθηκε μεĎικώς λόγω αγνώĎτου Ďφάλματος" ERROR_NO_FILE_UPLOADED: "Δεν μεταφοĎτώθηκε αĎχείο" ERROR_MISSING_TEMP_FOLDER: "Το Ď€ĎÎżĎωĎινό αĎχείο δεν υπάĎχει" ERROR_ON_SAVING_FILE: "ΥπήĎξε άγνωĎτο λάθος κατα τη διαδικαĎία μεταφόĎτωĎης του αĎχείου" ERROR_FILE_TYPE: "ΆκυĎος τύπος αĎχείου" ERROR_UNKNOWN: "ΥπήĎξε άγνωĎτο λάθος κατα τη διαδικαĎία μεταφόĎτωĎης του αĎχείου" EDITOR: TEXT_SWITCHER_RICH_FORMATTING: "ΠλούĎια ÎĽÎżĎφοποίηĎη" TEXT_SWITCHER_CONFIRM: "Η ÎĽÎżĎφοποίηĎη του κειμένου και οι εικόνες θα χαθούν. ΕίĎτε ĎίγουĎοι πως θέλετε να ĎυνεχίĎετε;" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "ΠĎÎżĎωπικό" LABEL_GENERAL_NAME: "Γενικό" LABEL_CONTACTS_NAME: "Επαφές" LABEL_FOLDERS_NAME: "Φάκελοι" LABEL_ACCOUNTS_NAME: "ΛογαĎÎąĎμοί" LABEL_IDENTITY_NAME: "Ταυτότητα" LABEL_IDENTITIES_NAME: "Ταυτότητες" LABEL_FILTERS_NAME: "ΦίλτĎα" LABEL_TEMPLATES_NAME: "ΠĎότυπα" LABEL_SECURITY_NAME: "ΑĎφάλεια" LABEL_SOCIAL_NAME: "Κοινωνικά" LABEL_THEMES_NAME: "Îέματα" LABEL_CHANGE_PASSWORD_NAME: "Κωδικός" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "ΠίĎω" SETTINGS_FILTERS: LEGEND_FILTERS: "ΦίλτĎα" BUTTON_SAVE: "ΑποθήκευĎη" BUTTON_ADD_FILTER: "ΠĎÎżĎθήκη φίλτĎου" BUTTON_DELETE: "ΔιαγĎαφή" BUTTON_RAW_SCRIPT: "ΧĎηĎιμοποίηĎε ένα Ď€ĎÎżĎαĎÎĽÎżĎμένο ĎενάĎιο χĎήĎτη" SUBNAME_NONE: "Κανένα" SUBNAME_MOVE_TO: "ΜετακίνηĎη Ďτο \"%FOLDER%\"" SUBNAME_FORWARD_TO: "ΠĎοώθηĎη Ďτο \"%EMAIL%\"" SUBNAME_REJECT: "ΑπόĎĎÎąĎη" SUBNAME_VACATION_MESSAGE: "Μήνυμα διακοπών" SUBNAME_DISCARD: "ΑπόĎĎÎąĎη" CAPABILITY_LABEL: "Ικανότητα" LOADING_PROCESS: "ΕνημέĎωĎη λίĎτας φίλτĎων" DELETING_ASK: "ΕίĎτε ĎίγουĎοι;" CHACHES_NEED_TO_BE_SAVED_DESC: "Αυτές οι αλλαγές Ď€Ďέπει να αποθηκευτούν Ďτον εξυπηĎετητή." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Ταυτότητα" LABEL_DISPLAY_NAME: "Όνομα" LABEL_REPLY_TO: "ΑπάντηĎη Ďτον" LABEL_SIGNATURE: "ΥπογĎαφή" LABEL_ADD_SIGNATURE_TO_ALL: "ΠĎÎżĎθήκη της υπογĎαφής Ďας Ďε όλα τα εξεĎχόμενα μηνύματα" SETTINGS_SECURITY: LEGEND_SECURITY: "ΑĎφάλεια" LABEL_CONFIGURE_TWO_FACTOR: "ΔιαμόĎφωĎη της επαλήθευĎης 2 επιπέδων" LABEL_AUTOLOGOUT: "Αυτόματη αποĎύνδεĎη" AUTOLOGIN_NEVER_OPTION_NAME: "Ποτέ" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% λεπτό(α)" SETTINGS_GENERAL: LEGEND_GENERAL: "Γενικό" LABEL_LANGUAGE: "ΓλώĎĎα" LABEL_IDENTITY: "Ταυτότητα" LABEL_LAYOUT: "Σχέδιο" LABEL_LAYOUT_NO_SPLIT: "ΧωĎÎŻĎ‚ χώĎÎąĎμα" LABEL_LAYOUT_VERTICAL_SPLIT: "Κάθετο χώĎÎąĎμα" LABEL_LAYOUT_HORIZONTAL_SPLIT: "ÎźĎιζόντιο χώĎÎąĎμα" LABEL_EDITOR: "ΠĎοεπιλεγμένος Ďυντάκτης κειμένου" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Απλό" LABEL_EDITOR_HTML_FORCED: "Html (επιβολή)" LABEL_EDITOR_PLAIN_FORCED: "Απλό (επιβολή)" LABEL_ANIMATION: "ΕμĎύχωĎη διεπαφής" LABEL_ANIMATION_FULL: "Γεμάτο" LABEL_ANIMATION_NORMAL: "ΦυĎιολογικό" LABEL_ANIMATION_NONE: "Κανένα" LABEL_VIEW_OPTIONS: "Επιλογές Ď€Ďοβολής" LABEL_USE_PREVIEW_PANE: "ΧĎήĎη Ď€ĎοεπιĎκόπηĎης " LABEL_USE_CHECKBOXES_IN_LIST: "ΕμφάνιĎη των κουτιών επιλογής Ďε λίĎτα" LABEL_USE_THREADS: "ΧĎήĎη νημάτων" LABEL_REPLY_SAME_FOLDER: "ΤοποθέτηĎη απαντήĎεων Ďτο φάκελο που ανήκει το μήνυμα που απαντάται" LABEL_SHOW_IMAGES: "Να εμφανίζονται πάντα οι εξωτεĎικές εικόνες Ďτο Ďώμα του μηνύματος" LABEL_SHOW_ANIMATION: "Επίδειξη εμĎύχωĎης" LABEL_MESSAGE_PER_PAGE: "Μηνύματα Ďτη Ďελίδα" LABEL_NOTIFICATIONS: "ΕπιĎημάνĎεις" LABEL_SOUND_NOTIFICATION: "Ηχητική επιĎήμανĎη" LABEL_CHROME_NOTIFICATION_DESC: "Να εμφανίζονται τα νέα μηνύματα Ďε αναδυόμενες επιĎημάνĎεις" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ΑποκλείĎτηκε από το φυλλομετĎητή)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Επαφές" LABEL_CONTACTS_AUTOSAVE: "Αυτόματη Ď€ĎÎżĎθήκη επαφών Ďτον κατάλογο διευθύνĎεων" LEGEND_CONTACTS_SYNC: "ΑπομακĎĎ…Ďμένος ĎυγχĎονιĎÎĽĎŚĎ‚ (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "ΕνεĎγοποίηĎη απομακĎĎ…Ďμένου ĎυγχĎονιĎμού" LABEL_CONTACTS_SYNC_SERVER: "ΕξυπηĎετητής" LABEL_CONTACTS_SYNC_AB_URL: "URL του καταλόγου διεθύνĎεων" LABEL_CONTACTS_SYNC_USER: "ΧĎήĎτης" LABEL_CONTACTS_SYNC_PASSWORD: "Κωδικός" SETTINGS_THEMES: LEGEND_THEMES: "Îέματα" LEGEND_THEMES_CUSTOM: "ΔιαμόĎφωĎη Ď€ĎÎżĎαĎÎĽÎżĎμένου θέματος" LABEL_CUSTOM_TYPE: "Τύπος" LABEL_CUSTOM_TYPE_LIGHT: "ΑνοικτόχĎωμο" LABEL_CUSTOM_TYPE_DARK: "ΣκουĎόχĎωμο" LABEL_CUSTOM_BACKGROUND_IMAGE: "ΥπόβαθĎÎż" BUTTON_UPLOAD_BACKGROUND_IMAGE: "ΜεταφόĎτωĎη εικόνας υποβάθĎου (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Το αĎχείο είναι πολύ μεγάλο" ERROR_FILE_TYPE_ERROR: "ΆκυĎος τύπος αĎχείου (μόνο JPG και PNG)" ERROR_UNKNOWN: "ΥπήĎξε άγνωĎτο λάθος κατα τη διαδικαĎία μεταφόĎτωĎης του αĎχείου" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "ΣύνδεĎη του Google" BUTTON_GOOGLE_DISCONNECT: "ΑποĎύνδεĎη του Google" SETTINGS_FOLDERS: BUTTON_DELETE: "ΔιαγĎαφή" CREATING_PROCESS: "ΔημιουĎγία φακέλου" DELETING_ASK: "ΕίĎτε ĎίγουĎοι;" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "ΛογαĎÎąĎμοί" LEGEND_IDENTITIES: "Ταυτότητες" BUTTON_DELETE: "ΔιαγĎαφή" DELETING_ASK: "ΕίĎτε ĎίγουĎοι;" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Ταυτότητα" LABEL_DISPLAY_NAME: "Όνομα" LABEL_REPLY_TO: "ΑπάντηĎη Ďτον" LABEL_SIGNATURE: "ΥπογĎαφή" LABEL_ADD_SIGNATURE_TO_ALL: "ΠĎÎżĎθήκη της υπογĎαφής Ďας Ďε όλα τα εξεĎχόμενα μηνύματα" BUTTON_DELETE: "ΔιαγĎαφή" DELETING_ASK: "ΕίĎτε ĎίγουĎοι;" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" DELETING_ASK: "ΕίĎτε ĎίγουĎοι;" SHORTCUTS_HELP: TAB_COMPOSE: "Νέο μήνυμα" LABEL_REPLY: "ΑπάντηĎη" LABEL_REPLY_ALL: "ΑπάντηĎη Ďε όλους" LABEL_FORWARD: "ΠĎοώθηĎη" LABEL_FORWARD_MULTIPLY: "ΠĎοώθηĎε Ďαν Ďυνημμένο(α)" LABEL_HELP: "Βοήθεια" LABEL_ARCHIVE: "ΑĎχείο" LABEL_DELETE: "ΔιέγĎαĎε" LABEL_SEARCH: "ΑναζήτηĎη" LABEL_PRINT: "ΕκτύπωĎη" PGP_NOTIFICATIONS: SPECIFY_AT_LEAST_ONE_RECIPIENT: "ΠαĎακαλώ ÎżĎÎŻĎτε τουλάχιĎτον ένα παĎαλήπτη" rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/en_GB.yml000066400000000000000000000726211361462701300261610ustar00rootroot00000000000000en_GB: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Login" LABEL_PASSWORD: "Password" LABEL_SIGN_ME: "Remember Me" LABEL_VERIFICATION_CODE: "Verification Code" LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" BUTTON_SIGN_IN: "Sign In" TITLE_SIGN_IN_GOOGLE: "Sign In using Google" TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" LABEL_FORGOT_PASSWORD: "Forgot password" LABEL_REGISTRATION: "Registration" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Add Account" BUTTON_SETTINGS: "Settings" BUTTON_HELP: "Help" BUTTON_LOGOUT: "Logout" MOBILE: BUTTON_MOBILE_VERSION: "Mobile version" BUTTON_DESKTOP_VERSION: "Desktop version" SEARCH: MAIN_INPUT_PLACEHOLDER: "Search" TITLE_ADV: "Advanced Search" LABEL_ADV_FROM: "From" LABEL_ADV_TO: "To" LABEL_ADV_SUBJECT: "Subject" LABEL_ADV_TEXT: "Text" LABEL_ADV_HAS_ATTACHMENT: "Has attachment" LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" LABEL_ADV_FLAGGED: "Flagged" LABEL_ADV_UNSEEN: "Unseen" LABEL_ADV_DATE: "Date" LABEL_ADV_DATE_ALL: "All" LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" LABEL_ADV_DATE_MONTH: "Up to 1 month old" LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" LABEL_ADV_DATE_YEAR: "Up to 1 year old" BUTTON_ADV_SEARCH: "Search" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "Close (Esc)" LOADING: "Loading..." GALLERY_PREV: "Previous (arrow left)" GALLERY_NEXT: "Next (arrow right)" GALLERY_COUNTER: "%curr% of %total%" IMAGE_ERROR: "The image could not be loaded." AJAX_ERROR: "The content could not be loaded." FOLDER_LIST: BUTTON_COMPOSE: "Compose" BUTTON_CONTACTS: "Contacts" BUTTON_NEW_MESSAGE: "New message" INBOX_NAME: "Inbox" SENT_NAME: "Sent" DRAFTS_NAME: "Drafts" SPAM_NAME: "Spam" TRASH_NAME: "Trash" ARCHIVE_NAME: "Archive" QUOTA: TITLE: "Quota usage" MESSAGE_LIST: BUTTON_RELOAD: "Reload Message List" BUTTON_MOVE_TO: "Move To" BUTTON_DELETE: "Delete" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_EMPTY_FOLDER: "Clear Folder" BUTTON_MULTY_FORWARD: "Forward as attachment(s)" BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" BUTTON_MORE: "More" MENU_SET_SEEN: "Mark as read" MENU_SET_ALL_SEEN: "Mark all as read" MENU_UNSET_SEEN: "Mark as unread" MENU_SET_FLAG: "Flag" MENU_UNSET_FLAG: "Unflag" MENU_SELECT_ALL: "All" MENU_SELECT_NONE: "None" MENU_SELECT_INVERT: "Invert" MENU_SELECT_UNSEEN: "Unread" MENU_SELECT_SEEN: "Read" MENU_SELECT_FLAGGED: "Flagged" MENU_SELECT_UNFLAGGED: "Unflagged" EMPTY_LIST: "Empty list." EMPTY_SEARCH_LIST: "No messages matched your search." SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "back to message list" LIST_LOADING: "Loading" EMPTY_SUBJECT_TEXT: "(No subject)" PUT_MESSAGE_HERE: "Drop message here to view it in the list" TODAY_AT: "today at %TIME%" YESTERDAY_AT: "yesterday at %TIME%" SEARCH_PLACEHOLDER: "Search" NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" MESSAGE: BUTTON_EDIT: "Edit" BUTTON_BACK: "Back" BUTTON_CLOSE: "Close" BUTTON_DELETE: "Delete" BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_MOVE_TO: "Move To" BUTTON_MORE: "More" BUTTON_REPLY: "Reply" BUTTON_REPLY_ALL: "Reply All" BUTTON_FORWARD: "Forward" BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" BUTTON_EDIT_AS_NEW: "Edit as New" BUTTON_SHOW_IMAGES: "Display external images" BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." BUTTON_IN_NEW_WINDOW: "View in separate window" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "Previous" BUTTON_THREAD_NEXT: "Next" BUTTON_THREAD_MORE: "More messages" MENU_HEADERS: "Show message headers" MENU_VIEW_ORIGINAL: "Show Source" MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" MENU_FILTER_SIMILAR: "Filter messages like this" MENU_PRINT: "Print" EMPTY_SUBJECT_TEXT: "(No subject)" LABEL_SUBJECT: "Subject" LABEL_DATE: "Date" LABEL_FROM: "From" LABEL_FROM_SHORT: "from" LABEL_TO: "To" LABEL_TO_SHORT: "to" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "From" PRINT_LABEL_TO: "To" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "Date" PRINT_LABEL_SUBJECT: "Subject" PRINT_LABEL_ATTACHMENTS: "Attachments" MESSAGE_LOADING: "Loading" MESSAGE_VIEW_DESC: "Select any message in the list to view it here." MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" LINK_SAVE_TO_CLOUD: "Save to Cloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Searching..." CONTACTS: LEGEND_CONTACTS: "Contacts" SEARCH_INPUT_PLACEHOLDER: "Search" BUTTON_ADD_CONTACT: "Add Contact" BUTTON_CREATE_CONTACT: "Create" BUTTON_UPDATE_CONTACT: "Update" BUTTON_IMPORT: "Import (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Import error (invalid file format)" LIST_LOADING: "Loading" EMPTY_LIST: "No contacts here" EMPTY_SEARCH: "No contacts found" CLEAR_SEARCH: "Clear search" CONTACT_VIEW_DESC: "Select contact in the list to view it here." LABEL_DISPLAY_NAME: "Display name" LABEL_EMAIL: "Email" LABEL_PHONE: "Phone" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Birthday" LINK_ADD_EMAIL: "Add an email address" LINK_ADD_PHONE: "Add a phone" LINK_BIRTHDAY: "Birthday" PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" LABEL_READ_ONLY: "Read only" LABEL_SHARE: "Share" ADD_MENU_LABEL: "Add" ADD_MENU_NICKNAME: "Nickname" ADD_MENU_NOTES: "Notes" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Phone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Address" ADD_MENU_BIRTHDAY: "Birthday" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "None" BUTTON_SHARE_ALL: "Everyone" BUTTON_SYNC: "Synchronization (CardDAV)" COMPOSE: TITLE_FROM: "From" TITLE_TO: "To" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Reply-To" TITLE_SUBJECT: "Subject" LINK_SHOW_INPUTS: "show all fields" BUTTON_SEND: "Send" BUTTON_SAVE: "Save" BUTTON_DELETE: "Delete" BUTTON_CANCEL: "Cancel" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "Saved at %TIME%" SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "Attach files" ATTACH_DROP_FILES_DESC: "Drop files here" ATTACH_ITEM_CANCEL: "Cancel" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM: "From" FORWARD_MESSAGE_TOP_TO: "To" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Sent" FORWARD_MESSAGE_TOP_SUBJECT: "Subject" EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Yes" BUTTON_NO: "No" DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choose your language" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Add Account?" BUTTON_ADD_ACCOUNT: "Add" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Add Identity?" TITLE_UPDATE_IDENTITY: "Update Identity?" BUTTON_ADD_IDENTITY: "Add" BUTTON_UPDATE_IDENTITY: "Update" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Create a folder?" LABEL_NAME: "Folder name" LABEL_PARENT: "Parent folder" BUTTON_CREATE: "Create" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" TITLE_CREATING_PROCESS: "Creating a folder" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" BUTTON_CLEAR: "Clear" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" DANGER_DESC_WARNING: "Warning!" DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." TITLE_CLEARING_PROCESS: "Purging the folder..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" BUTTON_SELECT: "Select" BUTTON_CLOSE: "Close" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_PASSWORD: "Password" LABEL_KEY_BIT_LENGTH: "Key length" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "Sign" LABEL_ENCRYPT: "Encrypt" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Sign" BUTTON_ENCRYPT: "Encrypt" BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Step verification test" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Equal To" SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching ANY of the following rules" SELECT_MATCH_ALL: "Matching ALL of the following rules" MARK_AS_READ_LABEL: "Mark as read" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subject (optional)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Reject message" ALL_INCOMING_MESSAGES_DESC: "All incoming messages" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Select system folders" SELECT_CHOOSE_ONE: "Choose one" SELECT_UNUSE_NAME: "Do not use" LABEL_SENT: "Sent" LABEL_DRAFTS: "Drafts" LABEL_SPAM: "Spam" LABEL_TRASH: "Trash" LABEL_ARCHIVE: "Archive" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" NOTIFICATION_SENT: | You haven't selected "Sent" system folder messages are put to after sending. If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." NOTIFICATION_SPAM: | You haven't selected "Spam" system folder spamed messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_TRASH: | You haven't selected "Trash" system folder deleted messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" LABEL_TWO_FACTOR_USER: "User" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" BUTTON_CREATE: "Create a secret" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Clear" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Show Secret" BUTTON_HIDE_SECRET: "Hide Secret" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" TWO_FACTOR_SECRET_DESC: > Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: > If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "Loading" LOGIN: "Login" MAILBOX: "MailBox" SETTINGS: "Settings" COMPOSE: "Compose" UPLOAD: ERROR_FILE_IS_TOO_BIG: "File is too big" ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" ERROR_NO_FILE_UPLOADED: "No file uploaded" ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" ERROR_FILE_TYPE: "Invalid file type" ERROR_UNKNOWN: "An unknown file upload error occurred" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personal" LABEL_GENERAL_NAME: "General" LABEL_CONTACTS_NAME: "Contacts" LABEL_FOLDERS_NAME: "Folders" LABEL_ACCOUNTS_NAME: "Accounts" LABEL_IDENTITY_NAME: "Identity" LABEL_IDENTITIES_NAME: "Identities" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Security" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Themes" LABEL_CHANGE_PASSWORD_NAME: "Password" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Back" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Save" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Delete" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identity" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "General" LABEL_LANGUAGE: "Language" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "Default text editor" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Plain" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "Interface animation" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "None" LABEL_VIEW_OPTIONS: "View options" LABEL_USE_PREVIEW_PANE: "Use preview pane" LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" LABEL_USE_THREADS: "Use threads" LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" LABEL_SHOW_IMAGES: "Always display external images in message body" LABEL_SHOW_ANIMATION: "Show animation" LABEL_MESSAGE_PER_PAGE: "Messages on page" LABEL_NOTIFICATIONS: "Notifications" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contacts" LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" LABEL_CONTACTS_SYNC_USER: "User" LABEL_CONTACTS_SYNC_PASSWORD: "Password" SETTINGS_THEMES: LEGEND_THEMES: "Themes" LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" LABEL_CUSTOM_TYPE: "Type" LABEL_CUSTOM_TYPE_LIGHT: "Light" LABEL_CUSTOM_TYPE_DARK: "Dark" LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "File is too big" ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" ERROR_UNKNOWN: "An unknown file upload error occurred" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Connect Google" BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Connect Facebook" BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Connect Twitter" BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Folder List" BUTTON_CREATE: "Create Folder" BUTTON_SYSTEM: "System Folders" BUTTON_DELETE: "Delete" BUTTON_SUBSCRIBE: "Subscribe" BUTTON_UNSUBSCRIBE: "Unsubscribe" LOADING_PROCESS: "Updating folder list" CREATING_PROCESS: "Creating a folder" DELETING_PROCESS: "Deleting a folder" RENAMING_PROCESS: "Renaming a folder" DELETING_ASK: "Are you sure?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Accounts" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "Add an Account" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "Delete" LOADING_PROCESS: "Updating..." DELETING_ASK: "Are you sure?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identity" LEGEND_IDENTITIES: "Additional Identities" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" BUTTON_ADD_IDENTITY: "Add Identity" BUTTON_DELETE: "Delete" LOADING_PROCESS: "Updating identity list" DELETING_ASK: "Are you sure?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Change Password" LABEL_CURRENT_PASSWORD: "Current password" LABEL_NEW_PASSWORD: "New password" LABEL_REPEAT_PASSWORD: "Confirm New Password" BUTTON_UPDATE_PASSWORD: "Set New Password" ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" TITLE_PRIVATE: "Private" TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Message list" TAB_MESSAGE_VIEW: "Message view" TAB_COMPOSE: "Compose" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "Reply" LABEL_REPLY_ALL: "Reply All" LABEL_FORWARD: "Forward" LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" LABEL_HELP: "Help" LABEL_CHECK_ALL: "Select all messages" LABEL_ARCHIVE: "Archive" LABEL_DELETE: "Delete" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "Move" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" LABEL_IMPORTANT: "Important, flag selected messages" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Print" LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" LABEL_SWITCH_TO_LIST: "Switch focus back to message list" LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" LABEL_SAVE_MESSAGE: "Save message" LABEL_SEND_MESSAGE: "Send message" LABEL_CLOSE_COMPOSE: "Close compose" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "Select a private key" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "Please specify FROM email address" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" NOTIFICATIONS: INVALID_TOKEN: "Invalid token" AUTH_ERROR: "Authentication failed" ACCESS_ERROR: "Access error" CONNECTION_ERROR: "Can't connect to server" CAPTCHA_ERROR: "Incorrect CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "Domain is not allowed" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Can't get message list" CANT_GET_MESSAGE: "Can't get message" CANT_DELETE_MESSAGE: "Can't delete message" CANT_MOVE_MESSAGE: "Can't move message" CANT_SAVE_MESSAGE: "Can't save message" CANT_SEND_MESSAGE: "Can't send message" INVALID_RECIPIENTS: "Invalid recipients" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Can't create folder" CANT_RENAME_FOLDER: "Can't rename folder" CANT_DELETE_FOLDER: "Can't delete folder" CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" CANT_SAVE_SETTINGS: "Can't save settings" CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" DOMAIN_ALREADY_EXISTS: "Domain already exists" CANT_INSTALL_PACKAGE: "Failed to install package" CANT_DELETE_PACKAGE: "Failed to remove package" INVALID_PLUGIN_PACKAGE: "Invalid plugin package" UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Account already exists" ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" MAIL_SERVER_ERROR: "An error has occured while accessing mail server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Unknown error" STATIC: BACK_LINK: "Reload" DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | JavaScript support is not available in your browser. Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | To use all the features of the application, download and install one of these browsers: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/en_US.yml000066400000000000000000000726211361462701300262200ustar00rootroot00000000000000en_US: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Login" LABEL_PASSWORD: "Password" LABEL_SIGN_ME: "Remember Me" LABEL_VERIFICATION_CODE: "Verification Code" LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" BUTTON_SIGN_IN: "Sign In" TITLE_SIGN_IN_GOOGLE: "Sign In using Google" TITLE_SIGN_IN_FACEBOOK: "Sign In using Facebook" TITLE_SIGN_IN_TWITTER: "Sign In using Twitter" LABEL_FORGOT_PASSWORD: "Forgot password" LABEL_REGISTRATION: "Registration" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Add Account" BUTTON_SETTINGS: "Settings" BUTTON_HELP: "Help" BUTTON_LOGOUT: "Logout" MOBILE: BUTTON_MOBILE_VERSION: "Mobile version" BUTTON_DESKTOP_VERSION: "Desktop version" SEARCH: MAIN_INPUT_PLACEHOLDER: "Search" TITLE_ADV: "Advanced Search" LABEL_ADV_FROM: "From" LABEL_ADV_TO: "To" LABEL_ADV_SUBJECT: "Subject" LABEL_ADV_TEXT: "Text" LABEL_ADV_HAS_ATTACHMENT: "Has attachment" LABEL_ADV_HAS_ATTACHMENTS: "Has attachments" LABEL_ADV_FLAGGED: "Flagged" LABEL_ADV_UNSEEN: "Unseen" LABEL_ADV_DATE: "Date" LABEL_ADV_DATE_ALL: "All" LABEL_ADV_DATE_3_DAYS: "Up to 3 days old" LABEL_ADV_DATE_7_DAYS: "Up to 1 week old" LABEL_ADV_DATE_MONTH: "Up to 1 month old" LABEL_ADV_DATE_3_MONTHS: "Up to 3 months old" LABEL_ADV_DATE_6_MONTHS: "Up to 6 months old" LABEL_ADV_DATE_YEAR: "Up to 1 year old" BUTTON_ADV_SEARCH: "Search" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "Close (Esc)" LOADING: "Loading..." GALLERY_PREV: "Previous (arrow left)" GALLERY_NEXT: "Next (arrow right)" GALLERY_COUNTER: "%curr% of %total%" IMAGE_ERROR: "The image could not be loaded." AJAX_ERROR: "The content could not be loaded." FOLDER_LIST: BUTTON_COMPOSE: "Compose" BUTTON_CONTACTS: "Contacts" BUTTON_NEW_MESSAGE: "New message" INBOX_NAME: "Inbox" SENT_NAME: "Sent" DRAFTS_NAME: "Drafts" SPAM_NAME: "Spam" TRASH_NAME: "Trash" ARCHIVE_NAME: "Archive" QUOTA: TITLE: "Quota usage" MESSAGE_LIST: BUTTON_RELOAD: "Reload Message List" BUTTON_MOVE_TO: "Move To" BUTTON_DELETE: "Delete" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_EMPTY_FOLDER: "Clear Folder" BUTTON_MULTY_FORWARD: "Forward as attachment(s)" BUTTON_DELETE_WITHOUT_MOVE: "Delete permanently" BUTTON_MORE: "More" MENU_SET_SEEN: "Mark as read" MENU_SET_ALL_SEEN: "Mark all as read" MENU_UNSET_SEEN: "Mark as unread" MENU_SET_FLAG: "Flag" MENU_UNSET_FLAG: "Unflag" MENU_SELECT_ALL: "All" MENU_SELECT_NONE: "None" MENU_SELECT_INVERT: "Invert" MENU_SELECT_UNSEEN: "Unread" MENU_SELECT_SEEN: "Read" MENU_SELECT_FLAGGED: "Flagged" MENU_SELECT_UNFLAGGED: "Unflagged" EMPTY_LIST: "Empty list." EMPTY_SEARCH_LIST: "No messages matched your search." SEARCH_RESULT_FOR: "Search results for \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "back to message list" LIST_LOADING: "Loading" EMPTY_SUBJECT_TEXT: "(No subject)" PUT_MESSAGE_HERE: "Drop message here to view it in the list" TODAY_AT: "today at %TIME%" YESTERDAY_AT: "yesterday at %TIME%" SEARCH_PLACEHOLDER: "Search" NEW_MESSAGE_NOTIFICATION: "You have %COUNT% new messages!" QUOTA_SIZE: "Using %SIZE% (%PROC%%) of your %LIMIT%" MESSAGE: BUTTON_EDIT: "Edit" BUTTON_BACK: "Back" BUTTON_CLOSE: "Close" BUTTON_DELETE: "Delete" BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_MOVE_TO: "Move To" BUTTON_MORE: "More" BUTTON_REPLY: "Reply" BUTTON_REPLY_ALL: "Reply All" BUTTON_FORWARD: "Forward" BUTTON_FORWARD_AS_ATTACHMENT: "Forward as attachment" BUTTON_EDIT_AS_NEW: "Edit as New" BUTTON_SHOW_IMAGES: "Display external images" BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." BUTTON_IN_NEW_WINDOW: "View in separate window" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "Previous" BUTTON_THREAD_NEXT: "Next" BUTTON_THREAD_MORE: "More messages" MENU_HEADERS: "Show message headers" MENU_VIEW_ORIGINAL: "Show Source" MENU_DOWNLOAD_ORIGINAL: "Download as .eml file" MENU_FILTER_SIMILAR: "Filter messages like this" MENU_PRINT: "Print" EMPTY_SUBJECT_TEXT: "(No subject)" LABEL_SUBJECT: "Subject" LABEL_DATE: "Date" LABEL_FROM: "From" LABEL_FROM_SHORT: "from" LABEL_TO: "To" LABEL_TO_SHORT: "to" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "From" PRINT_LABEL_TO: "To" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "Date" PRINT_LABEL_SUBJECT: "Subject" PRINT_LABEL_ATTACHMENTS: "Attachments" MESSAGE_LOADING: "Loading" MESSAGE_VIEW_DESC: "Select any message in the list to view it here." MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" LINK_SAVE_TO_CLOUD: "Save to Cloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Searching..." CONTACTS: LEGEND_CONTACTS: "Contacts" SEARCH_INPUT_PLACEHOLDER: "Search" BUTTON_ADD_CONTACT: "Add Contact" BUTTON_CREATE_CONTACT: "Create" BUTTON_UPDATE_CONTACT: "Update" BUTTON_IMPORT: "Import (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Import error (invalid file format)" LIST_LOADING: "Loading" EMPTY_LIST: "No contacts here" EMPTY_SEARCH: "No contacts found" CLEAR_SEARCH: "Clear search" CONTACT_VIEW_DESC: "Select contact in the list to view it here." LABEL_DISPLAY_NAME: "Display name" LABEL_EMAIL: "Email" LABEL_PHONE: "Phone" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Birthday" LINK_ADD_EMAIL: "Add an email address" LINK_ADD_PHONE: "Add a phone" LINK_BIRTHDAY: "Birthday" PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" LABEL_READ_ONLY: "Read only" LABEL_SHARE: "Share" ADD_MENU_LABEL: "Add" ADD_MENU_NICKNAME: "Nickname" ADD_MENU_NOTES: "Notes" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Phone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Address" ADD_MENU_BIRTHDAY: "Birthday" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "None" BUTTON_SHARE_ALL: "Everyone" BUTTON_SYNC: "Synchronization (CardDAV)" COMPOSE: TITLE_FROM: "From" TITLE_TO: "To" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Reply-To" TITLE_SUBJECT: "Subject" LINK_SHOW_INPUTS: "show all fields" BUTTON_SEND: "Send" BUTTON_SAVE: "Save" BUTTON_DELETE: "Delete" BUTTON_CANCEL: "Cancel" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "Saved at %TIME%" SAVED_ERROR_ON_SEND: "Message was sent but not saved to sent items folder" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "Attach files" ATTACH_DROP_FILES_DESC: "Drop files here" ATTACH_ITEM_CANCEL: "Cancel" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM: "From" FORWARD_MESSAGE_TOP_TO: "To" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Sent" FORWARD_MESSAGE_TOP_SUBJECT: "Subject" EMPTY_TO_ERROR_DESC: "Please specify at least one recipient" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet." BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Yes" BUTTON_NO: "No" DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choose your language" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Add Account?" BUTTON_ADD_ACCOUNT: "Add" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Add Identity?" TITLE_UPDATE_IDENTITY: "Update Identity?" BUTTON_ADD_IDENTITY: "Add" BUTTON_UPDATE_IDENTITY: "Update" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Create a folder?" LABEL_NAME: "Folder name" LABEL_PARENT: "Parent folder" BUTTON_CREATE: "Create" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" TITLE_CREATING_PROCESS: "Creating a folder" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Purge all messages from the folder?" BUTTON_CLEAR: "Clear" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" DANGER_DESC_WARNING: "Warning!" DANGER_DESC_HTML_1: "This action will result in removing all mails from %FOLDER% folder completely." DANGER_DESC_HTML_2: "Once started, the process cannot be aborted or cancelled." TITLE_CLEARING_PROCESS: "Purging the folder..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" BUTTON_SELECT: "Select" BUTTON_CLOSE: "Close" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_PASSWORD: "Password" LABEL_KEY_BIT_LENGTH: "Key length" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "Sign" LABEL_ENCRYPT: "Encrypt" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Sign" BUTTON_ENCRYPT: "Encrypt" BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Step verification test" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Equal To" SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching ANY of the following rules" SELECT_MATCH_ALL: "Matching ALL of the following rules" MARK_AS_READ_LABEL: "Mark as read" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subject (optional)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Reject message" ALL_INCOMING_MESSAGES_DESC: "All incoming messages" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Select system folders" SELECT_CHOOSE_ONE: "Choose one" SELECT_UNUSE_NAME: "Do not use" LABEL_SENT: "Sent" LABEL_DRAFTS: "Drafts" LABEL_SPAM: "Spam" LABEL_TRASH: "Trash" LABEL_ARCHIVE: "Archive" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" NOTIFICATION_SENT: | You haven't selected "Sent" system folder messages are put to after sending. If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." NOTIFICATION_SPAM: | You haven't selected "Spam" system folder spamed messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_TRASH: | You haven't selected "Trash" system folder deleted messages are placed to. If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" LABEL_TWO_FACTOR_USER: "User" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" BUTTON_CREATE: "Create a secret" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Clear" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Show Secret" BUTTON_HIDE_SECRET: "Hide Secret" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" TWO_FACTOR_SECRET_DESC: > Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: > If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "Loading" LOGIN: "Login" MAILBOX: "MailBox" SETTINGS: "Settings" COMPOSE: "Compose" UPLOAD: ERROR_FILE_IS_TOO_BIG: "File is too big" ERROR_FILE_PARTIALLY_UPLOADED: "File was partially uploaded due to unknown error" ERROR_NO_FILE_UPLOADED: "No file uploaded" ERROR_MISSING_TEMP_FOLDER: "The temporary file is missing" ERROR_ON_SAVING_FILE: "An unknown file upload error occurred" ERROR_FILE_TYPE: "Invalid file type" ERROR_UNKNOWN: "An unknown file upload error occurred" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personal" LABEL_GENERAL_NAME: "General" LABEL_CONTACTS_NAME: "Contacts" LABEL_FOLDERS_NAME: "Folders" LABEL_ACCOUNTS_NAME: "Accounts" LABEL_IDENTITY_NAME: "Identity" LABEL_IDENTITIES_NAME: "Identities" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Security" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Themes" LABEL_CHANGE_PASSWORD_NAME: "Password" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Back" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Save" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Delete" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identity" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_CONFIGURE_TWO_FACTOR: "Configure 2-Step verification" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "General" LABEL_LANGUAGE: "Language" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "Default text editor" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Plain" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "Interface animation" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "None" LABEL_VIEW_OPTIONS: "View options" LABEL_USE_PREVIEW_PANE: "Use preview pane" LABEL_USE_CHECKBOXES_IN_LIST: "Display checkboxes in list" LABEL_USE_THREADS: "Use threads" LABEL_REPLY_SAME_FOLDER: "Place replies in the folder of the message being replied to" LABEL_SHOW_IMAGES: "Always display external images in message body" LABEL_SHOW_ANIMATION: "Show animation" LABEL_MESSAGE_PER_PAGE: "Messages on page" LABEL_NOTIFICATIONS: "Notifications" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "Show new messages notification popups" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blocked by the browser)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contacts" LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" LABEL_CONTACTS_SYNC_USER: "User" LABEL_CONTACTS_SYNC_PASSWORD: "Password" SETTINGS_THEMES: LEGEND_THEMES: "Themes" LEGEND_THEMES_CUSTOM: "Custom Theme Configuration" LABEL_CUSTOM_TYPE: "Type" LABEL_CUSTOM_TYPE_LIGHT: "Light" LABEL_CUSTOM_TYPE_DARK: "Dark" LABEL_CUSTOM_BACKGROUND_IMAGE: "Background" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload background image (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "File is too big" ERROR_FILE_TYPE_ERROR: "Invalid file type (JPG and PNG only)" ERROR_UNKNOWN: "An unknown file upload error occurred" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Connect Google" BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Connect Facebook" BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Connect Twitter" BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Folder List" BUTTON_CREATE: "Create Folder" BUTTON_SYSTEM: "System Folders" BUTTON_DELETE: "Delete" BUTTON_SUBSCRIBE: "Subscribe" BUTTON_UNSUBSCRIBE: "Unsubscribe" LOADING_PROCESS: "Updating folder list" CREATING_PROCESS: "Creating a folder" DELETING_PROCESS: "Deleting a folder" RENAMING_PROCESS: "Renaming a folder" DELETING_ASK: "Are you sure?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Accounts" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "Add an Account" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "Delete" LOADING_PROCESS: "Updating..." DELETING_ASK: "Are you sure?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identity" LEGEND_IDENTITIES: "Additional Identities" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "Name" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" BUTTON_ADD_IDENTITY: "Add Identity" BUTTON_DELETE: "Delete" LOADING_PROCESS: "Updating identity list" DELETING_ASK: "Are you sure?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Change Password" LABEL_CURRENT_PASSWORD: "Current password" LABEL_NEW_PASSWORD: "New password" LABEL_REPEAT_PASSWORD: "Confirm New Password" BUTTON_UPDATE_PASSWORD: "Set New Password" ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" TITLE_PRIVATE: "Private" TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Message list" TAB_MESSAGE_VIEW: "Message view" TAB_COMPOSE: "Compose" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "Reply" LABEL_REPLY_ALL: "Reply All" LABEL_FORWARD: "Forward" LABEL_FORWARD_MULTIPLY: "Forward as attachment(s)" LABEL_HELP: "Help" LABEL_CHECK_ALL: "Select all messages" LABEL_ARCHIVE: "Archive" LABEL_DELETE: "Delete" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "Move" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" LABEL_IMPORTANT: "Important, flag selected messages" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Print" LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" LABEL_SWITCH_TO_LIST: "Switch focus back to message list" LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" LABEL_SAVE_MESSAGE: "Save message" LABEL_SEND_MESSAGE: "Send message" LABEL_CLOSE_COMPOSE: "Close compose" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "Select a private key" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "Please specify FROM email address" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" NOTIFICATIONS: INVALID_TOKEN: "Invalid token" AUTH_ERROR: "Authentication failed" ACCESS_ERROR: "Access error" CONNECTION_ERROR: "Can't connect to server" CAPTCHA_ERROR: "Incorrect CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "Domain is not allowed" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Can't get message list" CANT_GET_MESSAGE: "Can't get message" CANT_DELETE_MESSAGE: "Can't delete message" CANT_MOVE_MESSAGE: "Can't move message" CANT_SAVE_MESSAGE: "Can't save message" CANT_SEND_MESSAGE: "Can't send message" INVALID_RECIPIENTS: "Invalid recipients" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Can't create folder" CANT_RENAME_FOLDER: "Can't rename folder" CANT_DELETE_FOLDER: "Can't delete folder" CANT_DELETE_NON_EMPTY_FOLDER: "Can't delete non-empty directory" CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" CANT_SAVE_SETTINGS: "Can't save settings" CANT_SAVE_PLUGIN_SETTINGS: "Can't save settings" DOMAIN_ALREADY_EXISTS: "Domain already exists" CANT_INSTALL_PACKAGE: "Failed to install package" CANT_DELETE_PACKAGE: "Failed to remove package" INVALID_PLUGIN_PACKAGE: "Invalid plugin package" UNSUPPORTED_PLUGIN_PACKAGE: "Unsupported plugin package" LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." DEMO_SEND_MESSAGE_ERROR: "For security purposes, this account is not allowed to send messages to external e-mail addresses!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Account already exists" ACCOUNT_DOES_NOT_EXIST: "Account doesn't exist" MAIL_SERVER_ERROR: "An error has occured while accessing mail server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Unknown error" STATIC: BACK_LINK: "Reload" DOMAIN_LIST_DESC: "List of domains webmail is allowed to access." PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | JavaScript support is not available in your browser. Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | Cookies support is not available in your browser. Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | To use all the features of the application, download and install one of these browsers: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/es_ES.yml000066400000000000000000001006061361462701300262000ustar00rootroot00000000000000es_ES: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Login" LABEL_PASSWORD: "Contraseña" LABEL_SIGN_ME: "RecuĂ©rdame" LABEL_VERIFICATION_CODE: "CĂłdigo de verificaciĂłn" LABEL_DONT_ASK_VERIFICATION_CODE: "No solicitar el cĂłdigo de verificaciĂłn durante 2 semanas" BUTTON_SIGN_IN: "Acceder" TITLE_SIGN_IN_GOOGLE: "Acceder usando Google" TITLE_SIGN_IN_FACEBOOK: "Acceder usando Facebook" TITLE_SIGN_IN_TWITTER: "Acceder usando Twitter" LABEL_FORGOT_PASSWORD: "OlvidĂ© mi contraseña" LABEL_REGISTRATION: "Registro" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Agregar cuenta" BUTTON_SETTINGS: "ConfiguraciĂłn" BUTTON_HELP: "Ayuda" BUTTON_LOGOUT: "Cerrar sesiĂłn" MOBILE: BUTTON_MOBILE_VERSION: "VersiĂłn mĂłvil" BUTTON_DESKTOP_VERSION: "VersiĂłn escritorio" SEARCH: MAIN_INPUT_PLACEHOLDER: "Buscar" TITLE_ADV: "BĂşsqueda avanzada" LABEL_ADV_FROM: "De" LABEL_ADV_TO: "Para" LABEL_ADV_SUBJECT: "Asunto" LABEL_ADV_TEXT: "Texto" LABEL_ADV_HAS_ATTACHMENT: "Tiene adjunto" LABEL_ADV_HAS_ATTACHMENTS: "Tiene adjuntos" LABEL_ADV_FLAGGED: "Seleccionado" LABEL_ADV_UNSEEN: "No leĂ­do" LABEL_ADV_DATE: "Fecha" LABEL_ADV_DATE_ALL: "Todo" LABEL_ADV_DATE_3_DAYS: "Hasta 3 dĂ­as de antigĂĽedad" LABEL_ADV_DATE_7_DAYS: "Hasta una semana de antigĂĽedad" LABEL_ADV_DATE_MONTH: "Hasta 1 mes de antigĂĽedad" LABEL_ADV_DATE_3_MONTHS: "Hasta 3 meses de antigĂĽedad" LABEL_ADV_DATE_6_MONTHS: "Hasta 6 meses de antigĂĽedad" LABEL_ADV_DATE_YEAR: "Hasta 1 año de antigĂĽedad" BUTTON_ADV_SEARCH: "Buscar" PREVIEW_POPUP: FULLSCREEN: "Cambiar a pantalla completa" ZOOM: "Acercar / Alejar" CLOSE: "Cerrar (Esc)" LOADING: "Cargando..." GALLERY_PREV: "Anterior (Flecha Izquierda)" GALLERY_NEXT: "Siguiente (Flecha Derecha)" GALLERY_COUNTER: "%curr% de %total%" IMAGE_ERROR: "La imagen no se pudo cargar." AJAX_ERROR: "El contenido no se pudo cargar." FOLDER_LIST: BUTTON_COMPOSE: "Redactar" BUTTON_CONTACTS: "Contactos" BUTTON_NEW_MESSAGE: "Nuevo mensaje" INBOX_NAME: "Bandeja de Entrada" SENT_NAME: "Enviados" DRAFTS_NAME: "Borradores" SPAM_NAME: "Correo electrĂłnico no deseado" TRASH_NAME: "Papelera" ARCHIVE_NAME: "Archivo" QUOTA: TITLE: "Cuota" MESSAGE_LIST: BUTTON_RELOAD: "Actualizar lista de mensajes" BUTTON_MOVE_TO: "Mover" BUTTON_DELETE: "Eliminar" BUTTON_ARCHIVE: "Archivar" BUTTON_SPAM: "Correo no deseado" BUTTON_NOT_SPAM: "Es correo deseado" BUTTON_EMPTY_FOLDER: "Vaciar carpeta" BUTTON_MULTY_FORWARD: "Reenviar como adjunto(s)" BUTTON_DELETE_WITHOUT_MOVE: "Eliminar permanentemente" BUTTON_MORE: "Más" MENU_SET_SEEN: "Marcar como leĂ­do" MENU_SET_ALL_SEEN: "Marcar todo como leĂ­do" MENU_UNSET_SEEN: "Marcar como no leĂ­do" MENU_SET_FLAG: "Marcar" MENU_UNSET_FLAG: "Desmarcar" MENU_SELECT_ALL: "Todos" MENU_SELECT_NONE: "Ninguno" MENU_SELECT_INVERT: "Invertir" MENU_SELECT_UNSEEN: "No leĂ­do" MENU_SELECT_SEEN: "LeĂ­do" MENU_SELECT_FLAGGED: "Destacado" MENU_SELECT_UNFLAGGED: "No Destacado" EMPTY_LIST: "No hay mensajes." EMPTY_SEARCH_LIST: "La bĂşsqueda no ha producido resultados." SEARCH_RESULT_FOR: "Resultados de bĂşsqueda para \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "volver a la lista de mensajes" LIST_LOADING: "Cargando" EMPTY_SUBJECT_TEXT: "(Sin asunto)" PUT_MESSAGE_HERE: "Arrastre su mensaje aquĂ­ para verlo en la lista" TODAY_AT: "hoy a las %TIME%" YESTERDAY_AT: "ayer a las %TIME%" SEARCH_PLACEHOLDER: "Buscar" NEW_MESSAGE_NOTIFICATION: "Tiene %COUNT% nuevos mensajes." QUOTA_SIZE: "Usando %SIZE% (%PROC%%) de sus %LIMIT%" MESSAGE: BUTTON_EDIT: "Editar" BUTTON_BACK: "Atrás" BUTTON_CLOSE: "Cerrar" BUTTON_DELETE: "Eliminar" BUTTON_UNSUBSCRIBE: "Eliminar suscripciĂłn de esta lista" BUTTON_ARCHIVE: "Archivar" BUTTON_SPAM: "Correo electrĂłnico no deseado" BUTTON_NOT_SPAM: "Es correo deseado" BUTTON_MOVE_TO: "Mover" BUTTON_MORE: "Más" BUTTON_REPLY: "Responder" BUTTON_REPLY_ALL: "Responder a todos" BUTTON_FORWARD: "Reenviar" BUTTON_FORWARD_AS_ATTACHMENT: "Reenviar como adjunto" BUTTON_EDIT_AS_NEW: "Editar como Nuevo" BUTTON_SHOW_IMAGES: "Mostrar imágenes externas" BUTTON_NOTIFY_READ_RECEIPT: "El remitente ha pedido que se le notifique cuando lea este mensaje." BUTTON_IN_NEW_WINDOW: "Ver en una ventana nueva" BUTTON_THREAD_LIST: "Hilo" BUTTON_THREAD_PREV: "Anterior" BUTTON_THREAD_NEXT: "Siguiente" BUTTON_THREAD_MORE: "Más mensajes" MENU_HEADERS: "Mostrar los encabezados del mensaje" MENU_VIEW_ORIGINAL: "Mostrar original" MENU_DOWNLOAD_ORIGINAL: "Descargar como archivo .eml" MENU_FILTER_SIMILAR: "Filtrar mensajes como este" MENU_PRINT: "Imprimir" EMPTY_SUBJECT_TEXT: "(Sin asunto)" LABEL_SUBJECT: "Asunto" LABEL_DATE: "Fecha" LABEL_FROM: "De" LABEL_FROM_SHORT: "de" LABEL_TO: "Para" LABEL_TO_SHORT: "para" LABEL_CC: "CC" LABEL_BCC: "CCO (BCC)" LABEL_REPLY_TO: "Responder" PRINT_LABEL_FROM: "De" PRINT_LABEL_TO: "Para" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "CCO (BCC)" PRINT_LABEL_REPLY_TO: "Responder" PRINT_LABEL_DATE: "Fecha" PRINT_LABEL_SUBJECT: "Asunto" PRINT_LABEL_ATTACHMENTS: "Adjuntos" MESSAGE_LOADING: "Cargando" MESSAGE_VIEW_DESC: "Seleccione un mensaje de la lista para verlo aquĂ­." MESSAGE_VIEW_MOVE_DESC: "Haga clic en el nombre de la carpeta del panel izquierdo para seleccionar el destino." PGP_PASSWORD_INPUT_PLACEHOLDER: "Contraseña" PGP_SIGNED_MESSAGE_DESC: "Mensaje firmado mediante OpenPGP (click para verificar)" PGP_ENCRYPTED_MESSAGE_DESC: "Mensaje cifrado mediante OpenPGP (click para desencriptar)" LINK_DOWNLOAD_AS_ZIP: "Descargar todo (archivo ZIP)" LINK_SAVE_TO_OWNCLOUD: "Guardar en ownCloud" LINK_SAVE_TO_DROPBOX: "Guardar en Dropbox" READ_RECEIPT: SUBJECT: "Acuse de recibo (se visualiza) - %SUBJECT%" BODY: | Esta es una confirmaciĂłn del correo que usted enviĂł a %READ-RECEIPT%. Nota: Este acuse de recibo sĂłlo reconoce que el mensaje se muestra en el ordenador del receptor. No hay garantĂ­a de que el destinatario ha leĂ­do o entendido el contenido del mensaje. SUGGESTIONS: SEARCHING_DESC: "Buscando..." CONTACTS: LEGEND_CONTACTS: "Contactos" SEARCH_INPUT_PLACEHOLDER: "Buscar" BUTTON_ADD_CONTACT: "Añadir Contacto" BUTTON_CREATE_CONTACT: "Crear" BUTTON_UPDATE_CONTACT: "Actualizar" BUTTON_IMPORT: "Importar (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" BUTTON_EXPORT_CSV: "Exportar (csv)" ERROR_IMPORT_FILE: "Error de importaciĂłn (formato de archivo no válido)" LIST_LOADING: "Cargando" EMPTY_LIST: "No hay contactos aquĂ­" EMPTY_SEARCH: "No se encontraron contactos" CLEAR_SEARCH: "Limpiar bĂşsqueda" CONTACT_VIEW_DESC: "Seleccionar un contacto de la lista para verlo aquĂ­." LABEL_DISPLAY_NAME: "Nombre a visualizar" LABEL_EMAIL: "Correo ElectrĂłnico" LABEL_PHONE: "TelĂ©fono" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Cumpleaños" LINK_ADD_EMAIL: "Agregar una direcciĂłn de correo electrĂłnico" LINK_ADD_PHONE: "Agregar un telĂ©fono" LINK_BIRTHDAY: "Cumpleaños" PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduzca el nombre a visualizar" PLACEHOLDER_ENTER_LAST_NAME: "Introduzca los apellidos" PLACEHOLDER_ENTER_FIRST_NAME: "Introduzca el nombre" PLACEHOLDER_ENTER_NICK_NAME: "Introduzca un alias" LABEL_READ_ONLY: "Solo lectura" LABEL_SHARE: "Compartir" ADD_MENU_LABEL: "Añadir" ADD_MENU_NICKNAME: "Alias" ADD_MENU_NOTES: "Notas" ADD_MENU_EMAIL: "Correo electrĂłnico" ADD_MENU_PHONE: "TelĂ©fono" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "DirecciĂłn" ADD_MENU_BIRTHDAY: "Cumpleaños" ADD_MENU_TAGS: "Etiquetas" BUTTON_SHARE_NONE: "Ninguno" BUTTON_SHARE_ALL: "Todos" BUTTON_SYNC: "SincronizaciĂłn (CardDAV)" COMPOSE: TITLE_FROM: "De" TITLE_TO: "Para" TITLE_CC: "CC" TITLE_BCC: "CCO (BCC)" TITLE_REPLY_TO: "Responder" TITLE_SUBJECT: "Asunto" LINK_SHOW_INPUTS: "mostrar todos los campos" BUTTON_SEND: "Enviar" BUTTON_SAVE: "Guardar" BUTTON_DELETE: "Eliminar" BUTTON_CANCEL: "Cancelar" BUTTON_MINIMIZE: "Minimizar" SAVED_TIME: "Guardado a las %TIME%" SAVED_ERROR_ON_SEND: "El mensaje se enviĂł, pero no se guardĂł en la carpeta de enviados" DISCARD_UNSAVED_DATA: "ÂżDescartar cambios?" ATTACH_FILES: "Añadir archivos" ATTACH_DROP_FILES_DESC: "Arrastre los archivos aquĂ­" ATTACH_ITEM_CANCEL: "Cancelar" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escribiĂł" FORWARD_MESSAGE_TOP_TITLE: "-------- Mensaje reenviado -------" FORWARD_MESSAGE_TOP_FROM: "De" FORWARD_MESSAGE_TOP_TO: "Para" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Enviado" FORWARD_MESSAGE_TOP_SUBJECT: "Asunto" EMPTY_TO_ERROR_DESC: "Por favor, especifique al menos un destinatario" NO_ATTACHMENTS_HERE_DESC: "No hay adjuntos aquĂ­." ATTACHMENTS_ERROR_DESC: "¡AtenciĂłn! No se han subido todos los archivos adjuntos." ATTACHMENTS_UPLOAD_ERROR_DESC: "No se han subido todos los archivos adjuntos." BUTTON_REQUEST_READ_RECEIPT: "Solicitar confirmaciĂłn de lectura" BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" BUTTON_OPEN_PGP: "OpenPGP (solo texto plano)" BUTTON_REQUEST_DSN: "Solicitar una confirmaciĂłn de entrega" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Cerrar" POPUPS_ASK: BUTTON_YES: "SĂ­" BUTTON_NO: "No" DESC_WANT_CLOSE_THIS_WINDOW: "ÂżEstá seguro de que desea cerrar esta ventana?" DESC_WANT_DELETE_MESSAGES: "ÂżEstá seguro de que desea eliminar los mensajes?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Seleccionar idioma" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Añadir cuenta" BUTTON_ADD_ACCOUNT: "Añadir" TITLE_UPDATE_ACCOUNT: "ÂżActualizar cuenta?" BUTTON_UPDATE_ACCOUNT: "Actualizar" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "ÂżAñadir Identidad?" TITLE_UPDATE_IDENTITY: "ÂżActualizar identidad?" BUTTON_ADD_IDENTITY: "Añadir" BUTTON_UPDATE_IDENTITY: "Actualizar" LABEL_EMAIL: "Correo electrĂłnico" LABEL_NAME: "Nombre" LABEL_REPLY_TO: "Responder" LABEL_SIGNATURE: "Firma" LABEL_CC: "CC" LABEL_BCC: "CCO" LABEL_SIGNATURE_INSERT_BEFORE: "Insertar esta firma antes de el texto entre comillas en las respuestas" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Crear una carpeta" LABEL_NAME: "Nombre de la carpeta" LABEL_PARENT: "Carpeta superior" BUTTON_CREATE: "Crear" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Cerrar" TITLE_CREATING_PROCESS: "Creando carpeta" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "ÂżPurgar todos los mensajes de la carpeta?" BUTTON_CLEAR: "Limpiar" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Cerrar" DANGER_DESC_WARNING: "¡AtenciĂłn!" DANGER_DESC_HTML_1: "Con esta acciĂłn usted puede borrar todos los emails de la carpeta %FOLDER% completamente." DANGER_DESC_HTML_2: "Una vez comenzado el proceso no se puede abortar ni cancelar." TITLE_CLEARING_PROCESS: "Purgando carpeta..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importar clave OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Ver clave OpenPGP" BUTTON_SELECT: "Seleccionar" BUTTON_CLOSE: "Cerrar" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generar clave OpenPGP" LABEL_EMAIL: "Correo electrĂłnico" LABEL_NAME: "Nombre" LABEL_PASSWORD: "Contraseña" LABEL_KEY_BIT_LENGTH: "Longitud de la clave" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generar" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "Firmar/Cifrar con OpenPGP" LABEL_SIGN: "Firmar" LABEL_ENCRYPT: "Encriptar" LABEL_PASSWORD: "Contraseña" BUTTON_SIGN: "Firmar" BUTTON_ENCRYPT: "Encriptar" BUTTON_SIGN_AND_ENCRYPT: "Firmar y encriptar" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "Descifrar OpenPGP" LABEL_KEY: "Clave privada" LABEL_PASSWORD: "Contraseña" BUTTON_DECRYPT: "Descifrar" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Prueba de verificaciĂłn de 2 pasos" LABEL_CODE: "CĂłdigo" BUTTON_TEST: "Probar" POPUPS_FILTER: TITLE_CREATE_FILTER: "ÂżCrear un filtro?" TITLE_EDIT_FILTER: "ÂżActualizar un filtro?" FILTER_NAME: "Nombre" LEGEND_CONDITIONS: "Condiciones" LEGEND_ACTIONS: "Acciones" BUTTON_DONE: "Hecho" BUTTON_ADD_CONDITION: "Añadir condiciĂłn" SELECT_ACTION_NONE: "Ninguna" SELECT_ACTION_MOVE_TO: "Mover" SELECT_ACTION_FORWARD_TO: "Reenviar" SELECT_ACTION_REJECT: "Rechazar" SELECT_ACTION_VACATION_MESSAGE: "Mensaje fuera de lĂ­nea" SELECT_ACTION_DISCARD: "Descartar" SELECT_FIELD_FROM: "De" SELECT_FIELD_RECIPIENTS: "Destinatarios (A o CC)" SELECT_FIELD_SUBJECT: "Asunto" SELECT_FIELD_HEADER: "Encabezado" SELECT_FIELD_SIZE: "Tamaño" SELECT_TYPE_CONTAINS: "Contiene" SELECT_TYPE_NOT_CONTAINS: "No Contiene" SELECT_TYPE_MATCHES: "Coincide (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "No Coindide (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Igual A" SELECT_TYPE_NOT_EQUAL_TO: "Distinto De" SELECT_TYPE_OVER: "Por Encima" SELECT_TYPE_UNDER: "Por Debajo" SELECT_MATCH_ANY: "Si coincide alguna de estas reglas" SELECT_MATCH_ALL: "Si coinciden todas las reglas" MARK_AS_READ_LABEL: "Marcar como leĂ­do" REPLY_INTERVAL_LABEL: "Intervalo de respuesta (dĂ­as)" KEEP_LABEL: "Mantener" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Asunto (opcional)" VACATION_MESSAGE_LABEL: "Mensaje" VACATION_RECIPIENTS_LABEL: "Destinatarios (separados por coma)" REJECT_MESSAGE_LABEL: "Rechazar mensaje" ALL_INCOMING_MESSAGES_DESC: "Todos los mensajes entrantes" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Seleccione las carpetas del sistema" SELECT_CHOOSE_ONE: "Elija una" SELECT_UNUSE_NAME: "No usar" LABEL_SENT: "Enviados" LABEL_DRAFTS: "Borradores" LABEL_SPAM: "Correo no deseado" LABEL_TRASH: "Papelera" LABEL_ARCHIVE: "Archivo" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Cerrar" NOTIFICATION_SENT: | Usted no ha seleccionado la carpeta del sistema para guardar los "Enviados". Si no desea guardar los mensajes enviados, por favor seleccione la opciĂłn "No usar". NOTIFICATION_DRAFTS: "Usted no ha seleccionado la carpeta del sistema para guardar los \"Borradores\"." NOTIFICATION_SPAM: | Usted no ha seleccionado la carpeta del sistema para alojar los mensajes marcados como "Spam". Si desea eliminar los mensajes permanentemente, por favor seleccione la opciĂłn "No usar". NOTIFICATION_TRASH: | Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados a la "Papelera" . Si desea eliminar los mensajes permanentemente, por favor seleccione la opciĂłn "No usar". NOTIFICATION_ARCHIVE: "Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados al \"Archivo\"." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "VerificaciĂłn de 2 Pasos" LABEL_ENABLE_TWO_FACTOR: "Activar la verificaciĂłn de 2 pasos" LABEL_TWO_FACTOR_USER: "Usuario" LABEL_TWO_FACTOR_STATUS: "Estado" LABEL_TWO_FACTOR_SECRET: "Clave secreta" LABEL_TWO_FACTOR_BACKUP_CODES: "CĂłdigos de copia de seguridad" BUTTON_CREATE: "Crear nueva clave secreta" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Borrar" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Hecho" BUTTON_TEST: "Probar" LINK_TEST: "probar" BUTTON_SHOW_SECRET: "Mostrar clave secreta" BUTTON_HIDE_SECRET: "Ocultar clave secreta" TWO_FACTOR_REQUIRE_DESC: "Se requiere que configure la verificaciĂłn de 2-pasos." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "No configurado" TWO_FACTOR_SECRET_DESC: >- Importar esta informaciĂłn en su cliente Google Authenticator (u otro cliente TOTP) utilizando el cĂłdigo QR ​​se indica debajo o introduciendo el cĂłdigo manualmente. TWO_FACTOR_BACKUP_CODES_DESC: >- Si usted no puede recibir los cĂłdigos a travĂ©s de Google Authenticator, puede utilizar cĂłdigos de copia de seguridad para firmar pulg DespuĂ©s de que usted ha utilizado un cĂłdigo de copia de seguridad para iniciar sesiĂłn, se convertirá en inactiva. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "Cargando" LOGIN: "Ingresar" MAILBOX: "BuzĂłn" SETTINGS: "Configuraciones" COMPOSE: "Redactar" UPLOAD: ERROR_FILE_IS_TOO_BIG: "El archivo es muy grande" ERROR_FILE_PARTIALLY_UPLOADED: "El archivo fue subido parcialmente debido a un error desconocido" ERROR_NO_FILE_UPLOADED: "NingĂşn archivo subido" ERROR_MISSING_TEMP_FOLDER: "El archivo temporal no se encuentra" ERROR_ON_SAVING_FILE: "Se ha producido un error de carga de archivo desconocido" ERROR_FILE_TYPE: "Tipo de archivo inválido" ERROR_UNKNOWN: "Se ha producido un error de carga de archivo desconocido" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTO" TEXT_SWITCHER_RICH_FORMATTING: "Texto enriquecido" TEXT_SWITCHER_CONFIRM: "Se perderá el formato de texto e imágenes. ÂżEstá seguro que desea continuar?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personal" LABEL_GENERAL_NAME: "General" LABEL_CONTACTS_NAME: "Contactos" LABEL_FOLDERS_NAME: "Carpetas" LABEL_ACCOUNTS_NAME: "Cuentas" LABEL_IDENTITY_NAME: "Identidad" LABEL_IDENTITIES_NAME: "Identidades" LABEL_FILTERS_NAME: "Filtros" LABEL_TEMPLATES_NAME: "Plantillas" LABEL_SECURITY_NAME: "Seguridad" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Temas" LABEL_CHANGE_PASSWORD_NAME: "Contraseña" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Atrás" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtros" BUTTON_SAVE: "Guardar" BUTTON_ADD_FILTER: "Añadir un Filtro" BUTTON_DELETE: "Borrar" BUTTON_RAW_SCRIPT: "Usar Script Personalizado" SUBNAME_NONE: "Ninguno" SUBNAME_MOVE_TO: "Mover a \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Reenviar a \"%EMAIL%\"" SUBNAME_REJECT: "Rechazar" SUBNAME_VACATION_MESSAGE: "Mensaje de vacaciones" SUBNAME_DISCARD: "Descartar" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Actualizando lista de filtros" DELETING_ASK: "ÂżEstá seguro?" CHACHES_NEED_TO_BE_SAVED_DESC: "Estos cambios deben ser cambiados en el servidor." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identidad" LABEL_DISPLAY_NAME: "Nombre" LABEL_REPLY_TO: "Responder a" LABEL_SIGNATURE: "Firma" LABEL_ADD_SIGNATURE_TO_ALL: "Agregar su firma a todos los mensajes salientes" SETTINGS_SECURITY: LEGEND_SECURITY: "Seguridad" LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificaciĂłn de 2-Pasos" LABEL_AUTOLOGOUT: "Salir Automáticamente" AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuto(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hora(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "General" LABEL_LANGUAGE: "Idioma" LABEL_IDENTITY: "Identidad" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "Sin DivisiĂłn" LABEL_LAYOUT_VERTICAL_SPLIT: "DivisiĂłn Vertical" LABEL_LAYOUT_HORIZONTAL_SPLIT: "DivisiĂłn Horizontal" LABEL_EDITOR: "Editor de texto predeterminado" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Texto plano" LABEL_EDITOR_HTML_FORCED: "Html (forzado)" LABEL_EDITOR_PLAIN_FORCED: "Texto plano (forzado)" LABEL_ANIMATION: "Interface animation" LABEL_ANIMATION_FULL: "Todo" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Ninguno" LABEL_VIEW_OPTIONS: "Ver opciones" LABEL_USE_PREVIEW_PANE: "Utilice el panel de vista previa" LABEL_USE_CHECKBOXES_IN_LIST: "Mostrar casillas de verificaciĂłn en la lista" LABEL_USE_THREADS: "Usar hilos de conversaciĂłn" LABEL_REPLY_SAME_FOLDER: "Coloque las respuestas en la carpeta del mensaje que esta respondiendo." LABEL_SHOW_IMAGES: "Mostrar siempre las imágenes en el cuerpo del mensaje" LABEL_SHOW_ANIMATION: "Mostrar animaciĂłn" LABEL_MESSAGE_PER_PAGE: "Mensajes en página" LABEL_NOTIFICATIONS: "Notificaciones" LABEL_SOUND_NOTIFICATION: "Sonido de la notificaciĂłn" LABEL_CHROME_NOTIFICATION_DESC: "Mostrar notificaciĂłn de nuevos mensajes en Popup" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado por el explorador)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contactos" LABEL_CONTACTS_AUTOSAVE: "Agregar automáticamente destinatarios a la libreta de direcciones" LEGEND_CONTACTS_SYNC: "SincronizaciĂłn remota (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Activar la sincronizaciĂłn remota" LABEL_CONTACTS_SYNC_SERVER: "Servidor" LABEL_CONTACTS_SYNC_AB_URL: "Libreta de direcciones URL" LABEL_CONTACTS_SYNC_USER: "Usuario" LABEL_CONTACTS_SYNC_PASSWORD: "Contraseña" SETTINGS_THEMES: LEGEND_THEMES: "Temas" LEGEND_THEMES_CUSTOM: "ConfiguraciĂłn de tema personalizado" LABEL_CUSTOM_TYPE: "Tipo" LABEL_CUSTOM_TYPE_LIGHT: "Claro" LABEL_CUSTOM_TYPE_DARK: "Oscuro" LABEL_CUSTOM_BACKGROUND_IMAGE: "Fondo" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Suba una imagen de fondo (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "La imagen es muy grande" ERROR_FILE_TYPE_ERROR: "Tipo de archivo inválido (Solo permitido: JPG y PNG)" ERROR_UNKNOWN: "Se ha producido un error de carga de archivo desconocido" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Conectar con Google" BUTTON_GOOGLE_DISCONNECT: "Desconectar de Google" MAIN_GOOGLE_DESC: "Despues de habilitar el ingreso via Google, usted puede iniciar sesiĂłn en la cuenta usando el botĂłn de Google que aparece en la pantalla de ingreso." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Conectar con Facebook" BUTTON_FACEBOOK_DISCONNECT: "Desconectar Facebook" MAIN_FACEBOOK_DESC: "Despues de habilitar el ingreso via Facebook, usted puede iniciar sesiĂłn en la cuenta usando el botĂłn de Facebook que aparece en la pantalla de ingreso." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Conectar con Twitter" BUTTON_TWITTER_DISCONNECT: "Desconectar Twitter" MAIN_TWITTER_DESC: "Despues de habilitar el ingreso via Twitter, usted puede iniciar sesiĂłn en la cuenta usando el botĂłn de Twitter que aparece en la pantalla de ingreso." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Lista de Carpetas" BUTTON_CREATE: "Crear carpeta" BUTTON_SYSTEM: "Carpetas del sistema" BUTTON_DELETE: "Eliminar" BUTTON_SUBSCRIBE: "Suscribir" BUTTON_UNSUBSCRIBE: "Darse de baja" LOADING_PROCESS: "Actualizando lista de carpetas" CREATING_PROCESS: "Creando carpeta" DELETING_PROCESS: "Eliminado carpeta" RENAMING_PROCESS: "Renombrando carpeta" DELETING_ASK: "ÂżEstá usted seguro?" TO_MANY_FOLDERS_DESC_1: "Tiene muchas carpetas!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Eliminar carpeta" HELP_SHOW_HIDE_FOLDER: "Mostrar/ocultar carpeta" HELP_CHECK_FOR_NEW_MESSAGES: "Chequear/no chequear nuevos mensajes" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Lista de cuentas" LEGEND_IDENTITIES: "Identidades" LEGEND_ACCOUNTS_AND_IDENTITIES: "Cuentas e identidades" BUTTON_ADD_ACCOUNT: "Añadir cuenta" BUTTON_ADD_IDENTITY: "Añadir identidad" BUTTON_DELETE: "Eliminar" LOADING_PROCESS: "Actualizando lista de cuentas" DELETING_ASK: "ÂżEstá usted seguro?" DEFAULT_IDENTITY_LABEL: "predeterminado" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identidad" LEGEND_IDENTITIES: "Identidades adicionales" LABEL_DEFAULT: "Predeterminado" LABEL_DISPLAY_NAME: "Nombre" LABEL_REPLY_TO: "Responder a" LABEL_SIGNATURE: "Firma" LABEL_ADD_SIGNATURE_TO_ALL: "Agregar firma a todos los mensajes salientes" BUTTON_ADD_IDENTITY: "Añadir Identidad" BUTTON_DELETE: "Eliminar" LOADING_PROCESS: "ActualizaciĂłn de la lista de la identidad" DELETING_ASK: "ÂżEstá usted seguro?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Cambiar contraseña" LABEL_CURRENT_PASSWORD: "Contraseña actual" LABEL_NEW_PASSWORD: "Nueva contraseña" LABEL_REPEAT_PASSWORD: "Confirmar nueva contraseña" BUTTON_UPDATE_PASSWORD: "Establecer nueva contraseña" ERROR_PASSWORD_MISMATCH: "Las contraseñas no coinciden, por favor intente de nuevo" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importar llave OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generar llaves OpenPGP" TITLE_PRIVATE: "Privado" TITLE_PUBLIC: "PĂşblico" DELETING_ASK: "ÂżEstá usted seguro?" GENERATE_ONLY_HTTPS: "Solo HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Ayuda de atajos de teclado" TAB_MAILBOX: "BuzĂłn" TAB_MESSAGE_LIST: "Lista de mensajes" TAB_MESSAGE_VIEW: "Vista de avisos" TAB_COMPOSE: "Redactar" LABEL_OPEN_USER_DROPDOWN: "Desplegar lista de usuarios" LABEL_REPLY: "Responder" LABEL_REPLY_ALL: "Responder a todos" LABEL_FORWARD: "Adelante" LABEL_FORWARD_MULTIPLY: "Reenviar (multiplicar)" LABEL_HELP: "Ayuda" LABEL_CHECK_ALL: "Comprobar todos los mensajes" LABEL_ARCHIVE: "Archivo" LABEL_DELETE: "Eliminar" LABEL_OPEN_THREAD: "Abrir hilo seleccionado" LABEL_MOVE: "Mover" LABEL_READ: "Marcar los mensajes seleccionados como leĂ­dos" LABEL_UNREAD: "Marcar los mensajes seleccionados como no leĂ­dos" LABEL_IMPORTANT: "Importante, marcar mensajes seleccionados" LABEL_SEARCH: "Buscar" LABEL_CANCEL_SEARCH: "Cancelar la bĂşsqueda" LABEL_FULLSCREEN_ENTER: "Pantalla completa (panel de vista previa)" LABEL_VIEW_MESSAGE_ENTER: "Ver mensaje (No hay diseño panel de vista previa)" LABEL_SWITCH_TO_MESSAGE: "Cambiar foco a mensaje seleccionado" LABEL_SWITCH_TO_FOLDER_LIST: "Cambiar foco a la lista de carpetas" LABEL_FULLSCREEN_TOGGLE: "Cambiar a modo de pantalla completa" LABEL_BLOCKQUOTES_TOGGLE: "Cambiar blockquotes de mensaje" LABEL_THREAD_NEXT: "PrĂłximo mensaje del hilo" LABEL_THREAD_PREV: "Mensaje anterior del hilo" LABEL_PRINT: "Imprimir" LABEL_EXIT_FULLSCREEN: "Salir del modo de pantalla completa" LABEL_CLOSE_MESSAGE: "Cerrar el mensaje (No hay diseño panel de vista previa)" LABEL_SWITCH_TO_LIST: "Cambiar foco de nuevo a la lista de mensajes" LABEL_OPEN_COMPOSE_POPUP: "Abrir ventana de redacciĂłn" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimizar componer" LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir ventana de identidades" LABEL_SAVE_MESSAGE: "Guardar aviso" LABEL_SEND_MESSAGE: "Enviar mensaje" LABEL_CLOSE_COMPOSE: "Cerrar componer" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No se encontraron claves pĂşblicas" NO_PUBLIC_KEYS_FOUND_FOR: "No hay claves pĂşblicas encontrados para el email %MAIL%" NO_PRIVATE_KEY_FOUND: "No se encontrĂł la clave privada" NO_PRIVATE_KEY_FOUND_FOR: "No hay una clave privada para el email %EMAIL%" ADD_A_PUBLICK_KEY: "Añadir llave pĂşblica" SELECT_A_PRIVATE_KEY: "Seleccionar una clave privada" UNVERIFIRED_SIGNATURE: "Firma no verificada" DECRYPTION_ERROR: "Error de descifrado OpenPGP" GOOD_SIGNATURE: "Buena firma de %USER%" PGP_ERROR: "Error OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "Por favor, especifique direcciĂłn de correo electrĂłnico PARA" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Por favor, especifique al menos un destinatario" NOTIFICATIONS: INVALID_TOKEN: "Elemento no válido" AUTH_ERROR: "AutentificaciĂłn fallida" ACCESS_ERROR: "Error de acceso" CONNECTION_ERROR: "No se puede conectar al servidor" CAPTCHA_ERROR: "CAPTCHA Incorrecto." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Este ID no está asignado a ninguna cuenta de Email todavĂ­a. Inicie sesiĂłn con las credenciales de correo electrĂłnico y habilite esta caracterĂ­stica en la configuraciĂłn de cuenta. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Este ID no está asignado a ninguna cuenta de Email todavĂ­a. Inicie sesiĂłn con las credenciales de correo electrĂłnico y habilite esta caracterĂ­stica en la configuraciĂłn de cuenta. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Este ID no está asignado a ninguna cuenta de Email todavĂ­a. Inicie sesiĂłn con las credenciales de correo electrĂłnico y habilite esta caracterĂ­stica en la configuraciĂłn de cuenta. DOMAIN_NOT_ALLOWED: "Dominio no permitido" ACCOUNT_NOT_ALLOWED: "La cuenta no está permitida" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Factor de verificaciĂłn en dos pasos requerido" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Error de verificaciĂłn en dos pasos" COULD_NOT_SAVE_NEW_PASSWORD: "No se puede guardar la nueva contraseña" CURRENT_PASSWORD_INCORRECT: "La contraseña actual es incorrecta" NEW_PASSWORD_SHORT: "La contraseña es muy corta" NEW_PASSWORD_WEAK: "La contraseña es muy fácil" NEW_PASSWORD_FORBIDDENT: "La contraseña contiene caracteres prohibidos" CONTACTS_SYNC_ERROR: "Error de sincronizaciĂłn de Contactos" CANT_GET_MESSAGE_LIST: "No se puede obtener la lista de mensajes" CANT_GET_MESSAGE: "No se puede obtener el mensaje" CANT_DELETE_MESSAGE: "No se puede eliminar el mensaje" CANT_MOVE_MESSAGE: "No se puede mover el mensaje" CANT_SAVE_MESSAGE: "No se puede guardar el mensaje" CANT_SEND_MESSAGE: "No se puede enviar el mensaje" INVALID_RECIPIENTS: "Los destinatarios no son válidos" CANT_SAVE_FILTERS: "No se pueden guardar los filtros" CANT_GET_FILTERS: "No se pueden obtener los filtros" FILTERS_ARE_NOT_CORRECT: "Filtros incorrectos" CANT_CREATE_FOLDER: "No se puede crear la carpeta" CANT_RENAME_FOLDER: "No se puede renombrar la carpeta" CANT_DELETE_FOLDER: "No se puede eliminar la carpeta" CANT_DELETE_NON_EMPTY_FOLDER: "No se puede eliminar un directorio que no está vacĂ­o" CANT_SUBSCRIBE_FOLDER: "No se puede suscribir carpeta" CANT_UNSUBSCRIBE_FOLDER: "No puede darse de baja de la carpeta" CANT_SAVE_SETTINGS: "No puede guardar la configuraciĂłn" CANT_SAVE_PLUGIN_SETTINGS: "No puede guardar la configuraciĂłn" DOMAIN_ALREADY_EXISTS: "El Dominio ya existe" CANT_INSTALL_PACKAGE: "No se pudo instalar el paquete" CANT_DELETE_PACKAGE: "No se pudo eliminar el paquete" INVALID_PLUGIN_PACKAGE: "Paquete de plugins no válido" UNSUPPORTED_PLUGIN_PACKAGE: "Paquete de plugins incompatible" LICENSING_SERVER_IS_UNAVAILABLE: "El Servidor de SuscripciĂłn no está disponible" LICENSING_DOMAIN_EXPIRED: "La suscripciĂłn para este dominio ha expirado." LICENSING_DOMAIN_BANNED: "La suscripciĂłn para este dominio se prohibiĂł." DEMO_SEND_MESSAGE_ERROR: "Por razones de seguridad, esta cuenta demo no permite enviar mensajes a direcciones de correo electrĂłnico externas!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "La cuenta ya existe" ACCOUNT_DOES_NOT_EXIST: "La cuenta no existe" MAIL_SERVER_ERROR: "OcurriĂł un error mientras se accedĂ­a al servidor" INVALID_INPUT_ARGUMENT: "Argumento no válido" UNKNOWN_ERROR: "Error desconocido" STATIC: BACK_LINK: "Recargar" DOMAIN_LIST_DESC: "Lista de dominios de correo web que se le permite acceder." PHP_EXSTENSIONS_ERROR_DESC: "La extensiĂłn de PHP requerida no está disponible en su configuraciĂłn de PHP!" PHP_VERSION_ERROR_DESC: "Su versiĂłn de PHP (%VERSION%) es menor a la mĂ­nima requerida 5.3.0!" NO_SCRIPT_TITLE: "Esta aplicaciĂłn requiere de JavaScript." NO_SCRIPT_DESC: | JavaScript no está disponible en su navegador. Por favor habilite el soporte JavaScript en la configuraciĂłn de su navegador e intĂ©ntelo de nuevo. NO_COOKIE_TITLE: "Esta aplicaciĂłn requiere de Cookies." NO_COOKIE_DESC: | Su navegador no soporta Cookies. Por favor habilite los Cookie en la configuraciĂłn de su navegador e intĂ©ntelo de nuevo. BAD_BROWSER_TITLE: "Su navegador no está actualizado." BAD_BROWSER_DESC: | Para usar todas las caracterĂ­sticas de esta aplicaciĂłn, descargue e instale uno de estos navegadores: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/et_EE.yml000066400000000000000000000751761361462701300262000ustar00rootroot00000000000000et_EE: LOGIN: LABEL_EMAIL: "E-post" LABEL_LOGIN: "Logi sisse" LABEL_PASSWORD: "Salasõna" LABEL_SIGN_ME: "Pea mind meeles" LABEL_VERIFICATION_CODE: "Kontrollkood" LABEL_DONT_ASK_VERIFICATION_CODE: "Ă„ra kĂĽsi koodi järgmised 2 nädalat" BUTTON_SIGN_IN: "Sisene" TITLE_SIGN_IN_GOOGLE: "Sisene Google'i abil" TITLE_SIGN_IN_FACEBOOK: "Sisene Facebooki abil" TITLE_SIGN_IN_TWITTER: "Sisene Twitteri abil" LABEL_FORGOT_PASSWORD: "Unustasin salasõna" LABEL_REGISTRATION: "Registreerimine" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Lisa konto" BUTTON_SETTINGS: "Sätted" BUTTON_HELP: "Abi" BUTTON_LOGOUT: "Logi välja" MOBILE: BUTTON_MOBILE_VERSION: "Mobiiliversioon" BUTTON_DESKTOP_VERSION: "Töölauaversioon" SEARCH: MAIN_INPUT_PLACEHOLDER: "Otsing" TITLE_ADV: "Täpsem otsing" LABEL_ADV_FROM: "Saatja" LABEL_ADV_TO: "Saaja" LABEL_ADV_SUBJECT: "Pealkiri" LABEL_ADV_TEXT: "Tekst" LABEL_ADV_HAS_ATTACHMENT: "Manusega" LABEL_ADV_HAS_ATTACHMENTS: "Manustega" LABEL_ADV_FLAGGED: "Lipuga tähistatud" LABEL_ADV_UNSEEN: "Lugemata" LABEL_ADV_DATE: "Kuupäev" LABEL_ADV_DATE_ALL: "Kõik" LABEL_ADV_DATE_3_DAYS: "Kuni 3 päeva vanune" LABEL_ADV_DATE_7_DAYS: "Kuni 1 nädal vanune" LABEL_ADV_DATE_MONTH: "Kuni 1 kuu vanune" LABEL_ADV_DATE_3_MONTHS: "Kuni 3 kuu vanune " LABEL_ADV_DATE_6_MONTHS: "Kuni 6 kuu vanune" LABEL_ADV_DATE_YEAR: "Kuni 1 aasta vanune" BUTTON_ADV_SEARCH: "Otsi" PREVIEW_POPUP: FULLSCREEN: "Täisekraan sisse/välja" ZOOM: "Suurenda/vähenda" CLOSE: "Sulge (Esc)" LOADING: "Laadin..." GALLERY_PREV: "Eelmine (nool vasakule)" GALLERY_NEXT: "Järgmine (nool paremale)" GALLERY_COUNTER: "%curr%. %total%-st" IMAGE_ERROR: "Pilti ei olnud võimalik laadida." AJAX_ERROR: "Sisu ei olnud võimalik laadida." FOLDER_LIST: BUTTON_COMPOSE: "Koosta uus kiri" BUTTON_CONTACTS: "Kontaktid" BUTTON_NEW_MESSAGE: "Uus kiri" INBOX_NAME: "Saabunud kirjad" SENT_NAME: "Saadetud kirjad" DRAFTS_NAME: "Mustandid" SPAM_NAME: "Rämpspost" TRASH_NAME: "PrĂĽgikast" ARCHIVE_NAME: "Arhiiv" QUOTA: TITLE: "Andmemaht" MESSAGE_LIST: BUTTON_RELOAD: "Laadi kirjade nimekiri uuesti" BUTTON_MOVE_TO: "Liiguta kausta" BUTTON_DELETE: "Kustuta" BUTTON_ARCHIVE: "Arhiveeri" BUTTON_SPAM: "Märgi rämpspostiks" BUTTON_NOT_SPAM: "Ei ole rämpspost" BUTTON_EMPTY_FOLDER: "TĂĽhjenda kaust" BUTTON_MULTY_FORWARD: "Edasta manus(t)ena" BUTTON_DELETE_WITHOUT_MOVE: "Kustuta lõplikult" BUTTON_MORE: "Näita rohkem" MENU_SET_SEEN: "Märgi loetuks" MENU_SET_ALL_SEEN: "Märgi kõik loetuks" MENU_UNSET_SEEN: "Märgi lugemata kirjaks" MENU_SET_FLAG: "Tähista lipuga" MENU_UNSET_FLAG: "Eemalda lipp" MENU_SELECT_ALL: "Kõik" MENU_SELECT_NONE: "Ăśhtegi" MENU_SELECT_INVERT: "Pööra valik ĂĽmber" MENU_SELECT_UNSEEN: "Lugemata" MENU_SELECT_SEEN: "Loetud" MENU_SELECT_FLAGGED: "Lipuga märgitud" MENU_SELECT_UNFLAGGED: "Lipuga märkimata" EMPTY_LIST: "TĂĽhi nimekiri" EMPTY_SEARCH_LIST: "Otsingule ei vastanud ĂĽhtegi kirja" SEARCH_RESULT_FOR: "Vasted otsingule \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "tagasi kirjade nimekirja" LIST_LOADING: "Laadimine" EMPTY_SUBJECT_TEXT: "(Pealkiri puudub)" PUT_MESSAGE_HERE: "Sikuta siia kiri, mida soovid nimekirjas näha" TODAY_AT: "täna kell %TIME%" YESTERDAY_AT: "eile kell %TIME%" SEARCH_PLACEHOLDER: "Otsi" NEW_MESSAGE_NOTIFICATION: "Sulle on %COUNT% uut kirja!" QUOTA_SIZE: "Kasutad %SIZE% (%PROC%%) lubatud kettamahust %LIMIT%" MESSAGE: BUTTON_EDIT: "Muuda" BUTTON_BACK: "Tagasi" BUTTON_CLOSE: "Sulge" BUTTON_DELETE: "Kustuta" BUTTON_ARCHIVE: "Arhiveeri" BUTTON_SPAM: "Märgi rämpspostiks" BUTTON_NOT_SPAM: "Ei ole rämpspost" BUTTON_MOVE_TO: "Liiguta kausta" BUTTON_MORE: "Näita rohkem" BUTTON_REPLY: "Vasta" BUTTON_REPLY_ALL: "Vasta kõigile" BUTTON_FORWARD: "Edasta" BUTTON_FORWARD_AS_ATTACHMENT: "Edasta manusena" BUTTON_EDIT_AS_NEW: "Kasuta uue kirja põhjana" BUTTON_SHOW_IMAGES: "Näita väljast lingitud pilte" BUTTON_NOTIFY_READ_RECEIPT: "Saatja palub end teavitada kirja kättesaamisest." BUTTON_IN_NEW_WINDOW: "Näita eraldi aknas" BUTTON_THREAD_LIST: "Vestluse lõimede nimekiri" BUTTON_THREAD_PREV: "Eelmine" BUTTON_THREAD_NEXT: "Järgmine" BUTTON_THREAD_MORE: "Rohkem kirju" MENU_HEADERS: "Näita kirja päised" MENU_VIEW_ORIGINAL: "Näita lähteteksti" MENU_DOWNLOAD_ORIGINAL: "Laadi alla .eml failina" MENU_FILTER_SIMILAR: "Filtreeri sarnased kirjad" MENU_PRINT: "Prindi" EMPTY_SUBJECT_TEXT: "(Pealkiri puudub)" LABEL_SUBJECT: "Pealkiri" LABEL_DATE: "Kuupäev" LABEL_FROM: "Saatja" LABEL_FROM_SHORT: "saatja" LABEL_TO: "Saaja" LABEL_TO_SHORT: "saaja" LABEL_CC: "Koopia" LABEL_BCC: "Pimekoopia" LABEL_REPLY_TO: "Vastuse saaja" PRINT_LABEL_FROM: "Saatja" PRINT_LABEL_TO: "Saaja" PRINT_LABEL_CC: "Koopia" PRINT_LABEL_BCC: "Pimekoopia" PRINT_LABEL_REPLY_TO: "Vastuse saaja " PRINT_LABEL_DATE: "Kuupäev" PRINT_LABEL_SUBJECT: "Pealkiri" PRINT_LABEL_ATTACHMENTS: "Manused" MESSAGE_LOADING: "Laadimine" MESSAGE_VIEW_DESC: "Vali nimekirjast kiri, mida siin näidata" PGP_PASSWORD_INPUT_PLACEHOLDER: "Salasõna" PGP_SIGNED_MESSAGE_DESC: "OpenPGP abil signeeritud kiri (kliki verifitseerimiseks)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP abil krĂĽpteeritud kiri (kliki dekrĂĽpteerimiseks)" LINK_DOWNLOAD_AS_ZIP: "Laadi alla .zip failina" LINK_SAVE_TO_OWNCLOUD: "Salvesta ownCloudi" LINK_SAVE_TO_DROPBOX: "Salvesta Dropboxi" READ_RECEIPT: SUBJECT: "Kohaletoimetamise kinnitus - %SUBJECT%" BODY: | See on kohaletoimetamise kinnitus kirjale, mille saatsid aadressile %READ-RECEIPT%. Tähelepanu: Kinnitus tähendab vaid seda, et kirja kuvati saaja arvutis. Kirja sisu lugemise või mõistmise kohta see teavitus granatiisid ei anna. SUGGESTIONS: SEARCHING_DESC: "Otsin..." CONTACTS: LEGEND_CONTACTS: "Kontaktid" SEARCH_INPUT_PLACEHOLDER: "Otsi" BUTTON_ADD_CONTACT: "Lisa kontakt" BUTTON_CREATE_CONTACT: "Lisa" BUTTON_UPDATE_CONTACT: "Salvesta" BUTTON_IMPORT: "Impordi (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Ekspordi (vcf, vCard)" BUTTON_EXPORT_CSV: "Ekspordi (csv)" ERROR_IMPORT_FILE: "Viga importimisel (puudulik faili formaat)" LIST_LOADING: "Laadimine" EMPTY_LIST: "Kontaktid puuduvad" EMPTY_SEARCH: "Kontakte ei leitud" CLEAR_SEARCH: "Puhasta otsinguväli" CONTACT_VIEW_DESC: "Vali nimekirjast kontakt, mida siin näidata" LABEL_DISPLAY_NAME: "Kuvatav nimi" LABEL_EMAIL: "E-post" LABEL_PHONE: "Telefon" LABEL_WEB: "Veebileht" LABEL_BIRTHDAY: "SĂĽnnipäev" LINK_ADD_EMAIL: "Lisa e-posti aadress" LINK_ADD_PHONE: "Lisa telefon" LINK_BIRTHDAY: "SĂĽnnipäev" PLACEHOLDER_ENTER_DISPLAY_NAME: "Sisesta kuvatav nimi" PLACEHOLDER_ENTER_LAST_NAME: "Sisesta perenimi" PLACEHOLDER_ENTER_FIRST_NAME: "Sisesta eesnimi" PLACEHOLDER_ENTER_NICK_NAME: "Sisesta hĂĽĂĽdnimi" LABEL_READ_ONLY: "Ainult lugemisõigus" LABEL_SHARE: "Jaga" ADD_MENU_LABEL: "Lisa" ADD_MENU_NICKNAME: "HĂĽĂĽdnimi" ADD_MENU_NOTES: "Märkmed" ADD_MENU_EMAIL: "E-post" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Aadress" ADD_MENU_BIRTHDAY: "SĂĽnnipäev" ADD_MENU_TAGS: "Sildid" BUTTON_SHARE_NONE: "Puudub" BUTTON_SHARE_ALL: "Kõigiga" BUTTON_SYNC: "SĂĽnkroniseerimine (CardDAV)" COMPOSE: TITLE_FROM: "Saatja" TITLE_TO: "Saaja" TITLE_CC: "Koopia" TITLE_BCC: "Pimekoopia" TITLE_REPLY_TO: "Vastuse saaja " TITLE_SUBJECT: "Pealkiri" LINK_SHOW_INPUTS: "näita kõiki väljasid" BUTTON_SEND: "Saada" BUTTON_SAVE: "Salvesta" BUTTON_DELETE: "Kustuta" BUTTON_CANCEL: "TĂĽhista" BUTTON_MINIMIZE: "Vähenda miinimumini" SAVED_TIME: "Salvestati %TIME%" SAVED_ERROR_ON_SEND: "Kiri saadeti, aga seda ei salvestatud saadetud kirjade kausta" DISCARD_UNSAVED_DATA: "Kustutan salvestamata andmed?" ATTACH_FILES: "Lisa faile" ATTACH_DROP_FILES_DESC: "Sikuta failid siia" ATTACH_ITEM_CANCEL: "TĂĽhista" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% kirjutas" FORWARD_MESSAGE_TOP_TITLE: "-------- Edastatud kiri -------" FORWARD_MESSAGE_TOP_FROM: "Saatja" FORWARD_MESSAGE_TOP_TO: "Saaja" FORWARD_MESSAGE_TOP_CC: "Koopia" FORWARD_MESSAGE_TOP_SENT: "Saadetud" FORWARD_MESSAGE_TOP_SUBJECT: "Pealkiri" EMPTY_TO_ERROR_DESC: "Lisa vähemalt ĂĽks adressaat" NO_ATTACHMENTS_HERE_DESC: "Manused puuduvad." ATTACHMENTS_ERROR_DESC: "Tähelepanu! Kõiki manuseid ei ole ĂĽles laetud." ATTACHMENTS_UPLOAD_ERROR_DESC: "Kõiki manuseid ei ole veel ĂĽles laetud." BUTTON_REQUEST_READ_RECEIPT: "Palu lugemise kohta kinnitust" BUTTON_MARK_AS_IMPORTANT: "Tähista olulisena" BUTTON_OPEN_PGP: "OpenPGP (Vaid lihttekstina)" BUTTON_REQUEST_DSN: "Palu kättesaamise kohta kinnitust" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Sulge" POPUPS_ASK: BUTTON_YES: "Jah" BUTTON_NO: "Ei" DESC_WANT_CLOSE_THIS_WINDOW: "Kas oled kindel, et soovid akna sulgeda?" DESC_WANT_DELETE_MESSAGES: "Kas oled kindel, et soovid sõnumi(d) kustutada?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Vali oma keel" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Lisan konto?" BUTTON_ADD_ACCOUNT: "Lisa" TITLE_UPDATE_ACCOUNT: "Muudan kontot?" BUTTON_UPDATE_ACCOUNT: "Muuda" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Lisan identiteedi?" TITLE_UPDATE_IDENTITY: "Muudan identiteeti?" BUTTON_ADD_IDENTITY: "Lisa" BUTTON_UPDATE_IDENTITY: "Muuda" LABEL_EMAIL: "E-post" LABEL_NAME: "Nimi" LABEL_REPLY_TO: "Vastuse saaja " LABEL_SIGNATURE: "Signatuur" LABEL_CC: "Koopia" LABEL_BCC: "Pimekoopia" LABEL_SIGNATURE_INSERT_BEFORE: "Sisesta see signatuur kirjades enne tsiteeritud teksti" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Loon kausta?" LABEL_NAME: "Kausta nimi" LABEL_PARENT: "Ăślemkaust" BUTTON_CREATE: "Loo" BUTTON_CANCEL: "TĂĽhista" BUTTON_CLOSE: "Sulge" TITLE_CREATING_PROCESS: "Loon kausta" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "TĂĽhjendan kausta kirjadest?" BUTTON_CLEAR: "TĂĽhjenda" BUTTON_CANCEL: "TĂĽhista" BUTTON_CLOSE: "Sulge" DANGER_DESC_WARNING: "Tähelepanu!" DANGER_DESC_HTML_1: "See tegevus kustutab täielikult kõik kirjad kaustast %FOLDER%." DANGER_DESC_HTML_2: "Juba alustatud protsessi ei saa tĂĽhistada või katkestada." TITLE_CLEARING_PROCESS: "TĂĽhjendan kausta..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Impordi OpenPGP võti" BUTTON_IMPORT_OPEN_PGP_KEY: "Impordi" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Vaata OpenPGP võtit" BUTTON_SELECT: "Vali" BUTTON_CLOSE: "Sulge" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Genereeri OpenPGP võtmed" LABEL_EMAIL: "E-post" LABEL_NAME: "Nimi" LABEL_PASSWORD: "Salasõna" LABEL_KEY_BIT_LENGTH: "Võtme pikkus" BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereeri" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP allkirjastamine/krĂĽpteerimine" LABEL_SIGN: "Allkirjasta" LABEL_ENCRYPT: "KrĂĽpteeri" LABEL_PASSWORD: "Salasõna" BUTTON_SIGN: "Allkirjasta" BUTTON_ENCRYPT: "KrĂĽpteeri" BUTTON_SIGN_AND_ENCRYPT: "Allkirjasta ja krĂĽpteeri" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP dekrĂĽpteerimine" LABEL_KEY: "Privaatne võti " LABEL_PASSWORD: "Salasõna" BUTTON_DECRYPT: "DekrĂĽpteeri" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2. faktori kontroll" LABEL_CODE: "Kood" BUTTON_TEST: "Kontrolli" POPUPS_FILTER: TITLE_CREATE_FILTER: "Filtri loomine" TITLE_EDIT_FILTER: "Filtri muutmine" FILTER_NAME: "Nimi" LEGEND_CONDITIONS: "Tingimused" LEGEND_ACTIONS: "Tegevused" BUTTON_DONE: "Valmis" BUTTON_ADD_CONDITION: "Lisa tingimus" SELECT_ACTION_NONE: "Puudub" SELECT_ACTION_MOVE_TO: "Liiguta kausta" SELECT_ACTION_FORWARD_TO: "Edasta saajale" SELECT_ACTION_REJECT: "LĂĽkka tagasi" SELECT_ACTION_VACATION_MESSAGE: "Puhkuse teade" SELECT_ACTION_DISCARD: "HĂĽlga" SELECT_FIELD_FROM: "Saatja" SELECT_FIELD_RECIPIENTS: "Saaja" SELECT_FIELD_SUBJECT: "Pealkiri" SELECT_FIELD_HEADER: "Päis" SELECT_FIELD_SIZE: "Suurus" SELECT_TYPE_CONTAINS: "Sisaldab" SELECT_TYPE_NOT_CONTAINS: "Ei sisalda" SELECT_TYPE_MATCHES: "On vaste päringule (* ja ? on toetatud)" SELECT_TYPE_NOT_MATCHES: "Ei ole vaste päringule (* ja ? on toetatud)" SELECT_TYPE_REGEXP: "Vastab regulaaravaldisele" SELECT_TYPE_NOT_REGEXP: "Ei vasta regulaaravaldisele" SELECT_TYPE_EQUAL_TO: "Võrdub" SELECT_TYPE_NOT_EQUAL_TO: "Ei võrdu" SELECT_TYPE_OVER: "Ăśle" SELECT_TYPE_UNDER: "Alla" SELECT_MATCH_ANY: "Vastab ĂśHELE järgmistest reeglitest" SELECT_MATCH_ALL: "Vastab KĂ•IGILE järgmistest reeglitest" MARK_AS_READ_LABEL: "Märgi loetuks" REPLY_INTERVAL_LABEL: "Vastuse intervall (päevades)" KEEP_LABEL: "Salvesta" STOP_LABEL: "Ă„ra peata reeglite protsessimist" EMAIL_LABEL: "E-post" VACATION_SUBJECT_LABEL: "Pealkiri (valikuline)" VACATION_MESSAGE_LABEL: "Sõnum" VACATION_RECIPIENTS_LABEL: "Saajad (eraldatud komaga)" REJECT_MESSAGE_LABEL: "TagasilĂĽkkamise sõnum" ALL_INCOMING_MESSAGES_DESC: "Kõik sisenevad kirjad" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Vali sĂĽsteemsed kaustad" SELECT_CHOOSE_ONE: "Vali ĂĽks" SELECT_UNUSE_NAME: "Ă„ra kasuta" LABEL_SENT: "Saadetud" LABEL_DRAFTS: "Mustandid" LABEL_SPAM: "Rämpspost" LABEL_TRASH: "PrĂĽgikast" LABEL_ARCHIVE: "Arhiiv" BUTTON_CANCEL: "TĂĽhista" BUTTON_CLOSE: "Sulge" NOTIFICATION_SENT: | Sa pole valinud sĂĽsteemset kausta saadetud kirjadele. Kui sa ei soovi saadetud kirju salvestada, vali "Ă„ra kasuta". NOTIFICATION_DRAFTS: "Sa pole valinud kausta, kuhu mustandid kirjutamise ajal salvestatakse." NOTIFICATION_SPAM: | Sa pole valinud sĂĽsteemset kausta rämpspostiks märgitud kirjadele. Kui sa ei soovi rämpspostiks märgitud kirju salvestada, vali "Ă„ra kasuta". NOTIFICATION_TRASH: | Sa pole valinud sĂĽsteemset kausta kustutatud kirjadele. Kui sa ei soovi kustutatud kirju salvestada, vali "Ă„ra kasuta". NOTIFICATION_ARCHIVE: "Sa pole valinud kausta, kuhu arhiveeritud kirjad salvestatakse." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2. faktoriga autentimine (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Luba 2. faktoriga autentimine" LABEL_TWO_FACTOR_USER: "Kasutaja" LABEL_TWO_FACTOR_STATUS: "Staatus" LABEL_TWO_FACTOR_SECRET: "Kood" LABEL_TWO_FACTOR_BACKUP_CODES: "Tagavarakoodid" BUTTON_CREATE: "Loo kood" BUTTON_ACTIVATE: "Aktiveeri" BUTTON_CLEAR: "Puhasta" BUTTON_LOGOUT: "Logi välja" BUTTON_DONE: "Valmis" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Näita koodi" BUTTON_HIDE_SECRET: "Peida kood" TWO_FACTOR_REQUIRE_DESC: "Sinu konto nõuab 2. faktoriga autentimist." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Seadistatud" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Seadistamata" TWO_FACTOR_SECRET_DESC: > Impordi see info oma Google Authenticator klienti (või mõnesse teise TOTP klienti) kasutades juuresolevat QR koodi või käsitsi sisestades. TWO_FACTOR_BACKUP_CODES_DESC: > Kui sul ei õnnestu Google Authenticatori (või muu TOTP kliendi) abil siseneda, võid kasutada sisenemiseks varukoode. Kui oled varukoodi korra kasutanud, lõpetab see töö. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Seda sätet ei saa enne testimist muuta." TITLES: LOADING: "Laadin" LOGIN: "Sisenemine" MAILBOX: "Postkast" SETTINGS: "Sätted" COMPOSE: "Koosta uus kiri" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Fail on liiga suur" ERROR_FILE_PARTIALLY_UPLOADED: "Tundmatu vea tõttu laaditi fail ĂĽles osaliselt" ERROR_NO_FILE_UPLOADED: "Faili pole ĂĽles laetud" ERROR_MISSING_TEMP_FOLDER: "Ajutine fail puudub" ERROR_ON_SAVING_FILE: "Faili ĂĽleslaadimisel tekkis tundmatu iseloomuga viga" ERROR_FILE_TYPE: "Puudulik faili tĂĽĂĽp" ERROR_UNKNOWN: "Faili ĂĽleslaadimisel tekkis tundmatu iseloomuga viga" EDITOR: TEXT_SWITCHER_RICH_FORMATTING: "Rikastekst" TEXT_SWITCHER_CONFIRM: "Teksti vorming ja sellesse sisestatud pildid lähevad kaduma. Kas oled kindel, et soovid jätkata?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Isiklik" LABEL_GENERAL_NAME: "Ăśldine" LABEL_CONTACTS_NAME: "Kontaktid" LABEL_FOLDERS_NAME: "Kaustad" LABEL_ACCOUNTS_NAME: "Kontod" LABEL_IDENTITY_NAME: "Identiteet" LABEL_IDENTITIES_NAME: "Identiteedid" LABEL_FILTERS_NAME: "Filtrid" LABEL_TEMPLATES_NAME: "Põhjad" LABEL_SECURITY_NAME: "Turvalisus" LABEL_SOCIAL_NAME: "Sotsiaalne" LABEL_THEMES_NAME: "Teemad" LABEL_CHANGE_PASSWORD_NAME: "Salasõna" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Tagasi" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtrid" BUTTON_SAVE: "Salvesta" BUTTON_ADD_FILTER: "Lisa filter" BUTTON_DELETE: "Kustuta" BUTTON_RAW_SCRIPT: "Kasuta oma skripti" SUBNAME_NONE: "Puuduvad" SUBNAME_MOVE_TO: "Liiguta kausta \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Edasta aadressile \"%EMAIL%\"" SUBNAME_REJECT: "LĂĽkka tagasi" SUBNAME_VACATION_MESSAGE: "Puhkuse teade" SUBNAME_DISCARD: "HĂĽlga" CAPABILITY_LABEL: "Võimekus" LOADING_PROCESS: "Värskendan filtrite nimekirja" DELETING_ASK: "Kas oled kindel?" CHACHES_NEED_TO_BE_SAVED_DESC: "Need muudatused tuleb salvestada serverisse." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identiteet" LABEL_DISPLAY_NAME: "Nimi" LABEL_REPLY_TO: "Vastuse saaja" LABEL_SIGNATURE: "Signatuur" LABEL_ADD_SIGNATURE_TO_ALL: "Lisa oma signatuur kõikidele väljuvatele kirjadele" SETTINGS_SECURITY: LEGEND_SECURITY: "Turvalisus" LABEL_CONFIGURE_TWO_FACTOR: "Seadista 2. faktoriga autentimine" LABEL_AUTOLOGOUT: "Automaatne välja logimine" AUTOLOGIN_NEVER_OPTION_NAME: "Mitte kunagi" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutit" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% tund(i)" SETTINGS_GENERAL: LEGEND_GENERAL: "Ăśldine" LABEL_LANGUAGE: "Keel" LABEL_IDENTITY: "Identiteet" LABEL_LAYOUT: "Vaade" LABEL_LAYOUT_NO_SPLIT: "Jaotuseta" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikaalse jaotusega" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontaalse jaotusega" LABEL_EDITOR: "Vaikimisi tekstiredaktor" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Lihttekst" LABEL_EDITOR_HTML_FORCED: "HTML (kohustuslik)" LABEL_EDITOR_PLAIN_FORCED: "Lihttekst (kohustuslik)" LABEL_ANIMATION: "Kasutajaliidese animatsioonid" LABEL_ANIMATION_FULL: "Kõik" LABEL_ANIMATION_NORMAL: "Normaalne" LABEL_ANIMATION_NONE: "Puuduvad" LABEL_VIEW_OPTIONS: "Vaate seaded" LABEL_USE_PREVIEW_PANE: "Kasuta eelvaadet" LABEL_USE_CHECKBOXES_IN_LIST: "Kuva nimekirjas valikukastikesi" LABEL_USE_THREADS: "Kasuta vestluse lõimesid" LABEL_REPLY_SAME_FOLDER: "Pane vastused samasse kausta, kus asub vastatud kiri" LABEL_SHOW_IMAGES: "Näita alati kirja sisus viidatud väliseid pilte" LABEL_SHOW_ANIMATION: "Näita anomatsioone" LABEL_MESSAGE_PER_PAGE: "Lehel kuvatavate kirjade arv" LABEL_NOTIFICATIONS: "Teavitused" LABEL_SOUND_NOTIFICATION: "Teavitused heliga" LABEL_CHROME_NOTIFICATION_DESC: "Näita uute kirjade teavitust hĂĽpikaknaga" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Veebilehitseja poolt blokeeritud)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontaktid" LABEL_CONTACTS_AUTOSAVE: "Lisa saajad automaatselt aadressiraamatusse" LEGEND_CONTACTS_SYNC: "Väline sĂĽnkroniseerimine (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Luba väline sĂĽnkroniseerimine" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Aadressiraamatu URL" LABEL_CONTACTS_SYNC_USER: "Kasutaja" LABEL_CONTACTS_SYNC_PASSWORD: "Salasõna" SETTINGS_THEMES: LEGEND_THEMES: "Teemad" LEGEND_THEMES_CUSTOM: "Teema kohandamine" LABEL_CUSTOM_TYPE: "TĂĽĂĽp" LABEL_CUSTOM_TYPE_LIGHT: "Hele" LABEL_CUSTOM_TYPE_DARK: "Tume" LABEL_CUSTOM_BACKGROUND_IMAGE: "Taust" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Laadi ĂĽles taustapilt (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Fail on liiga suur" ERROR_FILE_TYPE_ERROR: "Faili tĂĽĂĽp ei sobi (lubatud on ainult JPG ja PNG)" ERROR_UNKNOWN: "Leidis aset tundmatu faili ĂĽleslaadimise viga" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Ăśhenda Google" BUTTON_GOOGLE_DISCONNECT: "Ăśhenda Google lahti" MAIN_GOOGLE_DESC: "Peale Google abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Google nupule sisselogimise lehel" LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Ăśhenda Facebook" BUTTON_FACEBOOK_DISCONNECT: "Ăśhenda Facebook lahti" MAIN_FACEBOOK_DESC: "Peale Facebooki abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Facebook nupule sisselogimise lehel" LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Ăśhenda Twitter" BUTTON_TWITTER_DISCONNECT: "Ăśhenda Twitter lahti" MAIN_TWITTER_DESC: "Peale Twitteri abil sisselogimise võimaldamist, saad sellele kontole siseneda klikkides Twitter nupule sisselogimise lehel" SETTINGS_FOLDERS: LEGEND_FOLDERS: "Kaustade nimekiri" BUTTON_CREATE: "Loo kaust" BUTTON_DELETE: "Kustuta" BUTTON_SUBSCRIBE: "Telli" BUTTON_UNSUBSCRIBE: "Loobu tellimusest" LOADING_PROCESS: "Värskendan kaustada nimekirja" CREATING_PROCESS: "Loon kasuta" DELETING_PROCESS: "Kustutan kausta" RENAMING_PROCESS: "Nimetan kausta ĂĽmber" DELETING_ASK: "Oled kindel?" TO_MANY_FOLDERS_DESC_1: "Sul on liiga palju kaustu!" TO_MANY_FOLDERS_DESC_2: "Näitame sulle neist vaid osa, et vältida jõudlusprobleeme." HELP_DELETE_FOLDER: "Kustuta kaust" HELP_SHOW_HIDE_FOLDER: "Näita/peida kaust" HELP_CHECK_FOR_NEW_MESSAGES: "Kontrolli/ära kontrolli uusi kirju" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Kontod" LEGEND_IDENTITIES: "Identiteedid" LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontod ja identiteedid" BUTTON_ADD_ACCOUNT: "Lisa konto" BUTTON_ADD_IDENTITY: "Lisa identiteet" BUTTON_DELETE: "Kustuta" LOADING_PROCESS: "Värskendan..." DELETING_ASK: "Kas oled kindel?" DEFAULT_IDENTITY_LABEL: "vaikimisi" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identiteet" LEGEND_IDENTITIES: "Täiendavad identiteedid" LABEL_DEFAULT: "Vaikimisi" LABEL_DISPLAY_NAME: "Nimi" LABEL_REPLY_TO: "Vastuse saaja " LABEL_SIGNATURE: "Signatuur" LABEL_ADD_SIGNATURE_TO_ALL: "Lisa oma signatuur väljuvatele kirjadele" BUTTON_ADD_IDENTITY: "Lisa identiteet" BUTTON_DELETE: "Kustuta" LOADING_PROCESS: "Värskendan identiteetide nimekirja" DELETING_ASK: "Kas oled kindel?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Muuda salasõna" LABEL_CURRENT_PASSWORD: "Kehtiv salasõna" LABEL_NEW_PASSWORD: "Uus salasõna" LABEL_REPEAT_PASSWORD: "Kinnita uus salasõna" BUTTON_UPDATE_PASSWORD: "Määra uus salasõna" ERROR_PASSWORD_MISMATCH: "Salasõnad ei kattu, palun proovi uuesti" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Impordi OpenPGP võti" BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereeri OpenPGP võti" TITLE_PRIVATE: "Privaatne" TITLE_PUBLIC: "Avalik" DELETING_ASK: "Oled kindel?" GENERATE_ONLY_HTTPS: "Ainult HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Klaviatuuri kombinatsioonide abi" TAB_MAILBOX: "Postkast" TAB_MESSAGE_LIST: "Kirjade nimekiri" TAB_MESSAGE_VIEW: "Kirja vaade" TAB_COMPOSE: "Kirja koostamine" LABEL_OPEN_USER_DROPDOWN: "Ava kasutaja sätted" LABEL_REPLY: "Vasta" LABEL_REPLY_ALL: "Vasta kõigile" LABEL_FORWARD: "Edasta" LABEL_FORWARD_MULTIPLY: "Edasta manusena" LABEL_HELP: "Abi" LABEL_CHECK_ALL: "Vali kõik kirjad" LABEL_ARCHIVE: "Arhiveeri" LABEL_DELETE: "Kustuta" LABEL_OPEN_THREAD: "Ava valitud lõim" LABEL_MOVE: "Liiguta" LABEL_READ: "Märgi valitud kiri loetuks" LABEL_UNREAD: "Märgi valitud kiri kui lugemata" LABEL_IMPORTANT: "Märgi kiri lipuga" LABEL_SEARCH: "Otsi" LABEL_CANCEL_SEARCH: "TĂĽhista otsing" LABEL_FULLSCREEN_ENTER: "Täisekraan (eelvaatega)" LABEL_VIEW_MESSAGE_ENTER: "Näita kirja (ilma eelvaateta)" LABEL_SWITCH_TO_MESSAGE: "Vii fookus valitud kirjale" LABEL_SWITCH_TO_FOLDER_LIST: "Vii fookus kirjade nimekirjale" LABEL_FULLSCREEN_TOGGLE: "Täisekraani vaate lĂĽlitamine" LABEL_BLOCKQUOTES_TOGGLE: "Tsitaatide lĂĽlitamine" LABEL_THREAD_NEXT: "Järgmine kiri lõimes" LABEL_THREAD_PREV: "Eelmine kiri lõimes" LABEL_PRINT: "Prindi" LABEL_EXIT_FULLSCREEN: "Välju täisekraani vaatest" LABEL_CLOSE_MESSAGE: "Sulge kiri (ilma eelvaateta)" LABEL_SWITCH_TO_LIST: "Vii fookus tagasi kirjade nimekirjale" LABEL_OPEN_COMPOSE_POPUP: "Ava uue kirja hĂĽpikaken" LABEL_MINIMIZE_COMPOSE_POPUP: "Tee uue kirja aken väikseks" LABEL_OPEN_IDENTITIES_DROPDOWN: "Ava identiteetide valik" LABEL_SAVE_MESSAGE: "Salvesta kiri" LABEL_SEND_MESSAGE: "Saada kiri" LABEL_CLOSE_COMPOSE: "Sulge kirja koostamise aken" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Avalikke võtmeid ei leitud" NO_PUBLIC_KEYS_FOUND_FOR: "Avalikke võtmeid aadressile \"%EMAIL%\" ei leitud" NO_PRIVATE_KEY_FOUND: "Salajasi võtmeid ei leitud" NO_PRIVATE_KEY_FOUND_FOR: "Salajast võtit aadressile \"%EMAIL%\" ei leitud" ADD_A_PUBLICK_KEY: "Lisa avalik võti" SELECT_A_PRIVATE_KEY: "Lisa privaatne võti" UNVERIFIRED_SIGNATURE: "Verifitseerimata allkiri" DECRYPTION_ERROR: "OpenPGP dekrĂĽpteerimise viga" GOOD_SIGNATURE: "Korralik signatuur kasutajalt %USER%" PGP_ERROR: "OpenPGP viga: %ERROR%" SPECIFY_FROM_EMAIL: "Palun määra KELLELT e-posti aadress" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Palun määra vähemalt ĂĽks saaja" NOTIFICATIONS: INVALID_TOKEN: "Puudulik tõend" AUTH_ERROR: "Autentimine ebaõnnestus" ACCESS_ERROR: "Ligipääsu viga" CONNECTION_ERROR: "Serveriga ĂĽhendumine ebaõnnestus" CAPTCHA_ERROR: "Puudulik CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > See sotsiaalvõrgustiku kasutaja ei ole seotud ĂĽhegi e-posti kontoga. Sisene esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto sätete all. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > See sotsiaalvõrgustiku kasutaja ei ole seotud ĂĽhegi e-posti kontoga. Sisene esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto sätete all. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > See sotsiaalvõrgustiku kasutaja ei ole seotud ĂĽhegi e-posti kontoga. Sisene esmalt e-posti konto andmetega ja seo sotsiaalvõrgustiku konto sellega konto sätete all. DOMAIN_NOT_ALLOWED: "Domeenil ei ole lubatud siseneda" ACCOUNT_NOT_ALLOWED: "Kasutajakontol ei ole lubatud siseneda" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Kahe faktoriga autentimine on kohustuslik" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kahe faktoriga autentimise viga" COULD_NOT_SAVE_NEW_PASSWORD: "Uut salasõna ei suudetud salvestada" CURRENT_PASSWORD_INCORRECT: "Sisestatud kehtiv salasõna oli vale" NEW_PASSWORD_SHORT: "Salasõna on liiga lĂĽhikene" NEW_PASSWORD_WEAK: "Salasõna on liiga lihtne" NEW_PASSWORD_FORBIDDENT: "Salasõna sisaldab keelatud märke" CONTACTS_SYNC_ERROR: "Kontaktide sĂĽnkroniseerimise viga" CANT_GET_MESSAGE_LIST: "Kirjade nimekirja laadimine ebaõnnestus" CANT_GET_MESSAGE: "Kirja laadimine ebaõnnestus" CANT_DELETE_MESSAGE: "Kirja kustutamine ebaõnnestus" CANT_MOVE_MESSAGE: "Kirja liigutamine ebaõnnestus" CANT_SAVE_MESSAGE: "Kirja salvestamine ebaõnnestus" CANT_SEND_MESSAGE: "Kirja saatmine ebaõnnestus" INVALID_RECIPIENTS: "Puudulikud saajad" CANT_SAVE_FILTERS: "Filtri salvestamine ebaõnnestus" CANT_GET_FILTERS: "Filtrite laadimine ebaõnnestus" FILTERS_ARE_NOT_CORRECT: "Filtrid on puudulikud" CANT_CREATE_FOLDER: "Kausta loomine ebaõnnestus" CANT_RENAME_FOLDER: "Kausta ĂĽmbernimetamine ebaõnnestus" CANT_DELETE_FOLDER: "Kausta kustutamine ebaõnnestus" CANT_DELETE_NON_EMPTY_FOLDER: "Kirju sisaldavat kausta pole võimalik kustutada" CANT_SUBSCRIBE_FOLDER: "Kausta tellimine ebaõnnestus." CANT_UNSUBSCRIBE_FOLDER: "Kausta tellimisest loobumine ebaõnnestus." CANT_SAVE_SETTINGS: "Sätete salvestamine ebaõnnestus" CANT_SAVE_PLUGIN_SETTINGS: "Sätete salvestamine ebaõnnestus" DOMAIN_ALREADY_EXISTS: "Domeen juba eksisteerib" CANT_INSTALL_PACKAGE: "Laienduse paigaldamine ebaõnnestus" CANT_DELETE_PACKAGE: "Laienduse eemaldamine ebaõnnestus" INVALID_PLUGIN_PACKAGE: "Puudulik laienduse pakk" UNSUPPORTED_PLUGIN_PACKAGE: "Laienduse pakk pole toetatud" LICENSING_SERVER_IS_UNAVAILABLE: "Litsentsiserver ei olnud saadaval" LICENSING_DOMAIN_EXPIRED: "Selle domeeni litents on aegunud" LICENSING_DOMAIN_BANNED: "Selle domeeni litents on kehtetu" DEMO_SEND_MESSAGE_ERROR: "Turvalisusega seotud põhjustel ei ole sellel kontol lubatud saata kirju välistele aadressidele!" DEMO_ACCOUNT_ERROR: "Turvalisusega seotud põhjustel ei ole sellel kontol lubatud soovitud toimingut teostada!" ACCOUNT_ALREADY_EXISTS: "Konto juba eksisteerib" ACCOUNT_DOES_NOT_EXIST: "Kontot veel ei eksisteeri" MAIL_SERVER_ERROR: "E-posti serveri poole pöördumisel tekkis viga" INVALID_INPUT_ARGUMENT: "Puudulik sisendi arument" UNKNOWN_ERROR: "Tundmatu viga" STATIC: BACK_LINK: "Taaslae" DOMAIN_LIST_DESC: "Nimekiri domeenidest, mille poole veebipõhisel e-posti kliendil on lubatud pöörduda" PHP_EXSTENSIONS_ERROR_DESC: "Sinu PHP konfiguratsioon ei sisalda nõutud PHP laiendusi." PHP_VERSION_ERROR_DESC: "Sinu PHP versioon (%VERSION%) on väiksem, kui minimaalselt nõutud 5.3.0!" NO_SCRIPT_TITLE: "See rakendus vajab tööks JavaScripti" NO_SCRIPT_DESC: | Sinu veebilehitseja ei toeta JavaScripti. Luba selle kasutus veebilehitseja sätetes ja proovi uuesti. NO_COOKIE_TITLE: "See rakendus vajab oma tööks veebikĂĽpsiste tuge" NO_COOKIE_DESC: | Sinu veebilehitseja ei toeta veebikĂĽpsiseid. Luba nende kasutus veebilehitseja sätetes ja proovi uuesti. BAD_BROWSER_TITLE: "Sinu veebilehitseja on aegunud" BAD_BROWSER_DESC: | Rakenduse kõikide võimaluste kasutamiseks, lae alla ja paigalda mõni nendest veebilehitsejatest: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml000066400000000000000000001206651361462701300261710ustar00rootroot00000000000000fa_IR: LOGIN: LABEL_EMAIL: "پست الکترŮنیک" LABEL_LOGIN: "ŮرŮŘŻ" LABEL_PASSWORD: "گذرŮاÚه" LABEL_SIGN_ME: "مرا به خاطر بسپار" LABEL_VERIFICATION_CODE: "Ú©ŘŻ تایید" LABEL_DONT_ASK_VERIFICATION_CODE: "Ú©ŘŻ را برای 2 هŮته ŘłŮال نکن" BUTTON_SIGN_IN: "ŮرŮŘŻ" TITLE_SIGN_IN_GOOGLE: "ŮرŮŘŻ با ÚŻŮÚŻŮ„" TITLE_SIGN_IN_FACEBOOK: "ŮرŮŘŻ با Ůیس‌بŮÚ©" TITLE_SIGN_IN_TWITTER: "ŮرŮŘŻ با ŘŞŮییتر" LABEL_FORGOT_PASSWORD: "ŮرامŮŘ´ŰŚ گذرŮاÚه" LABEL_REGISTRATION: "ثبت‌نام" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "ساخت کاربر" BUTTON_SETTINGS: "تنظیمات" BUTTON_HELP: "راهنما" BUTTON_LOGOUT: "خرŮج" MOBILE: BUTTON_MOBILE_VERSION: "نسخه Ů…Ůبایل" BUTTON_DESKTOP_VERSION: "نسخه رŮمیزی" SEARCH: MAIN_INPUT_PLACEHOLDER: "جستجŮ" TITLE_ADV: "جستجŮŰŚ پیشرŮته" LABEL_ADV_FROM: "از" LABEL_ADV_TO: "به" LABEL_ADV_SUBJECT: "Ů…ŮضŮŘą" LABEL_ADV_TEXT: "متن" LABEL_ADV_HAS_ATTACHMENT: "داشتن پیŮست" LABEL_ADV_HAS_ATTACHMENTS: "داشتن پیŮست‌ها" LABEL_ADV_FLAGGED: "پرچم" LABEL_ADV_UNSEEN: "Ř®Ůانده نشده" LABEL_ADV_DATE: "تاریخ" LABEL_ADV_DATE_ALL: "همه" LABEL_ADV_DATE_3_DAYS: "تا 3 رŮز گذشته" LABEL_ADV_DATE_7_DAYS: "تا 1 هŮته گذشته" LABEL_ADV_DATE_MONTH: "تا 1 ماه گذشته" LABEL_ADV_DATE_3_MONTHS: "تا 3 ماه گذشته" LABEL_ADV_DATE_6_MONTHS: "تا 6 ماه گذشته" LABEL_ADV_DATE_YEAR: "تا 1 سال گذشته" BUTTON_ADV_SEARCH: "جستجŮ" PREVIEW_POPUP: FULLSCREEN: "ضامن تمام صŮحه" ZOOM: "بزرگنمایی داخل/بیرŮن" CLOSE: "بستن (Esc)" LOADING: "در حال بارگذاری" GALLERY_PREV: "قبلی (جهت چپ)" GALLERY_NEXT: "بعدی (جهت راست)" GALLERY_COUNTER: "%curr% از %total%" IMAGE_ERROR: "تصŮیر Ů…Ůرد نظر قابل بارگذاری نیست." AJAX_ERROR: "Ů…Ř­ŘŞŮیات Ů…Ůرد نظر قابل بارگذاری نیست." FOLDER_LIST: BUTTON_COMPOSE: "ایجاد" BUTTON_CONTACTS: "تماس‌ها" BUTTON_NEW_MESSAGE: "پیام جدید" INBOX_NAME: "صندŮŮ‚ ŮرŮŘŻŰŚ" SENT_NAME: "ارسالی‌" DRAFTS_NAME: "پیش نŮŰŚŘł" SPAM_NAME: "هرزنامه" TRASH_NAME: "سطل آشغال" ARCHIVE_NAME: "بایگانی" QUOTA: TITLE: "سهمیه استŮاده شده" MESSAGE_LIST: BUTTON_RELOAD: "بازنگری لیست پیام‌ها" BUTTON_MOVE_TO: "انتقال به" BUTTON_DELETE: "حذŮ" BUTTON_ARCHIVE: "بایگانی" BUTTON_SPAM: "هرزنامه" BUTTON_NOT_SPAM: "هرزنامه نیست" BUTTON_EMPTY_FOLDER: "پاک کردن شاخه" BUTTON_MULTY_FORWARD: "ارسال بهمراه پیŮست(ها)" BUTTON_DELETE_WITHOUT_MOVE: "حذ٠همیشگی" BUTTON_MORE: "بیشتر" MENU_SET_SEEN: "علامت‌گذاری به عنŮان Ř®Ůانده شده" MENU_SET_ALL_SEEN: "علامت‌گذاری همه بعنŮان Ř®Ůانده شده" MENU_UNSET_SEEN: "علامت‌گذاری به عنŮان Ř®Ůانده نشده" MENU_SET_FLAG: "پرچم زدن" MENU_UNSET_FLAG: "حذ٠پرچم" MENU_SELECT_ALL: "همه" MENU_SELECT_NONE: "هیچ‌کدام" MENU_SELECT_INVERT: "برعکس" MENU_SELECT_UNSEEN: "نخŮانده" MENU_SELECT_SEEN: "Ř®Ůانده" MENU_SELECT_FLAGGED: "پرچم‌دار کردن" MENU_SELECT_UNFLAGGED: "پرچم‌دار نشده" EMPTY_LIST: "Ůهرست خالی" EMPTY_SEARCH_LIST: "پیامی مطابق جستجŮŰŚ شما پیدا نشد" SEARCH_RESULT_FOR: "نتایج جستج٠مطابق \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "برگشت به لیست پیام‌ها" LIST_LOADING: "در حال بارگذاری" EMPTY_SUBJECT_TEXT: "(بدŮن Ů…ŮضŮŘą)" PUT_MESSAGE_HERE: "برای دیدن پیام در این لیست آن را به اینجا بکشید" TODAY_AT: "امرŮز در %TIME%" YESTERDAY_AT: " دیرŮز در %TIME%" SEARCH_PLACEHOLDER: "جستجŮ" NEW_MESSAGE_NOTIFICATION: "شما تعداد %COUNT% پیام جدید دارید!" QUOTA_SIZE: "استŮاده %SIZE% (%PROC%%) از%LIMIT% برای شما" MESSAGE: BUTTON_EDIT: "Ůیرایش" BUTTON_BACK: "برگشتن" BUTTON_CLOSE: "بستن" BUTTON_DELETE: "حذŮ" BUTTON_UNSUBSCRIBE: "خرŮج از این لیست" BUTTON_ARCHIVE: "بایگانی" BUTTON_SPAM: "هرزنامه" BUTTON_NOT_SPAM: "عدم هرزنامه" BUTTON_MOVE_TO: "انتقال به" BUTTON_MORE: "انتقال" BUTTON_REPLY: "پاسخ" BUTTON_REPLY_ALL: "پاسخ به همه" BUTTON_FORWARD: "ارسال به دیگران" BUTTON_FORWARD_AS_ATTACHMENT: "ارسال بهمراه پیŮست" BUTTON_EDIT_AS_NEW: "Ůیرایش بعنŮان جدید" BUTTON_SHOW_IMAGES: "نمایش تصاŮیر خارجی" BUTTON_NOTIFY_READ_RECEIPT: "Ůرستنده از Ř®Ůاندن نامه ŘŞŮسط شما مطلع Ř®Ůاهد Ř´ŘŻ" BUTTON_IN_NEW_WINDOW: "مشاهده در پنجره جداگانه" BUTTON_THREAD_LIST: "لیست نخ‌ها" BUTTON_THREAD_PREV: "قبلی" BUTTON_THREAD_NEXT: "بعدی" BUTTON_THREAD_MORE: "پیام‌های بیشتر" MENU_HEADERS: "نمایش سرصŮحه پیام" MENU_VIEW_ORIGINAL: "نمایش منبع" MENU_DOWNLOAD_ORIGINAL: "دریاŮŘŞ با پسŮند eml." MENU_FILTER_SIMILAR: " Ůیلتر کردن پیام‌های مشابه" MENU_PRINT: "چاپ" EMPTY_SUBJECT_TEXT: "(بدŮن Ů…ŮضŮŘą)" LABEL_SUBJECT: "Ů…ŮضŮŘą" LABEL_DATE: "تاریخ" LABEL_FROM: "از" LABEL_FROM_SHORT: "از" LABEL_TO: "به" LABEL_TO_SHORT: "به" LABEL_CC: "رŮنŮŘ´ŘŞ" LABEL_BCC: "رŮنŮŘ´ŘŞ پنهان" LABEL_REPLY_TO: "پاسخ به" PRINT_LABEL_FROM: "از" PRINT_LABEL_TO: "به" PRINT_LABEL_CC: "رŮنŮŘ´ŘŞ" PRINT_LABEL_BCC: "رŮنŮŘ´ŘŞ پنهان" PRINT_LABEL_REPLY_TO: "پاسخ به" PRINT_LABEL_DATE: "تاریخ" PRINT_LABEL_SUBJECT: "Ů…ŮضŮŘą" PRINT_LABEL_ATTACHMENTS: "پیŮست‌ها" MESSAGE_LOADING: "در حال بارگذاری" MESSAGE_VIEW_DESC: "پیام را در لیست جهت مشاهده انتخاب کنید" MESSAGE_VIEW_MOVE_DESC: "بر رŮŰŚ نام شاخه در پنل سمت راست جهت انتخاب مقصد کلیک کنید" PGP_PASSWORD_INPUT_PLACEHOLDER: "گذرŮاÚه" PGP_SIGNED_MESSAGE_DESC: "پیام ŘŞŮسط OpenPGP امضاء Ř´ŘŻ (برای بررسی کلیک کنید)" PGP_ENCRYPTED_MESSAGE_DESC: "پیام ŘŞŮسط OpenPGP رمزنگاری Ř´ŘŻ (برای خارج شدن از حالت رمز کلیک کنید)" LINK_DOWNLOAD_AS_ZIP: "دریاŮŘŞ با پسŮند zip" LINK_SAVE_TO_OWNCLOUD: "ذخیره در OwnCloud" LINK_SAVE_TO_CLOUD: "در Ůضای ابری ذخیره کن" LINK_SAVE_TO_DROPBOX: "ذخیره در Dropbox" READ_RECEIPT: SUBJECT: "برگرداندن گیرنده (نمایش داده Ř´ŘŻ) - %SUBJECT%" BODY: | این پیام برگشت برای نامه‌ای است که شما برای %READ-RECEIPT% ارسال کرده‌اید. نکته: این پیام تنها اطلاع‌رسانی در Ů…Ůرد این هست که پیام شما بر رŮŰŚ کامپیŮتر گیرنده نمایش داده شده است. هیچ تضمینی بابت اینکه گیرنده این پیام را Ř®Ůانده باشد یا درست Ů…ŘŞŮجه شده باشد ŮجŮŘŻ ندارد. SUGGESTIONS: SEARCHING_DESC: "در حال جستجŮ..." CONTACTS: LEGEND_CONTACTS: "تماس‌ها" SEARCH_INPUT_PLACEHOLDER: "جستجŮ" BUTTON_ADD_CONTACT: "اضاŮه‌کردن تماس" BUTTON_CREATE_CONTACT: "ایجاد" BUTTON_UPDATE_CONTACT: "برŮزرسانی" BUTTON_IMPORT: "Ůارد کردن(csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "صدŮر (csv, vcf, vCard)" BUTTON_EXPORT_CSV: "صدŮر (csv)" ERROR_IMPORT_FILE: "خطا در Ůارد کردن (Ůرمت Ůایل معتبر نیست)" LIST_LOADING: "در حال بارگذاری" EMPTY_LIST: "هیچ تماسی ŮجŮŘŻ ندارد" EMPTY_SEARCH: "هیچ تماسی پیدا نشد" CLEAR_SEARCH: "پاک‌کردن جستجŮ" CONTACT_VIEW_DESC: "تماس Ů…Ůرد نظر در لیست را جهت مشاهده، انتخاب کنید." LABEL_DISPLAY_NAME: "نمایش نام" LABEL_EMAIL: "آدرس پست الکترŮنیک" LABEL_PHONE: "ŘŞŮ„Ůن" LABEL_WEB: "تارنما" LABEL_BIRTHDAY: "تاریخ ŘŞŮلد" LINK_ADD_EMAIL: "اضاŮه کردن آدرس پست الکترŮنیک" LINK_ADD_PHONE: "اضاŮه کردن ŘŞŮ„Ůن" LINK_BIRTHDAY: "تاریخ ŘŞŮلد" PLACEHOLDER_ENTER_DISPLAY_NAME: "ŮرŮŘŻ نام" PLACEHOLDER_ENTER_LAST_NAME: "ŮرŮŘŻ نام خانŮادگی" PLACEHOLDER_ENTER_FIRST_NAME: "ŮرŮŘŻ نام" PLACEHOLDER_ENTER_NICK_NAME: "ŮرŮŘŻ نام مستعار" LABEL_READ_ONLY: "Ůقط Ř®Ůاندنی" LABEL_SHARE: "اشتراک‌گذاری" ADD_MENU_LABEL: "اضاŮه‌کردن" ADD_MENU_NICKNAME: "نام مستعار" ADD_MENU_NOTES: "یادداشت‌ها" ADD_MENU_EMAIL: "آدرس پست الکترŮنیک" ADD_MENU_PHONE: "ŘŞŮ„Ůن" ADD_MENU_URL: "تارنما" ADD_MENU_ADDRESS: "آدرس" ADD_MENU_BIRTHDAY: "تاریخ ŘŞŮلد" ADD_MENU_TAGS: "برچسب" BUTTON_SHARE_NONE: "هیچ‌کدام" BUTTON_SHARE_ALL: "هرکسی" BUTTON_SYNC: "همگام‌سازی (CardDAV)" COMPOSE: TITLE_FROM: "از" TITLE_TO: "به" TITLE_CC: "رŮنŮŘ´ŘŞ" TITLE_BCC: "رŮنŮŘ´ŘŞ پنهان" TITLE_REPLY_TO: "پاسخ به" TITLE_SUBJECT: "Ů…ŮضŮŘą" LINK_SHOW_INPUTS: "نمایش همه Ůیلدها" BUTTON_SEND: "Ůرستادن" BUTTON_SAVE: "ذخیره کن" BUTTON_DELETE: "حذŮ" BUTTON_CANCEL: "انصراŮ" BUTTON_MINIMIZE: "Ú©Ůچک‌کردن" SAVED_TIME: "ذخیره شده در %TIME%" SAVED_ERROR_ON_SEND: "پیام Ůرستاده Ř´ŘŻ اما در شاخه ارسالی‌ها ذخیره نشد" DISCARD_UNSAVED_DATA: "اطلاعات ذخیره نشده از بین برŮŘŻŘź" ATTACH_FILES: "پیŮست کردن Ůایلها" ATTACH_DROP_FILES_DESC: "Ůایل‌ها را اینجا بیاندازید" ATTACH_ITEM_CANCEL: "انصراŮ" DROPBOX: "Dropbox" GOOGLE_DRIVE: "ÚŻŮÚŻŮ„ درایŮ" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% نŮŘ´ŘŞ" FORWARD_MESSAGE_TOP_TITLE: "-------- پیام ارسال شده -------" FORWARD_MESSAGE_TOP_FROM: "از" FORWARD_MESSAGE_TOP_TO: "به" FORWARD_MESSAGE_TOP_CC: "رŮنŮŘ´ŘŞ" FORWARD_MESSAGE_TOP_SENT: "ارسال" FORWARD_MESSAGE_TOP_SUBJECT: "Ů…ŮضŮŘą" EMPTY_TO_ERROR_DESC: "لطŮا حداقل ŰŚÚ© گیرنده را مشخص نمایید" NO_ATTACHMENTS_HERE_DESC: "هیچ پیŮستی اینجا ŮجŮŘŻ ندارد." ATTACHMENTS_ERROR_DESC: "اخطار! همه پیŮست‌ها هنŮز بارگذاری نشده است." ATTACHMENTS_UPLOAD_ERROR_DESC: "همه پیŮست‌ها هنŮز بارگذاری نشده است." BUTTON_REQUEST_READ_RECEIPT: "درخŮاست دریاŮŘŞ رسید Ř®Ůاندن" BUTTON_MARK_AS_IMPORTANT: "علامت زدن به عنŮان مهم" BUTTON_OPEN_PGP: "OpenPGP (Ůقط متن ساده)" BUTTON_REQUEST_DSN: "درخŮاست دریاŮŘŞ رسید ŘŞŘ­ŮŰŚŮ„ درمقصد" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "بستن" POPUPS_ASK: BUTTON_YES: "بلی" BUTTON_NO: "خیر" DESC_WANT_CLOSE_THIS_WINDOW: "آیا از بستن این پنجره مطمئن هستید؟" DESC_WANT_DELETE_MESSAGES: "آیا از حذ٠این پیام(ها) اطمینان دارید؟" POPUPS_LANGUAGES: TITLE_LANGUAGES: "زبان Ř®ŮŘŻ را انتخاب کنید" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "اضاŮه کردن کاربر؟" BUTTON_ADD_ACCOUNT: "اضاŮه کردن" TITLE_UPDATE_ACCOUNT: "برŮزرسانی کاربر؟" BUTTON_UPDATE_ACCOUNT: "برŮزرسانی" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "اضاŮه کردن هŮŰŚŘŞŘź" TITLE_UPDATE_IDENTITY: "برŮزرسانی هŮŰŚŘŞŘź" BUTTON_ADD_IDENTITY: "اضاŮه‌کردن" BUTTON_UPDATE_IDENTITY: "برŮزرسانی" LABEL_EMAIL: "پست الکترŮنیک" LABEL_NAME: "نام" LABEL_REPLY_TO: "پاسخ به" LABEL_SIGNATURE: "امضاء" LABEL_CC: "رŮنŮŘ´ŘŞ" LABEL_BCC: "رŮنŮŘ´ŘŞ پنهان" LABEL_SIGNATURE_INSERT_BEFORE: "قراردادن امضاء‌ قبل از متن مشخص شده در جŮاب" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "ŰŚÚ© شاخه ایجاد Ř´ŮŘŻŘź" LABEL_NAME: "نام شاخه" LABEL_PARENT: "شاخه بالایی" BUTTON_CREATE: "ایجاد" BUTTON_CANCEL: "انصراŮ" BUTTON_CLOSE: "بستن" TITLE_CREATING_PROCESS: "ایجاد کردن ŰŚÚ© شاخه" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "خالی‌کردن همه پیام‌ها از این شاخه؟" BUTTON_CLEAR: "پاک کردن" BUTTON_CANCEL: "انصراŮ" BUTTON_CLOSE: "بستن" DANGER_DESC_WARNING: "اخطار!" DANGER_DESC_HTML_1: "نتیجه این عمل پاک شدن همه نامه‌ها از شاخه %FOLDER% بطŮر کامل Ř®Ůاهد بŮŘŻ." DANGER_DESC_HTML_2: "زمانی که این عملیات شرŮŘą Ř´ŮŘŻ قابل لغ٠یا انصرا٠نیست." TITLE_CLEARING_PROCESS: "خالی کردن شاخه..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Ůاردکردن کلید OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Ůارد‌کردن" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "مشاهده کلید OpenGPG" BUTTON_SELECT: "انتخاب" BUTTON_CLOSE: "بستن" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "ŘŞŮلید کلید‌های OpenPGP" LABEL_EMAIL: "پست الکترŮنیک" LABEL_NAME: "نام" LABEL_PASSWORD: "گذرŮاÚه" LABEL_KEY_BIT_LENGTH: "Ř·ŮŮ„ کلید" BUTTON_GENERATE_OPEN_PGP_KEYS: "ŘŞŮلید" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "امضاء/رمزنگاری OpenPGP" LABEL_SIGN: "امضاء" LABEL_ENCRYPT: "رمزنگاری" LABEL_PASSWORD: "گذرŮاÚه" BUTTON_SIGN: "امضاء" BUTTON_ENCRYPT: "رمزنگاری" BUTTON_SIGN_AND_ENCRYPT: "امضاء ٠رمزنگاری" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "رمزگشایی OpenPGP" LABEL_KEY: "کلید خصŮصی" LABEL_PASSWORD: "گذرŮاÚه" BUTTON_DECRYPT: "رمزگشایی" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "تست اعتبارسنجی د٠مرحله‌ای" LABEL_CODE: "ŘłŮرس" BUTTON_TEST: "تست" POPUPS_FILTER: TITLE_CREATE_FILTER: "ŰŚÚ© Ůیلتر ایجاد Ř´ŮŘŻŘź" TITLE_EDIT_FILTER: "برŮزرسانی Ůیلتر؟" FILTER_NAME: "نام" LEGEND_CONDITIONS: "شرایط" LEGEND_ACTIONS: "عملیات" BUTTON_DONE: "انجام Ř´ŘŻ" BUTTON_ADD_CONDITION: "اضاŮه کردن ŰŚÚ© شرط" SELECT_ACTION_NONE: "هیچ‌کدام" SELECT_ACTION_MOVE_TO: "انتقال به" SELECT_ACTION_FORWARD_TO: "ارسال به" SELECT_ACTION_REJECT: "رد کردن" SELECT_ACTION_VACATION_MESSAGE: "پیام تعطیلات" SELECT_ACTION_DISCARD: "ŘŻŮر انداختن" SELECT_FIELD_FROM: "از" SELECT_FIELD_RECIPIENTS: "گیرندگان (به یا رŮنŮŘ´ŘŞ)" SELECT_FIELD_SUBJECT: "Ů…ŮضŮŘą" SELECT_FIELD_HEADER: "سرصŮحه" SELECT_FIELD_SIZE: "اندازه" SELECT_TYPE_CONTAINS: "شامل" SELECT_TYPE_NOT_CONTAINS: "شامل نبŮدن" SELECT_TYPE_MATCHES: "تطابق (* Ů ? پشتیبانی می‌شŮŘŻ)" SELECT_TYPE_NOT_MATCHES: "عدم تطابق (* Ů ? پشتیبانی می‌شŮŘŻ)" SELECT_TYPE_REGEXP: "عبارت منظم" SELECT_TYPE_NOT_REGEXP: "عدم عبارت منظم" SELECT_TYPE_EQUAL_TO: "برابر" SELECT_TYPE_NOT_EQUAL_TO: "برابر نیست" SELECT_TYPE_OVER: "بالاتر" SELECT_TYPE_UNDER: "پایینتر" SELECT_MATCH_ANY: "مطابقت با هر ŰŚÚ© از Ů‚Ůانین رŮبرŮ" SELECT_MATCH_ALL: "مطابق با همه Ů‚Ůانین رŮبرŮ" MARK_AS_READ_LABEL: "علامت بعنŮان Ř®Ůانده شده" REPLY_INTERVAL_LABEL: "ŘŻŮره جŮاب (بر پایه رŮز)" KEEP_LABEL: "نگه‌داشتن" STOP_LABEL: "پردازش Ů‚Ůانین را Ů…ŘŞŮق٠نکن" EMAIL_LABEL: "پست الکترŮنیک" VACATION_SUBJECT_LABEL: "Ů…ŮضŮŘą (اختیاری)" VACATION_MESSAGE_LABEL: "پیام" VACATION_RECIPIENTS_LABEL: "گیرندگان (جداسازی با , )" REJECT_MESSAGE_LABEL: "برگشت زدن پیام" ALL_INCOMING_MESSAGES_DESC: "همه پیام‌های ŮرŮŘŻŰŚ" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "انتخاب شاخه سیستمی" SELECT_CHOOSE_ONE: "ŰŚÚ©ŰŚ را انتخاب کنید" SELECT_UNUSE_NAME: "استŮاده نکنید" LABEL_SENT: "ارسالی" LABEL_DRAFTS: "پیش‌نŮیس‌ها" LABEL_SPAM: "هرزنامه" LABEL_TRASH: "سطل آشغال" LABEL_ARCHIVE: "بایگانی" BUTTON_CANCEL: "انصراŮ" BUTTON_CLOSE: "بستن" NOTIFICATION_SENT: | شما ŮľŮشه سیستمی "ارسالی" را برای قرار گرŮتن پیام‌ها در داخل آن، پس از ارسال را انتخاب نکرده‌اید. اگر شما نمی‌خŮاهید که پیام‌های ارسالی شما ذخیره Ř´ŮŘŻŘŚ لطŮا گزینه "استŮاده نکن" را انتخاب کنید. NOTIFICATION_DRAFTS: "شما ŮľŮشه سیستمی \"پیش‌نŮیس‌ها\" را برای ذخیره پیام در زمانی که در حال ایجاد ایمیل جدید هستید را انتخاب نکرده‌اید." NOTIFICATION_SPAM: | شما ŮľŮشه سیستمی "هرزنامه‌" را جهت قرارگرŮتن پیام‌های هرزنامه‌ای انتخاب نکرده‌اید. اگر شما می‌خŮاهید که پیام‌ها بصŮرت همیشگی حذ٠شŮند، لطŮا گزینه "استŮاده نکن" را انتخاب کنید. NOTIFICATION_TRASH: | شما ŮľŮشه سیستمی "سطل آشغال" را برای قرارگرŮتن پیام‌های حذ٠شده انتخاب نکرده‌اید. اگر شما می‌خŮاهید پیام‌ها بصŮرت همیشگی حذ٠شŮند، لطŮا گزینه "استŮاده نکن" را انتخاب کنید. NOTIFICATION_ARCHIVE: "شما ŮľŮشه سیستمی \"بایگانی\" را جهت قرارگرŮتن پیام‌های بایگانی‌شده انتخاب نکرده‌اید." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "اعتبارسنجی 2 مرحله‌ای (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Ůعال‌سازی اعتبار‌سنجی د٠مرحله‌ای" LABEL_TWO_FACTOR_USER: "کاربر" LABEL_TWO_FACTOR_STATUS: "Ůضعیت" LABEL_TWO_FACTOR_SECRET: "رمز" LABEL_TWO_FACTOR_BACKUP_CODES: "پشتیبان‌گیری از ŘłŮرس" BUTTON_CREATE: "ایجاد ŰŚÚ© رمز" BUTTON_ACTIVATE: "Ůعال‌کردن" BUTTON_CLEAR: "پاک‌کردن" BUTTON_LOGOUT: "خرŮج" BUTTON_DONE: "انجام Ř´ŘŻ" BUTTON_TEST: "تست" LINK_TEST: "تست" BUTTON_SHOW_SECRET: "نمایش رمز" BUTTON_HIDE_SECRET: "Ů…Ř®ŮŰŚ کردن رمز" TWO_FACTOR_REQUIRE_DESC: "کاربر شما به پیکربندی اعتبار‌سنجی د٠مرحله‌ای نیاز دارد." TWO_FACTOR_SECRET_CONFIGURED_DESC: "پیکربندی شده" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "عدم پیکربندی" TWO_FACTOR_SECRET_DESC: > این اطلاعات را به کلاینت احراز هŮŰŚŘŞ کننده ÚŻŮÚŻŮ„ (یا کلاینتهای TOTP دیگر) ŘŞŮسط Ú©ŘŻ QR یا با Ůارد کردن دستی Ú©ŘŻŘŚ Ůارد کنید. TWO_FACTOR_BACKUP_CODES_DESC: > اگر شما نمی‌تŮانید کد‌ها را ŘŞŮسط احرازهŮŰŚŘŞ کننده ÚŻŮÚŻŮ„ (یا کلاینت‌های TOTP دیگر) دریاŮŘŞ کنید، شما می‌تŮنید از کد‌های پشتیبان برای ŮرŮŘŻ استŮاده کنید. بعد از اینکه شما از کد‌ پشتیبان جهت ŮرŮŘŻ استŮاده کردید، غیر Ůعال Ř®Ůاهد Ř´ŘŻ. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "شما نمی‌تŮانید قبل از تست این تنظیمات را تغییر دهید." TITLES: LOADING: "در حال بارگذاری" LOGIN: "ŮرŮŘŻ" MAILBOX: "صندŮŮ‚ پست الکترŮنیک" SETTINGS: "تنظیمات" COMPOSE: "ایجاد" UPLOAD: ERROR_FILE_IS_TOO_BIG: "اندازه Ůایل بیش از Ř­ŘŻ بزرگ است" ERROR_FILE_PARTIALLY_UPLOADED: "قسمتی از Ůایل به دلیل خطای مشخص Ůقط بارگذاری Ř´ŘŻ" ERROR_NO_FILE_UPLOADED: "هیچ Ůایل بارگذاری نشده است" ERROR_MISSING_TEMP_FOLDER: "Ůایل Ů…Ůقتی از دست رŮته است" ERROR_ON_SAVING_FILE: "ŰŚÚ© خطای نامشخص در بارگذاری Ůایل رŮŰŚ داده است" ERROR_FILE_TYPE: "نŮŘą Ůایل نامعتبر است" ERROR_UNKNOWN: "ŰŚÚ© خطای نامشخص در بارگذاری Ůایل رŮŰŚ داده است" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "قالب‌بندی پیشرŮته" TEXT_SWITCHER_CONFIRM: "قالب‌بندی متن ٠تصاŮیر از بین Ř®Ůاهد رŮŘŞ. آیا برای ادامه دادن اطمینان دارید؟" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "شخصی" LABEL_GENERAL_NAME: "عمŮŮ…ŰŚ" LABEL_CONTACTS_NAME: "تماس‌ها" LABEL_FOLDERS_NAME: "ŮľŮشه‌ها" LABEL_ACCOUNTS_NAME: "حساب‌های کاربری" LABEL_IDENTITY_NAME: "شناسه" LABEL_IDENTITIES_NAME: "شناسه‌ها" LABEL_FILTERS_NAME: "Ůیلترها" LABEL_TEMPLATES_NAME: "قالب‌ها" LABEL_SECURITY_NAME: "امنیت" LABEL_SOCIAL_NAME: "اجتماعی" LABEL_THEMES_NAME: "ŮľŮسته‌ها" LABEL_CHANGE_PASSWORD_NAME: "گذرŮاÚه" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "برگشت" SETTINGS_FILTERS: LEGEND_FILTERS: "Ůیلترها" BUTTON_SAVE: "ذخیره" BUTTON_ADD_FILTER: "اضاŮه کردن ŰŚÚ© Ůیلتر" BUTTON_DELETE: "حذŮ" BUTTON_RAW_SCRIPT: "استŮاده از اسکریپت ŘłŮارشی‌سازی شده کاربر" SUBNAME_NONE: "هیچ‌کدام" SUBNAME_MOVE_TO: "انتقال به \"%FOLDER%\"" SUBNAME_FORWARD_TO: "ارسال به \"%EMAIL%\"" SUBNAME_REJECT: "برگشت‌زدن" SUBNAME_VACATION_MESSAGE: "پیام تعطیلات" SUBNAME_DISCARD: "ŘŻŮر انداختن" CAPABILITY_LABEL: "قابلیت" LOADING_PROCESS: "برŮزرسانی لیست Ůیلتر" DELETING_ASK: "اطمینان دارید؟" CHACHES_NEED_TO_BE_SAVED_DESC: "این تغییرات نیازمند ذخیره شدن بر رŮŰŚ سرŮر هستند." SETTINGS_IDENTITY: LEGEND_IDENTITY: "شناسه" LABEL_DISPLAY_NAME: "نام" LABEL_REPLY_TO: "پاسخ به" LABEL_SIGNATURE: "امضاء" LABEL_ADD_SIGNATURE_TO_ALL: "اضاŮه کردن امضاء شما به تمام پیام‌های خرŮجی" SETTINGS_SECURITY: LEGEND_SECURITY: "امنیت" LABEL_CONFIGURE_TWO_FACTOR: "تنظیم اعتبار‌سنجی د٠مرحله‌ای" LABEL_AUTOLOGOUT: "خرŮج Ř®Ůدکار" AUTOLOGIN_NEVER_OPTION_NAME: "هرگز" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% دقیقه(ها)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ساعت‌(ها)" SETTINGS_GENERAL: LEGEND_GENERAL: "عمŮŮ…ŰŚ" LABEL_LANGUAGE: "زبان" LABEL_IDENTITY: "شناسه" LABEL_LAYOUT: "لایه" LABEL_LAYOUT_NO_SPLIT: "بدŮن تقسیم" LABEL_LAYOUT_VERTICAL_SPLIT: "تقسیم عمŮŘŻŰŚ" LABEL_LAYOUT_HORIZONTAL_SPLIT: "تقسیم اŮقی" LABEL_EDITOR: "Ůیرایشگر پیش‌Ůرض" LABEL_EDITOR_HTML: "ŘŞŘ­ŘŞ Ůرمت Html" LABEL_EDITOR_PLAIN: "ساده" LABEL_EDITOR_HTML_FORCED: "Html (اجباری)" LABEL_EDITOR_PLAIN_FORCED: "Plain (اجباری)" LABEL_ANIMATION: "انیمیشن رابط کاربری" LABEL_ANIMATION_FULL: "تمام" LABEL_ANIMATION_NORMAL: "عادی" LABEL_ANIMATION_NONE: "هیچ‌کدام" LABEL_VIEW_OPTIONS: "مشاهده گزینه‌ها" LABEL_USE_PREVIEW_PANE: "استŮاده از پنجره پیش‌نمایش" LABEL_USE_CHECKBOXES_IN_LIST: "نمایش چک‌باکس در لیست" LABEL_USE_THREADS: "استŮاده از حالت Ů…ŮضŮعی" LABEL_REPLY_SAME_FOLDER: " جŮابها را در ŮľŮشه‌ای که پیامها در آن جŮاب داده شده است قراردهید" LABEL_SHOW_IMAGES: "همیشه تصاŮیر بیرŮنی را در بدنه پیام‌ها نشان بده" LABEL_SHOW_ANIMATION: "نمایش انیمیشن" LABEL_MESSAGE_PER_PAGE: "پیام‌ها در صŮحه" LABEL_NOTIFICATIONS: "اطلاعیه‌ها" LABEL_SOUND_NOTIFICATION: "آگاه‌سازی با صدا" LABEL_CHROME_NOTIFICATION_DESC: "پنجره اعلان دریاŮŘŞ پیام جدید را نمایش بده" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(مسدŮŘŻ شده ŘŞŮسط مرŮرگر)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "تماس‌ها" LABEL_CONTACTS_AUTOSAVE: "اطلاعات تماس گیرندگان را بصŮرت Ř®Ůدکار در آدرس‌بŮÚ© ذخیره کن" LEGEND_CONTACTS_SYNC: "همگام‌سازی از راه ŘŻŮر (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Ůعال‌سازی همگام‌سازی از راه ŘŻŮر" LABEL_CONTACTS_SYNC_SERVER: "سرŮر" LABEL_CONTACTS_SYNC_AB_URL: "تارنمای آدرس‌بŮÚ©" LABEL_CONTACTS_SYNC_USER: "کاربر" LABEL_CONTACTS_SYNC_PASSWORD: "گذرŮاÚه" SETTINGS_THEMES: LEGEND_THEMES: "ŮľŮسته‌ها" LEGEND_THEMES_CUSTOM: "پیکربندی ŘłŮارشی ŮľŮسته" LABEL_CUSTOM_TYPE: "نŮŘą" LABEL_CUSTOM_TYPE_LIGHT: "رŮشن" LABEL_CUSTOM_TYPE_DARK: "تیره" LABEL_CUSTOM_BACKGROUND_IMAGE: "پشت زمینه" BUTTON_UPLOAD_BACKGROUND_IMAGE: "بارگذاری تصاŮیر پشت زمینه (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "اندازه Ůایل بیش از Ř­ŘŻ بزرگ است" ERROR_FILE_TYPE_ERROR: "نŮŘą Ůایل نامعتبر (Ůقط PNG Ů JPG)" ERROR_UNKNOWN: "ŰŚÚ© خطای نامشخص در بارگذاری Ůایل رŮŰŚ داده است" SETTINGS_SOCIAL: LEGEND_GOOGLE: "ÚŻŮÚŻŮ„" BUTTON_GOOGLE_CONNECT: "اتصال به ÚŻŮÚŻŮ„" BUTTON_GOOGLE_DISCONNECT: "قطع اتصال از ÚŻŮÚŻŮ„" MAIN_GOOGLE_DESC: "بعد از Ůعال‌سازی ŮرŮŘŻ با ÚŻŮگل، شما می‌تŮانید به این حساب کاربری ŘŞŮسط دکمه Google بر رŮŰŚ صŮحه ŮرŮŘŻ متصل Ř´ŮŰŚŘŻ." LEGEND_FACEBOOK: "Ůیس‌بŮÚ©" BUTTON_FACEBOOK_CONNECT: "اتصال به Ůیس‌بŮÚ©" BUTTON_FACEBOOK_DISCONNECT: "قطع اتصال از Ůیس‌بŮÚ©" MAIN_FACEBOOK_DESC: "بعد از Ůعال‌سازی ŮرŮŘŻ با Ůیس‌بŮÚ©ŘŚ شما می‌تŮانید به این حساب کاربری ŘŞŮسط دکمه Facebook بر رŮŰŚ صŮحه ŮرŮŘŻ متصل Ř´ŮŰŚŘŻ." LEGEND_TWITTER: "ŘŞŮییتر" BUTTON_TWITTER_CONNECT: "اتصال به ŘŞŮییتر" BUTTON_TWITTER_DISCONNECT: "قطع اتصال از ŘŞŮییتر" MAIN_TWITTER_DESC: "بعد از Ůعال‌سازی ŮرŮŘŻ با ŘŞŮییتر، شما می‌تŮانید به این حساب کاربری ŘŞŮسط دکمه Twitter بر رŮŰŚ صŮحه ŮرŮŘŻ متصل Ř´ŮŰŚŘŻ." SETTINGS_FOLDERS: LEGEND_FOLDERS: "لیست ŮľŮشه‌ها" BUTTON_CREATE: "ایجاد ŮľŮشه" BUTTON_SYSTEM: "ŮľŮشه‌های سیستم" BUTTON_DELETE: "حذŮ" BUTTON_SUBSCRIBE: "اشتراک" BUTTON_UNSUBSCRIBE: "قطع اشتراک" LOADING_PROCESS: "برŮزرسانی لیست ŮľŮشه‌ها" CREATING_PROCESS: "در حال ایجاد ŰŚÚ© ŮľŮشه" DELETING_PROCESS: "در حال حذ٠یک ŮľŮشه" RENAMING_PROCESS: "تغییر نام ŰŚÚ© ŮľŮشه" DELETING_ASK: "اطمینان دارید؟" TO_MANY_FOLDERS_DESC_1: "شما ŮľŮشه‌های خیلی زیادی دارید!" TO_MANY_FOLDERS_DESC_2: "جهت جلŮگیری از کاهش کارایی سیستم، ما Ůقط قسمتی از آنها را به شما نشان می‌دهیم." HELP_DELETE_FOLDER: "حذ٠پŮشه" HELP_SHOW_HIDE_FOLDER: "نمایش/Ů…Ř®Ůی‌بŮدن ŮľŮشه" HELP_CHECK_FOR_NEW_MESSAGES: "بررسی/عدم‌بررسی برای پیام جدید" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "حساب‌های کاربری" LEGEND_IDENTITIES: "شناسه‌ها" LEGEND_ACCOUNTS_AND_IDENTITIES: "حساب‌های کاربری ٠شناسه‌ها" BUTTON_ADD_ACCOUNT: "اضاŮه کردن ŰŚÚ© حساب کاربری" BUTTON_ADD_IDENTITY: "اضاŮه کردن ŰŚÚ© شناسه" BUTTON_DELETE: "حذŮ" LOADING_PROCESS: "برŮزرسانی..." DELETING_ASK: "اطمینان دارید؟" DEFAULT_IDENTITY_LABEL: "پیش‌Ůرض" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "شناسه" LEGEND_IDENTITIES: "شناسه‌های اضاŮی‌" LABEL_DEFAULT: "پیش‌Ůرض" LABEL_DISPLAY_NAME: "نام" LABEL_REPLY_TO: "پاسخ به" LABEL_SIGNATURE: "امضاء" LABEL_ADD_SIGNATURE_TO_ALL: "اضاŮه کردن امضاء شما به تمام پیام‌های خرŮجی" BUTTON_ADD_IDENTITY: "اضاŮه کردن شناسه" BUTTON_DELETE: "حذŮ" LOADING_PROCESS: "برŮزرسانی لیست شناسه‌ها" DELETING_ASK: "اطمینان دارید؟" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "تغییر گذرŮاÚه" LABEL_CURRENT_PASSWORD: "گذرŮاÚه Ůعلی" LABEL_NEW_PASSWORD: "گذرŮاÚه جدید" LABEL_REPEAT_PASSWORD: "تکرار گذرŮاÚه جدید" BUTTON_UPDATE_PASSWORD: "ثبت گذرŮاÚه جدید" ERROR_PASSWORD_MISMATCH: "گذرŮاÚه‌های Ůارد شده یکسان نیست، مجددا تلاش کنید." SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Ůارد کردن کلید OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "ŘŞŮلید کلیدهای OpenPGP" TITLE_PRIVATE: "خصŮصی" TITLE_PUBLIC: "عمŮŮ…ŰŚ" DELETING_ASK: "اطمینان دارید؟" GENERATE_ONLY_HTTPS: "تنها HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "ذخیره Ř®Ůدکار پیش‌نŮŰŚŘł" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "راهنمای میانبر‌های کیبرد" TAB_MAILBOX: "صندŮŮ‚ پستی" TAB_MESSAGE_LIST: "لیست پیام" TAB_MESSAGE_VIEW: "مشاهده پیام" TAB_COMPOSE: "ایجاد" LABEL_OPEN_USER_DROPDOWN: "قسمت کرکره‌ای کاربر را باز کنید" LABEL_REPLY: "پاسخ" LABEL_REPLY_ALL: "پاسخ به همه" LABEL_FORWARD: "ارسال به دیگران" LABEL_FORWARD_MULTIPLY: "ارسال بصŮرت پیŮست(ها)" LABEL_HELP: "راهنما" LABEL_CHECK_ALL: "انتخاب همه پیام‌ها" LABEL_ARCHIVE: "بایگانی" LABEL_DELETE: "حذŮ" LABEL_OPEN_THREAD: "باز کردن Ů…ŮضŮŘą انتخاب شده" LABEL_MOVE: "انتقال" LABEL_READ: "Ř®Ůاندن پیام‌های انتخاب شده" LABEL_UNREAD: "عدم Ř®Ůاندن پیام‌های انتخاب شده" LABEL_IMPORTANT: "مهم، پرچم‌دار شدن پیام‌های انتخاب شده" LABEL_SEARCH: "جستجŮ" LABEL_CANCEL_SEARCH: "لغ٠جستجŮ" LABEL_FULLSCREEN_ENTER: "تمام صŮحه (لایه پنجره پیش‌نمایش)" LABEL_VIEW_MESSAGE_ENTER: "مشاهده پیام (بدŮن پنجره پیش‌نمایش)" LABEL_SWITCH_TO_MESSAGE: "تغییر تمرکز به پیام انتخاب شده" LABEL_SWITCH_TO_FOLDER_LIST: "تغییر تمرکز به لیست ŮľŮشه‌ها" LABEL_FULLSCREEN_TOGGLE: "ضامن حالت تمام صŮحه" LABEL_BLOCKQUOTES_TOGGLE: "ضامن نقل‌قŮلهای پیام" LABEL_THREAD_NEXT: "پیام بعدی در Ů…ŮضŮŘą" LABEL_THREAD_PREV: "پیام قبلی در Ů…ŮضŮŘą" LABEL_PRINT: "چاپ" LABEL_EXIT_FULLSCREEN: "خرŮج از حالت تمام صŮحه" LABEL_CLOSE_MESSAGE: "بستن پیام (بدŮن لایه پنجره پیش‌نمایش)" LABEL_SWITCH_TO_LIST: "برگشت به لیست پیام‌ها" LABEL_OPEN_COMPOSE_POPUP: "بازکردن صŮحه ایجاد" LABEL_MINIMIZE_COMPOSE_POPUP: "Ú©Ůچک‌سازی پنجره ایجاد" LABEL_OPEN_IDENTITIES_DROPDOWN: "لیست کرکره‌ای شناسه‌ها را باز کنید" LABEL_SAVE_MESSAGE: "ذخیره پیام" LABEL_SEND_MESSAGE: "Ůرستادن پیام" LABEL_CLOSE_COMPOSE: "بستن صŮحه ایجاد" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "کلید عمŮŮ…ŰŚ پیدا نشد" NO_PUBLIC_KEYS_FOUND_FOR: "هیچ کلید عمŮŮ…ŰŚ برای آدرس پست الکترŮنیک \"%EMAIL%\" پیدا نشد" NO_PRIVATE_KEY_FOUND: "هیچ کلید خصŮصی پیدا نشد" NO_PRIVATE_KEY_FOUND_FOR: "هیچ کلید خصŮصی برای آدرس پست الکترŮنیک \"%EMAIL%\" پیدا نشد" ADD_A_PUBLICK_KEY: "اضاŮه کردن کلید عمŮŮ…ŰŚ" SELECT_A_PRIVATE_KEY: "انتخاب کلید خصŮصی" UNVERIFIRED_SIGNATURE: "امضای تایید نشده" DECRYPTION_ERROR: "خطای رمزگشایی در OpenPGP" GOOD_SIGNATURE: "امضای صحیح از %USER%" PGP_ERROR: "خطای OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "لطŮا قسمت FROM را مشخص نمایید" SPECIFY_AT_LEAST_ONE_RECIPIENT: "لطŮا حداقل ŰŚÚ© گیرنده را مشخص نمایید" NOTIFICATIONS: INVALID_TOKEN: "ŘŞŮکن نامعتبر" AUTH_ERROR: "احراز هŮŰŚŘŞ با Ů…ŮŮقیت همراه نبŮŘŻ" ACCESS_ERROR: "خطای دسترسی" CONNECTION_ERROR: "عدم اتصال به سرŮر" CAPTCHA_ERROR: "تصŮیر امنیتی اشتباه هست" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > این شناسه اجتماعی برای هیچ کاربر پست الکترŮنیکی تاکنŮن تخصیص داده نشده است. با استŮاده از اعتبار کاربر پست الکترŮنیک Ř®ŮŘŻ Ůارد Ř´ŮŰŚŘŻ ٠سپس این ŮŰŚÚÚŻŰŚ را در تنظیمات کاربر Ř®ŮŘŻ Ůعال کنید. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > این شناسه اجتماعی برای هیچ کاربر پست الکترŮنیکی تاکنŮن تخصیص داده نشده است. با استŮاده از اعتبار کاربر پست الکترŮنیک Ř®ŮŘŻ Ůارد Ř´ŮŰŚŘŻ ٠سپس این ŮŰŚÚÚŻŰŚ را در تنظیمات کاربر Ř®ŮŘŻ Ůعال کنید. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > این شناسه اجتماعی برای هیچ کاربر پست الکترŮنیکی تاکنŮن تخصیص داده نشده است. با استŮاده از اعتبار کاربر پست الکترŮنیک Ř®ŮŘŻ Ůارد Ř´ŮŰŚŘŻ ٠سپس این ŮŰŚÚÚŻŰŚ را در تنظیمات کاربر Ř®ŮŘŻ Ůعال کنید. DOMAIN_NOT_ALLOWED: "به دامنه اجازه داده نشده است" ACCOUNT_NOT_ALLOWED: "به حساب کاربری اجازه داده نشده است" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "اعتبار‌سنجی د٠مرحله‌ای Ů…Ůرد نیاز است" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "خطای تایید اعتبار سنجی د٠مرحله‌ای" COULD_NOT_SAVE_NEW_PASSWORD: "عدم امکان ذخیره گذرŮاÚه جدید" CURRENT_PASSWORD_INCORRECT: "گذرŮاÚه Ůعلی شما اشتباه است" NEW_PASSWORD_SHORT: "گذرŮاÚه شما بسیار Ú©Ůتاه است" NEW_PASSWORD_WEAK: "گذرŮاÚه بسیار ساده است" NEW_PASSWORD_FORBIDDENT: "گذرŮاÚه شامل کاراکترهای غیرمجاز است" CONTACTS_SYNC_ERROR: "همگام‌سازی تماس‌ها با خطا همراه بŮŘŻ" CANT_GET_MESSAGE_LIST: "امکان دریاŮŘŞ لیست پیام‌ها نیست" CANT_GET_MESSAGE: "امکان دریاŮŘŞ پیام نیست" CANT_DELETE_MESSAGE: "امکان حذ٠پیام نیست" CANT_MOVE_MESSAGE: "امکان انتقال پیام نیست" CANT_SAVE_MESSAGE: "امکان ذخیره پیام نیست" CANT_SEND_MESSAGE: "امکان ارسال پیام نیست" INVALID_RECIPIENTS: "گیرنده نامعتبر" CANT_SAVE_FILTERS: "امکان ذخیره Ůیلترها نیست" CANT_GET_FILTERS: "امکان دریاŮŘŞ Ůیلترها نیست" FILTERS_ARE_NOT_CORRECT: "Ůیلترها صحیح نیستند" CANT_CREATE_FOLDER: "امکان ایجاد شاخه ŮجŮŘŻ ندارد" CANT_RENAME_FOLDER: "امکان تغییر نام شاخه نیست" CANT_DELETE_FOLDER: "امکان حذ٠شاخه نیست" CANT_DELETE_NON_EMPTY_FOLDER: "امکان حذ٠شاخه‌ای که خالی نیست ŮجŮŘŻ ندارد" CANT_SUBSCRIBE_FOLDER: "امکان اشتراک شاخه نیست" CANT_UNSUBSCRIBE_FOLDER: "امکان عدم اشتراک شاخه نیست" CANT_SAVE_SETTINGS: "امکان ذخیره تنظیمات نیست" CANT_SAVE_PLUGIN_SETTINGS: "امکان ذخیره تنظیمات نیست" DOMAIN_ALREADY_EXISTS: "دامنه در حال حاضر Ů…ŮجŮŘŻ است" CANT_INSTALL_PACKAGE: "نصب بسته با خطا همراه بŮŘŻ" CANT_DELETE_PACKAGE: "حذ٠بسته با خطا همراه بŮ" INVALID_PLUGIN_PACKAGE: "بسته اŮزŮنه نامعتبر است" UNSUPPORTED_PLUGIN_PACKAGE: "بسته اŮزŮنه پشتیبانی نمی‌شŮŘŻ" LICENSING_SERVER_IS_UNAVAILABLE: "سرŮر مشترک شدن در دسترس نیست" LICENSING_DOMAIN_EXPIRED: "اشتراک برای این دامنه منقضی شده است" LICENSING_DOMAIN_BANNED: "اشتراک برای این دامنه مسدŮŘŻ شده است" DEMO_SEND_MESSAGE_ERROR: "بنابر اهدا٠امنیتی، این کاربر اجازه ارسال ایمیل به ŰŚÚ© ایمیل خارج از دامنه را ندارد!" DEMO_ACCOUNT_ERROR: "بنابر اهدا٠امنیتی، این کاربر اجازه انجام این عملیات را ندارد!" ACCOUNT_ALREADY_EXISTS: "کاربر ŮجŮŘŻ دارد" ACCOUNT_DOES_NOT_EXIST: "کاربر ŮجŮŘŻ ندارد" MAIL_SERVER_ERROR: "ŰŚÚ© خطا در زمان دسترسی به سرŮŰŚŘł پست الکترŮنیک رخ داد" INVALID_INPUT_ARGUMENT: "پارامترهای ŮرŮŘŻŰŚ نامعتبر" UNKNOWN_ERROR: "خطای نامشخص" STATIC: BACK_LINK: "بارگذاری مجدد" DOMAIN_LIST_DESC: "لیستی از دامنه‌های Ůب‌میل که برای دسترسی مجاز است." PHP_EXSTENSIONS_ERROR_DESC: "به ŰŚÚ© اŮزŮنه PHP نیاز دارد که در تنظیمات مربŮŘ· به PHP شما ŮجŮŘŻ ندارد!" PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه Ů…Ůرد انتظار 5.3.0 هست!" NO_SCRIPT_TITLE: "جاŮا‌اسکریپت برای این برنامه Ů…Ůرد نیاز است." NO_SCRIPT_DESC: | پشتیبانی از جاŮااسکریپت در مرŮرگر شما ŮجŮŘŻ ندارد. لطŮا پشتیبانی از جاŮا‌اسکریپت را در تنظیمات مرŮرگر Ř®ŮŘŻ Ůعال کنید ٠مجددا تلاش کنید. NO_COOKIE_TITLE: "Cookie باید بر رŮŰŚ مرŮرگر شما جهت استŮاده از برنامه Ůعال باشد." NO_COOKIE_DESC: | پشتیبانی از Cookie در مرŮرگر شما Ůعال نیست. لطŮا Cookie را در تنظیمات مرŮرگر Ř®ŮŘŻ Ůعال کنید ٠مجددا تلاش کنید. BAD_BROWSER_TITLE: "نسخه مرŮرگر شما قدیمی است." BAD_BROWSER_DESC: | برای استŮاده از تمام قابلیتهای برنامه، ŰŚÚ©ŰŚ از مرŮرگرهای زیر را دریاŮŘŞ ٠نصب کنید. rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/fi_FI.yml000066400000000000000000000737431361462701300261710ustar00rootroot00000000000000fi_FI: LOGIN: LABEL_EMAIL: "Sähköpostisi" LABEL_LOGIN: "Tunnus" LABEL_PASSWORD: "Salasana" LABEL_SIGN_ME: "Muista minut" LABEL_VERIFICATION_CODE: "Vahvistuskoodi" LABEL_DONT_ASK_VERIFICATION_CODE: "Ă„lä kysy koodia 2 viikkoon" BUTTON_SIGN_IN: "Kirjaudu" TITLE_SIGN_IN_GOOGLE: "Kirjaudu käyttäen Googlea" TITLE_SIGN_IN_FACEBOOK: "Kirjaudu käyttäen Facebookia" TITLE_SIGN_IN_TWITTER: "Kirjaudu käyttäen Twitteriä" LABEL_FORGOT_PASSWORD: "Unohdin salasanani" LABEL_REGISTRATION: "Rekisteröidy" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Lisää tili" BUTTON_SETTINGS: "Asetukset" BUTTON_HELP: "Ohje" BUTTON_LOGOUT: "Kirjaudu ulos" MOBILE: BUTTON_MOBILE_VERSION: "Mobiiliversio" BUTTON_DESKTOP_VERSION: "Työpöytäversio" SEARCH: MAIN_INPUT_PLACEHOLDER: "Haku" TITLE_ADV: "Tarkka haku" LABEL_ADV_FROM: "Läh." LABEL_ADV_TO: "Vast. ott." LABEL_ADV_SUBJECT: "Aihe" LABEL_ADV_TEXT: "Teksti" LABEL_ADV_HAS_ATTACHMENT: "Sisältää liitteen" LABEL_ADV_HAS_ATTACHMENTS: "Sisältää liitteitä" LABEL_ADV_FLAGGED: "Merkitty" LABEL_ADV_UNSEEN: "Ei luettu" LABEL_ADV_DATE: "Pvm" LABEL_ADV_DATE_ALL: "Kaikki" LABEL_ADV_DATE_3_DAYS: "3 päivän ajalta" LABEL_ADV_DATE_7_DAYS: "1 viikon ajalta" LABEL_ADV_DATE_MONTH: "1 kk ajalta" LABEL_ADV_DATE_3_MONTHS: "3 kk ajalta" LABEL_ADV_DATE_6_MONTHS: "6 kk ajalta" LABEL_ADV_DATE_YEAR: "1 vuoden ajalta" BUTTON_ADV_SEARCH: "Hae" PREVIEW_POPUP: FULLSCREEN: "Koko ruutu" ZOOM: "Zoomaa" CLOSE: "Sulje (Esc)" LOADING: "Lataa..." GALLERY_PREV: "Edellinen (nuoli vasemmalle)" GALLERY_NEXT: "Seuraava (nuoli oikealle)" GALLERY_COUNTER: "%curr% %total% sta" IMAGE_ERROR: "Kuvaa ei voitu ladata." AJAX_ERROR: "Sisältöä ei voitu ladata." FOLDER_LIST: BUTTON_COMPOSE: "Luo" BUTTON_CONTACTS: "Yhteystiedot" BUTTON_NEW_MESSAGE: "Uusi viesti" INBOX_NAME: "Postilaatikko" SENT_NAME: "Lähetetyt" DRAFTS_NAME: "Luonnokset" SPAM_NAME: "Roskaposti" TRASH_NAME: "Roskakori" ARCHIVE_NAME: "Arkisto" QUOTA: TITLE: "Kiintiö" MESSAGE_LIST: BUTTON_RELOAD: "Päivitä viestit" BUTTON_MOVE_TO: "Siirrä" BUTTON_DELETE: "Poista" BUTTON_ARCHIVE: "Arkistoi" BUTTON_SPAM: "Merkitse roskapostiksi" BUTTON_NOT_SPAM: "Ei roskapostia" BUTTON_EMPTY_FOLDER: "Tyhjennä kansio" BUTTON_MULTY_FORWARD: "Välitä liitteenä" BUTTON_DELETE_WITHOUT_MOVE: "Poista lopullisesti" BUTTON_MORE: "Lisää" MENU_SET_SEEN: "Merkitse luetuksi" MENU_SET_ALL_SEEN: "Merkitse kaikki luetuksi" MENU_UNSET_SEEN: "Merkitse lukemattomaksi" MENU_SET_FLAG: "Merkkaa" MENU_UNSET_FLAG: "Poista merkki" MENU_SELECT_ALL: "Kaikki" MENU_SELECT_NONE: "Ei mitään" MENU_SELECT_INVERT: "Vaihda valinta" MENU_SELECT_UNSEEN: "Lukemattomat" MENU_SELECT_SEEN: "Luetut" MENU_SELECT_FLAGGED: "Merkityt" MENU_SELECT_UNFLAGGED: "Merkkaamattomat" EMPTY_LIST: "Tyhjennä lista" EMPTY_SEARCH_LIST: "Yhtään viestiä ei löytynyt ehdoillasi." SEARCH_RESULT_FOR: "Hakutulokset haulle \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "Takaisin viestilistaan" LIST_LOADING: "Lataa" EMPTY_SUBJECT_TEXT: "(Ei aihetta)" PUT_MESSAGE_HERE: "Pudota viesti tähän nähdäksesi sen listassa" TODAY_AT: "tänään klo %TIME%" YESTERDAY_AT: "eilen klo %TIME%" SEARCH_PLACEHOLDER: "Hae" NEW_MESSAGE_NOTIFICATION: "Sinulle on %COUNT% uutta viestiä!" QUOTA_SIZE: "Käytät %SIZE% (%PROC%%) sinulle varatusta %LIMIT%" MESSAGE: BUTTON_EDIT: "Muokkaa" BUTTON_BACK: "Takaisin" BUTTON_CLOSE: "Sulje" BUTTON_DELETE: "Poista" BUTTON_UNSUBSCRIBE: "Peruuta tilaus" BUTTON_ARCHIVE: "Arkistoi" BUTTON_SPAM: "Roskapostia" BUTTON_NOT_SPAM: "Ei roskapostia" BUTTON_MOVE_TO: "Siirrä" BUTTON_MORE: "Lisää" BUTTON_REPLY: "Vastaa" BUTTON_REPLY_ALL: "Vastaa kaikille" BUTTON_FORWARD: "Välitä" BUTTON_FORWARD_AS_ATTACHMENT: "Välitä liitteenä" BUTTON_EDIT_AS_NEW: "Muokkaa uutena" BUTTON_SHOW_IMAGES: "Näytä ulkopuoliset kuvat" BUTTON_NOTIFY_READ_RECEIPT: "Lähettäjä on pyytänyt kuittausta kun olet lukenut tämän viestin" BUTTON_IN_NEW_WINDOW: "Avaa uudessa ikkunassa" BUTTON_THREAD_LIST: "Viestiketjunäkymä" BUTTON_THREAD_PREV: "Edellinen" BUTTON_THREAD_NEXT: "Seuraava" BUTTON_THREAD_MORE: "Lisää viestejä" MENU_HEADERS: "Näytä viestin tiedot" MENU_VIEW_ORIGINAL: "Näytä lähdekoodi" MENU_DOWNLOAD_ORIGINAL: "Lataa .eml tiedostona" MENU_FILTER_SIMILAR: "Suodata samankaltaiset" MENU_PRINT: "Tulosta" EMPTY_SUBJECT_TEXT: "(Ei aihetta)" LABEL_SUBJECT: "Aihe" LABEL_DATE: "Pvm" LABEL_FROM: "Lähettäjä" LABEL_FROM_SHORT: "läh" LABEL_TO: "Vastaanottaja" LABEL_TO_SHORT: "vast. ott." LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Vastaa" PRINT_LABEL_FROM: "Lähettäjä" PRINT_LABEL_TO: "Vastaanottaja" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Vastaa" PRINT_LABEL_DATE: "Pvm" PRINT_LABEL_SUBJECT: "Aihe" PRINT_LABEL_ATTACHMENTS: "Liite" MESSAGE_LOADING: "Lataa" MESSAGE_VIEW_DESC: "Valitse viesti listasta nähdäksesi sen tässä" PGP_PASSWORD_INPUT_PLACEHOLDER: "Salasana" PGP_SIGNED_MESSAGE_DESC: "OpenPGP allekirjoitettu viesti (klikkaa verifioidaksesi)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP salattu visti (klikkaa avataksesi salaus)" LINK_DOWNLOAD_AS_ZIP: "Lataa zip-tiedostona" LINK_SAVE_TO_OWNCLOUD: "Tallenna ownCloudiin" LINK_SAVE_TO_DROPBOX: "Tallenna Dropboxiin" READ_RECEIPT: SUBJECT: "Kuitattu luetuksi - %SUBJECT%" BODY: | Tämä on Kuitattu luetuksi viestille jonka lähetit %READ-RECEIPT%lle. Huom: Tämä viesti kertoo vain että lähetetty viesti on näytetty vastaanottajan koneella. SUGGESTIONS: SEARCHING_DESC: "Hakee..." CONTACTS: LEGEND_CONTACTS: "Yhteystiedot" SEARCH_INPUT_PLACEHOLDER: "Hae" BUTTON_ADD_CONTACT: "Lisää yhteystieto" BUTTON_CREATE_CONTACT: "Luo" BUTTON_UPDATE_CONTACT: "Päivitä" BUTTON_IMPORT: "Tuo (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Vie (vcf, vCard)" BUTTON_EXPORT_CSV: "Vie (csv)" ERROR_IMPORT_FILE: "Tuonti virhe (väärä tiedostomuoto)" LIST_LOADING: "Lataa" EMPTY_LIST: "Ei yhteystietoja" EMPTY_SEARCH: "Yhtään yhteystietoa ei löytynyt" CLEAR_SEARCH: "Poista haku" CONTACT_VIEW_DESC: "Valitse yhteystieto nähdäksesi sen tässä." LABEL_DISPLAY_NAME: "Nimi" LABEL_EMAIL: "Sähköposti" LABEL_PHONE: "Puhelin" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Syntymäpäivä" LINK_ADD_EMAIL: "Lisää sähköpostiosoite" LINK_ADD_PHONE: "Lisää puhelinnumero" LINK_BIRTHDAY: "Syntymäpäivä" PLACEHOLDER_ENTER_DISPLAY_NAME: "Lisää näytettävä nimi" PLACEHOLDER_ENTER_LAST_NAME: "Lisää sukunimi" PLACEHOLDER_ENTER_FIRST_NAME: "Lisää etunimi" PLACEHOLDER_ENTER_NICK_NAME: "Lisää lempinimi" LABEL_READ_ONLY: "Vain luku" LABEL_SHARE: "Jaa" ADD_MENU_LABEL: "Lisää" ADD_MENU_NICKNAME: "Lempinimi" ADD_MENU_NOTES: "Muistiinpanot" ADD_MENU_EMAIL: "Sähköposti" ADD_MENU_PHONE: "Puhelin" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Osoite" ADD_MENU_BIRTHDAY: "Syntymäpäivä" ADD_MENU_TAGS: "Tagit" BUTTON_SHARE_NONE: "Ei kenellekään" BUTTON_SHARE_ALL: "Kaikille" BUTTON_SYNC: "Synkronoi (CardDAV)" COMPOSE: TITLE_FROM: "Lähettäjä" TITLE_TO: "Vastaanottaja" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Vastaa" TITLE_SUBJECT: "Aihe" LINK_SHOW_INPUTS: "näytä kaikki kentät" BUTTON_SEND: "Lähetä" BUTTON_SAVE: "Tallenna" BUTTON_DELETE: "Poista" BUTTON_CANCEL: "Peruuta" BUTTON_MINIMIZE: "Pienennä" SAVED_TIME: "Tallennettu klo %TIME%" SAVED_ERROR_ON_SEND: "Viesti lähetettiin mutta ei tallennettu lähetetyt kanisoon" DISCARD_UNSAVED_DATA: "Poista tallentamaton tieto?" ATTACH_FILES: "Liitä tiedostoja" ATTACH_DROP_FILES_DESC: "Pudota tiedostot tähän" ATTACH_ITEM_CANCEL: "Peruuta" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% kirjoitti" FORWARD_MESSAGE_TOP_TITLE: "-------- Välitetty viesti -------" FORWARD_MESSAGE_TOP_FROM: "Lähettäjä" FORWARD_MESSAGE_TOP_TO: "Vastaanottaja" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Lähetetty" FORWARD_MESSAGE_TOP_SUBJECT: "Aihe" EMPTY_TO_ERROR_DESC: "Lisää ainakin yksi vastaanottaja" NO_ATTACHMENTS_HERE_DESC: "Ei liitteitä" ATTACHMENTS_ERROR_DESC: "Huom! Yhtään liitetiedostoa ei ole ladattu." ATTACHMENTS_UPLOAD_ERROR_DESC: "Kaikkia liitetiedostoja ei ole vielä ladattu." BUTTON_REQUEST_READ_RECEIPT: "Pyydä kuittaus" BUTTON_MARK_AS_IMPORTANT: "Merkitse tärkeäksi" BUTTON_OPEN_PGP: "OpenPGP (pelkkä teksti)" BUTTON_REQUEST_DSN: "Pyydä toimituskuittaus" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Sulje" POPUPS_ASK: BUTTON_YES: "Kyllä" BUTTON_NO: "Ei" DESC_WANT_CLOSE_THIS_WINDOW: "Haluatko varmasti sulkea tämän ikkunan?" DESC_WANT_DELETE_MESSAGES: "Haluatko varmasti poistaa viestin/viestit?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Valitse kieli" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Lisää tili?" BUTTON_ADD_ACCOUNT: "Lisää" TITLE_UPDATE_ACCOUNT: "Päivitä tili?" BUTTON_UPDATE_ACCOUNT: "Päivitä" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Lisää identiteetti?" TITLE_UPDATE_IDENTITY: "Päivitä identiteetti?" BUTTON_ADD_IDENTITY: "Lisää" BUTTON_UPDATE_IDENTITY: "Päivitä" LABEL_EMAIL: "Sähköposti" LABEL_NAME: "Nimi" LABEL_REPLY_TO: "Vastaa" LABEL_SIGNATURE: "Allekirjoitus" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Lisää tämä allekirjoitus ennen lainattua tekstiä vastauksissa" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Luo kansio?" LABEL_NAME: "Kansion nimi" LABEL_PARENT: "Emo-kansio" BUTTON_CREATE: "Luo" BUTTON_CANCEL: "Peruuta" BUTTON_CLOSE: "Sulje" TITLE_CREATING_PROCESS: "Luodaan kansiota" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Poista kaikki viestit tästä kansiosta?" BUTTON_CLEAR: "Poista" BUTTON_CANCEL: "Peruuta" BUTTON_CLOSE: "Sulje" DANGER_DESC_WARNING: "Huom!" DANGER_DESC_HTML_1: "Tämä toiminto poistaa kaikki viestit kansiosta %FOLDER% lopullisesti." DANGER_DESC_HTML_2: "Tätä toimintoa ei voi peruuttaa." TITLE_CLEARING_PROCESS: "Tyhjennetään kansiota..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Tuo OpenPGP avain" BUTTON_IMPORT_OPEN_PGP_KEY: "Tuo" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Näytä OpenPGP avain" BUTTON_SELECT: "Valitse" BUTTON_CLOSE: "Sulje" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Luo OpenPGP avain" LABEL_EMAIL: "Sähköposti" LABEL_NAME: "Nimi" LABEL_PASSWORD: "Salasana" LABEL_KEY_BIT_LENGTH: "Avaimen pituus" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generoi" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Allekirjoitus/Salaus" LABEL_SIGN: "Allekirjoita" LABEL_ENCRYPT: "Salaa" LABEL_PASSWORD: "Salasana" BUTTON_SIGN: "Allekirjoita" BUTTON_ENCRYPT: "Salaa" BUTTON_SIGN_AND_ENCRYPT: "Allekirjoita ja salaa" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "Pura OpenPGP" LABEL_KEY: "Yksityinen avain" LABEL_PASSWORD: "Salasana" BUTTON_DECRYPT: "Pura" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-vaiheisen tunnistautumisen testi" LABEL_CODE: "Koodi" BUTTON_TEST: "Testaa" POPUPS_FILTER: TITLE_CREATE_FILTER: "Luo suodatin?" TITLE_EDIT_FILTER: "Päivitä suodatin?" FILTER_NAME: "Nimi" LEGEND_CONDITIONS: "Ehdot" LEGEND_ACTIONS: "Toimenpiteet" BUTTON_DONE: "Valmis" BUTTON_ADD_CONDITION: "Lisää ehto" SELECT_ACTION_NONE: "Ei mitään" SELECT_ACTION_MOVE_TO: "Siirrä" SELECT_ACTION_FORWARD_TO: "Välitä" SELECT_ACTION_REJECT: "Hylkää" SELECT_ACTION_VACATION_MESSAGE: "Lomaviesti" SELECT_ACTION_DISCARD: "Poista" SELECT_FIELD_FROM: "Lähettäjä" SELECT_FIELD_RECIPIENTS: "Vastaanottajat (Vast. ott. tai CC)" SELECT_FIELD_SUBJECT: "Aihe" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Koko" SELECT_TYPE_CONTAINS: "Sisältää" SELECT_TYPE_NOT_CONTAINS: "Ei sisällä" SELECT_TYPE_MATCHES: "Vastaa hakukyselyä (* ja ? tuettu)" SELECT_TYPE_NOT_MATCHES: "Ei vastaa hakukyselyä (* ja ? tuettu)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Yhtä kuin" SELECT_TYPE_NOT_EQUAL_TO: "Ei yhtä kuin" SELECT_TYPE_OVER: "Yli" SELECT_TYPE_UNDER: "Alle" SELECT_MATCH_ANY: "Vastaa mitä tahansa säännöistä" SELECT_MATCH_ALL: "Vastaa kaikkia sääntöjä" MARK_AS_READ_LABEL: "Merkitse luetuksi" REPLY_INTERVAL_LABEL: "Vastaus intervalli (päivissä)" KEEP_LABEL: "Säästä" STOP_LABEL: "Ă„lä lopeta sääntöjen prosessointia" EMAIL_LABEL: "Sähköposti" VACATION_SUBJECT_LABEL: "Aihe (valinnainen)" VACATION_MESSAGE_LABEL: "Viesti" VACATION_RECIPIENTS_LABEL: "Vastaanottajat (erotettu pilkulla)" REJECT_MESSAGE_LABEL: "Hylkää viesti" ALL_INCOMING_MESSAGES_DESC: "Kaikki saapuvat viestit" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Valitse järjestelmäkansiot" SELECT_CHOOSE_ONE: "Valitse yksi" SELECT_UNUSE_NAME: "Ă„lä käytä" LABEL_SENT: "Lähetetyt" LABEL_DRAFTS: "Luonnokset" LABEL_SPAM: "Roskaposti" LABEL_TRASH: "Roskakori" LABEL_ARCHIVE: "Arkisto" BUTTON_CANCEL: "Peruuta" BUTTON_CLOSE: "Sulje" NOTIFICATION_SENT: | Et ole valinnut "Lähetetyt" järjestelmäkansiota jonne viestit laitetaan lähetyksen jälkeen. Jos et halua tallentaa lähetettyjä viestejä, valitse "Ă„lä käytä". NOTIFICATION_DRAFTS: "Et ole valinnut \"Luonnokset\" kansiota minne tallennetaan viestit kirjoitettaessa." NOTIFICATION_SPAM: | Et ole valinnut "Roskaposti" kansiota mihin roskapostiksi merkityt viestit siirretään. Jos haluat positaa viestit lopullisesti, valitse "Ă„lä käytä". NOTIFICATION_TRASH: | Et ole valinnut "Roskakori" järjestelmäkansiota mihin poistetut viestit laitetaan. Jos haluat positaa viestit lopullisesti, valitse "Ă„lä käytä". NOTIFICATION_ARCHIVE: "Et ole valinnut \"Arkisto\" järjestelmäkansiota." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-osainen todentaminen" LABEL_ENABLE_TWO_FACTOR: "Aktivoi 2-osainen todentaminen" LABEL_TWO_FACTOR_USER: "Käyttäjä" LABEL_TWO_FACTOR_STATUS: "Tila" LABEL_TWO_FACTOR_SECRET: "Salasana" LABEL_TWO_FACTOR_BACKUP_CODES: "Varmuuskoodi" BUTTON_CREATE: "Luo salasana" BUTTON_ACTIVATE: "Aktivoi" BUTTON_CLEAR: "Poista" BUTTON_LOGOUT: "Kirjaudu ulos" BUTTON_DONE: "Valmis" BUTTON_TEST: "Testaa" LINK_TEST: "testi" BUTTON_SHOW_SECRET: "Näytä salasana" BUTTON_HIDE_SECRET: "Piilota salasana" TWO_FACTOR_REQUIRE_DESC: "Tilisi vaatii 2-osasisen tunnistuksen" TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfiguroitu" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ei konfiguroitu" TWO_FACTOR_SECRET_DESC: > Vie tämä tieto Google Authenticator (tai toiseen )asiakasohjelmaan käyttämällä QR koodia tai syöttämällä koodi manuaalisesti. TWO_FACTOR_BACKUP_CODES_DESC: > Jos et voi vastaanottaa koodeja Google Authenticator:lla, voit käyttää varmuus koodeja kirjautumiseen. Käytettyäsi varmuuskoodin se poistuu käytötstä. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Et voi muuttaa asetusta ennen testiä." TITLES: LOADING: "Lataa" LOGIN: "Kirjaudu" MAILBOX: "Postilaatikko" SETTINGS: "Asetukset" COMPOSE: "Luo viesti" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Tiedosto on liian iso" ERROR_FILE_PARTIALLY_UPLOADED: "Tiedostoa ei voitu ladata kokonaan tuntemattoman vierheen vuoksi" ERROR_NO_FILE_UPLOADED: "Tiedostoa ei ladattu" ERROR_MISSING_TEMP_FOLDER: "Väliaikainen tiedosto puuttuu" ERROR_ON_SAVING_FILE: "Tuntematon virhe ladattaessa" ERROR_FILE_TYPE: "Väärä tiedostotyyppi" ERROR_UNKNOWN: "Tuntematon virhe ladattaessa" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTI" TEXT_SWITCHER_RICH_FORMATTING: "Muotoiluilla" TEXT_SWITCHER_CONFIRM: "Muotoilu ja kuvat häviävät. Haluatko varmasti jatkaa?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Henkilökohtainen" LABEL_GENERAL_NAME: "Yleinen" LABEL_CONTACTS_NAME: "Yhteystiedot" LABEL_FOLDERS_NAME: "kansiot" LABEL_ACCOUNTS_NAME: "Tilit" LABEL_IDENTITY_NAME: "Identiteetti" LABEL_IDENTITIES_NAME: "Identiteetit" LABEL_FILTERS_NAME: "Suodattimet" LABEL_TEMPLATES_NAME: "Mallipohjat" LABEL_SECURITY_NAME: "Turvallisuus" LABEL_SOCIAL_NAME: "Sosiaalinen" LABEL_THEMES_NAME: "emat" LABEL_CHANGE_PASSWORD_NAME: "Salasana" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Takaisin" SETTINGS_FILTERS: LEGEND_FILTERS: "Suodattimet" BUTTON_SAVE: "Tallenna" BUTTON_ADD_FILTER: "Lisää suodatin" BUTTON_DELETE: "Poista" BUTTON_RAW_SCRIPT: "Käytä muokattua skriptiä" SUBNAME_NONE: "Ei mitään" SUBNAME_MOVE_TO: "Siirrä kansioon \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Välitä osoitteeseen \"%EMAIL%\"" SUBNAME_REJECT: "Hylkää" SUBNAME_VACATION_MESSAGE: "Lomaviesti" SUBNAME_DISCARD: "Poista" CAPABILITY_LABEL: "Valmius" LOADING_PROCESS: "Asetetaan suodattimet" DELETING_ASK: "Oletko varma?" CHACHES_NEED_TO_BE_SAVED_DESC: "Nämä asetukset on tallennettava palvelimelle." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identiteetti" LABEL_DISPLAY_NAME: "nimi" LABEL_REPLY_TO: "Vastaa-osoite" LABEL_SIGNATURE: "Allekirjoitus" LABEL_ADD_SIGNATURE_TO_ALL: "Lisää allekirjoitus kaikkiin lähteviin viesteihin" SETTINGS_SECURITY: LEGEND_SECURITY: "Turvallisuus" LABEL_CONFIGURE_TWO_FACTOR: "Aseta 2-osainen tunnistus" LABEL_AUTOLOGOUT: "Automaattinen uloskirjautuminen" AUTOLOGIN_NEVER_OPTION_NAME: "Ei koskaan" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuuttia" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% tuntia" SETTINGS_GENERAL: LEGEND_GENERAL: "Yleiset" LABEL_LANGUAGE: "Kieli" LABEL_IDENTITY: "Identiteetti" LABEL_LAYOUT: "Asettelu" LABEL_LAYOUT_NO_SPLIT: "Ei jakoa" LABEL_LAYOUT_VERTICAL_SPLIT: "Pystysuora jako" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vaakataso jako" LABEL_EDITOR: "Oletus tekstieditori" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Pelkkä teksti" LABEL_EDITOR_HTML_FORCED: "Html (pakotettu)" LABEL_EDITOR_PLAIN_FORCED: "Pelkkä teksti (pakotettu)" LABEL_ANIMATION: "Käyttöliittymän animointi" LABEL_ANIMATION_FULL: "Täysi" LABEL_ANIMATION_NORMAL: "Normaali" LABEL_ANIMATION_NONE: "Ei mitään" LABEL_VIEW_OPTIONS: "Näyttö-valinnat" LABEL_USE_PREVIEW_PANE: "Käytä esikatselua" LABEL_USE_CHECKBOXES_IN_LIST: "Näytä valintaruudut listassa" LABEL_USE_THREADS: "Käytä keskustelunäkymää" LABEL_REPLY_SAME_FOLDER: "Siirrä vastaukset samaan kansioon vastattavien kanssa" LABEL_SHOW_IMAGES: "Näytä aina ulkopuoliset kuvat viestissä" LABEL_SHOW_ANIMATION: "Näytä animaatio" LABEL_MESSAGE_PER_PAGE: "Viestiä sivulla" LABEL_NOTIFICATIONS: "Ilmoitukset" LABEL_SOUND_NOTIFICATION: "Äänimerkit" LABEL_CHROME_NOTIFICATION_DESC: "Näytä uusien viestien ponnahdusikkuna" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Estetty selaimessa)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Yhteystiedot" LABEL_CONTACTS_AUTOSAVE: "Lisää yhetystieto automaattisesti osoitekirjaan" LEGEND_CONTACTS_SYNC: "Etä-synkronointi (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Aktivoi etä-synkronointi" LABEL_CONTACTS_SYNC_SERVER: "Palvelin" LABEL_CONTACTS_SYNC_AB_URL: "Osoitekirjan URL" LABEL_CONTACTS_SYNC_USER: "Käyttäjä" LABEL_CONTACTS_SYNC_PASSWORD: "Salasana" SETTINGS_THEMES: LEGEND_THEMES: "Teemat" LEGEND_THEMES_CUSTOM: "Muokatun teeman asetukset" LABEL_CUSTOM_TYPE: "Tyyppi" LABEL_CUSTOM_TYPE_LIGHT: "Vaalea" LABEL_CUSTOM_TYPE_DARK: "Tumma" LABEL_CUSTOM_BACKGROUND_IMAGE: "Tausta" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Lataa taustakuva (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Tiedosto on liian iso" ERROR_FILE_TYPE_ERROR: "Väärä tiedostotyyppi (ainoastaan JPG ja PNG)" ERROR_UNKNOWN: "Tuntematon virhe ladattaessa" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Liitä Google" BUTTON_GOOGLE_DISCONNECT: "Katkaise yhteys Googleen" MAIN_GOOGLE_DESC: "Aktivoituasi Google kirjautumisen, voit kirjautua tälle tilille käyttämällä Google nappia kirjautumissivulla" LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Liitä Facebook" BUTTON_FACEBOOK_DISCONNECT: "Katkaise yhteys Facebookiin" MAIN_FACEBOOK_DESC: "Aktivoituasi facebook kirjautumisen, voit kirjautua tälle tilille käyttämällä facebook nappia kirjautumissivulla" LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Yhdistä Twitter" BUTTON_TWITTER_DISCONNECT: "Katkaise yhteys Twitteriin" MAIN_TWITTER_DESC: "Aktivoituasi Twitter kirjautumisen, voit kirjautua tälle tilille käyttämällä Twitter nappia kirjautumissivulla" SETTINGS_FOLDERS: LEGEND_FOLDERS: "Kansiolista" BUTTON_CREATE: "Luo Kansio" BUTTON_SYSTEM: "Järjestelmäkansiot" BUTTON_DELETE: "Poista" BUTTON_SUBSCRIBE: "Tilaa" BUTTON_UNSUBSCRIBE: "Peruuta tilaus" LOADING_PROCESS: "Päivitetään listaa" CREATING_PROCESS: "Luodaan kansiota" DELETING_PROCESS: "Poistetaan kansiota" RENAMING_PROCESS: "Uudelleennimetään kansiota" DELETING_ASK: "Oletko varma?" TO_MANY_FOLDERS_DESC_1: "Sinulla on liikaa kansioita!" TO_MANY_FOLDERS_DESC_2: "Näytetään vain osa." HELP_DELETE_FOLDER: "Poista kansio" HELP_SHOW_HIDE_FOLDER: "Näytä/Piilota kansio" HELP_CHECK_FOR_NEW_MESSAGES: "Tarkista/Ă„lä tarkista uudet viestit" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Tilit" LEGEND_IDENTITIES: "Identiteetit" LEGEND_ACCOUNTS_AND_IDENTITIES: "Tilit ja Identiteetit" BUTTON_ADD_ACCOUNT: "Lisää Tili" BUTTON_ADD_IDENTITY: "Lisää identiteetti" BUTTON_DELETE: "Poista" LOADING_PROCESS: "Päivitetään..." DELETING_ASK: "Oletko varma?" DEFAULT_IDENTITY_LABEL: "oletus" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identiteetti" LEGEND_IDENTITIES: "Lisä identiteetit" LABEL_DEFAULT: "Oletus" LABEL_DISPLAY_NAME: "Nimi" LABEL_REPLY_TO: "Vastaa osoite" LABEL_SIGNATURE: "Allekirjoitus" LABEL_ADD_SIGNATURE_TO_ALL: "Lisää allekirjoitus kaikkiin ulosmeneviin viesteihin" BUTTON_ADD_IDENTITY: "Lisää identiteetti" BUTTON_DELETE: "Poista" LOADING_PROCESS: "Päivitetään identiteettilistaa" DELETING_ASK: "Oletko varma?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Vaihda salasana" LABEL_CURRENT_PASSWORD: "Nykyinen salasana" LABEL_NEW_PASSWORD: "Uusi salasana" LABEL_REPEAT_PASSWORD: "Vahvista uusi salasana" BUTTON_UPDATE_PASSWORD: "Aseta uusi salasana" ERROR_PASSWORD_MISMATCH: "Salasanat eivät täsmää, yritä uudelleen" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Tuo OpenPGP avain" BUTTON_GENERATE_OPEN_PGP_KEYS: "Luo OpenPGP avain" TITLE_PRIVATE: "Yksityinen" TITLE_PUBLIC: "Julkinen" DELETING_ASK: "Oletko varma?" GENERATE_ONLY_HTTPS: "Vain HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Näppäimistö oikotie apu" TAB_MAILBOX: "Postilaatikko" TAB_MESSAGE_LIST: "Viestilista" TAB_MESSAGE_VIEW: "Viestinäkymä" TAB_COMPOSE: "Luo" LABEL_OPEN_USER_DROPDOWN: "Avaa käyttäjävalikko" LABEL_REPLY: "Vastaa" LABEL_REPLY_ALL: "Vastaa kaikille" LABEL_FORWARD: "Lähetä edelleen" LABEL_FORWARD_MULTIPLY: "Lähetä edelleen liitteenä" LABEL_HELP: "Ohje" LABEL_CHECK_ALL: "Valitse kaikki viestit" LABEL_ARCHIVE: "Arkisto" LABEL_DELETE: "Poista" LABEL_OPEN_THREAD: "Avaa valittu ketju" LABEL_MOVE: "Siirrä" LABEL_READ: "Lue valitut viestit" LABEL_UNREAD: "Lukemattomat valitut viestit" LABEL_IMPORTANT: "Tärkeät, merkitse valitut" LABEL_SEARCH: "Etsi" LABEL_CANCEL_SEARCH: "Peruuta etsi" LABEL_FULLSCREEN_ENTER: "Koko näyttö (Esikatselu näkymä)" LABEL_VIEW_MESSAGE_ENTER: "Katso viesti (Ei esikatselu näkymää)" LABEL_SWITCH_TO_MESSAGE: "Fokusoi valittuu viestiin" LABEL_SWITCH_TO_FOLDER_LIST: "Fokusoi viestilistaan" LABEL_FULLSCREEN_TOGGLE: "Aseta täyden ruudun näkymä" LABEL_BLOCKQUOTES_TOGGLE: "Aseta lainaus" LABEL_THREAD_NEXT: "Seuraava viesti ketjussa" LABEL_THREAD_PREV: "Edellinen viesti ketjussa" LABEL_PRINT: "Tulosta" LABEL_EXIT_FULLSCREEN: "Poistu täyden ruudun näkymästä" LABEL_CLOSE_MESSAGE: "Sulje viesti" LABEL_SWITCH_TO_LIST: "Fokusoi viestilistaan" LABEL_OPEN_COMPOSE_POPUP: "Avaa luo viesti popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Sulje luo viesti popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Avaa idetiteetit valikko" LABEL_SAVE_MESSAGE: "Tallenna viesti" LABEL_SEND_MESSAGE: "Lähetä viesti" LABEL_CLOSE_COMPOSE: "Sule luo viesti" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Julkisia avaimia ei löytynyt" NO_PUBLIC_KEYS_FOUND_FOR: "%EMAIL% lle ei löytynyt julkisia avaimia" NO_PRIVATE_KEY_FOUND: "Ykrityistä avainta ei löytynyt" NO_PRIVATE_KEY_FOUND_FOR: "%EMAIL% lle ei löytynyt yksityistä avainta" ADD_A_PUBLICK_KEY: "Lisää julkinen avain" SELECT_A_PRIVATE_KEY: "Valitse yksityinen avain" UNVERIFIRED_SIGNATURE: "Tarkistamaton allekirjoitus" DECRYPTION_ERROR: "OpenPGP avausvierhe" GOOD_SIGNATURE: "Oikea allekirjoitus %USER% lle" PGP_ERROR: "OpenPGP virhe: %ERROR%" SPECIFY_FROM_EMAIL: "Aseta lähettäjän osoite" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Aseta vähintään yksi vastaanottaja" NOTIFICATIONS: INVALID_TOKEN: "Väärä suojaustunnus" AUTH_ERROR: "Tunnistusvirhe" ACCESS_ERROR: "Kirjautumisvirhe" CONNECTION_ERROR: "Ei voi yhdistää palvelimeen" CAPTCHA_ERROR: "Väärä CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella ja aktivoi tämä ominaisuus tilin asetuksissa. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella ja aktivoi tämä ominaisuus tilin asetuksissa. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Tätä some ID:tä ei ole liitetty mihinkään tiliin. Kirjaudu sähköpostiosoitteella ja aktivoi tämä ominaisuus tilin asetuksissa. DOMAIN_NOT_ALLOWED: "Verkkotunnus ei ole sallittu" ACCOUNT_NOT_ALLOWED: "Tili ei ole sallittu" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-osainen tunnistus vaaditaan" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-osainen tunnistusvirhe" COULD_NOT_SAVE_NEW_PASSWORD: "Salasanan tallennus ei onnistunut" CURRENT_PASSWORD_INCORRECT: "Nykyinen salasana väärin" NEW_PASSWORD_SHORT: "Salasana liian lyhyt" NEW_PASSWORD_WEAK: "Salasana liian helppo" NEW_PASSWORD_FORBIDDENT: "Salasana sisältää kiellettyjä merkkejä" CONTACTS_SYNC_ERROR: "Yhteystietojen synkronointivirhe" CANT_GET_MESSAGE_LIST: "Viestilistaa ei voi näyttää" CANT_GET_MESSAGE: "Viestiä ei voi näyttää" CANT_DELETE_MESSAGE: "Viestiä ei voi poistaa" CANT_MOVE_MESSAGE: "Viestiä ei voi siirtää" CANT_SAVE_MESSAGE: "Viestiä ei voi tallentaa" CANT_SEND_MESSAGE: "Viestiä ei voi lähettää" INVALID_RECIPIENTS: "Vastaanottajassa virhe" CANT_SAVE_FILTERS: "Suodattimia ei voi tallentaa" CANT_GET_FILTERS: "Suodattimia ei voi ladata" FILTERS_ARE_NOT_CORRECT: "Suodattimet väärin" CANT_CREATE_FOLDER: "Kansiota ei voi luoda" CANT_RENAME_FOLDER: "Kansiota ei voi uudelleennimetä" CANT_DELETE_FOLDER: "Kansiota ei voi poistaa" CANT_DELETE_NON_EMPTY_FOLDER: "Kansiossa on viestejä, ei voi poistaa" CANT_SUBSCRIBE_FOLDER: "Kansiota ei voi tilata" CANT_UNSUBSCRIBE_FOLDER: "Kansiotilausta ei voi peruuttaa" CANT_SAVE_SETTINGS: "Asetuksia ei voi tallentaa" CANT_SAVE_PLUGIN_SETTINGS: "Asetuksia ei voi tallentaa" DOMAIN_ALREADY_EXISTS: "Verkkotunnus on jo olemassa" CANT_INSTALL_PACKAGE: "Pakkauksen asennus epäonnistui" CANT_DELETE_PACKAGE: "Pakkauksen poisto epäonnistui" INVALID_PLUGIN_PACKAGE: "Viallinen paketti" UNSUPPORTED_PLUGIN_PACKAGE: "Ei-tuettu plugin paketti" LICENSING_SERVER_IS_UNAVAILABLE: "Tilauspalvelin ei ole saatavilla" LICENSING_DOMAIN_EXPIRED: "Tämän verkkotunnuksen tilaus on päättynyt." LICENSING_DOMAIN_BANNED: "Tämän verkkotunnuksen tilaus on estetty." DEMO_SEND_MESSAGE_ERROR: "Turvallisuus syistä tältä tililtä ei voi lähettää viestejä ulkopuolisiin osoitteisiin!" DEMO_ACCOUNT_ERROR: "Turvallisuus syistä tämä ei ole sallittua!" ACCOUNT_ALREADY_EXISTS: "Tili on jo olemassa." ACCOUNT_DOES_NOT_EXIST: "Tiliä ei ole olemassa" MAIL_SERVER_ERROR: "Palvelinyhteydessä tapahtui virhe" INVALID_INPUT_ARGUMENT: "Virheelinen komento" UNKNOWN_ERROR: "Tuntematon virhe" STATIC: BACK_LINK: "Lataa uudelleen" DOMAIN_LIST_DESC: "Lista sallituista verkkotunnuksista" PHP_EXSTENSIONS_ERROR_DESC: "Vaadittava PHP lisäosa ei ole saatavilla PHP konfiguraatiossa!" PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" NO_SCRIPT_TITLE: "JavaScript vaaditaan." NO_SCRIPT_DESC: | JavaScript tuki ei ole saatavilla selaimessasi. Aktivoi JavaScript selaimessasi ja yritä uudelleen. NO_COOKIE_TITLE: "Eväste-tuki vaaditaan." NO_COOKIE_DESC: | Eväste (cookie) tuki ei ole saatavilla selaimessasi. Aktivoi evästeet (cookiet) selaimessasi ja yritä uudelleen. BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." BAD_BROWSER_DESC: | Käyttääksesi kaikkia ominaisuuksia, lataa ja asenna jokin näistä selaimista: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/fr_FR.yml000066400000000000000000001025721361462701300262040ustar00rootroot00000000000000fr_FR: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Identifiant" LABEL_PASSWORD: "Mot de passe" LABEL_SIGN_ME: "Se souvenir de moi" LABEL_VERIFICATION_CODE: "Code de vĂ©rification" LABEL_DONT_ASK_VERIFICATION_CODE: "Ne plus demander le code pendant 2 semaines" BUTTON_SIGN_IN: "Se connecter" TITLE_SIGN_IN_GOOGLE: "Se connecter avec Google" TITLE_SIGN_IN_FACEBOOK: "Se connecter avec Facebook" TITLE_SIGN_IN_TWITTER: "Se connecter avec Twitter" LABEL_FORGOT_PASSWORD: "Mot de passe oubliĂ©" LABEL_REGISTRATION: "S'enregistrer" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Ajouter un compte" BUTTON_SETTINGS: "Paramètres" BUTTON_HELP: "Aide" BUTTON_LOGOUT: "DĂ©connexion" MOBILE: BUTTON_MOBILE_VERSION: "Version mobile" BUTTON_DESKTOP_VERSION: "Version grand Ă©cran" SEARCH: MAIN_INPUT_PLACEHOLDER: "Recherche" TITLE_ADV: "Recherche avancĂ©e" LABEL_ADV_FROM: "De" LABEL_ADV_TO: "Ă€" LABEL_ADV_SUBJECT: "Objet" LABEL_ADV_TEXT: "Texte" LABEL_ADV_HAS_ATTACHMENT: "Pièce jointe" LABEL_ADV_HAS_ATTACHMENTS: "Pièces jointes" LABEL_ADV_FLAGGED: "SignalĂ©" LABEL_ADV_UNSEEN: "Non lu" LABEL_ADV_DATE: "Date" LABEL_ADV_DATE_ALL: "Tous" LABEL_ADV_DATE_3_DAYS: "Jusqu'Ă  3 jours" LABEL_ADV_DATE_7_DAYS: "Jusqu'Ă  1 semaine" LABEL_ADV_DATE_MONTH: "Jusqu'Ă  1 mois" LABEL_ADV_DATE_3_MONTHS: "Jusqu'Ă  3 mois" LABEL_ADV_DATE_6_MONTHS: "Jusqu'Ă  6 mois" LABEL_ADV_DATE_YEAR: "Jusqu'Ă  1 an" BUTTON_ADV_SEARCH: "Rechercher" PREVIEW_POPUP: FULLSCREEN: "Basculer en plein Ă©cran" ZOOM: "Zoom Avant/Arrière" CLOSE: "Fermer (Esc)" LOADING: "Chargement..." GALLERY_PREV: "PrĂ©cĂ©dent (flèche gauche)" GALLERY_NEXT: "Suivant (flèche droite)" GALLERY_COUNTER: "%curr% de %total%" IMAGE_ERROR: "L'image ne peut ĂŞtre chargĂ©e." AJAX_ERROR: "Le contenu ne peut ĂŞtre chargĂ©." FOLDER_LIST: BUTTON_COMPOSE: "Nouveau message" BUTTON_CONTACTS: "Contacts" BUTTON_NEW_MESSAGE: "Nouveau message" INBOX_NAME: "BoĂ®te de rĂ©ception" SENT_NAME: "EnvoyĂ©s" DRAFTS_NAME: "Brouillons" SPAM_NAME: "IndĂ©sirables" TRASH_NAME: "Corbeille" ARCHIVE_NAME: "Archive" QUOTA: TITLE: "Quota" MESSAGE_LIST: BUTTON_RELOAD: "Recharger la liste des messages" BUTTON_MOVE_TO: "DĂ©placer vers" BUTTON_DELETE: "Supprimer" BUTTON_ARCHIVE: "Archiver" BUTTON_SPAM: "IndĂ©sirable" BUTTON_NOT_SPAM: "Acceptable" BUTTON_EMPTY_FOLDER: "Vider le dossier" BUTTON_MULTY_FORWARD: "Transmettre les messages" BUTTON_DELETE_WITHOUT_MOVE: "Supprimer dĂ©finitivement" BUTTON_MORE: "Plus" MENU_SET_SEEN: "Marquer comme lu" MENU_SET_ALL_SEEN: "Marquer tous comme lus" MENU_UNSET_SEEN: "Marquer comme non-lu" MENU_SET_FLAG: "Signaler" MENU_UNSET_FLAG: "Enlever le signal" MENU_SELECT_ALL: "Tous" MENU_SELECT_NONE: "Aucun" MENU_SELECT_INVERT: "Inverser" MENU_SELECT_UNSEEN: "Non-lu" MENU_SELECT_SEEN: "Lu" MENU_SELECT_FLAGGED: "SignalĂ©s" MENU_SELECT_UNFLAGGED: "Non signalĂ©s" EMPTY_LIST: "Liste vide." EMPTY_SEARCH_LIST: "Aucun message ne correspond Ă  votre recherche." SEARCH_RESULT_FOR: "RĂ©sultats de recherche pour \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "retour Ă  la liste des messages" LIST_LOADING: "Chargement" EMPTY_SUBJECT_TEXT: "(Pas d'objet)" PUT_MESSAGE_HERE: "Glisser un message ici pour l'afficher dans la liste" TODAY_AT: "aujourd'hui Ă  %TIME%" YESTERDAY_AT: "hier Ă  %TIME%" SEARCH_PLACEHOLDER: "Recherche" NEW_MESSAGE_NOTIFICATION: "Vous avez %COUNT% nouveaux messages !" QUOTA_SIZE: "Vous utilisez %SIZE% (%PROC%%) sur %LIMIT%" MESSAGE: BUTTON_EDIT: "Modifier" BUTTON_BACK: "Retour" BUTTON_CLOSE: "Fermer" BUTTON_DELETE: "Supprimer" BUTTON_UNSUBSCRIBE: "Se dĂ©sinscrire de cette liste" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "IndĂ©sirable" BUTTON_NOT_SPAM: "Acceptable" BUTTON_MOVE_TO: "DĂ©placer vers" BUTTON_MORE: "Plus" BUTTON_REPLY: "RĂ©pondre" BUTTON_REPLY_ALL: "RĂ©pondre Ă  tous" BUTTON_FORWARD: "TransfĂ©rer" BUTTON_FORWARD_AS_ATTACHMENT: "TransfĂ©rer comme pièce-jointe" BUTTON_EDIT_AS_NEW: "Éditer comme nouveau" BUTTON_SHOW_IMAGES: "Afficher les images" BUTTON_NOTIFY_READ_RECEIPT: "L'expĂ©diteur a demandĂ© Ă  ĂŞtre prĂ©venu lorsque vous lirez ce message." BUTTON_IN_NEW_WINDOW: "Voir dans une nouvelle fenĂŞtre" BUTTON_THREAD_LIST: "Liste des discussions" BUTTON_THREAD_PREV: "PrĂ©cĂ©dent" BUTTON_THREAD_NEXT: "Suivant" BUTTON_THREAD_MORE: "Plus de messages" MENU_HEADERS: "Voir les en-tĂŞtes du message" MENU_VIEW_ORIGINAL: "Voir la source" MENU_DOWNLOAD_ORIGINAL: "TĂ©lĂ©charger comme fichier .eml" MENU_FILTER_SIMILAR: "Filtrer les messages similaires" MENU_PRINT: "Imprimer" EMPTY_SUBJECT_TEXT: "(Pas d'objet)" LABEL_SUBJECT: "Objet" LABEL_DATE: "Date" LABEL_FROM: "De" LABEL_FROM_SHORT: "de" LABEL_TO: "Ă€" LABEL_TO_SHORT: "Ă " LABEL_CC: "CC" LABEL_BCC: "CCI" LABEL_REPLY_TO: "RĂ©pondre Ă " PRINT_LABEL_FROM: "De" PRINT_LABEL_TO: "Ă€" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "CCI" PRINT_LABEL_REPLY_TO: "RĂ©pondre Ă " PRINT_LABEL_DATE: "Date" PRINT_LABEL_SUBJECT: "Objet" PRINT_LABEL_ATTACHMENTS: "Pièces jointes" MESSAGE_LOADING: "Chargement" MESSAGE_VIEW_DESC: "SĂ©lectionner un message dans la liste pour l'afficher ici." MESSAGE_VIEW_MOVE_DESC: "Cliquez sur le nom du dossier dans le panneau de gauche pour sĂ©lectionner la destination." PGP_PASSWORD_INPUT_PLACEHOLDER: "Mot de passe" PGP_SIGNED_MESSAGE_DESC: "Message signĂ© par OpenPGP (cliquer pour vĂ©rifier)" PGP_ENCRYPTED_MESSAGE_DESC: "Message chiffrĂ© par OpenPGP (cliquer pour dĂ©chiffrer)" LINK_DOWNLOAD_AS_ZIP: "TĂ©lĂ©charger le zip" LINK_SAVE_TO_OWNCLOUD: "Enregistrer sur ownCloud" LINK_SAVE_TO_CLOUD: "Enregistrer sur le cloud" LINK_SAVE_TO_DROPBOX: "Enregistrer sur Dropbox" READ_RECEIPT: SUBJECT: "AccusĂ© de rĂ©ception (affichĂ©) - %SUBJECT%" BODY: | Il s'agit d'un accusĂ© de rĂ©ception pour le courrier que vous avez envoyĂ© Ă  %READ-RECEIPT%. Note: Cet accusĂ© de rĂ©ception reconnaĂ®t que le message a Ă©tĂ© affichĂ© sur l'ordinateur du destinataire. Il n'y a aucune garantie que le destinataire ait lu ou compris le contenu du message. SUGGESTIONS: SEARCHING_DESC: "Recherche..." CONTACTS: LEGEND_CONTACTS: "Carnet d'adresses" SEARCH_INPUT_PLACEHOLDER: "Recherche" BUTTON_ADD_CONTACT: "Ajouter un contact" BUTTON_CREATE_CONTACT: "CrĂ©er" BUTTON_UPDATE_CONTACT: "Modifier" BUTTON_IMPORT: "Importer (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exporter (vcf, vCard)" BUTTON_EXPORT_CSV: "Exporter (csv)" ERROR_IMPORT_FILE: "Erreur d'importation (format de fichier invalide)" LIST_LOADING: "Chargement" EMPTY_LIST: "Aucun contact" EMPTY_SEARCH: "Aucun contact trouvĂ©" CLEAR_SEARCH: "Effacer la recherche" CONTACT_VIEW_DESC: "SĂ©lectionner un contact dans la liste pour l'afficher ici." LABEL_DISPLAY_NAME: "Nom affichĂ©" LABEL_EMAIL: "Email" LABEL_PHONE: "TĂ©lĂ©phone" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Anniversaire" LINK_ADD_EMAIL: "Ajouter une adresse email" LINK_ADD_PHONE: "Ajouter un numĂ©ro de tĂ©lĂ©phone" LINK_BIRTHDAY: "Anniversaire" PLACEHOLDER_ENTER_DISPLAY_NAME: "Entrez le nom Ă  afficher" PLACEHOLDER_ENTER_LAST_NAME: "Entrez votre nom" PLACEHOLDER_ENTER_FIRST_NAME: "Entrez votre prĂ©nom" PLACEHOLDER_ENTER_NICK_NAME: "Enter le pseudonyme" LABEL_READ_ONLY: "Lecture seule" LABEL_SHARE: "Partager" ADD_MENU_LABEL: "Ajouter" ADD_MENU_NICKNAME: "Pseudonyme" ADD_MENU_NOTES: "Notes" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "TĂ©lĂ©phone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adresse" ADD_MENU_BIRTHDAY: "Anniversaire" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "Personne" BUTTON_SHARE_ALL: "Tout le monde" BUTTON_SYNC: "Synchronisation (CardDAV)" COMPOSE: TITLE_FROM: "De" TITLE_TO: "Ă€" TITLE_CC: "CC" TITLE_BCC: "CCI" TITLE_REPLY_TO: "RĂ©pondre Ă " TITLE_SUBJECT: "Sujet" LINK_SHOW_INPUTS: "voir tous les champs" BUTTON_SEND: "Envoyer" BUTTON_SAVE: "Enregistrer" BUTTON_DELETE: "Supprimer" BUTTON_CANCEL: "Annuler" BUTTON_MINIMIZE: "RĂ©duire" SAVED_TIME: "EnregistrĂ© Ă  %TIME%" SAVED_ERROR_ON_SEND: "Le message a Ă©tĂ© envoyĂ© mais n'a pas Ă©tĂ© enregistrĂ© dans le dossier des messages envoyĂ©s" DISCARD_UNSAVED_DATA: "Abandonner les donnĂ©es non enregistrĂ©es ?" ATTACH_FILES: "Joindre des fichiers" ATTACH_DROP_FILES_DESC: "Glisser les fichiers ici" ATTACH_ITEM_CANCEL: "Annuler" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME% %EMAIL% a Ă©crit" FORWARD_MESSAGE_TOP_TITLE: "-------- Message transfĂ©rĂ© -------" FORWARD_MESSAGE_TOP_FROM: "De" FORWARD_MESSAGE_TOP_TO: "Ă€" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "EnvoyĂ©" FORWARD_MESSAGE_TOP_SUBJECT: "Objet" EMPTY_TO_ERROR_DESC: "Merci de spĂ©cifier au moins un destinataire" NO_ATTACHMENTS_HERE_DESC: "Aucune pièce jointe." ATTACHMENTS_ERROR_DESC: "Attention ! Toutes les pièces jointes n'ont pas Ă©tĂ© tĂ©lĂ©chargĂ©es." ATTACHMENTS_UPLOAD_ERROR_DESC: "Toutes les pièces jointes n'ont pas encore Ă©tĂ© tĂ©lĂ©chargĂ©es" BUTTON_REQUEST_READ_RECEIPT: "Demander une confirmation de lecture" BUTTON_MARK_AS_IMPORTANT: "Marquer comme important" BUTTON_OPEN_PGP: "OpenPGP (Texte non formatĂ© uniquement)" BUTTON_REQUEST_DSN: "Demander un accusĂ© de rĂ©ception" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Fermer" POPUPS_ASK: BUTTON_YES: "Oui" BUTTON_NO: "Non" DESC_WANT_CLOSE_THIS_WINDOW: "ĂŠtes-vous sĂ»r de vouloir fermer cette fenĂŞtre ?" DESC_WANT_DELETE_MESSAGES: "ĂŠtes-vous sĂ»r de vouloir supprimer ce(s) message(s) ?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choisir la langue" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Ajouter un compte ?" BUTTON_ADD_ACCOUNT: "Ajouter" TITLE_UPDATE_ACCOUNT: "Mettre Ă  jour le compte ?" BUTTON_UPDATE_ACCOUNT: "Mettre Ă  jour" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Ajouter une identitĂ© ?" TITLE_UPDATE_IDENTITY: "Mettre Ă  jour l'identitĂ© ?" BUTTON_ADD_IDENTITY: "Ajouter" BUTTON_UPDATE_IDENTITY: "Mettre Ă  jour" LABEL_EMAIL: "Adresse email" LABEL_NAME: "Nom" LABEL_REPLY_TO: "RĂ©pondre Ă " LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Cci" LABEL_SIGNATURE_INSERT_BEFORE: "InsĂ©rer la signature avant le texte citĂ© dans les rĂ©ponses" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "CrĂ©er un dossier ?" LABEL_NAME: "Nom du dossier" LABEL_PARENT: "Dossier parent" BUTTON_CREATE: "CrĂ©er" BUTTON_CANCEL: "Annuler" BUTTON_CLOSE: "Fermer" TITLE_CREATING_PROCESS: "CrĂ©ation du dossier" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Purger tous les messages du dossier ?" BUTTON_CLEAR: "Vider" BUTTON_CANCEL: "Annuler" BUTTON_CLOSE: "Fermer" DANGER_DESC_WARNING: "ATTENTION !" DANGER_DESC_HTML_1: "Cette action effacera tous les emails du dossier %FOLDER% de manière dĂ©finitive." DANGER_DESC_HTML_2: "Une fois lancĂ©, le processus ne peut pas ĂŞtre interrompu ou annulĂ©." TITLE_CLEARING_PROCESS: "Purge du dossier..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importer la clef OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Voir la clef OpenPGP" BUTTON_SELECT: "SĂ©lectionner" BUTTON_CLOSE: "Fermer" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "GĂ©nĂ©rer les clĂ©s OpenPGP" LABEL_EMAIL: "Email" LABEL_NAME: "Nom" LABEL_PASSWORD: "Mot de passe" LABEL_KEY_BIT_LENGTH: "Longueur de la clĂ©" BUTTON_GENERATE_OPEN_PGP_KEYS: "GĂ©nĂ©rer" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "Signer/chiffrer avec OpenPGP" LABEL_SIGN: "Signer" LABEL_ENCRYPT: "Chiffer" LABEL_PASSWORD: "Mot de passe" BUTTON_SIGN: "Signer" BUTTON_ENCRYPT: "Chiffrer" BUTTON_SIGN_AND_ENCRYPT: "Signer et chiffrer" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "ClĂ© PrivĂ©e" LABEL_PASSWORD: "Mot de passe" BUTTON_DECRYPT: "DĂ©chiffrer" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Test d'authentification en deux Ă©tapes" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "CrĂ©er un filtre ?" TITLE_EDIT_FILTER: "Mettre Ă  jour le filtre ?" FILTER_NAME: "Nom" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Fait" BUTTON_ADD_CONDITION: "Ajouter une condition" SELECT_ACTION_NONE: "Aucune" SELECT_ACTION_MOVE_TO: "DĂ©placer vers" SELECT_ACTION_FORWARD_TO: "Faire suivre Ă " SELECT_ACTION_REJECT: "Rejeter" SELECT_ACTION_VACATION_MESSAGE: "Message d'absence" SELECT_ACTION_DISCARD: "Exclure" SELECT_FIELD_FROM: "De" SELECT_FIELD_RECIPIENTS: "Destinataires (A ou CC)" SELECT_FIELD_SUBJECT: "Sujet" SELECT_FIELD_HEADER: "En-tĂŞte" SELECT_FIELD_SIZE: "Taille" SELECT_TYPE_CONTAINS: "Contient" SELECT_TYPE_NOT_CONTAINS: "Ne contient pas" SELECT_TYPE_MATCHES: "Substitutions (* et ? supportĂ©s)" SELECT_TYPE_NOT_MATCHES: "Pas de substitutions (* et ? supportĂ©s)" SELECT_TYPE_REGEXP: "Expression rĂ©gulière" SELECT_TYPE_NOT_REGEXP: "Pas d'expression rĂ©gulière" SELECT_TYPE_EQUAL_TO: "Égal Ă " SELECT_TYPE_NOT_EQUAL_TO: "DiffĂ©rent de" SELECT_TYPE_OVER: "Au-dessus de" SELECT_TYPE_UNDER: "Au-dessous de" SELECT_MATCH_ANY: "Correspondant Ă  l'une des règles suivantes" SELECT_MATCH_ALL: "Correspondant Ă  toutes les règles suivantes" MARK_AS_READ_LABEL: "Marquer comme lu" REPLY_INTERVAL_LABEL: "DĂ©lai de rĂ©ponse (jours)" KEEP_LABEL: "Garder" STOP_LABEL: "Ne pas arrĂŞter le traitement des règles" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Sujet (optionnel)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "Destinataires (sĂ©parĂ©s par des virgules)" REJECT_MESSAGE_LABEL: "Message rejetĂ©" ALL_INCOMING_MESSAGES_DESC: "Tous les messages entrants" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "SĂ©lectionner les dossiers systèmes" SELECT_CHOOSE_ONE: "Faites un choix" SELECT_UNUSE_NAME: "Ne pas utiliser" LABEL_SENT: "EnvoyĂ©s" LABEL_DRAFTS: "Brouillons" LABEL_SPAM: "IndĂ©sirables" LABEL_TRASH: "Corbeille" LABEL_ARCHIVE: "Archiver" BUTTON_CANCEL: "Annuler" BUTTON_CLOSE: "Fermer" NOTIFICATION_SENT: | Vous n'avez pas sĂ©lectionnĂ© de dossier "EnvoyĂ©s" oĂą copier les messages après envoi. Si vous ne souhaitez pas enregistrer une copie des messages envoyĂ©s, sĂ©lectionnez l'option "Ne pas utiliser". NOTIFICATION_DRAFTS: "Vous n'avez pas sĂ©lectionnĂ© de dossier \"Brouillons\" oĂą enregistrer les messages en cours de rĂ©daction." NOTIFICATION_SPAM: | Vous n'avez pas sĂ©lectionnĂ© de dossier "Spam" oĂą placer les indĂ©sirables. Si vous ne souhaitez pas supprimer dĂ©finitivement les messages, sĂ©lectionnez l'option "Ne pas utiliser". NOTIFICATION_TRASH: | Vous n'avez pas sĂ©lectionnĂ© de dossier "Corbeille" oĂą placer les messages supprimĂ©s. Si vous ne souhaitez pas supprimer dĂ©finitivement les messages, sĂ©lectionnez l'option "Ne pas utiliser". NOTIFICATION_ARCHIVE: "Vous n'avez pas sĂ©lectionnĂ© de dossier \"Archive\" oĂą placer les messages archivĂ©s.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Authentification en deux Ă©tapes" LABEL_ENABLE_TWO_FACTOR: "Activer l'authentification en deux Ă©tapes" LABEL_TWO_FACTOR_USER: "Utilisateur" LABEL_TWO_FACTOR_STATUS: "Statut" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "Code de sauvegarde" BUTTON_CREATE: "CrĂ©er une nouvelle clĂ© secrète" BUTTON_ACTIVATE: "Activer" BUTTON_CLEAR: "Effacer" BUTTON_LOGOUT: "DĂ©connexion" BUTTON_DONE: "Fait" BUTTON_TEST: "Tester" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Montrer la clĂ© secrète" BUTTON_HIDE_SECRET: "Masquer la clĂ© secrète" TWO_FACTOR_REQUIRE_DESC: "Votre compte requiert la configuration d'une vĂ©rification en deux Ă©tapes." TWO_FACTOR_SECRET_CONFIGURED_DESC: "ConfigurĂ©" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Non configurĂ©" TWO_FACTOR_SECRET_DESC: >- Importez ces informations dans votre client Google Authenticator (ou un autre client TOTP) en utilisant le code QR fourni ci-dessous ou en entrant les valeurs manuellement. TWO_FACTOR_BACKUP_CODES_DESC: >- Si vous ne pouvez pas recevoir les codes par Google Authenticator, vous pouvez utiliser les codes de sauvegarde pour vous connecter. Après avoir fait cela, il deviendra inactif. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Vous ne pouvez pas modifier ce paramètre avant de l'avoir essayĂ©." TITLES: LOADING: "Chargement" LOGIN: "Identifiant" MAILBOX: "BoĂ®te mail" SETTINGS: "Paramètres" COMPOSE: "Nouveau message" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Le fichier est trop volumineux" ERROR_FILE_PARTIALLY_UPLOADED: "Le fichier a Ă©tĂ© envoyĂ© partiellement Ă  cause d'une erreur inconnue" ERROR_NO_FILE_UPLOADED: "Aucun fichier tĂ©lĂ©versĂ©" ERROR_MISSING_TEMP_FOLDER: "Le fichier temporaire est manquant" ERROR_ON_SAVING_FILE: "Une erreur inconnue s'est produite" ERROR_FILE_TYPE: "Type de fichier invalide" ERROR_UNKNOWN: "Une erreur inconnue de tĂ©lĂ©versement de fichier s'est produite" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Non-formatĂ©" TEXT_SWITCHER_RICH_FORMATTING: "Format riche" TEXT_SWITCHER_CONFIRM: "Le formatage du texte et les images seront perdus. ĂŠtes-vous sĂ»r de vouloir continuer ?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personnel" LABEL_GENERAL_NAME: "GĂ©nĂ©ral" LABEL_CONTACTS_NAME: "Contacts" LABEL_FOLDERS_NAME: "Dossiers" LABEL_ACCOUNTS_NAME: "Comptes" LABEL_IDENTITY_NAME: "IdentitĂ©" LABEL_IDENTITIES_NAME: "IdentitĂ©s" LABEL_FILTERS_NAME: "Filtres" LABEL_TEMPLATES_NAME: "Modèles" LABEL_SECURITY_NAME: "SĂ©curitĂ©" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Thèmes" LABEL_CHANGE_PASSWORD_NAME: "Mot de passe" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Retour" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtres" BUTTON_SAVE: "Enregistrer" BUTTON_ADD_FILTER: "Ajouter un filtre" BUTTON_DELETE: "Effacer" BUTTON_RAW_SCRIPT: "Utiliser le script d'un utilisateur" SUBNAME_NONE: "Aucun" SUBNAME_MOVE_TO: "DĂ©placer vers \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Faire suivre Ă  \"%EMAIL%\"" SUBNAME_REJECT: "Rejeter" SUBNAME_VACATION_MESSAGE: "Message d'absence" SUBNAME_DISCARD: "Exclure" CAPABILITY_LABEL: "CapacitĂ©" LOADING_PROCESS: "Mise Ă  jour de la liste de filtres" DELETING_ASK: "ĂŠtes-vous sĂ»r ?" CHACHES_NEED_TO_BE_SAVED_DESC: "Ces changements doivent ĂŞtre enregistrĂ©s sur le serveur." SETTINGS_IDENTITY: LEGEND_IDENTITY: "IdentitĂ©" LABEL_DISPLAY_NAME: "Nom" LABEL_REPLY_TO: "RĂ©pondre Ă " LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Ajouter votre signature Ă  tous les messages sortants" SETTINGS_SECURITY: LEGEND_SECURITY: "SĂ©curitĂ©" LABEL_CONFIGURE_TWO_FACTOR: "Configurer l'authentification en deux Ă©tapes" LABEL_AUTOLOGOUT: "DĂ©connexion automatique" AUTOLOGIN_NEVER_OPTION_NAME: "Jamais" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% heure(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "GĂ©nĂ©ral" LABEL_LANGUAGE: "Langue" LABEL_IDENTITY: "IdentitĂ©" LABEL_LAYOUT: "Disposition" LABEL_LAYOUT_NO_SPLIT: "Pas de sĂ©paration" LABEL_LAYOUT_VERTICAL_SPLIT: "SĂ©paration verticale" LABEL_LAYOUT_HORIZONTAL_SPLIT: "SĂ©paration horizontale" LABEL_EDITOR: "Éditeur de texte par dĂ©faut" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Non-formatĂ©" LABEL_EDITOR_HTML_FORCED: "HTML (forcĂ©)" LABEL_EDITOR_PLAIN_FORCED: "Non-formatĂ© (forcĂ©)" LABEL_ANIMATION: "Animation de l'interface" LABEL_ANIMATION_FULL: "Plein" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Aucune" LABEL_VIEW_OPTIONS: "Voir les options" LABEL_USE_PREVIEW_PANE: "Utiliser le panneau de prĂ©visualisation" LABEL_USE_CHECKBOXES_IN_LIST: "Afficher des cases Ă  cocher dans la liste" LABEL_USE_THREADS: "Regrouper en conversations" LABEL_REPLY_SAME_FOLDER: "Placer les rĂ©ponses dans le dossier du message" LABEL_SHOW_IMAGES: "Toujours afficher les images dans le mail" LABEL_SHOW_ANIMATION: "Voir les animations" LABEL_MESSAGE_PER_PAGE: "Messages par page" LABEL_NOTIFICATIONS: "Notifications" LABEL_SOUND_NOTIFICATION: "Son de notification" LABEL_CHROME_NOTIFICATION_DESC: "Afficher un pop-up de notification pour les nouveaux messages" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(BloquĂ© par le navigateur)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contacts" LABEL_CONTACTS_AUTOSAVE: "Ajouter automatiquement les destinataires Ă  votre carnet d'adresses" LEGEND_CONTACTS_SYNC: "Synchronisation Ă  distance (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Activer la synchronisation Ă  distance" LABEL_CONTACTS_SYNC_SERVER: "Serveur" LABEL_CONTACTS_SYNC_AB_URL: "URL du carnet d'adresses" LABEL_CONTACTS_SYNC_USER: "Utilisateur" LABEL_CONTACTS_SYNC_PASSWORD: "Mot de passe" SETTINGS_THEMES: LEGEND_THEMES: "Thèmes" LEGEND_THEMES_CUSTOM: "Configuration du thème personnel" LABEL_CUSTOM_TYPE: "Type" LABEL_CUSTOM_TYPE_LIGHT: "Lumineux" LABEL_CUSTOM_TYPE_DARK: "Sombre" LABEL_CUSTOM_BACKGROUND_IMAGE: "Image de fond" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Envoyer une image de fond (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Fichier trop volumineux" ERROR_FILE_TYPE_ERROR: "Type de fichier invalide (JPG et PNG seulement)" ERROR_UNKNOWN: "Une erreur inconnue de tĂ©lĂ©versement de fichier s'est produite" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Se connecter Ă  Google" BUTTON_GOOGLE_DISCONNECT: "Se dĂ©connecter de Google" MAIN_GOOGLE_DESC: "Après l'activation de la connexion via Google, vous pouvez vous connecter Ă  ce compte en utilisant le bouton Google sur l'Ă©cran de connexion." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Se connecter Ă  Facebook" BUTTON_FACEBOOK_DISCONNECT: "Se dĂ©connecter de Facebook" MAIN_FACEBOOK_DESC: "Après l'activation de la connexion via Facebook, vous pouvez vous connecter Ă  ce compte en utilisant le bouton Facebook sur l'Ă©cran de connexion." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Se connecter Ă  Twitter" BUTTON_TWITTER_DISCONNECT: "Se dĂ©connecter de Twitter" MAIN_TWITTER_DESC: "Après l'activation de la connexion via Twitter, vous pouvez vous connecter Ă  ce compte en utilisant le bouton Twitter sur l'Ă©cran de connexion." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Liste des dossiers" BUTTON_CREATE: "CrĂ©er un dossier" BUTTON_SYSTEM: "Dossiers systèmes" BUTTON_DELETE: "Supprimer" BUTTON_SUBSCRIBE: "S'abonner" BUTTON_UNSUBSCRIBE: "Se dĂ©sabonner" LOADING_PROCESS: "Mise Ă  jour de la liste des dossiers" CREATING_PROCESS: "CrĂ©ation d'un dossier" DELETING_PROCESS: "Suppression d'un dossier" RENAMING_PROCESS: "Renommer un dossier" DELETING_ASK: "ĂŠtes-vous sĂ»r ?" TO_MANY_FOLDERS_DESC_1: "Vous avez trop de dossiers !" TO_MANY_FOLDERS_DESC_2: "Seulement une partie d'entre eux ont Ă©tĂ© affichĂ©s afin de limiter les problèmes de performance." HELP_DELETE_FOLDER: "Supprimer le dossier" HELP_SHOW_HIDE_FOLDER: "Afficher/masquer le dossier" HELP_CHECK_FOR_NEW_MESSAGES: "Cocher/DĂ©cocher pour les nouveaux messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Liste des comptes" LEGEND_IDENTITIES: "IdentitĂ©s" LEGEND_ACCOUNTS_AND_IDENTITIES: "Comptes et IdentitĂ©s" BUTTON_ADD_ACCOUNT: "Ajouter un compte" BUTTON_ADD_IDENTITY: "Ajouter une identitĂ©" BUTTON_DELETE: "Supprimer" LOADING_PROCESS: "Mise Ă  jour de la liste des comptes" DELETING_ASK: "ĂŠtes-vous sĂ»r ?" DEFAULT_IDENTITY_LABEL: "dĂ©faut" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "IdentitĂ©" LEGEND_IDENTITIES: "IdentitĂ©s supplĂ©mentaires" LABEL_DEFAULT: "DĂ©faut" LABEL_DISPLAY_NAME: "Nom" LABEL_REPLY_TO: "RĂ©pondre Ă " LABEL_SIGNATURE: "Signature" LABEL_ADD_SIGNATURE_TO_ALL: "Ajouter votre signature Ă  tous les messages sortants" BUTTON_ADD_IDENTITY: "Ajouter une identitiĂ©" BUTTON_DELETE: "Supprimer" LOADING_PROCESS: "Met Ă  jour la liste d'identitĂ©s" DELETING_ASK: "ĂŠtes-vous sĂ»r ?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Modifier le mot de passe" LABEL_CURRENT_PASSWORD: "Mot de passe actuel" LABEL_NEW_PASSWORD: "Nouveau mot de passe" LABEL_REPEAT_PASSWORD: "Confirmation du nouveau mot de passe" BUTTON_UPDATE_PASSWORD: "Enregistrer le nouveau mot de passe" ERROR_PASSWORD_MISMATCH: "Les mots de passe ne correspondent pas, merci de rĂ©essayer" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importer la clĂ© OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "GĂ©nĂ©rer les clĂ©s OpenPGP" TITLE_PRIVATE: "PrivĂ©e" TITLE_PUBLIC: "Publique" DELETING_ASK: "ĂŠtes-vous sĂ»r ?" GENERATE_ONLY_HTTPS: "HTTPS seulement" LABEL_ALLOW_DRAFT_AUTOSAVE: "Brouillon sauvegardĂ© automatiquement" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Aide pour les raccourcis clavier" TAB_MAILBOX: "BoĂ®te aux lettres" TAB_MESSAGE_LIST: "Liste des messages" TAB_MESSAGE_VIEW: "Message" TAB_COMPOSE: "Écrire" LABEL_OPEN_USER_DROPDOWN: "Ouvrir la liste dĂ©roulante des utilisateurs" LABEL_REPLY: "RĂ©pondre" LABEL_REPLY_ALL: "RĂ©pondre Ă  tous" LABEL_FORWARD: "TransfĂ©rer" LABEL_FORWARD_MULTIPLY: "TransfĂ©rer comme pièce(s) jointe(s)" LABEL_HELP: "Aide" LABEL_CHECK_ALL: "SĂ©lectionner tous les messages" LABEL_ARCHIVE: "Archiver" LABEL_DELETE: "Supprimer" LABEL_OPEN_THREAD: "Ouvrir le message selectionnĂ©" LABEL_MOVE: "DĂ©placer" LABEL_READ: "Marquer les messages sĂ©lectionnĂ©s comme lus" LABEL_UNREAD: "Marquer les messages sĂ©lectionnĂ©s comme non-lus" LABEL_IMPORTANT: "Important, drapeau sĂ©lectionnĂ©s" LABEL_SEARCH: "Rechercher" LABEL_CANCEL_SEARCH: "Annuler la recherche" LABEL_FULLSCREEN_ENTER: "Plein Ă©cran (Mise en page avec aperçu)" LABEL_VIEW_MESSAGE_ENTER: "Voir le message (Mise en page sans aperçu)" LABEL_SWITCH_TO_MESSAGE: "Aller au message sĂ©lectionnĂ©" LABEL_SWITCH_TO_FOLDER_LIST: "Aller Ă  la liste des dossiers" LABEL_FULLSCREEN_TOGGLE: "Basculer en mode plein Ă©cran" LABEL_BLOCKQUOTES_TOGGLE: "Basculer les citations en bloc" LABEL_THREAD_NEXT: "Message prĂ©cĂ©dent de la liste" LABEL_THREAD_PREV: "Message suivant de la liste" LABEL_PRINT: "Imprimer" LABEL_EXIT_FULLSCREEN: "Quitter le mode plein Ă©cran" LABEL_CLOSE_MESSAGE: "Fermer le message (Mise en page sans aperçu)" LABEL_SWITCH_TO_LIST: "Retourner Ă  la liste des messages" LABEL_OPEN_COMPOSE_POPUP: "Ouvrir la fenĂŞtre d'Ă©dition" LABEL_MINIMIZE_COMPOSE_POPUP: "RĂ©duire la fenĂŞtre d'Ă©dition" LABEL_OPEN_IDENTITIES_DROPDOWN: "Liste de sĂ©lection des identitĂ©s" LABEL_SAVE_MESSAGE: "Enregistrer le message" LABEL_SEND_MESSAGE: "Envoyer le message" LABEL_CLOSE_COMPOSE: "Fermer la fenĂŞtre d'Ă©dition" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Aucune clĂ© publique n'a pu ĂŞtre trouvĂ©e" NO_PUBLIC_KEYS_FOUND_FOR: "Aucune clĂ© publique n'a pu ĂŞtre trouvĂ©e pour \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Aucune clĂ© privĂ©e n'a pu ĂŞtre trouvĂ©e" NO_PRIVATE_KEY_FOUND_FOR: "Aucune clĂ© privĂ©e n'a pu ĂŞtre trouvĂ©e pour \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Ajouter une clĂ© publique" SELECT_A_PRIVATE_KEY: "Choisir une clĂ© privĂ©e" UNVERIFIRED_SIGNATURE: "Signature non vĂ©rifiĂ©e" DECRYPTION_ERROR: "Erreur lors du dĂ©chiffrement OpenPGP" GOOD_SIGNATURE: "Signature valide pour %USER%" PGP_ERROR: "Erreur OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "Merci de spĂ©cifier une adresse email pour DE" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Merci de spĂ©cifier au moins un destinataire" NOTIFICATIONS: INVALID_TOKEN: "Jeton invalide" AUTH_ERROR: "L'authentification a Ă©chouĂ©" ACCESS_ERROR: "Erreur d'accès" CONNECTION_ERROR: "Serveur injoignable" CAPTCHA_ERROR: "CAPTCHA incorrect." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Cet ID social n'est pas encore assignĂ© Ă  une adresse email. Connectez-vous en utilisant les informations d'identification du courrier Ă©lectronique et activez cette fonctionnalitĂ© dans les paramètres de votre compte. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Cet ID social n'est pas encore assignĂ© Ă  une adresse email. Connectez-vous en utilisant les informations d'identification du courrier Ă©lectronique et activez cette fonctionnalitĂ© dans les paramètres de votre compte. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Cet ID social n'est pas encore assignĂ© Ă  une adresse email. Connectez-vous en utilisant les informations d'identification du courrier Ă©lectronique et activez cette fonctionnalitĂ© dans les paramètres de votre compte. DOMAIN_NOT_ALLOWED: "Ce domaine n'est pas autorisĂ©" ACCOUNT_NOT_ALLOWED: "Ce compte n'est pas autorisĂ©" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Double authentification requise" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erreur lors de la double authentification" COULD_NOT_SAVE_NEW_PASSWORD: "Impossible d'enregistrer le nouveau mot de passe" CURRENT_PASSWORD_INCORRECT: "Le mot de passe actuel est incorrect" NEW_PASSWORD_SHORT: "Le mot de passe est trop court" NEW_PASSWORD_WEAK: "Le mot de passe n'est pas assez fort" NEW_PASSWORD_FORBIDDENT: "Le mot de passe contient des caractères invalides" CONTACTS_SYNC_ERROR: "Erreur de synchronisation des contacts" CANT_GET_MESSAGE_LIST: "Impossible d'obtenir la liste des messages" CANT_GET_MESSAGE: "Impossible d'obtenir le message" CANT_DELETE_MESSAGE: "Impossible de supprimer le message" CANT_MOVE_MESSAGE: "Impossible de dĂ©placer le message" CANT_SAVE_MESSAGE: "Impossible d'enregistrer le message" CANT_SEND_MESSAGE: "Impossible d'envoyer le message" INVALID_RECIPIENTS: "Destinataires invalides" CANT_SAVE_FILTERS: "Impossible d'enregistrer les filtres" CANT_GET_FILTERS: "Impossible d'obtenir les filtres" FILTERS_ARE_NOT_CORRECT: "Les filtres ne sont pas corrects" CANT_CREATE_FOLDER: "Impossible de crĂ©er le dossier" CANT_RENAME_FOLDER: "Impossible de renommer le dossier" CANT_DELETE_FOLDER: "Impossible de supprimer le dossier" CANT_DELETE_NON_EMPTY_FOLDER: "Impossible de supprimer un dossier non vide" CANT_SUBSCRIBE_FOLDER: "Impossible de s'abonner au dossier" CANT_UNSUBSCRIBE_FOLDER: "Impossible de se dĂ©sabonner du dossier" CANT_SAVE_SETTINGS: "Impossible d'enregistrer les paramètres" CANT_SAVE_PLUGIN_SETTINGS: "Impossible d'enregistrer les paramètres" DOMAIN_ALREADY_EXISTS: "Le domaine existe dĂ©jĂ " CANT_INSTALL_PACKAGE: "Impossible d'installer le paquet" CANT_DELETE_PACKAGE: "Impossible de supprimer le paquet" INVALID_PLUGIN_PACKAGE: "Ce plug-in est invalide" UNSUPPORTED_PLUGIN_PACKAGE: "Ce plug-in n'est pas supportĂ©" LICENSING_SERVER_IS_UNAVAILABLE: "Le serveur d'abonnement est inaccessible" LICENSING_DOMAIN_EXPIRED: "L'abonnement pour ce domaine a expirĂ©." LICENSING_DOMAIN_BANNED: "L'abonnement pour ce domaine est interdit." DEMO_SEND_MESSAGE_ERROR: "Pour des raisons de sĂ©curitĂ©, ce compte de dĂ©monstration n'est pas autorisĂ© Ă  envoyer des messages Ă  des adresses e-mail externes !" DEMO_ACCOUNT_ERROR: "Pour des raisons de sĂ©curitĂ©, ce compte n'est pas autorisĂ© Ă  faire cette action !" ACCOUNT_ALREADY_EXISTS: "Ce compte existe dĂ©jĂ " ACCOUNT_DOES_NOT_EXIST: "Ce compte n'existe pas" MAIL_SERVER_ERROR: "Une erreur est survenue lors de l'accès au serveur mail" INVALID_INPUT_ARGUMENT: "Argument invalide" UNKNOWN_ERROR: "Erreur inconnue" STATIC: BACK_LINK: "Recharger" DOMAIN_LIST_DESC: "Liste des domaines auxquels le webmail est autorisĂ© Ă  accĂ©der." PHP_EXSTENSIONS_ERROR_DESC: "Les extensions PHP nĂ©cessaires ne sont pas disponibles dans votre configuration de PHP !" PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est infĂ©rieure Ă  la minimale requise 5.3.0 !" NO_SCRIPT_TITLE: "JavaScript est nĂ©cessaire pour cette application." NO_SCRIPT_DESC: | Le support de JavaScript n'est pas disponible dans votre navigateur. S'il vous plaĂ®t activez le support de JavaScript dans les paramètres de votre navigateur et rĂ©essayez. NO_COOKIE_TITLE: "Le support des cookies est nĂ©cessaire pour cette application." NO_COOKIE_DESC: | Le support des cookies n'est pas disponible dans votre navigateur. S'il vous plaĂ®t activez le support des cookies dans les paramètres de votre navigateur et rĂ©essayez. BAD_BROWSER_TITLE: "Votre navigateur est obsolète." BAD_BROWSER_DESC: | Pour utiliser toutes les fonctionnalitĂ©s de l'application, tĂ©lĂ©chargez et installez l'un de ces navigateurs : rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/hu_HU.yml000066400000000000000000001017241361462701300262140ustar00rootroot00000000000000hu_HU: LOGIN: LABEL_EMAIL: "E-mail" LABEL_LOGIN: "BejelentkezĂ©s" LABEL_PASSWORD: "JelszĂł" LABEL_SIGN_ME: "MegjegyzĂ©s" LABEL_VERIFICATION_CODE: "MegerĹ‘sĂ­tĹ‘ kĂłd" LABEL_DONT_ASK_VERIFICATION_CODE: "KĂ©t hĂ©tig ne kĂ©rje a kĂłdot" BUTTON_SIGN_IN: "BelĂ©pĂ©s" TITLE_SIGN_IN_GOOGLE: "BelĂ©pĂ©s Google használatával" TITLE_SIGN_IN_FACEBOOK: "BelĂ©pĂ©s Facebook használatával" TITLE_SIGN_IN_TWITTER: "BelĂ©pĂ©s Twitter használatával" LABEL_FORGOT_PASSWORD: "Elfelejtett jelszĂł" LABEL_REGISTRATION: "RegisztráciĂł" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "FiĂłk hozzáadás" BUTTON_SETTINGS: "BeállĂ­tások" BUTTON_HELP: "SĂşgĂł" BUTTON_LOGOUT: "KilĂ©pĂ©s" MOBILE: BUTTON_MOBILE_VERSION: "Mobil verziĂł" BUTTON_DESKTOP_VERSION: "Asztali verziĂł" SEARCH: MAIN_INPUT_PLACEHOLDER: "KeresĂ©s" TITLE_ADV: "RĂ©szletes keresĂ©s" LABEL_ADV_FROM: "FeladĂł" LABEL_ADV_TO: "CĂ­mzett" LABEL_ADV_SUBJECT: "Tárgy" LABEL_ADV_TEXT: "Szöveg" LABEL_ADV_HAS_ATTACHMENT: "Van mellĂ©klete" LABEL_ADV_HAS_ATTACHMENTS: "Vannak mellĂ©kletei" LABEL_ADV_FLAGGED: "Megjelölve" LABEL_ADV_UNSEEN: "ÉszrevĂ©tlen" LABEL_ADV_DATE: "Dátum" LABEL_ADV_DATE_ALL: "Ă–sszes" LABEL_ADV_DATE_3_DAYS: "Legfeljebb 3 napos" LABEL_ADV_DATE_7_DAYS: "Legfeljebb 1 hetes" LABEL_ADV_DATE_MONTH: "Legfeljebb 1 hĂłnapos" LABEL_ADV_DATE_3_MONTHS: "Legfeljebb 3 hĂłnapos" LABEL_ADV_DATE_6_MONTHS: "Legfeljebb 6 hĂłnapos" LABEL_ADV_DATE_YEAR: "Legfeljebb 1 Ă©ves" BUTTON_ADV_SEARCH: "KeresĂ©s" PREVIEW_POPUP: FULLSCREEN: "Teljes kĂ©pernyĹ‘ váltása" ZOOM: "NagyĂ­tás ki/be" CLOSE: "Bezárás (Esc)" LOADING: "BetöltĂ©s..." GALLERY_PREV: "ElĹ‘zĹ‘ (Bal nyĂ­l gomb)" GALLERY_NEXT: "KövetkezĹ‘ (Jobb nyĂ­l gomb)" GALLERY_COUNTER: "%curr% / %total%" IMAGE_ERROR: "A kĂ©pet nem sikerĂĽlt betölteni." AJAX_ERROR: "A tartalmat nem sikerĂĽlt betölteni." FOLDER_LIST: BUTTON_COMPOSE: "LevĂ©lĂ­rás" BUTTON_CONTACTS: "NĂ©vjegyek" BUTTON_NEW_MESSAGE: "Ăšj ĂĽzenet" INBOX_NAME: "BeĂ©rkezĹ‘ levelek" SENT_NAME: "ElkĂĽldött levelek" DRAFTS_NAME: "Piszkozatok" SPAM_NAME: "LevĂ©lszemĂ©t" TRASH_NAME: "Lomtár" ARCHIVE_NAME: "ArchĂ­vum" QUOTA: TITLE: "Helyfoglalás" MESSAGE_LIST: BUTTON_RELOAD: "Ăśzenetlista ĂşjratöltĂ©s" BUTTON_MOVE_TO: "ĂthelyezĂ©s ide" BUTTON_DELETE: "TörlĂ©s" BUTTON_ARCHIVE: "ArchĂ­vum" BUTTON_SPAM: "LevĂ©lszemĂ©t" BUTTON_NOT_SPAM: "Nem szemĂ©t" BUTTON_EMPTY_FOLDER: "Mappa ĂĽrĂ­tĂ©s" BUTTON_MULTY_FORWARD: "TovábbĂ­tás mellĂ©klet(en)kĂ©nt" BUTTON_DELETE_WITHOUT_MOVE: "TörlĂ©s vĂ©glegesen" BUTTON_MORE: "Tovább" MENU_SET_SEEN: "MegjelölĂ©s olvasottkĂ©nt" MENU_SET_ALL_SEEN: "Ă–sszes megjelölĂ©se olvasottkĂ©nt" MENU_UNSET_SEEN: "MegjelölĂ©s olvasatlankĂ©nt" MENU_SET_FLAG: "MegjelölĂ©s" MENU_UNSET_FLAG: "Jelöletlen" MENU_SELECT_ALL: "Ă–sszes" MENU_SELECT_NONE: "Nincs" MENU_SELECT_INVERT: "Invertálás" MENU_SELECT_UNSEEN: "Olvasatlan" MENU_SELECT_SEEN: "Olvasott" MENU_SELECT_FLAGGED: "Megjelölt" MENU_SELECT_UNFLAGGED: "Jelöletlen" EMPTY_LIST: "Lista ĂĽres." EMPTY_SEARCH_LIST: "Nincs a keresĂ©snek megfelelĹ‘ levĂ©l." SEARCH_RESULT_FOR: "KeresĂ©si eredmĂ©nyek ehhez: \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "vissza az ĂĽzenetlistához" LIST_LOADING: "BetöltĂ©s" EMPTY_SUBJECT_TEXT: "(Nincs tárgy)" PUT_MESSAGE_HERE: "HĂşzz ide egy ĂĽzenetet, hogy megjelenjen a listában" TODAY_AT: "ma ekkor: %TIME%" YESTERDAY_AT: "tegnap ekkor: %TIME%" SEARCH_PLACEHOLDER: "KeresĂ©s" NEW_MESSAGE_NOTIFICATION: "%COUNT% olvasatlan ĂĽzeneted van!" QUOTA_SIZE: "Felhasználva %SIZE% (%PROC%%) ebbĹ‘l: %LIMIT%" MESSAGE: BUTTON_EDIT: "SzerkesztĂ©s" BUTTON_BACK: "Vissza" BUTTON_CLOSE: "Bezárás" BUTTON_DELETE: "TĹ‘rlĂ©s" BUTTON_UNSUBSCRIBE: "Leiratkozás errĹ‘l a listárĂłl" BUTTON_ARCHIVE: "ArchĂ­vum" BUTTON_SPAM: "LevĂ©lszemĂ©t" BUTTON_NOT_SPAM: "Nem levĂ©lszemĂ©t" BUTTON_MOVE_TO: "ĂthelyezĂ©s" BUTTON_MORE: "Tovább" BUTTON_REPLY: "Válasz" BUTTON_REPLY_ALL: "Válasz mindenkinek" BUTTON_FORWARD: "TovábbĂ­tás" BUTTON_FORWARD_AS_ATTACHMENT: "TovábbĂ­tás mellĂ©kletkĂ©nt" BUTTON_EDIT_AS_NEW: "SzerkesztĂ©s ĂşjkĂ©nt" BUTTON_SHOW_IMAGES: "KĂĽlsĹ‘ kĂ©pek megjelenĂ­tĂ©se" BUTTON_NOTIFY_READ_RECEIPT: "A feladĂł Ă©rtesĂ­tĂ©st kĂ©rt a levĂ©l elolvasása után." BUTTON_IN_NEW_WINDOW: "MegtekintĂ©s Ăşj ablakban" BUTTON_THREAD_LIST: "Szál lista" BUTTON_THREAD_PREV: "ElĹ‘zĹ‘" BUTTON_THREAD_NEXT: "KövetkezĹ‘" BUTTON_THREAD_MORE: "További ĂĽzenetek" MENU_HEADERS: "Ăśzenet fejlĂ©c megjelenĂ­tĂ©se" MENU_VIEW_ORIGINAL: "Eredeti megjelenĂ­tĂ©se" MENU_DOWNLOAD_ORIGINAL: ".eml fájl letöltĂ©s" MENU_FILTER_SIMILAR: "HasonlĂł ĂĽzenetek szűrĂ©se" MENU_PRINT: "Nyomtatás" EMPTY_SUBJECT_TEXT: "(Nincs tárgy)" LABEL_SUBJECT: "Tárgy" LABEL_DATE: "Dátum" LABEL_FROM: "FeladĂł" LABEL_FROM_SHORT: "feladĂł" LABEL_TO: "CĂ­mzett" LABEL_TO_SHORT: "cĂ­mzett" LABEL_CC: "Másolat" LABEL_BCC: "Titkos másolat" LABEL_REPLY_TO: "VálaszcĂ­m" PRINT_LABEL_FROM: "FeladĂł" PRINT_LABEL_TO: "CĂ­mzett" PRINT_LABEL_CC: "Másolat" PRINT_LABEL_BCC: "Titkos másolat" PRINT_LABEL_REPLY_TO: "VálaszcĂ­m" PRINT_LABEL_DATE: "Dátum" PRINT_LABEL_SUBJECT: "Tárgy" PRINT_LABEL_ATTACHMENTS: "MellĂ©kletek" MESSAGE_LOADING: "BetöltĂ©s" MESSAGE_VIEW_DESC: "Válassz egy ĂĽzenetet a listábĂłl, hogy megjelenjen itt." MESSAGE_VIEW_MOVE_DESC: "A cĂ©l kiválasztásához a bal oldali panelen kattints a mappa nevĂ©re." PGP_PASSWORD_INPUT_PLACEHOLDER: "JelszĂł" PGP_SIGNED_MESSAGE_DESC: "OpenPGP aláírt ĂĽzenet (kattints az ellenĹ‘rzĂ©shez)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP kĂłdolt ĂĽzenet (kattints a visszafejtĂ©shez)" LINK_DOWNLOAD_AS_ZIP: "LetöltĂ©s zip fájlkĂ©nt" LINK_SAVE_TO_OWNCLOUD: "MentĂ©s ownCloud-ra" LINK_SAVE_TO_CLOUD: "MentĂ©s a felhĹ‘be" LINK_SAVE_TO_DROPBOX: "MentĂ©s Dropbox-ra" READ_RECEIPT: SUBJECT: "Visszaigazolás (megjelenĂ­tve) - %SUBJECT%" BODY: | Ez egy ide kĂĽldött ĂĽzenet olvasási visszaigazolása: %READ-RECEIPT%. MegjegyzĂ©s: Ez az olvasási visszaigazolás csak azt igazolja, hogy az ĂĽzenet megjelenĂ­tĂ©sre kerĂĽlt a cĂ­mzett számĂ­tĂłgĂ©pĂ©n. Nincs rá garancia, hogy a cĂ­mzett elolvasta volna az ĂĽzenetet illetve megĂ©rtette volna annak tartalmát. SUGGESTIONS: SEARCHING_DESC: "KeresĂ©s..." CONTACTS: LEGEND_CONTACTS: "NĂ©vjegyek" SEARCH_INPUT_PLACEHOLDER: "KeresĂ©s" BUTTON_ADD_CONTACT: "NĂ©vjegy hozzáadás" BUTTON_CREATE_CONTACT: "LĂ©trehozás" BUTTON_UPDATE_CONTACT: "FrissĂ­tĂ©s" BUTTON_IMPORT: "Importálás (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Importálás hiba (Ă©rvĂ©nytelen fájl formátum)" LIST_LOADING: "BetöltĂ©s" EMPTY_LIST: "Nincsenek nĂ©vjegyek" EMPTY_SEARCH: "Nem találtam nĂ©vjegyeket" CLEAR_SEARCH: "KeresĂ©s törlĂ©se" CONTACT_VIEW_DESC: "Válassz egy nĂ©vjegyet a listábĂłl, hogy itt megjelenjen." LABEL_DISPLAY_NAME: "MegjelenĂ­tendĹ‘ nĂ©v" LABEL_EMAIL: "E-mail" LABEL_PHONE: "Telefonszám" LABEL_WEB: "Web" LABEL_BIRTHDAY: "SzĂĽletĂ©snap" LINK_ADD_EMAIL: "Adj meg egy e-mail cĂ­met" LINK_ADD_PHONE: "Adj meg egy telefonszámot" LINK_BIRTHDAY: "SzĂĽletĂ©snap" PLACEHOLDER_ENTER_DISPLAY_NAME: "Add meg a megjelenĂ­tendĹ‘ nevet" PLACEHOLDER_ENTER_LAST_NAME: "Add meg a vezetĂ©knevet" PLACEHOLDER_ENTER_FIRST_NAME: "Add meg a keresztnevet" PLACEHOLDER_ENTER_NICK_NAME: "Add meg a felhasználĂłnevet" LABEL_READ_ONLY: "Csak olvasás" LABEL_SHARE: "Megosztás" ADD_MENU_LABEL: "Hozzáadás" ADD_MENU_NICKNAME: "FelhasználĂłnĂ©v" ADD_MENU_NOTES: "Jegyzetek" ADD_MENU_EMAIL: "E-mail" ADD_MENU_PHONE: "Telefonszám" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "CĂ­m" ADD_MENU_BIRTHDAY: "SzĂĽletĂ©snap" ADD_MENU_TAGS: "CĂ­mkĂ©k" BUTTON_SHARE_NONE: "Semmi" BUTTON_SHARE_ALL: "Mindenki" BUTTON_SYNC: "Szinkronizálás (CardDAV)" COMPOSE: TITLE_FROM: "FeladĂł" TITLE_TO: "CĂ­mzett" TITLE_CC: "Másolat" TITLE_BCC: "Titkos másolat" TITLE_REPLY_TO: "VálaszcĂ­m" TITLE_SUBJECT: "Tárgy" LINK_SHOW_INPUTS: "összes mezĹ‘" BUTTON_SEND: "KĂĽldĂ©s" BUTTON_SAVE: "MentĂ©s" BUTTON_DELETE: "TörlĂ©s" BUTTON_CANCEL: "MĂ©gse" BUTTON_MINIMIZE: "Kis mĂ©ret" SAVED_TIME: "Mentve ekkor: %TIME%" SAVED_ERROR_ON_SEND: "Ăśzenet elkĂĽldve, de nem lett mentve az elkĂĽldött elemek mappájába" DISCARD_UNSAVED_DATA: "Nem mentett adatok elvetĂ©se?" ATTACH_FILES: "MellĂ©klet" ATTACH_DROP_FILES_DESC: "HĂşzd ide a fájlokat" ATTACH_ITEM_CANCEL: "MĂ©gse" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% Ă­rta" FORWARD_MESSAGE_TOP_TITLE: "-------- TovábbĂ­tott ĂĽzenet -------" FORWARD_MESSAGE_TOP_FROM: "FeladĂł" FORWARD_MESSAGE_TOP_TO: "CĂ­mzett" FORWARD_MESSAGE_TOP_CC: "Másolat" FORWARD_MESSAGE_TOP_SENT: "ElkĂĽldött levelek" FORWARD_MESSAGE_TOP_SUBJECT: "Tárgy" EMPTY_TO_ERROR_DESC: "Legalább egy cĂ­mzettet meg kell adni" NO_ATTACHMENTS_HERE_DESC: "Nincsenek mellĂ©kletek." ATTACHMENTS_ERROR_DESC: "Figyelem! MĂ©g nem lett feltöltve minden mellĂ©klet." ATTACHMENTS_UPLOAD_ERROR_DESC: "MĂ©g nem lett feltöltve minden mellĂ©klet." BUTTON_REQUEST_READ_RECEIPT: "Olvasási visszaigazolás kĂ©rĂ©se" BUTTON_MARK_AS_IMPORTANT: "MegjelölĂ©s fontoskĂ©nt" BUTTON_OPEN_PGP: "OpenPGP (csak egyszerű szöveg)" BUTTON_REQUEST_DSN: "TovábbĂ­tási visszaigazolás kĂ©rĂ©s" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Bezár" POPUPS_ASK: BUTTON_YES: "Igen" BUTTON_NO: "Nem" DESC_WANT_CLOSE_THIS_WINDOW: "Biztos, hogy be akarod zárni ezt az ablakot?" DESC_WANT_DELETE_MESSAGES: "Biztos, hogy törölni akarod az ĂĽzenete(ke)t?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Nyelv kiválasztás" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Ăšj fiĂłk?" BUTTON_ADD_ACCOUNT: "Hozzáadás" TITLE_UPDATE_ACCOUNT: "FiĂłk frissĂ­tĂ©se?" BUTTON_UPDATE_ACCOUNT: "FrissĂ­tĂ©s" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Identitás hozzáadás?" TITLE_UPDATE_IDENTITY: "FrissĂ­tsĂĽk az identitást?" BUTTON_ADD_IDENTITY: "Hozzáadás" BUTTON_UPDATE_IDENTITY: "FrissĂ­tĂ©s" LABEL_EMAIL: "E-mail" LABEL_NAME: "NĂ©v" LABEL_REPLY_TO: "VálaszcĂ­m" LABEL_SIGNATURE: "Aláírás" LABEL_CC: "Másolat" LABEL_BCC: "Titkos másolat" LABEL_SIGNATURE_INSERT_BEFORE: "SzĂşrja be ezt az aláírást az idĂ©zett szöveg elĂ© a válaszokban" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "LĂ©trehozzuk a mappát?" LABEL_NAME: "Mappa nĂ©v" LABEL_PARENT: "SzĂĽlĹ‘ mappa" BUTTON_CREATE: "LĂ©trehozás" BUTTON_CANCEL: "MĂ©gse" BUTTON_CLOSE: "Bezárás" TITLE_CREATING_PROCESS: "Mappa lĂ©trehozás" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "TöröljĂĽk az összes ĂĽzenetet a mappábĂłl?" BUTTON_CLEAR: "TörlĂ©s" BUTTON_CANCEL: "MĂ©gse" BUTTON_CLOSE: "Bezárás" DANGER_DESC_WARNING: "Figyelem!" DANGER_DESC_HTML_1: "Ez a művelet az összes %FOLDER% mappában lĂ©vĹ‘ ĂĽzenet teljes törlĂ©sĂ©t eredmĂ©nyezi." DANGER_DESC_HTML_2: "Ha egyszer elindult, a folyamatot nem lehet megszakĂ­tani." TITLE_CLEARING_PROCESS: "Mappa ĂĽrĂ­tĂ©s..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP kulcs importálás" BUTTON_IMPORT_OPEN_PGP_KEY: "Importálás" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP kulcs megtekintĂ©s" BUTTON_SELECT: "Kiválasztás" BUTTON_CLOSE: "Bezárás" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP kulcs generálás" LABEL_EMAIL: "E-mail" LABEL_NAME: "NĂ©v" LABEL_PASSWORD: "JelszĂł" LABEL_KEY_BIT_LENGTH: "Kulcs hossz" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generálás" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP aláírás/titkosĂ­tás" LABEL_SIGN: "Aláírás" LABEL_ENCRYPT: "TitkosĂ­tás" LABEL_PASSWORD: "JelszĂł" BUTTON_SIGN: "Aláírás" BUTTON_ENCRYPT: "TitkosĂ­tás" BUTTON_SIGN_AND_ENCRYPT: "Aláírás Ă©s titkosĂ­tás" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP visszafejtĂ©s" LABEL_KEY: "Privát kulcs" LABEL_PASSWORD: "JelszĂł" BUTTON_DECRYPT: "VisszafejtĂ©s" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-lĂ©pĂ©ses hitelesĂ­tĂ©s teszt" LABEL_CODE: "KĂłd" BUTTON_TEST: "TesztelĂ©s" POPUPS_FILTER: TITLE_CREATE_FILTER: "SzűrĹ‘ lĂ©trehozás?" TITLE_EDIT_FILTER: "SzűrĹ‘ frissĂ­tĂ©s?" FILTER_NAME: "NĂ©v" LEGEND_CONDITIONS: "FeltĂ©telek" LEGEND_ACTIONS: "Műveletek" BUTTON_DONE: "KĂ©sz" BUTTON_ADD_CONDITION: "FeltĂ©tel hozzáadás" SELECT_ACTION_NONE: "Semmi" SELECT_ACTION_MOVE_TO: "ĂthelyezĂ©s ide" SELECT_ACTION_FORWARD_TO: "TovábbĂ­tás ide" SELECT_ACTION_REJECT: "VisszautasĂ­t" SELECT_ACTION_VACATION_MESSAGE: "VakáciĂł ĂĽzenet" SELECT_ACTION_DISCARD: "ElvetĂ©s" SELECT_FIELD_FROM: "FeladĂł" SELECT_FIELD_RECIPIENTS: "CĂ­mzettek (cĂ­mzett vagy másolat)" SELECT_FIELD_SUBJECT: "Tárgy" SELECT_FIELD_HEADER: "FejlĂ©c" SELECT_FIELD_SIZE: "MĂ©ret" SELECT_TYPE_CONTAINS: "Tartalmazza" SELECT_TYPE_NOT_CONTAINS: "Nem tartalmazza" SELECT_TYPE_MATCHES: "HasonlĂł (* Ă©s ? támogatott)" SELECT_TYPE_NOT_MATCHES: "Nem hasonlĂł (* Ă©s ? támogatott)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Egyezik" SELECT_TYPE_NOT_EQUAL_TO: "Nem egyezik" SELECT_TYPE_OVER: "Fölött" SELECT_TYPE_UNDER: "Alatt" SELECT_MATCH_ANY: "Egyezzen VALAMELYIK következĹ‘ szabállyal" SELECT_MATCH_ALL: "Egyezzen MINDEN következĹ‘ szabállyal" MARK_AS_READ_LABEL: "MegjelölĂ©s olvasottkĂ©nt" REPLY_INTERVAL_LABEL: "Válasz idĹ‘köz (nap)" KEEP_LABEL: "Megtart" STOP_LABEL: "Ne hagyja abba a szabályok feldolgozását" EMAIL_LABEL: "E-mail" VACATION_SUBJECT_LABEL: "Tárgy (nem kötelezĹ‘)" VACATION_MESSAGE_LABEL: "Ăśzenet" VACATION_RECIPIENTS_LABEL: "CĂ­mzettek (vesszĹ‘vel elválasztva)" REJECT_MESSAGE_LABEL: "Ăśzenet visszautasĂ­tása" ALL_INCOMING_MESSAGES_DESC: "Minden bejövĹ‘ ĂĽzenet" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Rendszermappák kiválasztása" SELECT_CHOOSE_ONE: "Válassz egyet" SELECT_UNUSE_NAME: "Ne használd" LABEL_SENT: "ElkĂĽldött levelek" LABEL_DRAFTS: "Piszkozatok" LABEL_SPAM: "LevĂ©lszemĂ©t" LABEL_TRASH: "Lomtár" LABEL_ARCHIVE: "ArchĂ­vum" BUTTON_CANCEL: "MĂ©gse" BUTTON_CLOSE: "Bezárás" NOTIFICATION_SENT: | Nem választottál "ElkĂĽldött" rendszermappát a törölt levelek tárolásához. Ha nem szeretnĂ©d tárolni az elkĂĽldött leveleket, akkor válaszd a "Ne használd" lehetĹ‘sĂ©get. NOTIFICATION_DRAFTS: "Nem választottál \"Piszkozatok\" rendszermappát a szerkesztett ĂĽzenetek tárolásához." NOTIFICATION_SPAM: |+ Nem választottál "LevĂ©lszemĂ©t" rendszermappát a kĂ©retlen ĂĽzenetek tárolásához. Az ĂĽzenetek vĂ©gleges törlĂ©sĂ©hez válaszd a "Ne használd" lehetĹ‘sĂ©get. NOTIFICATION_TRASH: | Nem választottál "Lomtár" rendszermappát a törölt levelek tárolásához. Az ĂĽzenetek vĂ©gleges törlĂ©sĂ©hez válaszd a "Ne használd" lehetĹ‘sĂ©get. NOTIFICATION_ARCHIVE: "Nem választottál \"ArchĂ­vum\" rendszermappát az archivált ĂĽzenetek tárolásához." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2 lĂ©pcsĹ‘s hitelesĂ­tĂ©s" LABEL_ENABLE_TWO_FACTOR: "2 lĂ©pcsĹ‘s hitelesĂ­tĂ©s engedĂ©lyezĂ©se" LABEL_TWO_FACTOR_USER: "FelhasználĂł" LABEL_TWO_FACTOR_STATUS: "Ăllapot" LABEL_TWO_FACTOR_SECRET: "Titok" LABEL_TWO_FACTOR_BACKUP_CODES: "Biztonsági kĂłdok" BUTTON_CREATE: "Ăšj titok lĂ©trehozás" BUTTON_ACTIVATE: "Aktivál" BUTTON_CLEAR: "Töröl" BUTTON_LOGOUT: "KijelentkezĂ©s" BUTTON_DONE: "KĂ©sz" BUTTON_TEST: "Teszt" LINK_TEST: "teszt" BUTTON_SHOW_SECRET: "Titok megjelenĂ­tĂ©se" BUTTON_HIDE_SECRET: "Titok elrejtĂ©se" TWO_FACTOR_REQUIRE_DESC: "A fiĂłkhoz 2 lĂ©pcsĹ‘s hitelesĂ­tĂ©s szĂĽksĂ©ges." TWO_FACTOR_SECRET_CONFIGURED_DESC: "BeállĂ­tva" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nincs beállĂ­tva" TWO_FACTOR_SECRET_DESC: > Importáld ezt az infĂłt a Google Authenticator kliensedbe (vagy más TOTP kliensbe) az alábbi QR kĂłd használatával vagy a kĂłd manuális megadatásával. TWO_FACTOR_BACKUP_CODES_DESC: > Ha nem kapod meg a kĂłdokat a Google Authenticator kliensbĹ‘l (vagy más TOTP kliensbĹ‘l), akkor a bejelentkezĂ©shez használhatod a biztonsági kĂłdot. A biztonsági kĂłd használata után inaktĂ­vvá válik. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "TesztelĂ©s nĂ©lkĂĽl nem lehet megváltoztatni ezt a beállĂ­tást." TITLES: LOADING: "BetöltĂ©s" LOGIN: "BejelentkezĂ©s" MAILBOX: "Postaláda" SETTINGS: "BeállĂ­tások" COMPOSE: "LevĂ©lĂ­rás" UPLOAD: ERROR_FILE_IS_TOO_BIG: "A fájl tĂşl nagy" ERROR_FILE_PARTIALLY_UPLOADED: "A fájl egy ismeretlen hiba miatt csak rĂ©szben lett feltöltve" ERROR_NO_FILE_UPLOADED: "Nem lett fájl feltöltve" ERROR_MISSING_TEMP_FOLDER: "Hiányzik az ideiglenes fájl" ERROR_ON_SAVING_FILE: "Ismeretlen fájl feltöltĂ©si hiba törtĂ©nt" ERROR_FILE_TYPE: "ÉrvĂ©nytelen fájltĂ­pus" ERROR_UNKNOWN: "Ismeretlen fájl feltöltĂ©si hiba törtĂ©nt" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Formázott szöveg" TEXT_SWITCHER_CONFIRM: "A szövegformázás Ă©s a kĂ©pek el fognak veszni. Biztos, hogy folytatni akarod?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "SzemĂ©lyes" LABEL_GENERAL_NAME: "Ăltalános" LABEL_CONTACTS_NAME: "NĂ©vjegyek" LABEL_FOLDERS_NAME: "Mappák" LABEL_ACCOUNTS_NAME: "FiĂłkok" LABEL_IDENTITY_NAME: "Identitás" LABEL_IDENTITIES_NAME: "Identitások" LABEL_FILTERS_NAME: "SzűrĹ‘k" LABEL_TEMPLATES_NAME: "Sablonok" LABEL_SECURITY_NAME: "Biztonság" LABEL_SOCIAL_NAME: "KözössĂ©g" LABEL_THEMES_NAME: "TĂ©mák" LABEL_CHANGE_PASSWORD_NAME: "JelszĂł" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Vissza" SETTINGS_FILTERS: LEGEND_FILTERS: "SzűrĹ‘k" BUTTON_SAVE: "MentĂ©s" BUTTON_ADD_FILTER: "SzűrĹ‘ hozzáadás" BUTTON_DELETE: "TörlĂ©s" BUTTON_RAW_SCRIPT: "Saját felhasználĂłi szkript használata" SUBNAME_NONE: "Semmi" SUBNAME_MOVE_TO: "ĂthelyezĂ©s ide \"%FOLDER%\"" SUBNAME_FORWARD_TO: "TovábbĂ­tás ide: \"%EMAIL%\"" SUBNAME_REJECT: "VisszautasĂ­t" SUBNAME_VACATION_MESSAGE: "VakáciĂł ĂĽzenet" SUBNAME_DISCARD: "ElvetĂ©s" CAPABILITY_LABEL: "KĂ©pessĂ©g" LOADING_PROCESS: "SzűrĹ‘ lista frissĂ­tĂ©se" DELETING_ASK: "Biztos vagy benne?" CHACHES_NEED_TO_BE_SAVED_DESC: "Ezeket a mĂłdosĂ­tásokat el kell menteni a szerverre." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identitás" LABEL_DISPLAY_NAME: "NĂ©v" LABEL_REPLY_TO: "VálaszcĂ­m" LABEL_SIGNATURE: "Aláírás" LABEL_ADD_SIGNATURE_TO_ALL: "Az aláírásod hozzáadása a kimenĹ‘ ĂĽzenetekhez" SETTINGS_SECURITY: LEGEND_SECURITY: "Biztonság" LABEL_CONFIGURE_TWO_FACTOR: "2 lĂ©pcsĹ‘s hitelesĂ­tĂ©s beállĂ­tása" LABEL_AUTOLOGOUT: "Automatikus kijelentkezĂ©s" AUTOLOGIN_NEVER_OPTION_NAME: "Soha" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% perc" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% Ăłra" SETTINGS_GENERAL: LEGEND_GENERAL: "Ăltalános" LABEL_LANGUAGE: "Nyelv" LABEL_IDENTITY: "Identitás" LABEL_LAYOUT: "ElrendezĂ©s" LABEL_LAYOUT_NO_SPLIT: "Felosztás nĂ©lkĂĽl" LABEL_LAYOUT_VERTICAL_SPLIT: "FĂĽggĹ‘leges felosztás" LABEL_LAYOUT_HORIZONTAL_SPLIT: "VĂ­zszintes felosztás" LABEL_EDITOR: "AlapĂ©rtelmezett szövegszerkesztĹ‘" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Egyszerű" LABEL_EDITOR_HTML_FORCED: "HTML (kĂ©nyszerĂ­tett)" LABEL_EDITOR_PLAIN_FORCED: "Egyszerű (kĂ©nyszerĂ­tett)" LABEL_ANIMATION: "FelĂĽlet animáciĂł" LABEL_ANIMATION_FULL: "Teljes" LABEL_ANIMATION_NORMAL: "Normál" LABEL_ANIMATION_NONE: "Semmi" LABEL_VIEW_OPTIONS: "NĂ©zet beállĂ­tások" LABEL_USE_PREVIEW_PANE: "ElĹ‘nĂ©zeti ablak használata" LABEL_USE_CHECKBOXES_IN_LIST: "JelölĹ‘nĂ©gyzetek megjelenĂ­tĂ©se a listában" LABEL_USE_THREADS: "Szálak használata" LABEL_REPLY_SAME_FOLDER: "VálaszĂĽzenetek elhelyezĂ©se az eredeti ĂĽzenet mappájában" LABEL_SHOW_IMAGES: "Mindig jelenĂ­tse meg a kĂĽlsĹ‘ kĂ©peket az ĂĽzenet törzsĂ©ben" LABEL_SHOW_ANIMATION: "AnimáciĂł megjelenĂ­tĂ©s" LABEL_MESSAGE_PER_PAGE: "Ăśzenetek egy oldalon" LABEL_NOTIFICATIONS: "ÉrtesĂ­tĂ©sek" LABEL_SOUND_NOTIFICATION: "Hangos Ă©rtesĂ­tĂ©s" LABEL_CHROME_NOTIFICATION_DESC: "Ăšj ĂĽzenetek Ă©rtesĂ­tĹ‘ ablakainak megjelenĂ­tĂ©se" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(a böngĂ©szĹ‘ blokkolta)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "NĂ©vjegyek" LABEL_CONTACTS_AUTOSAVE: "CĂ­mzettek automatikus hozzáadása a cĂ­mtárhoz" LEGEND_CONTACTS_SYNC: "Távoli szinkronizálás (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Távoli szinkronizálás engedĂ©lyezĂ©se" LABEL_CONTACTS_SYNC_SERVER: "Szerver" LABEL_CONTACTS_SYNC_AB_URL: "CĂ­mtár URL" LABEL_CONTACTS_SYNC_USER: "FelhasználĂł" LABEL_CONTACTS_SYNC_PASSWORD: "JelszĂł" SETTINGS_THEMES: LEGEND_THEMES: "TĂ©mák" LEGEND_THEMES_CUSTOM: "Saját tĂ©ma beállĂ­tások" LABEL_CUSTOM_TYPE: "TĂ­pus" LABEL_CUSTOM_TYPE_LIGHT: "Világos" LABEL_CUSTOM_TYPE_DARK: "SötĂ©t" LABEL_CUSTOM_BACKGROUND_IMAGE: "HáttĂ©r" BUTTON_UPLOAD_BACKGROUND_IMAGE: "HáttĂ©rkĂ©p feltöltĂ©s (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "A fájl tĂşl nagy" ERROR_FILE_TYPE_ERROR: "ÉrvĂ©nytelen fájl tĂ­pus (csak JPG Ă©s PNG lehet)" ERROR_UNKNOWN: "Ismeretlen fájl feltöltĂ©si hiba törtĂ©nt" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Google kapcsolĂłdás" BUTTON_GOOGLE_DISCONNECT: "Google szĂ©tkapcsolás" MAIN_GOOGLE_DESC: "A Google bejelentkezĂ©s engedĂ©lyezĂ©se után, ebbe a fiĂłkba is be lehet lĂ©pni a Google gombbal a bejelentkezĹ‘ kĂ©pernyĹ‘n." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Facebook kapcsolĂłdás" BUTTON_FACEBOOK_DISCONNECT: "Facebook szĂ©tkapcsolás" MAIN_FACEBOOK_DESC: "A Facebook bejelentkezĂ©s engedĂ©lyezĂ©se után, ebbe a fiĂłkba is be lehet lĂ©pni a Facebook gombbal a bejelentkezĹ‘ kĂ©pernyĹ‘n." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Twitter kapcsolĂłdás" BUTTON_TWITTER_DISCONNECT: "Twitter szĂ©tkapcsolás" MAIN_TWITTER_DESC: "A Twitter bejelentkezĂ©s engedĂ©lyezĂ©se után, ebbe a fiĂłkba is be lehet lĂ©pni a Twitter gombbal a bejelentkezĹ‘ kĂ©pernyĹ‘n." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Mappa lista" BUTTON_CREATE: "Mappa lĂ©trehozás" BUTTON_SYSTEM: "Rendszermappák" BUTTON_DELETE: "TörlĂ©s" BUTTON_SUBSCRIBE: "Feliratkozás" BUTTON_UNSUBSCRIBE: "Leiratkozás" LOADING_PROCESS: "Mappa lista frissĂ­tĂ©se" CREATING_PROCESS: "Mappa lĂ©trehozás" DELETING_PROCESS: "Mappa törlĂ©s" RENAMING_PROCESS: "Mappa átnevezĂ©s" DELETING_ASK: "Biztos vagy benne?" TO_MANY_FOLDERS_DESC_1: "TĂşl sok mappád van!" TO_MANY_FOLDERS_DESC_2: "TeljesĂ­tĂ©ny problĂ©mák elkerĂĽlĂ©se miatt, csak egy rĂ©szĂ©t jelenĂ­tjĂĽk meg." HELP_DELETE_FOLDER: "Mappa törlĂ©s" HELP_SHOW_HIDE_FOLDER: "Mappa mutatás/elrejtĂ©s" HELP_CHECK_FOR_NEW_MESSAGES: "EllenĹ‘rizze/ne ellenĹ‘rizze az Ăşj ĂĽzeneteket" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "FiĂłk lista" LEGEND_IDENTITIES: "Identitások" LEGEND_ACCOUNTS_AND_IDENTITIES: "FiĂłkok Ă©s identitások" BUTTON_ADD_ACCOUNT: "FiĂłk hozzáadás" BUTTON_ADD_IDENTITY: "Identitás hozzáadás" BUTTON_DELETE: "TĹ‘rlĂ©s" LOADING_PROCESS: "FiĂłk lista frissĂ­tĂ©s" DELETING_ASK: "Biztos vagy benne?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identitás" LEGEND_IDENTITIES: "További identitások" LABEL_DEFAULT: "AlapĂ©rtelmezett" LABEL_DISPLAY_NAME: "NĂ©v" LABEL_REPLY_TO: "VálaszcĂ­m" LABEL_SIGNATURE: "Aláírás" LABEL_ADD_SIGNATURE_TO_ALL: "Az aláírásod hozzáadása az összes kimenĹ‘ ĂĽzenetekhez" BUTTON_ADD_IDENTITY: "Identitás hozzáadás" BUTTON_DELETE: "TörlĂ©s" LOADING_PROCESS: "Identitás lista frissĂ­tĂ©se" DELETING_ASK: "Biztos vagy benne?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "JelszĂł változtatás" LABEL_CURRENT_PASSWORD: "Jelenlegi jelszĂł" LABEL_NEW_PASSWORD: "Ăšj jelszĂł" LABEL_REPEAT_PASSWORD: "Ăšj jelszĂł Ăşjra" BUTTON_UPDATE_PASSWORD: "Ăšj jelszĂł beállĂ­tás" ERROR_PASSWORD_MISMATCH: "A jelszavak nem egyeznek, prĂłbáld Ăşjra" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP kulcs importálás" BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP kulcs generálás" TITLE_PRIVATE: "Privát" TITLE_PUBLIC: "Publikus" DELETING_ASK: "Biztos vagy benne?" GENERATE_ONLY_HTTPS: "csak HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Piszkozat automatikus mentĂ©se" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Billentyű kombináciĂł sĂşgĂł" TAB_MAILBOX: "Postaláda" TAB_MESSAGE_LIST: "Ăśzenetlista" TAB_MESSAGE_VIEW: "Ăśzenet nĂ©zet" TAB_COMPOSE: "LevĂ©lĂ­rás" LABEL_OPEN_USER_DROPDOWN: "FelhasználĂł legördĂĽlĹ‘ megnyitása" LABEL_REPLY: "Válasz" LABEL_REPLY_ALL: "Válasz mindenkinek" LABEL_FORWARD: "TovábbĂ­tás" LABEL_FORWARD_MULTIPLY: "TovábbĂ­tás mellĂ©klet(en)kĂ©nt" LABEL_HELP: "SĂşgĂł" LABEL_CHECK_ALL: "Minden ĂĽzenet kijelölĂ©se" LABEL_ARCHIVE: "ArchĂ­vum" LABEL_DELETE: "TörlĂ©s" LABEL_OPEN_THREAD: "Kijelölt szál megnyitása" LABEL_MOVE: "Ăthelyez" LABEL_READ: "Kijelölt ĂĽzenetek megjelölĂ©se olvasottkĂ©nt" LABEL_UNREAD: "Kijelölt ĂĽzenetek megjelölĂ©se olvasatlankĂ©nt" LABEL_IMPORTANT: "Kijelölt ĂĽzenetek megjelölĂ©se fontoskĂ©nt zászlĂłval" LABEL_SEARCH: "KeresĂ©s" LABEL_CANCEL_SEARCH: "KeresĂ©s megszakĂ­tása" LABEL_FULLSCREEN_ENTER: "Teljes kĂ©pernyĹ‘ (elĹ‘nĂ©zeti panales elrendezĂ©s)" LABEL_VIEW_MESSAGE_ENTER: "Ăśzenet megtekintĂ©se (elĹ‘nĂ©zeti panel nĂ©lkĂĽli elrendezĂ©s)" LABEL_SWITCH_TO_MESSAGE: "FĂłkusz váltás a kijelölt ĂĽzenetre" LABEL_SWITCH_TO_FOLDER_LIST: "FĂłkusz váltás a mappa listára" LABEL_FULLSCREEN_TOGGLE: "Teljes kĂ©pernyĹ‘s mĂłd váltása" LABEL_BLOCKQUOTES_TOGGLE: "IdĂ©zetek váltása az ĂĽzenetben" LABEL_THREAD_NEXT: "KövetkezĹ‘ ĂĽzenet a szálban" LABEL_THREAD_PREV: "ElĹ‘zĹ‘ ĂĽzenet a szálban" LABEL_PRINT: "Nyomtatás" LABEL_EXIT_FULLSCREEN: "KilĂ©pĂ©s a teljes kĂ©pernyĹ‘s mĂłdbĂłl" LABEL_CLOSE_MESSAGE: "Ăśzenet bezárás (elĹ‘nĂ©zeti panel nĂ©lkĂĽli elrendezĂ©s)" LABEL_SWITCH_TO_LIST: "FĂłkusz váltása vissza az ĂĽzenetlistára" LABEL_OPEN_COMPOSE_POPUP: "LevĂ©lĂ­rás ablak megnyitás" LABEL_MINIMIZE_COMPOSE_POPUP: "LevĂ©lĂ­rás ablak minimalizálás" LABEL_OPEN_IDENTITIES_DROPDOWN: "Identitások legördĂĽlĹ‘ megnyitása" LABEL_SAVE_MESSAGE: "Ăśzenet mentĂ©s" LABEL_SEND_MESSAGE: "Ăśzenet kĂĽldĂ©s" LABEL_CLOSE_COMPOSE: "LevĂ©lĂ­rás bezárása" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Nem találtam publikus kulcsokat" NO_PUBLIC_KEYS_FOUND_FOR: "Nem találtam publikus kulcsokat ehhez az e-mailhez: \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Nem találtam privát kulcsot" NO_PRIVATE_KEY_FOUND_FOR: "Nem találtam privát kulcsot ehhez az e-mailhez: \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Publikus kulcs hozzáadás" SELECT_A_PRIVATE_KEY: "Privát kulcs választás" UNVERIFIRED_SIGNATURE: "Nem ellenĹ‘rzött aláírás" DECRYPTION_ERROR: "OpenPGP visszafejtĂ©si hiba" GOOD_SIGNATURE: "JĂł aláírás tĹ‘le: %USER%" PGP_ERROR: "OpenPGP hiba: %ERROR%" SPECIFY_FROM_EMAIL: "KĂ©rlek add meg a FeladĂł e-mail cĂ­mĂ©t" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Legalább egy cĂ­mzettet meg kell adni" NOTIFICATIONS: INVALID_TOKEN: "ÉrvĂ©nytelen kulcs" AUTH_ERROR: "ÉrvĂ©nytelen hitelesĂ­tĂ©s" ACCESS_ERROR: "ÉrvĂ©nytelen hozzáfĂ©rĂ©s" CONNECTION_ERROR: "Nem lehet kapcsolĂłdni a szerverhez" CAPTCHA_ERROR: "ÉrvĂ©nytelen CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Ez a közössĂ©gi azonosĂ­tĂł mĂ©g egyetlen e-mail fiĂłkhoz sincs hozzárendelve. LĂ©pj be az e-mail fiĂłkod hitelesĂ­tĹ‘ adataival majd engedĂ©lyezd ezt a lehetĹ‘sĂ©get a fiĂłk beállĂ­tásoknál. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Ez a közössĂ©gi azonosĂ­tĂł mĂ©g egyetlen e-mail fiĂłkhoz sincs hozzárendelve. LĂ©pj be az e-mail fiĂłkod hitelesĂ­tĹ‘ adataival majd engedĂ©lyezd ezt a lehetĹ‘sĂ©get a fiĂłk beállĂ­tásoknál. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Ez a közössĂ©gi azonosĂ­tĂł mĂ©g egyetlen e-mail fiĂłkhoz sincs hozzárendelve. LĂ©pj be az e-mail fiĂłkod hitelesĂ­tĹ‘ adataival majd engedĂ©lyezd ezt a lehetĹ‘sĂ©get a fiĂłk beállĂ­tásoknál. DOMAIN_NOT_ALLOWED: "A domain nem engedĂ©lyezett" ACCOUNT_NOT_ALLOWED: "A fiĂłk nem engedĂ©lyezett" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "KĂ©tlĂ©pcsĹ‘s azonosĂ­tás kötelezĹ‘" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "KĂ©tlĂ©pcsĹ‘s azonosĂ­tás hiba" COULD_NOT_SAVE_NEW_PASSWORD: "Az Ăşj jelszĂł nem kerĂĽlt törlĂ©sre" CURRENT_PASSWORD_INCORRECT: "ÉrvĂ©nytelen jelszĂł" NEW_PASSWORD_SHORT: "A jelszĂł tĂşl rövid" NEW_PASSWORD_WEAK: "A jelszĂł tĂşl egyszerű" NEW_PASSWORD_FORBIDDENT: "A jelszĂł tĂ­ltott karaktereket tartalmaz" CONTACTS_SYNC_ERROR: "Hiba lĂ©pett fel a nĂ©vjegyek szinkronizálása közben" CANT_GET_MESSAGE_LIST: "Nem tudom letölteni az ĂĽzenetlistát" CANT_GET_MESSAGE: "Nem tudom letölteni az ĂĽzenetet" CANT_DELETE_MESSAGE: "Nem lehet törölni az ĂĽzenetet" CANT_MOVE_MESSAGE: "Nem lehet áthelyezni az ĂĽzenetet" CANT_SAVE_MESSAGE: "Nem lehet menteni az ĂĽzenetet" CANT_SEND_MESSAGE: "Nem lehet elkĂĽldeni az ĂĽzenetet" INVALID_RECIPIENTS: "ÉrvĂ©nytelent cĂ­mzettek" CANT_SAVE_FILTERS: "Nem lehet menteni a szűrĹ‘ket" CANT_GET_FILTERS: "Nem lehet letölteni a szűrĹ‘ket" FILTERS_ARE_NOT_CORRECT: "A szűrĹ‘k nem megfelelĹ‘ek" CANT_CREATE_FOLDER: "Nem lehet lĂ©trehozni a mappát" CANT_RENAME_FOLDER: "Nem lehet átnevezni a mappát" CANT_DELETE_FOLDER: "Nem lehet törölni a mappát" CANT_DELETE_NON_EMPTY_FOLDER: "Nem ĂĽres mappát nem lehet törölni" CANT_SUBSCRIBE_FOLDER: "Nem lehet feliratkozni mappára" CANT_UNSUBSCRIBE_FOLDER: "Nem lehet leiratkozni mappárĂłl" CANT_SAVE_SETTINGS: "Nem lehet menteni a beállĂ­tásokat" CANT_SAVE_PLUGIN_SETTINGS: "Nem lehet menteni a beállĂ­tásokat" DOMAIN_ALREADY_EXISTS: "A domain már lĂ©tezik" CANT_INSTALL_PACKAGE: "Nem sikerĂĽlt telepĂ­teni a csomagot" CANT_DELETE_PACKAGE: "Nem sikerĂĽlt eltávolĂ­tani a csomagot" INVALID_PLUGIN_PACKAGE: "ÉrvĂ©nytelen beĂ©pĂĽlĹ‘ csomag" UNSUPPORTED_PLUGIN_PACKAGE: "Nem támogatott beĂ©pĂĽlĹ‘ csomag" LICENSING_SERVER_IS_UNAVAILABLE: "A elĹ‘fizetĂ©si szerver nem Ă©rhetĹ‘ el" LICENSING_DOMAIN_EXPIRED: "A domain elĹ‘fizetĂ©se lejárt." LICENSING_DOMAIN_BANNED: "A domain elĹ‘fizetĂ©se letiltva." DEMO_SEND_MESSAGE_ERROR: "Biztonsági okokbĂłl, ebbĹ‘l a demĂł fiĂłkbĂłl nem lehet kĂĽlsĹ‘ e-mail cĂ­mekre ĂĽzenetet kĂĽldeni." DEMO_ACCOUNT_ERROR: "Biztonsági okokbĂłl, ebbĹ‘l a fiĂłkbĂłl nem lehet elvĂ©gezni ezt a műveletet!" ACCOUNT_ALREADY_EXISTS: "A fiĂłk már lĂ©tezik" ACCOUNT_DOES_NOT_EXIST: "A fiĂłk nem lĂ©tezik" MAIL_SERVER_ERROR: "Hiba törtĂ©nt a levelezĹ‘ szerverhez törtĂ©nĹ‘ hozzáfĂ©rĂ©s közben" INVALID_INPUT_ARGUMENT: "ÉrvĂ©nytelen input argumentum" UNKNOWN_ERROR: "Ismeretlen hiba" STATIC: BACK_LINK: "ĂšjratöltĂ©s" DOMAIN_LIST_DESC: "A webmailhez hozzáfĂ©rhetĹ‘ domainek listája." PHP_EXSTENSIONS_ERROR_DESC: "SzĂĽksĂ©ges PHP kiterjesztĂ©s nem Ă©rhetĹ‘ el a PHP konfiguráciĂłdban!" PHP_VERSION_ERROR_DESC: "A PHP verziĂłd (%VERSION%) kisebb mint a minimálisan szĂĽksĂ©ges 5.3.0!" NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szĂĽksĂ©ges." NO_SCRIPT_DESC: | A JavaScript támogatás nem Ă©rhetĹ‘ el a böngĂ©szĹ‘dben. KĂ©rlek engedĂ©lyezd böngĂ©szĹ‘dben a JavaScript támogatást, majd prĂłbáld Ăşjra. NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szĂĽksĂ©g." NO_COOKIE_DESC: | A Cookie támogatás nem Ă©rhetĹ‘ el a böngĂ©szĹ‘dben. KĂ©rlek engedĂ©lyezd böngĂ©szĹ‘dben a Cookie támogatást, majd prĂłbáld Ăşjra. BAD_BROWSER_TITLE: "A böngĂ©szĹ‘d elavult." BAD_BROWSER_DESC: | Az alkalmazás összes funkciĂłjának használatához tölts le Ă©s telepĂ­tsd az alábbi böngĂ©szĹ‘k egyikĂ©t: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml000066400000000000000000000742061361462701300261600ustar00rootroot00000000000000id_ID: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Login" LABEL_PASSWORD: "Sandi" LABEL_SIGN_ME: "Ingat Saya" LABEL_VERIFICATION_CODE: "Kode Verifikasi" LABEL_DONT_ASK_VERIFICATION_CODE: "Jangan tanya kode untuk 2 minggu" BUTTON_SIGN_IN: "Masuk" TITLE_SIGN_IN_GOOGLE: "Masuk dengan akun Google" TITLE_SIGN_IN_FACEBOOK: "Masuk dengan akun Facebook" TITLE_SIGN_IN_TWITTER: "Masuk dengan akun Twitter" LABEL_FORGOT_PASSWORD: "Lupa sandi" LABEL_REGISTRATION: "Registrasi" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Tambah Akun" BUTTON_SETTINGS: "Pengaturan" BUTTON_HELP: "Bantuan" BUTTON_LOGOUT: "Keluar" MOBILE: BUTTON_MOBILE_VERSION: "Versi Mobile" BUTTON_DESKTOP_VERSION: "Versi Desktop" SEARCH: MAIN_INPUT_PLACEHOLDER: "Cari" TITLE_ADV: "Pencarian Rinci" LABEL_ADV_FROM: "Dari" LABEL_ADV_TO: "Kepada" LABEL_ADV_SUBJECT: "Judul" LABEL_ADV_TEXT: "Teks" LABEL_ADV_HAS_ATTACHMENT: "Memiliki lampiran" LABEL_ADV_HAS_ATTACHMENTS: "Memiliki lampiran" LABEL_ADV_FLAGGED: "Ditandai" LABEL_ADV_UNSEEN: "Belum dilihat" LABEL_ADV_DATE: "Tanggal" LABEL_ADV_DATE_ALL: "Semua" LABEL_ADV_DATE_3_DAYS: "Sudah 3 hari lalu" LABEL_ADV_DATE_7_DAYS: "Sudah 1 bulan lalu" LABEL_ADV_DATE_MONTH: "Lebih dari 1 bulan lalu" LABEL_ADV_DATE_3_MONTHS: "Lebih dari 3 bulan lalu" LABEL_ADV_DATE_6_MONTHS: "Lebih dari 6 bulan lalu" LABEL_ADV_DATE_YEAR: "Lebih dari 1 tahun lalu" BUTTON_ADV_SEARCH: "Cari" PREVIEW_POPUP: FULLSCREEN: "Beralih ke layar penuh" ZOOM: "Perbesar/perkecil" CLOSE: "Tutup (esc)" LOADING: "Memuat" GALLERY_PREV: "Sebelumnya (panah kiri)" GALLERY_NEXT: "Selanjutnya (panah kanan)" GALLERY_COUNTER: "%curr% dari %total%" IMAGE_ERROR: "The image tidak dapat dimuat." AJAX_ERROR: "The content tidak dapat dimuat." FOLDER_LIST: BUTTON_COMPOSE: "Tulis baru" BUTTON_CONTACTS: "Kontak" BUTTON_NEW_MESSAGE: "Pesan Baru" INBOX_NAME: "Kotak Masuk" SENT_NAME: "Terkirim" DRAFTS_NAME: "Konsep" SPAM_NAME: "Spam" TRASH_NAME: "Sampah" ARCHIVE_NAME: "Arsip" QUOTA: TITLE: "Jatah digunakan" MESSAGE_LIST: BUTTON_RELOAD: "Muat Ulang Daftar Pesan" BUTTON_MOVE_TO: "Pindahkan Ke" BUTTON_DELETE: "Hapus" BUTTON_ARCHIVE: "Arsipkan" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Bukan Spam" BUTTON_EMPTY_FOLDER: "Bersihkan Folder" BUTTON_MULTY_FORWARD: "Teruskan sebagai lampiran" BUTTON_DELETE_WITHOUT_MOVE: "Hapus permanen" BUTTON_MORE: "Lagi" MENU_SET_SEEN: "Tandai sudah dibaca" MENU_SET_ALL_SEEN: "Tandai semua sudah dibaca" MENU_UNSET_SEEN: "Tandai belum dibaca" MENU_SET_FLAG: "Tandai" MENU_UNSET_FLAG: "Hapus tanda" MENU_SELECT_ALL: "Semua" MENU_SELECT_NONE: "Tak satupun" MENU_SELECT_INVERT: "Balikkan" MENU_SELECT_UNSEEN: "Belum dibaca" MENU_SELECT_SEEN: "Dibaca" MENU_SELECT_FLAGGED: "Ditandai" MENU_SELECT_UNFLAGGED: "Jangan tandai" EMPTY_LIST: "Daftar kosong" EMPTY_SEARCH_LIST: "Tidak ada pesan yang sesuai dengan pencarian" SEARCH_RESULT_FOR: "Hasil pencarian untuk \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "Kembali ke daftar pesan" LIST_LOADING: "Memuat" EMPTY_SUBJECT_TEXT: "(Tanpa Judul)" PUT_MESSAGE_HERE: "Taruh pesan di sini untuk melihatnya dalam daftar" TODAY_AT: "hari ini pada %TIME%" YESTERDAY_AT: "Kemarin pada %TIME%" SEARCH_PLACEHOLDER: "Pencarian" NEW_MESSAGE_NOTIFICATION: "Anda memiliki %COUNT% pesan baru!" QUOTA_SIZE: "Menggunakan %SIZE% (%PROC%%) dari %LIMIT%" MESSAGE: BUTTON_EDIT: "Ubah" BUTTON_BACK: "Kembali" BUTTON_CLOSE: "Tutup" BUTTON_DELETE: "Hapus" BUTTON_UNSUBSCRIBE: "Berhenti berlangganan dari daftar ini" BUTTON_ARCHIVE: "Arsip" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Bukan Spam" BUTTON_MOVE_TO: "Pindahkan Ke" BUTTON_MORE: "Lagi" BUTTON_REPLY: "Balas" BUTTON_REPLY_ALL: "Balas Semua" BUTTON_FORWARD: "Teruskan Pesan" BUTTON_FORWARD_AS_ATTACHMENT: "Teruskan sebagai lampiran" BUTTON_EDIT_AS_NEW: "Ubah sebagai Pesan Baru" BUTTON_SHOW_IMAGES: "Tampilkan gambar eksternal" BUTTON_NOTIFY_READ_RECEIPT: "Pengirim meminta diberitahu saat anda membaca pesan ini." BUTTON_IN_NEW_WINDOW: "Tampilkan di jendela terpisah" BUTTON_THREAD_LIST: "Daftar kegiatan" BUTTON_THREAD_PREV: "Sebelumnya" BUTTON_THREAD_NEXT: "Selanjutnya" BUTTON_THREAD_MORE: "Pesan lainnya" MENU_HEADERS: "Tampilkan header pesan" MENU_VIEW_ORIGINAL: "Tampilkan kode sumber" MENU_DOWNLOAD_ORIGINAL: "Unduh sebagai berkas .eml" MENU_FILTER_SIMILAR: "Saring pesan seperti ini" MENU_PRINT: "Cetak" EMPTY_SUBJECT_TEXT: "(Tanpa Judul)" LABEL_SUBJECT: "Judul" LABEL_DATE: "Tanggal" LABEL_FROM: "Dari" LABEL_FROM_SHORT: "dari" LABEL_TO: "Kepada" LABEL_TO_SHORT: "kepada" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Balas-Ke" PRINT_LABEL_FROM: "Dari" PRINT_LABEL_TO: "Kepada" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Balas-Ke" PRINT_LABEL_DATE: "Tanggal" PRINT_LABEL_SUBJECT: "Judul" PRINT_LABEL_ATTACHMENTS: "Lampiran" MESSAGE_LOADING: "Memuat" MESSAGE_VIEW_DESC: "Pilih pesan pada daftar untuk menampilkannya di sini." MESSAGE_VIEW_MOVE_DESC: "Klik pada nama folder pada panel kiri untuk memilih tujuan." PGP_PASSWORD_INPUT_PLACEHOLDER: "Sandi" PGP_SIGNED_MESSAGE_DESC: "Pesan bertanda-tangan OpenPGP (klik untuk verifikasi)" PGP_ENCRYPTED_MESSAGE_DESC: "Pesan terenkripsi OpenPGP (klik untuk mendekripsi)" LINK_DOWNLOAD_AS_ZIP: "Unduh sebagai berkas zip" LINK_SAVE_TO_OWNCLOUD: "Simpan ke ownCloud" LINK_SAVE_TO_CLOUD: "Simpan ke Cloud" LINK_SAVE_TO_DROPBOX: "Simpan ke Dropbox" READ_RECEIPT: SUBJECT: "Tanda terima (ditampilkan) - %SUBJECT%" BODY: | Ini adalah Tanda terima untuk surat yang anda kirim kepada %READ-RECEIPT%. Catatan: "Tanda terima ini hanya pernyataan bahwa pesan telah ditampilkan pada komputer penerima ." Tidak ada jaminan apapun bahwa penerima telah membaca atau memahami isi pesan tersebut. SUGGESTIONS: SEARCHING_DESC: "Pencarian..." CONTACTS: LEGEND_CONTACTS: "Kontak" SEARCH_INPUT_PLACEHOLDER: "Cari" BUTTON_ADD_CONTACT: "Tambah Kontak" BUTTON_CREATE_CONTACT: "Simpan" BUTTON_UPDATE_CONTACT: "Perbarui" BUTTON_IMPORT: "Impor (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Expor (vcf, vCard)" BUTTON_EXPORT_CSV: "Expor (csv)" ERROR_IMPORT_FILE: "Impor gagal (format berkas tidak sah)" LIST_LOADING: "Memuat" EMPTY_LIST: "Tidak ada kontak di sini" EMPTY_SEARCH: "Tidak ditemukan kontak" CLEAR_SEARCH: "Bersihkan pencarian" CONTACT_VIEW_DESC: "Pilih kontak pada daftar untuk ditampilkan di sini." LABEL_DISPLAY_NAME: "Nama tampilan" LABEL_EMAIL: "Email" LABEL_PHONE: "Telepon" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Tanggal lahir" LINK_ADD_EMAIL: "Tambah alamat email" LINK_ADD_PHONE: "Tambah telepon" LINK_BIRTHDAY: "Tanggal lahir" PLACEHOLDER_ENTER_DISPLAY_NAME: "Isi nama tampilan" PLACEHOLDER_ENTER_LAST_NAME: "Isi nama belakang " PLACEHOLDER_ENTER_FIRST_NAME: "Isi nama depan" PLACEHOLDER_ENTER_NICK_NAME: "Isi nama panggilan" LABEL_READ_ONLY: "Hanya bisa dibaca" LABEL_SHARE: "Bagikan" ADD_MENU_LABEL: "Tambah" ADD_MENU_NICKNAME: "Nama panggilan" ADD_MENU_NOTES: "Catatan" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Telepon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Alamat" ADD_MENU_BIRTHDAY: "Tanggal lahir" ADD_MENU_TAGS: "Penanda" BUTTON_SHARE_NONE: "Tak satupun" BUTTON_SHARE_ALL: "Semuanya" BUTTON_SYNC: "Sinkronisasi (CardDAV)" COMPOSE: TITLE_FROM: "Dari" TITLE_TO: "Kepada" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Balas-Ke" TITLE_SUBJECT: "Judul" LINK_SHOW_INPUTS: "tampikan semua isian" BUTTON_SEND: "Kirim" BUTTON_SAVE: "Simpan" BUTTON_DELETE: "Hapus" BUTTON_CANCEL: "Batal" BUTTON_MINIMIZE: "Kecilkan layar" SAVED_TIME: "Disimpan pada %TIME%" SAVED_ERROR_ON_SEND: "Pesan telah dikirim namun tidak disimpan pada folder terkirim" DISCARD_UNSAVED_DATA: "Buang data tanpa menyimpan?" ATTACH_FILES: "Lampirkan berkas" ATTACH_DROP_FILES_DESC: "Taruh file di sini" ATTACH_ITEM_CANCEL: "Batal" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% ditulis" FORWARD_MESSAGE_TOP_TITLE: "-------- Pesan terusan -------" FORWARD_MESSAGE_TOP_FROM: "Dari" FORWARD_MESSAGE_TOP_TO: "Kepada" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Dikirim" FORWARD_MESSAGE_TOP_SUBJECT: "Judul" EMPTY_TO_ERROR_DESC: "Mohon sertakan setidaknya satu penerima" NO_ATTACHMENTS_HERE_DESC: "Tidak ada lampiran" ATTACHMENTS_ERROR_DESC: "Peringatan! belum semua lampiran terunggah." ATTACHMENTS_UPLOAD_ERROR_DESC: "Belum semua lampiran terunggah." BUTTON_REQUEST_READ_RECEIPT: "Minta pemberitahuan telah dibaca" BUTTON_MARK_AS_IMPORTANT: "Tandai sebagai pesan penting" BUTTON_OPEN_PGP: "OpenPGP (Teks Biasa)" BUTTON_REQUEST_DSN: "Minta pemberitahuan berhasil kirim" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Tutup" POPUPS_ASK: BUTTON_YES: "Ya" BUTTON_NO: "Tidak" DESC_WANT_CLOSE_THIS_WINDOW: "Anda yakin untuk menutup jendela ini?" DESC_WANT_DELETE_MESSAGES: "Anda yakin menghapus permanen pesan ini?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Pilih bahasa" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Tambah Akun?" BUTTON_ADD_ACCOUNT: "Tambah" TITLE_UPDATE_ACCOUNT: "Perbarui Akun?" BUTTON_UPDATE_ACCOUNT: "Perbarui" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Tambah Identitas?" TITLE_UPDATE_IDENTITY: "Perbarui Identitas?" BUTTON_ADD_IDENTITY: "Tambah" BUTTON_UPDATE_IDENTITY: "Perbarui" LABEL_EMAIL: "Email" LABEL_NAME: "Nama" LABEL_REPLY_TO: "Balas-Ke" LABEL_SIGNATURE: "Tanda tangan" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Sisipkan tanda tangan ini sebelum teks kutipan pada balasan" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Buat folder?" LABEL_NAME: "Nama folder" LABEL_PARENT: "Folder induk" BUTTON_CREATE: "Buat" BUTTON_CANCEL: "Batal" BUTTON_CLOSE: "Tutup" TITLE_CREATING_PROCESS: "Membuat folder" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Singkirkan semua pesan dari folder ini?" BUTTON_CLEAR: "Bersihkan" BUTTON_CANCEL: "Batal" BUTTON_CLOSE: "Tutup" DANGER_DESC_WARNING: "Peringatan!" DANGER_DESC_HTML_1: "Aksi ini akan menyebabkan dibuangnya surat dari folder %FOLDER% secara menyeluruh." DANGER_DESC_HTML_2: "Begitu dimulai, proses tidak dapat dibatalkan atau ditunda." TITLE_CLEARING_PROCESS: "Membersihkan folder..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Impor kunci OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Impor" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Tampikan kunci OpenPGP" BUTTON_SELECT: "Pilih" BUTTON_CLOSE: "Tutup" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Buat kunci OpenPGP" LABEL_EMAIL: "Email" LABEL_NAME: "Nama" LABEL_PASSWORD: "Sandi" LABEL_KEY_BIT_LENGTH: "Panjang kunci" BUTTON_GENERATE_OPEN_PGP_KEYS: "Buat" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Tandatangan/Enkripsi" LABEL_SIGN: "Tandatangan" LABEL_ENCRYPT: "Enkripsi" LABEL_PASSWORD: "Sandi" BUTTON_SIGN: "Tandatangani" BUTTON_ENCRYPT: "Enkripsi" BUTTON_SIGN_AND_ENCRYPT: "Tandatangani dan Enkripsi" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Deksipsi" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Sandi" BUTTON_DECRYPT: "Deskripsi" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Uji verifikasi 2-Langkah" LABEL_CODE: "Kode" BUTTON_TEST: "Uji" POPUPS_FILTER: TITLE_CREATE_FILTER: "Buat filter?" TITLE_EDIT_FILTER: "Perbarui filter?" FILTER_NAME: "Nama" LEGEND_CONDITIONS: "Kondisi" LEGEND_ACTIONS: "Aksi" BUTTON_DONE: "Selesai" BUTTON_ADD_CONDITION: "Tambah kondisi" SELECT_ACTION_NONE: "Tidak ada" SELECT_ACTION_MOVE_TO: "Pindahkan ke" SELECT_ACTION_FORWARD_TO: "Teruskan ke" SELECT_ACTION_REJECT: "Tolak" SELECT_ACTION_VACATION_MESSAGE: "Pesan liburan" SELECT_ACTION_DISCARD: "Buang" SELECT_FIELD_FROM: "Dari" SELECT_FIELD_RECIPIENTS: "Penerima (Kepada atau tembusan)" SELECT_FIELD_SUBJECT: "Subjek" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Ukuran" SELECT_TYPE_CONTAINS: "Berisi" SELECT_TYPE_NOT_CONTAINS: "Tidak berisi" SELECT_TYPE_MATCHES: "Cocok (mendukung * dan ?)" SELECT_TYPE_NOT_MATCHES: "Tidak Cocok (mendukung * dan ?)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Bukan Regexp" SELECT_TYPE_EQUAL_TO: "Sama Dengan" SELECT_TYPE_NOT_EQUAL_TO: "Tidak sama Dengan" SELECT_TYPE_OVER: "Di atas" SELECT_TYPE_UNDER: "Di bawah" SELECT_MATCH_ANY: "Cocokkan dengan Salah satu pengaturan berikut" SELECT_MATCH_ALL: "Cocokkan dengan semua pengaturan berikut" MARK_AS_READ_LABEL: "Tandai sudah dibaca" REPLY_INTERVAL_LABEL: "Selang waktu balasan (hari)" KEEP_LABEL: "Tahan" STOP_LABEL: "Jangan hentikan peraturan proses" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subjek (opsional)" VACATION_MESSAGE_LABEL: "Pesan" VACATION_RECIPIENTS_LABEL: "Penerima (dipisahkan koma)" REJECT_MESSAGE_LABEL: "Pesan terakhir" ALL_INCOMING_MESSAGES_DESC: "Semua pesan masuk" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Piih folder sistem" SELECT_CHOOSE_ONE: "Pilih satu" SELECT_UNUSE_NAME: "Jangan gunakan" LABEL_SENT: "Kirim" LABEL_DRAFTS: "Konsep" LABEL_SPAM: "Spam" LABEL_TRASH: "Sampah" LABEL_ARCHIVE: "Arsip" BUTTON_CANCEL: "Batal" BUTTON_CLOSE: "Tutup" NOTIFICATION_SENT: | Anda belum memilih folder sistem "Kirim" untuk menyimpan pesan setelah dikirim. Jika anda tidak ingin meyimpan pesan terkirim, silahkan gunakan opsi "Jangan gunakan". NOTIFICATION_DRAFTS: "Anda belum memilih folder sistem untuk \"Konsep\", tempat pesan yang sedang dibuat." NOTIFICATION_SPAM: | Anda belum memilih folder "Spam" tempat pesan spam disimpan. Jika anda ingin membuang pesan secara permanen, gunakan opsi "Jangan Gunakan". NOTIFICATION_TRASH: | Anda belum memilih folder "Sampah" tempat pesan buangan ditempatkan. Jika anda ingin membuang pesan secara permanen, gunakan opsi "Jangan gunakan". NOTIFICATION_ARCHIVE: "Anda belum memilih folder \"Arsip\" untuk menempatkan pesan arsip." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Verifikasi 2-Langkah (OTP)" LABEL_ENABLE_TWO_FACTOR: "Nyalakan verifikasi 2-Langkah" LABEL_TWO_FACTOR_USER: "User" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Kode Rahasia" LABEL_TWO_FACTOR_BACKUP_CODES: "Kode cadangan" BUTTON_CREATE: "Buah kode rahasia" BUTTON_ACTIVATE: "Aktivasi" BUTTON_CLEAR: "Bersihkan" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Selesai" BUTTON_TEST: "Ujicoba" LINK_TEST: "ujicoba" BUTTON_SHOW_SECRET: "Tampilkan kode rahasia" BUTTON_HIDE_SECRET: "Lenyapkan kode rahasia" TWO_FACTOR_REQUIRE_DESC: "Akun anda butuh konfigurasi verifikasi 2-Langkah" TWO_FACTOR_SECRET_CONFIGURED_DESC: "Telah dikonfigurasi" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Belum dikonfigurasi" TWO_FACTOR_SECRET_DESC: > Impor info ini ke Google Authenticator client (atau TOTP client lain) menggunakan QR Code yang disediakan di bawah atau dengan menginput kode secara manual. TWO_FACTOR_BACKUP_CODES_DESC: > Jika anda tidak mendapatkan kode melalui Google Authenticator (or other TOTP client), anda bisa menggunakan kode cadangan untuk masuk. Setelah anda gunakan kode cadangan, maka kode tersebut akan kadaluarsa. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Anda tidak bisa mengubah pengaturan ini sebelum diujicoba." TITLES: LOADING: "Memuat" LOGIN: "Login" MAILBOX: "Kotak surat" SETTINGS: "Pengaturan" COMPOSE: "Buat pesan" UPLOAD: ERROR_FILE_IS_TOO_BIG: "File terlalu besar" ERROR_FILE_PARTIALLY_UPLOADED: "File terunggah separuh disebabkan sesuatu kesalahan" ERROR_NO_FILE_UPLOADED: "Tidak ada file yang diunggah" ERROR_MISSING_TEMP_FOLDER: "File temporer hilang" ERROR_ON_SAVING_FILE: "Kesalahan tidak diketahui terkait unggahan file" ERROR_FILE_TYPE: "Tipe file tidak sah" ERROR_UNKNOWN: "Kesalahan tidak diketahui saat unggah file" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" TEXT_SWITCHER_CONFIRM: "Format teks dan gambar akan lenyap. Anda yakin untuk melanjutkan?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Pribadi" LABEL_GENERAL_NAME: "Umum" LABEL_CONTACTS_NAME: "Kontak" LABEL_FOLDERS_NAME: "Folder" LABEL_ACCOUNTS_NAME: "Akun" LABEL_IDENTITY_NAME: "Identitas" LABEL_IDENTITIES_NAME: "Identitas" LABEL_FILTERS_NAME: "Filter" LABEL_TEMPLATES_NAME: "Template" LABEL_SECURITY_NAME: "Keamanan" LABEL_SOCIAL_NAME: "Sosial" LABEL_THEMES_NAME: "Tema" LABEL_CHANGE_PASSWORD_NAME: "Sandi" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Kembali" SETTINGS_FILTERS: LEGEND_FILTERS: "Filter" BUTTON_SAVE: "Simpan" BUTTON_ADD_FILTER: "Tambah Filter" BUTTON_DELETE: "Hapus" BUTTON_RAW_SCRIPT: "Gunakan User Script khusus" SUBNAME_NONE: "Tidak ada" SUBNAME_MOVE_TO: "Pindahkan ke \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Teruskan ke \"%EMAIL%\"" SUBNAME_REJECT: "Tolak" SUBNAME_VACATION_MESSAGE: "Pesan liburan" SUBNAME_DISCARD: "Buang" CAPABILITY_LABEL: "Kapabilitas" LOADING_PROCESS: "Perbarui daftar filter" DELETING_ASK: "Anda yakin?" CHACHES_NEED_TO_BE_SAVED_DESC: "Perubahan ini perlu disimpan di server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identitas" LABEL_DISPLAY_NAME: "Nama" LABEL_REPLY_TO: "Balas-Ke" LABEL_SIGNATURE: "Tandatangan" LABEL_ADD_SIGNATURE_TO_ALL: "Tambah tandatangan anda ke semua pesan keluar" SETTINGS_SECURITY: LEGEND_SECURITY: "Keamanan" LABEL_CONFIGURE_TWO_FACTOR: "Atur verifikasi 2-Langkah" LABEL_AUTOLOGOUT: "Logout otomatis" AUTOLOGIN_NEVER_OPTION_NAME: "Tidak pernah" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% menit" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% jam" SETTINGS_GENERAL: LEGEND_GENERAL: "Umum" LABEL_LANGUAGE: "Bahasa" LABEL_IDENTITY: "Identitas" LABEL_LAYOUT: "Tampilan" LABEL_LAYOUT_NO_SPLIT: "Tanpa pemisah" LABEL_LAYOUT_VERTICAL_SPLIT: "Pemisah vertikal" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Pemisah horizontal" LABEL_EDITOR: "Editor teks bawaan" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Polos" LABEL_EDITOR_HTML_FORCED: "Html (paksa)" LABEL_EDITOR_PLAIN_FORCED: "Polos (paksa)" LABEL_ANIMATION: "Animasi tampilan" LABEL_ANIMATION_FULL: "Penuh" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Tidak ada" LABEL_VIEW_OPTIONS: "Tampilkan Opsi" LABEL_USE_PREVIEW_PANE: "Gunakan panel pratinjau" LABEL_USE_CHECKBOXES_IN_LIST: "Tampilkan centang dalam daftar" LABEL_USE_THREADS: "Gunakan tread" LABEL_REPLY_SAME_FOLDER: "Tempatkan pesan balasan di folder pesan yang dibalas" LABEL_SHOW_IMAGES: "Selalu tampilkan gambar eksternal di dalam pesan" LABEL_SHOW_ANIMATION: "Tampikan animasi" LABEL_MESSAGE_PER_PAGE: "Pesan di halaman" LABEL_NOTIFICATIONS: "Notifikasi" LABEL_SOUND_NOTIFICATION: "Notifikasi suara" LABEL_CHROME_NOTIFICATION_DESC: "Tampilkan jendela sembul notifikasi pesan" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(diblokir oleh browser)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontak" LABEL_CONTACTS_AUTOSAVE: "Tambah penerima ke daftar alamat secara otomatis" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Nyalakan sinkronisasi remote" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "URL Buku alamat" LABEL_CONTACTS_SYNC_USER: "User" LABEL_CONTACTS_SYNC_PASSWORD: "Sandi" SETTINGS_THEMES: LEGEND_THEMES: "Tema" LEGEND_THEMES_CUSTOM: "Konfigurasi tema khusus" LABEL_CUSTOM_TYPE: "Tipe" LABEL_CUSTOM_TYPE_LIGHT: "Terang" LABEL_CUSTOM_TYPE_DARK: "Gelap" LABEL_CUSTOM_BACKGROUND_IMAGE: "Latar" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Unggah gambar latar (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "File terlalu besar" ERROR_FILE_TYPE_ERROR: "Tipe file tidak sah (JPG dan PNG saja)" ERROR_UNKNOWN: "Kesalahan tidak diketahui saat unggah file" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Hubungkan ke Google" BUTTON_GOOGLE_DISCONNECT: "Putuskan dari Google" MAIN_GOOGLE_DESC: "Setelah menyalakan login via Google, Anda bisa login ke akun ini menggunakan tombol Google pada halaman login." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Hubungkan Facebook" BUTTON_FACEBOOK_DISCONNECT: "Putuskan dari Facebook" MAIN_FACEBOOK_DESC: "Setelah menyalakan login via Facebook, Anda bisa login ke akun ini menggunakan tombol Facebook pada halaman login." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Hubungkan Twitter" BUTTON_TWITTER_DISCONNECT: "Putuskan Twitter" MAIN_TWITTER_DESC: "Setelah menyalakan login via Twitter, Anda bisa login ke akun ini menggunakan tombol Twitter pada halaman login." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Daftar folder" BUTTON_CREATE: "Buat folder" BUTTON_SYSTEM: "Folder sistem" BUTTON_DELETE: "Hapus" BUTTON_SUBSCRIBE: "Langganan" BUTTON_UNSUBSCRIBE: "Batal langganan" LOADING_PROCESS: "Perbarui daftar folder" CREATING_PROCESS: "Buat folder" DELETING_PROCESS: "Hapus folder" RENAMING_PROCESS: "Ubah nama folder" DELETING_ASK: "Anda yakin?" TO_MANY_FOLDERS_DESC_1: "Anda punya terlalu banyak folder!" TO_MANY_FOLDERS_DESC_2: "Kami hanya menampilkan sebagian, untuk mencegah turunnya performa." HELP_DELETE_FOLDER: "Hapus folder" HELP_SHOW_HIDE_FOLDER: "Tampil/lenyapkan folder" HELP_CHECK_FOR_NEW_MESSAGES: "Cek/jangan cek pesan baru" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Akun" LEGEND_IDENTITIES: "Identitas" LEGEND_ACCOUNTS_AND_IDENTITIES: "Akun dan identitas" BUTTON_ADD_ACCOUNT: "Tambahkan akun" BUTTON_ADD_IDENTITY: "Tambahkan identitas" BUTTON_DELETE: "Hapus" LOADING_PROCESS: "Memperbarui..." DELETING_ASK: "Anda yakin?" DEFAULT_IDENTITY_LABEL: "Bawaan" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identitas" LEGEND_IDENTITIES: "Identitas tambahan" LABEL_DEFAULT: "Bawaan" LABEL_DISPLAY_NAME: "Nama" LABEL_REPLY_TO: "Balas-ke" LABEL_SIGNATURE: "Tandatangan" LABEL_ADD_SIGNATURE_TO_ALL: "Tambah tandatangan anda ke pesan keluar" BUTTON_ADD_IDENTITY: "Tambah identitas" BUTTON_DELETE: "Hapus" LOADING_PROCESS: "Perbarui daftar identitas" DELETING_ASK: "Anda yakin?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Ubah sandi" LABEL_CURRENT_PASSWORD: "Sandi saat ini" LABEL_NEW_PASSWORD: "Sandi Baru" LABEL_REPEAT_PASSWORD: "Konfirmasi Sandi Baru" BUTTON_UPDATE_PASSWORD: "Tetapkan Sandi Baru" ERROR_PASSWORD_MISMATCH: "Sandi tidak sama, coba lagi" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Impor kunci OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "Buat kunci OpenPGP" TITLE_PRIVATE: "Pribadi" TITLE_PUBLIC: "Publik" DELETING_ASK: "Anda yakin?" GENERATE_ONLY_HTTPS: "Hanya HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Simpan konsep otomatis" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Bantuan pintasan keyboard" TAB_MAILBOX: "Kotak surat" TAB_MESSAGE_LIST: "Daftar pesan" TAB_MESSAGE_VIEW: "Tampilan pesan" TAB_COMPOSE: "Buat pesan" LABEL_OPEN_USER_DROPDOWN: "Buka dropdown user" LABEL_REPLY: "Balas" LABEL_REPLY_ALL: "Balas semua" LABEL_FORWARD: "Teruskan" LABEL_FORWARD_MULTIPLY: "Teruskan sebagai berkas" LABEL_HELP: "Bantuan" LABEL_CHECK_ALL: "Pilih semua pesan" LABEL_ARCHIVE: "Arsip" LABEL_DELETE: "Hapus" LABEL_OPEN_THREAD: "Buka pekerjaan terpilih" LABEL_MOVE: "Pindahkan" LABEL_READ: "Tandai sudah baca pesan terpilih" LABEL_UNREAD: "Tandai belum baca pesan terpilih" LABEL_IMPORTANT: "Penting, tandai pesan terplilih" LABEL_SEARCH: "Pencarian" LABEL_CANCEL_SEARCH: "Batalkan pencarian" LABEL_FULLSCREEN_ENTER: "Layar penuh (panel pratinjau)" LABEL_VIEW_MESSAGE_ENTER: "Tampilkan pesan (Tanpa pratinjau)" LABEL_SWITCH_TO_MESSAGE: "Pindahkan fokus ke pesan terpilih" LABEL_SWITCH_TO_FOLDER_LIST: "Pindahkan fokuske daftar folder" LABEL_FULLSCREEN_TOGGLE: "Tetapkan mode layar penuh" LABEL_BLOCKQUOTES_TOGGLE: "Tetapkan kutip pesan" LABEL_THREAD_NEXT: "Pesan berikutnya dalam rentang" LABEL_THREAD_PREV: "Pesan sebelumnya dalam rentang" LABEL_PRINT: "Cetak" LABEL_EXIT_FULLSCREEN: "Keluar dari mode Layar penuh" LABEL_CLOSE_MESSAGE: "Tutup pesan (Tanpa panel pratinjau)" LABEL_SWITCH_TO_LIST: "Pindahkan fokus kembali ke daftar pesan" LABEL_OPEN_COMPOSE_POPUP: "Buka popup buat pesan" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimalkan popup buat pesan" LABEL_OPEN_IDENTITIES_DROPDOWN: "Buka dropdown identitas" LABEL_SAVE_MESSAGE: "Simpan pesan" LABEL_SEND_MESSAGE: "Kirim pesan" LABEL_CLOSE_COMPOSE: "Tutup buat pesan" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Tidak ada kunci publik" NO_PUBLIC_KEYS_FOUND_FOR: "Tidak ada kunci publik untuk \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "Tidak ada kunci privat" NO_PRIVATE_KEY_FOUND_FOR: "Tidak ada kunci privat untuk \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Tambah kunci publik" SELECT_A_PRIVATE_KEY: "Pilih sebuah kunci privat" UNVERIFIRED_SIGNATURE: "Tandatangan belum diverifikasi" DECRYPTION_ERROR: "Kesalahan dekripsi OpenPGP" GOOD_SIGNATURE: "Tandatangan sah dari user %USER%" PGP_ERROR: "Kesalahan OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "Silahkan tentukan alamat ASAL email" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Silahkan tentukan setidaknya satu penerima" NOTIFICATIONS: INVALID_TOKEN: "Token tidak sah" AUTH_ERROR: "Otentikasi gagal" ACCESS_ERROR: "Kesalahan akses" CONNECTION_ERROR: "Tidak terhubung ke server" CAPTCHA_ERROR: "CAPTCHA salah." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses email dan aktifkan fitur ini dari pengaturan akun. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses email dan aktifkan fitur ini dari pengaturan akun. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Sosial ID ini tidak terkait dengan akun email manapun. Login dengan akses email dan aktifkan fitur ini dari pengaturan akun. DOMAIN_NOT_ALLOWED: "Domain tidak diizinkan" ACCOUNT_NOT_ALLOWED: "Akun ini tidak diizinkan" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Diperlukan verifikasi 2 faktor" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kesalahan verifikasi 2 faktor" COULD_NOT_SAVE_NEW_PASSWORD: "Tidak bisa menyimpan password baru" CURRENT_PASSWORD_INCORRECT: "Password sekarang tidak benar" NEW_PASSWORD_SHORT: "Password terlalu pendek" NEW_PASSWORD_WEAK: "Password terlalu mudah" NEW_PASSWORD_FORBIDDENT: "Password mengandung karakter terlarang" CONTACTS_SYNC_ERROR: "Kesalahan sinkronisasi kontak" CANT_GET_MESSAGE_LIST: "Gagal memperoleh daftar pesan" CANT_GET_MESSAGE: "Gagal memperoleh pesan" CANT_DELETE_MESSAGE: "Gagal menghapus pesan" CANT_MOVE_MESSAGE: "Gagal memindahkan pesan" CANT_SAVE_MESSAGE: "Gagal menyimpan pesan" CANT_SEND_MESSAGE: "Gagal mengirim pesan" INVALID_RECIPIENTS: "Penerima tidak valid" CANT_SAVE_FILTERS: "Gagal menyimpan filter" CANT_GET_FILTERS: "Gagal memperoleh filter" FILTERS_ARE_NOT_CORRECT: "Filter tidak benar" CANT_CREATE_FOLDER: "Gagal membuat folder" CANT_RENAME_FOLDER: "Gagal mengubah nama folder" CANT_DELETE_FOLDER: "Gagal menghapus folder" CANT_DELETE_NON_EMPTY_FOLDER: "Gagal menghapus direkori yang berisi" CANT_SUBSCRIBE_FOLDER: "Gagal mengkaitkan folder" CANT_UNSUBSCRIBE_FOLDER: "Tidak bisa memutus folder" CANT_SAVE_SETTINGS: "Gagal menyimpan pengaturan" CANT_SAVE_PLUGIN_SETTINGS: "Gagal menyimpan pengaturan" DOMAIN_ALREADY_EXISTS: "Domain telah ada" CANT_INSTALL_PACKAGE: "Gagal menginstall paket" CANT_DELETE_PACKAGE: "Gagal membuang paket" INVALID_PLUGIN_PACKAGE: "Paket plugin tidak sah" UNSUPPORTED_PLUGIN_PACKAGE: "Paket plugin tidak didukung" LICENSING_SERVER_IS_UNAVAILABLE: "Server langganan tidak tersedia." LICENSING_DOMAIN_EXPIRED: "Langganan domain ini telah kadaluarsa." LICENSING_DOMAIN_BANNED: "Langganan untuk domain ini dilarang." DEMO_SEND_MESSAGE_ERROR: "Atas alasan keamanan, akun ini tidak diizinkan mengirim pesan ke alamat luar!" DEMO_ACCOUNT_ERROR: "Atas alasan keamanan, akun ini tidak diizinkan melakukan aksi ini!" ACCOUNT_ALREADY_EXISTS: "Akun sudah ada" ACCOUNT_DOES_NOT_EXIST: "Akun tidak ada" MAIL_SERVER_ERROR: "Terjadi kesalahan saat mengakses server mail" INVALID_INPUT_ARGUMENT: "Uraian input tidak sah" UNKNOWN_ERROR: "Kesalahan tidak diketahui" STATIC: BACK_LINK: "Muat ulang" DOMAIN_LIST_DESC: "Daftar domain webmail yang boleh diakses." PHP_EXSTENSIONS_ERROR_DESC: "Extensi PHP yang disyaratkan tidak tersedia dalam konfigurasi PHP anda!" PHP_VERSION_ERROR_DESC: "Versi PHP anda (%VERSION%) lebih rendah dari syarat minimal yaitu 5.3.0!" NO_SCRIPT_TITLE: "JavaScript diperlukan oleh aplikasi ini." NO_SCRIPT_DESC: | Dukungan Javascript tidak tersedia di browser anda Silahkan aktifkan dukungan Javascript di pengaturan browser anda dan coba lagi. NO_COOKIE_TITLE: "Dukurangan Cookies diperlukan oleh aplikasi ini." NO_COOKIE_DESC: | Dukungan cookies tidak tersedia di browser anda. Silahkan aktifkan dukungan Cookies di pengaturan browser dan coba lagi. BAD_BROWSER_TITLE: "Browser anda kadaluarsa." BAD_BROWSER_DESC: | Untuk bisa menggunakan semua fitur aplikasi, unduh dan pasang salah satu browser berikut: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml000066400000000000000000000772661361462701300262270ustar00rootroot00000000000000is_IS: LOGIN: LABEL_EMAIL: "TölvupĂłstfang" LABEL_LOGIN: "Innskráning" LABEL_PASSWORD: "Lykilorð" LABEL_SIGN_ME: "Muna" LABEL_VERIFICATION_CODE: "Sannvottunarkóði" LABEL_DONT_ASK_VERIFICATION_CODE: "Ekki spyrja um kóðann næstu 2 vikur" BUTTON_SIGN_IN: "Skrá inn" TITLE_SIGN_IN_GOOGLE: "Innskráning með Google" TITLE_SIGN_IN_FACEBOOK: "Innskráning með Facebook" TITLE_SIGN_IN_TWITTER: "Innskráning með Twitter" LABEL_FORGOT_PASSWORD: "Gleymdi lykilorði" LABEL_REGISTRATION: "NĂ˝skráning" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Bæta við aðgangi" BUTTON_SETTINGS: "Stillingar" BUTTON_HELP: "Hjálp" BUTTON_LOGOUT: "Ăštskrá" MOBILE: BUTTON_MOBILE_VERSION: "FarsĂ­maĂştgáfa" BUTTON_DESKTOP_VERSION: "VinnutölvuĂştgáfa" SEARCH: MAIN_INPUT_PLACEHOLDER: "Leita" TITLE_ADV: "ĂŤtarleg leit" LABEL_ADV_FROM: "Frá" LABEL_ADV_TO: "Til" LABEL_ADV_SUBJECT: "Viðfangsefni" LABEL_ADV_TEXT: "Texti" LABEL_ADV_HAS_ATTACHMENT: "Er með viðhengi" LABEL_ADV_HAS_ATTACHMENTS: "Er með viðhengi" LABEL_ADV_FLAGGED: "Flaggað" LABEL_ADV_UNSEEN: "Ă“lesið" LABEL_ADV_DATE: "Dagsetning" LABEL_ADV_DATE_ALL: "Allt" LABEL_ADV_DATE_3_DAYS: "Allt að 3 daga gömlu" LABEL_ADV_DATE_7_DAYS: "Allt að viku gömlu" LABEL_ADV_DATE_MONTH: "Allt að mánaðar gömlu" LABEL_ADV_DATE_3_MONTHS: "Allt að 3 mánaða gömlu" LABEL_ADV_DATE_6_MONTHS: "Allt að 6 mánaða gömlu" LABEL_ADV_DATE_YEAR: "Allt að 1 árs gömlu" BUTTON_ADV_SEARCH: "Leita" PREVIEW_POPUP: FULLSCREEN: "VĂ­xla heilskjá af/á" ZOOM: "Aðdráttur að/frá" CLOSE: "Loka (Esc)" LOADING: "Hleð..." GALLERY_PREV: "Fyrra (vinstri örvarhnappur)" GALLERY_NEXT: "Næsta (hægri örvarhnappur)" GALLERY_COUNTER: "%curr% af %total%" IMAGE_ERROR: "Myndina var ekki hægt að birta." AJAX_ERROR: "Efnið var ekki hægt að birta." FOLDER_LIST: BUTTON_COMPOSE: "Semja" BUTTON_CONTACTS: "Tengiliðir" BUTTON_NEW_MESSAGE: "NĂ˝ skilaboð" INBOX_NAME: "InnhĂłlf" SENT_NAME: "Sent" DRAFTS_NAME: "Drög" SPAM_NAME: "RuslpĂłstur" TRASH_NAME: "Ruslafata" ARCHIVE_NAME: "Safnskrá" QUOTA: TITLE: "Disknotkun" MESSAGE_LIST: BUTTON_RELOAD: "Endurhlaða skilaboðalista" BUTTON_MOVE_TO: "Færa Ă­" BUTTON_DELETE: "Eyða" BUTTON_ARCHIVE: "Safnskrá" BUTTON_SPAM: "RuslpĂłstur" BUTTON_NOT_SPAM: "Ekki ruslpĂłstur" BUTTON_EMPTY_FOLDER: "Hreinsa möppu" BUTTON_MULTY_FORWARD: "Ăframsenda sem viðhengi" BUTTON_DELETE_WITHOUT_MOVE: "Eyða endanlega" BUTTON_MORE: "Meira" MENU_SET_SEEN: "Merkja lesið" MENU_SET_ALL_SEEN: "Merkja allt lesið" MENU_UNSET_SEEN: "Merkja Ăłlesið" MENU_SET_FLAG: "Merkja" MENU_UNSET_FLAG: "Afmerkja" MENU_SELECT_ALL: "Allt" MENU_SELECT_NONE: "Ekkert" MENU_SELECT_INVERT: "SnĂşa við" MENU_SELECT_UNSEEN: "Ă“lesið" MENU_SELECT_SEEN: "Lesið" MENU_SELECT_FLAGGED: "Flaggað" MENU_SELECT_UNFLAGGED: "Afflaggað" EMPTY_LIST: "TĂłmur listi." EMPTY_SEARCH_LIST: "Engin skilaboð stemmdu við leitina þína." SEARCH_RESULT_FOR: "Leitarniðurstöður fyrir \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "til baka Ă­ skilaboðalista" LIST_LOADING: "Hleð" EMPTY_SUBJECT_TEXT: "(Ekkert viðfangsefni)" PUT_MESSAGE_HERE: "Slepptu skilaboðum hĂ©r til að skoða Ăľað Ă­ listanum" TODAY_AT: "Ă­ dag kl. %TIME%" YESTERDAY_AT: "Ă­ gær kl. %TIME%" SEARCH_PLACEHOLDER: "Leita" NEW_MESSAGE_NOTIFICATION: "Þú átt %COUNT% nĂ˝ skilaboð!" QUOTA_SIZE: "Notar %SIZE% (%PROC%%) af %LIMIT%" MESSAGE: BUTTON_EDIT: "Breyta" BUTTON_BACK: "Til baka" BUTTON_CLOSE: "Loka" BUTTON_DELETE: "Eyða" BUTTON_UNSUBSCRIBE: "Hætta Ă­ áskrift að Ăľessum lista" BUTTON_ARCHIVE: "Safnskrá" BUTTON_SPAM: "RuslpĂłstur" BUTTON_NOT_SPAM: "Ekki ruslpĂłstur" BUTTON_MOVE_TO: "Færa Ă­" BUTTON_MORE: "Meira" BUTTON_REPLY: "Svara" BUTTON_REPLY_ALL: "Svara öllum" BUTTON_FORWARD: "Ăframsenda" BUTTON_FORWARD_AS_ATTACHMENT: "Ăframsenda sem viðhengi" BUTTON_EDIT_AS_NEW: "Breyta sem nĂ˝ju" BUTTON_SHOW_IMAGES: "SĂ˝na myndir" BUTTON_NOTIFY_READ_RECEIPT: "Sendandinn hefur beðið um að vera látinn vita Ăľegar þú lest Ăľessi skilaboð." BUTTON_IN_NEW_WINDOW: "Skoða Ă­ öðrum glugga" BUTTON_THREAD_LIST: "Listi yfir samræður" BUTTON_THREAD_PREV: "Fyrra" BUTTON_THREAD_NEXT: "Næsta" BUTTON_THREAD_MORE: "Fleiri skilaboð" MENU_HEADERS: "SĂ˝na skilaboðahausa" MENU_VIEW_ORIGINAL: "SĂ˝na upprunalegt" MENU_DOWNLOAD_ORIGINAL: "Sækja sem .eml skrá" MENU_FILTER_SIMILAR: "SĂ­a skilaboð eins og Ăľessi" MENU_PRINT: "Prenta" EMPTY_SUBJECT_TEXT: "(Ekkert viðfangsefni)" LABEL_SUBJECT: "Viðfangsefni" LABEL_DATE: "Dagsetning" LABEL_FROM: "Frá" LABEL_FROM_SHORT: "frá" LABEL_TO: "Til" LABEL_TO_SHORT: "til" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Svara-til" PRINT_LABEL_FROM: "Frá" PRINT_LABEL_TO: "Til" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Svara-til" PRINT_LABEL_DATE: "Dagsetning" PRINT_LABEL_SUBJECT: "Viðfangsefni" PRINT_LABEL_ATTACHMENTS: "Viðhengi" MESSAGE_LOADING: "Hleð" MESSAGE_VIEW_DESC: "Veldu skilaboð Ăşr listanum til að skoða hĂ©r." MESSAGE_VIEW_MOVE_DESC: "Smelltu á heiti möppu á spjaldinu til vinstri til að velja áfangastaðinn." PGP_PASSWORD_INPUT_PLACEHOLDER: "Lykilorð" PGP_SIGNED_MESSAGE_DESC: "Skeyti undirritað með OpenPGP (smelltu til að sannvotta)" PGP_ENCRYPTED_MESSAGE_DESC: "Skeyti dulritað með OpenPGP (smelltu til að afkóða)" LINK_DOWNLOAD_AS_ZIP: "Sækja sem .zip skrá" LINK_SAVE_TO_OWNCLOUD: "Vista Ă­ ownCloud" LINK_SAVE_TO_CLOUD: "Vista Ă­ tölvuskĂ˝" LINK_SAVE_TO_DROPBOX: "Vista Ă­ Dropbox" READ_RECEIPT: SUBJECT: "MĂłttökukvittun (birt) - %SUBJECT%" BODY: | Ăžetta er kvittun fyrir mĂłttöku á pĂłsti sem þú sendir %READ-RECEIPT%. Athugaðu: Ăžessi mĂłttökukvittun er aðeins staðfesting á ĂľvĂ­ að skeytið var birt á skjá viðtakandans. Ekkert getur ábyrgst að viðtakandinn hafi lesið eða skilið efni skilaboðanna. SUGGESTIONS: SEARCHING_DESC: "Leita..." CONTACTS: LEGEND_CONTACTS: "Tengiliðir" SEARCH_INPUT_PLACEHOLDER: "Leita" BUTTON_ADD_CONTACT: "Bæta við tengilið" BUTTON_CREATE_CONTACT: "BĂşa til" BUTTON_UPDATE_CONTACT: "Uppfæra" BUTTON_IMPORT: "Flytja inn (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Flytja Ăşt (csv, vcf, vCard)" BUTTON_EXPORT_CSV: "Flytja Ăşt (csv)" ERROR_IMPORT_FILE: "Villa Ă­ innflutningi (Ăłgilt skráasnið)" LIST_LOADING: "Hleð" EMPTY_LIST: "Engir tengiliðir hĂ©r" EMPTY_SEARCH: "Engir tengiliðir fundust" CLEAR_SEARCH: "Hreinsa leit" CONTACT_VIEW_DESC: "Veldu tengilið Ă­ listanum til að skoða hĂ©r." LABEL_DISPLAY_NAME: "Birtingarnafn" LABEL_EMAIL: "TölvupĂłstfang" LABEL_PHONE: "SĂ­mi" LABEL_WEB: "Vefsíða" LABEL_BIRTHDAY: "Afmælisdagur" LINK_ADD_EMAIL: "Bæta við tölvupĂłstfangi" LINK_ADD_PHONE: "Bæta við sĂ­ma" LINK_BIRTHDAY: "Afmælisdagur" PLACEHOLDER_ENTER_DISPLAY_NAME: "Settu inn birtingarnafn" PLACEHOLDER_ENTER_LAST_NAME: "Settu inn kenninafn" PLACEHOLDER_ENTER_FIRST_NAME: "Settu inn eiginnafn" PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" LABEL_READ_ONLY: "Aðeins lesanlegt" LABEL_SHARE: "Deila" ADD_MENU_LABEL: "Bæta við" ADD_MENU_NICKNAME: "Stuttnefni" ADD_MENU_NOTES: "Minnispunktar" ADD_MENU_EMAIL: "TölvupĂłstfang" ADD_MENU_PHONE: "SĂ­mi" ADD_MENU_URL: "URL-slóð" ADD_MENU_ADDRESS: "Heimilisfang" ADD_MENU_BIRTHDAY: "Afmælisdagur" ADD_MENU_TAGS: "Merki" BUTTON_SHARE_NONE: "Ekkert" BUTTON_SHARE_ALL: "Allir" BUTTON_SYNC: "Samstilling (CardDAV)" COMPOSE: TITLE_FROM: "Frá" TITLE_TO: "Til" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Svara-til" TITLE_SUBJECT: "Viðfangsefni" LINK_SHOW_INPUTS: "sĂ˝na alla reiti" BUTTON_SEND: "Senda" BUTTON_SAVE: "Vista" BUTTON_DELETE: "Eyða" BUTTON_CANCEL: "Hætta við" BUTTON_MINIMIZE: "Lágmarka" SAVED_TIME: "Vistað kl. %TIME%" SAVED_ERROR_ON_SEND: "Skeyti var sent en ekki vistað Ă­ sendingamöppu" DISCARD_UNSAVED_DATA: "Henda Ăłvistuðum gögnum?" ATTACH_FILES: "Hengja við skrár" ATTACH_DROP_FILES_DESC: "Setja skrár hĂ©r" ATTACH_ITEM_CANCEL: "Hætta við" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, skrifaði %EMAIL%" FORWARD_MESSAGE_TOP_TITLE: "-------- Ăframsend skilaboð -------" FORWARD_MESSAGE_TOP_FROM: "Frá" FORWARD_MESSAGE_TOP_TO: "Til" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Sent" FORWARD_MESSAGE_TOP_SUBJECT: "Viðfangsefni" EMPTY_TO_ERROR_DESC: "Vinsamlegast tiltaktu að minnsta kosti einn viðtakanda" NO_ATTACHMENTS_HERE_DESC: "Engin viðhengi hĂ©r." ATTACHMENTS_ERROR_DESC: "Aðvörun! Ekki er bĂşið að senda inn öll viðhengi." ATTACHMENTS_UPLOAD_ERROR_DESC: "Ekki er bĂşið að senda inn öll viðhengi." BUTTON_REQUEST_READ_RECEIPT: "Biðja um staðfestingu á lestri" BUTTON_MARK_AS_IMPORTANT: "Merkja sem mikilvægt" BUTTON_OPEN_PGP: "OpenPGP (einungis hreinn texti)" BUTTON_REQUEST_DSN: "Biðja um staðfestingu á afhendingu" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Loka" POPUPS_ASK: BUTTON_YES: "Já" BUTTON_NO: "Nei" DESC_WANT_CLOSE_THIS_WINDOW: "Ertu viss um að þú viljir loka Ăľessum glugga?" DESC_WANT_DELETE_MESSAGES: "Ertu viss um að þú viljir eyða skeytunum?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Veldu tungumálið Ăľitt" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Bæta við aðgangi?" BUTTON_ADD_ACCOUNT: "Bæta við" TITLE_UPDATE_ACCOUNT: "Uppfæra aðgang?" BUTTON_UPDATE_ACCOUNT: "Uppfæra" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Bæta við auðkenni?" TITLE_UPDATE_IDENTITY: "Uppfæra auðkenni?" BUTTON_ADD_IDENTITY: "Bæta við" BUTTON_UPDATE_IDENTITY: "Uppfæra" LABEL_EMAIL: "TölvupĂłstfang" LABEL_NAME: "Nafn" LABEL_REPLY_TO: "Svara-til" LABEL_SIGNATURE: "Undirskrift" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Setja Ăľessa undirskrift inn á undan tilvitnuðum texta Ăľegar verið er að svara" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "BĂşa til möppu?" LABEL_NAME: "Nafn á möppu" LABEL_PARENT: "Undirmappa" BUTTON_CREATE: "BĂşa til" BUTTON_CANCEL: "Hætta við" BUTTON_CLOSE: "Loka" TITLE_CREATING_PROCESS: "BĂ˝ til möppu" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Fjarlægja öll skilaboð Ăşr Ăľessari möppu?" BUTTON_CLEAR: "Hreinsa" BUTTON_CANCEL: "Hætta við" BUTTON_CLOSE: "Loka" DANGER_DESC_WARNING: "Aðvörun!" DANGER_DESC_HTML_1: "Ăžessi aðgerð veldur ĂľvĂ­ að öll skilaboð Ăşr %FOLDER% möppunni verða fjarlægð." DANGER_DESC_HTML_2: "Ăžað er ekki hægt að hætta við aðgerðina eftir að bĂşið er að keyra hana." TITLE_CLEARING_PROCESS: "Tæmi möppu..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Flytja inn OpenPGP-lykil" BUTTON_IMPORT_OPEN_PGP_KEY: "Flytja inn" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Skoða OpenPGP-lykil" BUTTON_SELECT: "Velja" BUTTON_CLOSE: "Loka" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "BĂşa til OpenPGP-lykla" LABEL_EMAIL: "TölvupĂłstfang" LABEL_NAME: "Nafn" LABEL_PASSWORD: "Lykilorð" LABEL_KEY_BIT_LENGTH: "Lengd lykils" BUTTON_GENERATE_OPEN_PGP_KEYS: "ĂštbĂşa" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "Undirrita/Dulrita OpenPGP" LABEL_SIGN: "Undirrita" LABEL_ENCRYPT: "Dulrita" LABEL_PASSWORD: "Lykilorð" BUTTON_SIGN: "Undirrita" BUTTON_ENCRYPT: "Dulrita" BUTTON_SIGN_AND_ENCRYPT: "Undirrita og dulrita" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "Afkóða OpenPGP" LABEL_KEY: "Einkalykill" LABEL_PASSWORD: "Lykilorð" BUTTON_DECRYPT: "Afkóða" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "PrĂłfun á 2-Ăľrepa sannvottun" LABEL_CODE: "Kóði" BUTTON_TEST: "PrĂłfa" POPUPS_FILTER: TITLE_CREATE_FILTER: "BĂşa til sĂ­u?" TITLE_EDIT_FILTER: "Uppfæra sĂ­u?" FILTER_NAME: "Heiti" LEGEND_CONDITIONS: "Skilyrði" LEGEND_ACTIONS: "Aðgerðir" BUTTON_DONE: "Lokið" BUTTON_ADD_CONDITION: "Bæta við skilyrði" SELECT_ACTION_NONE: "Ekkert" SELECT_ACTION_MOVE_TO: "Færa Ă­" SELECT_ACTION_FORWARD_TO: "Ăframsenda til" SELECT_ACTION_REJECT: "Hafna" SELECT_ACTION_VACATION_MESSAGE: "Skilaboð vegna frĂ­a" SELECT_ACTION_DISCARD: "Henda" SELECT_FIELD_FROM: "Frá" SELECT_FIELD_RECIPIENTS: "Viðtakendur (Til eða CC)" SELECT_FIELD_SUBJECT: "Viðfangsefni" SELECT_FIELD_HEADER: "Haus" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Inniheldur" SELECT_TYPE_NOT_CONTAINS: "Inniheldur ekki" SELECT_TYPE_MATCHES: "Samsvaranir (stuðningur við * og ?)" SELECT_TYPE_NOT_MATCHES: "Ekki-samsvaranir (stuðningur við * og ?)" SELECT_TYPE_REGEXP: "Regluleg segð" SELECT_TYPE_NOT_REGEXP: "Ekki regluleg segð" SELECT_TYPE_EQUAL_TO: "Jafnt og" SELECT_TYPE_NOT_EQUAL_TO: "Ekki jafnt og" SELECT_TYPE_OVER: "Yfir" SELECT_TYPE_UNDER: "Undir" SELECT_MATCH_ANY: "Samsvarar EINHVERRI af eftirfarandi reglum" SELECT_MATCH_ALL: "Samsvarar Ă–LLUM eftirfarandi reglum" MARK_AS_READ_LABEL: "Merkja sem lesið" REPLY_INTERVAL_LABEL: "Bil milli svara (dagar)" KEEP_LABEL: "Halda" STOP_LABEL: "Ekki hætta að vinna með reglur" EMAIL_LABEL: "TölvupĂłstfang" VACATION_SUBJECT_LABEL: "Viðfangsefni (valkvætt)" VACATION_MESSAGE_LABEL: "Skilaboð" VACATION_RECIPIENTS_LABEL: "Viðtakendur (aðgreindir með kommu)" REJECT_MESSAGE_LABEL: "Hafna skilaboðum" ALL_INCOMING_MESSAGES_DESC: "Ă–ll innsend skeyti" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Veldu kerfismöppur" SELECT_CHOOSE_ONE: "Veldu eitt" SELECT_UNUSE_NAME: "Ekki nota" LABEL_SENT: "Sent" LABEL_DRAFTS: "Drög" LABEL_SPAM: "RuslpĂłstur" LABEL_TRASH: "Ruslafata" LABEL_ARCHIVE: "Safn" BUTTON_CANCEL: "Hætta við" BUTTON_CLOSE: "Loka" NOTIFICATION_SENT: | Þú hefur ekki valið kerfismöppuna "Sent" fyrir skilaboð eftir sendingu. Ef þú vilt ekki vista send skilaboð, veldu þá valkostinn "Ekki nota". NOTIFICATION_DRAFTS: "Þú hefur ekki valið kerfismöppuna \"Drög\" Ăľar sem skilaboð sem eru vistuð Ă­ á meðan þú skrifar." NOTIFICATION_SPAM: | Þú hefur ekki valið kerfismöppuna "RuslpĂłstur" sem ruslsendingar eru settar Ă­. Ef þú vilt fjarlægja skilaboðin endanlega, veldu þá valkostinn "Ekki nota". NOTIFICATION_TRASH: | Þú hefur ekki valið kerfismöppuna "Ruslafata" sem eydd skilaboð eru sett Ă­. Ef þú vilt fjarlægja skilaboðin endanlega, veldu þá valkostinn "Ekki nota". NOTIFICATION_ARCHIVE: "Þú hefur ekki valið kerfismöppuna \"Safnskrá\" undir skilaboð sem á að geyma til langs tĂ­ma." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Ăľrepa sannvottun (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Virkja 2-Ăľrepa sannvottun" LABEL_TWO_FACTOR_USER: "Notandi" LABEL_TWO_FACTOR_STATUS: "Staða" LABEL_TWO_FACTOR_SECRET: "Leynikóði" LABEL_TWO_FACTOR_BACKUP_CODES: "Ă–ryggiskóðar" BUTTON_CREATE: "BĂşa til leynikóða" BUTTON_ACTIVATE: "Virkja" BUTTON_CLEAR: "Hreinsa" BUTTON_LOGOUT: "Ăštskráning" BUTTON_DONE: "Lokið" BUTTON_TEST: "PrĂłfa" LINK_TEST: "prĂłfa" BUTTON_SHOW_SECRET: "SĂ˝na leynikóða" BUTTON_HIDE_SECRET: "Fela leynikóða" TWO_FACTOR_REQUIRE_DESC: "Aðgangurinn Ăľinn krefst uppsetningar á 2-Ăľrepa auðkenningu." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Stillt" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ekki stillt" TWO_FACTOR_SECRET_DESC: > Flyttu Ăľessar upplĂ˝singar inn Ă­ Google Authenticator forritið (eða annað TOTP-forrit) með ĂľvĂ­ að nota QR-kóðann hĂ©r fyrir neðan eða með ĂľvĂ­ að skrifa kóðann inn. TWO_FACTOR_BACKUP_CODES_DESC: > Ef þú getur ekki tekið við kóðum með Google Authenticator forritinu (eða öðru TOTP-forriti), geturðu notað öryggiskóða til að skrá Ăľig inn. Eftir að þú hefur notað öryggiskóða til að skrá Ăľig inn, verður hann Ăłvirkur. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Þú getur ekki breytt Ăľessari stillingu fyrir prĂłfun." TITLES: LOADING: "Hleð inn" LOGIN: "Innskráning" MAILBOX: "PĂłsthĂłlf" SETTINGS: "Stillingar" COMPOSE: "Semja" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Skráin er of stĂłr" ERROR_FILE_PARTIALLY_UPLOADED: "Innsending á skrá heppnaðist ekki vegna óþekktrar villu" ERROR_NO_FILE_UPLOADED: "Engin skrá send inn" ERROR_MISSING_TEMP_FOLDER: "Bráðabirgðaskráin er ekki til staðar" ERROR_ON_SAVING_FILE: "Óþekkt innsendingarvilla kom upp" ERROR_FILE_TYPE: "Röng skráartegund" ERROR_UNKNOWN: "Óþekkt innsendingarvilla kom upp" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTI" TEXT_SWITCHER_RICH_FORMATTING: "RĂ­kuleg textasnið" TEXT_SWITCHER_CONFIRM: "Snið á texta og myndir munu tapast. Ertu viss um að þú viljir halda áfram?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "PersĂłnulegt" LABEL_GENERAL_NAME: "Almennt" LABEL_CONTACTS_NAME: "Tengiliðir" LABEL_FOLDERS_NAME: "Möppur" LABEL_ACCOUNTS_NAME: "Aðgangar" LABEL_IDENTITY_NAME: "Auðkenni" LABEL_IDENTITIES_NAME: "Auðkenni" LABEL_FILTERS_NAME: "SĂ­ur" LABEL_TEMPLATES_NAME: "Sniðmát" LABEL_SECURITY_NAME: "Ă–ryggi" LABEL_SOCIAL_NAME: "SamfĂ©lagsmiðlar" LABEL_THEMES_NAME: "Ăžemu" LABEL_CHANGE_PASSWORD_NAME: "Lykilorð" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Til baka" SETTINGS_FILTERS: LEGEND_FILTERS: "SĂ­ur" BUTTON_SAVE: "Vista" BUTTON_ADD_FILTER: "Bæta við sĂ­u" BUTTON_DELETE: "Eyða" BUTTON_RAW_SCRIPT: "Nota sĂ©rsniðna notandaskriftu" SUBNAME_NONE: "Ekkert" SUBNAME_MOVE_TO: "Færa Ă­ \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Ăframsenda til \"%EMAIL%\"" SUBNAME_REJECT: "Hafna" SUBNAME_VACATION_MESSAGE: "Skilaboð vegna frĂ­a" SUBNAME_DISCARD: "Henda" CAPABILITY_LABEL: "Geta" LOADING_PROCESS: "Uppfæri sĂ­ulista" DELETING_ASK: "Ertu viss?" CHACHES_NEED_TO_BE_SAVED_DESC: "Ăžað Ăľarf að vista Ăľessar breytingar á ĂľjĂłninum." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Auðkenni" LABEL_DISPLAY_NAME: "Nafn" LABEL_REPLY_TO: "Svara-til" LABEL_SIGNATURE: "Undirskrift" LABEL_ADD_SIGNATURE_TO_ALL: "Bættu undirskrift við öll Ăştsend skilaboð" SETTINGS_SECURITY: LEGEND_SECURITY: "Ă–ryggi" LABEL_CONFIGURE_TWO_FACTOR: "Stilla 2-Ăľrepa sannvottun" LABEL_AUTOLOGOUT: "Sjálfvirk Ăştskráning" AUTOLOGIN_NEVER_OPTION_NAME: "Aldrei" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% mĂ­nĂştu(r)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% klukkustund(ir)" SETTINGS_GENERAL: LEGEND_GENERAL: "Almennt" LABEL_LANGUAGE: "Tungumál" LABEL_IDENTITY: "Auðkenni" LABEL_LAYOUT: "Framsetning" LABEL_LAYOUT_NO_SPLIT: "Ekki klofið" LABEL_LAYOUT_VERTICAL_SPLIT: "Klofið lóðrĂ©tt" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Klofið lárĂ©tt" LABEL_EDITOR: "Sjálfgefinn textaritill" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Venjulegt" LABEL_EDITOR_HTML_FORCED: "HTML (Ăľvingað)" LABEL_EDITOR_PLAIN_FORCED: "Einfalt (Ăľvingað)" LABEL_ANIMATION: "Hreyfingar Ă­ viðmĂłti" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Venjulegt" LABEL_ANIMATION_NONE: "Ekkert" LABEL_VIEW_OPTIONS: "Valkostir skoðunar" LABEL_USE_PREVIEW_PANE: "Nota forskoðunarham" LABEL_USE_CHECKBOXES_IN_LIST: "SĂ˝na valkassa Ă­ listanum" LABEL_USE_THREADS: "Nota Ăľræði" LABEL_REPLY_SAME_FOLDER: "Setja svör Ă­ möppu skilaboðanna sem er verið að svara" LABEL_SHOW_IMAGES: "SĂ˝na ávallt myndir Ă­ skilaboðum" LABEL_SHOW_ANIMATION: "SĂ˝na hreyfingar" LABEL_MESSAGE_PER_PAGE: "Skilaboð á síðu" LABEL_NOTIFICATIONS: "Tilkynningar" LABEL_SOUND_NOTIFICATION: "Tilkynningarhljóð" LABEL_CHROME_NOTIFICATION_DESC: "SĂ˝na tilkynningarglugga fyrir nĂ˝ skilaboð" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Lokað af vafra)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Tengiliðir" LABEL_CONTACTS_AUTOSAVE: "Bæta viðtakendum sjálfkrafa Ă­ nafnaskrá" LEGEND_CONTACTS_SYNC: "Fjartengd samstilling (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Virkja fjartengda samstillingu" LABEL_CONTACTS_SYNC_SERVER: "ĂžjĂłnn" LABEL_CONTACTS_SYNC_AB_URL: "Slóð á nafnaskrá" LABEL_CONTACTS_SYNC_USER: "Notandi" LABEL_CONTACTS_SYNC_PASSWORD: "Lykilorð" SETTINGS_THEMES: LEGEND_THEMES: "Ăžemu" LEGEND_THEMES_CUSTOM: "SĂ©rsniðin Ăľemastilling" LABEL_CUSTOM_TYPE: "Tegund" LABEL_CUSTOM_TYPE_LIGHT: "LjĂłst" LABEL_CUSTOM_TYPE_DARK: "Dökkt" LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrunnur" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Senda inn bakgrunnsmynd (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Skrá er of stĂłr" ERROR_FILE_TYPE_ERROR: "Röng skráartegund (aðeins JPG and PNG)" ERROR_UNKNOWN: "Óþekkt innsendingarvilla kom upp" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Tengja Google" BUTTON_GOOGLE_DISCONNECT: "Aftengja Google" MAIN_GOOGLE_DESC: "Eftir að Google innskráing hefur verið gerð virk, þá getur þú skráð Ăľig inná Ăľennan aðgang með Google takkanum á innskráningarsíðu." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Tengja Facebook" BUTTON_FACEBOOK_DISCONNECT: "Aftengja Facebook" MAIN_FACEBOOK_DESC: "Eftir að Facebook innskráing hefur verið gerð virk, þá getur þú skráð Ăľig inná Ăľennan aðgang með Facebook takkanum á innskráningarsíðu." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Tengja Twitter" BUTTON_TWITTER_DISCONNECT: "Aftengja Twitter" MAIN_TWITTER_DESC: "Eftir að Twitter innskráing hefur verið gerð virk, þá getur þú skráð Ăľig inná Ăľennan aðgang með Twitter takkanum á innskráningarsíðu.." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Möppulisti" BUTTON_CREATE: "BĂşa til möppu" BUTTON_SYSTEM: "Kerfismöppur" BUTTON_DELETE: "Eyða" BUTTON_SUBSCRIBE: "Ăskrift" BUTTON_UNSUBSCRIBE: "Afskrá" LOADING_PROCESS: "Uppfæri möppulista" CREATING_PROCESS: "BĂ˝ til möppu" DELETING_PROCESS: "Eyði möppu" RENAMING_PROCESS: "Endurnefna möppu" DELETING_ASK: "Ertu viss?" TO_MANY_FOLDERS_DESC_1: "Þú ert með allt of margar möppur!" TO_MANY_FOLDERS_DESC_2: "Við höfum birt aðeins hluta Ăľeirra, til að koma Ă­ veg fyrir vandamál með afköst." HELP_DELETE_FOLDER: "Eyða möppu" HELP_SHOW_HIDE_FOLDER: "Birta/fela möppu" HELP_CHECK_FOR_NEW_MESSAGES: "Athuga/ekki athuga með nĂ˝ skilaboð" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Aðgangslisti" LEGEND_IDENTITIES: "Auðkenni" LEGEND_ACCOUNTS_AND_IDENTITIES: "Aðgangar og auðkenni" BUTTON_ADD_ACCOUNT: "Bæta við aðgangi" BUTTON_ADD_IDENTITY: "Bæta við auðkenni" BUTTON_DELETE: "Eyða" LOADING_PROCESS: "Uppfæri aðgangslista" DELETING_ASK: "Ertu viss?" DEFAULT_IDENTITY_LABEL: "sjálfgefið" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Auðkenni" LEGEND_IDENTITIES: "ViðbĂłtarauðkenni" LABEL_DEFAULT: "Sjálfgefið" LABEL_DISPLAY_NAME: "Nafn" LABEL_REPLY_TO: "Svara-til" LABEL_SIGNATURE: "Undirskrift" LABEL_ADD_SIGNATURE_TO_ALL: "Bættu undirskrift við öll Ăştsend skilaboð" BUTTON_ADD_IDENTITY: "Bæta við auðkenni" BUTTON_DELETE: "Eyða" LOADING_PROCESS: "Uppfæri auðkennalista" DELETING_ASK: "Ertu viss?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Breyta lykilorði" LABEL_CURRENT_PASSWORD: "NĂşverandi lykilorð" LABEL_NEW_PASSWORD: "NĂ˝tt lykilorð" LABEL_REPEAT_PASSWORD: "NĂ˝tt lykilorð aftur" BUTTON_UPDATE_PASSWORD: "Setja nĂ˝tt lykilorð" ERROR_PASSWORD_MISMATCH: "Lykilorðin stemma ekki, reyndu aftur" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Flytja inn OpenPGP-lykil" BUTTON_GENERATE_OPEN_PGP_KEYS: "BĂşa til OpenPGP-lykla" TITLE_PRIVATE: "Einkalykill" TITLE_PUBLIC: "Dreifilykill" DELETING_ASK: "Ertu viss?" GENERATE_ONLY_HTTPS: "Einungis HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Vista drög sjálfkrafa" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Hjálp fyrir flĂ˝tilykla" TAB_MAILBOX: "PĂłsthĂłlf" TAB_MESSAGE_LIST: "Skilaboðalisti" TAB_MESSAGE_VIEW: "SkilaboðasĂ˝n" TAB_COMPOSE: "Semja" LABEL_OPEN_USER_DROPDOWN: "Opna fellilista notenda" LABEL_REPLY: "Svara" LABEL_REPLY_ALL: "Svara öllum" LABEL_FORWARD: "Ăframsenda" LABEL_FORWARD_MULTIPLY: "Ăframsenda sem viðhengi" LABEL_HELP: "Hjálp" LABEL_CHECK_ALL: "Velja öll skilaboð" LABEL_ARCHIVE: "Setja Ă­ safn" LABEL_DELETE: "Eyða" LABEL_OPEN_THREAD: "Opna valinn Ăľráð" LABEL_MOVE: "Færa" LABEL_READ: "Lesa valin skilaboð" LABEL_UNREAD: "Gera valin skilaboð Ăłlesin" LABEL_IMPORTANT: "Mikilvægt, flagga valin skeyti" LABEL_SEARCH: "Leita" LABEL_CANCEL_SEARCH: "Hætta við leit" LABEL_FULLSCREEN_ENTER: "à öllum skjánum (með forskoðunarspjaldi)" LABEL_VIEW_MESSAGE_ENTER: "Skoða skilaboð (ekkert forskoðunarspjald)" LABEL_SWITCH_TO_MESSAGE: "Skipta virkni á valin skilaboð" LABEL_SWITCH_TO_FOLDER_LIST: "Skipta virkni á möppulista" LABEL_FULLSCREEN_TOGGLE: "VĂ­xla heilskjá af/á" LABEL_BLOCKQUOTES_TOGGLE: "VĂ­xla inndregnum tilvitnunum skilaboða af/á" LABEL_THREAD_NEXT: "Næstu skilaboð Ă­ Ăľræði" LABEL_THREAD_PREV: "Fyrri skilaboð Ă­ Ăľræði" LABEL_PRINT: "Prenta" LABEL_EXIT_FULLSCREEN: "Fara Ăşr fullum skjá" LABEL_CLOSE_MESSAGE: "Loka skilaboðum (ekkert forskoðunarspjald)" LABEL_SWITCH_TO_LIST: "Skipta virkni til baka Ă­ skilaboðalista" LABEL_OPEN_COMPOSE_POPUP: "Opna riltilglugga" LABEL_MINIMIZE_COMPOSE_POPUP: "Lágmarka riltilglugga" LABEL_OPEN_IDENTITIES_DROPDOWN: "Opna fellilista með persĂłnuauðkennum" LABEL_SAVE_MESSAGE: "Vista skilaboð" LABEL_SEND_MESSAGE: "Senda skilaboð" LABEL_CLOSE_COMPOSE: "Loka ritli" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Engir dreifilyklar fundust" NO_PUBLIC_KEYS_FOUND_FOR: "Engir dreifilyklar fundust fyrir \"%EMAIL%\" pĂłstfangið" NO_PRIVATE_KEY_FOUND: "Enginn einkalykill fannst" NO_PRIVATE_KEY_FOUND_FOR: "Engir einkalyklar fundust fyrir \"%EMAIL%\" pĂłstfangið" ADD_A_PUBLICK_KEY: "Bættu við dreifilykli" SELECT_A_PRIVATE_KEY: "Veldu einkalykil" UNVERIFIRED_SIGNATURE: "Ă“staðfest undirritun" DECRYPTION_ERROR: "OpenPGP afkóðunarvilla" GOOD_SIGNATURE: "Gild undirritun frá %USER%" PGP_ERROR: "OpenPGP villa: %ERROR%" SPECIFY_FROM_EMAIL: "Tilgreindu FRĂ tölvupĂłstfang" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Tiltaktu að minnsta kosti einn viðtakanda" NOTIFICATIONS: INVALID_TOKEN: "Rangt tákn" AUTH_ERROR: "Auðkenning mistĂłkst" ACCESS_ERROR: "Aðgangsvilla" CONNECTION_ERROR: "Get ekki tengst á netĂľjĂłn" CAPTCHA_ERROR: "Rangt CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Ăžessu samfĂ©lagsauðkenni er ekki Ăşthlutað á neitt tölvupĂłstfang ennþá. Skráðu Ăľig inn með notandaupplĂ˝singum tölvupĂłstfangsins og bættu Ăľessum valmöguleika við Ă­ aðgangsstillingum. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Ăžessu samfĂ©lagsauðkenni er ekki Ăşthlutað á neitt tölvupĂłstfang ennþá. Skráðu Ăľig inn með notandaupplĂ˝singum tölvupĂłstfangsins og bættu Ăľessum valmöguleika við Ă­ aðgangsstillingum. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Ăžessu samfĂ©lagsauðkenni er ekki Ăşthlutað á neitt tölvupĂłstfang ennþá. Skráðu Ăľig inn með notandaupplĂ˝singum tölvupĂłstfangsins og bættu Ăľessum valmöguleika við Ă­ aðgangsstillingum. DOMAIN_NOT_ALLOWED: "LĂ©n ekki leyft" ACCOUNT_NOT_ALLOWED: "Aðgangur er ekki leyfður" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Krafist er 2-Ăľrepa sannvottunar" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Villa Ă­ 2-Ăľrepa sannvottun" COULD_NOT_SAVE_NEW_PASSWORD: "Gat ekki vistað nĂ˝tt lykilorð" CURRENT_PASSWORD_INCORRECT: "NĂşverandi lykilorð er rangt" NEW_PASSWORD_SHORT: "Lykilorð er of stutt" NEW_PASSWORD_WEAK: "Lykilorð er of auðvelt" NEW_PASSWORD_FORBIDDENT: "Lykilorð inniheldur Ăłleyfilega stafi" CONTACTS_SYNC_ERROR: "Villa Ă­ samstillingu tengiliða" CANT_GET_MESSAGE_LIST: "Get ekki sĂłtt skilaboðlista" CANT_GET_MESSAGE: "Get ekki sĂłtt skilaboð" CANT_DELETE_MESSAGE: "Get ekki eytt skilaboðum" CANT_MOVE_MESSAGE: "Get ekki fært skilaboð" CANT_SAVE_MESSAGE: "Get ekki vistað skilaboð" CANT_SEND_MESSAGE: "Get ekki sent skilaboð" INVALID_RECIPIENTS: "Rangir viðtakendur" CANT_SAVE_FILTERS: "Get ekki vistað sĂ­ur" CANT_GET_FILTERS: "Get ekki sĂłtt sĂ­ur" FILTERS_ARE_NOT_CORRECT: "SĂ­ur eru ekki rĂ©ttar" CANT_CREATE_FOLDER: "Get ekki bĂşið til möppu" CANT_RENAME_FOLDER: "Get ekki endurnefnt möppu" CANT_DELETE_FOLDER: "Get ekki eytt möppu" CANT_DELETE_NON_EMPTY_FOLDER: "Get ekki eytt möppu Ă­ notkun" CANT_SUBSCRIBE_FOLDER: "Get ekki gerst áskrifandi á möppu" CANT_UNSUBSCRIBE_FOLDER: "Get ekki hætt áskrift á möppu" CANT_SAVE_SETTINGS: "Get ekki vistað stillingar" CANT_SAVE_PLUGIN_SETTINGS: "Get ekki stillingar" DOMAIN_ALREADY_EXISTS: "LĂ©n er nĂş Ăľegar til staðar" CANT_INSTALL_PACKAGE: "MistĂłkst að setja inn pakka" CANT_DELETE_PACKAGE: "MistĂłkst að fjarlægja pakka" INVALID_PLUGIN_PACKAGE: "Ă“gildur viðbĂłtapakki" UNSUPPORTED_PLUGIN_PACKAGE: "Ă“studdur viðbĂłtapakki" LICENSING_SERVER_IS_UNAVAILABLE: "ĂskriftarnetĂľjĂłnn er ekki aðgengilegur" LICENSING_DOMAIN_EXPIRED: "Ăskrift fyrir Ăľetta lĂ©n hefur runnið Ăşt." LICENSING_DOMAIN_BANNED: "Ăskrift fyrir Ăľetta lĂ©n er bönnuð." DEMO_SEND_MESSAGE_ERROR: "Vegna öryggissjĂłnarmiða, þá hefur Ăľessi aðgangur ekki leyfi til að senda pĂłst á utanaðkomandi netföng!" DEMO_ACCOUNT_ERROR: "Vegna öryggissjĂłnarmiða, þá hefur Ăľessi aðgangur ekki heimild fyrir Ăľessa aðgerð!" ACCOUNT_ALREADY_EXISTS: "Aðgangur er nĂş Ăľegar til staðar" ACCOUNT_DOES_NOT_EXIST: "Aðgangur er ekki til" MAIL_SERVER_ERROR: "Villa kom upp við tilraun til að tengjast pĂłstĂľjĂłni" INVALID_INPUT_ARGUMENT: "Ă“leyfilegt inntaksviðfang" UNKNOWN_ERROR: "Óþekkt villa" STATIC: BACK_LINK: "Endurhlaða" DOMAIN_LIST_DESC: "Listi yfir lĂ©n sem vefpĂłstur má tengjast." PHP_EXSTENSIONS_ERROR_DESC: "Nauðsynlegir PHP-viðaukar eru ekki til staðar Ă­ PHP uppsetningunni Ăľinni!" PHP_VERSION_ERROR_DESC: "PHP Ăştgáfan þín (%VERSION%) er eldri en lágmarksĂştgáfan sem krafist er (5.3.0)!" NO_SCRIPT_TITLE: "JavaScript er nauðsynlegt fyrir Ăľetta forrit." NO_SCRIPT_DESC: | JavaScript stuðningur er ekki virkt Ă­ vafranum þínum. Gerðu JavaScript virkt Ă­ stillingum vafrans og reyndu aftur. NO_COOKIE_TITLE: "Stuðningur við vefkökur er nauðsynlegur fyrir Ăľetta forrit." NO_COOKIE_DESC: | Stuðningur við vefkökur er ekki til staðar Ă­ vafranum þínum. Gerðu vefkökur virkar Ă­ vafranum þínum og reyndu aftur. BAD_BROWSER_TITLE: "Vafrinn Ăľinn er Ăşreltur." BAD_BROWSER_DESC: | Til að geta notað alla eiginleikana Ă­ Ăľessu forriti, náðu Ă­ og settu upp einn af Ăľessum vöfrum: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/it_IT.yml000066400000000000000000000777011361462701300262230ustar00rootroot00000000000000it_IT: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Login" LABEL_PASSWORD: "Password" LABEL_SIGN_ME: "Ricordami" LABEL_VERIFICATION_CODE: "Codice di verifica" LABEL_DONT_ASK_VERIFICATION_CODE: "Non chiedere il codice per 2 settimane" BUTTON_SIGN_IN: "Accedi" TITLE_SIGN_IN_GOOGLE: "Accedi usando Google" TITLE_SIGN_IN_FACEBOOK: "Accedi usando Facebook" TITLE_SIGN_IN_TWITTER: "Accedi usando Twitter" LABEL_FORGOT_PASSWORD: "Ho dimenticato la password" LABEL_REGISTRATION: "Registrazione" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Aggiungi account" BUTTON_SETTINGS: "Impostazioni" BUTTON_HELP: "Aiuto" BUTTON_LOGOUT: "Esci" MOBILE: BUTTON_MOBILE_VERSION: "Versione mobile" BUTTON_DESKTOP_VERSION: "Versione desktop" SEARCH: MAIN_INPUT_PLACEHOLDER: "Cerca" TITLE_ADV: "Ricerca avanzata" LABEL_ADV_FROM: "Da" LABEL_ADV_TO: "A" LABEL_ADV_SUBJECT: "Oggetto" LABEL_ADV_TEXT: "Messaggio" LABEL_ADV_HAS_ATTACHMENT: "Ha un allegato" LABEL_ADV_HAS_ATTACHMENTS: "Ha piĂą allegati" LABEL_ADV_FLAGGED: "Preferiti" LABEL_ADV_UNSEEN: "Non letti" LABEL_ADV_DATE: "Data" LABEL_ADV_DATE_ALL: "Tutte" LABEL_ADV_DATE_3_DAYS: "Meno di 3 giorni fa" LABEL_ADV_DATE_7_DAYS: "Meno di una settimana fa" LABEL_ADV_DATE_MONTH: "Meno di un mese fa" LABEL_ADV_DATE_3_MONTHS: "Meno di 3 mesi fa" LABEL_ADV_DATE_6_MONTHS: "Meno di 6 mesi fa" LABEL_ADV_DATE_YEAR: "Meno di un anno fa" BUTTON_ADV_SEARCH: "Cerca" PREVIEW_POPUP: FULLSCREEN: "Passa a schermo intero" ZOOM: "Ingrandisci +/-" CLOSE: "Chiudi (Esc)" LOADING: "Caricamento..." GALLERY_PREV: "Precedente (Freccia sinistra)" GALLERY_NEXT: "Successivo (Freccia destra)" GALLERY_COUNTER: "%curr% di %total%" IMAGE_ERROR: "L'immagine non può essere caricata." AJAX_ERROR: "Il contenuto non può essere caricato." FOLDER_LIST: BUTTON_COMPOSE: "Scrivi messaggio" BUTTON_CONTACTS: "Contatti" BUTTON_NEW_MESSAGE: "Nuovo messaggio" INBOX_NAME: "Posta in arrivo" SENT_NAME: "Posta inviata" DRAFTS_NAME: "Bozze" SPAM_NAME: "Spam" TRASH_NAME: "Cestino" ARCHIVE_NAME: "Archivio" QUOTA: TITLE: "Uso della quota" MESSAGE_LIST: BUTTON_RELOAD: "Aggiorna" BUTTON_MOVE_TO: "Sposta in" BUTTON_DELETE: "Elimina" BUTTON_ARCHIVE: "Archivia" BUTTON_SPAM: "Segnala come spam" BUTTON_NOT_SPAM: "Segnala come non spam" BUTTON_EMPTY_FOLDER: "Svuota cartella" BUTTON_MULTY_FORWARD: "Inoltra messaggi" BUTTON_DELETE_WITHOUT_MOVE: "Elimina definitivamente" BUTTON_MORE: "Altro" MENU_SET_SEEN: "Marca come letto" MENU_SET_ALL_SEEN: "Marca tutti come letti" MENU_UNSET_SEEN: "Marca come non letto" MENU_SET_FLAG: "Marca come preferito" MENU_UNSET_FLAG: "Marca come non preferito" MENU_SELECT_ALL: "Tutti" MENU_SELECT_NONE: "Nessuno" MENU_SELECT_INVERT: "Inverti" MENU_SELECT_UNSEEN: "Non letti" MENU_SELECT_SEEN: "Letti" MENU_SELECT_FLAGGED: "Preferiti" MENU_SELECT_UNFLAGGED: "Non preferiti" EMPTY_LIST: "Lista vuota" EMPTY_SEARCH_LIST: "Nessun messaggio corrisponde alla tua ricerca" SEARCH_RESULT_FOR: "Risultati di ricerca per \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "ritorna alla lista dei messaggi" LIST_LOADING: "Caricamento..." EMPTY_SUBJECT_TEXT: "(Nessun oggetto)" PUT_MESSAGE_HERE: "Trascina il messaggio qui per vederlo nella lista" TODAY_AT: "oggi alle %TIME%" YESTERDAY_AT: "ieri alle %TIME%" SEARCH_PLACEHOLDER: "Cerca" NEW_MESSAGE_NOTIFICATION: "Hai %COUNT% nuovi messaggi!" QUOTA_SIZE: "Stai usando %SIZE% (%PROC%%) su %LIMIT%" MESSAGE: BUTTON_EDIT: "Modifica" BUTTON_BACK: "Indietro" BUTTON_CLOSE: "Chiudi" BUTTON_DELETE: "Elimina" BUTTON_UNSUBSCRIBE: "Disiscriviti da questa lista" BUTTON_ARCHIVE: "Archivia" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Non spam" BUTTON_MOVE_TO: "Sposta in" BUTTON_MORE: "Altro" BUTTON_REPLY: "Rispondi" BUTTON_REPLY_ALL: "Rispondi a tutti" BUTTON_FORWARD: "Inoltra" BUTTON_FORWARD_AS_ATTACHMENT: "Inoltra come allegato" BUTTON_EDIT_AS_NEW: "Modifica come nuovo" BUTTON_SHOW_IMAGES: "Mostra immagini esterne" BUTTON_NOTIFY_READ_RECEIPT: "Chi ha inviato il messaggio ha richiesto di essere avvisato quando lo leggi." BUTTON_IN_NEW_WINDOW: "Leggi in una finestra separata" BUTTON_THREAD_LIST: "Messaggi in questa conversazione" BUTTON_THREAD_PREV: "Messaggio precedente" BUTTON_THREAD_NEXT: "Prossimo messaggio" BUTTON_THREAD_MORE: "PiĂą messaggi" MENU_HEADERS: "Mostra le intestazioni del messaggio" MENU_VIEW_ORIGINAL: "Visualizza sorgente" MENU_DOWNLOAD_ORIGINAL: "Scarica come file .eml" MENU_FILTER_SIMILAR: "Mostra messaggi come questo" MENU_PRINT: "Stampa" EMPTY_SUBJECT_TEXT: "(Nessun oggetto)" LABEL_SUBJECT: "Oggetto" LABEL_DATE: "Data" LABEL_FROM: "Da" LABEL_FROM_SHORT: "da" LABEL_TO: "A" LABEL_TO_SHORT: "a" LABEL_CC: "CC" LABEL_BCC: "CCN" LABEL_REPLY_TO: "Rispondi a" PRINT_LABEL_FROM: "Da" PRINT_LABEL_TO: "A" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "CCN" PRINT_LABEL_REPLY_TO: "Rispondi a" PRINT_LABEL_DATE: "Data" PRINT_LABEL_SUBJECT: "Oggetto" PRINT_LABEL_ATTACHMENTS: "Allegati" MESSAGE_LOADING: "Caricamento..." MESSAGE_VIEW_DESC: "Seleziona un messaggio dalla lista per visualizzarlo qui" MESSAGE_VIEW_MOVE_DESC: "Clicca sul nome della cartella nel pannello sinistro per selezionare la destinazione." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "Messaggio firmato con OpenPGP (clicca qui per verificarlo)" PGP_ENCRYPTED_MESSAGE_DESC: "Messaggio cifrato con OpenPGP (clicca qui per decifrarlo)" LINK_DOWNLOAD_AS_ZIP: "Scarica come archivio ZIP" LINK_SAVE_TO_OWNCLOUD: "Salva su OwnCloud" LINK_SAVE_TO_CLOUD: "Salva nel cloud" LINK_SAVE_TO_DROPBOX: "Salva su DropBox" READ_RECEIPT: SUBJECT: "Avviso di lettura - %SUBJECT%" BODY: | Questo è un avviso di lettura per la mail che hai inviato a %READ-RECEIPT%. Attenzione: questa notifica di lettura significa solo che il messaggio è stato visualizzato nel computer del destinatario. Non c'è alcuna garanzia che il destinatario abbia letto o capito il contenuto del messaggio. SUGGESTIONS: SEARCHING_DESC: "Cerca..." CONTACTS: LEGEND_CONTACTS: "Contatti" SEARCH_INPUT_PLACEHOLDER: "Cerca" BUTTON_ADD_CONTACT: "Aggiungi contatto" BUTTON_CREATE_CONTACT: "Crea" BUTTON_UPDATE_CONTACT: "Aggiorna" BUTTON_IMPORT: "Importa (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Esporta (vcf, vCard)" BUTTON_EXPORT_CSV: "Esporta (csv)" ERROR_IMPORT_FILE: "Errore di importazione (formato del file non valido)" LIST_LOADING: "Caricamento..." EMPTY_LIST: "Nessun contatto qui" EMPTY_SEARCH: "Nessun contatto trovato" CLEAR_SEARCH: "Pulisci ricerca" CONTACT_VIEW_DESC: "Seleziona un contatto dalla lista per visualizzarlo qui" LABEL_DISPLAY_NAME: "Nome visualizzato" LABEL_EMAIL: "Email" LABEL_PHONE: "Telefono" LABEL_WEB: "Sito web" LABEL_BIRTHDAY: "Compleanno" LINK_ADD_EMAIL: "Aggiungi un'indirizzo email" LINK_ADD_PHONE: "Aggiungi un numero di telefono" LINK_BIRTHDAY: "Compleanno" PLACEHOLDER_ENTER_DISPLAY_NAME: "Inserisci il nome visualizzato" PLACEHOLDER_ENTER_LAST_NAME: "Inserisci il cognome" PLACEHOLDER_ENTER_FIRST_NAME: "Inserisci il nome" PLACEHOLDER_ENTER_NICK_NAME: "Inserisci il nickname" LABEL_READ_ONLY: "Sola lettura" LABEL_SHARE: "Condividi" ADD_MENU_LABEL: "Aggiungi" ADD_MENU_NICKNAME: "Nickname" ADD_MENU_NOTES: "Note" ADD_MENU_EMAIL: "Indirizzo email" ADD_MENU_PHONE: "Telefono" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Indirizzo" ADD_MENU_BIRTHDAY: "Compleanno" ADD_MENU_TAGS: "Tag" BUTTON_SHARE_NONE: "Nessuno" BUTTON_SHARE_ALL: "Tutti" BUTTON_SYNC: "Sincronizzazione (CardDAV)" COMPOSE: TITLE_FROM: "Da" TITLE_TO: "A" TITLE_CC: "CC" TITLE_BCC: "CCN" TITLE_REPLY_TO: "Rispondi a" TITLE_SUBJECT: "Oggetto" LINK_SHOW_INPUTS: "Visualizza tutti i campi" BUTTON_SEND: "Invia" BUTTON_SAVE: "Salva" BUTTON_DELETE: "Elimina" BUTTON_CANCEL: "Annulla" BUTTON_MINIMIZE: "Minimizza" SAVED_TIME: "Salvata il %TIME%" SAVED_ERROR_ON_SEND: "Il messaggio è stato inviato ma non è stato salvato nella cartella \"Posta inviata\"" DISCARD_UNSAVED_DATA: "Elimino i dati non salvati?" ATTACH_FILES: "Allega file" ATTACH_DROP_FILES_DESC: "Trascina i file qui" ATTACH_ITEM_CANCEL: "Annulla" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "------- Messaggio inoltrato -------" FORWARD_MESSAGE_TOP_FROM: "Da" FORWARD_MESSAGE_TOP_TO: "A" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Inviato il" FORWARD_MESSAGE_TOP_SUBJECT: "Oggetto" EMPTY_TO_ERROR_DESC: "Specifica almeno un destinatario" NO_ATTACHMENTS_HERE_DESC: "Nessun allegato." ATTACHMENTS_ERROR_DESC: "Attenzione! Non tutti gli allegati sono stati caricati." ATTACHMENTS_UPLOAD_ERROR_DESC: "Non tutti gli allegati sono stati caricati al momento." BUTTON_REQUEST_READ_RECEIPT: "Richiedi conferma di lettura" BUTTON_MARK_AS_IMPORTANT: "Marca come importante" BUTTON_OPEN_PGP: "OpenPGP (Solo testo semplice)" BUTTON_REQUEST_DSN: "Richiedi conferma del ricevimento" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Chiudi" POPUPS_ASK: BUTTON_YES: "Si" BUTTON_NO: "No" DESC_WANT_CLOSE_THIS_WINDOW: "Sei sicuro di voler chiudere questa finestra?" DESC_WANT_DELETE_MESSAGES: "Sei sicuro di voler eliminare il messaggio?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Seleziona lingua" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Aggiungo un account?" BUTTON_ADD_ACCOUNT: "Aggiungi" TITLE_UPDATE_ACCOUNT: "Aggiorno account?" BUTTON_UPDATE_ACCOUNT: "Aggiorna" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Aggiungo un'identitĂ ?" TITLE_UPDATE_IDENTITY: "Aggiorno identitĂ ?" BUTTON_ADD_IDENTITY: "Aggiungi" BUTTON_UPDATE_IDENTITY: "Aggiorna" LABEL_EMAIL: "Email" LABEL_NAME: "Nome" LABEL_REPLY_TO: "Rispondi a" LABEL_SIGNATURE: "Firma" LABEL_CC: "CC" LABEL_BCC: "CCN" LABEL_SIGNATURE_INSERT_BEFORE: "Inserisci questa firma prima del messaggio citato nelle risposte" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Creo una cartella?" LABEL_NAME: "Nome cartella" LABEL_PARENT: "Genitore" BUTTON_CREATE: "Crea" BUTTON_CANCEL: "Annulla" BUTTON_CLOSE: "Chiudi" TITLE_CREATING_PROCESS: "Creazione cartella..." POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Elimino tutti i messaggi dalla cartella?" BUTTON_CLEAR: "Elimina" BUTTON_CANCEL: "Annulla" BUTTON_CLOSE: "Chiudi" DANGER_DESC_WARNING: "Attenzione!" DANGER_DESC_HTML_1: "Questa azione eliminerĂ  tutti i messaggi presenti nella cartella %FOLDER%." DANGER_DESC_HTML_2: "Una volta iniziato, il processo non può piĂą essere annullato." TITLE_CLEARING_PROCESS: "Eliminazione cartella..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importa chiave OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Importa" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Visualizza chiave OpenPGP" BUTTON_SELECT: "Seleziona tutto" BUTTON_CLOSE: "Chiudi" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Genera chiavi OpenPGP" LABEL_EMAIL: "Indirizzo email" LABEL_NAME: "Nome" LABEL_PASSWORD: "Password" LABEL_KEY_BIT_LENGTH: "Lunghezza della chiave" BUTTON_GENERATE_OPEN_PGP_KEYS: "Genera" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "Firma/Cifra con OpenPGP" LABEL_SIGN: "Firma" LABEL_ENCRYPT: "Cifra" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Firma" BUTTON_ENCRYPT: "Cifra" BUTTON_SIGN_AND_ENCRYPT: "Firma e cifra" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Verifica a 2 fattori" LABEL_CODE: "Codice" BUTTON_TEST: "Esegui test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Creo un filtro?" TITLE_EDIT_FILTER: "Aggiorno il filtro?" FILTER_NAME: "Nome" LEGEND_CONDITIONS: "Condizioni" LEGEND_ACTIONS: "Azioni" BUTTON_DONE: "Fatto" BUTTON_ADD_CONDITION: "Aggiungi una condizione" SELECT_ACTION_NONE: "Nessuna" SELECT_ACTION_MOVE_TO: "Sposta in" SELECT_ACTION_FORWARD_TO: "Inoltra a" SELECT_ACTION_REJECT: "Rifiuta" SELECT_ACTION_VACATION_MESSAGE: "Messaggio fuori-ufficio" SELECT_ACTION_DISCARD: "Scarta" SELECT_FIELD_FROM: "Da" SELECT_FIELD_RECIPIENTS: "Destinatari (A oppure CC)" SELECT_FIELD_SUBJECT: "Oggetto" SELECT_FIELD_HEADER: "Intestazione" SELECT_FIELD_SIZE: "Dimensione" SELECT_TYPE_CONTAINS: "Contiene" SELECT_TYPE_NOT_CONTAINS: "Non contiene" SELECT_TYPE_MATCHES: "Corrisponde (* e ? supportati)" SELECT_TYPE_NOT_MATCHES: "Non corrisponde (* e ? supportati)" SELECT_TYPE_REGEXP: "Corrisponde Regexp" SELECT_TYPE_NOT_REGEXP: "Non corrisponde regexp" SELECT_TYPE_EQUAL_TO: "Uguale a" SELECT_TYPE_NOT_EQUAL_TO: "Non uguale a" SELECT_TYPE_OVER: "Maggiore di" SELECT_TYPE_UNDER: "Minore di" SELECT_MATCH_ANY: "Corrisponde ad una delle seguenti regole" SELECT_MATCH_ALL: "Corrisponde a tutte le seguenti regole" MARK_AS_READ_LABEL: "Marca come letto" REPLY_INTERVAL_LABEL: "Intervallo di risposta (giorni)" KEEP_LABEL: "Mantieni" STOP_LABEL: "Non interrompere l'elaborazione delle regole" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Oggetto (opzionale)" VACATION_MESSAGE_LABEL: "Messaggio" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Rifiuta messagio" ALL_INCOMING_MESSAGES_DESC: "Tutti i messaggi in ingresso" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Seleziona le cartelle di sistema" SELECT_CHOOSE_ONE: "Selezionane una" SELECT_UNUSE_NAME: "Non usarla" LABEL_SENT: "Posta inviata" LABEL_DRAFTS: "Bozze" LABEL_SPAM: "Spam" LABEL_TRASH: "Cestino" LABEL_ARCHIVE: "Archivio" BUTTON_CANCEL: "Annulla" BUTTON_CLOSE: "Chiudi" NOTIFICATION_SENT: | Non hai selezionato una cartella di sistema per la posta inviata. Se non vuoi salvare i messaggi inviati seleziona "Non usarla". NOTIFICATION_DRAFTS: "Non hai selezionato una cartella di sistema per le bozze." NOTIFICATION_SPAM: | Non hai selezionato una cartella di sistema per i messaggi spam. Se li vuoi eliminare permanentemente seleziona "Non usarla". NOTIFICATION_TRASH: | Non hai selezionato una cartella di sistema per il cestino. Se non lo vuoi usare (e quindi eliminare i messaggi permanentemente) seleziona "Non usarla". NOTIFICATION_ARCHIVE: "Non hai selezionato una cartella di sistema per i messaggi archiviati." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Autenticazione a due fattori" LABEL_ENABLE_TWO_FACTOR: "Abilita autenticazione a due fattori" LABEL_TWO_FACTOR_USER: "Utente" LABEL_TWO_FACTOR_STATUS: "Stato" LABEL_TWO_FACTOR_SECRET: "Codice segreto" LABEL_TWO_FACTOR_BACKUP_CODES: "Codici di riserva" BUTTON_CREATE: "Crea un nuovo codice segreto" BUTTON_ACTIVATE: "Attiva" BUTTON_CLEAR: "Disattiva" BUTTON_LOGOUT: "Esci" BUTTON_DONE: "Fatto" BUTTON_TEST: "Esegui verifica" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Mostra codice segreto" BUTTON_HIDE_SECRET: "Nascondi codice segreto" TWO_FACTOR_REQUIRE_DESC: "Il tuo account richiede l'autenticazione a due fattori." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurato" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Non configurato" TWO_FACTOR_SECRET_DESC: >- Importa questo codice nel tuo client di Google Authenticator (o un altro client TOTP) usando il codice QR presente sotto o inserendo il codice manualmente. TWO_FACTOR_BACKUP_CODES_DESC: >- Se non puoi ricevere codici da Google Authenticator, puoi usare i codici di riserva per entrare. Dopo aver usato un codice di riserva per entrare, esso si disattiverĂ . TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Non puoi salvare quest'impostazione senza prima verificarne il funzionamento." TITLES: LOADING: "Caricamento..." LOGIN: "Accedi" MAILBOX: "Casella di posta" SETTINGS: "Impostazioni" COMPOSE: "Scrivi messaggio" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Il file è troppo grande" ERROR_FILE_PARTIALLY_UPLOADED: "Il file è stato caricato solo parzialmente per un motivo sconosciuto" ERROR_NO_FILE_UPLOADED: "Nessun file è stato caricato" ERROR_MISSING_TEMP_FOLDER: "Il file temporaneo non è presente" ERROR_ON_SAVING_FILE: "Si è verificato un errore sconosciuto durante il caricamento del file" ERROR_FILE_TYPE: "Il tipo di file non è valido" ERROR_UNKNOWN: "Si è verificato un errore sconosciuto durante il caricamento del file" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Testo semplice" TEXT_SWITCHER_RICH_FORMATTING: "Testo formattato" TEXT_SWITCHER_CONFIRM: "La formattazione del testo e le immagini andranno perse. Sei sicuro di voler continuare?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personali" LABEL_GENERAL_NAME: "Generali" LABEL_CONTACTS_NAME: "Contatti" LABEL_FOLDERS_NAME: "Cartelle" LABEL_ACCOUNTS_NAME: "Account" LABEL_IDENTITY_NAME: "IdentitĂ " LABEL_IDENTITIES_NAME: "IdentitĂ " LABEL_FILTERS_NAME: "Filtri" LABEL_TEMPLATES_NAME: "Modelli" LABEL_SECURITY_NAME: "Sicurezza" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Temi" LABEL_CHANGE_PASSWORD_NAME: "Password" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Indietro" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtri" BUTTON_SAVE: "Salva" BUTTON_ADD_FILTER: "Aggiungi filtro" BUTTON_DELETE: "Elimina" BUTTON_RAW_SCRIPT: "Usa script personalizzato" SUBNAME_NONE: "Nessuno" SUBNAME_MOVE_TO: "Sposta in \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Inoltra a \"%EMAIL%\"" SUBNAME_REJECT: "Rifiuta" SUBNAME_VACATION_MESSAGE: "Messaggio fuori-ufficio" SUBNAME_DISCARD: "Scarta" CAPABILITY_LABEL: "Caratteristiche" LOADING_PROCESS: "Aggiornamento lista filtri" DELETING_ASK: "Sei sicuro?" CHACHES_NEED_TO_BE_SAVED_DESC: "Queste modifiche devono essere salvate nel server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "IdentitĂ " LABEL_DISPLAY_NAME: "Nome" LABEL_REPLY_TO: "Rispondi a" LABEL_SIGNATURE: "Firma" LABEL_ADD_SIGNATURE_TO_ALL: "Aggiungi la firma a tutti i messaggi in uscita" SETTINGS_SECURITY: LEGEND_SECURITY: "Sicurezza" LABEL_CONFIGURE_TWO_FACTOR: "Configura autenticazione a due fattori" LABEL_AUTOLOGOUT: "Disconnessione automatica" AUTOLOGIN_NEVER_OPTION_NAME: "Mai" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuti" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ore" SETTINGS_GENERAL: LEGEND_GENERAL: "Generali" LABEL_LANGUAGE: "Lingua" LABEL_IDENTITY: "IdentitĂ " LABEL_LAYOUT: "Struttura" LABEL_LAYOUT_NO_SPLIT: "A pagina intera" LABEL_LAYOUT_VERTICAL_SPLIT: "Divisione verticale" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Divisione orizzontale" LABEL_EDITOR: "Editor di testo predefinito" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Testo semplice" LABEL_EDITOR_HTML_FORCED: "Html (forzato)" LABEL_EDITOR_PLAIN_FORCED: "Testo semplice (forzato)" LABEL_ANIMATION: "Animazioni dell'interfaccia" LABEL_ANIMATION_FULL: "Tutte" LABEL_ANIMATION_NORMAL: "Normali" LABEL_ANIMATION_NONE: "Nessuna" LABEL_VIEW_OPTIONS: "Impostazioni di visualizzazione" LABEL_USE_PREVIEW_PANE: "Mosta l'anteprima del messaggio" LABEL_USE_CHECKBOXES_IN_LIST: "Mostra le caselle di spunta nella lista" LABEL_USE_THREADS: "Usa le conversazioni" LABEL_REPLY_SAME_FOLDER: "Posiziona le risposte nella cartella del messaggio a cui si è risposto" LABEL_SHOW_IMAGES: "Visualizza sempre le immagini esterne nel messaggio" LABEL_SHOW_ANIMATION: "Mostra le animazioni" LABEL_MESSAGE_PER_PAGE: "Messaggi per pagina" LABEL_NOTIFICATIONS: "Notifiche" LABEL_SOUND_NOTIFICATION: "Notifica sonora" LABEL_CHROME_NOTIFICATION_DESC: "Mostra le notifiche in caso di nuovi messaggi" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloccate dal browser)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contatti" LABEL_CONTACTS_AUTOSAVE: "Aggiungi automaticamente le persone che ti inviano mail alla rubrica" LEGEND_CONTACTS_SYNC: "Sincronizzazione remota (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Abilita sincronizzazione remota" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Indirizzo della rubrica" LABEL_CONTACTS_SYNC_USER: "Utente" LABEL_CONTACTS_SYNC_PASSWORD: "Password" SETTINGS_THEMES: LEGEND_THEMES: "Temi" LEGEND_THEMES_CUSTOM: "Configurazione del tema personalizzato" LABEL_CUSTOM_TYPE: "Tipo" LABEL_CUSTOM_TYPE_LIGHT: "Chiaro" LABEL_CUSTOM_TYPE_DARK: "Scuro" LABEL_CUSTOM_BACKGROUND_IMAGE: "Sfondo" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Carica immagine di sfondo (.jpg o .png)" ERROR_FILE_IS_TOO_BIG: "Il file è piĂą grande di 1MB" ERROR_FILE_TYPE_ERROR: "Tipo di file invalido (solo .jpg o .png)" ERROR_UNKNOWN: "Si è verificato un errore sconosciuto durante il caricamento del file" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Connetti a Google" BUTTON_GOOGLE_DISCONNECT: "Disconnetti da Google" MAIN_GOOGLE_DESC: "Dopo aver abilitato il login tramite Google, puoi accedere a questo account utilizzando il bottone \"Google\" nella schermata di login.\n" LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Connettiti a Facebook" BUTTON_FACEBOOK_DISCONNECT: "Disconnetti da Facebook" MAIN_FACEBOOK_DESC: "Dopo aver abilitato il login tramite Facebook, puoi accedere a questo account utilizzando il bottone \"Facebook\" nella schermata di login.\n" LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Connettiti a Twitter" BUTTON_TWITTER_DISCONNECT: "Disconnetti da Twitter" MAIN_TWITTER_DESC: "Dopo aver abilitato il login tramite Twitter, puoi accedere a questo account utilizzando il bottone \"Twitter\" nella schermata di login.\n" SETTINGS_FOLDERS: LEGEND_FOLDERS: "Lista delle cartelle" BUTTON_CREATE: "Crea una cartella" BUTTON_SYSTEM: "Cartelle di sistema" BUTTON_DELETE: "Elimina" BUTTON_SUBSCRIBE: "Sottoscrivi" BUTTON_UNSUBSCRIBE: "Rimuovi sottoscrizione" LOADING_PROCESS: "Aggiornamento della lista delle cartelle..." CREATING_PROCESS: "Creazione cartella..." DELETING_PROCESS: "Eliminazione cartella..." RENAMING_PROCESS: "Rinomina cartella..." DELETING_ASK: "Sei sicuro?" TO_MANY_FOLDERS_DESC_1: "Ci sono troppe cartelle!" TO_MANY_FOLDERS_DESC_2: "Vengono visualizzate solo una parte per evitare problemi di performance." HELP_DELETE_FOLDER: "Cancella cartella" HELP_SHOW_HIDE_FOLDER: "Mostra/nascondi cartella" HELP_CHECK_FOR_NEW_MESSAGES: "Controlla/non controlla la presenza di nuovi messaggi" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Lista degli account" LEGEND_IDENTITIES: "IdentitĂ " LEGEND_ACCOUNTS_AND_IDENTITIES: "Account ed identitĂ " BUTTON_ADD_ACCOUNT: "Aggiungi account" BUTTON_ADD_IDENTITY: "Aggiungi identitĂ " BUTTON_DELETE: "Elimina" LOADING_PROCESS: "Aggiornamento della lista degli account..." DELETING_ASK: "Sei sicuro?" DEFAULT_IDENTITY_LABEL: "predefinito" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "IdentitĂ " LEGEND_IDENTITIES: "IdentitĂ  aggiuntive" LABEL_DEFAULT: "Predefinita" LABEL_DISPLAY_NAME: "Nome" LABEL_REPLY_TO: "Rispondi a" LABEL_SIGNATURE: "Firma" LABEL_ADD_SIGNATURE_TO_ALL: "Aggiungi la firma a tutti i messaggi in uscita" BUTTON_ADD_IDENTITY: "Aggiungi identitĂ " BUTTON_DELETE: "Elimina" LOADING_PROCESS: "Aggiornamento lista delle identitĂ " DELETING_ASK: "Sei sicuro?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Cambia password" LABEL_CURRENT_PASSWORD: "Password attuale" LABEL_NEW_PASSWORD: "Nuova password" LABEL_REPEAT_PASSWORD: "Ripeti nuova password" BUTTON_UPDATE_PASSWORD: "Cambia password" ERROR_PASSWORD_MISMATCH: "Le password non corrispondono, riprova" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importa chiave OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "Genera chiave OpenPGP" TITLE_PRIVATE: "Privata" TITLE_PUBLIC: "Pubblica" DELETING_ASK: "Sei sicuro?" GENERATE_ONLY_HTTPS: "solo tramite HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Salva automaticamente la bozza" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Aiuto sulle scorciatoie da tastiera" TAB_MAILBOX: "Casella di posta" TAB_MESSAGE_LIST: "Lista messaggi" TAB_MESSAGE_VIEW: "Lettura messaggio" TAB_COMPOSE: "Scrittura messaggio" LABEL_OPEN_USER_DROPDOWN: "Apri menu utente" LABEL_REPLY: "Rispondi" LABEL_REPLY_ALL: "Rispondi a tutti" LABEL_FORWARD: "Inoltra" LABEL_FORWARD_MULTIPLY: "Inoltro multiplo" LABEL_HELP: "Aiuto" LABEL_CHECK_ALL: "Seleziona tutti i messaggi" LABEL_ARCHIVE: "Archivia messaggio" LABEL_DELETE: "Elimina messaggio" LABEL_OPEN_THREAD: "Apri la conversazione selezionata" LABEL_MOVE: "Sposta messaggio" LABEL_READ: "Marca come letti i messaggi selezionati" LABEL_UNREAD: "Marca come non letti i messaggi selezionati" LABEL_IMPORTANT: "Marca importanti o preferiti/non preferiti i messaggi selezionati" LABEL_SEARCH: "Cerca" LABEL_CANCEL_SEARCH: "Annulla ricerca" LABEL_FULLSCREEN_ENTER: "Schermo intero (con anteprima messaggi)" LABEL_VIEW_MESSAGE_ENTER: "Visualizza messaggio (senza anteprima messaggi)" LABEL_SWITCH_TO_MESSAGE: "Sposta la selezione sul messaggio corrente" LABEL_SWITCH_TO_FOLDER_LIST: "Sposta la selezione sulla lista delle cartelle" LABEL_FULLSCREEN_TOGGLE: "Attiva/disattiva la modalitĂ  a schermo intero" LABEL_BLOCKQUOTES_TOGGLE: "Mostra/nascondi le citazioni" LABEL_THREAD_NEXT: "Prossimo messaggio nella conversazione" LABEL_THREAD_PREV: "Messaggio precedente nella conversazione" LABEL_PRINT: "Stampa" LABEL_EXIT_FULLSCREEN: "Esci dalla modalitĂ  a schermo intero" LABEL_CLOSE_MESSAGE: "Chiudi messaggio (senza anteprima messaggi)" LABEL_SWITCH_TO_LIST: "Sposta la selezione sulla lista messaggi" LABEL_OPEN_COMPOSE_POPUP: "Apri finestra di scrittura" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Apri il menu di selezione delle identitĂ " LABEL_SAVE_MESSAGE: "Salva messaggio" LABEL_SEND_MESSAGE: "Invia messaggio" LABEL_CLOSE_COMPOSE: "Chiudi finestra di scrittura" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Nessuna chiave pubblica trovata" NO_PUBLIC_KEYS_FOUND_FOR: "Nessuna chiave pubblica trovata per l'indirizzo email \"%EMAIL%\"\n" NO_PRIVATE_KEY_FOUND: "Nessuna chiave privata trovata" NO_PRIVATE_KEY_FOUND_FOR: "Nessuna chiave privata trovata per l'indirizzo email \"%EMAIL%\"\n" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "Seleziona una chiave privata" UNVERIFIRED_SIGNATURE: "Firma non verificata" DECRYPTION_ERROR: "Decriptazione con OpenPGP fallita" GOOD_SIGNATURE: "Firma valida da %USER%" PGP_ERROR: "Errore di OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "Specificare il mittente" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Specificare almeno un destinatario" NOTIFICATIONS: INVALID_TOKEN: "Token invalido" AUTH_ERROR: "Autenticazione fallita" ACCESS_ERROR: "Errore di accesso" CONNECTION_ERROR: "Impossibile connettersi al server" CAPTCHA_ERROR: "CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando le credenziali delle email e abilita questa funzionalitĂ  nelle impostazioni. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando le credenziali delle email e abilita questa funzionalitĂ  nelle impostazioni. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Questo ID sociale non è collegato ad alcun indirizzo email. Entra utilizzando le credenziali delle email e abilita questa funzionalitĂ  nelle impostazioni. DOMAIN_NOT_ALLOWED: "Il dominio non è autorizzato" ACCOUNT_NOT_ALLOWED: "L'account non è autorizzato" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "La verifica a due fattori è richiesta" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "La verifica a due fattori è fallita" COULD_NOT_SAVE_NEW_PASSWORD: "Impossibile salvare la nuova password" CURRENT_PASSWORD_INCORRECT: "La password attuale è scorretta" NEW_PASSWORD_SHORT: "La password è troppo corta" NEW_PASSWORD_WEAK: "La password è troppo facile" NEW_PASSWORD_FORBIDDENT: "La password contiene caratteri non consentiti" CONTACTS_SYNC_ERROR: "Errore durante la sincronizzazione dei contatti" CANT_GET_MESSAGE_LIST: "Impossibile ottenere la lista dei messaggi" CANT_GET_MESSAGE: "Impossibile caricare il messaggio" CANT_DELETE_MESSAGE: "Impossibile eliminare il messaggio" CANT_MOVE_MESSAGE: "Impossibile spostare il messaggio" CANT_SAVE_MESSAGE: "Impossibile salvare il messaggio" CANT_SEND_MESSAGE: "Impossibile inviare il messaggio" INVALID_RECIPIENTS: "Destinatario non valido" CANT_SAVE_FILTERS: "Impossibile salvare i filtri" CANT_GET_FILTERS: "Impossibile caricare i filtri" FILTERS_ARE_NOT_CORRECT: "I filtri non sono corretti" CANT_CREATE_FOLDER: "Impossibile creare la cartella" CANT_RENAME_FOLDER: "Impossibile rinominare la cartella" CANT_DELETE_FOLDER: "Impossibile eliminare la cartella" CANT_DELETE_NON_EMPTY_FOLDER: "Impossibile eliminare una cartella non vuota" CANT_SUBSCRIBE_FOLDER: "Impossibile sottoscrivere la cartella" CANT_UNSUBSCRIBE_FOLDER: "Impossibile rimuovere la sottoscrizione alla cartella" CANT_SAVE_SETTINGS: "Impossibile salvare le impostazioni" CANT_SAVE_PLUGIN_SETTINGS: "Impossibile salvare le impostazioni delle estensioni" DOMAIN_ALREADY_EXISTS: "Il dominio esiste giĂ " CANT_INSTALL_PACKAGE: "Impossibile installare il pacchetto" CANT_DELETE_PACKAGE: "Impossibile rimuovere il pacchetto" INVALID_PLUGIN_PACKAGE: "Estensione non valida" UNSUPPORTED_PLUGIN_PACKAGE: "Estensione non supportata" LICENSING_SERVER_IS_UNAVAILABLE: "Il server delle licenze non è raggiungibile" LICENSING_DOMAIN_EXPIRED: "La licenza per questo dominio è scaduta" LICENSING_DOMAIN_BANNED: "Questo dominio è stato bannato" DEMO_SEND_MESSAGE_ERROR: "Per ragioni di sicurezza, questa demo non è abilitata ad inviare email ad inidirizzi esterni" DEMO_ACCOUNT_ERROR: "Per ragioni di sicurezza, questo account non è autorizzato ad effettuare questa operazione!" ACCOUNT_ALREADY_EXISTS: "L'account esiste giĂ " ACCOUNT_DOES_NOT_EXIST: "L'account non esiste" MAIL_SERVER_ERROR: "Si è verificato un errore nel server mail" INVALID_INPUT_ARGUMENT: "Argomento non valido" UNKNOWN_ERROR: "Errore sconosciuto" STATIC: BACK_LINK: "Ricarica" DOMAIN_LIST_DESC: "Lista dei domini abilitati ad accedere" PHP_EXSTENSIONS_ERROR_DESC: "Ă richiesta un'estensione di PHP non installata!" PHP_VERSION_ERROR_DESC: "La tua versione di PHP (%VERSION%) è meno recente della 5.3.0!" NO_SCRIPT_TITLE: "Ă richiesto JavaScript per questa applicazione." NO_SCRIPT_DESC: | Il supporto a JavaScript è disabilitato. Abilitare il supporto a JavaScript e riprovare. NO_COOKIE_TITLE: "Sono richiesti i Cookie per questa applicazione." NO_COOKIE_DESC: | Il supporto ai Cookie è disabilitato. Abilitare il supporto ai Cookie e riprovare. BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" BAD_BROWSER_DESC: | Per usare tutte le funzionalitĂ  dell'applicazione, scarica ed installa uno dei seguenti browser: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/ja_JP.yml000066400000000000000000001072701361462701300261710ustar00rootroot00000000000000ja_JP: LOGIN: LABEL_EMAIL: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą" LABEL_LOGIN: "ă­ă‚°ă‚¤ăł" LABEL_PASSWORD: "ă‘スăŻăĽă‰" LABEL_SIGN_ME: "サイăłă‚¤ăłçŠ¶ć…‹ă‚’äżťćŚă™ă‚‹" LABEL_VERIFICATION_CODE: "確認コăĽă‰" LABEL_DONT_ASK_VERIFICATION_CODE: "2週間ă€ă‚łăĽă‰ă‚’確認ă—ăŞă„" BUTTON_SIGN_IN: "サイăłă‚¤ăł" TITLE_SIGN_IN_GOOGLE: "Googleアカウăłăă§ă­ă‚°ă‚¤ăł" TITLE_SIGN_IN_FACEBOOK: "Facebookアカウăłăă§ă­ă‚°ă‚¤ăł" TITLE_SIGN_IN_TWITTER: "Twitterアカウăłăă§ă­ă‚°ă‚¤ăł" LABEL_FORGOT_PASSWORD: "ă‘スăŻăĽă‰ă‚’ĺżă‚Śăź" LABEL_REGISTRATION: "ĺťĺ›žç™»éڞ" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "アカウăłăを追加" BUTTON_SETTINGS: "設定" BUTTON_HELP: "ăă«ă—" BUTTON_LOGOUT: "ă­ă‚°ă‚˘ă‚¦ă" MOBILE: BUTTON_MOBILE_VERSION: "ă˘ăイă«ç‰" BUTTON_DESKTOP_VERSION: "ă‡ă‚ąă‚Żăăă—ç‰" SEARCH: MAIN_INPUT_PLACEHOLDER: "検索" TITLE_ADV: "é«ĺş¦ăŞć¤śç´˘" LABEL_ADV_FROM: "差出人" LABEL_ADV_TO: "ĺ®›ĺ…" LABEL_ADV_SUBJECT: "ä»¶ĺŤ" LABEL_ADV_TEXT: "ă‚­ăĽăŻăĽă‰" LABEL_ADV_HAS_ATTACHMENT: "ć·»ä»ă•ァイă«ă‚り" LABEL_ADV_HAS_ATTACHMENTS: "ć·»ä»ă•ァイă«ă‚り" LABEL_ADV_FLAGGED: "スタăĽä»ăŤ" LABEL_ADV_UNSEEN: "未読ăˇăĽă«" LABEL_ADV_DATE: "ć—Ąä»" LABEL_ADV_DATE_ALL: "ĺ…¨ă¦" LABEL_ADV_DATE_3_DAYS: "3日前ăľă§" LABEL_ADV_DATE_7_DAYS: "1週間前ăľă§" LABEL_ADV_DATE_MONTH: "1ă¶ćśĺ‰Ťăľă§" LABEL_ADV_DATE_3_MONTHS: "3ă¶ćśĺ‰Ťăľă§" LABEL_ADV_DATE_6_MONTHS: "6ă¶ćśĺ‰Ťăľă§" LABEL_ADV_DATE_YEAR: "1年前ăľă§" BUTTON_ADV_SEARCH: "検索" PREVIEW_POPUP: FULLSCREEN: "ă•ă«ă‚ąă‚ŻăŞăĽăł" ZOOM: "拡大/縮小" CLOSE: "é–‰ăă‚‹ (Esc)" LOADING: "読ăżčľĽăżä¸­..." GALLERY_PREV: "前 (â†)" GALLERY_NEXT: "次 (→)" GALLERY_COUNTER: "%curr% / %total%" IMAGE_ERROR: "ç”»ĺŹ ăŚčŞ­ăżčľĽă‚ăľă›ă‚“ă§ă—ăź" AJAX_ERROR: "コăłă†ăłă„ ăŚčŞ­ăżčľĽă‚ăľă›ă‚“ă§ă—ăź" FOLDER_LIST: BUTTON_COMPOSE: "作ć" BUTTON_CONTACTS: "連絡ĺ…" BUTTON_NEW_MESSAGE: "新規作ć" INBOX_NAME: "受信ăă¬ă‚¤" SENT_NAME: "é€äżˇć¸ăż" DRAFTS_NAME: "下書ăŤ" SPAM_NAME: "čż·ć‘ăˇăĽă«" TRASH_NAME: "ă”ăżç®±" ARCHIVE_NAME: "アăĽă‚«ă‚¤ă–" QUOTA: TITLE: "クォăĽă‚żä˝żç”¨é‡Ź" MESSAGE_LIST: BUTTON_RELOAD: "ăŞă‚ąăć›´ć–°" BUTTON_MOVE_TO: "移動" BUTTON_DELETE: "削除" BUTTON_ARCHIVE: "アăĽă‚«ă‚¤ă–" BUTTON_SPAM: "čż·ć‘ăˇăĽă«ă«ă™ă‚‹" BUTTON_NOT_SPAM: "čż·ć‘ăˇăĽă«ă‚’解除" BUTTON_EMPTY_FOLDER: "ă•ă‚©ă«ă€ă‚’空ă«ă™ă‚‹" BUTTON_MULTY_FORWARD: "č»˘é€ (ĺ…ă®ăˇăă‚»ăĽă‚¸ă‚’ć·»ä»)" BUTTON_DELETE_WITHOUT_MOVE: "完全ă«ĺ‰Šé™¤" BUTTON_MORE: "ăťă®ä»–" MENU_SET_SEEN: "既読ă«ă™ă‚‹" MENU_SET_ALL_SEEN: "ă™ăąă¦ć—˘čŞ­ă«ă™ă‚‹" MENU_UNSET_SEEN: "未読ă«ă™ă‚‹" MENU_SET_FLAG: "スタăĽă‚’ă¤ă‘ă‚‹" MENU_UNSET_FLAG: "スタăĽă‚’ăŻăšă™" MENU_SELECT_ALL: "ĺ…¨ă¦" MENU_SELECT_NONE: "é¸ćŠžč§Łé™¤" MENU_SELECT_INVERT: "反転" MENU_SELECT_UNSEEN: "未読" MENU_SELECT_SEEN: "既読" MENU_SELECT_FLAGGED: "ă•ă©ă‚°ä»ăŤ" MENU_SELECT_UNFLAGGED: "ă•ă©ă‚°ăŞă—" EMPTY_LIST: "ăˇăă‚»ăĽă‚¸ăŻă‚りăľă›ă‚“" EMPTY_SEARCH_LIST: "検索条件ă«ä¸€č‡´ă™ă‚‹ăˇăĽă«ăŻč¦‹ă¤ă‹ă‚Šăľă›ă‚“ă§ă—ăźă€‚é«ĺş¦ăŞć¤śç´˘ă‚’試ă—ă¦ăżă¦ăŹă ă•ă„。" SEARCH_RESULT_FOR: "\"%SEARCH%\"ă®ć¤śç´˘çµćžś" BACK_TO_MESSAGE_LIST: "ăˇăă‚»ăĽă‚¸ä¸€č¦§ă«ć»ă‚‹" LIST_LOADING: "読ăżčľĽăżä¸­" EMPTY_SUBJECT_TEXT: "(ä»¶ĺŤăŞă—)" PUT_MESSAGE_HERE: "ă“ă“ă«ăˇăă‚»ăĽă‚¸ă‚’ă‰ă­ăă—" TODAY_AT: "今日 %TIME%" YESTERDAY_AT: "ć¨ć—Ą %TIME%" SEARCH_PLACEHOLDER: "検索" NEW_MESSAGE_NOTIFICATION: "%COUNT% ă®ć–°ă—ă„ăˇăă‚»ăĽă‚¸!" QUOTA_SIZE: "%SIZE% (%PROC%%) / %LIMIT%を使用中" MESSAGE: BUTTON_EDIT: "編集" BUTTON_BACK: "ć»ă‚‹" BUTTON_CLOSE: "é–‰ăă‚‹" BUTTON_DELETE: "削除" BUTTON_UNSUBSCRIBE: "ă“ă®ăŞă‚ąăă‹ă‚‰ç™»éŚ˛č§Łé™¤" BUTTON_ARCHIVE: "アăĽă‚«ă‚¤ă–" BUTTON_SPAM: "čż·ć‘ăˇăĽă«" BUTTON_NOT_SPAM: "非スă‘ă " BUTTON_MOVE_TO: "移動" BUTTON_MORE: "ăťă®ä»–" BUTTON_REPLY: "返信" BUTTON_REPLY_ALL: "全員ă«čż”信" BUTTON_FORWARD: "転é€" BUTTON_FORWARD_AS_ATTACHMENT: "ć·»ä»ă•ァイă«ă¨ă—ă¦č»˘é€" BUTTON_EDIT_AS_NEW: "ć–°ă—ă„ăˇăĽă«ă¨ă—ă¦ç·¨é›†" BUTTON_SHOW_IMAGES: "外é¨ç”»ĺŹă‚’表示ă™ă‚‹" BUTTON_NOTIFY_READ_RECEIPT: "差出人ăŚăˇăĽă«ă®é–‹ĺ°ç˘şčŞŤăˇăă‚»ăĽă‚¸ă‚’求ă‚ă¦ă„ăľă™ă€‚" BUTTON_IN_NEW_WINDOW: "ć–°ă—ă„ウイăłă‰ă‚¦ă§é–‹ăŹ" BUTTON_THREAD_LIST: "スă¬ăă‰ä¸€č¦§" BUTTON_THREAD_PREV: "前ă¸" BUTTON_THREAD_NEXT: "次ă¸" BUTTON_THREAD_MORE: "ă•らă«čŞ­ăżčľĽă‚€" MENU_HEADERS: "ăˇăĽă«ă®ăăă€ăĽă‚’表示" MENU_VIEW_ORIGINAL: "ăˇăĽă«ă®ă‚˝ăĽă‚ąă‚’表示" MENU_DOWNLOAD_ORIGINAL: ".emlă•ァイă«ă§ă€ă‚¦ăłă­ăĽă‰" MENU_FILTER_SIMILAR: "ă“ă®ă‚ă†ăŞăˇăă‚»ăĽă‚¸ă‚’ă•ィă«ă‚ż" MENU_PRINT: "印ĺ·" EMPTY_SUBJECT_TEXT: "(ä»¶ĺŤăŞă—)" LABEL_SUBJECT: "ä»¶ĺŤ" LABEL_DATE: "ć—Ąä»" LABEL_FROM: "差出人" LABEL_FROM_SHORT: "差出人" LABEL_TO: "ĺ®›ĺ…" LABEL_TO_SHORT: "ĺ®›ĺ…" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "差出人" PRINT_LABEL_TO: "ĺ®›ĺ…" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "ć—Ąä»" PRINT_LABEL_SUBJECT: "ä»¶ĺŤ" PRINT_LABEL_ATTACHMENTS: "ć·»ä»ă•ァイă«" MESSAGE_LOADING: "読ăżčľĽăżä¸­" MESSAGE_VIEW_DESC: "é¸ćŠžă—ăźăˇăĽă«ăŚă“ă“ă«čˇ¨ç¤şă•れăľă™ă€‚" MESSAGE_VIEW_MOVE_DESC: "ĺ·¦ĺ´ă®ă‘ăŤă«ă§ă•ă‚©ă«ă€ĺŤă‚’クăŞăクă—ă¦ç§»ĺ‹•ĺ…ă‚’é¸ćŠžă—ăľă™ă€‚" PGP_PASSWORD_INPUT_PLACEHOLDER: "ă‘スăŻăĽă‰" PGP_SIGNED_MESSAGE_DESC: "OpenPGP 署ĺŤć¸ăżăˇăă‚»ăĽă‚¸ (クăŞăクă—ă¦ć¤śč¨Ľ)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP 暗号化ăˇăă‚»ăĽă‚¸ (クăŞăクă—ă¦ĺľ©ĺŹ·ĺŚ–)" LINK_DOWNLOAD_AS_ZIP: "Zip ă¨ă—ă¦ă€ă‚¦ăłă­ăĽă‰" LINK_SAVE_TO_OWNCLOUD: "ownCloud ă¸äżťĺ­" LINK_SAVE_TO_CLOUD: "クă©ă‚¦ă‰ă«äżťĺ­ă™ă‚‹" LINK_SAVE_TO_DROPBOX: "Dropbox ă¸äżťĺ­" READ_RECEIPT: SUBJECT: "é–‹ĺ°ç˘şčŞŤăˇăă‚»ăĽă‚¸ - %SUBJECT%" BODY: | ă“れ㯠%READ-RECEIPT% ă«é€äżˇă•れăźăˇăĽă«ă®é–‹ĺ°ç˘şčŞŤă§ă™ă€‚ 注: 「ă“ă®é–‹ĺ°ç˘şčŞŤăŻă€ăˇăă‚»ăĽă‚¸ăŚĺŹ—äżˇč€…ă®ă‚łăłă”ăĄăĽă‚żä¸Šă«čˇ¨ç¤şă•れăźă“ă¨ă ă‘を意味ă—ă¦ă„ăľă™ă€‚ 」 受信者ăŚčŞ­ă‚“ă ă‚Šă€ăˇăă‚»ăĽă‚¸ă®ĺ†…容をç†č§Łă—ă¦ă„ă‚‹ă¨ă„ă†äżťč¨ĽăŻă‚りăľă›ă‚“。 SUGGESTIONS: SEARCHING_DESC: "検索中..." CONTACTS: LEGEND_CONTACTS: "連絡ĺ…" SEARCH_INPUT_PLACEHOLDER: "検索" BUTTON_ADD_CONTACT: "連絡ĺ…を追加" BUTTON_CREATE_CONTACT: "作ć" BUTTON_UPDATE_CONTACT: "ć›´ć–°" BUTTON_IMPORT: "イăłăťăĽă (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "エクスăťăĽă (vcf, vCard)" BUTTON_EXPORT_CSV: "エクスăťăĽă (csv)" ERROR_IMPORT_FILE: "イăłăťăĽăエă©ăĽ (ă•ァイă«ă•ă‚©ăĽăžăăăŚä¸Ťć­Łă§ă™)" LIST_LOADING: "読ăżčľĽăżä¸­" EMPTY_LIST: "連絡ĺ…ăŚă‚りăľă›ă‚“" EMPTY_SEARCH: "連絡ĺ…ăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“" CLEAR_SEARCH: "検索をクăŞă‚˘" CONTACT_VIEW_DESC: "é¸ćŠžă—ăźé€Łçµˇĺ…ăŚă“ă“ă«čˇ¨ç¤şă•れăľă™ă€‚" LABEL_DISPLAY_NAME: "表示ĺŤ" LABEL_EMAIL: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą" LABEL_PHONE: "電話番号" LABEL_WEB: "Web" LABEL_BIRTHDAY: "誕生日" LINK_ADD_EMAIL: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ąă‚’追加" LINK_ADD_PHONE: "電話番号を追加" LINK_BIRTHDAY: "誕生日を追加" PLACEHOLDER_ENTER_DISPLAY_NAME: "表示ĺŤă‚’入力ă—ă¦ăŹă ă•ă„" PLACEHOLDER_ENTER_LAST_NAME: "姓を入力ă—ă¦ăŹă ă•ă„" PLACEHOLDER_ENTER_FIRST_NAME: "ĺŤă‚’入力ă—ă¦ăŹă ă•ă„" PLACEHOLDER_ENTER_NICK_NAME: "ă‹ăクăŤăĽă ă‚’入力ă—ă¦ăŹă ă•ă„" LABEL_READ_ONLY: "読ăżĺŹ–ă‚Šĺ°‚ç”¨" LABEL_SHARE: "共有" ADD_MENU_LABEL: "追加" ADD_MENU_NICKNAME: "ă‹ăクăŤăĽă " ADD_MENU_NOTES: "注é‡" ADD_MENU_EMAIL: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą" ADD_MENU_PHONE: "電話番号" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "住所" ADD_MENU_BIRTHDAY: "誕生日" ADD_MENU_TAGS: "タグ" BUTTON_SHARE_NONE: "ăŞă—" BUTTON_SHARE_ALL: "ă™ăąă¦" BUTTON_SYNC: "ĺŚćśź (CardDAV)" COMPOSE: TITLE_FROM: "差出人" TITLE_TO: "ĺ®›ĺ…" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "返信ĺ…" TITLE_SUBJECT: "ä»¶ĺŤ" LINK_SHOW_INPUTS: "ă™ăąă¦čˇ¨ç¤ş" BUTTON_SEND: "é€äżˇ" BUTTON_SAVE: "äżťĺ­" BUTTON_DELETE: "削除" BUTTON_CANCEL: "ă‚­ăŁăłă‚»ă«" BUTTON_MINIMIZE: "最小化" SAVED_TIME: "%TIME% ă«äżťĺ­ă—ăľă—ăź" SAVED_ERROR_ON_SEND: "ăˇăĽă«ăŻé€äżˇă§ăŤăľă—ăźăŚă€é€äżˇć¸ăżă«äżťĺ­ă§ăŤăľă›ă‚“ă§ă—ăź" DISCARD_UNSAVED_DATA: "äżťĺ­ă—ă¦ă„ăŞă„ă‡ăĽă‚żă‚’破棄ă—ăľă™ă‹?" ATTACH_FILES: "ă•ァイă«ă‚’ć·»ä»" ATTACH_DROP_FILES_DESC: "ă“ă“ă«ă•ァイă«ă‚’ă‰ă­ăă—" ATTACH_ITEM_CANCEL: "ă‚­ăŁăłă‚»ă«" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM: "From" FORWARD_MESSAGE_TOP_TO: "To" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "é€äżˇć¸ăż" FORWARD_MESSAGE_TOP_SUBJECT: "ä»¶ĺŤ" EMPTY_TO_ERROR_DESC: "ĺ°‘ăŞăŹă¨ă‚‚一ă¤ă®ĺŹ—äżˇč€…ă‚’ćŚ‡ĺ®šă—ă¦ăŹă ă•ă„" NO_ATTACHMENTS_HERE_DESC: "ć·»ä»ă•ァイă«ăŚă‚りăľă›ă‚“" ATTACHMENTS_ERROR_DESC: "警告ďĽă™ăąă¦ă®ć·»ä»ă•ァイă«ăŚă‚˘ăă—ă­ăĽă‰ă•れă¦ă„るわă‘ă§ăŻă‚りăľă›ă‚“。" ATTACHMENTS_UPLOAD_ERROR_DESC: "ă™ăąă¦ă®ć·»ä»ă•ァイă«ăŚă‚˘ăă—ă­ăĽă‰ă•れă¦ă„るわă‘ă§ăŻă‚りăľă›ă‚“。" BUTTON_REQUEST_READ_RECEIPT: "é–‹ĺ°ç˘şčŞŤă‚’č¦ć±‚ă™ă‚‹" BUTTON_MARK_AS_IMPORTANT: "重č¦ă•ă©ă‚°ă‚’ă¤ă‘ă‚‹" BUTTON_OPEN_PGP: "OpenPGP (ă—ă¬ăĽăłă†ă‚­ă‚ąăă®ăż)" BUTTON_REQUEST_DSN: "配信確認をč¦ć±‚ă™ă‚‹" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "é–‰ăă‚‹" POPUPS_ASK: BUTTON_YES: "ăŻă„" BUTTON_NO: "ă„ă„ă" DESC_WANT_CLOSE_THIS_WINDOW: "ă“ă®ă‚¦ă‚¤ăłă‰ă‚¦ă‚’é–‰ăă¦ă„ă„ă§ă™ă‹ďĽź" DESC_WANT_DELETE_MESSAGES: "ăˇăă‚»ăĽă‚¸ă‚’削除ă—ă¦ă„ă„ă§ă™ă‹ďĽź" POPUPS_LANGUAGES: TITLE_LANGUAGES: "言語をé¸ćŠž" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "アカウăłăを追加ă—ăľă™ă‹?" BUTTON_ADD_ACCOUNT: "追加" TITLE_UPDATE_ACCOUNT: "アカウăłăć›´ć–°ă—ăľă™ă‹ďĽź" BUTTON_UPDATE_ACCOUNT: "ć›´ć–°" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "ăˇăĽă«ă®čˇ¨ç¤şĺŤă‚’追加ă—ăľă™ă‹ďĽź" TITLE_UPDATE_IDENTITY: "ăˇăĽă«ă®čˇ¨ç¤şĺŤă‚’ć›´ć–°ă—ăľă™ă‹ďĽź" BUTTON_ADD_IDENTITY: "追加" BUTTON_UPDATE_IDENTITY: "ć›´ć–°" LABEL_EMAIL: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą" LABEL_NAME: "表示ĺŤ" LABEL_REPLY_TO: "返信ĺ…" LABEL_SIGNATURE: "署ĺŤ" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "返信ă®ĺĽ•用ă†ă‚­ă‚ąăă®ĺ‰Ťă«ç˝˛ĺŤă‚’挿入ă™ă‚‹" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "ă•ă‚©ă«ă€ă‚’作ćă—ăľă™ă‹ďĽź" LABEL_NAME: "ă•ă‚©ă«ă€ĺŤ" LABEL_PARENT: "親ă•ă‚©ă«ă€" BUTTON_CREATE: "作ć" BUTTON_CANCEL: "ă‚­ăŁăłă‚»ă«" BUTTON_CLOSE: "é–‰ăă‚‹" TITLE_CREATING_PROCESS: "ă•ă‚©ă«ă€ă‚’作ć中" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "ă•ă‚©ă«ă€ĺ†…ă®ă™ăąă¦ă®ăˇăĽă«ă‚’ć¶ĺŽ»ă—ăľă™ă‹ďĽź" BUTTON_CLEAR: "ć¶ĺŽ»" BUTTON_CANCEL: "ă‚­ăŁăłă‚»ă«" BUTTON_CLOSE: "é–‰ăă‚‹" DANGER_DESC_WARNING: "警告ďĽ" DANGER_DESC_HTML_1: "ă“ă®ć“Ťä˝śă‚’ă™ă‚‹ă¨ă€%FOLDER%ă•ă‚©ă«ă€ă‹ă‚‰ă™ăąă¦ă®ăˇăĽă«ă‚’完全ă«ć¶ĺŽ»ă—ă¦ă—ăľă„ăľă™ă€‚" DANGER_DESC_HTML_2: "一度始ă‚ă‚‹ă¨ă€ä¸­ć­˘ă‚„ă‚­ăŁăłă‚»ă«ăŚă§ăŤăľă›ă‚“。" TITLE_CLEARING_PROCESS: "ă•ă‚©ă«ă€ă‚’ć¶ĺŽ»ă—ă¦ă„ăľă™..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP ă‚­ăĽă‚’イăłăťăĽă" BUTTON_IMPORT_OPEN_PGP_KEY: "イăłăťăĽă" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP ă‚­ăĽă‚’表示" BUTTON_SELECT: "é¸ćŠž" BUTTON_CLOSE: "é–‰ăă‚‹" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP ă‚­ăĽă‚’生ć" LABEL_EMAIL: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą" LABEL_NAME: "ĺŤĺ‰Ť" LABEL_PASSWORD: "ă‘スăŻăĽă‰" LABEL_KEY_BIT_LENGTH: "ă‚­ăĽă®é•·ă•" BUTTON_GENERATE_OPEN_PGP_KEYS: "生ć" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP 署ĺŤ/暗号化" LABEL_SIGN: "署ĺŤ" LABEL_ENCRYPT: "暗号化" LABEL_PASSWORD: "ă‘スăŻăĽă‰" BUTTON_SIGN: "署ĺŤ" BUTTON_ENCRYPT: "暗号化" BUTTON_SIGN_AND_ENCRYPT: "署ĺŤă¨ćš—号化" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP 復号化" LABEL_KEY: "ç§ĺŻ†éŤµ" LABEL_PASSWORD: "ă‘スăŻăĽă‰" BUTTON_DECRYPT: "復号化" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2段階認証ă†ă‚ąă" LABEL_CODE: "コăĽă‰" BUTTON_TEST: "ă†ă‚ąă" POPUPS_FILTER: TITLE_CREATE_FILTER: "ă•ィă«ă‚żăĽă‚’作ćă—ăľă™ă‹?" TITLE_EDIT_FILTER: "ă•ィă«ă‚żăĽă‚’ć›´ć–°ă—ăľă™ă‹?" FILTER_NAME: "ĺŤĺ‰Ť" LEGEND_CONDITIONS: "条件" LEGEND_ACTIONS: "アクシă§ăł" BUTTON_DONE: "完了" BUTTON_ADD_CONDITION: "条件ă®čż˝ĺŠ " SELECT_ACTION_NONE: "ăŞă—" SELECT_ACTION_MOVE_TO: "移動" SELECT_ACTION_FORWARD_TO: "転é€" SELECT_ACTION_REJECT: "ć‹’ĺ¦" SELECT_ACTION_VACATION_MESSAGE: "ăケăĽă‚·ă§ăłăˇăă‚»ăĽă‚¸" SELECT_ACTION_DISCARD: "破棄" SELECT_FIELD_FROM: "é€äżˇč€… (From)" SELECT_FIELD_RECIPIENTS: "受信者 (To or CC)" SELECT_FIELD_SUBJECT: "ä»¶ĺŤ" SELECT_FIELD_HEADER: "ăăă€ăĽ" SELECT_FIELD_SIZE: "サイズ" SELECT_TYPE_CONTAINS: "ĺ«ă‚€" SELECT_TYPE_NOT_CONTAINS: "ĺ«ăľăŞă„" SELECT_TYPE_MATCHES: "ăžăăă™ă‚‹ (* 㨠? ăŚä˝żç”¨ĺŹŻ)" SELECT_TYPE_NOT_MATCHES: "ăžăăă—ăŞă„ (* 㨠? ăŚä˝żç”¨ĺŹŻ)" SELECT_TYPE_REGEXP: "正規表現" SELECT_TYPE_NOT_REGEXP: "正規表現を使わăŞă„" SELECT_TYPE_EQUAL_TO: "一致" SELECT_TYPE_NOT_EQUAL_TO: "一致ă—ăŞă„" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "以下ă®ă«ăĽă«ă®ă„ăšă‚Śă‹ă«ăžăă" SELECT_MATCH_ALL: "以下ă®ă«ăĽă«ă®ă™ăąă¦ă«ăžăă" MARK_AS_READ_LABEL: "既読ă«ă™ă‚‹" REPLY_INTERVAL_LABEL: "返信間隔 (ć—Ą)" KEEP_LABEL: "äżťćŚ" STOP_LABEL: "ă«ăĽă«ă®ĺ‡¦ç†ă‚’ć­˘ă‚ăŞă„" EMAIL_LABEL: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą" VACATION_SUBJECT_LABEL: "ä»¶ĺŤ (オă—ă‚·ă§ăł)" VACATION_MESSAGE_LABEL: "ăˇăă‚»ăĽă‚¸" VACATION_RECIPIENTS_LABEL: "受信者 (ă‚«ăłăžĺŚşĺ‡ă‚Š)" REJECT_MESSAGE_LABEL: "ć‹’ĺ¦ăˇăă‚»ăĽă‚¸" ALL_INCOMING_MESSAGES_DESC: "ă™ăąă¦ă®ĺŹ—äżˇăˇăă‚»ăĽă‚¸" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "シスă†ă ă•ă‚©ă«ă€ăĽă‚’é¸ćŠž" SELECT_CHOOSE_ONE: "1ă¤é¸ćŠž" SELECT_UNUSE_NAME: "使用ă—ăŞă„" LABEL_SENT: "é€äżˇć¸ăż" LABEL_DRAFTS: "下書ăŤ" LABEL_SPAM: "čż·ć‘ăˇăĽă«" LABEL_TRASH: "ă‚´ăźç®±" LABEL_ARCHIVE: "アăĽă‚«ă‚¤ă–" BUTTON_CANCEL: "ă‚­ăŁăłă‚»ă«" BUTTON_CLOSE: "é–‰ăă‚‹" NOTIFICATION_SENT: | é€äżˇć¸ăżăˇăă‚»ăĽă‚¸ă‚’ç˝®ăŹăźă‚㮠”Sent” シスă†ă ă•ă‚©ă«ă€ăŚé¸ćŠžă•れă¦ă„ăľă›ă‚“。 é€äżˇć¸ăżăˇăă‚»ăĽă‚¸ă‚’äżťĺ­ă™ă‚‹ĺż…č¦ăŚăŞă„ă®ăŞă‚‰ă€"使用ă—ăŞă„"オă—ă‚·ă§ăłă‚’é¸ćŠžă—ă¦ăŹă ă•ă„。 NOTIFICATION_DRAFTS: "下書ăŤăˇăă‚»ăĽă‚¸ă‚’ç˝®ăŹăźă‚㮠”Sent” シスă†ă ă•ă‚©ă«ă€ăŚé¸ćŠžă•れă¦ă„ăľă›ă‚“。" NOTIFICATION_SPAM: | čż·ć‘ăˇăĽă«ă‚’ç˝®ăŹăźă‚㮠”Spam” シスă†ă ă•ă‚©ă«ă€ăŚé¸ćŠžă•れă¦ă„ăľă›ă‚“。 čż·ć‘ăˇăĽă«ăŚĺ®Śĺ…¨ă«ĺ‰Šé™¤ă•れるă®ă‚’望むă®ăŞă‚‰ă€"使用ă—ăŞă„"オă—ă‚·ă§ăłă‚’é¸ćŠžă—ă¦ăŹă ă•ă„。 NOTIFICATION_TRASH: | 削除ă•れăźăˇăă‚»ăĽă‚¸ă‚’ç˝®ăŹăźă‚㮠”Trash” シスă†ă ă•ă‚©ă«ă€ăŚé¸ćŠžă•れă¦ă„ăľă›ă‚“。 削除ă•れăźăˇăă‚»ăĽă‚¸ăŚĺ®Śĺ…¨ă«ĺ‰Šé™¤ă•れるă®ă‚’望むă®ăŞă‚‰ă€"使用ă—ăŞă„"オă—ă‚·ă§ăłă‚’é¸ćŠžă—ă¦ăŹă ă•ă„。 NOTIFICATION_ARCHIVE: "アăĽă‚«ă‚¤ă–ă•れăźăˇăă‚»ăĽă‚¸ă‚’ç˝®ăŹăźă‚㮠”Archive” シスă†ă ă•ă‚©ă«ă€ăŚé¸ćŠžă•れă¦ă„ăľă›ă‚“。" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2段階認証 (TOTP)" LABEL_ENABLE_TWO_FACTOR: "2段階認証を有効ă«ă™ă‚‹" LABEL_TWO_FACTOR_USER: "ă¦ăĽă‚¶ăĽ" LABEL_TWO_FACTOR_STATUS: "スă†ăĽă‚żă‚ą" LABEL_TWO_FACTOR_SECRET: "ă‚·ăĽă‚Żă¬ăă" LABEL_TWO_FACTOR_BACKUP_CODES: "ăăクアăă—コăĽă‰" BUTTON_CREATE: "ć–°ă—ă„ă‚·ăĽă‚Żă¬ăăを作ć" BUTTON_ACTIVATE: "アクă†ă‚Łă™ăĽă" BUTTON_CLEAR: "クăŞă‚˘" BUTTON_LOGOUT: "ă­ă‚°ă‚˘ă‚¦ă" BUTTON_DONE: "完了" BUTTON_TEST: "ă†ă‚ąă" LINK_TEST: "ă†ă‚ąă" BUTTON_SHOW_SECRET: "ă‚·ăĽă‚Żă¬ăăを表示" BUTTON_HIDE_SECRET: "ă‚·ăĽă‚Żă¬ăăを非表示" TWO_FACTOR_REQUIRE_DESC: "ă‚ăŞăźă®ă‚˘ă‚«ă‚¦ăłăăŻă€2段階認証ă®č¨­ĺ®šă‚’ĺż…č¦ă¨ă—ă¦ă„ăľă™" TWO_FACTOR_SECRET_CONFIGURED_DESC: "設定ć¸ăż" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "未設定" TWO_FACTOR_SECRET_DESC: > ćŹäľ›ă•れ㟠QR コăĽă‰ă‚’使用ă™ă‚‹ă‹ă€ă‚‚ă—ăŹăŻă€ć‰‹ĺ‹•ă§ă‚łăĽă‰ă‚’入力ă™ă‚‹ă“ă¨ă«ă‚ăŁă¦ă€Google 認証シスă†ă (ă‚‚ă—ăŹăŻă€ä»–ă® TOTP クă©ă‚¤ă‚˘ăłă)ă¸ă‚¤ăłăťăĽăă—ăľă™ă€‚ TWO_FACTOR_BACKUP_CODES_DESC: > Google認証シスă†ă (ă‚‚ă—ăŹăŻă€ä»–ă®TOTPクă©ă‚¤ă‚˘ăłă)ă§ă‚łăĽă‰ă‚’受ă‘取るă“ă¨ăŚă§ăŤăŞă„ĺ ´ĺăŻă€ăăクアăă—コăĽă‰ă‚’使用ă—ă¦ă‚µă‚¤ăłă‚¤ăłă™ă‚‹ă“ă¨ăŚă§ăŤăľă™ă€‚ ăăクアăă—コăĽă‰ă‚’使用ă—ă¦ă‚µă‚¤ăłă‚¤ăłă™ă‚‹ă¨ă€2段階認証ăŻéťžă‚˘ă‚Żă†ă‚Łă–ă«ăŞă‚Šăľă™ă€‚ TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "ă†ă‚ąăă‚’ă—ăŞă‘れă°č¨­ĺ®šă‚’変更ă§ăŤăľă›ă‚“" TITLES: LOADING: "読ăżčľĽăżä¸­" LOGIN: "ă­ă‚°ă‚¤ăł" MAILBOX: "ăˇăĽă«ăśăクス" SETTINGS: "設定" COMPOSE: "作ć" UPLOAD: ERROR_FILE_IS_TOO_BIG: "ă•ァイă«ăŚĺ¤§ăŤă™ăŽăľă™" ERROR_FILE_PARTIALLY_UPLOADED: "ă•ァイă«ăŻă€ä¸ŤćŽăŞă‚¨ă©ăĽă®ăźă‚一é¨ă—ă‹ă‚˘ăă—ă­ăĽă‰ă•れăľă›ă‚“ă§ă—ăź" ERROR_NO_FILE_UPLOADED: "ă•ァイă«ăŻă‚˘ăă—ă­ăĽă‰ă•れă¦ă„ăľă›ă‚“" ERROR_MISSING_TEMP_FOLDER: "一時ă•ァイă«ăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“" ERROR_ON_SAVING_FILE: "不ćŽăŞă•ァイă«ă‚˘ăă—ă­ăĽă‰ă‚¨ă©ăĽăŚç™şç”źă—ăľă—ăź" ERROR_FILE_TYPE: "無効ăŞă•ァイă«ç¨®éˇž" ERROR_UNKNOWN: "不ćŽăŞă•ァイă«ă‚˘ăă—ă­ăĽă‰ă‚¨ă©ăĽăŚç™şç”źă—ăľă—ăź" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "書式ä»ăŤă†ă‚­ă‚ąă" TEXT_SWITCHER_CONFIRM: "ă†ă‚­ă‚ąă書式ă¨ç”»ĺŹăŻă€ĺ¤±ă‚Źă‚Śăľă™ă€‚ç¶šă‘ă¦ă‚‚ă‚ろă—ă„ă§ă™ă‹ďĽź" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "個人" LABEL_GENERAL_NAME: "ĺ…¨č¬" LABEL_CONTACTS_NAME: "連絡ĺ…" LABEL_FOLDERS_NAME: "ă•ă‚©ă«ă€ăĽ" LABEL_ACCOUNTS_NAME: "アカウăłă" LABEL_IDENTITY_NAME: "表示ĺŤ" LABEL_IDENTITIES_NAME: "表示ĺŤ" LABEL_FILTERS_NAME: "ă•ィă«ă‚żăĽ" LABEL_TEMPLATES_NAME: "ă†ăłă—ă¬ăĽă" LABEL_SECURITY_NAME: "セキăĄăŞă†ă‚Ł" LABEL_SOCIAL_NAME: "SNS" LABEL_THEMES_NAME: "ă†ăĽăž" LABEL_CHANGE_PASSWORD_NAME: "ă‘スăŻăĽă‰" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "ć»ă‚‹" SETTINGS_FILTERS: LEGEND_FILTERS: "ă•ィă«ă‚żăĽ" BUTTON_SAVE: "äżťĺ­" BUTTON_ADD_FILTER: "ă•ィă«ă‚żăĽă‚’追加" BUTTON_DELETE: "削除" BUTTON_RAW_SCRIPT: "カスタă ă¦ăĽă‚¶ăĽă‚ąă‚ŻăŞă—ăを使用ă™ă‚‹" SUBNAME_NONE: "ăŞă—" SUBNAME_MOVE_TO: "\"%FOLDER%\" ă¸ç§»ĺ‹•" SUBNAME_FORWARD_TO: "\"%EMAIL%\" ă¸č»˘é€" SUBNAME_REJECT: "ć‹’ĺ¦" SUBNAME_VACATION_MESSAGE: "ăケăĽă‚·ă§ăłăˇăă‚»ăĽă‚¸" SUBNAME_DISCARD: "破棄" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "ă•ィă«ă‚żăĽăŞă‚ąăă®ć›´ć–°ä¸­" DELETING_ASK: "ă‚ろă—ă„ă§ă™ă‹ďĽź" CHACHES_NEED_TO_BE_SAVED_DESC: "ă“れらă®ĺ¤‰ć›´ăŻă€ă‚µăĽăăĽă¸äżťĺ­ă™ă‚‹ĺż…č¦ăŚă‚りăľă™ă€‚" SETTINGS_IDENTITY: LEGEND_IDENTITY: "表示ĺŤ" LABEL_DISPLAY_NAME: "ĺŤĺ‰Ť" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "署ĺŤ" LABEL_ADD_SIGNATURE_TO_ALL: "ă™ăąă¦ă®é€äżˇăˇăă‚»ăĽă‚¸ă«ç˝˛ĺŤă‚’追加ă™ă‚‹" SETTINGS_SECURITY: LEGEND_SECURITY: "セキăĄăŞă†ă‚Ł" LABEL_CONFIGURE_TWO_FACTOR: "2段階認証ă®č¨­ĺ®š" LABEL_AUTOLOGOUT: "自動ă­ă‚°ă‚˘ă‚¦ă" AUTOLOGIN_NEVER_OPTION_NAME: "ă—ăŞă„" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% ĺ†" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% 時間" SETTINGS_GENERAL: LEGEND_GENERAL: "ĺ…¨č¬" LABEL_LANGUAGE: "言語" LABEL_IDENTITY: "表示ĺŤ" LABEL_LAYOUT: "ă¬ă‚¤ă‚˘ă‚¦ă" LABEL_LAYOUT_NO_SPLIT: "ĺ†ĺ‰˛ă—ăŞă„" LABEL_LAYOUT_VERTICAL_SPLIT: "縦ă«ĺ†ĺ‰˛" LABEL_LAYOUT_HORIZONTAL_SPLIT: "横ă«ĺ†ĺ‰˛" LABEL_EDITOR: "ăˇăĽă«ĺ˝˘ĺĽŹ" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "ă—ă¬ăĽăłă†ă‚­ă‚ąă" LABEL_EDITOR_HTML_FORCED: "Html (強ĺ¶)" LABEL_EDITOR_PLAIN_FORCED: "ă—ă¬ăĽăłă†ă‚­ă‚ąă (強ĺ¶)" LABEL_ANIMATION: "イăłă‚żăĽă•ă‚§ăĽă‚ą アă‹ăˇăĽă‚·ă§ăł" LABEL_ANIMATION_FULL: "ă•ă«" LABEL_ANIMATION_NORMAL: "標準" LABEL_ANIMATION_NONE: "ăŞă—" LABEL_VIEW_OPTIONS: "表示" LABEL_USE_PREVIEW_PANE: "ă—ă¬ă“ăĄăĽăšă‚¤ăłă‚’使用ă™ă‚‹" LABEL_USE_CHECKBOXES_IN_LIST: "ăŞă‚ąăă«ăă‚§ăクăśăクスを表示" LABEL_USE_THREADS: "スă¬ăă‰ă‚’使ă†" LABEL_REPLY_SAME_FOLDER: "返信ă—ăźăˇăă‚»ăĽă‚¸ă®ă•ă‚©ă«ă€ă«é€äżˇăˇăĽă«ă‚’ç˝®ăŹ" LABEL_SHOW_IMAGES: "外é¨ç”»ĺŹă‚’常ă«čˇ¨ç¤şă™ă‚‹" LABEL_SHOW_ANIMATION: "アă‹ăˇăĽă‚·ă§ăłă‚’表示" LABEL_MESSAGE_PER_PAGE: "1ăšăĽă‚¸ă«čˇ¨ç¤şă™ă‚‹ä»¶ć•°" LABEL_NOTIFICATIONS: "通知設定" LABEL_SOUND_NOTIFICATION: "サウăłă‰é€šçźĄ" LABEL_CHROME_NOTIFICATION_DESC: "ć–°ă—ă„ăˇăă‚»ăĽă‚¸ă‚’受信ă—ăźă‚‰ăťăă—アăă—ă§çźĄă‚‰ă›ă‚‹" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ă–ă©ă‚¦ă‚¶ă§ă–ă­ăクă•れă¦ă„ăľă™)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "連絡ĺ…" LABEL_CONTACTS_AUTOSAVE: "返信ă—ăźă‚˘ă‰ă¬ă‚ąă‚’アă‰ă¬ă‚ąĺ¸łă¸č‡Şĺ‹•çš„ă«čż˝ĺŠ ă™ă‚‹" LEGEND_CONTACTS_SYNC: "ăŞă˘ăĽăĺŚćśź (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "ăŞă˘ăĽăĺŚćśźă‚’有効化" LABEL_CONTACTS_SYNC_SERVER: "サăĽăăĽ" LABEL_CONTACTS_SYNC_AB_URL: "アă‰ă¬ă‚ąĺ¸ł URL" LABEL_CONTACTS_SYNC_USER: "ă¦ăĽă‚¶ăĽ" LABEL_CONTACTS_SYNC_PASSWORD: "ă‘スăŻăĽă‰" SETTINGS_THEMES: LEGEND_THEMES: "ă†ăĽăž" LEGEND_THEMES_CUSTOM: "カスタă ă†ăĽăžč¨­ĺ®š" LABEL_CUSTOM_TYPE: "種類" LABEL_CUSTOM_TYPE_LIGHT: "ă©ă‚¤ă" LABEL_CUSTOM_TYPE_DARK: "ă€ăĽă‚Ż" LABEL_CUSTOM_BACKGROUND_IMAGE: "čŚć™Ż" BUTTON_UPLOAD_BACKGROUND_IMAGE: "čŚć™Żç”»ĺŹă‚’アăă—ă­ăĽă‰ (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "ă•ァイă«ăŚĺ¤§ăŤă™ăŽăľă™" ERROR_FILE_TYPE_ERROR: "無効ăŞă•ァイă«ç¨®éˇž (JPG/PNG ă®ăż)" ERROR_UNKNOWN: "不ćŽăŞă•ァイă«ă‚˘ăă—ă­ăĽă‰ă‚¨ă©ăĽăŚç™şç”źă—ăľă—ăź" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Google ă«ćŽĄç¶š" BUTTON_GOOGLE_DISCONNECT: "Google ă‹ă‚‰ĺ‡ć–­" MAIN_GOOGLE_DESC: "Google 経由ă®ă­ă‚°ă‚¤ăłă‚’有効ă«ă—ăźă‚‰ă€ă­ă‚°ă‚¤ăłç”»éť˘ă® Google ăśă‚żăłă‚’使ăŁă¦ă“ă®ă‚˘ă‚«ă‚¦ăłăă«ă­ă‚°ă‚¤ăłă™ă‚‹ă“ă¨ăŚă§ăŤăľă™ă€‚" LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Facebook ă«ćŽĄç¶š" BUTTON_FACEBOOK_DISCONNECT: "Facebook ă‹ă‚‰ĺ‡ć–­" MAIN_FACEBOOK_DESC: "Facebook 経由ă®ă­ă‚°ă‚¤ăłă‚’有効ă«ă—ăźă‚‰ă€ă­ă‚°ă‚¤ăłç”»éť˘ă® Facebook ăśă‚żăłă‚’使ăŁă¦ă“ă®ă‚˘ă‚«ă‚¦ăłăă«ă­ă‚°ă‚¤ăłă™ă‚‹ă“ă¨ăŚă§ăŤăľă™ă€‚" LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Twitter ă«ćŽĄç¶š" BUTTON_TWITTER_DISCONNECT: "Twitter ă‹ă‚‰ĺ‡ć–­" MAIN_TWITTER_DESC: "Twitter 経由ă®ă­ă‚°ă‚¤ăłă‚’有効ă«ă—ăźă‚‰ă€ă­ă‚°ă‚¤ăłç”»éť˘ă® Twitter ăśă‚żăłă‚’使ăŁă¦ă“ă®ă‚˘ă‚«ă‚¦ăłăă«ă­ă‚°ă‚¤ăłă™ă‚‹ă“ă¨ăŚă§ăŤăľă™ă€‚" SETTINGS_FOLDERS: LEGEND_FOLDERS: "ă•ă‚©ă«ă€ăĽä¸€č¦§" BUTTON_CREATE: "ă•ă‚©ă«ă€ă‚’作ć" BUTTON_SYSTEM: "シスă†ă ă•ă‚©ă«ă€ăĽ" BUTTON_DELETE: "削除" BUTTON_SUBSCRIBE: "購読" BUTTON_UNSUBSCRIBE: "購読解除" LOADING_PROCESS: "ă•ă‚©ă«ă€ăĽăŞă‚ąăă®ć›´ć–°" CREATING_PROCESS: "ă•ă‚©ă«ă€ăĽă®ä˝ść" DELETING_PROCESS: "ă•ă‚©ă«ă€ăĽă®ĺ‰Šé™¤" RENAMING_PROCESS: "ă•ă‚©ă«ă€ăĽă®ĺŤĺ‰Ťă‚’変更" DELETING_ASK: "ă‚ろă—ă„ă§ă™ă‹ďĽź" TO_MANY_FOLDERS_DESC_1: "ă•ă‚©ă«ă€ăĽăŚĺ¤šă™ăŽăľă™" TO_MANY_FOLDERS_DESC_2: "ă‘ă•ă‚©ăĽăžăłă‚ąă®ĺ•ŹéˇŚă‚’回éżă™ă‚‹ăźă‚ă«ă€ăťă‚Śă‚‰ă®ä¸€é¨ă®ăżă‚’示ă—ă¦ă„ăľă™ă€‚" HELP_DELETE_FOLDER: "ă•ă‚©ă«ă€ăĽă‚’削除" HELP_SHOW_HIDE_FOLDER: "ă•ă‚©ă«ă€ăĽă®čˇ¨ç¤ş/非表示" HELP_CHECK_FOR_NEW_MESSAGES: "ć–°ă—ă„ăˇăă‚»ăĽă‚¸ă‚’ăă‚§ăクă™ă‚‹/ă—ăŞă„" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "アカウăłă一覧" LEGEND_IDENTITIES: "表示ĺŤ" LEGEND_ACCOUNTS_AND_IDENTITIES: "アカウăă¨čˇ¨ç¤şĺŤ" BUTTON_ADD_ACCOUNT: "アカウăłăを追加" BUTTON_ADD_IDENTITY: "表示ĺŤă‚’追加" BUTTON_DELETE: "削除" LOADING_PROCESS: "更新中" DELETING_ASK: "ă‚ろă—ă„ă§ă™ă‹ďĽź" DEFAULT_IDENTITY_LABEL: "ă‡ă•ă‚©ă«ă" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "表示ĺŤ" LEGEND_IDENTITIES: "追加ă®čˇ¨ç¤şĺŤ" LABEL_DEFAULT: "ă‡ă•ă‚©ă«ă" LABEL_DISPLAY_NAME: "ĺŤĺ‰Ť" LABEL_REPLY_TO: "Reply-To" LABEL_SIGNATURE: "署ĺŤ" LABEL_ADD_SIGNATURE_TO_ALL: "ă™ăąă¦ă®é€äżˇăˇăă‚»ăĽă‚¸ă«ç˝˛ĺŤă‚’追加ă™ă‚‹" BUTTON_ADD_IDENTITY: "表示ĺŤă®čż˝ĺŠ " BUTTON_DELETE: "削除" LOADING_PROCESS: "表示ĺŤă®ä¸€č¦§ă®ć›´ć–°ä¸­" DELETING_ASK: "ă‚ろă—ă„ă§ă™ă‹ďĽź" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "ă‘スăŻăĽă‰ă‚’変更" LABEL_CURRENT_PASSWORD: "現在ă®ă‘スăŻăĽă‰" LABEL_NEW_PASSWORD: "ć–°ă—ă„ă‘スăŻăĽă‰" LABEL_REPEAT_PASSWORD: "ć–°ă—ă„ă‘スăŻăĽă‰ă®ç˘şčŞŤ" BUTTON_UPDATE_PASSWORD: "ă‘スăŻăĽă‰ă‚’変更" ERROR_PASSWORD_MISMATCH: "ă‘スăŻăĽă‰ăŚä¸€č‡´ă—ăľă›ă‚“。もă†ä¸€ĺş¦ă‚„り直ă—ă¦ăŹă ă•ă„。" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP ă‚­ăĽă‚’イăłăťăĽă" BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP ă‚­ăĽă‚’生ć" TITLE_PRIVATE: "ă—ă©ă‚¤ă™ăĽă" TITLE_PUBLIC: "ă‘ă–ăŞăク" DELETING_ASK: "ă‚ろă—ă„ă§ă™ă‹ďĽź" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "下書ăŤă‚’自動的ă«äżťĺ­ă™ă‚‹" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "ă‚­ăĽăśăĽă‰ ă‚·ă§ăĽăă‚«ăă ăă«ă—" TAB_MAILBOX: "ăˇăĽă«ăśăクス" TAB_MESSAGE_LIST: "ăˇăă‚»ăĽă‚¸ä¸€č¦§" TAB_MESSAGE_VIEW: "ăˇăă‚»ăĽă‚¸čˇ¨ç¤şç”»éť˘" TAB_COMPOSE: "作ć画面" LABEL_OPEN_USER_DROPDOWN: "ă¦ăĽă‚¶ăĽăˇă‹ăĄăĽă‚’é–‹ăŹ" LABEL_REPLY: "返信" LABEL_REPLY_ALL: "全員ă«čż”信" LABEL_FORWARD: "転é€" LABEL_FORWARD_MULTIPLY: "č»˘é€ (ĺ…ă®ăˇăă‚»ăĽă‚¸ă‚’ć·»ä»)" LABEL_HELP: "ăă«ă—" LABEL_CHECK_ALL: "ă™ăąă¦ă®ăˇăă‚»ăĽă‚¸ă‚’é¸ćŠž" LABEL_ARCHIVE: "アăĽă‚«ă‚¤ă–" LABEL_DELETE: "削除" LABEL_OPEN_THREAD: "é¸ćŠžă—ăźă‚ąă¬ăă‰ă‚’é–‹ăŹ" LABEL_MOVE: "移動" LABEL_READ: "é¸ćŠžă—ăźăˇăă‚»ăĽă‚¸ă‚’既読ă«ă™ă‚‹" LABEL_UNREAD: "é¸ćŠžă—ăźăˇăă‚»ăĽă‚¸ă‚’未読ă«ă™ă‚‹" LABEL_IMPORTANT: "é¸ćŠžă—ăźăˇăă‚»ăĽă‚¸ă«é‡Ťč¦ă•ă©ă‚°ă‚’ă¤ă‘ă‚‹" LABEL_SEARCH: "検索" LABEL_CANCEL_SEARCH: "検索を取りć¶ă™" LABEL_FULLSCREEN_ENTER: "全画面 (ă—ă¬ă“ăĄăĽăšă‚¤ăłă¬ă‚¤ă‚˘ă‚¦ă)" LABEL_VIEW_MESSAGE_ENTER: "ăˇăă‚»ăĽă‚¸ă®čˇ¨ç¤ş (éťžă—ă¬ă“ăĄăĽăšă‚¤ăłă¬ă‚¤ă‚˘ă‚¦ă)" LABEL_SWITCH_TO_MESSAGE: "é¸ćŠžă•れăźăˇăă‚»ăĽă‚¸ă¸ĺ‡ă‚Šć›żăă‚‹" LABEL_SWITCH_TO_FOLDER_LIST: "ă•ă‚©ă«ă€ăĽä¸€č¦§ă¸ĺ‡ă‚Šć›żăă‚‹" LABEL_FULLSCREEN_TOGGLE: "ă•ă«ă‚ąă‚ŻăŞăĽăłă˘ăĽă‰ă¸ă®ĺ‡ă‚Šć›żă" LABEL_BLOCKQUOTES_TOGGLE: "ăˇăă‚»ăĽă‚¸ĺĽ•用ă®ĺ‡ă‚Šć›żă" LABEL_THREAD_NEXT: "スă¬ăă‰ă®ć¬ˇă®ăˇăĽăă‚»ăĽă‚¸" LABEL_THREAD_PREV: "スă¬ăă‰ă®ĺ‰Ťă®ăˇăĽăă‚»ăĽă‚¸" LABEL_PRINT: "印ĺ·" LABEL_EXIT_FULLSCREEN: "ă•ă«ă‚ąă‚ŻăŞăĽăłă˘ăĽă‰ă®çµ‚了" LABEL_CLOSE_MESSAGE: "ăˇăă‚»ăĽă‚¸ă‚’é–‰ăă‚‹ (éťžă—ă¬ă“ăĄăĽăšă‚¤ăłă¬ă‚¤ă‚˘ă‚¦ă)" LABEL_SWITCH_TO_LIST: "ăˇăă‚»ăĽă‚¸ä¸€č¦§ă¸ĺ‡ă‚Šć›żăă‚‹" LABEL_OPEN_COMPOSE_POPUP: "作ć画面を開ăŹ" LABEL_MINIMIZE_COMPOSE_POPUP: "作ć画面を最小化" LABEL_OPEN_IDENTITIES_DROPDOWN: "表示ĺŤăˇă‹ăĄăĽă‚’é–‹ăŹ" LABEL_SAVE_MESSAGE: "ăˇăă‚»ăĽă‚¸ă‚’äżťĺ­" LABEL_SEND_MESSAGE: "ăˇăă‚»ăĽă‚¸ă‚’é€äżˇ" LABEL_CLOSE_COMPOSE: "作ć画面を閉ăă‚‹" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "公開鍵ăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“" NO_PUBLIC_KEYS_FOUND_FOR: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą \"%EMAIL%\" ă®ĺ…¬é–‹éŤµăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“" NO_PRIVATE_KEY_FOUND: "ç§ĺŻ†éŤµăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“" NO_PRIVATE_KEY_FOUND_FOR: "ăˇăĽă«ă‚˘ă‰ă¬ă‚ą \"%EMAIL%\" ă®ç§ĺŻ†éŤµăŚč¦‹ă¤ă‹ă‚Šăľă›ă‚“" ADD_A_PUBLICK_KEY: "公開鍵ă®čż˝ĺŠ " SELECT_A_PRIVATE_KEY: "ç§ĺŻ†éŤµă‚’é¸ćŠžă—ă¦ăŹă ă•ă„" UNVERIFIRED_SIGNATURE: "未確認ă®ç˝˛ĺŤ" DECRYPTION_ERROR: "OpenPGP 復号化エă©ăĽ" GOOD_SIGNATURE: "%USER% ă‹ă‚‰ă®ć­Łă—ă„署ĺŤ" PGP_ERROR: "OpenPGP エă©ăĽ: %ERROR%" SPECIFY_FROM_EMAIL: "FROMă®ăˇăĽă«ă‚˘ă‰ă¬ă‚ąă‚’指定ă—ă¦ăŹă ă•ă„" SPECIFY_AT_LEAST_ONE_RECIPIENT: "ĺ°‘ăŞăŹă¦ă‚‚1ă¤ă®ĺŹ—äżˇč€…ă‚’ćŚ‡ĺ®šă—ă¦ăŹă ă•ă„" NOTIFICATIONS: INVALID_TOKEN: "無効ăŞăăĽă‚Żăł" AUTH_ERROR: "認証ă«ĺ¤±ć•—ă—ăľă—ăź" ACCESS_ERROR: "アクセスエă©ăĽ" CONNECTION_ERROR: "サăĽăăĽă¸ćŽĄç¶šă§ăŤăľă›ă‚“" CAPTCHA_ERROR: "é–“é•ăŁăź CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > ă“ă®SNSă¦ăĽă‚¶ăĽIDăŻă€ăľă ăˇăĽă«ă‚˘ă‚«ă‚¦ăłă用ă«ĺ‰˛ă‚Šĺ˝“ă¦ă‚‰ă‚Śă¦ă„ăľă›ă‚“。電ĺ­ăˇăĽă«ă®čł‡ć Ľć…報を使用ă—ă¦ă­ă‚°ă‚¤ăłă—ă€ă‚˘ă‚«ă‚¦ăłă設定ă§ă“ă®ć©źč˝ă‚’有効ă«ă—ăľă™ă€‚ SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > ă“ă®SNSă¦ăĽă‚¶ăĽIDăŻă€ăľă ăˇăĽă«ă‚˘ă‚«ă‚¦ăłă用ă«ĺ‰˛ă‚Šĺ˝“ă¦ă‚‰ă‚Śă¦ă„ăľă›ă‚“。電ĺ­ăˇăĽă«ă®čł‡ć Ľć…報を使用ă—ă¦ă­ă‚°ă‚¤ăłă—ă€ă‚˘ă‚«ă‚¦ăłă設定ă§ă“ă®ć©źč˝ă‚’有効ă«ă—ăľă™ă€‚ SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > ă“ă®SNSă¦ăĽă‚¶ăĽIDăŻă€ăľă ăˇăĽă«ă‚˘ă‚«ă‚¦ăłă用ă«ĺ‰˛ă‚Šĺ˝“ă¦ă‚‰ă‚Śă¦ă„ăľă›ă‚“。電ĺ­ăˇăĽă«ă®čł‡ć Ľć…報を使用ă—ă¦ă­ă‚°ă‚¤ăłă—ă€ă‚˘ă‚«ă‚¦ăłă設定ă§ă“ă®ć©źč˝ă‚’有効ă«ă—ăľă™ă€‚ DOMAIN_NOT_ALLOWED: "ă‰ăˇă‚¤ăłăŻă€č¨±ĺŹŻă•れă¦ă„ăľă›ă‚“" ACCOUNT_NOT_ALLOWED: "アカウăłăăŻă€č¨±ĺŹŻă•れă¦ă„ăľă›ă‚“" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2č¦ç´ čŞŤč¨ĽăŚĺż…č¦ă§ă™" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2č¦ç´ čŞŤč¨Ľă‚¨ă©ăĽ" COULD_NOT_SAVE_NEW_PASSWORD: "ć–°ă—ă„ă‘スăŻăĽă‰ă‚’äżťĺ­ă§ăŤăľă›ă‚“。" CURRENT_PASSWORD_INCORRECT: "現在ă®ă‘スăŻăĽă‰ăŚé–“é•ăŁă¦ă„ăľă™" NEW_PASSWORD_SHORT: "ă‘スăŻăĽă‰ăŚçź­ă™ăŽăľă™" NEW_PASSWORD_WEAK: "ă‘スăŻăĽă‰ăŚç°ˇĺŤă™ăŽăľă™" NEW_PASSWORD_FORBIDDENT: "ă‘スăŻăĽă‰ă«ă€ç¦ć­˘ă•れăźć–‡ĺ­—ăŚĺ«ăľă‚Śă¦ă„ăľă™" CONTACTS_SYNC_ERROR: "é€Łçµˇĺ… ĺŚćśź エă©ăĽ" CANT_GET_MESSAGE_LIST: "ăˇăă‚»ăĽă‚¸ä¸€č¦§ăŚĺŹ–ĺľ—ă§ăŤăľă›ă‚“" CANT_GET_MESSAGE: "ăˇăă‚»ăĽă‚¸ă‚’取得ă§ăŤăľă›ă‚“" CANT_DELETE_MESSAGE: "ăˇăă‚»ăĽă‚¸ă‚’削除ă§ăŤăľă›ă‚“" CANT_MOVE_MESSAGE: "ăˇăă‚»ăĽă‚¸ă‚’移動ă§ăŤăľă›ă‚“" CANT_SAVE_MESSAGE: "ăˇăă‚»ăĽă‚¸ă‚’äżťĺ­ă§ăŤăľă›ă‚“" CANT_SEND_MESSAGE: "ăˇăă‚»ăĽă‚¸é€äżˇă§ăŤăľă›ă‚“" INVALID_RECIPIENTS: "無効ăŞĺŹ—äżˇč€…" CANT_SAVE_FILTERS: "ă•ィă«ă‚żăĽă‚’äżťĺ­ă§ăŤăľă›ă‚“" CANT_GET_FILTERS: "ă•ィă«ă‚żăĽă‚’取得ă§ăŤăľă›ă‚“" FILTERS_ARE_NOT_CORRECT: "ă•ィă«ă‚żăĽăŚć­Łă—ăŹă‚りăľă›ă‚“" CANT_CREATE_FOLDER: "ă•ă‚©ă«ă€ă‚’作ćă§ăŤăľă›ă‚“" CANT_RENAME_FOLDER: "ă•ă‚©ă«ă€ă®ĺŤĺ‰Ťă‚’変更ă§ăŤăľă›ă‚“" CANT_DELETE_FOLDER: "ă•ă‚©ă«ă€ă‚’削除ă§ăŤăľă›ă‚“" CANT_DELETE_NON_EMPTY_FOLDER: "空ă§ăŻăŞă„ă‡ă‚Łă¬ă‚ŻăăŞă‚’削除ă§ăŤăľă›ă‚“" CANT_SUBSCRIBE_FOLDER: "ă•ă‚©ă«ă€ă‚’購読ă§ăŤăľă›ă‚“" CANT_UNSUBSCRIBE_FOLDER: "ă•ă‚©ă«ă€ă‚’購読解除ă§ăŤăľă›ă‚“" CANT_SAVE_SETTINGS: "設定ăŚäżťĺ­ă§ăŤăľă›ă‚“" CANT_SAVE_PLUGIN_SETTINGS: "設定ăŚäżťĺ­ă§ăŤăľă›ă‚“" DOMAIN_ALREADY_EXISTS: "ă‰ăˇă‚¤ăłăŚć—˘ă«ĺ­ĺś¨ă—ă¦ă„ăľă™" CANT_INSTALL_PACKAGE: "ă‘ăケăĽă‚¸ă®ă‚¤ăłă‚ąăăĽă«ă«ĺ¤±ć•—ă—ăľă—ăź" CANT_DELETE_PACKAGE: "ă‘ăケăĽă‚¸ă®ĺ‰Šé™¤ă«ĺ¤±ć•—ă—ăľă—ăź" INVALID_PLUGIN_PACKAGE: "ă—ă©ă‚°ă‚¤ăłă‘ăケăĽă‚¸ăŚä¸Ťć­Łă§ă™" UNSUPPORTED_PLUGIN_PACKAGE: "ă—ă©ă‚°ă‚¤ăłă‘ăケăĽă‚¸ăŚă‚µăťăĽăă•れă¦ă„ăľă›ă‚“" LICENSING_SERVER_IS_UNAVAILABLE: "サă–スクăŞă—ă‚·ă§ăłă‚µăĽăăĽăŚĺ©ç”¨ă§ăŤăľă›ă‚“" LICENSING_DOMAIN_EXPIRED: "ă“ă®ă‰ăˇă‚¤ăłă®ă‚µă–スクăŞă—ă‚·ă§ăłă®ćś‰ĺŠąćśźé™ăŚĺ‡ă‚Śăľă—ăź" LICENSING_DOMAIN_BANNED: "ă“ă®ă‰ăˇă‚¤ăłă®ă‚µă–スクăŞă—ă‚·ă§ăłăŚç„ˇĺŠąĺŚ–ă•れăľă—ăź" DEMO_SEND_MESSAGE_ERROR: "セキăĄăŞă†ă‚Łä¸Šă®ç†ç”±ă‹ă‚‰ă€ă‚˘ă‚«ă‚¦ăłăăŻă€ĺ¤–é¨ă®é›»ĺ­ăˇăĽă«ă‚˘ă‰ă¬ă‚ąă«ăˇăă‚»ăĽă‚¸ă‚’é€äżˇă™ă‚‹ă“ă¨ă‚’許可ă•れă¦ă„ăľă›ă‚“ďĽ" DEMO_ACCOUNT_ERROR: "セキăĄăŞă†ă‚Łä¸Šă®ç†ç”±ă‹ă‚‰ă€ă‚˘ă‚«ă‚¦ăłăă«ăŻă€ă“ă®ă‚˘ă‚Żă‚·ă§ăłăŚč¨±ĺŹŻă•れă¦ă„ăľă›ă‚“ďĽ" ACCOUNT_ALREADY_EXISTS: "アカウăłăăŚă™ă§ă«ĺ­ĺś¨ă—ăľă™" ACCOUNT_DOES_NOT_EXIST: "アカウăłăăŻĺ­ĺś¨ă—ăľă›ă‚“" MAIL_SERVER_ERROR: "ăˇăĽă«ă‚µăĽăăĽă¸ă®ă‚˘ă‚Żă‚»ă‚ąä¸­ă«ă‚¨ă©ăĽăŚç™şç”źă—ăľă—ăź" INVALID_INPUT_ARGUMENT: "無効ăŞĺ…ĄĺŠ›ĺĽ•ć•°" UNKNOWN_ERROR: "不ćŽăŞă‚¨ă©ăĽ" STATIC: BACK_LINK: "ć›´ć–°" DOMAIN_LIST_DESC: "ă‰ăˇă‚¤ăłă®ä¸€č¦§ăŻă€Web ăˇăĽă«ă®ă‚˘ă‚Żă‚»ă‚ąă‚’許可ă•れă¦ă„ăľă™ă€‚" PHP_EXSTENSIONS_ERROR_DESC: "ĺż…č¦ăŞ PHP 拡張ă˘ă‚¸ăĄăĽă«ăŚă€ćś‰ĺŠąă«ăŞăŁă¦ă„ăľă›ă‚“。" PHP_VERSION_ERROR_DESC: "PHP ăăĽă‚¸ă§ăł (%VERSION%) ăŚă€ 最低ăăĽă‚¸ă§ăłă® 5.3.0 ă‚りも低ă„ă§ă™ďĽ" NO_SCRIPT_TITLE: "ă“ă®ă‚˘ă—ăŞă‚±ăĽă‚·ă§ăłă§ăŻ JavaScript ăŚĺż…č¦ă§ă™ă€‚" NO_SCRIPT_DESC: | ă–ă©ă‚¦ă‚¶ă§ JavaScript ăŚă€ćś‰ĺŠąă«ăŞăŁă¦ă„ăľă›ă‚“。 JavaScript を有効ă«ă—ă¦ă€ĺ†Ťĺş¦č©¦ă—ă¦ăŹă ă•ă„。 NO_COOKIE_TITLE: "ă“ă®ă‚˘ă—ăŞă‚±ăĽă‚·ă§ăłă§ăŻ Cookie ăŚĺż…č¦ă§ă™ă€‚" NO_COOKIE_DESC: | ă–ă©ă‚¦ă‚¶ă§ Cookie ăŚă€ćś‰ĺŠąă«ăŞăŁă¦ă„ăľă›ă‚“。 Cookie を有効ă«ă—ă¦ă€ĺ†Ťĺş¦č©¦ă—ă¦ăŹă ă•ă„。 BAD_BROWSER_TITLE: "ă–ă©ă‚¦ă‚¶ăŚĺʤă„ă§ă™ă€‚" BAD_BROWSER_DESC: | アă—ăŞă‚±ăĽă‚·ă§ăłă®ă™ăąă¦ă®ć©źč˝ă‚’使用ă™ă‚‹ă«ăŻă€ ă“れらă®ă–ă©ă‚¦ă‚¶ă®1ă¤ă‚’ă€ă‚¦ăłă­ăĽă‰ă—ă¦ă‚¤ăłă‚ąăăĽă«ă—ăľă™ďĽš rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/ko_KR.yml000066400000000000000000001017721361462701300262140ustar00rootroot00000000000000ko_KR: LOGIN: LABEL_EMAIL: "이메일" LABEL_LOGIN: "ě•„ěť´ë””" LABEL_PASSWORD: "비밀ë˛í¸" LABEL_SIGN_ME: "ě•„ěť´ë”” 기억" LABEL_VERIFICATION_CODE: "인증 코드" LABEL_DONT_ASK_VERIFICATION_CODE: "2주 ëŹ™ě• ě˝”ë“śëĄĽ 물어보지 않기" BUTTON_SIGN_IN: "로그인" TITLE_SIGN_IN_GOOGLE: "구글 계정으로 로그인" TITLE_SIGN_IN_FACEBOOK: "íŽěť´ěŠ¤ë¶ ęł„ě •ěśĽëˇś 로그인" TITLE_SIGN_IN_TWITTER: "트위터 계정으로 로그인" LABEL_FORGOT_PASSWORD: "비밀ë˛í¸ 분실" LABEL_REGISTRATION: "가입" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "계정 추가" BUTTON_SETTINGS: "설정" BUTTON_HELP: "도움ë§" BUTTON_LOGOUT: "로그아ě›" MOBILE: BUTTON_MOBILE_VERSION: "모바일 버전" BUTTON_DESKTOP_VERSION: "데스í¬í‘ 버전" SEARCH: MAIN_INPUT_PLACEHOLDER: "검ě‰" TITLE_ADV: "고급 검ě‰" LABEL_ADV_FROM: "보내는 사람" LABEL_ADV_TO: "받는 사람" LABEL_ADV_SUBJECT: "제목" LABEL_ADV_TEXT: "본문" LABEL_ADV_HAS_ATTACHMENT: "첨부파일이 ěžěťŚ" LABEL_ADV_HAS_ATTACHMENTS: "첨부파일이 ěžěťŚ" LABEL_ADV_FLAGGED: "중요" LABEL_ADV_UNSEEN: "읽지 않음" LABEL_ADV_DATE: "ë‚ ě§ś" LABEL_ADV_DATE_ALL: "모ë‘" LABEL_ADV_DATE_3_DAYS: "3일 ěť´ë‚´" LABEL_ADV_DATE_7_DAYS: "1주일 ěť´ë‚´" LABEL_ADV_DATE_MONTH: "1ę°śě›” ěť´ë‚´" LABEL_ADV_DATE_3_MONTHS: "3ę°śě›” ěť´ë‚´" LABEL_ADV_DATE_6_MONTHS: "6ę°śě›” ěť´ë‚´" LABEL_ADV_DATE_YEAR: "1ë…„ ěť´ë‚´" BUTTON_ADV_SEARCH: "검ě‰" PREVIEW_POPUP: FULLSCREEN: "전체화면으로 보기" ZOOM: "확대/축소" CLOSE: "닫기 (Esc)" LOADING: "로딩 중..." GALLERY_PREV: "ěť´ě „ (왼쪽 방향키)" GALLERY_NEXT: "다음 (ě¤ëĄ¸ěŞ˝ 방향키)" GALLERY_COUNTER: "%total% 중 %curr%" IMAGE_ERROR: "이미지를 ë¶ëź¬ě¤ě§€ 못í–습ë‹ë‹¤." AJAX_ERROR: "내용을 ë¶ëź¬ě¤ě§€ 못í–습ë‹ë‹¤." FOLDER_LIST: BUTTON_COMPOSE: "메일 쓰기" BUTTON_CONTACTS: "ě—°ëť˝ě˛" BUTTON_NEW_MESSAGE: "ě 메시지" INBOX_NAME: "받은 편지함" SENT_NAME: "보낸 편지함" DRAFTS_NAME: "임시 보관함" SPAM_NAME: "스팸함" TRASH_NAME: "휴지통" ARCHIVE_NAME: "보관함" QUOTA: TITLE: "사용량" MESSAGE_LIST: BUTTON_RELOAD: "메일 목록 ě로고침" BUTTON_MOVE_TO: "다음 ěś„ěąëˇś 이동" BUTTON_DELETE: "ě‚­ě ś" BUTTON_ARCHIVE: "ëł´ę´€" BUTTON_SPAM: "스팸" BUTTON_NOT_SPAM: "스팸 ě•„ë‹" BUTTON_EMPTY_FOLDER: "폴더 비우기" BUTTON_MULTY_FORWARD: "첨부파일 í•식으로 전달" BUTTON_DELETE_WITHOUT_MOVE: "ě구 ě‚­ě ś" BUTTON_MORE: "더 보기" MENU_SET_SEEN: "읽음으로 표시" MENU_SET_ALL_SEEN: "ëŞ¨ë‘ ěť˝ěťŚěśĽëˇś 표시" MENU_UNSET_SEEN: "읽지 않음으로 표시" MENU_SET_FLAG: "중요 표시" MENU_UNSET_FLAG: "중요 표시 í•´ě ś" MENU_SELECT_ALL: "모ë‘" MENU_SELECT_NONE: "없음" MENU_SELECT_INVERT: "ë°ě „" MENU_SELECT_UNSEEN: "읽지 않음" MENU_SELECT_SEEN: "읽음" MENU_SELECT_FLAGGED: "중요" MENU_SELECT_UNFLAGGED: "일ë°" EMPTY_LIST: "목록이 비어ěžěеë‹ë‹¤." EMPTY_SEARCH_LIST: "ę˛€ě‰ ěˇ°ę±´ě— ë§žëŠ” 결과가 없습ë‹ë‹¤.." SEARCH_RESULT_FOR: "\"%SEARCH%\"ě— ëŚ€í•ś ę˛€ě‰ ę˛°ęłĽ" BACK_TO_MESSAGE_LIST: "메시지 목록으로 돌아가기" LIST_LOADING: "로딩 중" EMPTY_SUBJECT_TEXT: "(제목 없음)" PUT_MESSAGE_HERE: "ëŞ©ëˇťě— í‘śě‹śí•  메시지를 여기로 ëŚě–´ë‹¤ 놓으세요." TODAY_AT: "ě¤ëŠ %TIME%" YESTERDAY_AT: "ě–´ě ś %TIME%" SEARCH_PLACEHOLDER: "검ě‰" NEW_MESSAGE_NOTIFICATION: "%COUNT% ę°śěť ě 메시지가 ěžěеë‹ë‹¤!" QUOTA_SIZE: "ě´ť %LIMIT% 중 %PROC%%ěť„(를) 사용 중입ë‹ë‹¤." MESSAGE: BUTTON_EDIT: "편집" BUTTON_BACK: "뒤로" BUTTON_CLOSE: "닫기" BUTTON_DELETE: "ě‚­ě ś" BUTTON_UNSUBSCRIBE: "ěť´ ë©”ěťĽë§ ë¦¬ěŠ¤íŠ¸ëĄĽ ěě‹ ę±°ë¶€" BUTTON_ARCHIVE: "ëł´ę´€" BUTTON_SPAM: "스팸" BUTTON_NOT_SPAM: "스팸 ě•„ë‹" BUTTON_MOVE_TO: "다음 ěś„ěąëˇś 이동" BUTTON_MORE: "더 보기" BUTTON_REPLY: "회신" BUTTON_REPLY_ALL: "전체 회신" BUTTON_FORWARD: "전달" BUTTON_FORWARD_AS_ATTACHMENT: "첨부파일로 전달" BUTTON_EDIT_AS_NEW: "ě 메시지로 편집" BUTTON_SHOW_IMAGES: "외부 이미지 표시" BUTTON_NOTIFY_READ_RECEIPT: "보내는 사람이 메일 확인 알림을 요청í–습ë‹ë‹¤." BUTTON_IN_NEW_WINDOW: "ę°śëł„ ě°˝ě—서 보기" BUTTON_THREAD_LIST: "ëŚ€í™”í• ëŞ©ëˇť" BUTTON_THREAD_PREV: "ěť´ě „" BUTTON_THREAD_NEXT: "다음" BUTTON_THREAD_MORE: "다음 메시지" MENU_HEADERS: "메시지 헤더 보기" MENU_VIEW_ORIGINAL: "ě›ëł¸ 보기" MENU_DOWNLOAD_ORIGINAL: ".eml 파일로 다운로드" MENU_FILTER_SIMILAR: "ěť´ëź° ěś í•ěť ë©”ě‹śě§€ě— í•„í„° ě ěš©" MENU_PRINT: "인쇄" EMPTY_SUBJECT_TEXT: "(제목 없음)" LABEL_SUBJECT: "제목" LABEL_DATE: "ë‚ ě§ś" LABEL_FROM: "보내는 사람" LABEL_FROM_SHORT: "보내는 사람" LABEL_TO: "받는 사람" LABEL_TO_SHORT: "받는 사람" LABEL_CC: "참조" LABEL_BCC: "ě¨ěť€ 참조" LABEL_REPLY_TO: "회신 주소" PRINT_LABEL_FROM: "보내는 사람" PRINT_LABEL_TO: "받는 사람" PRINT_LABEL_CC: "참조" PRINT_LABEL_BCC: "ě¨ěť€ 참조" PRINT_LABEL_REPLY_TO: "회신 주소" PRINT_LABEL_DATE: "ë‚ ě§ś" PRINT_LABEL_SUBJECT: "제목" PRINT_LABEL_ATTACHMENTS: "첨부파일" MESSAGE_LOADING: "ë¶ëź¬ě¤ëŠ” 중..." MESSAGE_VIEW_DESC: "목록ě—서 ě„ íťí•ś 메시지가 ě—¬ę¸°ě— í‘śě‹śë©ë‹ë‹¤." MESSAGE_VIEW_MOVE_DESC: "왼쪽 패ë„ě—서 폴더명을 í´ë¦­í•ě—¬ ěś„ěąëĄĽ ě„ íťí•세요." PGP_PASSWORD_INPUT_PLACEHOLDER: "비밀ë˛í¸" PGP_SIGNED_MESSAGE_DESC: "OpenPGP로 ě„śëŞ…ëś ë©”ě„¸ě§€ěž…ë‹ë‹¤. (인증í•려면 í´ë¦­í•세요)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP로 ě•”í¸í™”ëś ë©”ě„¸ě§€ěž…ë‹ë‹¤. (ëłµí¸í™”í•려면 í´ë¦­í•세요)" LINK_DOWNLOAD_AS_ZIP: ".zip 파일로 다운로드" LINK_SAVE_TO_OWNCLOUD: "ownCloudě— ě €ěžĄ" LINK_SAVE_TO_CLOUD: "í´ëťĽěš°ë“śě— 저장" LINK_SAVE_TO_DROPBOX: "ë“śëˇ­ë°•ěŠ¤ě— ě €ěžĄ" READ_RECEIPT: SUBJECT: "ěě‹  확인 (표시ë¨) - %SUBJECT%" SUGGESTIONS: SEARCHING_DESC: "ę˛€ě‰ ě¤‘..." CONTACTS: LEGEND_CONTACTS: "ě—°ëť˝ě˛" SEARCH_INPUT_PLACEHOLDER: "검ě‰" BUTTON_ADD_CONTACT: "ě—°ëť˝ě˛ ě¶”ę°€" BUTTON_CREATE_CONTACT: "ěťě„±" BUTTON_UPDATE_CONTACT: "업데이트" BUTTON_IMPORT: "가져ě¤ę¸° (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "내보내기 (vcf, vCard)" BUTTON_EXPORT_CSV: "내보내기 (csv)" ERROR_IMPORT_FILE: "가져ě¤ę¸° ě¤ëĄ (유효í•ě§€ 않은 파일 í•식)" LIST_LOADING: "ë¶ëź¬ě¤ëŠ” 중" EMPTY_LIST: "ě—°ëť˝ě˛ę°€ 없습ë‹ë‹¤." EMPTY_SEARCH: "ě—°ëť˝ě˛ëĄĽ ě°ľě§€ 못í–습ë‹ë‹¤." CLEAR_SEARCH: "ę˛€ě‰ ě´ę¸°í™”" CONTACT_VIEW_DESC: "목록ě—서 ě—°ëť˝ě˛ëĄĽ ě„ íťí•ě—¬ ěť´ ęłłě— í‘śě‹śí•세요." LABEL_DISPLAY_NAME: "이름 표시" LABEL_EMAIL: "이메일" LABEL_PHONE: "ě „í™”" LABEL_WEB: "í™íŽěť´ě§€" LABEL_BIRTHDAY: "ěťěťĽ" LINK_ADD_EMAIL: "이메일 주소 추가" LINK_ADD_PHONE: "ě „í™”ë˛í¸ 추가" LINK_BIRTHDAY: "ěťěťĽ" PLACEHOLDER_ENTER_DISPLAY_NAME: "표시명을 ěž…ë Ąí•세요" PLACEHOLDER_ENTER_LAST_NAME: "성을 ěž…ë Ąí•세요" PLACEHOLDER_ENTER_FIRST_NAME: "이름을 ěž…ë Ąí•세요" PLACEHOLDER_ENTER_NICK_NAME: "별칭을 ěž…ë Ąí•세요" LABEL_READ_ONLY: "읽기 ě „ěš©" LABEL_SHARE: "공유" ADD_MENU_LABEL: "추가" ADD_MENU_NICKNAME: "별칭" ADD_MENU_NOTES: "메모" ADD_MENU_EMAIL: "이메일" ADD_MENU_PHONE: "ě „í™”" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "주소" ADD_MENU_BIRTHDAY: "ěťěťĽ" ADD_MENU_TAGS: "íśę·¸" BUTTON_SHARE_NONE: "없음" BUTTON_SHARE_ALL: "ě „ě›" BUTTON_SYNC: "동기화 (CardDAV)" COMPOSE: TITLE_FROM: "보내는 사람" TITLE_TO: "받는 사람" TITLE_CC: "참조" TITLE_BCC: "ě¨ěť€ 참조" TITLE_REPLY_TO: "회신 주소" TITLE_SUBJECT: "제목" LINK_SHOW_INPUTS: "모든 필드 표시" BUTTON_SEND: "보내기" BUTTON_SAVE: "저장" BUTTON_DELETE: "ě‚­ě ś" BUTTON_CANCEL: "취소" BUTTON_MINIMIZE: "최소화" SAVED_TIME: "%TIME% ě— ě €ěžĄë¨" SAVED_ERROR_ON_SEND: "메시지는 전송ëě—지만, 보낸 íŽ¸ě§€í•¨ě— ě €ěžĄëě§€ 않ě•습ë‹ë‹¤." DISCARD_UNSAVED_DATA: "저장ëě§€ 않은 데이터를 ě‚­ě śí•시겠습ë‹ęąŚ ?" ATTACH_FILES: "파일 첨부" ATTACH_DROP_FILES_DESC: "파일을 ëŚě–´ 놓으세요" ATTACH_ITEM_CANCEL: "취소" DROPBOX: "드롭박스" GOOGLE_DRIVE: "구글 드라이브" REPLY_MESSAGE_TITLE: "%DATETIME%ě— %EMAIL%ěť´(ę°€) 보낸 메시지" FORWARD_MESSAGE_TOP_TITLE: "-------- ě „ë‹¬ëś ë©”ě‹śě§€ -------" FORWARD_MESSAGE_TOP_FROM: "보내는 사람" FORWARD_MESSAGE_TOP_TO: "받는 사람" FORWARD_MESSAGE_TOP_CC: "참조" FORWARD_MESSAGE_TOP_SENT: "ëł´ë„" FORWARD_MESSAGE_TOP_SUBJECT: "제목" EMPTY_TO_ERROR_DESC: "ě신인을 한 명 ěť´ě ě„ íťí•세요" NO_ATTACHMENTS_HERE_DESC: "ě˛¨ë¶€ëś íŚŚěťĽěť´ 없습ë‹ë‹¤." ATTACHMENTS_ERROR_DESC: "경고! 모든 첨부파일이 업로드 ëě§€ 않습ë‹ë‹¤." ATTACHMENTS_UPLOAD_ERROR_DESC: "첨부파일이 ě•„ě§ ě—…ëˇśë“śëě§€ 않ě•습ë‹ë‹¤." BUTTON_REQUEST_READ_RECEIPT: "ěě‹  확인 요청" BUTTON_MARK_AS_IMPORTANT: "중요 표시" BUTTON_OPEN_PGP: "OpenPGP (평문만)" BUTTON_REQUEST_DSN: "ěě‹  확인 요청" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "닫기" POPUPS_ASK: BUTTON_YES: "ě" BUTTON_NO: "ě•„ë‹ěš”" DESC_WANT_CLOSE_THIS_WINDOW: "ě •ë§ëˇś ěť´ íŽěť´ě§€ëĄĽ 닫으시겠습ë‹ęąŚ ?" DESC_WANT_DELETE_MESSAGES: "ě •ë§ëˇś ě„ íťí•ś 메세지를 ě‚­ě śí•시겠습ë‹ęąŚ ?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "언어 ě„ íť" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "계정을 추가할까요?" BUTTON_ADD_ACCOUNT: "추가" TITLE_UPDATE_ACCOUNT: "계정을 업데이트할까요?" BUTTON_UPDATE_ACCOUNT: "업데이트" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "ě‹ ě›ěť„ ě로 추가할까요?" TITLE_UPDATE_IDENTITY: "ě‹ ě›ěť„ 업데이트할까요?" BUTTON_ADD_IDENTITY: "추가" BUTTON_UPDATE_IDENTITY: "업데이트" LABEL_EMAIL: "이메일" LABEL_NAME: "이름" LABEL_REPLY_TO: "회신 주소" LABEL_SIGNATURE: "서명" LABEL_CC: "참조" LABEL_BCC: "ě¨ěť€ 참조" LABEL_SIGNATURE_INSERT_BEFORE: "회신 시 ěť´ 서명을 인용문 ěť´ě „ě— ě‚˝ěž…" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "폴더를 ěťě„±í• ęąŚěš”?" LABEL_NAME: "폴더명" LABEL_PARENT: "ěěś„ 폴더" BUTTON_CREATE: "ěťě„±" BUTTON_CANCEL: "취소" BUTTON_CLOSE: "닫기" TITLE_CREATING_PROCESS: "폴더 ěťě„± 중" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "ěť´ íŹ´ëŤ”ěť ëŞ¨ë“  메시지를 완전 ě‚­ě śí•시겠습ë‹ęąŚ?" BUTTON_CLEAR: "ě´ę¸°í™”" BUTTON_CANCEL: "취소" BUTTON_CLOSE: "닫기" DANGER_DESC_WARNING: "경고!" DANGER_DESC_HTML_1: "ěť´ 동작은 %FOLDER% íŹ´ëŤ”ěť ë©”ě‹śě§€ëĄĽ ëŞ¨ë‘ ě‚­ě śí•  ę˛ěž…ë‹ë‹¤." DANGER_DESC_HTML_2: "작업이 시작ëë©´ 중지í•ę±°ë‚ ě·¨ě†Śí•  ě 없습ë‹ë‹¤." TITLE_CLEARING_PROCESS: "폴더를 비우는 중..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP 키 가져ě¤ę¸°" BUTTON_IMPORT_OPEN_PGP_KEY: "가져ě¤ę¸°" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP 키 보기" BUTTON_SELECT: "ě„ íť" BUTTON_CLOSE: "닫기" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP 키 ěťě„±" LABEL_EMAIL: "이메일" LABEL_NAME: "이름" LABEL_PASSWORD: "비밀ë˛í¸" LABEL_KEY_BIT_LENGTH: "키 길이" BUTTON_GENERATE_OPEN_PGP_KEYS: "ěťě„±" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP 서명/ě•”í¸í™”" LABEL_SIGN: "로그인" LABEL_ENCRYPT: "ě•”í¸í™”" LABEL_PASSWORD: "비밀ë˛í¸" BUTTON_SIGN: "로그인" BUTTON_ENCRYPT: "ě•”í¸í™”" BUTTON_SIGN_AND_ENCRYPT: "서명 ë°Ź ě•”í¸í™”" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP ëłµí¸í™”" LABEL_KEY: "비공개 키" LABEL_PASSWORD: "비밀ë˛í¸" BUTTON_DECRYPT: "ëłµí¸í™”" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2단계 인증 테스트" LABEL_CODE: "코드" BUTTON_TEST: "테스트" POPUPS_FILTER: TITLE_CREATE_FILTER: "필터를 ěťě„±í• ęąŚěš”?" TITLE_EDIT_FILTER: "필터를 업데이트할까요?" FILTER_NAME: "이름" LEGEND_CONDITIONS: "조건" LEGEND_ACTIONS: "동작" BUTTON_DONE: "완료" BUTTON_ADD_CONDITION: "조건 추가" SELECT_ACTION_NONE: "없음" SELECT_ACTION_MOVE_TO: "다음 ěś„ěąëˇś 이동" SELECT_ACTION_FORWARD_TO: "다음으로 전달" SELECT_ACTION_REJECT: "ę±°ë¶€" SELECT_ACTION_VACATION_MESSAGE: "부재 중 메시지" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "보내는 사람" SELECT_FIELD_RECIPIENTS: "ě신인 (받는 사람 ë는 참조)" SELECT_FIELD_SUBJECT: "제목" SELECT_FIELD_HEADER: "헤더" SELECT_FIELD_SIZE: "í¬ę¸°" SELECT_TYPE_CONTAINS: "다음을 포함" SELECT_TYPE_NOT_CONTAINS: "다음을 포함í•ě§€ 않음" SELECT_TYPE_MATCHES: "다음과 일ěąí•¨ (* ë°Ź ? ě§€ě›)" SELECT_TYPE_NOT_MATCHES: "다음과 일ěąí•ě§€ 않음 (* ë°Ź ? ě§€ě›)" SELECT_TYPE_REGEXP: "ě •ę·ś 표í„식임" SELECT_TYPE_NOT_REGEXP: "ě •ę·ś 표í„식이 ě•„ë‹" SELECT_TYPE_EQUAL_TO: "다음과 동일함" SELECT_TYPE_NOT_EQUAL_TO: "다음과 동일í•ě§€ 않음" SELECT_TYPE_OVER: "다음을 ě´ęłĽí•¨" SELECT_TYPE_UNDER: "다음보다 미달임" SELECT_MATCH_ANY: "Matching any of the following rules" SELECT_MATCH_ALL: "Matching all of the following rules" MARK_AS_READ_LABEL: "읽음 표시" REPLY_INTERVAL_LABEL: "회신 주기 (일)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "이메일" VACATION_SUBJECT_LABEL: "제목 (ěµě…)" VACATION_MESSAGE_LABEL: "메시지" VACATION_RECIPIENTS_LABEL: "ě신인 (쉼표 분리)" REJECT_MESSAGE_LABEL: "메시지 ę±°ë¶€" ALL_INCOMING_MESSAGES_DESC: "모든 ěě‹  메시지" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "시스템 폴더 ě„ íť" SELECT_CHOOSE_ONE: "í•ë‚를 ě„ íť" SELECT_UNUSE_NAME: "사용í•ě§€ 않음" LABEL_SENT: "보낸 편지함" LABEL_DRAFTS: "임시 보관함" LABEL_SPAM: "스팸함" LABEL_TRASH: "휴지통" LABEL_ARCHIVE: "보관함" BUTTON_CANCEL: "취소" BUTTON_CLOSE: "닫기" NOTIFICATION_SENT: |- 보낸 편지함 폴더가 지정ëě§€ 않ě•습ë‹ë‹¤. 보낸 메시지를 ëł´ę´€í•ě§€ 않고 ě‚­ě śí•려면 "사용í•ě§€ 않음" ěµě…ěť„ ě„ íťí•´ěŁĽě„¸ěš”. NOTIFICATION_DRAFTS: "임시 보관함 폴더가 지정ëě§€ 않ě•습ë‹ë‹¤." NOTIFICATION_SPAM: |- 스팸함 폴더가 지정ëě§€ 않ě•습ë‹ë‹¤. 스팸ě˛ë¦¬í•ś 메시지를 ëł´ę´€í•ě§€ 않고 바로 ě‚­ě śí•려면 "사용í•ě§€ 않음" ěµě…ěť„ ě„ íťí•´ěŁĽě„¸ěš”. NOTIFICATION_TRASH: |- 휴지통 폴더가 지정ëě§€ 않ě•습ë‹ë‹¤. 삭제한 메시지를 íś´ě§€í†µě— ëł´ę´€í•ě§€ 않고 바로 ě‚­ě śí•려면 "사용í•ě§€ 않음" ěµě…ěť„ ě„ íťí•´ěŁĽě„¸ěš”. NOTIFICATION_ARCHIVE: "ëł´ę´€ 메시지가 ěś„ěąí•  \"보관함\" 시스템 폴더를 ě„ íťí•ě§€ 않으셨습ë‹ë‹¤." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2단계 인증" LABEL_ENABLE_TWO_FACTOR: "2단계 인증 활성화" LABEL_TWO_FACTOR_USER: "사용ěž" LABEL_TWO_FACTOR_STATUS: "ěíś" LABEL_TWO_FACTOR_SECRET: "비밀ë˛í¸" LABEL_TWO_FACTOR_BACKUP_CODES: "백업 코드" BUTTON_CREATE: "ě 비밀ë˛í¸ ěťě„±" BUTTON_ACTIVATE: "활성화" BUTTON_CLEAR: "ě´ę¸°í™”" BUTTON_LOGOUT: "로그아ě›" BUTTON_DONE: "완료" BUTTON_TEST: "테스트" LINK_TEST: "테스트" BUTTON_SHOW_SECRET: "비밀ë˛í¸ 표시" BUTTON_HIDE_SECRET: "비밀ë˛í¸ ě¨ę¸°ę¸°" TWO_FACTOR_REQUIRE_DESC: "ę·€í•ěť ęł„ě •ě— 2단계 인증 설정이 필요합ë‹ë‹¤." TWO_FACTOR_SECRET_CONFIGURED_DESC: "설정ë¨" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "설정ëě§€ 않음" TWO_FACTOR_SECRET_DESC: >- Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: >- If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "로딩 중" LOGIN: "로그인" MAILBOX: "메일함" SETTINGS: "설정" COMPOSE: "쓰기" UPLOAD: ERROR_FILE_IS_TOO_BIG: "파일이 ë„무 í˝ë‹ë‹¤." ERROR_FILE_PARTIALLY_UPLOADED: "알 ě 없는 ě¤ëĄëˇś 인해 파일이 부분ě ěśĽëˇśë§Ś 업로드 ëě—습ë‹ë‹¤." ERROR_NO_FILE_UPLOADED: "파일이 업로드ëě§€ 않ě•습ë‹ë‹¤." ERROR_MISSING_TEMP_FOLDER: "임시 업로드 파일을 ě°ľěť„ ě 없습ë‹ë‹¤." ERROR_ON_SAVING_FILE: "알 ě 없는 파일 업로드 ě¤ëĄę°€ ë°śěťí–습ë‹ë‹¤." ERROR_FILE_TYPE: "유효í•ě§€ 않은 파일 í•식" ERROR_UNKNOWN: "알 ě 없는 업로드 ě¤ëĄę°€ ë°śěťí–습ë‹ë‹¤." EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "고급 편집" TEXT_SWITCHER_CONFIRM: "본문 í•식과 이미지가 ě‚­ě śë©ë‹ë‹¤. ě •ë§ ě§„í–‰í•시겠습ë‹ęąŚ?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "개인" LABEL_GENERAL_NAME: "일ë°" LABEL_CONTACTS_NAME: "ě—°ëť˝ě˛" LABEL_FOLDERS_NAME: "폴더" LABEL_ACCOUNTS_NAME: "계정" LABEL_IDENTITY_NAME: "ě‹ ě›" LABEL_IDENTITIES_NAME: "ě‹ ě›" LABEL_FILTERS_NAME: "í•„í„°" LABEL_TEMPLATES_NAME: "템플릿" LABEL_SECURITY_NAME: "ëł´ě•" LABEL_SOCIAL_NAME: "소셜" LABEL_THEMES_NAME: "í…Śë§" LABEL_CHANGE_PASSWORD_NAME: "비밀ë˛í¸" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "뒤로" SETTINGS_FILTERS: LEGEND_FILTERS: "í•„í„°" BUTTON_SAVE: "저장" BUTTON_ADD_FILTER: "í•„í„° 추가" BUTTON_DELETE: "ě‚­ě ś" BUTTON_RAW_SCRIPT: "ě‚¬ěš©ěž ě§€ě • 스í¬ë¦˝íЏ 사용" SUBNAME_NONE: "없음" SUBNAME_MOVE_TO: "\"%FOLDER%\"(으)로 이동" SUBNAME_FORWARD_TO: "\"%EMAIL%\"(으)로 전달" SUBNAME_REJECT: "ę±°ë¶€" SUBNAME_VACATION_MESSAGE: "부재 중 메시지" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "í•„í„° 목록 업데이트 중" DELETING_ASK: "ě •ë§ěž…ë‹ęąŚ?" CHACHES_NEED_TO_BE_SAVED_DESC: "변경사항이 ě„śë˛„ě— ě €ěžĄë어야 í•©ë‹ë‹¤." SETTINGS_IDENTITY: LEGEND_IDENTITY: "ě‹ ě›" LABEL_DISPLAY_NAME: "이름" LABEL_REPLY_TO: "회신 주소" LABEL_SIGNATURE: "서명" LABEL_ADD_SIGNATURE_TO_ALL: "모든 ë°śě‹  ë©”ě‹śě§€ě— ě„śëŞ…ěť„ 추가í•세요" SETTINGS_SECURITY: LEGEND_SECURITY: "ëł´ě•" LABEL_CONFIGURE_TWO_FACTOR: "2단계 인증 설정" LABEL_AUTOLOGOUT: "ěžëŹ™ 로그아ě›" AUTOLOGIN_NEVER_OPTION_NAME: "설정í•ě§€ 않음" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES%ë¶„" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS%시간" SETTINGS_GENERAL: LEGEND_GENERAL: "일ë°" LABEL_LANGUAGE: "언어" LABEL_IDENTITY: "ě‹ ě›" LABEL_LAYOUT: "ë ěť´ě•„ě›" LABEL_LAYOUT_NO_SPLIT: "ë¶„í•  í•´ě ś" LABEL_LAYOUT_VERTICAL_SPLIT: "세로 ë¶„í• " LABEL_LAYOUT_HORIZONTAL_SPLIT: "가로 ë¶„í• " LABEL_EDITOR: "기본 텍스트 편집기" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "평문" LABEL_EDITOR_HTML_FORCED: "HTML (ę°•ě ś ě ěš©)" LABEL_EDITOR_PLAIN_FORCED: "평문 (ę°•ě ś ě ěš©)" LABEL_ANIMATION: "인터íŽěť´ěФ ě• ë‹ë©”ěť´ě…" LABEL_ANIMATION_FULL: "최대 ě• ë‹ë©”ěť´ě…" LABEL_ANIMATION_NORMAL: "보통 ě• ë‹ë©”ěť´ě…" LABEL_ANIMATION_NONE: "없음" LABEL_VIEW_OPTIONS: "보기 ěµě…" LABEL_USE_PREVIEW_PANE: "미리보기 ě°˝ 사용" LABEL_USE_CHECKBOXES_IN_LIST: "목록ě—서 확인ěěž í‘śě‹ś" LABEL_USE_THREADS: "ëŚ€í™”í• ëŞ©ëˇť 사용" LABEL_REPLY_SAME_FOLDER: "회신 메시지를 ě›ëł¸ęłĽ 동일한 폴더 ěś„ěąě— 저장" LABEL_SHOW_IMAGES: "메시지 ëł¸ë¬¸ě— íŹ¬í•¨ëś ě™¸ë¶€ 이미지를 í•­ě 표시" LABEL_SHOW_ANIMATION: "ě• ë‹ë©”ěť´ě… í‘śě‹ś" LABEL_MESSAGE_PER_PAGE: "íŽěť´ě§€ 당 메시지 ę°śě" LABEL_NOTIFICATIONS: "알림" LABEL_SOUND_NOTIFICATION: "소리 알림" LABEL_CHROME_NOTIFICATION_DESC: "ě 메시지 알림 팝업 사용" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ë¸ŚëťĽěš°ě €ě— ěťí•´ 차단ë¨)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contacts" LABEL_CONTACTS_AUTOSAVE: "ě신인을 ěŁĽě†Śëˇťě— ěžëŹ™ěśĽëˇś 추가" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "ě›ę˛© 동기화 활성화" LABEL_CONTACTS_SYNC_SERVER: "서버" LABEL_CONTACTS_SYNC_AB_URL: "주소록 URL" LABEL_CONTACTS_SYNC_USER: "사용ěž" LABEL_CONTACTS_SYNC_PASSWORD: "비밀ë˛í¸" SETTINGS_THEMES: LEGEND_THEMES: "í…Śë§" LEGEND_THEMES_CUSTOM: "ě‚¬ěš©ěž ě§€ě • í…Śë§ ě„¤ě •" LABEL_CUSTOM_TYPE: "ěś í•" LABEL_CUSTOM_TYPE_LIGHT: "밝음" LABEL_CUSTOM_TYPE_DARK: "ě–´ë‘움" LABEL_CUSTOM_BACKGROUND_IMAGE: "배경" BUTTON_UPLOAD_BACKGROUND_IMAGE: "배경 이미지 업로드 (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "파일이 ë„무 í˝ë‹ë‹¤" ERROR_FILE_TYPE_ERROR: "유효í•ě§€ 않은 파일 í•식 (JPG ë는 PNGë§Ś 가능)" ERROR_UNKNOWN: "알 ě 없는 파일 업로드 ě¤ëĄę°€ ë°śěťí–습ë‹ë‹¤." SETTINGS_SOCIAL: LEGEND_GOOGLE: "구글" BUTTON_GOOGLE_CONNECT: "구글 ęł„ě •ě— ě—°ę˛°" BUTTON_GOOGLE_DISCONNECT: "구글 계정 연결 ëŠę¸°" MAIN_GOOGLE_DESC: "구글 ęł„ě •ě— ě—°ę˛°ěť„ 활성화í•ë©´, 로그인 화면ě—서 구글 로그인 버튼을 통해 ěť´ 메일 ęł„ě •ě— ëˇśę·¸ěť¸ í•  ě ěžěеë‹ë‹¤." LEGEND_FACEBOOK: "íŽěť´ěФë¶" BUTTON_FACEBOOK_CONNECT: "íŽěť´ěŠ¤ë¶ ęł„ě •ě— ě—°ę˛°" BUTTON_FACEBOOK_DISCONNECT: "íŽěť´ěŠ¤ë¶ ęł„ě • 연결 ëŠę¸°" MAIN_FACEBOOK_DESC: "íŽěť´ěŠ¤ë¶ ęł„ě •ě— ě—°ę˛°ěť„ 활성화í•ë©´, 로그인 화면ě—서 íŽěť´ěŠ¤ë¶ ëˇśę·¸ěť¸ 버튼을 통해 ěť´ 메일 ęł„ě •ě— ëˇśę·¸ěť¸ í•  ě ěžěеë‹ë‹¤." LEGEND_TWITTER: "트위터" BUTTON_TWITTER_CONNECT: "트위터 ęł„ě •ě— ě—°ę˛°" BUTTON_TWITTER_DISCONNECT: "트위터 계정 연결 ëŠę¸°" MAIN_TWITTER_DESC: "트위터 ęł„ě •ě— ě—°ę˛°ěť„ 활성화í•ë©´, 로그인 화면ě—서 트위터 로그인 버튼을 통해 ěť´ 메일 ęł„ě •ě— ëˇśę·¸ěť¸ í•  ě ěžěеë‹ë‹¤." SETTINGS_FOLDERS: LEGEND_FOLDERS: "폴더 목록" BUTTON_CREATE: "폴더 ěťě„±" BUTTON_SYSTEM: "시스템 폴더" BUTTON_DELETE: "ě‚­ě ś" BUTTON_SUBSCRIBE: "구독" BUTTON_UNSUBSCRIBE: "구독 í•´ě ś" LOADING_PROCESS: "폴더 목록 업데이트 중" CREATING_PROCESS: "폴더 ěťě„± 중" DELETING_PROCESS: "폴더 ě‚­ě ś 중" RENAMING_PROCESS: "폴더명 변경 중" DELETING_ASK: "ě •ë§ěž…ë‹ęąŚ?" TO_MANY_FOLDERS_DESC_1: "폴더가 ë„무 많습ë‹ë‹¤!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "폴더 ě‚­ě ś" HELP_SHOW_HIDE_FOLDER: "폴더 표시/ě¨ę¸°ę¸°" HELP_CHECK_FOR_NEW_MESSAGES: "ě 메시지 확인/확인 취소" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "계정" LEGEND_IDENTITIES: "ě‹ ě›" LEGEND_ACCOUNTS_AND_IDENTITIES: "계정 ë°Ź ě‹ ě›" BUTTON_ADD_ACCOUNT: "계정 추가" BUTTON_ADD_IDENTITY: "ě‹ ě› ě¶”ę°€" BUTTON_DELETE: "ě‚­ě ś" LOADING_PROCESS: "업데이트 중..." DELETING_ASK: "ě •ë§ěž…ë‹ęąŚ?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "ě‹ ě›" LEGEND_IDENTITIES: "ě ě‹ ě› ě¶”ę°€" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "이름" LABEL_REPLY_TO: "회신" LABEL_SIGNATURE: "서명" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" BUTTON_ADD_IDENTITY: "ě‹ ě› ě¶”ę°€" BUTTON_DELETE: "ě‚­ě ś" LOADING_PROCESS: "ě‹ ě› ëŞ©ëˇťěť„ 업데이트í•ęł  ěžěеë‹ë‹¤." DELETING_ASK: "ě •ë§ëˇś ě‚­ě śí•시겠습ë‹ęąŚ?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "비밀ë˛í¸ 변경" LABEL_CURRENT_PASSWORD: "í„재 비밀ë˛í¸" LABEL_NEW_PASSWORD: "ě 비밀ë˛í¸" LABEL_REPEAT_PASSWORD: "비밀ë˛í¸ 재입력" BUTTON_UPDATE_PASSWORD: "비밀ë˛í¸ 변경" ERROR_PASSWORD_MISMATCH: "비밀ë˛í¸ę°€ 일ěąí•ě§€ 않습ë‹ë‹¤. 다시 시도해주세요." SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP 키 가져ě¤ę¸°" BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP 키 ěťě„±" TITLE_PRIVATE: "비공개" TITLE_PUBLIC: "공개" DELETING_ASK: "ě •ë§ěž…ë‹ęąŚ?" GENERATE_ONLY_HTTPS: "HTTPSë§Ś" LABEL_ALLOW_DRAFT_AUTOSAVE: "작성 중인 메시지 ěžëŹ™ 저장" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "키보드 바로가기 도움ë§" TAB_MAILBOX: "메일함" TAB_MESSAGE_LIST: "메시지 목록" TAB_MESSAGE_VIEW: "메시지 화면" TAB_COMPOSE: "쓰기" LABEL_OPEN_USER_DROPDOWN: "ě‚¬ěš©ěž ë“śëˇ­ë‹¤ěš´ 목록 열기" LABEL_REPLY: "회신" LABEL_REPLY_ALL: "전체 회신" LABEL_FORWARD: "전달" LABEL_FORWARD_MULTIPLY: "첨부파일로 전달" LABEL_HELP: "도움ë§" LABEL_CHECK_ALL: "전체 메시지 ě„ íť" LABEL_ARCHIVE: "ëł´ę´€" LABEL_DELETE: "ě‚­ě ś" LABEL_OPEN_THREAD: "ě„ íťí•ś 대화 열기" LABEL_MOVE: "이동" LABEL_READ: "ě„ íťí•ś 메시지 읽음 표시" LABEL_UNREAD: "ě„ íťí•ś 메시지 읽지 않음 표시" LABEL_IMPORTANT: "ě„ íťí•ś 메시지 중요 표시" LABEL_SEARCH: "검ě‰" LABEL_CANCEL_SEARCH: "ę˛€ě‰ ě·¨ě†Ś" LABEL_FULLSCREEN_ENTER: "전체화면 (미리보기 화면 ë ěť´ě•„ě›)" LABEL_VIEW_MESSAGE_ENTER: "메시지 보기 (미리보기 화면 ë ěť´ě•„ě› ě—†ěťŚ)" LABEL_SWITCH_TO_MESSAGE: "ě„ íťí•ś 메시지로 ě´›ě  ě „í™" LABEL_SWITCH_TO_FOLDER_LIST: "폴더 목록으로 ě´›ě  ě „í™" LABEL_FULLSCREEN_TOGGLE: "전체화면 모드 ě „í™" LABEL_BLOCKQUOTES_TOGGLE: "메시지 인용구 ě „í™" LABEL_THREAD_NEXT: "대화ě—서 다음 메시지" LABEL_THREAD_PREV: "대화ě—서 ěť´ě „ 메시지" LABEL_PRINT: "인쇄" LABEL_EXIT_FULLSCREEN: "전체화면 모드 ë‚가기" LABEL_CLOSE_MESSAGE: "메시지 닫기 (미리보기 화면 ë ěť´ě•„ě› ě—†ěťŚ)" LABEL_SWITCH_TO_LIST: "메시지 목록으로 ě´›ě  ě „í™" LABEL_OPEN_COMPOSE_POPUP: "쓰기 팝업 ě°˝ 열기" LABEL_MINIMIZE_COMPOSE_POPUP: "쓰기 팝업 ě°˝ 최소화" LABEL_OPEN_IDENTITIES_DROPDOWN: "ě‹ ě› ë“śëˇ­ë‹¤ěš´ 목록 열기" LABEL_SAVE_MESSAGE: "메시지 저장" LABEL_SEND_MESSAGE: "메시지 보내기" LABEL_CLOSE_COMPOSE: "쓰기 ě°˝ 닫기" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "공개 키를 ě°ľě§€ 못í–습ë‹ë‹¤" NO_PUBLIC_KEYS_FOUND_FOR: "\"%EMAIL%\" ěť´ë©”ěťĽě— ëŚ€í•ś 공개 키를 ě°ľě§€ 못í–습ë‹ë‹¤" NO_PRIVATE_KEY_FOUND: "비공개 키를 ě°ľě§€ 못í–습ë‹ë‹¤" NO_PRIVATE_KEY_FOUND_FOR: "\"%EMAIL%\" ěť´ë©”ěťĽě— ëŚ€í•ś 비공개 키를 ě°ľě§€ 못í–습ë‹ë‹¤" ADD_A_PUBLICK_KEY: "공개 키 추가" SELECT_A_PRIVATE_KEY: "비밀 키 ě„ íť" UNVERIFIRED_SIGNATURE: "미인증 서명" DECRYPTION_ERROR: "OpenPGP ëłµí¸í™” ě¤ëĄ" GOOD_SIGNATURE: "%USER%(으)로부터 ě신한 ě–‘í¸í•ś 서명" PGP_ERROR: "OpenPGP ě¤ëĄ: %ERROR%" SPECIFY_FROM_EMAIL: "보내는 사람 이메일 주소를 지정해주세요" SPECIFY_AT_LEAST_ONE_RECIPIENT: "최소 í•ë‚ěť ě신인을 지정해주세요" NOTIFICATIONS: INVALID_TOKEN: "ěžëŞ»ëś í† í°ěž…ë‹ë‹¤." AUTH_ERROR: "ěť¸ě¦ťě— ě‹¤íŚ¨í–습ë‹ë‹¤" ACCESS_ERROR: "ě ‘ę·Ľ ě¤ëĄ" CONNECTION_ERROR: "ě„śë˛„ě— ě—°ę˛°í•  ě 없습ë‹ë‹¤." CAPTCHA_ERROR: "ëł´ě•문ěžëĄĽ ěžëŞ» ěž…ë Ąí•ě€ěеë‹ë‹¤." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- ěť´ íŽěť´ěŠ¤ë¶ ě•„ěť´ë””ëŠ” ě•„ě§ ě–´ë– í•ś 이메일 계정ě—도 연결ëě§€ 않ě•습ë‹ë‹¤. 이메일 계정으로 로그인 í•ě‹  후 소셜 설정ě—서 소셜 ęł„ě •ě— ě—°ę˛°í•´ěŁĽě„¸ěš”. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- ěť´ 트위터 아이디는 ě•„ě§ ě–´ë– í•ś 이메일 계정ě—도 연결ëě§€ 않ě•습ë‹ë‹¤. 이메일 계정으로 로그인 í•ě‹  후 소셜 설정ě—서 소셜 ęł„ě •ě— ě—°ę˛°í•´ěŁĽě„¸ěš”. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- ěť´ 구글 아이디는 ě•„ě§ ě–´ë– í•ś 이메일 계정ě—도 연결ëě§€ 않ě•습ë‹ë‹¤. 이메일 계정으로 로그인 í•ě‹  후 소셜 설정ě—서 소셜 ęł„ě •ě— ě—°ę˛°í•´ěŁĽě„¸ěš”. DOMAIN_NOT_ALLOWED: "í—ěš©ëś ëŹ„ë©”ěť¸ěť´ ě•„ë‹™ë‹ë‹¤." ACCOUNT_NOT_ALLOWED: "í—ěš©ëś ęł„ě •ěť´ ě•„ë‹™ë‹ë‹¤." ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2단계 인증이 필요합ë‹ë‹¤" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2단계 인증 ě¤ëĄ" COULD_NOT_SAVE_NEW_PASSWORD: "ě 비밀ë˛í¸ëĄĽ 저장í•ě§€ 못í–습ë‹ë‹¤" CURRENT_PASSWORD_INCORRECT: "í„재 비밀ë˛í¸ę°€ 틀립ë‹ë‹¤" NEW_PASSWORD_SHORT: "비밀ë˛í¸ę°€ ë„무 짧습ë‹ë‹¤" NEW_PASSWORD_WEAK: "비밀ë˛í¸ę°€ ëł´ě•ě— ě·¨ě•˝í•©ë‹ë‹¤" NEW_PASSWORD_FORBIDDENT: "비밀ë˛í¸ě— ę¸ě§€ëś 문ěžę°€ 포함ëě–´ ěžěеë‹ë‹¤" CONTACTS_SYNC_ERROR: "ě—°ëť˝ě˛ ëŹ™ę¸°í™” ě¤ëĄ" CANT_GET_MESSAGE_LIST: "메시지 목록을 ë¶ëź¬ ě¬ ě 없습ë‹ë‹¤." CANT_GET_MESSAGE: "메시지를 ę°€ě ¸ě¬ ě 없습ë‹ë‹¤." CANT_DELETE_MESSAGE: "메시지를 ě‚­ě śí•  ě 없습ë‹ë‹¤." CANT_MOVE_MESSAGE: "메시지를 이동할 ě 없습ë‹ë‹¤." CANT_SAVE_MESSAGE: "메시지를 저장할 ě 없습ë‹ë‹¤." CANT_SEND_MESSAGE: "메시지를 보낼 ě 없습ë‹ë‹¤." INVALID_RECIPIENTS: "유효í•ě§€ 않은 ě신인" CANT_SAVE_FILTERS: "필터를 저장할 ě 없습ë‹ë‹¤" CANT_GET_FILTERS: "필터를 ę°€ě ¸ě¬ ě 없습ë‹ë‹¤" FILTERS_ARE_NOT_CORRECT: "í•„í„°ę°€ ě¬ë°”르지 않습ë‹ë‹¤" CANT_CREATE_FOLDER: "폴더를 ěťě„±í•  ě 없습ë‹ë‹¤." CANT_RENAME_FOLDER: "폴더명을 변경할 ě 없습ë‹ë‹¤." CANT_DELETE_FOLDER: "폴더를 ě‚­ě śí•  ě 없습ë‹ë‹¤." CANT_DELETE_NON_EMPTY_FOLDER: "비어ěžě§€ 않은 디렉터리를 ě‚­ě śí•  ě 없습ë‹ë‹¤." CANT_SUBSCRIBE_FOLDER: "폴더를 볼 ě 없습ë‹ë‹¤." CANT_UNSUBSCRIBE_FOLDER: "폴더를 ëł´ěť´ě§€ 않게 í•  ě 없습ë‹ë‹¤." CANT_SAVE_SETTINGS: "설정을 저장할 ě 없습ë‹ë‹¤." CANT_SAVE_PLUGIN_SETTINGS: "설정을 저장할 ě 없습ë‹ë‹¤." DOMAIN_ALREADY_EXISTS: "이미 존재í•는 도메인입ë‹ë‹¤." CANT_INSTALL_PACKAGE: "패키지 설ěąě— 실패í–습ë‹ë‹¤." CANT_DELETE_PACKAGE: "패키지 ě śę±°ě— ě‹¤íŚ¨í–습ë‹ë‹¤." INVALID_PLUGIN_PACKAGE: "ě •ěě ěť¸ 플러그인 패키지가 ě•„ë‹™ë‹ë‹¤." UNSUPPORTED_PLUGIN_PACKAGE: "ëŻ¸ě§€ě› í”Śëź¬ę·¸ěť¸ 패키지" LICENSING_SERVER_IS_UNAVAILABLE: "구독 서버를 사용할 ě 없습ë‹ë‹¤." LICENSING_DOMAIN_EXPIRED: "ěť´ ëŹ„ë©”ěť¸ěť ęµ¬ëŹ…ěť´ 만료ëě—습ë‹ë‹¤." LICENSING_DOMAIN_BANNED: "ěť´ ëŹ„ë©”ěť¸ěť ęµ¬ëŹ…ěť´ ę¸ě§€ëě—습ë‹ë‹¤." DEMO_SEND_MESSAGE_ERROR: "ěť´ 테스트 계정은 외부 메일 발송이 ę¸ě§€ëě–´ěžěеë‹ë‹¤." DEMO_ACCOUNT_ERROR: "ëł´ě•ěť„ 사유로 ěť´ 계정ě—서는 해당 동작이 í—ěš©ëě§€ 않습ë‹ë‹¤." ACCOUNT_ALREADY_EXISTS: "이미 존재í•는 계정입ë‹ë‹¤." ACCOUNT_DOES_NOT_EXIST: "존재í•ě§€ 않는 계정입ë‹ë‹¤" MAIL_SERVER_ERROR: "메일 ě„śë˛„ě— ě—°ę˛°í•는 도중 ě¤ëĄę°€ ë°śěťí–습ë‹ë‹¤." INVALID_INPUT_ARGUMENT: "유효í•ě§€ 않은 input argument" UNKNOWN_ERROR: "알 ě 없는 ě¤ëĄ" STATIC: BACK_LINK: "ě로고침" DOMAIN_LIST_DESC: "ě ‘ę·Ľěť´ í—ę°€ëś ëŹ„ë©”ěť¸ 목록입ë‹ë‹¤." PHP_EXSTENSIONS_ERROR_DESC: "필요한 PHP 확장이 구성ëě§€ 않ě•습ë‹ë‹¤!" PHP_VERSION_ERROR_DESC: "í„재 사용 중인 PHP 버전 (%VERSION%)ěť´ ë„무 낮습ë‹ë‹¤. 최소 5.3.0 ěť´ěěť„ 설ěąí•´ěŁĽě„¸ěš”!" NO_SCRIPT_TITLE: "ěť´ 어플리케이ě…ě—는 ěžë°”스í¬ë¦˝íЏ氀 필요합ë‹ë‹¤" NO_SCRIPT_DESC: |- 사용 중인 브라우저가 ěžë°”스í¬ë¦˝íŠ¸ëĄĽ ě§€ě›í•ě§€ 않습ë‹ë‹¤. 브라우저 설정을 확인í•ě—¬ ěžë°”스í¬ë¦˝íЏ 사용을 활성화í•ęł  다시 시도해주세요. NO_COOKIE_TITLE: "ěť´ 어플리케이ě…ěť„ 사용í•려면 쿠키 사용이 ě§€ě›ë야 í•©ë‹ë‹¤." NO_COOKIE_DESC: |- 사용 중인 브라우저가 쿠키를 ě§€ě›í•ě§€ 않습ë‹ë‹¤. 브라우저 설정을 확인í•ě—¬ 쿠키 사용을 활성화í•ęł  다시 시도해주세요. BAD_BROWSER_TITLE: "사용 중인 브라우저가 구버전입ë‹ë‹¤." BAD_BROWSER_DESC: |- ěť´ 어플리케이ě…ěť„ ě •ěě ěśĽëˇś 사용í•시려면 ě•„ëžěť 브라우저들 중 í•ë‚를 설ěąí•´ěŁĽě„¸ěš”: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/lt_LT.yml000066400000000000000000000774151361462701300262330ustar00rootroot00000000000000lt_LT: LOGIN: LABEL_EMAIL: "E-paštas" LABEL_LOGIN: "Prisijungimo vardas" LABEL_PASSWORD: "SlaptaĹľodis" LABEL_SIGN_ME: "Prisimink mane" LABEL_VERIFICATION_CODE: "Saugos kodas" LABEL_DONT_ASK_VERIFICATION_CODE: "Neklausk saugos kodo kitas 2 savaites" BUTTON_SIGN_IN: "Prisijungti" TITLE_SIGN_IN_GOOGLE: "Prisijungti naudojant Google paskyrÄ…" TITLE_SIGN_IN_FACEBOOK: "Prisijungti naudojant Facebook paskyrÄ…" TITLE_SIGN_IN_TWITTER: "Prisijungti naudojant Twitter paskyrÄ…" LABEL_FORGOT_PASSWORD: "Pamiršau slaptaĹľodÄŻ" LABEL_REGISTRATION: "Registracija" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "PridÄ—ti paskyrÄ…" BUTTON_SETTINGS: "Nustatymai" BUTTON_HELP: "Pagalba" BUTTON_LOGOUT: "Atsijungti" MOBILE: BUTTON_MOBILE_VERSION: "Mobili versija" BUTTON_DESKTOP_VERSION: "StandartinÄ— versija" SEARCH: MAIN_INPUT_PLACEHOLDER: "Paieška" TITLE_ADV: "Detali paieška" LABEL_ADV_FROM: "Nuo" LABEL_ADV_TO: "Kam" LABEL_ADV_SUBJECT: "Tema" LABEL_ADV_TEXT: "Laiško Tekstas" LABEL_ADV_HAS_ATTACHMENT: "Turi priedÄ…" LABEL_ADV_HAS_ATTACHMENTS: "Turi priedÄ…" LABEL_ADV_FLAGGED: "PaĹľymÄ—tas" LABEL_ADV_UNSEEN: "Neskaitytas" LABEL_ADV_DATE: "Data" LABEL_ADV_DATE_ALL: "Visi" LABEL_ADV_DATE_3_DAYS: "Nesenesni kaip 3 dienĹł" LABEL_ADV_DATE_7_DAYS: "Nesenesni kaip 1 savaitÄ—s" LABEL_ADV_DATE_MONTH: "Nesenesni kaip 1 mÄ—nesio" LABEL_ADV_DATE_3_MONTHS: "Nesenesni kaip 3 mÄ—nesiĹł" LABEL_ADV_DATE_6_MONTHS: "Nesenesni kaip 6 mÄ—nesiĹł" LABEL_ADV_DATE_YEAR: "Nesenesni kaip 1 metĹł" BUTTON_ADV_SEARCH: "Ieškoti" PREVIEW_POPUP: FULLSCREEN: "Perjungti viso ekrano reĹľimÄ…" ZOOM: "Didinti / maĹľinti" CLOSE: "UĹľdaryti (Esc)" LOADING: "Kraunasi..." GALLERY_PREV: "Ankstesnis (RodyklÄ— kairÄ—n)" GALLERY_NEXT: "Kitas (RodyklÄ— dešinÄ—n)" GALLERY_COUNTER: "%curr% iš %total%" IMAGE_ERROR: "PaveikslÄ—lis negali bĹ«ti ÄŻkeltas." AJAX_ERROR: "Turinys negalÄ—ji bĹ«ti ÄŻkeltas." FOLDER_LIST: BUTTON_COMPOSE: "Sukurti" BUTTON_CONTACTS: "Kontaktai" BUTTON_NEW_MESSAGE: "Rašyti naujÄ…" INBOX_NAME: "Gautieji" SENT_NAME: "IšsiĹłsti" DRAFTS_NAME: "Juodraščiai" SPAM_NAME: "Ĺ lamštas" TRASH_NAME: "Ĺ iukšlynas" ARCHIVE_NAME: "Archyvas" QUOTA: TITLE: "Kvotos naudojimas" MESSAGE_LIST: BUTTON_RELOAD: "Atnaujinti ĹľinuÄŤiĹł sÄ…rašą" BUTTON_MOVE_TO: "Perkelti ÄŻ" BUTTON_DELETE: "Naikinti" BUTTON_ARCHIVE: "Archyvuoti" BUTTON_SPAM: "Ĺ˝ymÄ—ti kaip šlamštas" BUTTON_NOT_SPAM: "Ne šlamštas" BUTTON_EMPTY_FOLDER: "Valyti katalogÄ…" BUTTON_MULTY_FORWARD: "PersiĹłsti kaip priedÄ…(us)" BUTTON_DELETE_WITHOUT_MOVE: "Naikinti visam laikui" BUTTON_MORE: "Daugiau" MENU_SET_SEEN: "PaĹľymÄ—ti kaip skaitytÄ…" MENU_SET_ALL_SEEN: "PaĹľymÄ—ti visus kaip skaitytus" MENU_UNSET_SEEN: "PaĹľymÄ—ti kaip neskaitytÄ…" MENU_SET_FLAG: "PaĹľymÄ—ti ĹľvaigĹľdute" MENU_UNSET_FLAG: "Panaikinti ĹľymÄ—jimÄ…" MENU_SELECT_ALL: "Visi" MENU_SELECT_NONE: "Nieko" MENU_SELECT_INVERT: "Apversti" MENU_SELECT_UNSEEN: "Neskaityta" MENU_SELECT_SEEN: "Skaityta" MENU_SELECT_FLAGGED: "PaĹľymÄ—ta" MENU_SELECT_UNFLAGGED: "NepaĹľymÄ—ta" EMPTY_LIST: "Tuščias sÄ…rašas." EMPTY_SEARCH_LIST: "NÄ—ra pranešimĹł, atitinkanÄŤiĹł jĹ«sĹł paieškÄ…." SEARCH_RESULT_FOR: "Ieškoti \"%SEARCH%\" rezultatuose" BACK_TO_MESSAGE_LIST: "grÄŻĹľti ÄŻ sÄ…rašą" LIST_LOADING: "Kraunasi" EMPTY_SUBJECT_TEXT: "(Be temos)" PUT_MESSAGE_HERE: "Ä®kelkite ĹľinutÄ™ ÄŤia, kad matytumÄ—te jÄ… sÄ…raše" TODAY_AT: "šiandien %TIME%" YESTERDAY_AT: "vakar %TIME%" SEARCH_PLACEHOLDER: "Ieškoti" NEW_MESSAGE_NOTIFICATION: "JĹ«s turite %COUNT% naujĹł laiškĹł!" QUOTA_SIZE: "Naudojate %SIZE% (%PROC%%) iš savo turimĹł %LIMIT%" MESSAGE: BUTTON_EDIT: "Taisyti" BUTTON_BACK: "Atgal" BUTTON_CLOSE: "UĹľdaryti" BUTTON_DELETE: "Naikinti" BUTTON_UNSUBSCRIBE: "Atsisakyti šios prenumeratos" BUTTON_ARCHIVE: "Archyvas" BUTTON_SPAM: "Ĺ lamštas" BUTTON_NOT_SPAM: "Ne šlamštas" BUTTON_MOVE_TO: "Perkelti ÄŻ" BUTTON_MORE: "Daugiau" BUTTON_REPLY: "Atsakyti" BUTTON_REPLY_ALL: "Atsakyti visiems" BUTTON_FORWARD: "PersiĹłsti" BUTTON_FORWARD_AS_ATTACHMENT: "PersiĹłsti kaip priedÄ…" BUTTON_EDIT_AS_NEW: "Redaguoti kaip naujÄ…" BUTTON_SHOW_IMAGES: "Rodyti išorinius paveikslÄ—lius" BUTTON_NOTIFY_READ_RECEIPT: "SiuntÄ—jas pageidavo bĹ«ti informuotas, kai jĹ«s perskaitysite šį pranešimÄ…." BUTTON_IN_NEW_WINDOW: "PerĹľiĹ«rÄ—ti atskirame lange" BUTTON_THREAD_LIST: "TemĹł sÄ…rašas" BUTTON_THREAD_PREV: "Ankstesnis" BUTTON_THREAD_NEXT: "Kitas" BUTTON_THREAD_MORE: "Daugiau ĹľinuÄŤiĹł" MENU_HEADERS: "Rodyti pranešimĹł antraštÄ—s" MENU_VIEW_ORIGINAL: "Rodyti šaltinÄŻ" MENU_DOWNLOAD_ORIGINAL: "AtsisiĹłsti .eml failÄ…" MENU_FILTER_SIMILAR: "Filtruoti laiškus, kaip šis" MENU_PRINT: "Spausdinti" EMPTY_SUBJECT_TEXT: "(Be temos)" LABEL_SUBJECT: "Tema" LABEL_DATE: "Data" LABEL_FROM: "Nuo" LABEL_FROM_SHORT: "nuo" LABEL_TO: "Kam" LABEL_TO_SHORT: "kam" LABEL_CC: "Kopija" LABEL_BCC: "Nematoma kopija" LABEL_REPLY_TO: "Kam atsakyti" PRINT_LABEL_FROM: "Nuo" PRINT_LABEL_TO: "Kam" PRINT_LABEL_CC: "Kopija" PRINT_LABEL_BCC: "Nematoma kopija" PRINT_LABEL_REPLY_TO: "Kam atsakyti" PRINT_LABEL_DATE: "Data" PRINT_LABEL_SUBJECT: "Tema" PRINT_LABEL_ATTACHMENTS: "Priedai" MESSAGE_LOADING: "Kraunasi" MESSAGE_VIEW_DESC: "Pasirinkite ĹľinutÄ™ sÄ…raše, kad matytumÄ—te jos turinÄŻ ÄŤia." MESSAGE_VIEW_MOVE_DESC: "KairÄ—je pasirinkite katalogÄ…, ÄŻ kurÄŻ norite perkelti." PGP_PASSWORD_INPUT_PLACEHOLDER: "SlaptaĹľodis" PGP_SIGNED_MESSAGE_DESC: "OpenPGP pasirašytas pranešimas (spustelkite patikrinimui)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP šifruotas pranešimas (spustelkite iššifravimui)" LINK_DOWNLOAD_AS_ZIP: "AtsisiĹłsti zip archyvÄ…" LINK_SAVE_TO_OWNCLOUD: "Išsaugoti ÄŻ ownCloud" LINK_SAVE_TO_DROPBOX: "Išsaugoti ÄŻ Dropbox" READ_RECEIPT: SUBJECT: "Pristatymo patvirtinimas (laiškas parodytas) - %SUBJECT%" BODY: | Tai yra laiško pristatymo patvirtinimas, kurÄŻ JĹ«s siuntÄ—te gavÄ—jui %READ-RECEIPT%. Pastaba: Ĺ is pranešimas ÄŻrodo, kad laiškas buvo rodomas gavÄ—jo kompiuteryje. NÄ—ra jokios garantijos, kad gavÄ—jas perskaitÄ— ar suprato laiško turinÄŻ. SUGGESTIONS: SEARCHING_DESC: "Ieškome..." CONTACTS: LEGEND_CONTACTS: "Kontaktai" SEARCH_INPUT_PLACEHOLDER: "Ieškoti" BUTTON_ADD_CONTACT: "PridÄ—ti kontaktÄ…" BUTTON_CREATE_CONTACT: "Sukurti" BUTTON_UPDATE_CONTACT: "Atnaujinti" BUTTON_IMPORT: "Importuoti (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Eksportuoti (vcf, vCard)" BUTTON_EXPORT_CSV: "Eksportuoti (csv)" ERROR_IMPORT_FILE: "Importavimo klaida (neteisingas failo formatas)" LIST_LOADING: "Kraunasi" EMPTY_LIST: "Tuščias sÄ…rašas" EMPTY_SEARCH: "KontaktĹł nerasta" CLEAR_SEARCH: "Išvalyti paieškÄ…" CONTACT_VIEW_DESC: "Pasirinkite kontaktÄ… sÄ…raše, kad matytumÄ—te informacijÄ… ÄŤia." LABEL_DISPLAY_NAME: "Rodomas vardas" LABEL_EMAIL: "E-paštas" LABEL_PHONE: "Telefonas" LABEL_WEB: "Tinklapis" LABEL_BIRTHDAY: "Gimtadienis" LINK_ADD_EMAIL: "PridÄ—ti elektroninio pašto adresÄ…" LINK_ADD_PHONE: "PridÄ—ti telefono Nr." LINK_BIRTHDAY: "Gimtadienis" PLACEHOLDER_ENTER_DISPLAY_NAME: "Ä®veskite rodomÄ… vardÄ…" PLACEHOLDER_ENTER_LAST_NAME: "Ä®veskite pavardÄ™" PLACEHOLDER_ENTER_FIRST_NAME: "Ä®veskite vardÄ…" PLACEHOLDER_ENTER_NICK_NAME: "Ä®veskite slapyvardÄŻ" LABEL_READ_ONLY: "Tik skaitymui" LABEL_SHARE: "Dalintis" ADD_MENU_LABEL: "PridÄ—ti" ADD_MENU_NICKNAME: "Slapyvardis" ADD_MENU_NOTES: "Pastabos" ADD_MENU_EMAIL: "E-paštas" ADD_MENU_PHONE: "Telefono Nr." ADD_MENU_URL: "URL nuoroda" ADD_MENU_ADDRESS: "Adresas" ADD_MENU_BIRTHDAY: "Gimtadienis" ADD_MENU_TAGS: "Ĺ˝ymos" BUTTON_SHARE_NONE: "Nesidalinti" BUTTON_SHARE_ALL: "Visiems" BUTTON_SYNC: "Sinchronizavimas (CardDAV)" COMPOSE: TITLE_FROM: "Nuo" TITLE_TO: "Kam" TITLE_CC: "Kopija" TITLE_BCC: "Nematoma kopija BCC" TITLE_REPLY_TO: "Atsakyti" TITLE_SUBJECT: "Tema" LINK_SHOW_INPUTS: "rodyti visus laukus" BUTTON_SEND: "SiĹłsti" BUTTON_SAVE: "Išsaugoti" BUTTON_DELETE: "Naikinti" BUTTON_CANCEL: "Atšaukti" BUTTON_MINIMIZE: "Minimizuoti" SAVED_TIME: "Išsaugota %TIME%" SAVED_ERROR_ON_SEND: "Pranešimas buvo išsiĹłstas, bet neišsaugotas išsiĹłstĹł kataloge" DISCARD_UNSAVED_DATA: "Atmesti neišsaugotus duomenis?" ATTACH_FILES: "Prisegti failĹł" ATTACH_DROP_FILES_DESC: "Ä®kelkite failus ÄŤia" ATTACH_ITEM_CANCEL: "Atšaukti" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Diskas" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% parašė" FORWARD_MESSAGE_TOP_TITLE: "-------- PersiĹłstas pranešimas -------" FORWARD_MESSAGE_TOP_FROM: "Nuo" FORWARD_MESSAGE_TOP_TO: "Kam" FORWARD_MESSAGE_TOP_CC: "Kopija CC" FORWARD_MESSAGE_TOP_SENT: "IšsiĹłstas" FORWARD_MESSAGE_TOP_SUBJECT: "Tema" EMPTY_TO_ERROR_DESC: "Prašome nurodyti bent vienÄ… gavÄ—jÄ…" NO_ATTACHMENTS_HERE_DESC: "NÄ—ra priedĹł." ATTACHMENTS_ERROR_DESC: "DÄ—mesio! Ne visi priedai buvo ÄŻkelti." ATTACHMENTS_UPLOAD_ERROR_DESC: "Dar ne visi priedai buvo ÄŻkelti" BUTTON_REQUEST_READ_RECEIPT: "Prašyti pranešti kada bus perskaitytas" BUTTON_MARK_AS_IMPORTANT: "Ĺ˝ymÄ—ti svarbiu" BUTTON_OPEN_PGP: "OpenPGP (Tik paprastas tekstas)" BUTTON_REQUEST_DSN: "Prašyti laiško gavimo paĹľymos" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "UĹľdaryti" POPUPS_ASK: BUTTON_YES: "Taip" BUTTON_NO: "Ne" DESC_WANT_CLOSE_THIS_WINDOW: "Ar tikrai norite uĹľdaryti šį langÄ…??" DESC_WANT_DELETE_MESSAGES: "Ar tikrai norite ištrinti pranešimÄ…(us)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Pasirinkite kalbÄ…" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "PridÄ—ti paskyrÄ…?" BUTTON_ADD_ACCOUNT: "PridÄ—ti" TITLE_UPDATE_ACCOUNT: "Atnaujinti paskyrÄ…?" BUTTON_UPDATE_ACCOUNT: "Atnaujinti" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "PridÄ—ti tapatybÄ™?" TITLE_UPDATE_IDENTITY: "Atnaujinti tapatybÄ™?" BUTTON_ADD_IDENTITY: "PridÄ—ti" BUTTON_UPDATE_IDENTITY: "Atnaujinti" LABEL_EMAIL: "E-paštas" LABEL_NAME: "Vardas" LABEL_REPLY_TO: "Atsakyti" LABEL_SIGNATURE: "Parašas" LABEL_CC: "Cc" LABEL_BCC: "Nematoma kopija" LABEL_SIGNATURE_INSERT_BEFORE: "Ä®terpti šį parašą prieš citatÄ… rašant atsakymÄ…" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Sukurti aplankÄ…?" LABEL_NAME: "Aplanko pavadinimas" LABEL_PARENT: "Pirminis katalogas" BUTTON_CREATE: "Sukurti" BUTTON_CANCEL: "Atšaukti" BUTTON_CLOSE: "UĹľdaryti" TITLE_CREATING_PROCESS: "Kuriamas katalogas" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Pašalinti visus pranešimus iš aplanko?" BUTTON_CLEAR: "Išvalyti" BUTTON_CANCEL: "Atšaukti" BUTTON_CLOSE: "UĹľdaryti" DANGER_DESC_WARNING: "DÄ—mesio!" DANGER_DESC_HTML_1: "Ĺ iuo veiksmu JĹ«s panaikinsite viskÄ… iš katalogo %FOLDER%." DANGER_DESC_HTML_2: "PradÄ—jus veiksmÄ…, jis nebesustabdomas." TITLE_CLEARING_PROCESS: "Valomas katalogas..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importuoti OpenPGP raktÄ…" BUTTON_IMPORT_OPEN_PGP_KEY: "Importuoti" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "PerĹľiĹ«rÄ—ti OpenPGP raktÄ…" BUTTON_SELECT: "Pasirinkti" BUTTON_CLOSE: "UĹľdaryti" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Sukurti OpenPGP raktÄ…" LABEL_EMAIL: "E-paštas" LABEL_NAME: "Vardas" LABEL_PASSWORD: "SlaptaĹľodis" LABEL_KEY_BIT_LENGTH: "Rakto ilgis" BUTTON_GENERATE_OPEN_PGP_KEYS: "Sukurti" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Parašas/Ĺ ifravimas" LABEL_SIGN: "Parašas" LABEL_ENCRYPT: "Ĺ ifravimas" LABEL_PASSWORD: "SlaptaĹľodis" BUTTON_SIGN: "Pasirašyti" BUTTON_ENCRYPT: "Ĺ ifruoti" BUTTON_SIGN_AND_ENCRYPT: "Pasirašyti ir šifruoti" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-jĹł ĹľingsniĹł patikrinimo bandymas" LABEL_CODE: "Kodas" BUTTON_TEST: "Bandyti" POPUPS_FILTER: TITLE_CREATE_FILTER: "Sukurti filtrÄ…?" TITLE_EDIT_FILTER: "Atnaujinti filtrÄ…?" FILTER_NAME: "Pavadinimas" LEGEND_CONDITIONS: "SÄ…lygos" LEGEND_ACTIONS: "Veiksmai" BUTTON_DONE: "Atlikta" BUTTON_ADD_CONDITION: "PridÄ—ti sÄ…lygÄ…" SELECT_ACTION_NONE: "Nieko" SELECT_ACTION_MOVE_TO: "Perkelti ÄŻ" SELECT_ACTION_FORWARD_TO: "PersiĹ«sti" SELECT_ACTION_REJECT: "Atmesti" SELECT_ACTION_VACATION_MESSAGE: "AtostogĹł atsakiklis" SELECT_ACTION_DISCARD: "Nepaisyti" SELECT_FIELD_FROM: "Nuo" SELECT_FIELD_RECIPIENTS: "GavÄ—jai (Kam ar CC)" SELECT_FIELD_SUBJECT: "Tema" SELECT_FIELD_HEADER: "AntraštÄ—" SELECT_FIELD_SIZE: "Dydis" SELECT_TYPE_CONTAINS: "Turi" SELECT_TYPE_NOT_CONTAINS: "Neturi" SELECT_TYPE_MATCHES: "Atitinka (* ir ? galioja)" SELECT_TYPE_NOT_MATCHES: "Neatitinka (* ir ? galioja)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Ne Regexp" SELECT_TYPE_EQUAL_TO: "Tiksliai atitinka" SELECT_TYPE_NOT_EQUAL_TO: "Ne tiksliai" SELECT_TYPE_OVER: "Daugiau kaip" SELECT_TYPE_UNDER: "MaĹľiau nei" SELECT_MATCH_ANY: "Atitinka bet kuriÄ… iš šiĹł taisykliĹł" SELECT_MATCH_ALL: "Atitinka visas šias taisykles" MARK_AS_READ_LABEL: "Ĺ˝ymÄ—ti skaitytu" REPLY_INTERVAL_LABEL: "AtsakymĹł intervalai (dienomis)" KEEP_LABEL: "laikyti" STOP_LABEL: "Nesustoti vykdyti taisykles" EMAIL_LABEL: "E-paštas" VACATION_SUBJECT_LABEL: "Tema (nebĹ«tina)" VACATION_MESSAGE_LABEL: "Ĺ˝inutÄ—" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Atmesti ĹľinutÄ™" ALL_INCOMING_MESSAGES_DESC: "Visi ateinantys laiškai" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Pasirinkti sisteminius katalogus" SELECT_CHOOSE_ONE: "Pasirinkite vienÄ…" SELECT_UNUSE_NAME: "Nenaudoti" LABEL_SENT: "SiĹłsti" LABEL_DRAFTS: "Juodraščiai" LABEL_SPAM: "Ĺ lamštas" LABEL_TRASH: "Ĺ iukšliadėžė" LABEL_ARCHIVE: "Archyvas" BUTTON_CANCEL: "Atšaukti" BUTTON_CLOSE: "UĹľdaryti" NOTIFICATION_SENT: | Nepasirinkote "IšsiĹłstieji" katalogo išsiĹłstiems laiškams saugoti. Jei nenorite saugoti laiškĹł po išsiuntimo, pasirinkite "Nenaudoti" variantÄ…. NOTIFICATION_DRAFTS: "Nepasirinkote \"Juodraščiai\" sisteminio katalogo ĹľinutÄ—ms, kurios saugomos kol jas rašote." NOTIFICATION_SPAM: | Nepasirinkote "Ĺ lamštas" sisteminio katalogo laikyti nepageidaujamies laiškams. Jei norite nekaupti šlamšto ir iškart išmesti, pasirinkite "Nenaudoti" variantÄ…. NOTIFICATION_TRASH: | Nepasirinkote "Ĺ iukšliadėžė" sisteminio katalogo ištrintoms ĹľinutÄ—ms. Jei nenorite naudotis šiukšliadÄ—Ĺľe ir išmesti laiškus visam laikui iškart juos trinant, pasirinkite "Nenaudoti" variantÄ…. NOTIFICATION_ARCHIVE: "Nepasirinkote \"Archyvas\" sisteminio katalogo." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-jĹł ĹľingsniĹł patikrinimas" LABEL_ENABLE_TWO_FACTOR: "Ä®jungti 2-jĹł ĹľingsniĹł patikrinimÄ…" LABEL_TWO_FACTOR_USER: "Vartotojas" LABEL_TWO_FACTOR_STATUS: "Statusas" LABEL_TWO_FACTOR_SECRET: "SlaptaĹľodis" LABEL_TWO_FACTOR_BACKUP_CODES: "Sukurti kodĹł atsarginÄ™ kopijÄ…" BUTTON_CREATE: "Sukurti naujÄ… slaptaĹľodÄŻ" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Išvalytis" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "Bandyti" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Rodyti slaptaĹľodÄŻ" BUTTON_HIDE_SECRET: "SlÄ—pti slaptaĹľodÄŻ" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Sukonfiguruota" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nesukonfiguruota" TWO_FACTOR_SECRET_DESC: >- Importuoti šiÄ… informacijÄ… ÄŻ Google autentifikavimo klientÄ… naudojant Ĺľemiau pateiktÄ… QR kodÄ… arba ÄŻveskite kodÄ… rankiniu bĹ«du. TWO_FACTOR_BACKUP_CODES_DESC: >- Jei negaunate kodo per Google autentifikavimo klientÄ…, galite nautotis savo sukurta atsargine kodĹł kopija. Kai panaudosite atsarginÄ™ kopijÄ… prisijungimui, ji taps neaktyvi. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Negalite paksiti šio nustatymo nepratestavÄ™." TITLES: LOADING: "Kraunasi" LOGIN: "Vartotojas" MAILBOX: "Pašto dÄ—ĹľutÄ—" SETTINGS: "Nustatymai" COMPOSE: "Sukurti" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Prisegamas failas per didelis" ERROR_FILE_PARTIALLY_UPLOADED: "DÄ—l neĹľinomos klaidos failas tik dalinai prisegtas" ERROR_NO_FILE_UPLOADED: "NeÄŻkelti failai" ERROR_MISSING_TEMP_FOLDER: "TrĹ«ktsta laikino failo" ERROR_ON_SAVING_FILE: "NeĹľinoma klaida ÄŻkeliant failÄ…" ERROR_FILE_TYPE: "NeleidĹľiamas failo tipas" ERROR_UNKNOWN: "NeĹľinoma klaida ÄŻkeliant failÄ…" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTAS" TEXT_SWITCHER_RICH_FORMATTING: "Raiškusis formatas" TEXT_SWITCHER_CONFIRM: "Teksto farmatas ir paveikslÄ—liai bus prarasti. Tikrai norite tÄ™sti?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Asmeniniai" LABEL_GENERAL_NAME: "Pagrindiniai" LABEL_CONTACTS_NAME: "Kontaktai" LABEL_FOLDERS_NAME: "Katalogai" LABEL_ACCOUNTS_NAME: "Paskyros" LABEL_IDENTITY_NAME: "TapatybÄ—s" LABEL_IDENTITIES_NAME: "TapatybÄ—s" LABEL_FILTERS_NAME: "Filtrai" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Sauga" LABEL_SOCIAL_NAME: "Socialiniai" LABEL_THEMES_NAME: "Temos" LABEL_CHANGE_PASSWORD_NAME: "SlaptaĹľodis" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Atgal" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtrai" BUTTON_SAVE: "Saugoti" BUTTON_ADD_FILTER: "PridÄ—ti filtrÄ…" BUTTON_DELETE: "Naikinti" BUTTON_RAW_SCRIPT: "Naudoti savo sukurtÄ… kodÄ…" SUBNAME_NONE: "Nieko" SUBNAME_MOVE_TO: "Perkelti ÄŻ \"%FOLDER%\"" SUBNAME_FORWARD_TO: "persiĹ«sti \"%EMAIL%\"" SUBNAME_REJECT: "Atmesti" SUBNAME_VACATION_MESSAGE: "AtostogĹł ĹľinutÄ—" SUBNAME_DISCARD: "Nepaisyti" CAPABILITY_LABEL: "GalimybÄ—s" LOADING_PROCESS: "Atnaujinamas filtrĹł sÄ…rašas" DELETING_ASK: "Ar JĹ«s ÄŻsitikinÄ™?" CHACHES_NEED_TO_BE_SAVED_DESC: "Ĺ ios nuostatos turi bĹ«ti išsaugotos serveryje." SETTINGS_IDENTITY: LEGEND_IDENTITY: "TapatybÄ—" LABEL_DISPLAY_NAME: "Vardas" LABEL_REPLY_TO: "Atsakyti" LABEL_SIGNATURE: "Parašas" LABEL_ADD_SIGNATURE_TO_ALL: "PridÄ—ti parašą visiems rašomiems laiškams" SETTINGS_SECURITY: LEGEND_SECURITY: "Sauga" LABEL_CONFIGURE_TWO_FACTOR: "Konfiguruoti 2-ĹľingsniĹł patikrinimÄ…" LABEL_AUTOLOGOUT: "Automatinis atsijungimas" AUTOLOGIN_NEVER_OPTION_NAME: "Niekada" AUTOLOGIN_MINUTES_OPTION_NAME: "po %MINUTES% minuÄŤiĹł" AUTOLOGIN_HOURS_OPTION_NAME: "po %HOURS% valandĹł" SETTINGS_GENERAL: LEGEND_GENERAL: "Pagrindiniai" LABEL_LANGUAGE: "Kalba" LABEL_IDENTITY: "TapatybÄ—" LABEL_LAYOUT: "IšdÄ—stymas" LABEL_LAYOUT_NO_SPLIT: "Skaidymo nÄ—ra" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikalus skaidymas" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontalus skaidymas" LABEL_EDITOR: "Numatytas teksto redaktorius" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Paprastas" LABEL_EDITOR_HTML_FORCED: "Html (priverstinis)" LABEL_EDITOR_PLAIN_FORCED: "Paprastas (priverstinis)" LABEL_ANIMATION: "SÄ…sajos animacija" LABEL_ANIMATION_FULL: "Pilnai" LABEL_ANIMATION_NORMAL: "Normaliai" LABEL_ANIMATION_NONE: "Be animacijos" LABEL_VIEW_OPTIONS: "PerĹľiĹ«ros parinktys" LABEL_USE_PREVIEW_PANE: "Naudokite perĹľiĹ«ros sritÄŻ" LABEL_USE_CHECKBOXES_IN_LIST: "Rodyti ĹľymÄ—jimo langelius sÄ…raše" LABEL_USE_THREADS: "Naudoti gijas" LABEL_REPLY_SAME_FOLDER: "Atsakymus dÄ—ti ÄŻ katalogÄ…, kuriame yra pradinÄ— ĹľinutÄ—" LABEL_SHOW_IMAGES: "Visada rodyti išorinius vaizdus ĹľinutÄ—se" LABEL_SHOW_ANIMATION: "Rodyti animacijÄ…" LABEL_MESSAGE_PER_PAGE: "Ĺ˝inuÄŤiĹł lape" LABEL_NOTIFICATIONS: "Pranešimai" LABEL_SOUND_NOTIFICATION: "Garsinis pranešimas" LABEL_CHROME_NOTIFICATION_DESC: "Rodyti iššokanÄŤius pranešimus apie naujas Ĺľinutes" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokuoja naršyklÄ—)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontaktai" LABEL_CONTACTS_AUTOSAVE: "Automatiškai pridÄ—ti gavÄ—jus ÄŻ adresĹł knygÄ…" LEGEND_CONTACTS_SYNC: "Nuotolinis sinchronizavimas (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Ä®jungti nuotolinÄŻ sinchronizavimÄ…" LABEL_CONTACTS_SYNC_SERVER: "Serveris" LABEL_CONTACTS_SYNC_AB_URL: "AdresĹł knygos URL adresas" LABEL_CONTACTS_SYNC_USER: "Vartotojas" LABEL_CONTACTS_SYNC_PASSWORD: "SlaptaĹľodis" SETTINGS_THEMES: LEGEND_THEMES: "Temos" LEGEND_THEMES_CUSTOM: "Individualizuotos temos konfigĹ«ravimas" LABEL_CUSTOM_TYPE: "Tipas" LABEL_CUSTOM_TYPE_LIGHT: "Ĺ viesi" LABEL_CUSTOM_TYPE_DARK: "Tamsi" LABEL_CUSTOM_BACKGROUND_IMAGE: "Fonas" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Ä®kelti fono paveiksliukÄ… (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Per didelis failas" ERROR_FILE_TYPE_ERROR: "Netinkamas failo tipas (tik JPG ir PNG)" ERROR_UNKNOWN: "NeĹľinoma klaida ÄŻkeliant failÄ…" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Prijungti Google" BUTTON_GOOGLE_DISCONNECT: "Atjungti Google" MAIN_GOOGLE_DESC: "Ä®jungus Google autentikacijÄ…,galÄ—site prisijungti prie šios paskyros naudodami Google mygtukÄ… prisijungimo ekrane." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Prijungti Facebook" BUTTON_FACEBOOK_DISCONNECT: "Atjungti Facebook" MAIN_FACEBOOK_DESC: "Ä®jungus Facebook autentikacijÄ…,galÄ—site prisijungti prie šios paskyros naudodami Facebook mygtukÄ… prisijungimo ekrane." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Prijungti Twitter" BUTTON_TWITTER_DISCONNECT: "Atjungti Twitter" MAIN_TWITTER_DESC: "Ä®jungus Twitter autentikacijÄ…,galÄ—site prisijungti prie šios paskyros naudodami Twitter mygtukÄ… prisijungimo ekrane." SETTINGS_FOLDERS: LEGEND_FOLDERS: "KatalogĹł sÄ…rašas" BUTTON_CREATE: "Sukurti katalogÄ…" BUTTON_SYSTEM: "Sisteminiai katalogai" BUTTON_DELETE: "Pašalinti" BUTTON_SUBSCRIBE: "Prenumeruoti" BUTTON_UNSUBSCRIBE: "Atsisakyti prenumeratos" LOADING_PROCESS: "Atnaujinamas katalogĹł sÄ…rašas" CREATING_PROCESS: "Kuriamas katalogas" DELETING_PROCESS: "Ĺ alinamas katalogas" RENAMING_PROCESS: "Pervardinamas katalogas" DELETING_ASK: "Ar JĹ«s ÄŻsitikinÄ™?" TO_MANY_FOLDERS_DESC_1: "Pas jus per daug katalogĹł!" TO_MANY_FOLDERS_DESC_2: "Mes rodome ne visus juos, kad išvengti našumo problemĹł." HELP_DELETE_FOLDER: "Naikinti katalogÄ…" HELP_SHOW_HIDE_FOLDER: "Rodyti/SlÄ—pti katalogÄ…" HELP_CHECK_FOR_NEW_MESSAGES: "Tikrinti/Netikrinti ar yra naujĹł laiškĹł" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "PaskyrĹł sÄ…rašas" LEGEND_IDENTITIES: "TapatybÄ—s" LEGEND_ACCOUNTS_AND_IDENTITIES: "Paskyros ir tapatybÄ—s" BUTTON_ADD_ACCOUNT: "PridÄ—ti paskyrÄ…" BUTTON_ADD_IDENTITY: "PridÄ—ti tapatybÄ™" BUTTON_DELETE: "Ĺ alinti" LOADING_PROCESS: "Atnaujinamas paskyrĹł sÄ…rašas" DELETING_ASK: "Ar JĹ«s ÄŻsitikinÄ™?" DEFAULT_IDENTITY_LABEL: "numatytasis" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "TapatybÄ—s" LEGEND_IDENTITIES: "Papildomos tapatybÄ—s" LABEL_DEFAULT: "Numatytoji" LABEL_DISPLAY_NAME: "Vardas" LABEL_REPLY_TO: "Atsakyti" LABEL_SIGNATURE: "Parašas" LABEL_ADD_SIGNATURE_TO_ALL: "PridÄ—ti parašą visiems rašomiems laiškams" BUTTON_ADD_IDENTITY: "Sukurti tapatybÄ™" BUTTON_DELETE: "Ĺ alinti" LOADING_PROCESS: "Atnaujinamas tapatybiĹł sÄ…rašas" DELETING_ASK: "Ar JĹ«s ÄŻsitikinÄ™?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Keisti slaptaĹľodÄŻ" LABEL_CURRENT_PASSWORD: "Dabartinis slaptaĹľodis" LABEL_NEW_PASSWORD: "Naujas slaptaĹľodis" LABEL_REPEAT_PASSWORD: "Patvirtinkite naujÄ… slaptaĹľodÄŻ" BUTTON_UPDATE_PASSWORD: "Nustatyti naujÄ… slaptaĹľodÄŻ" ERROR_PASSWORD_MISMATCH: "SlaptaĹľodĹľiai nesutampa, bandykite dar kartÄ…" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importuoti OpenPGP raktÄ…" BUTTON_GENERATE_OPEN_PGP_KEYS: "Sukurti OpenPGP raktus" TITLE_PRIVATE: "Privatus" TITLE_PUBLIC: "Viešas" DELETING_ASK: "JĹ«s ÄŻsitikinÄ™?" GENERATE_ONLY_HTTPS: "HTTPS only" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "SparÄŤiĹłjĹł klavišų pagalba" TAB_MAILBOX: "Pašto dÄ—ĹľutÄ—" TAB_MESSAGE_LIST: "LaiškĹł sÄ…rašas" TAB_MESSAGE_VIEW: "laiško perĹľiĹ«ra" TAB_COMPOSE: "Sukurti" LABEL_OPEN_USER_DROPDOWN: "Išskleisti vartotojo meniu" LABEL_REPLY: "Atsakyti" LABEL_REPLY_ALL: "Atsakyti visiems" LABEL_FORWARD: "PersiĹłsti" LABEL_FORWARD_MULTIPLY: "PersiĹłsti kaip prisegtukÄ…" LABEL_HELP: "Pagalba" LABEL_CHECK_ALL: "Ĺ˝ymÄ—ti visus laiškus" LABEL_ARCHIVE: "Archyvuoti" LABEL_DELETE: "Ĺ alinti" LABEL_OPEN_THREAD: "Atidaryti pasirinktÄ… gijÄ…" LABEL_MOVE: "Perkelti" LABEL_READ: "Pasirinktus ĹľymÄ—ti kaip skaitytus" LABEL_UNREAD: "Pasirinktus ĹľymÄ—ti kaip neskaitytus" LABEL_IMPORTANT: "SvarbĹ«s, ĹľvaigĹľdute paĹľymÄ—ti laiškai" LABEL_SEARCH: "Ieškoti" LABEL_CANCEL_SEARCH: "Atšaukti paieškÄ…" LABEL_FULLSCREEN_ENTER: "Visas ekranas (PerĹľiĹ«ros lauko išdÄ—stymas)" LABEL_VIEW_MESSAGE_ENTER: "Ĺ˝iĹ«rÄ—ti laiškÄ… (Be perĹľiĹ«ros lauko)" LABEL_SWITCH_TO_MESSAGE: "Perjungti ÄŻ pasirinktÄ… laiškÄ…" LABEL_SWITCH_TO_FOLDER_LIST: "Perjungti ÄŻ laiškĹł sÄ…rašą" LABEL_FULLSCREEN_TOGGLE: "Perjungti viso ekrano reĹľimÄ…" LABEL_BLOCKQUOTES_TOGGLE: "Pereiti ÄŻ citatÄ…" LABEL_THREAD_NEXT: "Kita šios gijos ĹľinutÄ—" LABEL_THREAD_PREV: "AnkstesnÄ— šios gijos ĹľinutÄ—" LABEL_PRINT: "Spausdinti" LABEL_EXIT_FULLSCREEN: "Išeiti iš viso ekrano reĹľimo" LABEL_CLOSE_MESSAGE: "UĹľdaryti laiškÄ… (Be perĹľiĹ«ros lauko)" LABEL_SWITCH_TO_LIST: "Perjungti atgal ÄŻ laiškĹł sÄ…rašą" LABEL_OPEN_COMPOSE_POPUP: "Sukurti naujÄ… laiškÄ… atskirame lange" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Atidaryti tapatybiĹł sÄ…rašą" LABEL_SAVE_MESSAGE: "Išsaugoti laiškÄ…" LABEL_SEND_MESSAGE: "SiĹłsti laiškÄ…" LABEL_CLOSE_COMPOSE: "UĹľdaryti laiškÄ…" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Viešų raktĹł nerasta" NO_PUBLIC_KEYS_FOUND_FOR: "Viešų raktĹł nerasta \"%EMAIL%\" laiškui" NO_PRIVATE_KEY_FOUND: "PrivaÄŤiĹł raktĹł nerasta" NO_PRIVATE_KEY_FOUND_FOR: "PrivaÄŤiĹł raktĹł nerasta \"%EMAIL%\" laiškui" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "Parinkti privatĹł raktÄ…" UNVERIFIRED_SIGNATURE: "Nepatikrintas parašas" DECRYPTION_ERROR: "OpenPGP dekodavimo klaida" GOOD_SIGNATURE: "Tinkamas parašas nuo %USER%" PGP_ERROR: "OpenPGP klaida: %ERROR%" SPECIFY_FROM_EMAIL: "Prašome nurodyti NUO e-pašto adresÄ…" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Nurodykite bent vienÄ… gavÄ—jÄ…" NOTIFICATIONS: INVALID_TOKEN: "Neteisingas raktas" AUTH_ERROR: "Autorizacija nepavyko" ACCESS_ERROR: "Prieigos klaida" CONNECTION_ERROR: "Nepavyskta prisijungti prie serverio" CAPTCHA_ERROR: "Neteisingas CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Ĺ is socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant elektroninio pašto rekvizitus ir ÄŻjunkite šiÄ… funkcijÄ… paskyros nustatymuose. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Ĺ is socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant elektroninio pašto rekvizitus ir ÄŻjunkite šiÄ… funkcijÄ… paskyros nustatymuose. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Ĺ is socialinis ID nepriskirtas jokiai e-pašto paskyrai. Prisijunkite naudojant elektroninio pašto rekvizitus ir ÄŻjunkite šiÄ… funkcijÄ… paskyros nustatymuose. DOMAIN_NOT_ALLOWED: "Ĺ is subdomenas neleidĹľiamas" ACCOUNT_NOT_ALLOWED: "Paskyra neleidĹľiama" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "BĹ«tinas dviejĹł veiksniĹł patikrinimas" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "dviejĹł veiksniĹł patikrinimo klaida" COULD_NOT_SAVE_NEW_PASSWORD: "Negaliu išsaugoti slaptaĹľodĹľio" CURRENT_PASSWORD_INCORRECT: "Dabartinis slaptaĹľodis netinkamas" NEW_PASSWORD_SHORT: "SlaptaĹľodis per trumpas" NEW_PASSWORD_WEAK: "SlaptaĹľodis per lengvas" NEW_PASSWORD_FORBIDDENT: "SlaptaĹľodyte bandote naudoti neleistinus simbolius" CONTACTS_SYNC_ERROR: "KontaktĹł sinchronizavimo klaida" CANT_GET_MESSAGE_LIST: "Nepavyksta gauti laiškĹł sÄ…rašo" CANT_GET_MESSAGE: "Nepavyksta gauti laiško" CANT_DELETE_MESSAGE: "Nepavyko pašalinti laiško" CANT_MOVE_MESSAGE: "Nepavyko perkelti laiško" CANT_SAVE_MESSAGE: "Nepavyko išsaugoti laiško" CANT_SEND_MESSAGE: "Nepavyko išsiĹłsti laiško" INVALID_RECIPIENTS: "Netinkamas gavÄ—jas" CANT_SAVE_FILTERS: "Nepavyko išsaugoti filtrĹł" CANT_GET_FILTERS: "Nepavyko gauti filtrĹł" FILTERS_ARE_NOT_CORRECT: "Filtrai neteisingi" CANT_CREATE_FOLDER: "Nepavyksta sukurti katalogo" CANT_RENAME_FOLDER: "Nepavyksta pervadinti katalogo" CANT_DELETE_FOLDER: "Nepavyksta pašalinti katalogo" CANT_DELETE_NON_EMPTY_FOLDER: "Negalima pašalinti ne tuščio katalogo" CANT_SUBSCRIBE_FOLDER: "Nepavyskta uĹľprenumeruoti katalogo" CANT_UNSUBSCRIBE_FOLDER: "Nepavyksta nutraukti katalogo prenumeratos" CANT_SAVE_SETTINGS: "Nepavyksta išsaugoti nustatymĹł" CANT_SAVE_PLUGIN_SETTINGS: "Nepavyksta išsaugoti nustatymĹł" DOMAIN_ALREADY_EXISTS: "Subdomenas jau egzistuoja" CANT_INSTALL_PACKAGE: "Nepavyksta instaliuoti paketo" CANT_DELETE_PACKAGE: "Nepavyksta pašalinti paketo" INVALID_PLUGIN_PACKAGE: "Netinkamas ÄŻskiepio paketas" UNSUPPORTED_PLUGIN_PACKAGE: "Nepalaikomas ÄŻskiepio paketas" LICENSING_SERVER_IS_UNAVAILABLE: "Prenumeratos serveris nepasiekimas" LICENSING_DOMAIN_EXPIRED: "Ĺ io subdomeno prenumeratos laikas baigÄ—si." LICENSING_DOMAIN_BANNED: "Ĺ io subdomeno prenumerata uĹľdrausta." DEMO_SEND_MESSAGE_ERROR: "Saugumo sumetimais, ši demo paskyra neleidĹľia siĹłsti laiškĹł išoriniais e-pašto adresais!" DEMO_ACCOUNT_ERROR: "Saugumo sumetimais, su šia paskyra negalima atlikti norimo veiksmo!" ACCOUNT_ALREADY_EXISTS: "Paskyra jau egzistuoja" ACCOUNT_DOES_NOT_EXIST: "NÄ—ra tokios paskyros" MAIL_SERVER_ERROR: "Klaida bandant pasiekti pašto serverÄŻ" INVALID_INPUT_ARGUMENT: "Neteisingas ÄŻvesties argumentas" UNKNOWN_ERROR: "NeĹľinoma klaida" STATIC: BACK_LINK: "Perkrauti" DOMAIN_LIST_DESC: "LeidĹľiamĹł naudoti subdomenĹł sÄ…rašas." PHP_EXSTENSIONS_ERROR_DESC: "TrĹ«ksta bĹ«tinĹł PHP plÄ—tiniĹł!" PHP_VERSION_ERROR_DESC: "JĹ«sĹł PHP versija (%VERSION%) ĹľemesnÄ—, nei reikalaujama 5.3.0!" NO_SCRIPT_TITLE: "Ĺ iai aplikacijai reikalinga JavaScript." NO_SCRIPT_DESC: | JavaScript nepalaikoma JĹ«sĹł naršyklÄ—je. Ä®junkite JavaScript palaikymÄ… naršyklÄ—je ir bandykite vÄ—l. NO_COOKIE_TITLE: "SlapukĹł palaikymas bĹ«tinas šiai aplikacijai." NO_COOKIE_DESC: | SlapukĹł palaikymas negalimas jĹ«sĹł naršyklÄ—je. Ä®junkite slapukĹł palaikymÄ… naršyklÄ—je ir bandykite vÄ—l. BAD_BROWSER_TITLE: "JĹ«sĹł naršyklÄ— pasenusi." BAD_BROWSER_DESC: | Norint naudotis visais šios aplikacijos privalumais, parsisiĹłskite ir ÄŻsidiekite vienÄ… iš šiĹł naršykliĹł: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/lv_LV.yml000066400000000000000000000731601361462701300262300ustar00rootroot00000000000000lv_LV: LOGIN: LABEL_EMAIL: "E-pasts" LABEL_LOGIN: "Ielogoties" LABEL_PASSWORD: "Parole" LABEL_SIGN_ME: "AtcerÄ“ties mani" LABEL_VERIFICATION_CODE: "AutentifikÄcijas kods" LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" BUTTON_SIGN_IN: "Ielogoties" TITLE_SIGN_IN_GOOGLE: "Ielogoties izmantojot Google" TITLE_SIGN_IN_FACEBOOK: "Ielogoties izmantojot Facebook" TITLE_SIGN_IN_TWITTER: "Ielogoties izmantojot Twitter" LABEL_FORGOT_PASSWORD: "Forgot password" LABEL_REGISTRATION: "Registration" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Pievienot kontu" BUTTON_SETTINGS: "UzstÄdijumi" BUTTON_HELP: "PalÄ«dzÄ«ba" BUTTON_LOGOUT: "Izlogoties" MOBILE: BUTTON_MOBILE_VERSION: "MobilÄ versija" BUTTON_DESKTOP_VERSION: "Darba virsmas versija" SEARCH: MAIN_INPUT_PLACEHOLDER: "MeklÄ“t" TITLE_ADV: "Papildus meklēšana" LABEL_ADV_FROM: "No" LABEL_ADV_TO: "Kam" LABEL_ADV_SUBJECT: "TÄ“ma" LABEL_ADV_TEXT: "Teksts" LABEL_ADV_HAS_ATTACHMENT: "Ir pielikums" LABEL_ADV_HAS_ATTACHMENTS: "Ir pielikumi" LABEL_ADV_FLAGGED: "AtzÄ«mÄ“tie" LABEL_ADV_UNSEEN: "Unseen" LABEL_ADV_DATE: "Datums" LABEL_ADV_DATE_ALL: "Viss periods" LABEL_ADV_DATE_3_DAYS: "LÄ«dz 3 dienas vecs" LABEL_ADV_DATE_7_DAYS: "LÄ«dz 1 nedēļu vecs" LABEL_ADV_DATE_MONTH: "LÄ«dz 1 mÄ“nesi vecs" LABEL_ADV_DATE_3_MONTHS: "LÄ«dz 3 mÄ“nešus vecs" LABEL_ADV_DATE_6_MONTHS: "LÄ«dz 6 mÄ“nešus vecs" LABEL_ADV_DATE_YEAR: "LÄ«dz 1 gadu vecs" BUTTON_ADV_SEARCH: "MeklÄ“t" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "AizvÄ“rt (Esc)" LOADING: "LÄdÄ“jas..." GALLERY_PREV: "IepriekšejÄ (KreisÄ bĹ«ltiņa)" GALLERY_NEXT: "NÄkamÄ (LabÄ bĹ«ltiņa)" GALLERY_COUNTER: "%curr% no %total%" IMAGE_ERROR: "AttÄ“lu nevar ielÄdÄ“t." AJAX_ERROR: "Saturunevar ielÄdÄ“t." FOLDER_LIST: BUTTON_COMPOSE: "RakstÄ«t" BUTTON_CONTACTS: "Kontakti" BUTTON_NEW_MESSAGE: "Jauns ziņojums" INBOX_NAME: "IesĹ«tne" SENT_NAME: "NosĹ«tÄ«tie" DRAFTS_NAME: "Melnraksti" SPAM_NAME: "Spams" TRASH_NAME: "Miskaste" ARCHIVE_NAME: "ArhÄ«vs" QUOTA: TITLE: "Kvotas izmantojums" MESSAGE_LIST: BUTTON_RELOAD: "PÄrlÄdÄ“t ziņojumu sarakstu" BUTTON_MOVE_TO: "PÄrvietot uz" BUTTON_DELETE: "DzÄ“st" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spams" BUTTON_NOT_SPAM: "Not Spam" BUTTON_EMPTY_FOLDER: "IztÄ«rÄ«t mapi" BUTTON_MULTY_FORWARD: "PÄrsĹ«tÄ«t ziņojumus" BUTTON_DELETE_WITHOUT_MOVE: "DzÄ“st pavisam" BUTTON_MORE: "VairÄk" MENU_SET_SEEN: "AtzÄ«mÄ“t kÄ izlasÄ«tu" MENU_SET_ALL_SEEN: "AtzÄ«mÄ“t visu kÄ izlasÄ«tu" MENU_UNSET_SEEN: "AtzÄ«mÄ“t kÄ neizlasÄ«tu" MENU_SET_FLAG: "AtzÄ«mÄ“t" MENU_UNSET_FLAG: "Noņemt atzÄ«mi" MENU_SELECT_ALL: "Viss" MENU_SELECT_NONE: "Neviens" MENU_SELECT_INVERT: "PretÄ“ji" MENU_SELECT_UNSEEN: "NeizlasÄ«ts" MENU_SELECT_SEEN: "IzlasÄ«ts" MENU_SELECT_FLAGGED: "AtzÄ«mÄ“tie" MENU_SELECT_UNFLAGGED: "NoņemtÄs atzÄ«mes" EMPTY_LIST: "Tukšs saraksts." EMPTY_SEARCH_LIST: "Neviens ziņojums neatbilda jĹ«su meklÄ“tajiem kritÄ“rijiem." SEARCH_RESULT_FOR: "Meklēšanas rezultÄti: \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "back to message list" LIST_LOADING: "LÄdÄ“jas" EMPTY_SUBJECT_TEXT: "(Nav virsraksta)" PUT_MESSAGE_HERE: "Ievelciet ziņojumus šeit lai tos apskatÄ«tu." TODAY_AT: "šodien %TIME%" YESTERDAY_AT: "vakardien %TIME%" SEARCH_PLACEHOLDER: "MeklÄ“t" NEW_MESSAGE_NOTIFICATION: "Jums ir %COUNT% jaunas ziņas!" QUOTA_SIZE: "Izmantots %SIZE% (%PROC%%) no %LIMIT%" MESSAGE: BUTTON_EDIT: "Labot" BUTTON_BACK: "AtpakaÄĽ" BUTTON_CLOSE: "AizvÄ“rt" BUTTON_DELETE: "DzÄ“st" BUTTON_UNSUBSCRIBE: "AtrakstÄ«ties no saraksta" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spams" BUTTON_NOT_SPAM: "Not Spam" BUTTON_MOVE_TO: "PÄrvietot uz" BUTTON_MORE: "VairÄk" BUTTON_REPLY: "AtbildÄ“t" BUTTON_REPLY_ALL: "AtbildÄ“t visiem" BUTTON_FORWARD: "PÄrsĹ«tÄ«t" BUTTON_FORWARD_AS_ATTACHMENT: "PÄrsĹ«tÄ«t kÄ pielikumu" BUTTON_EDIT_AS_NEW: "Edit as New" BUTTON_SHOW_IMAGES: "RÄdÄ«t attÄ“lus" BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." BUTTON_IN_NEW_WINDOW: "SkatÄ«t jaunÄ logÄ" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "Previous" BUTTON_THREAD_NEXT: "Next" BUTTON_THREAD_MORE: "More messages" MENU_HEADERS: "RÄdÄ«t ziņojuma galveni" MENU_VIEW_ORIGINAL: "RÄdÄ«t orÄŁinÄlu" MENU_DOWNLOAD_ORIGINAL: "LejuplÄdÄ“t kÄ .eml failu" MENU_FILTER_SIMILAR: "AtfiltrÄ“t šÄdus ziņojumus" MENU_PRINT: "PrintÄ“t" EMPTY_SUBJECT_TEXT: "(Nav tÄ“mas)" LABEL_SUBJECT: "TÄ“ma" LABEL_DATE: "Datums" LABEL_FROM: "No" LABEL_FROM_SHORT: "no" LABEL_TO: "Kam" LABEL_TO_SHORT: "kam" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "No" PRINT_LABEL_TO: "Kam" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "Datums" PRINT_LABEL_SUBJECT: "TÄ“ma" PRINT_LABEL_ATTACHMENTS: "Pielikumi" MESSAGE_LOADING: "LÄdÄ“jÄs" MESSAGE_VIEW_DESC: "IzvÄ“laties ziņojumu no saraksta lai to apskatÄ«tu." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "MeklÄ“..." CONTACTS: LEGEND_CONTACTS: "Kontakti" SEARCH_INPUT_PLACEHOLDER: "MeklÄ“t" BUTTON_ADD_CONTACT: "Pievienot kontaktu" BUTTON_CREATE_CONTACT: "Izveidot" BUTTON_UPDATE_CONTACT: "Atjaunot" BUTTON_IMPORT: "Import (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Import error (invalid file format)" LIST_LOADING: "LÄdÄ“jÄs" EMPTY_LIST: "Nav kontaktu" EMPTY_SEARCH: "Kontakti nav atrasti" CLEAR_SEARCH: "NodzÄ“t meklēšanu" CONTACT_VIEW_DESC: "IzvÄ“laties kontaktu no saraksta lai to apskatÄ«tu." LABEL_DISPLAY_NAME: "Display name" LABEL_EMAIL: "Email" LABEL_PHONE: "Phone" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Birthday" LINK_ADD_EMAIL: "Add an email address" LINK_ADD_PHONE: "Add a phone" LINK_BIRTHDAY: "Birthday" PLACEHOLDER_ENTER_DISPLAY_NAME: "Enter display name" PLACEHOLDER_ENTER_LAST_NAME: "Enter last name" PLACEHOLDER_ENTER_FIRST_NAME: "Enter first name" PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" LABEL_READ_ONLY: "Read only" LABEL_SHARE: "Share" ADD_MENU_LABEL: "Add" ADD_MENU_NICKNAME: "Nickname" ADD_MENU_NOTES: "Notes" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Phone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Address" ADD_MENU_BIRTHDAY: "Birthday" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "None" BUTTON_SHARE_ALL: "Everyone" BUTTON_SYNC: "Synchronization (CardDAV)" COMPOSE: TITLE_FROM: "No" TITLE_TO: "Kam" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Reply To" TITLE_SUBJECT: "TÄ“ma" LINK_SHOW_INPUTS: "rÄdÄ«t visus laukus" BUTTON_SEND: "SĹ«tÄ«t" BUTTON_SAVE: "SaglabÄt" BUTTON_DELETE: "DzÄ“st" BUTTON_CANCEL: "Atcelt" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "SaglabÄts %TIME%" SAVED_ERROR_ON_SEND: "Ziņojums nosĹ«tÄ«ts, bet tas nav saglabÄts izsĹ«tnÄ“." DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "Pievienot failus" ATTACH_DROP_FILES_DESC: "Iemet failus šeit" ATTACH_ITEM_CANCEL: "Atcelt" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% rakstija" FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM: "No" FORWARD_MESSAGE_TOP_TO: "Kam" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "NosĹ«tÄ«ts" FORWARD_MESSAGE_TOP_SUBJECT: "TÄ“ma" EMPTY_TO_ERROR_DESC: "Pievienojat vismaz vienu saņēmÄ“ju" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "JÄ" BUTTON_NO: "NÄ“" DESC_WANT_CLOSE_THIS_WINDOW: "Are you sure you want to close this window?" DESC_WANT_DELETE_MESSAGES: "Are you sure you want to delete the message(s)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Choose your language" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Pievienot kontu?" BUTTON_ADD_ACCOUNT: "Pievienot" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Add Identity?" TITLE_UPDATE_IDENTITY: "Update Identity?" BUTTON_ADD_IDENTITY: "Add" BUTTON_UPDATE_IDENTITY: "Update" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_REPLY_TO: "Reply To" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Izveidot mapi?" LABEL_NAME: "Mapes nosaukums" LABEL_PARENT: "Zem kuras mapes" BUTTON_CREATE: "Izveidot" BUTTON_CANCEL: "Atcelt" BUTTON_CLOSE: "AizvÄ“rt" TITLE_CREATING_PROCESS: "Izveidot mapi" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "IztÄ«rÄ«t visus ziņojumus no šis mapes?" BUTTON_CLEAR: "NotÄ«rÄ«t" BUTTON_CANCEL: "Atcelt" BUTTON_CLOSE: "AizvÄ“rt" DANGER_DESC_WARNING: "BrÄ«dinÄjums!" DANGER_DESC_HTML_1: "Ĺ Ä« darbÄ«ba izdzÄ“sÄ«s visus ziņojumus no %FOLDER% mapes pavisam." DANGER_DESC_HTML_2: "Ĺ o procesu nevarÄ“s apturÄ“t." TITLE_CLEARING_PROCESS: "Mape tiek iztÄ«rÄ«ta..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" BUTTON_SELECT: "Select" BUTTON_CLOSE: "Close" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_PASSWORD: "Password" LABEL_KEY_BIT_LENGTH: "Key length" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "Sign" LABEL_ENCRYPT: "Encrypt" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Sign" BUTTON_ENCRYPT: "Encrypt" BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Step verification test" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Equal To" SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching any of the following rules" SELECT_MATCH_ALL: "Matching all of the following rules" MARK_AS_READ_LABEL: "Mark as read" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subject (optional)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Reject message" ALL_INCOMING_MESSAGES_DESC: "All incoming messages" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "IzvÄ“laties sistÄ“mas mapes" SELECT_CHOOSE_ONE: "IzvÄ“laties vienu" SELECT_UNUSE_NAME: "Nelietot" LABEL_SENT: "NosĹ«tÄ«ts" LABEL_DRAFTS: "Melnraksts" LABEL_SPAM: "Spams" LABEL_TRASH: "Miskaste" LABEL_ARCHIVE: "Archive" BUTTON_CANCEL: "Atcelt" BUTTON_CLOSE: "AizvÄ“rt" NOTIFICATION_SENT: | Tu neesi izvÄ“lÄ“jies "IzsĹ«tne" sistÄ“mas mapi, kurÄ ziņojumi tiek ielikti pÄ“c nosĹ«tīšanas. Ja nevÄ“lie saglabÄt nosĹ«tÄ«to ziņu, lĹ«dzu izvÄ“lies "Nelietot" opciju. NOTIFICATION_DRAFTS: "Tu neesi izvÄ“lÄ“jies \"Melnraksti\" sistemas mapi, kurÄ tiktu saglabÄti ziņojumi, kamÄ“r tie tiek rakstÄ«ti." NOTIFICATION_SPAM: | Tu neesi izvÄ“lÄ“jies "Spams" sistÄ“mas mapi, kurÄ tiks ievietoti spam ziņojumi. Ja tu vÄ“lies izdzÄ“st ziņojumus pavisam, izvÄ“lies "Neizmantot" opciju. NOTIFICATION_TRASH: | Tu neesi izvÄ“lÄ“jies "Miskaste" sistÄ“mas mapi. Ja tu vÄ“lies izdzÄ“st ziņojumus pavisam, izvÄ“lies "Neizmantot" opciju. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" LABEL_TWO_FACTOR_USER: "User" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" BUTTON_CREATE: "Create New Secret" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Clear" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Show Secret" BUTTON_HIDE_SECRET: "Hide Secret" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" TWO_FACTOR_SECRET_DESC: >- Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: >- If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "LÄdÄ“jas" LOGIN: "Ielogoties" MAILBOX: "PastkastÄ«te" SETTINGS: "UzstÄdijumi" COMPOSE: "RakstÄ«t" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Fails ir par lielu" ERROR_FILE_PARTIALLY_UPLOADED: "NezinÄmas kÄĽĹ«das dēļ fails tika ielÄdÄ“ts daÄĽÄ“ji" ERROR_NO_FILE_UPLOADED: "Fails nav ielÄdÄ“ts" ERROR_MISSING_TEMP_FOLDER: "TrĹ«kst tmp mape" ERROR_ON_SAVING_FILE: "NezinÄma faila ielÄdes kÄĽĹ«da" ERROR_FILE_TYPE: "Nepareizs faila tips" ERROR_UNKNOWN: "NezinÄma faila ielÄdes kÄĽĹ«da" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKSTS" TEXT_SWITCHER_RICH_FORMATTING: "Papildus teksta noformÄ“ums" TEXT_SWITCHER_CONFIRM: "Bildes un teksta noformÄ“jums pazudÄ«s. Vai tiešÄm turpinÄt?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "PersonÄ«gie" LABEL_GENERAL_NAME: "VispÄrÄ“jie" LABEL_CONTACTS_NAME: "Contacts" LABEL_FOLDERS_NAME: "Mapes" LABEL_ACCOUNTS_NAME: "Konti" LABEL_IDENTITY_NAME: "Identity" LABEL_IDENTITIES_NAME: "Identities" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Security" LABEL_SOCIAL_NAME: "SociÄlie" LABEL_THEMES_NAME: "TÄ“mas" LABEL_CHANGE_PASSWORD_NAME: "Parole" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "AtpakaÄĽ" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Save" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Delete" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identity" LABEL_DISPLAY_NAME: "VÄrds" LABEL_REPLY_TO: "AtbildÄ“t uz" LABEL_SIGNATURE: "Paraksts" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_CONFIGURE_TWO_FACTOR: "IestatÄ«t 2 soÄĽu autentifikÄciju" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% Stunda(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "VispÄrÄ“jie" LABEL_LANGUAGE: "Valoda" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "Galvenais teksta editors" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Teksts" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "Interface animation" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "None" LABEL_VIEW_OPTIONS: "Apskates opcijas" LABEL_USE_PREVIEW_PANE: "Lietot priekšskatu" LABEL_USE_CHECKBOXES_IN_LIST: "RÄdÄ«t checkboxes sarakstÄ" LABEL_USE_THREADS: "Lietot saraksti" LABEL_REPLY_SAME_FOLDER: "Atbildes ziņojumus ielikt mapÄ“ kurÄ atrodas vÄ“stule uz kuru tiek atbildÄ“ts." LABEL_SHOW_IMAGES: "VienmÄ“r rÄdÄ«t attÄ“lus ziņojumos" LABEL_SHOW_ANIMATION: "RÄdÄ«t animÄciju" LABEL_MESSAGE_PER_PAGE: "Ziņojumi lapÄ" LABEL_NOTIFICATIONS: "Paziņojumi" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "RÄdÄ«t jaunus paziņojumus kÄ izlecošus logus" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ParlĹ«kprogramma bloÄ·Ä“ja)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contacts" LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" LABEL_CONTACTS_SYNC_USER: "User" LABEL_CONTACTS_SYNC_PASSWORD: "Password" SETTINGS_THEMES: LEGEND_THEMES: "TÄ“mas" LEGEND_THEMES_CUSTOM: "TÄ“mas konfigurÄcija" LABEL_CUSTOM_TYPE: "Tips" LABEL_CUSTOM_TYPE_LIGHT: "Gaišs" LABEL_CUSTOM_TYPE_DARK: "Tumšs" LABEL_CUSTOM_BACKGROUND_IMAGE: "Fons" BUTTON_UPLOAD_BACKGROUND_IMAGE: "IelÄdÄ“t fona attÄ“lu (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Fails ir par lielu" ERROR_FILE_TYPE_ERROR: "Nepareizs faila tips (Tikai JPG un PNG)" ERROR_UNKNOWN: "NezinÄma faila ielÄdes kÄĽĹ«da" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Connect Google" BUTTON_GOOGLE_DISCONNECT: "Disconnect Google" MAIN_GOOGLE_DESC: "PÄ“c ieslÄ“gšanas ielogošanos caur Google, tu varÄ“si ielogoties izmantojot Google pogu." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Connect Facebook" BUTTON_FACEBOOK_DISCONNECT: "Disconnect Facebook" MAIN_FACEBOOK_DESC: "PÄ“c ieslÄ“gšanas ielogošanos caur Facebook, tu varÄ“si ielogoties izmantojot Facebook pogu." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Connect Twitter" BUTTON_TWITTER_DISCONNECT: "Disconnect Twitter" MAIN_TWITTER_DESC: "PÄ“c ieslÄ“gšanas ielogošanos caur Twitter, tu varÄ“si ielogoties izmantojot Twitter pogu." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Mapes" BUTTON_CREATE: "Izveidot mapi" BUTTON_SYSTEM: "SistÄ“mas mapes" BUTTON_DELETE: "DzÄ“st" BUTTON_SUBSCRIBE: "AbonÄ“t" BUTTON_UNSUBSCRIBE: "Atcelt abonēšanu" LOADING_PROCESS: "Atjauno mapju sarakstu" CREATING_PROCESS: "Izveidot mapi" DELETING_PROCESS: "DzÄ“st mapi" RENAMING_PROCESS: "PÄrsaukt mapi" DELETING_ASK: "TiešÄm?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Kontu saraksts" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "Pievienot kontu" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "DzÄ“st" LOADING_PROCESS: "Atjauno kontu sarakstu" DELETING_ASK: "TiešÄm?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identity" LEGEND_IDENTITIES: "Additional Identities" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "VÄrds" LABEL_REPLY_TO: "AtbildÄ“t uz" LABEL_SIGNATURE: "Paraksts" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" BUTTON_ADD_IDENTITY: "Add Identity" BUTTON_DELETE: "Delete" LOADING_PROCESS: "Updating identity list" DELETING_ASK: "Are you sure?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "MainÄ«t paroli" LABEL_CURRENT_PASSWORD: "TagadÄ“jÄ parole" LABEL_NEW_PASSWORD: "JaunÄ parole" LABEL_REPEAT_PASSWORD: "JaunÄ parole vÄ“lreiz" BUTTON_UPDATE_PASSWORD: "SaglabÄt paroli" ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" TITLE_PRIVATE: "Private" TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Message list" TAB_MESSAGE_VIEW: "Message view" TAB_COMPOSE: "Compose" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "Reply" LABEL_REPLY_ALL: "Reply All" LABEL_FORWARD: "Forward" LABEL_FORWARD_MULTIPLY: "Forward (multiply)" LABEL_HELP: "Help" LABEL_CHECK_ALL: "Select all messages" LABEL_ARCHIVE: "Archive" LABEL_DELETE: "Delete" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "Move" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" LABEL_IMPORTANT: "SvarÄ«gi, atzÄ«mÄ“t iezÄ«mÄ“tos ziņojumus" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Print" LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" LABEL_SWITCH_TO_LIST: "Switch focus back to message list" LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" LABEL_SAVE_MESSAGE: "Save message" LABEL_SEND_MESSAGE: "Send message" LABEL_CLOSE_COMPOSE: "Close compose" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "IzvÄ“lies privÄto atslÄ“gu" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "Please specify FROM email address" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" NOTIFICATIONS: INVALID_TOKEN: "Nepareizs tokens" AUTH_ERROR: "AutorizÄcija neizdevÄs" ACCESS_ERROR: "PiekÄĽuves kÄĽĹ«da" CONNECTION_ERROR: "Nevar savienoties ar serveri" CAPTCHA_ERROR: "Nepareizs kods" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- SociÄlÄ ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslÄ“dzat šÄdu iespeju uzstÄdijumos. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- SociÄlÄ ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslÄ“dzat šÄdu iespeju uzstÄdijumos. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- SociÄlÄ ID nav pievienot nevienam e-pastam. Ielogojaties ar e-pastu un ieslÄ“dzat šÄdu iespeju uzstÄdijumos. DOMAIN_NOT_ALLOWED: "Ĺ is domÄ“ns nav atÄĽauts" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Nevar ielÄdÄ“t ziņojumu sarakstu" CANT_GET_MESSAGE: "Nevar ielÄdÄ“t ziņojumu" CANT_DELETE_MESSAGE: "Nevar izdzÄ“st ziņojumu" CANT_MOVE_MESSAGE: "Nevar pÄrvietot ziņojumu" CANT_SAVE_MESSAGE: "Nevar saglabÄt ziņojumu" CANT_SEND_MESSAGE: "Nevar nosĹ«tÄ«t ziņojumu" INVALID_RECIPIENTS: "Nepareizi saņēmÄ“ji" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Nevar izveidot mapi" CANT_RENAME_FOLDER: "Nevar pÄrsaukt mapi" CANT_DELETE_FOLDER: "Nevar izdzÄ“st mapi" CANT_DELETE_NON_EMPTY_FOLDER: "Nevar izdzÄ“st pilnu mapi" CANT_SUBSCRIBE_FOLDER: "Nevar pierakstÄ«ties mapei" CANT_UNSUBSCRIBE_FOLDER: "Nevar atrakstÄ«ties mapei" CANT_SAVE_SETTINGS: "Nevar saglabÄt uzstÄdijumus" CANT_SAVE_PLUGIN_SETTINGS: "Nevar saglabÄt uzstÄdijumus" DOMAIN_ALREADY_EXISTS: "Domeņes jau eksistÄ“" CANT_INSTALL_PACKAGE: "NeizdevÄs instÄlÄ“t paku" CANT_DELETE_PACKAGE: "NeizdevÄs nodzÄ“st paku" INVALID_PLUGIN_PACKAGE: "Nepareiza spraudņa paka" UNSUPPORTED_PLUGIN_PACKAGE: "NeatbalstÄ«ta spraudņa paka" LICENSING_SERVER_IS_UNAVAILABLE: "Abonēšanas serveris nav pieejams" LICENSING_DOMAIN_EXPIRED: "Abonēšana šim domÄ“nam ir beigusies." LICENSING_DOMAIN_BANNED: "Abonēšana šim domÄ“nam ir bloÄ·Ä“ta." DEMO_SEND_MESSAGE_ERROR: "Drošīnas iemeslu dēļ, demo konts nedrÄ«ks sĹ«tÄ«t e-pastu uz ÄrÄ“jiem e-pastiem!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Konts jau eksistÄ“" ACCOUNT_DOES_NOT_EXIST: "Konts neeksistÄ“" MAIL_SERVER_ERROR: "RadÄs kÄĽĹ«da savienojoties ar serveri" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "NezinÄma kÄĽĹ«da" STATIC: BACK_LINK: "PÄrlÄdÄ“t" DOMAIN_LIST_DESC: "Saraksts ar atÄĽautajiem domÄ“niem" PHP_EXSTENSIONS_ERROR_DESC: "Nepieciešamie PHP extension nav pieejami jĹ«su PHP konfigurÄcijÄ!" PHP_VERSION_ERROR_DESC: "JĹ«sus PHP versija (%VERSION%) ir zemÄka nekÄ atÄĽauts 5.3.0!" NO_SCRIPT_TITLE: "JavaScript ir nepieciešams." NO_SCRIPT_DESC: | JĹ«su pÄrlĹ«kprogramma neatbalsta JavaScript. LĹ«dzu ieslÄ“dziet JavaScript atbalstu. NO_COOKIE_TITLE: "Cookies atbalsts ir nepieciešams." NO_COOKIE_DESC: | Cookies atbalsts nav pieejams šai pÄrlĹ«kprogrammai. LĹ«dzu ieslÄ“dziet Cookies atbalstu. BAD_BROWSER_TITLE: "JĹ«su pÄrlĹ«kprogramma ir novecojusi." BAD_BROWSER_DESC: | Lai izmantotu pilnas šis aplikÄcijas iespÄ“jas, lejupielÄdÄ“jat un uzinstalÄ“jas kÄdu no šīm pÄrlukprogrammÄm: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml000066400000000000000000000736001361462701300262000ustar00rootroot00000000000000nb_NO: LOGIN: LABEL_EMAIL: "E-postadresse" LABEL_LOGIN: "Logg inn" LABEL_PASSWORD: "Passord" LABEL_SIGN_ME: "Husk meg" LABEL_VERIFICATION_CODE: "Bekreftelseskode" LABEL_DONT_ASK_VERIFICATION_CODE: "Ikke be om kode før om to uker" BUTTON_SIGN_IN: "Logg inn" TITLE_SIGN_IN_GOOGLE: "Logg inn med Google" TITLE_SIGN_IN_FACEBOOK: "Logg inn med Facebook" TITLE_SIGN_IN_TWITTER: "Logg inn med Twitter" LABEL_FORGOT_PASSWORD: "Glemt passord" LABEL_REGISTRATION: "Registrering" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Legg til konto" BUTTON_SETTINGS: "Innstillinger" BUTTON_HELP: "Hjelp" BUTTON_LOGOUT: "Logg ut" MOBILE: BUTTON_MOBILE_VERSION: "Mobilversjon" BUTTON_DESKTOP_VERSION: "Skrivebordsversjon" SEARCH: MAIN_INPUT_PLACEHOLDER: "Søk" TITLE_ADV: "Avansert søk" LABEL_ADV_FROM: "Fra" LABEL_ADV_TO: "Til" LABEL_ADV_SUBJECT: "Emne" LABEL_ADV_TEXT: "Tekst" LABEL_ADV_HAS_ATTACHMENT: "Har vedlegg" LABEL_ADV_HAS_ATTACHMENTS: "Har vedlegg" LABEL_ADV_FLAGGED: "Stjernemerket" LABEL_ADV_UNSEEN: "Ulest" LABEL_ADV_DATE: "Dato" LABEL_ADV_DATE_ALL: "Alle" LABEL_ADV_DATE_3_DAYS: "Inntil 3 dager gamle" LABEL_ADV_DATE_7_DAYS: "Inntil 1 uke gamle" LABEL_ADV_DATE_MONTH: "Inntil 1 mĂĄned gamle" LABEL_ADV_DATE_3_MONTHS: "Inntil 3 mĂĄneder gamle" LABEL_ADV_DATE_6_MONTHS: "Inntil 6 mĂĄneder gamle" LABEL_ADV_DATE_YEAR: "Inntil 1 ĂĄr gamle" BUTTON_ADV_SEARCH: "Søk" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "Lukk (Esc)" LOADING: "Laster inn …" GALLERY_PREV: "Forrige (venstre piltast)" GALLERY_NEXT: "Neste (høyre piltast)" GALLERY_COUNTER: "%curr% av %total%" IMAGE_ERROR: "Klarte ikke ĂĄ laste inn bilde." AJAX_ERROR: "Klarte ikke ĂĄ laste inn innhold." FOLDER_LIST: BUTTON_COMPOSE: "Skriv" BUTTON_CONTACTS: "Kontakter" BUTTON_NEW_MESSAGE: "Ny melding" INBOX_NAME: "Innboks" SENT_NAME: "Sendt" DRAFTS_NAME: "Kladd" SPAM_NAME: "Søppelpost" TRASH_NAME: "Papirkurv" ARCHIVE_NAME: "Arkiv" QUOTA: TITLE: "Kvote bruk" MESSAGE_LIST: BUTTON_RELOAD: "Hent nye meldinger" BUTTON_MOVE_TO: "Flytt til" BUTTON_DELETE: "Slett" BUTTON_ARCHIVE: "Arkiv" BUTTON_SPAM: "Søppelpost" BUTTON_NOT_SPAM: "Ikke søppelpost" BUTTON_EMPTY_FOLDER: "Tøm mappa for meldinger" BUTTON_MULTY_FORWARD: "Videresend meldinger" BUTTON_DELETE_WITHOUT_MOVE: "Slett permanent" BUTTON_MORE: "Mer" MENU_SET_SEEN: "Merk som lest" MENU_SET_ALL_SEEN: "Merk alle som lest" MENU_UNSET_SEEN: "Merk som ulest" MENU_SET_FLAG: "Legg til stjerne" MENU_UNSET_FLAG: "Fjern stjerne" MENU_SELECT_ALL: "Alle" MENU_SELECT_NONE: "Ingen" MENU_SELECT_INVERT: "Inverter" MENU_SELECT_UNSEEN: "Ulest" MENU_SELECT_SEEN: "Lest" MENU_SELECT_FLAGGED: "Stjernemerket" MENU_SELECT_UNFLAGGED: "Ikke stjernemerket" EMPTY_LIST: "Tom liste" EMPTY_SEARCH_LIST: "Søket ga ingen treff." SEARCH_RESULT_FOR: "Søketreff for «%SEARCH%»" BACK_TO_MESSAGE_LIST: "tilbake til meldingsliste" LIST_LOADING: "Laster inn" EMPTY_SUBJECT_TEXT: "(uten emne)" PUT_MESSAGE_HERE: "Dra en melding hit for ĂĄ vise den i lista" TODAY_AT: "i dag, %TIME%" YESTERDAY_AT: "i gĂĄr, %TIME%" SEARCH_PLACEHOLDER: "Søk" NEW_MESSAGE_NOTIFICATION: "Du har %count% nye meldinger" QUOTA_SIZE: "Bruker %SIZE% ( %PROC%% ) av %LIMIT% " MESSAGE: BUTTON_EDIT: "Rediger" BUTTON_BACK: "Tilbake" BUTTON_CLOSE: "Lukk" BUTTON_DELETE: "Slett" BUTTON_UNSUBSCRIBE: "Meld av e-postliste" BUTTON_ARCHIVE: "Arkiv" BUTTON_SPAM: "Søppelpost" BUTTON_NOT_SPAM: "Ikke søppelpost" BUTTON_MOVE_TO: "Flytt til" BUTTON_MORE: "Mer" BUTTON_REPLY: "Svar" BUTTON_REPLY_ALL: "Svar alle" BUTTON_FORWARD: "Videresend" BUTTON_FORWARD_AS_ATTACHMENT: "Videresend som vedlegg" BUTTON_EDIT_AS_NEW: "Endre som ny" BUTTON_SHOW_IMAGES: "Vis eksterne bilder" BUTTON_NOTIFY_READ_RECEIPT: "Avsender har bedt om lesebekreftelse" BUTTON_IN_NEW_WINDOW: "Vis i eget vindu" BUTTON_THREAD_LIST: "TrĂĄdliste" BUTTON_THREAD_PREV: "Forrige" BUTTON_THREAD_NEXT: "Neste" BUTTON_THREAD_MORE: "Flere meldinger" MENU_HEADERS: "Vis meldingshoder" MENU_VIEW_ORIGINAL: "Vis original" MENU_DOWNLOAD_ORIGINAL: "Last ned som .eml-fil" MENU_FILTER_SIMILAR: "Filtrer slike meldinger" MENU_PRINT: "Skriv ut" EMPTY_SUBJECT_TEXT: "(tomt emne)" LABEL_SUBJECT: "Emne" LABEL_DATE: "Dato" LABEL_FROM: "Fra" LABEL_FROM_SHORT: "fra" LABEL_TO: "Til" LABEL_TO_SHORT: "til" LABEL_CC: "Kopi" LABEL_BCC: "Blindkopi" LABEL_REPLY_TO: "Svar til" PRINT_LABEL_FROM: "Fra" PRINT_LABEL_TO: "Til" PRINT_LABEL_CC: "Kopi" PRINT_LABEL_BCC: "Blindkopi" PRINT_LABEL_REPLY_TO: "Svar til" PRINT_LABEL_DATE: "Dato" PRINT_LABEL_SUBJECT: "Emne" PRINT_LABEL_ATTACHMENTS: "Vedlegg" MESSAGE_LOADING: "Laster inn" MESSAGE_VIEW_DESC: "Trykk pĂĄ en melding for ĂĄ lese den" MESSAGE_VIEW_MOVE_DESC: "Trykk pĂĄ mappenavn i panelet til venstre for ĂĄ velge mĂĄl." PGP_PASSWORD_INPUT_PLACEHOLDER: "Passord" PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signert melding (trykk for ĂĄ bekrefte)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-kryptert melding (trykk for ĂĄ dekryptere)" LINK_DOWNLOAD_AS_ZIP: "Last ned som zip-fil" LINK_SAVE_TO_OWNCLOUD: "Lage i Owncloud" LINK_SAVE_TO_CLOUD: "Lagre pĂĄ nett" LINK_SAVE_TO_DROPBOX: "Lagre i Dropbox" READ_RECEIPT: SUBJECT: "Lesebekreftelse (meldinga er lest) - %SUBJECT%" BODY: | Dette er en lesebekreftelse pĂĄ e-postmeldinga du sendte til %READ-RECEIPT%. Merk: Denne bekreftelsen bekrefter bare at meldinga ble ĂĄpnet pĂĄ mottakerens datamaskin, og er ingen garanti for at mottakeren har lest, forstĂĄtt eller er enig i innholdet. SUGGESTIONS: SEARCHING_DESC: "Søker …" CONTACTS: LEGEND_CONTACTS: "Kontakter" SEARCH_INPUT_PLACEHOLDER: "Søk" BUTTON_ADD_CONTACT: "Legg til kontakt" BUTTON_CREATE_CONTACT: "Lag" BUTTON_UPDATE_CONTACT: "Oppdater" BUTTON_IMPORT: "Importer (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Eksporter (vcf, vCard)" BUTTON_EXPORT_CSV: "Eksporter (csv)" ERROR_IMPORT_FILE: "Feil ved importering (ugyldig filformat)" LIST_LOADING: "Laster inn" EMPTY_LIST: "Ingen kontakter" EMPTY_SEARCH: "Fant ingen kontakter" CLEAR_SEARCH: "Tøm søk" CONTACT_VIEW_DESC: "Velg en kontakt i lista" LABEL_DISPLAY_NAME: "Navn" LABEL_EMAIL: "E-post" LABEL_PHONE: "Telefon" LABEL_WEB: "Nettside" LABEL_BIRTHDAY: "Bursdag" LINK_ADD_EMAIL: "Legg til e-postadresse" LINK_ADD_PHONE: "Legg til telefon" LINK_BIRTHDAY: "Bursdag" PLACEHOLDER_ENTER_DISPLAY_NAME: "Visningsnavn" PLACEHOLDER_ENTER_LAST_NAME: "Etternavn" PLACEHOLDER_ENTER_FIRST_NAME: "Fornavn" PLACEHOLDER_ENTER_NICK_NAME: "Kallenavn" LABEL_READ_ONLY: "Skrivebeskyttet" LABEL_SHARE: "Del" ADD_MENU_LABEL: "Legg til" ADD_MENU_NICKNAME: "Kallenavn" ADD_MENU_NOTES: "Notater" ADD_MENU_EMAIL: "E-post" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adresse" ADD_MENU_BIRTHDAY: "Bursdag" ADD_MENU_TAGS: "Tagger" BUTTON_SHARE_NONE: "Ingen" BUTTON_SHARE_ALL: "Alle" BUTTON_SYNC: "Synkronisering (CardDAV)" COMPOSE: TITLE_FROM: "Fra" TITLE_TO: "Til" TITLE_CC: "Kopi" TITLE_BCC: "Blindkopi" TITLE_REPLY_TO: "Svar til" TITLE_SUBJECT: "Emne" LINK_SHOW_INPUTS: "Vis alle felt" BUTTON_SEND: "Send" BUTTON_SAVE: "Lagre" BUTTON_DELETE: "Slett" BUTTON_CANCEL: "Avbryt" BUTTON_MINIMIZE: "Minimer" SAVED_TIME: "Lagret %TIME%" SAVED_ERROR_ON_SEND: "Meldinga er sendt, men ble ikke lagret i mappa for sendte elementer" DISCARD_UNSAVED_DATA: "Vil du forkaste data som ikke er lagret?" ATTACH_FILES: "Legg ved filer" ATTACH_DROP_FILES_DESC: "Slipp filer her" ATTACH_ITEM_CANCEL: "Avbryt" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Disk" REPLY_MESSAGE_TITLE: "%EMAIL% skrev %DATETIME%" FORWARD_MESSAGE_TOP_TITLE: "-------- Videresendt melding -------" FORWARD_MESSAGE_TOP_FROM: "Fra" FORWARD_MESSAGE_TOP_TO: "Til" FORWARD_MESSAGE_TOP_CC: "Kopi" FORWARD_MESSAGE_TOP_SENT: "Sendt" FORWARD_MESSAGE_TOP_SUBJECT: "Emne" EMPTY_TO_ERROR_DESC: "Velg minst Ă©n mottaker" NO_ATTACHMENTS_HERE_DESC: "Ingen vedlegg." ATTACHMENTS_ERROR_DESC: "Advarsel: ett eller flere vedlegg er ikke blitt lastet opp enda." ATTACHMENTS_UPLOAD_ERROR_DESC: "Ett eller flere vedlegg er ikke blitt lastet opp enda" BUTTON_REQUEST_READ_RECEIPT: "Be om en bekreftelse fra mottaker pĂĄ at meldinga er lest" BUTTON_MARK_AS_IMPORTANT: "Marker som viktig" BUTTON_OPEN_PGP: "OpenPGP (kun ren tekst)" BUTTON_REQUEST_DSN: "Be om leveringsbekreftelse" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Lukk" POPUPS_ASK: BUTTON_YES: "Ja" BUTTON_NO: "Nei" DESC_WANT_CLOSE_THIS_WINDOW: "Er du sikker pĂĄ at du vil lukke dette vinduet?" DESC_WANT_DELETE_MESSAGES: "Er du sikker pĂĄ at du vil slette meldingen(e)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Velg sprĂĄk" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Legg til konto" BUTTON_ADD_ACCOUNT: "Legg til" TITLE_UPDATE_ACCOUNT: "Oppdater konto" BUTTON_UPDATE_ACCOUNT: "Oppdater" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Vil du legge til en identitet?" TITLE_UPDATE_IDENTITY: "Oppdater identitet" BUTTON_ADD_IDENTITY: "Legg til" BUTTON_UPDATE_IDENTITY: "Oppdater" LABEL_EMAIL: "E-post" LABEL_NAME: "Navn" LABEL_REPLY_TO: "Svar til" LABEL_SIGNATURE: "Signatur" LABEL_CC: "Kopi" LABEL_BCC: "Blindkopi" LABEL_SIGNATURE_INSERT_BEFORE: "Legg til denne signaturen før sitert tekst" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Vil du lage en mappe?" LABEL_NAME: "Mappenavn" LABEL_PARENT: "Forelder" BUTTON_CREATE: "Lag" BUTTON_CANCEL: "Avbryt" BUTTON_CLOSE: "Lukk" TITLE_CREATING_PROCESS: "Lager mappe" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Vil du slette alle meldinger som ligger i mappa?" BUTTON_CLEAR: "Slett" BUTTON_CANCEL: "Avbryt" BUTTON_CLOSE: "Lukk" DANGER_DESC_WARNING: "Advarsel!" DANGER_DESC_HTML_1: "Du er i ferd med ĂĄ slette alle meldinger i mappa %FOLDER%" DANGER_DESC_HTML_2: "Hvis du gĂĄr videre, blir meldingene slettet for godt." TITLE_CLEARING_PROCESS: "Tømmer mappe …" POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importer OpenPGP-nøkkel" BUTTON_IMPORT_OPEN_PGP_KEY: "Importer" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Vis OpenPGP-nøkkel" BUTTON_SELECT: "Velg" BUTTON_CLOSE: "Lukk" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Lag OpenPGP-nøkler" LABEL_EMAIL: "E-post" LABEL_NAME: "Navn" LABEL_PASSWORD: "Passord" LABEL_KEY_BIT_LENGTH: "Nøkkellengde" BUTTON_GENERATE_OPEN_PGP_KEYS: "Lag" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "Signer/krypter med OpenPGP" LABEL_SIGN: "Signer" LABEL_ENCRYPT: "Krypter" LABEL_PASSWORD: "Passord" BUTTON_SIGN: "Signer" BUTTON_ENCRYPT: "Krypter" BUTTON_SIGN_AND_ENCRYPT: "Signer og krypter" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "Dekrypter med OpenPGP" LABEL_KEY: "Privatnøkkel" LABEL_PASSWORD: "Passord" BUTTON_DECRYPT: "Dekrypter" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "To-stegs-bekreftelsestest" LABEL_CODE: "Kode" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Vil du lage et filter?" TITLE_EDIT_FILTER: "Oppdater filter" FILTER_NAME: "Navn" LEGEND_CONDITIONS: "Betingelser" LEGEND_ACTIONS: "Handlinger" BUTTON_DONE: "Ferdig" BUTTON_ADD_CONDITION: "Legg til betingelse" SELECT_ACTION_NONE: "Ingen" SELECT_ACTION_MOVE_TO: "Flytt til" SELECT_ACTION_FORWARD_TO: "Videresend til" SELECT_ACTION_REJECT: "Avvis" SELECT_ACTION_VACATION_MESSAGE: "Feriemelding" SELECT_ACTION_DISCARD: "Forkast" SELECT_FIELD_FROM: "Fra" SELECT_FIELD_RECIPIENTS: "Hoved- eller kopimottaker" SELECT_FIELD_SUBJECT: "Emne" SELECT_FIELD_HEADER: "Meldingshode" SELECT_FIELD_SIZE: "Størrelse" SELECT_TYPE_CONTAINS: "Inneholder" SELECT_TYPE_NOT_CONTAINS: "Inneholder ikke" SELECT_TYPE_MATCHES: "Samsvarer med («*» og «?» støttes)" SELECT_TYPE_NOT_MATCHES: "Samsvarer ikke med («*» og «?» støttes)" SELECT_TYPE_REGEXP: "Reg.uttrykk" SELECT_TYPE_NOT_REGEXP: "Ikke reg.uttrykk" SELECT_TYPE_EQUAL_TO: "Er lik" SELECT_TYPE_NOT_EQUAL_TO: "Er ikke lik" SELECT_TYPE_OVER: "Større enn" SELECT_TYPE_UNDER: "Mindre enn" SELECT_MATCH_ANY: "Samsvarer med Ă©n av følgende regler" SELECT_MATCH_ALL: "Samsvarer med alle følgende regler" MARK_AS_READ_LABEL: "Merk som lest" REPLY_INTERVAL_LABEL: "Svar-intervall (dager)" KEEP_LABEL: "Behold" STOP_LABEL: "Ikke slutt ĂĄ bruke regler" EMAIL_LABEL: "E-post" VACATION_SUBJECT_LABEL: "Emne (valgfritt)" VACATION_MESSAGE_LABEL: "Melding" VACATION_RECIPIENTS_LABEL: "Mottakere (adskilt med komma)" REJECT_MESSAGE_LABEL: "Avvis melding" ALL_INCOMING_MESSAGES_DESC: "Alle inngĂĄende meldinger" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Velg systemmapper" SELECT_CHOOSE_ONE: "Velg" SELECT_UNUSE_NAME: "Ikke bruk" LABEL_SENT: "Sendt" LABEL_DRAFTS: "Kladd" LABEL_SPAM: "Søppelpost" LABEL_TRASH: "Papirkurv" LABEL_ARCHIVE: "Arkiv" BUTTON_CANCEL: "Avbryt" BUTTON_CLOSE: "Lukk" NOTIFICATION_SENT: | Du har ikke valgt «Sendt» som mappe for sendte meldinger. Velg «Ikke bruk» hvis du ikke vil lagre sendte meldinger. NOTIFICATION_DRAFTS: "Du har ikke valgt «Kladd» som mappe hvor meldinger lagres mens du skriver." NOTIFICATION_SPAM: | Du har ikke valgt «Søppelpost» som mappe for søppelpost. Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. NOTIFICATION_TRASH: | Du har ikke valgt «Papirkurv» som mappe for slettede meldinger. Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. NOTIFICATION_ARCHIVE: "Du har ikke valgt «Arkiv» som mappe for arkiverte meldinger." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "To-stegsbekreftelse" LABEL_ENABLE_TWO_FACTOR: "SlĂĄ pĂĄ to-stegsbekreftelse" LABEL_TWO_FACTOR_USER: "Bruker" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "Reservekoder" BUTTON_CREATE: "Lag ny hemmelig kode" BUTTON_ACTIVATE: "SlĂĄ pĂĄ" BUTTON_CLEAR: "Tøm" BUTTON_LOGOUT: "Logg ut" BUTTON_DONE: "Ferdig" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Vis hemmelig kode" BUTTON_HIDE_SECRET: "Skjul hemmelig kode" TWO_FACTOR_REQUIRE_DESC: "Denne kontoen krever to-stegsbekreftelse." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Satt opp" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ikke satt opp" TWO_FACTOR_SECRET_DESC: >- Importer denne informasjonen til din Google Authenticator klient (eller andre klienter) ved ĂĄ bruke QR-koden under, eller ved ĂĄ skrive inn koden manuelt. TWO_FACTOR_BACKUP_CODES_DESC: >- Hvis du ikke mottar koder fra Google Authenticator, kan du bruke reservekodene for ĂĄ logge inn. Disse kodene kan bare brukes Ă©n gang. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Du kan ikke endre denne innstillinga før du tester den." TITLES: LOADING: "Laster inn" LOGIN: "Logg inn" MAILBOX: "E-post" SETTINGS: "Innstillinger" COMPOSE: "Skriv" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Fila er for stor" ERROR_FILE_PARTIALLY_UPLOADED: "Fila ble delvis lastet opp pĂĄ grunn av ukjent feil" ERROR_NO_FILE_UPLOADED: "Ingen fil lastet opp" ERROR_MISSING_TEMP_FOLDER: "Midlertidig fil mangler" ERROR_ON_SAVING_FILE: "Det oppstod en ukjent feil under opplasting av fil" ERROR_FILE_TYPE: "Ugyldig filtype" ERROR_UNKNOWN: "Det oppstod en ukjent feil under opplasting av fil" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKST" TEXT_SWITCHER_RICH_FORMATTING: "Rik tekst" TEXT_SWITCHER_CONFIRM: "Tekstformatering og bilder gĂĄr tapt. Er du sikker pĂĄ at du vil fortsette?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personlig" LABEL_GENERAL_NAME: "Generelt" LABEL_CONTACTS_NAME: "Kontakter" LABEL_FOLDERS_NAME: "Mapper" LABEL_ACCOUNTS_NAME: "Kontoer" LABEL_IDENTITY_NAME: "Identitet" LABEL_IDENTITIES_NAME: "Identiteter" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Maler" LABEL_SECURITY_NAME: "Sikkerhet" LABEL_SOCIAL_NAME: "Sosialt" LABEL_THEMES_NAME: "Tema" LABEL_CHANGE_PASSWORD_NAME: "Passord" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Tilbake" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtre" BUTTON_SAVE: "Lagre" BUTTON_ADD_FILTER: "Legg til et filter" BUTTON_DELETE: "Slett" BUTTON_RAW_SCRIPT: "Bruk selvvalgt skript" SUBNAME_NONE: "Ingen" SUBNAME_MOVE_TO: "Flytt til «%FOLDER%»" SUBNAME_FORWARD_TO: "Videresend til «%EMAIL%»" SUBNAME_REJECT: "Avvis" SUBNAME_VACATION_MESSAGE: "Feriemelding" SUBNAME_DISCARD: "Forkast" CAPABILITY_LABEL: "Evne" LOADING_PROCESS: "Oppdater filterliste" DELETING_ASK: "Er du sikker?" CHACHES_NEED_TO_BE_SAVED_DESC: "Disse endringene mĂĄ lagres pĂĄ tjeneren." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identitet" LABEL_DISPLAY_NAME: "Navn" LABEL_REPLY_TO: "Svar til" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Vil du legge til signatur i alle utgĂĄende meldinger?" SETTINGS_SECURITY: LEGEND_SECURITY: "Sikkerhet" LABEL_CONFIGURE_TWO_FACTOR: "Sett opp to-stegsbekreftelse" LABEL_AUTOLOGOUT: "Logg ut automatisk etter" AUTOLOGIN_NEVER_OPTION_NAME: "Aldri" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutt(er)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% time(r)" SETTINGS_GENERAL: LEGEND_GENERAL: "Generelt" LABEL_LANGUAGE: "SprĂĄk" LABEL_IDENTITY: "Identitet" LABEL_LAYOUT: "Utforming" LABEL_LAYOUT_NO_SPLIT: "Ingen deling" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikal deling" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontal deling" LABEL_EDITOR: "Standard tekstbehandler" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Ren tekst" LABEL_EDITOR_HTML_FORCED: "Html (tvungen)" LABEL_EDITOR_PLAIN_FORCED: "Ren tekst (tvungen)" LABEL_ANIMATION: "Animasjon av grensesnitt" LABEL_ANIMATION_FULL: "Fullstendig" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Ingen" LABEL_VIEW_OPTIONS: "Vis valg" LABEL_USE_PREVIEW_PANE: "Bruk forhĂĄndsvisningsrute" LABEL_USE_CHECKBOXES_IN_LIST: "Vis avkrysningsbokser i liste" LABEL_USE_THREADS: "Bruk trĂĄder" LABEL_REPLY_SAME_FOLDER: "Legg svar i samme mappe som opprinnelig melding" LABEL_SHOW_IMAGES: "Vis alltid eksterne bilder i meldingstekst" LABEL_SHOW_ANIMATION: "Vis animasjon" LABEL_MESSAGE_PER_PAGE: "Meldinger per side" LABEL_NOTIFICATIONS: "Varsler" LABEL_SOUND_NOTIFICATION: "Lydvarsel" LABEL_CHROME_NOTIFICATION_DESC: "Vis sprettopp-varsel om nye meldinger" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blokkert av nettleser)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakter" LABEL_CONTACTS_AUTOSAVE: "Legg til mottakere i adresseboka automatisk" LEGEND_CONTACTS_SYNC: "Fjernstyrt synkronisering (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "SlĂĄ pĂĄ fjernstyrt synkronisering" LABEL_CONTACTS_SYNC_SERVER: "Tjener" LABEL_CONTACTS_SYNC_AB_URL: "Nettadresse til adressebok" LABEL_CONTACTS_SYNC_USER: "Bruker" LABEL_CONTACTS_SYNC_PASSWORD: "Passord" SETTINGS_THEMES: LEGEND_THEMES: "Tema" LEGEND_THEMES_CUSTOM: "Selvvalgt tema" LABEL_CUSTOM_TYPE: "Type" LABEL_CUSTOM_TYPE_LIGHT: "Lys" LABEL_CUSTOM_TYPE_DARK: "Mørk" LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrunn" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Last opp bakgrunnsbilde (.jpg eller .png)" ERROR_FILE_IS_TOO_BIG: "Fila er for stor (1mb +)" ERROR_FILE_TYPE_ERROR: "Ugyldig filtype (bruk .jpg eller .png)" ERROR_UNKNOWN: "Det oppstod en ukjent feil under opplasting av fil" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Koble til Google" BUTTON_GOOGLE_DISCONNECT: "Koble fra Google" MAIN_GOOGLE_DESC: "NĂĄr du har slĂĄtt pĂĄ innlogging via Google kan du logge inn pĂĄ denne kontoen ved ĂĄ bruke Google-knappen pĂĄ innloggingsskjermen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Koble til Facebook" BUTTON_FACEBOOK_DISCONNECT: "Koble fra Facebook" MAIN_FACEBOOK_DESC: "NĂĄr du har slĂĄtt pĂĄ innlogging via Facebook kan du logge inn pĂĄ denne kontoen ved ĂĄ bruke Facebook-knappen pĂĄ innloggingsskjermen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Koble til Twitter" BUTTON_TWITTER_DISCONNECT: "Koble fra Twitter" MAIN_TWITTER_DESC: "NĂĄr du har slĂĄtt pĂĄ innlogging via Twitter kan du logge inn pĂĄ denne kontoen ved ĂĄ bruke Twitter-knappen pĂĄ innloggingsskjermen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Mappeliste" BUTTON_CREATE: "Lag mappe" BUTTON_SYSTEM: "Systemmapper" BUTTON_DELETE: "Slett" BUTTON_SUBSCRIBE: "Abonner" BUTTON_UNSUBSCRIBE: "Stopp abonnement" LOADING_PROCESS: "Oppdaterer mappeliste" CREATING_PROCESS: "Lager mappe" DELETING_PROCESS: "Sletter mappe" RENAMING_PROCESS: "Endrer navn pĂĄ mappe" DELETING_ASK: "Er du sikker?" TO_MANY_FOLDERS_DESC_1: "Du har for mange mapper!" TO_MANY_FOLDERS_DESC_2: "For ĂĄ unngĂĄ ytelsesproblemer fĂĄr du bare se noen av dem." HELP_DELETE_FOLDER: "Slett mappe" HELP_SHOW_HIDE_FOLDER: "Vis/skjul mappe" HELP_CHECK_FOR_NEW_MESSAGES: "Se/ikke se etter nye meldinger" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Kontoer" LEGEND_IDENTITIES: "Identiteter" LEGEND_ACCOUNTS_AND_IDENTITIES: "Kontoer og identiteter" BUTTON_ADD_ACCOUNT: "Legg til konto" BUTTON_ADD_IDENTITY: "Legg til identitet" BUTTON_DELETE: "Slett" LOADING_PROCESS: "Oppdaterer …" DELETING_ASK: "Er du sikker?" DEFAULT_IDENTITY_LABEL: "Standard" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identitet" LEGEND_IDENTITIES: "Identiteter" LABEL_DEFAULT: "Standard" LABEL_DISPLAY_NAME: "Navn" LABEL_REPLY_TO: "Svar til" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Legg til signatur i alle utgĂĄende meldinger" BUTTON_ADD_IDENTITY: "Legg til identitet" BUTTON_DELETE: "Slett" LOADING_PROCESS: "Oppdaterer identiteter" DELETING_ASK: "Er du sikker?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Endre passord" LABEL_CURRENT_PASSWORD: "Gjeldende passord" LABEL_NEW_PASSWORD: "Nytt passord" LABEL_REPEAT_PASSWORD: "Gjenta passordet" BUTTON_UPDATE_PASSWORD: "Oppdater passord" ERROR_PASSWORD_MISMATCH: "Passordene stemmer ikke overens. Prøv pĂĄ nytt" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importer OpenPGP-nøkkel" BUTTON_GENERATE_OPEN_PGP_KEYS: "Lag OpenPGP-nøkler" TITLE_PRIVATE: "Privat" TITLE_PUBLIC: "Offentlig" DELETING_ASK: "Er du sikker?" GENERATE_ONLY_HTTPS: "Kun HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Lagre utkast automatisk" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Tastatursnarveier" TAB_MAILBOX: "Innboks" TAB_MESSAGE_LIST: "Meldingsliste" TAB_MESSAGE_VIEW: "Meldingsvisning" TAB_COMPOSE: "Skriv ny melding" LABEL_OPEN_USER_DROPDOWN: "Ă…pne brukerliste" LABEL_REPLY: "Svar" LABEL_REPLY_ALL: "Svar alle" LABEL_FORWARD: "Videresend" LABEL_FORWARD_MULTIPLY: "Videresend som vedlegg" LABEL_HELP: "Hjelp" LABEL_CHECK_ALL: "Merk alle meldinger" LABEL_ARCHIVE: "Arkiver" LABEL_DELETE: "Slett" LABEL_OPEN_THREAD: "Ă…pne valgt trĂĄd" LABEL_MOVE: "Flytt" LABEL_READ: "Merk som lest" LABEL_UNREAD: "Merk som ulest" LABEL_IMPORTANT: "Merk valgte meldinger med stjerne" LABEL_SEARCH: "Søk" LABEL_CANCEL_SEARCH: "Avbryt søk" LABEL_FULLSCREEN_ENTER: "Fullskjerm" LABEL_VIEW_MESSAGE_ENTER: "Vis melding" LABEL_SWITCH_TO_MESSAGE: "Flytt fokus til valgt melding" LABEL_SWITCH_TO_FOLDER_LIST: "Flytt fokus til mappeliste" LABEL_FULLSCREEN_TOGGLE: "Fullskjerm-modus" LABEL_BLOCKQUOTES_TOGGLE: "Vis/skjul sitert melding" LABEL_THREAD_NEXT: "Neste melding i trĂĄd" LABEL_THREAD_PREV: "Forrige melding i trĂĄd" LABEL_PRINT: "Skriv ut" LABEL_EXIT_FULLSCREEN: "Avslutt fullskjerm-modus" LABEL_CLOSE_MESSAGE: "Lukk melding" LABEL_SWITCH_TO_LIST: "Flytt fokus til meldingsliste" LABEL_OPEN_COMPOSE_POPUP: "Ny melding i popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Ă…pne identitetsliste" LABEL_SAVE_MESSAGE: "Lagre melding" LABEL_SEND_MESSAGE: "Send melding" LABEL_CLOSE_COMPOSE: "Lukk ny melding" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Fant ingen offentlige nøkler" NO_PUBLIC_KEYS_FOUND_FOR: "Fant ingen offentlige nøkler for «%EMAIL%»" NO_PRIVATE_KEY_FOUND: "Fant ingen privatnøkler" NO_PRIVATE_KEY_FOUND_FOR: "Fant ingen privatnøkler for «%EMAIL%»" ADD_A_PUBLICK_KEY: "Legg til en offentlig nøkkel" SELECT_A_PRIVATE_KEY: "Velg privatnøkkel" UNVERIFIRED_SIGNATURE: "Ubekreftet signatur" DECRYPTION_ERROR: "Feil under OpenPGP-dekryptering" GOOD_SIGNATURE: "Gyldig signatur fra %USER%" PGP_ERROR: "OpenPGP-feil: %ERROR%" SPECIFY_FROM_EMAIL: "Velg avsender-adresse" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Velg minst Ă©n mottaker" NOTIFICATIONS: INVALID_TOKEN: "Ugyldig info" AUTH_ERROR: "Autentisering mislyktes" ACCESS_ERROR: "Tilgangsfeil" CONNECTION_ERROR: "Klarte ikke ĂĄ koble til tjeneren" CAPTCHA_ERROR: "Feil CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Denne kontoen er ikke knyttet til en e-postadresse ennĂĄ. Logg inn med e-postadresse og passord, og slĂĄ pĂĄ denne funksjonen i kontoinnstillingene. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Denne kontoen er ikke knyttet til en e-postadresse ennĂĄ. Logg inn med e-postadresse og passord, og slĂĄ pĂĄ denne funksjonen i kontoinnstillingene. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Denne kontoen er ikke knyttet til en e-postadresse ennĂĄ. Logg inn med e-postadresse og passord, og slĂĄ pĂĄ denne funksjonen i kontoinnstillingene. DOMAIN_NOT_ALLOWED: "Dette domenet tillates ikke" ACCOUNT_NOT_ALLOWED: "Denne kontoen tillates ikke" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "To-stegsbekreftelse kreves" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "To-stegsbekreftelse mislyktes" COULD_NOT_SAVE_NEW_PASSWORD: "Klarte ikke ĂĄ lagre nytt passord" CURRENT_PASSWORD_INCORRECT: "Gjeldende passord er feil" NEW_PASSWORD_SHORT: "Passordet er for kort" NEW_PASSWORD_WEAK: "Passordet er for svakt" NEW_PASSWORD_FORBIDDENT: "Passordet inneholder ugyldige tegn" CONTACTS_SYNC_ERROR: "Synkronisering av kontakter mislyktes" CANT_GET_MESSAGE_LIST: "Klarte ikke ĂĄ hente liste over meldinger" CANT_GET_MESSAGE: "Klarte ikke ĂĄ hente melding" CANT_DELETE_MESSAGE: "Klarte ikke ĂĄ slette melding" CANT_MOVE_MESSAGE: "Klarte ikke ĂĄ flytte melding" CANT_SAVE_MESSAGE: "Klarte ikke ĂĄ lagre melding" CANT_SEND_MESSAGE: "Klarte ikke ĂĄ sende melding" INVALID_RECIPIENTS: "Ugyldige mottakere" CANT_SAVE_FILTERS: "Klarte ikke ĂĄ lagre filtre" CANT_GET_FILTERS: "Klarte ikke ĂĄ hente filtre" FILTERS_ARE_NOT_CORRECT: "Feilutformet filter" CANT_CREATE_FOLDER: "Klarte ikke ĂĄ lage mappe" CANT_RENAME_FOLDER: "Klarte ikke ĂĄ endre navn pĂĄ mappe" CANT_DELETE_FOLDER: "Klarte ikke ĂĄ slette mappe" CANT_DELETE_NON_EMPTY_FOLDER: "Du mĂĄ slette mappeinnholdet før du kan slette mappa" CANT_SUBSCRIBE_FOLDER: "Klarte ikke ĂĄ abonnere pĂĄ mappe" CANT_UNSUBSCRIBE_FOLDER: "Klarte ikke ĂĄ avslutte abonnement" CANT_SAVE_SETTINGS: "Klarte ikke ĂĄ lagre innstillinger" CANT_SAVE_PLUGIN_SETTINGS: "Klarte ikke ĂĄ lagre innstillinger" DOMAIN_ALREADY_EXISTS: "Domenet finnes allerede" CANT_INSTALL_PACKAGE: "Klarte ikke ĂĄ installere pakke" CANT_DELETE_PACKAGE: "Klarte ikke ĂĄ fjerne pakken" INVALID_PLUGIN_PACKAGE: "Ugyldig tilleggspakke" UNSUPPORTED_PLUGIN_PACKAGE: "Denne illeggspakka støttes ikke" LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementstjeneren er utilgjengelig" LICENSING_DOMAIN_EXPIRED: "Abonnementet pĂĄ dette domenet er utløpt." LICENSING_DOMAIN_BANNED: "Abonnementet pĂĄ dette domenet er forbudt." DEMO_SEND_MESSAGE_ERROR: "Denne demo-kontoen er blokkert fra ĂĄ sende meldinger til eksterne e-postadresser av sikkerhetshensyn." DEMO_ACCOUNT_ERROR: "Av sikkerhetshensyn er denne kontoen blokkert fra ĂĄ utføre denne handlinga." ACCOUNT_ALREADY_EXISTS: "Kontoen finnes allerede" ACCOUNT_DOES_NOT_EXIST: "Kontoen finnes ikke" MAIL_SERVER_ERROR: "Fikk ikke tilgang til e-posttjener" INVALID_INPUT_ARGUMENT: "Ugyldig inndata-argument" UNKNOWN_ERROR: "Ukjent feil" STATIC: BACK_LINK: "Oppdater" DOMAIN_LIST_DESC: "Liste over domener som dette webmail-programmet kan fĂĄ tilgang til" PHP_EXSTENSIONS_ERROR_DESC: "PHP-oppsettet ditt mangler en PHP-utvidelse." PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" NO_SCRIPT_TITLE: "Dette programmet krever Javascript." NO_SCRIPT_DESC: | Nettleseren din støtter ikke Javascript. SlĂĄ pĂĄ Javascript-støtte i nettleserens innstillinger, og prøv pĂĄ nytt. NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." NO_COOKIE_DESC: | Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). SlĂĄ pĂĄ cookie-støtte i nettleserens innstillinger, og prøv pĂĄ nytt. BAD_BROWSER_TITLE: "Nettleseren din er utdatert." BAD_BROWSER_DESC: | Hvis du vil bruke alle funksjonene i programmet, mĂĄ du laste ned og installere en av disse nettleserne: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/nl_NL.yml000066400000000000000000000770421361462701300262130ustar00rootroot00000000000000nl_NL: LOGIN: LABEL_EMAIL: "E-mail" LABEL_LOGIN: "Inlognaam" LABEL_PASSWORD: "Wachtwoord" LABEL_SIGN_ME: "Aangemeld blijven" LABEL_VERIFICATION_CODE: "Verificatie Code" LABEL_DONT_ASK_VERIFICATION_CODE: "Vraag 2 weken niet naar code" BUTTON_SIGN_IN: "Aanmelden" TITLE_SIGN_IN_GOOGLE: "Aanmelden met Google" TITLE_SIGN_IN_FACEBOOK: "Aanmelden met Facebook" TITLE_SIGN_IN_TWITTER: "Aanmelden met Twitter" LABEL_FORGOT_PASSWORD: "Wachtwoord vergeten" LABEL_REGISTRATION: "Registratie" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Account toevoegen" BUTTON_SETTINGS: "Instellingen" BUTTON_HELP: "Help" BUTTON_LOGOUT: "Afmelden" MOBILE: BUTTON_MOBILE_VERSION: "Mobiele versie" BUTTON_DESKTOP_VERSION: "Desktop versie" SEARCH: MAIN_INPUT_PLACEHOLDER: "Zoeken" TITLE_ADV: "Geavanceerd zoeken" LABEL_ADV_FROM: "Van" LABEL_ADV_TO: "Naar" LABEL_ADV_SUBJECT: "Onderwerp" LABEL_ADV_TEXT: "Tekst" LABEL_ADV_HAS_ATTACHMENT: "Heeft bijlage" LABEL_ADV_HAS_ATTACHMENTS: "Heeft bijlages" LABEL_ADV_FLAGGED: "Gemarkeerd" LABEL_ADV_UNSEEN: "Ongelezen" LABEL_ADV_DATE: "Datum" LABEL_ADV_DATE_ALL: "Alles" LABEL_ADV_DATE_3_DAYS: "Tot 3 dagen oud" LABEL_ADV_DATE_7_DAYS: "Tot 1 week oud" LABEL_ADV_DATE_MONTH: "Tot 1 maand oud" LABEL_ADV_DATE_3_MONTHS: "Tot 3 maanden oud" LABEL_ADV_DATE_6_MONTHS: "Tot 6 maanden oud" LABEL_ADV_DATE_YEAR: "Tot 1 jaar oud" BUTTON_ADV_SEARCH: "Zoeken" PREVIEW_POPUP: FULLSCREEN: "Schakel volledig scherm in/uit" ZOOM: "Zoom in/uit" CLOSE: "Sluiten (Esc)" LOADING: "Ophalen..." GALLERY_PREV: "Vorige (Linker Pijl toets)" GALLERY_NEXT: "Volgende (Rechter Pijl toets)" GALLERY_COUNTER: "%curr% van %total%" IMAGE_ERROR: "De afbeelding kan niet worden geladen" AJAX_ERROR: "De inhoud kan niet worden geladen" FOLDER_LIST: BUTTON_COMPOSE: "Nieuw bericht" BUTTON_CONTACTS: "Contactpersonen" BUTTON_NEW_MESSAGE: "Nieuw bericht" INBOX_NAME: "Postvak IN" SENT_NAME: "Verzonden items" DRAFTS_NAME: "Concepten" SPAM_NAME: "Ongewenste e-mail" TRASH_NAME: "Verwijderde items" ARCHIVE_NAME: "Archief" QUOTA: TITLE: "Quota gebruik" MESSAGE_LIST: BUTTON_RELOAD: "Berichten controleren" BUTTON_MOVE_TO: "Verplaatsen" BUTTON_DELETE: "Verwijderen" BUTTON_ARCHIVE: "Archiveren" BUTTON_SPAM: "Ongewenste e-mail" BUTTON_NOT_SPAM: "Geen ongewenste e-mail" BUTTON_EMPTY_FOLDER: "Map leegmaken" BUTTON_MULTY_FORWARD: "Doorsturen als bijlage(n)" BUTTON_DELETE_WITHOUT_MOVE: "Permanent verwijderen" BUTTON_MORE: "Meer" MENU_SET_SEEN: "Markeer als gelezen" MENU_SET_ALL_SEEN: "Markeer alles als gelezen" MENU_UNSET_SEEN: "Markeer als ongelezen" MENU_SET_FLAG: "Vlag" MENU_UNSET_FLAG: "Vlag verwijderen" MENU_SELECT_ALL: "Alle" MENU_SELECT_NONE: "Geen" MENU_SELECT_INVERT: "Selectie omkeren" MENU_SELECT_UNSEEN: "Ongelezen" MENU_SELECT_SEEN: "Gelezen" MENU_SELECT_FLAGGED: "Met Vlag" MENU_SELECT_UNFLAGGED: "Zonder Vlag" EMPTY_LIST: "Geen berichten" EMPTY_SEARCH_LIST: "Geen items gevonden" SEARCH_RESULT_FOR: "Zoekresultaten voor\"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "terug naar berichtenlijst" LIST_LOADING: "Ophalen..." EMPTY_SUBJECT_TEXT: "(Geen onderwerp)" PUT_MESSAGE_HERE: "Sleep bericht hier om ze te bekijken in de lijst" TODAY_AT: "vandaag om %TIME%" YESTERDAY_AT: "gisteren om %TIME%" SEARCH_PLACEHOLDER: "Zoeken" NEW_MESSAGE_NOTIFICATION: "U heeft %COUNT% nieuwe berichten!" QUOTA_SIZE: "U gebruikt %SIZE% (%PROC%%) van %LIMIT%" MESSAGE: BUTTON_EDIT: "Aanpassen" BUTTON_BACK: "Terug" BUTTON_CLOSE: "Sluiten" BUTTON_DELETE: "Verwijderen" BUTTON_UNSUBSCRIBE: "Abonnement op deze e-mail lijst opzeggen" BUTTON_ARCHIVE: "Archiveren" BUTTON_SPAM: "Ongewenste e-mail" BUTTON_NOT_SPAM: "Geen ongewenste e-mail" BUTTON_MOVE_TO: "Verplaatsen" BUTTON_MORE: "Meer" BUTTON_REPLY: "Beantwoorden" BUTTON_REPLY_ALL: "Allen beantwoorden" BUTTON_FORWARD: "Doorsturen" BUTTON_FORWARD_AS_ATTACHMENT: "Doorsturen als bijlage" BUTTON_EDIT_AS_NEW: "Bewerken om opnieuw te verzenden" BUTTON_SHOW_IMAGES: "Toon afbeeldingen" BUTTON_NOTIFY_READ_RECEIPT: "De afzender heeft om een leesbevestiging gevraagd" BUTTON_IN_NEW_WINDOW: "Toon in nieuw venster" BUTTON_THREAD_LIST: "Groep lijst" BUTTON_THREAD_PREV: "Vorige" BUTTON_THREAD_NEXT: "Volgende" BUTTON_THREAD_MORE: "Meer berichten" MENU_HEADERS: "Toon berichtkoppen" MENU_VIEW_ORIGINAL: "Toon origineel" MENU_DOWNLOAD_ORIGINAL: "Download als .eml bestand" MENU_FILTER_SIMILAR: "Filter gelijksoortige berichten" MENU_PRINT: "Afdrukken" EMPTY_SUBJECT_TEXT: "(Geen onderwerp)" LABEL_SUBJECT: "Onderwerp" LABEL_DATE: "Datum" LABEL_FROM: "Van" LABEL_FROM_SHORT: "van" LABEL_TO: "Naar" LABEL_TO_SHORT: "naar" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Antwoordadres" PRINT_LABEL_FROM: "Van" PRINT_LABEL_TO: "Naar" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Antwoordadres" PRINT_LABEL_DATE: "Datum" PRINT_LABEL_SUBJECT: "Onderwerp" PRINT_LABEL_ATTACHMENTS: "Bijlagen" MESSAGE_LOADING: "Bericht ophalen" MESSAGE_VIEW_DESC: "Selecteer een bericht in de lijst om hier te bekijken" MESSAGE_VIEW_MOVE_DESC: "Klik op de doel map in het linker paneel." PGP_PASSWORD_INPUT_PLACEHOLDER: "Wachtwoord" PGP_SIGNED_MESSAGE_DESC: "OpenPGP ondertekend bericht (klik om te verifiĂ«ren)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP versleuteld bericht (klik om te ontsleutelen)" LINK_DOWNLOAD_AS_ZIP: "Download als zip" LINK_SAVE_TO_OWNCLOUD: "Sla op in ownCloud" LINK_SAVE_TO_DROPBOX: "Sla op in Dropbox" READ_RECEIPT: SUBJECT: "Ontvangstbevestiging (weergegeven) - %SUBJECT%" BODY: | Dit is een bevestiging dat uw bericht aan %READ-RECEIPT% is ontvangen. Let op: Deze ontvangstbevestiging bevestigd slechts dat uw bericht was weergegeven op het scherm van de ontvanger. Er is geen enkele garantie dat uw bericht is gelezen of begrepen. SUGGESTIONS: SEARCHING_DESC: "Zoeken..." CONTACTS: LEGEND_CONTACTS: "Contactpersonen" SEARCH_INPUT_PLACEHOLDER: "Zoeken" BUTTON_ADD_CONTACT: "Contactpersoon Toevoegen" BUTTON_CREATE_CONTACT: "Toevoegen" BUTTON_UPDATE_CONTACT: "Bijwerken" BUTTON_IMPORT: "Importeer (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exporteer (vcf, vCard)" BUTTON_EXPORT_CSV: "Exporteer (csv)" ERROR_IMPORT_FILE: "Fout bij importeren (ongeldige bestandsindeling)" LIST_LOADING: "Ophalen..." EMPTY_LIST: "Geen contactpersonen" EMPTY_SEARCH: "Geen items gevonden" CLEAR_SEARCH: "Wis zoekopdracht" CONTACT_VIEW_DESC: "Selecteer een contactpersoon in de lijst om hier te bekijken" LABEL_DISPLAY_NAME: "Weergeven als" LABEL_EMAIL: "E-mail adres" LABEL_PHONE: "Telefoon" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Geboortedatum" LINK_ADD_EMAIL: "E-mail adres toevoegen" LINK_ADD_PHONE: "Telefoonnummer toevoegen" LINK_BIRTHDAY: "Geboortedatum" PLACEHOLDER_ENTER_DISPLAY_NAME: "Weergeven als" PLACEHOLDER_ENTER_LAST_NAME: "Achternaam" PLACEHOLDER_ENTER_FIRST_NAME: "Voornaam" PLACEHOLDER_ENTER_NICK_NAME: "Bijnaam" LABEL_READ_ONLY: "Alleen lezen" LABEL_SHARE: "Deel" ADD_MENU_LABEL: "Toevoegen" ADD_MENU_NICKNAME: "Bijnaam" ADD_MENU_NOTES: "Notities" ADD_MENU_EMAIL: "E-mail adres" ADD_MENU_PHONE: "Telefoonnummer" ADD_MENU_URL: "Webpagina" ADD_MENU_ADDRESS: "Adres" ADD_MENU_BIRTHDAY: "Geboortedatum" ADD_MENU_TAGS: "Labels" BUTTON_SHARE_NONE: "Niemand" BUTTON_SHARE_ALL: "Iedereen" BUTTON_SYNC: "Synchroniseren (CardDAV)" COMPOSE: TITLE_FROM: "Van" TITLE_TO: "Naar" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Antwoordadres" TITLE_SUBJECT: "Onderwerp" LINK_SHOW_INPUTS: "Toon alle velden" BUTTON_SEND: "Verzenden" BUTTON_SAVE: "Concept opslaan" BUTTON_DELETE: "Verwijder" BUTTON_CANCEL: "Annuleer" BUTTON_MINIMIZE: "Minimaliseer" SAVED_TIME: "Bewaard op %TIME%" SAVED_ERROR_ON_SEND: "Bericht is verzonden maar niet bewaard in de VERZONDEN map" DISCARD_UNSAVED_DATA: "Niet opgeslagen gegevens verwijderen?" ATTACH_FILES: "Bestand(en) toevoegen" ATTACH_DROP_FILES_DESC: "Sleep bestanden naar hier" ATTACH_ITEM_CANCEL: "Annuleer" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%EMAIL% schreef op %DATETIME%" FORWARD_MESSAGE_TOP_TITLE: "-------- Doorgestuurd bericht -------" FORWARD_MESSAGE_TOP_FROM: "Van" FORWARD_MESSAGE_TOP_TO: "Naar" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Verzonden" FORWARD_MESSAGE_TOP_SUBJECT: "Onderwerp" EMPTY_TO_ERROR_DESC: "Kies ten minste één ontvanger voordat u het bericht verstuurd" NO_ATTACHMENTS_HERE_DESC: "Er zijn geen bijlagen" ATTACHMENTS_ERROR_DESC: "Waarschuwing! Nog niet alle bijlagen zijn klaar met uploaden" ATTACHMENTS_UPLOAD_ERROR_DESC: "Toevoegen van bijlage(n) is nog niet gereed" BUTTON_REQUEST_READ_RECEIPT: "Leesbevestiging vragen" BUTTON_MARK_AS_IMPORTANT: "Marker als belangrijk" BUTTON_OPEN_PGP: "OpenPGP (allen bij Platte Tekst)" BUTTON_REQUEST_DSN: "Ontvangstbevestiging vragen" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Ja" BUTTON_NO: "Nee" DESC_WANT_CLOSE_THIS_WINDOW: "Weet u zeker dat u dit venster wilt sluiten?" DESC_WANT_DELETE_MESSAGES: "Weet u zeker dat u dit/deze bericht/berichten wilt verwijderen?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Kies uw taal" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Account toevoegen?" BUTTON_ADD_ACCOUNT: "Toevoegen" TITLE_UPDATE_ACCOUNT: "Account updaten?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Identiteit toevoegen?" TITLE_UPDATE_IDENTITY: "Identiteit bijwerken?" BUTTON_ADD_IDENTITY: "Toevoegen" BUTTON_UPDATE_IDENTITY: "Bijwerken" LABEL_EMAIL: "E-mail adres" LABEL_NAME: "Naam" LABEL_REPLY_TO: "Antwoordadres" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "BCC" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Map aanmaken?" LABEL_NAME: "Map naam" LABEL_PARENT: "Onderliggende map" BUTTON_CREATE: "Maken" BUTTON_CANCEL: "Annuleer" BUTTON_CLOSE: "Sluiten" TITLE_CREATING_PROCESS: "Maak een nieuwe map" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Alle inhoud van deze map verwijderen?" BUTTON_CLEAR: "Wissen" BUTTON_CANCEL: "Annuleer" BUTTON_CLOSE: "Sluiten" DANGER_DESC_WARNING: "Opgelet!" DANGER_DESC_HTML_1: "Deze actie verwijdert alle e-mails in de map %FOLDER%!" DANGER_DESC_HTML_2: "Eens in gang gezet kan het proces niet geannuleerd worden!" TITLE_CLEARING_PROCESS: "Folder aan het leegmaken..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importeer OpenPGP sleutel" BUTTON_IMPORT_OPEN_PGP_KEY: "Importeer" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Bekijk OpenPGP sleutel" BUTTON_SELECT: "Selecteer" BUTTON_CLOSE: "Sluiten" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Genereer OpenPGP sleutels" LABEL_EMAIL: "E-mail" LABEL_NAME: "Naam" LABEL_PASSWORD: "Wachtwoord" LABEL_KEY_BIT_LENGTH: "Sleutel lengte" BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereer" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP ondertekenen/versleutelen" LABEL_SIGN: "Ondertekenen" LABEL_ENCRYPT: "Versleutelen" LABEL_PASSWORD: "Wachtwoord" BUTTON_SIGN: "Ondertekenen" BUTTON_ENCRYPT: "Versleutelen" BUTTON_SIGN_AND_ENCRYPT: "Ondertekenen en versleutelen" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "PrivĂ© sleutel" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Stap verificatie test" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Filter toevoegen" TITLE_EDIT_FILTER: "Filter aanpassen" FILTER_NAME: "Naam" LEGEND_CONDITIONS: "Voorwaarden" LEGEND_ACTIONS: "Akties" BUTTON_DONE: "Klaar" BUTTON_ADD_CONDITION: "Voorwaarde toevoegen" SELECT_ACTION_NONE: "Geen" SELECT_ACTION_MOVE_TO: "Verplaats naar" SELECT_ACTION_FORWARD_TO: "Doorsturen naar" SELECT_ACTION_REJECT: "Afwijzen" SELECT_ACTION_VACATION_MESSAGE: "Afwezigheidbericht" SELECT_ACTION_DISCARD: "Gooi weg" SELECT_FIELD_FROM: "Van" SELECT_FIELD_RECIPIENTS: "Ontvanger(s) (Aan of CC)" SELECT_FIELD_SUBJECT: "Onderwerp" SELECT_FIELD_HEADER: "Berichtkop" SELECT_FIELD_SIZE: "Grootte" SELECT_TYPE_CONTAINS: "Bevat" SELECT_TYPE_NOT_CONTAINS: "Bevat niet" SELECT_TYPE_MATCHES: "Komt overeen met (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Komt niet overeen met (* and ? supported)" SELECT_TYPE_REGEXP: "Reguliere expressie (Regexp)" SELECT_TYPE_NOT_REGEXP: "Niet reguliere expressie (Regexp)" SELECT_TYPE_EQUAL_TO: "Gelijk aan" SELECT_TYPE_NOT_EQUAL_TO: "Niet gelijk aan" SELECT_TYPE_OVER: "Meer dan" SELECT_TYPE_UNDER: "Minder dan" SELECT_MATCH_ANY: "Komt overeen met een van de volgende voorwaarden" SELECT_MATCH_ALL: "Komt overeen met alle voorwaarden" MARK_AS_READ_LABEL: "Markeer als gelezen" REPLY_INTERVAL_LABEL: "Antwoord interval (dagen)" KEEP_LABEL: "Behoud" STOP_LABEL: "Stop niet met uitvoeren van volgende filters" EMAIL_LABEL: "E-mail" VACATION_SUBJECT_LABEL: "Onderwerp (optioneel)" VACATION_MESSAGE_LABEL: "Bericht" VACATION_RECIPIENTS_LABEL: "Ontvangers (comma gescheiden)" REJECT_MESSAGE_LABEL: "Afwijsbericht" ALL_INCOMING_MESSAGES_DESC: "Alle inkomende berichten" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Selecteer systeem mappen" SELECT_CHOOSE_ONE: "Kies één" SELECT_UNUSE_NAME: "Niet gebruiken" LABEL_SENT: "Verzonden items" LABEL_DRAFTS: "Concepten" LABEL_SPAM: "Ongewenste e-mail" LABEL_TRASH: "Verwijderde items" LABEL_ARCHIVE: "Archief" BUTTON_CANCEL: "Annuleer" BUTTON_CLOSE: "Sluiten" NOTIFICATION_SENT: | U heeft nog geen "Verzonden items" folder aangeduid waar de berichten geplaatst worden na het versturen. Indien u geen verzonden berichten wilt bewaren, kies de "Niet gebruiken" optie. NOTIFICATION_DRAFTS: "U heeft nog geen \"Concepten\" folder aangeduid waar de berichten bewaard worden tijdens het opstellen." NOTIFICATION_SPAM: | U heeft nog geen "Ongewenste e-mail" folder aangeduid waar de spam berichten geplaatst worden. Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. NOTIFICATION_TRASH: | U heeft nog geen "Verwijderde items" folder aangeduid waar de verwijderde berichten geplaatst worden. Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. NOTIFICATION_ARCHIVE: "U heeft nog geen \"Archief\" map aangeduid waar de gearchiveerde berichten geplaatst worden." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Stap verificatie" LABEL_ENABLE_TWO_FACTOR: "Gebruik 2-Stap verificatie" LABEL_TWO_FACTOR_USER: "Gebruikersnaam" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Geheime sleutel" LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" BUTTON_CREATE: "Nieuwe geheime sleutel aanmaken" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Wissen" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Klaar" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Bekijk geheime sleutel" BUTTON_HIDE_SECRET: "Verberg geheime sleutel" TWO_FACTOR_REQUIRE_DESC: "Uw account vereist 2-Stap verificatie configuratie." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Geconfigureerd" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Niet geconfigureerd" TWO_FACTOR_SECRET_DESC: >- Importeer deze informatie in uw Google Authenticator-client (of andere TOTP-client) door gebruik te maken van de QR code hier beneden of door de code handmatig in te voeren. TWO_FACTOR_BACKUP_CODES_DESC: >- Als u geen codes ontvangt via de Google Authenticator kunt u de backup codes gebruiken om in te loggen. Na gebruik van de backup code wordt deze inactief. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "U kunt 2-stap verificatie niet activeren voordat u het succesvol getest heeft." TITLES: LOADING: "Ophalen..." LOGIN: "Inloggen" MAILBOX: "Mailbox" SETTINGS: "Instellingen" COMPOSE: "Opstellen" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Bestand is te groot" ERROR_FILE_PARTIALLY_UPLOADED: "Bestand is slechts deels geĂĽpload door onbekende oorzaak" ERROR_NO_FILE_UPLOADED: "Geen bestand geĂĽpload" ERROR_MISSING_TEMP_FOLDER: "Tijdelijk bestand ontbreekt" ERROR_ON_SAVING_FILE: "Onbekende fout bij het opslaan van het bestand" ERROR_FILE_TYPE: "Onjuist bestandstype" ERROR_UNKNOWN: "Er is een onbekende fout opgetreden" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEKST" TEXT_SWITCHER_RICH_FORMATTING: "Tekst met opmaak" TEXT_SWITCHER_CONFIRM: "Tekst opmaak zal verloren gaan. Wenst u verder te gaan?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Persoonlijk" LABEL_GENERAL_NAME: "Algemeen" LABEL_CONTACTS_NAME: "Contactpersonen" LABEL_FOLDERS_NAME: "Mappen" LABEL_ACCOUNTS_NAME: "Accounts" LABEL_IDENTITY_NAME: "Identiteit" LABEL_IDENTITIES_NAME: "Identiteiten" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Beveiliging" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Thema's" LABEL_CHANGE_PASSWORD_NAME: "Wachtwoord" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Terug" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Opslaan" BUTTON_ADD_FILTER: "Filter toevoegen" BUTTON_DELETE: "Verwijder" BUTTON_RAW_SCRIPT: "Maak een custom script" SUBNAME_NONE: "Geen" SUBNAME_MOVE_TO: "Verplaats naar map \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Doorsturen naar \"%EMAIL%\"" SUBNAME_REJECT: "Afwijzen" SUBNAME_VACATION_MESSAGE: "Afwezigheidsbericht" SUBNAME_DISCARD: "Gooi weg" CAPABILITY_LABEL: "Mogelijkheden" LOADING_PROCESS: "Bezig met updaten van de filter lijst" DELETING_ASK: "Weet u het zeker?" CHACHES_NEED_TO_BE_SAVED_DESC: "Wijzigingen moeten nog opgeslagen worden op de server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identiteit" LABEL_DISPLAY_NAME: "Naam" LABEL_REPLY_TO: "Antwoordadres" LABEL_SIGNATURE: "Handtekening" LABEL_ADD_SIGNATURE_TO_ALL: "Handtekening standaard toevoegen aan bericht" SETTINGS_SECURITY: LEGEND_SECURITY: "Beveiliging" LABEL_CONFIGURE_TWO_FACTOR: "Configureer 2-stap verificatie" LABEL_AUTOLOGOUT: "Automatisch uitloggen" AUTOLOGIN_NEVER_OPTION_NAME: "Nooit" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuten" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% uur" SETTINGS_GENERAL: LEGEND_GENERAL: "Algemeen" LABEL_LANGUAGE: "Taal" LABEL_IDENTITY: "Identiteit" LABEL_LAYOUT: "Indeling" LABEL_LAYOUT_NO_SPLIT: "Geen splitsing" LABEL_LAYOUT_VERTICAL_SPLIT: "Verticale splitsing" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontale splitsing" LABEL_EDITOR: "Standaard tekst editor" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Platte tekst" LABEL_EDITOR_HTML_FORCED: "Html (geforceerd)" LABEL_EDITOR_PLAIN_FORCED: "Platte tekst (geforceerd)" LABEL_ANIMATION: "Interface animatie" LABEL_ANIMATION_FULL: "Volledig" LABEL_ANIMATION_NORMAL: "Normaal" LABEL_ANIMATION_NONE: "Geen" LABEL_VIEW_OPTIONS: "Bekijk opties" LABEL_USE_PREVIEW_PANE: "Toon leesvenster" LABEL_USE_CHECKBOXES_IN_LIST: "Toon selectievakjes in de lijst" LABEL_USE_THREADS: "Groepeer berichten" LABEL_REPLY_SAME_FOLDER: "Plaats antwoorden in de map van het originele bericht" LABEL_SHOW_IMAGES: "Afbeeldingen altijd weergeven in het bericht" LABEL_SHOW_ANIMATION: "Toon animaties" LABEL_MESSAGE_PER_PAGE: "Berichten op pagina" LABEL_NOTIFICATIONS: "Notificaties" LABEL_SOUND_NOTIFICATION: "Notificatie geluid" LABEL_CHROME_NOTIFICATION_DESC: "Toon nieuwe berichten popup" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Geblokkeerd door de browser)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contactpersonen" LABEL_CONTACTS_AUTOSAVE: "Automatisch ontvangers toevoegen aan uw adresboek" LEGEND_CONTACTS_SYNC: "Server Synchronisatie (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Server synchronisatie inschakelen" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Adresboek URL" LABEL_CONTACTS_SYNC_USER: "Gebruikersnaam" LABEL_CONTACTS_SYNC_PASSWORD: "Wachtwoord" SETTINGS_THEMES: LEGEND_THEMES: "Thema's" LEGEND_THEMES_CUSTOM: "Aangepaste thema configuratie" LABEL_CUSTOM_TYPE: "Soort" LABEL_CUSTOM_TYPE_LIGHT: "Licht" LABEL_CUSTOM_TYPE_DARK: "Donker" LABEL_CUSTOM_BACKGROUND_IMAGE: "Achtergrond" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Upload achtergrond afbeelding (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Bestand is te groot" ERROR_FILE_TYPE_ERROR: "Onjuist bestandstype (alleen JPG and PNG)" ERROR_UNKNOWN: "Er is een onbekende fout opgetreden" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Via Google verbinden" BUTTON_GOOGLE_DISCONNECT: "Verbinding met Google verbreken" MAIN_GOOGLE_DESC: "Na activatie van inloggen via Google kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Via Facebook verbinden" BUTTON_FACEBOOK_DISCONNECT: "Verbinding met Facebook verbreken" MAIN_FACEBOOK_DESC: "Na activatie van inloggen via Facebook kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Via Twitter verbinden" BUTTON_TWITTER_DISCONNECT: "Verbinding via Twitter verbreken" MAIN_TWITTER_DESC: "Na activatie van inloggen via Twitter kunt u hiermee inloggen d.m.v. de Google knop op het login scherm." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Mappen lijst" BUTTON_CREATE: "Maak een map" BUTTON_SYSTEM: "Systeem mappen" BUTTON_DELETE: "Verwijder" BUTTON_SUBSCRIBE: "Abonneer" BUTTON_UNSUBSCRIBE: "Abonnement opzeggen" LOADING_PROCESS: "Mappen lijst aan het bijwerken" CREATING_PROCESS: "Map aan het aanmaken" DELETING_PROCESS: "Map aan het wissen" RENAMING_PROCESS: "Map hernoemen" DELETING_ASK: "Weet u het zeker?" TO_MANY_FOLDERS_DESC_1: "U heeft te veel mappen!" TO_MANY_FOLDERS_DESC_2: "Er worden er maar een deel weergegeven om prestatieproblemen te voorkomen." HELP_DELETE_FOLDER: "Verwijder map" HELP_SHOW_HIDE_FOLDER: "Toon/verberg map" HELP_CHECK_FOR_NEW_MESSAGES: "Controleer wel of niet op nieuwe berichten" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Account Lijst" LEGEND_IDENTITIES: "Identiteiten" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts en Identiteiten" BUTTON_ADD_ACCOUNT: "Account toevoegen" BUTTON_ADD_IDENTITY: "Identiteit toevoegen" BUTTON_DELETE: "Wissen" LOADING_PROCESS: "Account lijst aan het bijwerken" DELETING_ASK: "Weet u het zeker?" DEFAULT_IDENTITY_LABEL: "standaard" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identiteit" LEGEND_IDENTITIES: "Additionele Identiteit" LABEL_DEFAULT: "Standaard" LABEL_DISPLAY_NAME: "Naam" LABEL_REPLY_TO: "Antwoordadres" LABEL_SIGNATURE: "Handtekening" LABEL_ADD_SIGNATURE_TO_ALL: "Handtekening standaard toevoegen aan bericht" BUTTON_ADD_IDENTITY: "Identiteit toevoegen" BUTTON_DELETE: "Verwijder" LOADING_PROCESS: "Identiteit lijst bijwerken" DELETING_ASK: "Weet u het zeker?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Wachtwoord aanpassen" LABEL_CURRENT_PASSWORD: "Huidig wachtwoord" LABEL_NEW_PASSWORD: "Nieuw wachtwoord" LABEL_REPEAT_PASSWORD: "Bevestig wachtwoord" BUTTON_UPDATE_PASSWORD: "Wachtwoord wijzigen" ERROR_PASSWORD_MISMATCH: "Wachtwoorden zijn niet gelijk, probeer opnieuw" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importeer OpenPGP sleutel" BUTTON_GENERATE_OPEN_PGP_KEYS: "Genereer OpenPGP sleutels" TITLE_PRIVATE: "PrivĂ© sleutel" TITLE_PUBLIC: "Publieke sleutel" DELETING_ASK: "Weet u het zeker?" GENERATE_ONLY_HTTPS: "Alleen HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Hulp bij toetsenbord sneltoetsen" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Berichtenlijst" TAB_MESSAGE_VIEW: "Bericht leesvenster" TAB_COMPOSE: "Opstellen" LABEL_OPEN_USER_DROPDOWN: "Open gebruikers menu" LABEL_REPLY: "Beantwoord" LABEL_REPLY_ALL: "Alle beantwoorden" LABEL_FORWARD: "Doorsturen" LABEL_FORWARD_MULTIPLY: "Doorsturen als bijlage(n)" LABEL_HELP: "Help" LABEL_CHECK_ALL: "Selecteer alle berichten" LABEL_ARCHIVE: "Archiveren" LABEL_DELETE: "Verwijderen" LABEL_OPEN_THREAD: "Open geselecteerde berichtenlijst" LABEL_MOVE: "Verplaatsen" LABEL_READ: "Markeer geselecteerde berichten als gelezen" LABEL_UNREAD: "Markeer geselecteerde berichten als ongelezen" LABEL_IMPORTANT: "Belangrijk, vlag geselecteerde berichten" LABEL_SEARCH: "Zoeken" LABEL_CANCEL_SEARCH: "Zoekopdracht afbreken" LABEL_FULLSCREEN_ENTER: "Bericht in volledig scherm lezen(leesvenster ingeschakeld)" LABEL_VIEW_MESSAGE_ENTER: "Bericht lezen (leesvenster uitgeschakeld)" LABEL_SWITCH_TO_MESSAGE: "Schakel focus naar bericht" LABEL_SWITCH_TO_FOLDER_LIST: "Schakel focus naar berichtenlijst" LABEL_FULLSCREEN_TOGGLE: "Schakel tussen normaal en lezen in volledig scherm" LABEL_BLOCKQUOTES_TOGGLE: "Schakel blok citaten aan of uit" LABEL_THREAD_NEXT: "Volgende bericht in groep" LABEL_THREAD_PREV: "Vorige bericht in groep" LABEL_PRINT: "Afdrukken" LABEL_EXIT_FULLSCREEN: "Volledig scherm sluiten" LABEL_CLOSE_MESSAGE: "Bericht sluiten (leesvenster uitgeschakeld)" LABEL_SWITCH_TO_LIST: "Schakel focus terug naar berichtenlijst" LABEL_OPEN_COMPOSE_POPUP: "Open nieuw bericht venster" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identiteiten menu" LABEL_SAVE_MESSAGE: "Concept opslaan" LABEL_SEND_MESSAGE: "Bericht versturen" LABEL_CLOSE_COMPOSE: "Nieuw bericht venster sluiten" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Geen publieke sleutels gevonden" NO_PUBLIC_KEYS_FOUND_FOR: "Geen publieke sleutels gevonden voor e-mail adres \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Geen privĂ© sleutel gevonden" NO_PRIVATE_KEY_FOUND_FOR: "Geen privĂ© sleutel gevonden voor e-mail adres \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Voeg een publieke sleutel toe" SELECT_A_PRIVATE_KEY: "Selecteer een privĂ© sleutel" UNVERIFIRED_SIGNATURE: "Ongeverifieerde handtekening" DECRYPTION_ERROR: "OpenPGP decryptie fout" GOOD_SIGNATURE: "Juiste handtekening van %USER%" PGP_ERROR: "OpenPGP foutmelding: %ERROR%" SPECIFY_FROM_EMAIL: "Geef a.u.b. een VAN e-mail adres op" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Geef a.u.b. minimaal één ontvanger op" NOTIFICATIONS: INVALID_TOKEN: "Ongeldige token" AUTH_ERROR: "Authenticatie mislukt" ACCESS_ERROR: "Toegangsfout" CONNECTION_ERROR: "Kan geen verbinding maken met de Server" CAPTCHA_ERROR: "Onjuiste CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail adres en wachtwoord en schakel deze functie in in het account instellingen menu. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail adres en wachtwoord en schakel deze functie in in het account instellingen menu. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Deze social ID is nog niet aan een e-mail account gekoppeld. Log in met e-mail adres en wachtwoord en schakel deze functie in in het account instellingen menu. DOMAIN_NOT_ALLOWED: "Domein is niet toegestaan" ACCOUNT_NOT_ALLOWED: "Account is niet toegestaan" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-Stap verificatie vereist" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-Stap verificatie fout" COULD_NOT_SAVE_NEW_PASSWORD: "Nieuwe wachtwoord kon niet opgeslagen worden" CURRENT_PASSWORD_INCORRECT: "Huidig wachtwoord onjuist" NEW_PASSWORD_SHORT: "Wachtwoord is te kort" NEW_PASSWORD_WEAK: "Wachtwoord is te makkelijk" NEW_PASSWORD_FORBIDDENT: "Wachtwoord bevat verboden tekens" CONTACTS_SYNC_ERROR: "Contactpersonen synchronisatie fout" CANT_GET_MESSAGE_LIST: "Berichtenlijst kan niet worden opgehaald" CANT_GET_MESSAGE: "Bericht kan niet worden opgehaald" CANT_DELETE_MESSAGE: "Kan bericht niet verwijderen" CANT_MOVE_MESSAGE: "Kan bericht niet verplaatsen" CANT_SAVE_MESSAGE: "Kan bericht niet opslaan" CANT_SEND_MESSAGE: "Kan bericht niet verzenden" INVALID_RECIPIENTS: "Onjuiste ontvangers" CANT_SAVE_FILTERS: "Kan filters niet opslaan" CANT_GET_FILTERS: "Kan filters niet ophalen" FILTERS_ARE_NOT_CORRECT: "Filters zijn onjuist" CANT_CREATE_FOLDER: "Kan map niet aanmaken" CANT_RENAME_FOLDER: "Kan map niet hernoemen" CANT_DELETE_FOLDER: "Kan map niet verwijderen" CANT_DELETE_NON_EMPTY_FOLDER: "Een niet lege map kan niet verwijderd worden" CANT_SUBSCRIBE_FOLDER: "Kan niet abonneren op folder" CANT_UNSUBSCRIBE_FOLDER: "Kan abonnement op folder niet opzeggen" CANT_SAVE_SETTINGS: "Instellingen kunnen niet opgeslagen worden" CANT_SAVE_PLUGIN_SETTINGS: "Instellingen kunnen niet opgeslagen worden" DOMAIN_ALREADY_EXISTS: "Domein bestaat reeds" CANT_INSTALL_PACKAGE: "Package installeren mislukt" CANT_DELETE_PACKAGE: "Package verwijderen mislukt" INVALID_PLUGIN_PACKAGE: "Ongeldig plug-in package" UNSUPPORTED_PLUGIN_PACKAGE: "Niet ondersteund plug-in package" LICENSING_SERVER_IS_UNAVAILABLE: "Licentie Server is niet beschikbaar" LICENSING_DOMAIN_EXPIRED: "Licentie voor dit domein is verlopen" LICENSING_DOMAIN_BANNED: "Licentie voor dit domein is verboden" DEMO_SEND_MESSAGE_ERROR: "Vanwege beveiliging is het niet toegestaan dat deze demo account e-mail naar extern verzend!" DEMO_ACCOUNT_ERROR: "Vanwege beveiliging is deze actie niet toegestaan voor deze account!" ACCOUNT_ALREADY_EXISTS: "Account bestaat al" ACCOUNT_DOES_NOT_EXIST: "Account bestaat niet." MAIL_SERVER_ERROR: "Fout bij toegang tot de mail Server" INVALID_INPUT_ARGUMENT: "Ongeldig invoer argument" UNKNOWN_ERROR: "Er is een onbekende fout opgetreden" STATIC: BACK_LINK: "Opnieuw laden" DOMAIN_LIST_DESC: "Lijst van webmail domeinen die toegankelijk zijn" PHP_EXSTENSIONS_ERROR_DESC: "Vereiste PHP extensies zijn niet beschikbaar in uw PHP configuratie!" PHP_VERSION_ERROR_DESC: "Uw PHP versie (%VERSION%) is lager dan de minimaal vereiste 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is benodigd voor deze applicatie" NO_SCRIPT_DESC: | JavaScript ondersteuning is niet beschikbaar in uw browser. Gelieve Javascript in te schakelen en opnieuw te proberen. NO_COOKIE_TITLE: "Cookies ondersteuning is nodig voor deze applicatie" NO_COOKIE_DESC: | Cookies ondersteuning is niet beschikbaar in uw browser. Gelieve Cookies in te schakelen en opnieuw te proberen. BAD_BROWSER_TITLE: "Uw browser is verouderd" BAD_BROWSER_DESC: | Om alle functies van deze applicatie te gebruiken, download en installeer een van de volgende browsers: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml000066400000000000000000001010031361462701300262000ustar00rootroot00000000000000pl_PL: LOGIN: LABEL_EMAIL: "Adres e-mail" LABEL_LOGIN: "Login" LABEL_PASSWORD: "HasĹ‚o" LABEL_SIGN_ME: "ZapamiÄ™taj mnie" LABEL_VERIFICATION_CODE: "Kod weryfikujÄ…cy" LABEL_DONT_ASK_VERIFICATION_CODE: "Nie pytaj o kod przez kolejne 2 tygodnie" BUTTON_SIGN_IN: "Zaloguj" TITLE_SIGN_IN_GOOGLE: "Zaloguj siÄ™ przez Google" TITLE_SIGN_IN_FACEBOOK: "Zaloguj siÄ™ przez Facebook" TITLE_SIGN_IN_TWITTER: "Zaloguj siÄ™ przez Twitter" LABEL_FORGOT_PASSWORD: "Zapomniane hasĹ‚o" LABEL_REGISTRATION: "Rejestracja" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Dodaj konto" BUTTON_SETTINGS: "Ustawienia" BUTTON_HELP: "Pomoc" BUTTON_LOGOUT: "Wyloguj" MOBILE: BUTTON_MOBILE_VERSION: "Wersja mobilna" BUTTON_DESKTOP_VERSION: "Wersja desktopowa" SEARCH: MAIN_INPUT_PLACEHOLDER: "Szukaj" TITLE_ADV: "Wyszukiwanie zaawansowane" LABEL_ADV_FROM: "Od" LABEL_ADV_TO: "Do" LABEL_ADV_SUBJECT: "Temat" LABEL_ADV_TEXT: "Tekst" LABEL_ADV_HAS_ATTACHMENT: "Posiada załącznik" LABEL_ADV_HAS_ATTACHMENTS: "Posiada załączniki" LABEL_ADV_FLAGGED: "Oznaczona" LABEL_ADV_UNSEEN: "Nieprzeczytana" LABEL_ADV_DATE: "Data" LABEL_ADV_DATE_ALL: "Wszystkie" LABEL_ADV_DATE_3_DAYS: "do 3 dni" LABEL_ADV_DATE_7_DAYS: "do tygodnia" LABEL_ADV_DATE_MONTH: "do miesiÄ…ca" LABEL_ADV_DATE_3_MONTHS: "do 3 miesiÄ™cy" LABEL_ADV_DATE_6_MONTHS: "do 6 miesiÄ™cy" LABEL_ADV_DATE_YEAR: "do roku" BUTTON_ADV_SEARCH: "Szukaj" PREVIEW_POPUP: FULLSCREEN: "PeĹ‚ny ekran" ZOOM: "PrzybliĹĽ/oddal" CLOSE: "Zamknij (Esc)" LOADING: "Ĺadowanie..." GALLERY_PREV: "Poprzedni (strzaĹ‚ka w lewo)" GALLERY_NEXT: "NastÄ™pny (strzaĹ‚ka w prawo)" GALLERY_COUNTER: "%curr% z %total%" IMAGE_ERROR: "Nie moĹĽna zaĹ‚adować obrazu." AJAX_ERROR: "Nie moĹĽna zaĹ‚adować zawartoĹ›ci." FOLDER_LIST: BUTTON_COMPOSE: "UtwĂłrz" BUTTON_CONTACTS: "Kontakty" BUTTON_NEW_MESSAGE: "Nowa wiadomość" INBOX_NAME: "Odebrane" SENT_NAME: "WysĹ‚ane" DRAFTS_NAME: "Szkice" SPAM_NAME: "Spam" TRASH_NAME: "Kosz" ARCHIVE_NAME: "Archiwum" QUOTA: TITLE: "Wykorzystane miejsce" MESSAGE_LIST: BUTTON_RELOAD: "OdĹ›wieĹĽ listÄ™ wiadomoĹ›ci" BUTTON_MOVE_TO: "PrzenieĹ› do" BUTTON_DELETE: "UsuĹ„" BUTTON_ARCHIVE: "Archiwizuj" BUTTON_SPAM: "Oznacz jako SPAM" BUTTON_NOT_SPAM: "Oznacz jako poĹĽÄ…dane" BUTTON_EMPTY_FOLDER: "UsuĹ„ zawartość folderu" BUTTON_MULTY_FORWARD: "PrzekaĹĽ dalej jako załącznik(i)" BUTTON_DELETE_WITHOUT_MOVE: "UsuĹ„ permanentnie" BUTTON_MORE: "WiÄ™cej" MENU_SET_SEEN: "Oznacz jako przeczytane" MENU_SET_ALL_SEEN: "Oznacz wszystkie jako przeczytane" MENU_UNSET_SEEN: "Oznacz jako nieprzeczytane" MENU_SET_FLAG: "Oznacz jako waĹĽne" MENU_UNSET_FLAG: "Oznacz jako niewaĹĽne" MENU_SELECT_ALL: "Wszystkie" MENU_SELECT_NONE: "Ĺ»adne" MENU_SELECT_INVERT: "Odwróć zaznaczenie" MENU_SELECT_UNSEEN: "Nieprzeczytane" MENU_SELECT_SEEN: "Przeczytane" MENU_SELECT_FLAGGED: "Oznaczone jako waĹĽne" MENU_SELECT_UNFLAGGED: "Oznaczone jako niewaĹĽne" EMPTY_LIST: "Brak wiadomoĹ›ci." EMPTY_SEARCH_LIST: "Brak wiadomoĹ›ci speĹ‚niajÄ…cych kryteria wyszukiwania." SEARCH_RESULT_FOR: "Wyniki wyszukiwania dla \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "powrĂłt do listy wiadomoĹ›ci" LIST_LOADING: "Ĺadowanie" EMPTY_SUBJECT_TEXT: "(Brak tematu)" PUT_MESSAGE_HERE: "Upuść wiadomość tutaj, aby zobaczyć jÄ… na liĹ›cie" TODAY_AT: "dzisiaj o %TIME%" YESTERDAY_AT: "wczoraj o %TIME%" SEARCH_PLACEHOLDER: "Szukaj" NEW_MESSAGE_NOTIFICATION: "Masz %COUNT% now(-Ä…,-e,-ych) wiadomość(-ci)!" QUOTA_SIZE: "Wykorzystano %SIZE% (%PROC%%) z %LIMIT%" MESSAGE: BUTTON_EDIT: "Edytuj" BUTTON_BACK: "Wstecz" BUTTON_CLOSE: "Zamknij" BUTTON_DELETE: "UsuĹ„" BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji tej listy" BUTTON_ARCHIVE: "Archiwizuj" BUTTON_SPAM: "Oznacz jako niechcianÄ…" BUTTON_NOT_SPAM: "Oznacz jako poĹĽÄ…danÄ…" BUTTON_MOVE_TO: "PrzenieĹ› do" BUTTON_MORE: "WiÄ™cej" BUTTON_REPLY: "Odpowiedz" BUTTON_REPLY_ALL: "Odpowiedz wszystkim" BUTTON_FORWARD: "PrzekaĹĽ dalej" BUTTON_FORWARD_AS_ATTACHMENT: "PrzekaĹĽ dalej jako załącznik" BUTTON_EDIT_AS_NEW: "Zredaguj jako nowÄ… wiadomość" BUTTON_SHOW_IMAGES: "WyĹ›wietl zewnÄ™trzne obrazy" BUTTON_NOTIFY_READ_RECEIPT: "Nadawca prosi o potwierdzenie odczytania tej wiadomoĹ›ci." BUTTON_IN_NEW_WINDOW: "WyĹ›wietl w osobnym oknie" BUTTON_THREAD_LIST: "Lista wÄ…tkĂłw" BUTTON_THREAD_PREV: "Poprzedni" BUTTON_THREAD_NEXT: "NastÄ™pny" BUTTON_THREAD_MORE: "WiÄ™cej wiadomoĹ›ci" MENU_HEADERS: "PokaĹĽ nagłówki wiadomoĹ›ci" MENU_VIEW_ORIGINAL: "PokaĹĽ ĹşrĂłdĹ‚o" MENU_DOWNLOAD_ORIGINAL: "Pobierz jako plik eml" MENU_FILTER_SIMILAR: "Filtruj podobne wiadomoĹ›ci" MENU_PRINT: "Drukuj" EMPTY_SUBJECT_TEXT: "(Brak tematu)" LABEL_SUBJECT: "Temat" LABEL_DATE: "Data" LABEL_FROM: "Od" LABEL_FROM_SHORT: "od" LABEL_TO: "Do" LABEL_TO_SHORT: "do" LABEL_CC: "Kopia" LABEL_BCC: "Kopia ukryta" LABEL_REPLY_TO: "Odpisz do" PRINT_LABEL_FROM: "Od" PRINT_LABEL_TO: "Do" PRINT_LABEL_CC: "Kopia" PRINT_LABEL_BCC: "Kopia ukryta" PRINT_LABEL_REPLY_TO: "Odpisz do" PRINT_LABEL_DATE: "Data" PRINT_LABEL_SUBJECT: "Temat" PRINT_LABEL_ATTACHMENTS: "Załączniki" MESSAGE_LOADING: "Ĺadowanie wiadomoĹ›ci..." MESSAGE_VIEW_DESC: "Wybierz wiadomość do wyĹ›wietlenia." MESSAGE_VIEW_MOVE_DESC: "Kliknij nazwÄ™ folderu w lewym panelu, aby wybrać folder docelowy." PGP_PASSWORD_INPUT_PLACEHOLDER: "HasĹ‚o" PGP_SIGNED_MESSAGE_DESC: "Wiadomość podpisana OpenPGP (kliknij aby zweryfikować)" PGP_ENCRYPTED_MESSAGE_DESC: "Wiadomość zaszyfrowana OpenPGP (kliknij aby odszyfrować)" LINK_DOWNLOAD_AS_ZIP: "Pobierz jako plik zip" LINK_SAVE_TO_OWNCLOUD: "Zapisz w ownCloud" LINK_SAVE_TO_CLOUD: "Zapisz w chmurze" LINK_SAVE_TO_DROPBOX: "Zapisz w Dropbox-ie" READ_RECEIPT: SUBJECT: "Żądaj potwierdzenia wyĹ›wietlenia wiadomoĹ›ci - %SUBJECT%" BODY: | Potwierdzenie wyĹ›wietlenia wiadomoĹ›ci wysĹ‚anej na adres %READ-RECEIPT%. Uwaga: Otrzymanie tego potwierdzenia jest dowodem na to, ĹĽe wiadomość zostaĹ‚a wyĹ›wietlona na komputerze odbiorcy. Nie ma jednak ĹĽadnej gwarancji, ĹĽe odbiorca faktycznie zapoznaĹ‚ siÄ™ z jej treĹ›ciÄ…. SUGGESTIONS: SEARCHING_DESC: "Wyszukiwanie..." CONTACTS: LEGEND_CONTACTS: "Kontakty" SEARCH_INPUT_PLACEHOLDER: "Szukaj" BUTTON_ADD_CONTACT: "Dodaj kontakt" BUTTON_CREATE_CONTACT: "UtwĂłrz" BUTTON_UPDATE_CONTACT: "Zaktualizuj" BUTTON_IMPORT: "Importuj (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Eksportuj (vcf, vCard)" BUTTON_EXPORT_CSV: "Eksportuj (csv)" ERROR_IMPORT_FILE: "Błąd importu (nieprawidĹ‚owy format pliku)" LIST_LOADING: "Ĺadowanie..." EMPTY_LIST: "Brak kontaktĂłw" EMPTY_SEARCH: "Nie znaleziono ĹĽadnych kontaktĂłw" CLEAR_SEARCH: "Wyczyść wyniki" CONTACT_VIEW_DESC: "Wybierz kontakt do wyĹ›wietlenia" LABEL_DISPLAY_NAME: "Nazwa wyĹ›wietlana" LABEL_EMAIL: "Adres e-mail" LABEL_PHONE: "Telefon" LABEL_WEB: "Strona WWW" LABEL_BIRTHDAY: "Urodziny" LINK_ADD_EMAIL: "Dodaj adres e-mail" LINK_ADD_PHONE: "Dodaj nr telefonu" LINK_BIRTHDAY: "Urodziny" PLACEHOLDER_ENTER_DISPLAY_NAME: "Nazwa wyĹ›wietlana" PLACEHOLDER_ENTER_LAST_NAME: "Nazwisko" PLACEHOLDER_ENTER_FIRST_NAME: "ImiÄ™" PLACEHOLDER_ENTER_NICK_NAME: "Pseudonim" LABEL_READ_ONLY: "Tylko do odczytu" LABEL_SHARE: "UdostÄ™pnij kontakt" ADD_MENU_LABEL: "Dodaj" ADD_MENU_NICKNAME: "Pseudonim" ADD_MENU_NOTES: "Notatki" ADD_MENU_EMAIL: "Adres e-mail" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "Adres URL" ADD_MENU_ADDRESS: "Adres" ADD_MENU_BIRTHDAY: "Urodziny" ADD_MENU_TAGS: "Tagi" BUTTON_SHARE_NONE: "Nikomu" BUTTON_SHARE_ALL: "Wszystkim" BUTTON_SYNC: "Synchronizacja (CardDAV)" COMPOSE: TITLE_FROM: "Od" TITLE_TO: "Do" TITLE_CC: "Kopia" TITLE_BCC: "Kopia ukryta" TITLE_REPLY_TO: "Odpisz do" TITLE_SUBJECT: "Temat" LINK_SHOW_INPUTS: "PokaĹĽ wszystkie pola" BUTTON_SEND: "WyĹ›lij" BUTTON_SAVE: "Zapisz" BUTTON_DELETE: "UsuĹ„" BUTTON_CANCEL: "Anuluj" BUTTON_MINIMIZE: "Minimalizuj" SAVED_TIME: "Zapisano o %TIME%" SAVED_ERROR_ON_SEND: "Wiadomość zostaĹ‚a wysĹ‚ana, ale nie zostaĹ‚a zapisana w folderze WysĹ‚ane" DISCARD_UNSAVED_DATA: "Odrzucić niezapisane dane?" ATTACH_FILES: "Dodaj załącznik" ATTACH_DROP_FILES_DESC: "PrzeciÄ…gnij pliki tutaj" ATTACH_ITEM_CANCEL: "Anuluj" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Dysk Google" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% napisaĹ‚/-a/" FORWARD_MESSAGE_TOP_TITLE: "-------- Wiadomość przekazana -------" FORWARD_MESSAGE_TOP_FROM: "Od" FORWARD_MESSAGE_TOP_TO: "Do" FORWARD_MESSAGE_TOP_CC: "Kopia do" FORWARD_MESSAGE_TOP_SENT: "WysĹ‚ano" FORWARD_MESSAGE_TOP_SUBJECT: "Temat" EMPTY_TO_ERROR_DESC: "WprowadĹş co najmniej jednego odbiorcÄ™" NO_ATTACHMENTS_HERE_DESC: "Brak załącznikĂłw." ATTACHMENTS_ERROR_DESC: "OstrzeĹĽenie! Nie wszystkie załączniki zostaĹ‚y przesĹ‚ane na serwer." ATTACHMENTS_UPLOAD_ERROR_DESC: "Jeszcze nie wszystkie załączniki zostaĹ‚y przesĹ‚ane na serwer." BUTTON_REQUEST_READ_RECEIPT: "Żądaj potwierdzenia przeczytania wiadomoĹ›ci" BUTTON_MARK_AS_IMPORTANT: "Oznacz jako waĹĽnÄ…" BUTTON_OPEN_PGP: "OpenPGP (tylko wiadomoĹ›ci tekstowe)" BUTTON_REQUEST_DSN: "Żądaj potwierdzenia dostarczenia wiadomoĹ›ci" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Zamknij" POPUPS_ASK: BUTTON_YES: "Tak" BUTTON_NO: "Nie" DESC_WANT_CLOSE_THIS_WINDOW: "Na pewno chcesz zamknąć to okno?" DESC_WANT_DELETE_MESSAGES: "Na pewno chcesz usunąć wiadomość(-ci)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Wybierz jÄ™zyk" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Czy dodać konto?" BUTTON_ADD_ACCOUNT: "Dodaj" TITLE_UPDATE_ACCOUNT: "Czy zaktualizować konto?" BUTTON_UPDATE_ACCOUNT: "Aktualizuj" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Czy dodać toĹĽsamość?" TITLE_UPDATE_IDENTITY: "Czy zaktualizować toĹĽsamość?" BUTTON_ADD_IDENTITY: "Dodaj" BUTTON_UPDATE_IDENTITY: "Aktualizuj" LABEL_EMAIL: "Adres e-mail" LABEL_NAME: "Nazwa" LABEL_REPLY_TO: "Odpisz do" LABEL_SIGNATURE: "Podpis" LABEL_CC: "Kopia" LABEL_BCC: "Kopia ukryta" LABEL_SIGNATURE_INSERT_BEFORE: "Umieszczaj ten podpis przed cytowanym tekstem w odpowiedziach" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Czy stworzyć folder?" LABEL_NAME: "Nazwa folderu" LABEL_PARENT: "Folder nadrzÄ™dny" BUTTON_CREATE: "UtwĂłrz" BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" TITLE_CREATING_PROCESS: "Tworzenie folderu" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Czy usunąć wszystkie wiadomoĹ›ci z folderu?" BUTTON_CLEAR: "Wyczyść" BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" DANGER_DESC_WARNING: "OstrzeĹĽenie!" DANGER_DESC_HTML_1: "Wszystkie wiadomoĹ›ci w folderze %FOLDER% zostanÄ… bezpowrotnie usuniÄ™te!" DANGER_DESC_HTML_2: "Po rozpoczÄ™ciu nie bÄ™dzie moĹĽliwe przerwanie lub anulowanie zadania." TITLE_CLEARING_PROCESS: "Trwa usuwanie wszystkich wiadomoĹ›ci z folderu..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importowanie klucza OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Importuj" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "PodglÄ…d klucza OpenPGP" BUTTON_SELECT: "Zaznacz" BUTTON_CLOSE: "Zamknij" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generowanie klucza OpenPGP" LABEL_EMAIL: "Adres e-mail" LABEL_NAME: "Nazwa" LABEL_PASSWORD: "HasĹ‚o" LABEL_KEY_BIT_LENGTH: "DĹ‚ugość klucza" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "Podpisywanie/szyfrowanie OpenPGP" LABEL_SIGN: "Podpisz" LABEL_ENCRYPT: "Zaszyfruj" LABEL_PASSWORD: "HasĹ‚o" BUTTON_SIGN: "Podpisz" BUTTON_ENCRYPT: "Zaszyfruj" BUTTON_SIGN_AND_ENCRYPT: "Podpisz i zaszyfruj" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "Odszyfrowywanie OpenPGP" LABEL_KEY: "Klucz prywatny" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Odszyfruj" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Test autoryzacji 2-etapowej" LABEL_CODE: "Kod" BUTTON_TEST: "Testuj" POPUPS_FILTER: TITLE_CREATE_FILTER: "Czy stworzyć filtr?" TITLE_EDIT_FILTER: "Czy zaktualizować filtr?" FILTER_NAME: "Nazwa" LEGEND_CONDITIONS: "Warunki" LEGEND_ACTIONS: "DziaĹ‚ania" BUTTON_DONE: "Gotowe" BUTTON_ADD_CONDITION: "Dodaj warunek" SELECT_ACTION_NONE: "Brak" SELECT_ACTION_MOVE_TO: "PrzenieĹ› do" SELECT_ACTION_FORWARD_TO: "PrzeĹ›lij dalej" SELECT_ACTION_REJECT: "Odrzuć" SELECT_ACTION_VACATION_MESSAGE: "Wiadomość urlopowa" SELECT_ACTION_DISCARD: "Porzuć" SELECT_FIELD_FROM: "Od" SELECT_FIELD_RECIPIENTS: "Adresaci (Do lub DW)" SELECT_FIELD_SUBJECT: "Temat" SELECT_FIELD_HEADER: "Nagłówek" SELECT_FIELD_SIZE: "Rozmiar" SELECT_TYPE_CONTAINS: "zawiera" SELECT_TYPE_NOT_CONTAINS: "nie zawiera" SELECT_TYPE_MATCHES: "zawiera (*, ?)" SELECT_TYPE_NOT_MATCHES: "nie zawiera (*, ?)" SELECT_TYPE_REGEXP: "WyraĹĽenie regularne" SELECT_TYPE_NOT_REGEXP: "Niepoprawne wyraĹĽenie regularne" SELECT_TYPE_EQUAL_TO: "RĂłwna siÄ™" SELECT_TYPE_NOT_EQUAL_TO: "Nie rĂłwna siÄ™" SELECT_TYPE_OVER: "powyĹĽej" SELECT_TYPE_UNDER: "poniĹĽej" SELECT_MATCH_ANY: "SpeĹ‚nia dowolny z warunkĂłw" SELECT_MATCH_ALL: "SpeĹ‚nia wszystkie warunki" MARK_AS_READ_LABEL: "Oznacz jako przeczytane" REPLY_INTERVAL_LABEL: "InterwaĹ‚ odpowiedzi (dni)" KEEP_LABEL: "Zachowaj" STOP_LABEL: "Nie zatrzymuj przetwarzania reguĹ‚" EMAIL_LABEL: "Adres e-mail" VACATION_SUBJECT_LABEL: "Temat (opcjonalnie)" VACATION_MESSAGE_LABEL: "Wiadomość" VACATION_RECIPIENTS_LABEL: "Odbiorcy (rodzielone przecinkami)" REJECT_MESSAGE_LABEL: "Odrzuć wiadomość" ALL_INCOMING_MESSAGES_DESC: "Wszystkie przychodzÄ…ce wiadomoĹ›ci" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Wybierz foldery systemowe" SELECT_CHOOSE_ONE: "Wybierz" SELECT_UNUSE_NAME: "Nie uĹĽywaj" LABEL_SENT: "WysĹ‚ane" LABEL_DRAFTS: "Szkice" LABEL_SPAM: "Spam" LABEL_TRASH: "Kosz" LABEL_ARCHIVE: "Archiwum" BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" NOTIFICATION_SENT: | Nie wybrano folderu systemowego "WysĹ‚ane", do ktĂłrego przenoszone sÄ… wysĹ‚ane wiadomoĹ›ci. JeĹĽeli wysyĹ‚ane wiadomoĹ›ci nie majÄ… być przechowywane, proszÄ™ zaznaczyć opcjÄ™ "Nie uĹĽywaj". NOTIFICATION_DRAFTS: "Nie wybrano folderu \"Wersje robocze\", do ktĂłrego sÄ… zapisywane wiadomoĹ›ci w trakcie ich tworzenia." NOTIFICATION_SPAM: | Nie wybrano folderu "Spam", do ktĂłrego przenoszone sÄ… niepoĹĽÄ…dane wiadomoĹ›ci. JeĹĽeli niechciane wiadomoĹ›ci majÄ… być usuwane na staĹ‚e, proszÄ™ o zaznaczenie opcji "Nie uĹĽywaj". NOTIFICATION_TRASH: | Nie wybrano folderu "Kosz", do ktĂłrego przenoszone sÄ… wszystkie usuniÄ™te wiadomoĹ›ci. JeĹĽeli wiadomoĹ›ci majÄ… być usuwane na staĹ‚e, proszÄ™ o zaznaczenie opcji "Nie uĹĽywaj". NOTIFICATION_ARCHIVE: "Nie zostaĹ‚ wybrany folder \"Archiwum\", zostanie uĹĽyty systemowy folder archiwizacji wiadomoĹ›ci." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Autoryzacja 2-etapowa (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Włącz autoryzacjÄ™ 2-etapowÄ…" LABEL_TWO_FACTOR_USER: "UĹĽytkownik" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Tajna fraza" LABEL_TWO_FACTOR_BACKUP_CODES: "Kody zapasowe" BUTTON_CREATE: "UtwĂłrz sekretnÄ… frazÄ™" BUTTON_ACTIVATE: "Aktywuj" BUTTON_CLEAR: "Wyczyść" BUTTON_LOGOUT: "Wyloguj" BUTTON_DONE: "Zamknij" BUTTON_TEST: "Testuj" LINK_TEST: "test" BUTTON_SHOW_SECRET: "PokaĹĽ sekretnÄ… frazÄ™" BUTTON_HIDE_SECRET: "Ukryj sekretnÄ… frazÄ™" TWO_FACTOR_REQUIRE_DESC: "Twoje konto wymaga skonfigurowania autoryzacji 2-etapowej." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Skonfigurowano" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nie skonfigurowano" TWO_FACTOR_SECRET_DESC: >- UĹĽyj tych informacji w usĹ‚udze Google Authenticator (lub innym kliencie TOTP), uĹĽywajÄ…c poniĹĽszego kodu QR lub wpisujÄ…c kod rÄ™cznie. TWO_FACTOR_BACKUP_CODES_DESC: >- JeĹĽeli nie moĹĽesz otrzymać kodu poprzez usĹ‚ugÄ™ Google Authenticator, moĹĽesz uĹĽyć kodĂłw zapasowych. Po zuĹĽyciu kodĂłw, opcja ta bÄ™dzie nieaktywna. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Nie moĹĽesz zmienić tego ustawienia przed jego przetestowaniem." TITLES: LOADING: "Ĺadowanie..." LOGIN: "Login" MAILBOX: "Skrzynka Odbiorcza" SETTINGS: "Ustawienia" COMPOSE: "UtwĂłrz" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Plik jest za duĹĽy" ERROR_FILE_PARTIALLY_UPLOADED: "Z powodu nieokreĹ›lonego błędu plik nie zostaĹ‚ przesĹ‚any w caĹ‚oĹ›ci" ERROR_NO_FILE_UPLOADED: "Nie przesĹ‚ano ĹĽadnego pliku na serwer" ERROR_MISSING_TEMP_FOLDER: "Brak pliku tymczasowego" ERROR_ON_SAVING_FILE: "WystÄ…piĹ‚ nieoczekiwany błąd w trakcie przesyĹ‚ania pliku na serwer" ERROR_FILE_TYPE: "NieprawidĹ‚owy typ pliku" ERROR_UNKNOWN: "WystÄ…piĹ‚ nieznany błąd w trakcie przesyĹ‚ania pliku na serwer" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> zwykĹ‚y tekst" TEXT_SWITCHER_RICH_FORMATTING: "Wzbogacony format tekstowy" TEXT_SWITCHER_CONFIRM: "Formatowanie tekstu oraz wstawione obrazy zostanÄ… utracone. Czy na pewno chcesz kontynuować?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Osobiste" LABEL_GENERAL_NAME: "OgĂłlne" LABEL_CONTACTS_NAME: "Kontakty" LABEL_FOLDERS_NAME: "Foldery" LABEL_ACCOUNTS_NAME: "Konta" LABEL_IDENTITY_NAME: "ToĹĽsamość" LABEL_IDENTITIES_NAME: "ToĹĽsamoĹ›ci" LABEL_FILTERS_NAME: "Filtry" LABEL_TEMPLATES_NAME: "Szablony" LABEL_SECURITY_NAME: "BezpieczeĹ„stwo" LABEL_SOCIAL_NAME: "Media spoĹ‚ecznoĹ›ciowe" LABEL_THEMES_NAME: "Motywy" LABEL_CHANGE_PASSWORD_NAME: "HasĹ‚o" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Wstecz" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtry" BUTTON_SAVE: "Zapisz" BUTTON_ADD_FILTER: "Dodaj filtr" BUTTON_DELETE: "UsuĹ„" BUTTON_RAW_SCRIPT: "UĹĽyj wĹ‚asnego skryptu uĹĽytkownika" SUBNAME_NONE: "Brak" SUBNAME_MOVE_TO: "PrzenieĹ› do \"%FOLDER%\"" SUBNAME_FORWARD_TO: "PrzekaĹĽ do \"%EMAIL%\"" SUBNAME_REJECT: "Odrzuć" SUBNAME_VACATION_MESSAGE: "Wiadomość urlopowa" SUBNAME_DISCARD: "Porzuć" CAPABILITY_LABEL: "MoĹĽliwoĹ›ci" LOADING_PROCESS: "Aktualizowanie listy filtrĂłw" DELETING_ASK: "JesteĹ› pewien/pewna?" CHACHES_NEED_TO_BE_SAVED_DESC: "Zmiany te muszÄ… zostać zapisane na serwerze." SETTINGS_IDENTITY: LEGEND_IDENTITY: "ToĹĽsamość" LABEL_DISPLAY_NAME: "Nazwa" LABEL_REPLY_TO: "Odpisz do" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "Dodawaj podpis do wszystkich wiadomoĹ›ci wychodzÄ…cych" SETTINGS_SECURITY: LEGEND_SECURITY: "BezpieczeĹ„stwo" LABEL_CONFIGURE_TWO_FACTOR: "Konfiguracja autoryzacji 2-etapowej" LABEL_AUTOLOGOUT: "Automatyczne wylogowanie" AUTOLOGIN_NEVER_OPTION_NAME: "Nidgy" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(a)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% godzina(-y)" SETTINGS_GENERAL: LEGEND_GENERAL: "OgĂłlne" LABEL_LANGUAGE: "JÄ™zyk" LABEL_IDENTITY: "ToĹĽsamość" LABEL_LAYOUT: "UkĹ‚ad" LABEL_LAYOUT_NO_SPLIT: "bez podziaĹ‚u" LABEL_LAYOUT_VERTICAL_SPLIT: "podziaĹ‚ w pionie" LABEL_LAYOUT_HORIZONTAL_SPLIT: "podziaĹ‚ w poziomie" LABEL_EDITOR: "Format wiadomoĹ›ci" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "zwykĹ‚y tekst" LABEL_EDITOR_HTML_FORCED: "HTML (wymuszony)" LABEL_EDITOR_PLAIN_FORCED: "zwykĹ‚y tekst (wymuszony)" LABEL_ANIMATION: "Animacja interfejsu" LABEL_ANIMATION_FULL: "peĹ‚na" LABEL_ANIMATION_NORMAL: "zwykĹ‚a" LABEL_ANIMATION_NONE: "brak" LABEL_VIEW_OPTIONS: "Opcje wyĹ›wietlania" LABEL_USE_PREVIEW_PANE: "WyĹ›wietl okno podglÄ…du" LABEL_USE_CHECKBOXES_IN_LIST: "Pokazuj pola zaznaczenia na listach" LABEL_USE_THREADS: "UĹĽywaj wÄ…tkĂłw" LABEL_REPLY_SAME_FOLDER: "Umieść odpowiedzi w folderach, z ktĂłrych pochodzÄ… wiadomoĹ›ci" LABEL_SHOW_IMAGES: "Zawsze wyĹ›wietlaj zewnÄ™trzne obrazy w treĹ›ci wiadomoĹ›ci" LABEL_SHOW_ANIMATION: "UĹĽyj animacji" LABEL_MESSAGE_PER_PAGE: "WiadomoĹ›ci na stronÄ™" LABEL_NOTIFICATIONS: "Powiadomienia" LABEL_SOUND_NOTIFICATION: "Powiadomienia dĹşwiÄ™kowe" LABEL_CHROME_NOTIFICATION_DESC: "WyĹ›wietlaj powiadomienia o nowych wiadomoĹ›ciach" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokowane przez przeglÄ…darkÄ™)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakty" LABEL_CONTACTS_AUTOSAVE: "Automatycznie dodawaj odbiorcĂłw do ksiÄ…ĹĽki adresowej" LEGEND_CONTACTS_SYNC: "Zdalna synchronizacja (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Włącz zdalnÄ… synchronizacjÄ™" LABEL_CONTACTS_SYNC_SERVER: "Serwer" LABEL_CONTACTS_SYNC_AB_URL: "URL ksiÄ…ĹĽki adresowej" LABEL_CONTACTS_SYNC_USER: "UĹĽytkownik" LABEL_CONTACTS_SYNC_PASSWORD: "HasĹ‚o" SETTINGS_THEMES: LEGEND_THEMES: "Motywy" LEGEND_THEMES_CUSTOM: "Konfiguracja wĹ‚asnego motywu" LABEL_CUSTOM_TYPE: "Typ" LABEL_CUSTOM_TYPE_LIGHT: "Jasny" LABEL_CUSTOM_TYPE_DARK: "Ciemny" LABEL_CUSTOM_BACKGROUND_IMAGE: "TĹ‚o" BUTTON_UPLOAD_BACKGROUND_IMAGE: "PrzeĹ›lij wĹ‚asne tĹ‚o (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Plik jest za duĹĽy" ERROR_FILE_TYPE_ERROR: "NieprawidĹ‚owy format pliku (obsĹ‚ugiwane sÄ… wyłącznie pliki JPG i PNG)" ERROR_UNKNOWN: "WystÄ…piĹ‚ nieznany błąd w trakcie przesyĹ‚ania pliku na serwer" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Konto Google" BUTTON_GOOGLE_CONNECT: "Połącz z Google" BUTTON_GOOGLE_DISCONNECT: "Odłącz Google" MAIN_GOOGLE_DESC: "Po zezwoleniu na logowanie przez Google, moĹĽesz zalogować siÄ™ na to konto uĹĽywajÄ…c przycisku \"Google\" w panelu logowania." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Połącz z Facebook" BUTTON_FACEBOOK_DISCONNECT: "Odłącz Facebook" MAIN_FACEBOOK_DESC: "Po zezwoleniu na logowanie przez Facebook, moĹĽesz zalogować siÄ™ na to konto uĹĽywajÄ…c przycisku \"Facebook\" w panelu logowania." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Połącz z Twitter" BUTTON_TWITTER_DISCONNECT: "Odłącz Twitter" MAIN_TWITTER_DESC: "Po zezwoleniu na logowanie przez Twitter, moĹĽesz zalogować siÄ™ na to konto uĹĽywajÄ…c przycisku \"Twitter\" w panelu logowania." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Lista folderĂłw" BUTTON_CREATE: "UtwĂłrz folder" BUTTON_SYSTEM: "Foldery systemowe" BUTTON_DELETE: "UsuĹ„" BUTTON_SUBSCRIBE: "Subskrybuj" BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji" LOADING_PROCESS: "Aktualizacja listy folderĂłw" CREATING_PROCESS: "Tworzenie folderu" DELETING_PROCESS: "Usuwanie folderu" RENAMING_PROCESS: "Zmiana nazwy folderu" DELETING_ASK: "JesteĹ› pewien/pewna?" TO_MANY_FOLDERS_DESC_1: "Masz za duĹĽo folderĂłw!" TO_MANY_FOLDERS_DESC_2: "PokazaliĹ›my tylko część z nich aby uniknąć problemĂłw z wydajnoĹ›ciÄ…." HELP_DELETE_FOLDER: "UsuĹ„ folder" HELP_SHOW_HIDE_FOLDER: "PokaĹĽ/ukryj folder" HELP_CHECK_FOR_NEW_MESSAGES: "Sprawdzaj/nie sprawdzaj nowych wiadomoĹ›ci" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Konta" LEGEND_IDENTITIES: "ToĹĽsamoĹ›ci" LEGEND_ACCOUNTS_AND_IDENTITIES: "Konta i toĹĽsamoĹ›ci" BUTTON_ADD_ACCOUNT: "Dodaj konto" BUTTON_ADD_IDENTITY: "Dodaj toĹĽsamość" BUTTON_DELETE: "UsuĹ„" LOADING_PROCESS: "Trwa aktualizowanie listy kont" DELETING_ASK: "JesteĹ› pewien/pewna?" DEFAULT_IDENTITY_LABEL: "domyĹ›lna" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "ToĹĽsamość" LEGEND_IDENTITIES: "Dodatkowe toĹĽsamoĹ›ci" LABEL_DEFAULT: "DomyĹ›lna" LABEL_DISPLAY_NAME: "Nazwa" LABEL_REPLY_TO: "Odpisz do" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis do wszystkich wiadomoĹ›ci wychodzÄ…cych" BUTTON_ADD_IDENTITY: "Dodaj toĹĽsamość" BUTTON_DELETE: "UsuĹ„" LOADING_PROCESS: "Trwa aktualizowanie listy toĹĽsamoĹ›ci" DELETING_ASK: "JesteĹ› pewien/pewna?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Zmiana hasĹ‚a" LABEL_CURRENT_PASSWORD: "Aktualne hasĹ‚o" LABEL_NEW_PASSWORD: "Nowe hasĹ‚o" LABEL_REPEAT_PASSWORD: "PowtĂłrz nowe hasĹ‚o" BUTTON_UPDATE_PASSWORD: "ZmieĹ„ hasĹ‚o na nowe" ERROR_PASSWORD_MISMATCH: "Podane hasĹ‚a nie pasujÄ… do siebie, sprĂłbuj ponownie" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importuj klucz OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj klucz OpenPGP" TITLE_PRIVATE: "Prywatny" TITLE_PUBLIC: "Publiczny" DELETING_ASK: "JesteĹ› pewien/pewna?" GENERATE_ONLY_HTTPS: "Tylko HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatycznie zapisuj szkic" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Pomoc dotyczÄ…ca skrĂłtĂłw klawiaturowych" TAB_MAILBOX: "Skrzynka odbiorcza" TAB_MESSAGE_LIST: "Lista wiadomoĹ›ci" TAB_MESSAGE_VIEW: "Widok wiadomoĹ›ci" TAB_COMPOSE: "Tworzenie wiadomoĹ›ci" LABEL_OPEN_USER_DROPDOWN: "OtwĂłrz podrÄ™czne menu uĹĽytkownika" LABEL_REPLY: "Odpowiedz" LABEL_REPLY_ALL: "Odpowiedz wszystkim" LABEL_FORWARD: "PrzekaĹĽ dalej" LABEL_FORWARD_MULTIPLY: "PrzekaĹĽ dalej jako załącznik(i)" LABEL_HELP: "Pomoc" LABEL_CHECK_ALL: "Zaznacz wszystkie wiadomoĹ›ci" LABEL_ARCHIVE: "Archiwum" LABEL_DELETE: "UsuĹ„" LABEL_OPEN_THREAD: "OtwĂłrz wybrany wÄ…tek" LABEL_MOVE: "PrzenieĹ›" LABEL_READ: "Oznacz zaznaczone wiadomoĹ›ci jako przeczytane" LABEL_UNREAD: "Oznacz zaznaczone wiadomoĹ›ci jako nieprzeczytane" LABEL_IMPORTANT: "Oznacz zaznaczone wiadomoĹ›ci jako waĹĽne" LABEL_SEARCH: "Szukaj" LABEL_CANCEL_SEARCH: "Anuluj szukanie" LABEL_FULLSCREEN_ENTER: "PeĹ‚ny ekran (aktywny podglÄ…d wiadomoĹ›ci)" LABEL_VIEW_MESSAGE_ENTER: "PokaĹĽ wiadomość (nieaktywny podglÄ…d wiadomoĹ›ci)" LABEL_SWITCH_TO_MESSAGE: "Wybrana wiadomość na pierwszym planie" LABEL_SWITCH_TO_FOLDER_LIST: "Lista folderĂłw na pierwszym planie" LABEL_FULLSCREEN_TOGGLE: "Tryb peĹ‚noekranowy" LABEL_BLOCKQUOTES_TOGGLE: "Cytowanie wiadomoĹ›ci" LABEL_THREAD_NEXT: "NastÄ™pna wiadomość w wÄ…tku" LABEL_THREAD_PREV: "Poprzednia wiadomość w wÄ…tku" LABEL_PRINT: "Drukuj" LABEL_EXIT_FULLSCREEN: "Opuść tryb peĹ‚noekranowy" LABEL_CLOSE_MESSAGE: "Zamknij wiadomość (nieaktywny podglÄ…d wiadomoĹ›ci)" LABEL_SWITCH_TO_LIST: "Wróć do widoku listy wiadomoĹ›ci" LABEL_OPEN_COMPOSE_POPUP: "OtwĂłrz okno tworzenia wiadomoĹ›ci" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "OtwĂłrz menu wyboru toĹĽsamoĹ›ci" LABEL_SAVE_MESSAGE: "Zapisz wiadomość" LABEL_SEND_MESSAGE: "WyĹ›lij wiadomość" LABEL_CLOSE_COMPOSE: "Zamknij okno tworzenia wiadomoĹ›ci" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Nie znaleziono klucza publicznego" NO_PUBLIC_KEYS_FOUND_FOR: "Nie znaleziono klucza publicznego dla adresu \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Nie znaleziono klucza prywatnego" NO_PRIVATE_KEY_FOUND_FOR: "Nie znaleziono klucza prywatnego dla adresu \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Dodaj klucz publiczny" SELECT_A_PRIVATE_KEY: "Wybierz klucz prywatny" UNVERIFIRED_SIGNATURE: "Podpis niezweryfikowany" DECRYPTION_ERROR: "Błąd odszyfrowywania OpenPGP" GOOD_SIGNATURE: "Poprawnie podpisana przez %USER%" PGP_ERROR: "Błąd OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "Podaj adres e-mail w polu OD" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Podaj przynajmniej jednego odbiorcÄ™" NOTIFICATIONS: INVALID_TOKEN: "NieprawidĹ‚owy token" AUTH_ERROR: "Błąd autoryzacji" ACCESS_ERROR: "Błąd dostÄ™pu" CONNECTION_ERROR: "Błąd połączenia z serwerem" CAPTCHA_ERROR: "NieprawidĹ‚owy kod CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Ten identyfikator spoĹ‚ecznoĹ›ciowy Facebook nie jest powiÄ…zany z ĹĽadnym kontem pocztowym. Zaloguj siÄ™ uĹĽywajÄ…c danych swojego konta e-mail i skonfiguruj tÄ™ opcjÄ™ w: Ustawienia > Sieci spoĹ‚ecznoĹ›ciowe. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Ten identyfikator spoĹ‚ecznoĹ›ciowy Twitter nie jest powiÄ…zany z ĹĽadnym kontem pocztowym. Zaloguj siÄ™ uĹĽywajÄ…c danych swojego konta e-mail i skonfiguruj tÄ™ opcjÄ™ w: Ustawienia > Sieci spoĹ‚ecznoĹ›ciowe. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Ten identyfikator spoĹ‚ecznoĹ›ciowy Konto Google nie jest powiÄ…zany z ĹĽadnym kontem pocztowym. Zaloguj siÄ™ uĹĽywajÄ…c danych swojego konta e-mail i skonfiguruj tÄ™ opcjÄ™ w: Ustawienia > Sieci spoĹ‚ecznoĹ›ciowe. DOMAIN_NOT_ALLOWED: "Domena jest niedozwolona" ACCOUNT_NOT_ALLOWED: "Konto nie jest dozwolone" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana autoryzacja dwuetapowa" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuetapowej" COULD_NOT_SAVE_NEW_PASSWORD: "Nie moĹĽna zapisać nowego hasĹ‚a" CURRENT_PASSWORD_INCORRECT: "Obecne hasĹ‚o jest niepoprawne" NEW_PASSWORD_SHORT: "HasĹ‚o jest za krĂłtkie" NEW_PASSWORD_WEAK: "HasĹ‚o jest zbyt Ĺ‚atwe" NEW_PASSWORD_FORBIDDENT: "HasĹ‚o zawiera niedozwolone znaki" CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktĂłw" CANT_GET_MESSAGE_LIST: "Nie moĹĽna pobrać listy wiadomoĹ›ci" CANT_GET_MESSAGE: "Nie moĹĽna pobrać wiadomoĹ›ci" CANT_DELETE_MESSAGE: "Nie moĹĽna usunąć wiadomoĹ›ci" CANT_MOVE_MESSAGE: "Nie moĹĽna przenieść wiadomoĹ›ci" CANT_SAVE_MESSAGE: "Nie moĹĽna zapisać wiadomoĹ›ci" CANT_SEND_MESSAGE: "Nie moĹĽna wysĹ‚ać wiadomoĹ›ci" INVALID_RECIPIENTS: "NieprawidĹ‚owy adres odbiorcy" CANT_SAVE_FILTERS: "Nie moĹĽna zapisać filtrĂłw" CANT_GET_FILTERS: "Nie moĹĽna pobrać filtrĂłw" FILTERS_ARE_NOT_CORRECT: "Filtry sÄ… nieprawidĹ‚owe" CANT_CREATE_FOLDER: "Nie moĹĽna utworzyć folderu" CANT_RENAME_FOLDER: "Nie moĹĽna zmienić nazwy folderu" CANT_DELETE_FOLDER: "Nie moĹĽna usunąć folderu" CANT_DELETE_NON_EMPTY_FOLDER: "Nie moĹĽna usunąć folderu, w ktĂłrym znajdujÄ… siÄ™ wiadomoĹ›ci" CANT_SUBSCRIBE_FOLDER: "Nie moĹĽna zasubskrybować folderu" CANT_UNSUBSCRIBE_FOLDER: "Nie moĹĽna usunąć subskrypcji folderu" CANT_SAVE_SETTINGS: "Nie moĹĽna zapisać ustawieĹ„" CANT_SAVE_PLUGIN_SETTINGS: "Nie moĹĽna zapisać ustawieĹ„" DOMAIN_ALREADY_EXISTS: "Domena juĹĽ istnieje" CANT_INSTALL_PACKAGE: "Nieudana instalacja pakietu" CANT_DELETE_PACKAGE: "Nieudane usuniÄ™cie pakietu" INVALID_PLUGIN_PACKAGE: "NieprawidĹ‚owy pakiet rozszerzenia" UNSUPPORTED_PLUGIN_PACKAGE: "NieobsĹ‚ugiwany pakiet rozszerzenia" LICENSING_SERVER_IS_UNAVAILABLE: "Serwer subskrypcji jest niedostÄ™pny" LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasĹ‚a." LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny zostaĹ‚a zablokowana." DEMO_SEND_MESSAGE_ERROR: "Ze wzglÄ™dĂłw bezpieczeĹ„stwa konto testowe nie ma moĹĽliwoĹ›ci przesyĹ‚ania wiadomoĹ›ci na zewnÄ™trzne adresy e-mail." DEMO_ACCOUNT_ERROR: "Ze wzglÄ™dĂłw bezpieczeĹ„stwa ta akcja jest niedozwolona na tym koncie!" ACCOUNT_ALREADY_EXISTS: "Konto o takiej nazwie juĹĽ istnieje" ACCOUNT_DOES_NOT_EXIST: "Konto nie istnieje" MAIL_SERVER_ERROR: "WystÄ…piĹ‚ błąd w trakcie połączenia z serwerem poczty" INVALID_INPUT_ARGUMENT: "NieprawidĹ‚owy argument" UNKNOWN_ERROR: "Nieznany błąd" STATIC: BACK_LINK: "OdĹ›wieĹĽ" DOMAIN_LIST_DESC: "Lista domen, do ktĂłrych webmail ma dostÄ™p." PHP_EXSTENSIONS_ERROR_DESC: "Wymagane rozszerzenia PHP sÄ… niedostÄ™pne!" PHP_VERSION_ERROR_DESC: "Aktualnie zainstalowana wersja PHP: (%VERSION%), jest niĹĽsza niĹĽ minimalnie wymagana 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacja wymaga JavaScript." NO_SCRIPT_DESC: | Twoja przeglÄ…darka nie obsĹ‚uguje JavaScript. Włącz obsĹ‚ugÄ™ JavaScript w przeglÄ…darce i ponowne zaĹ‚aduj tÄ™ stronÄ™. NO_COOKIE_TITLE: "Ta aplikacja wymaga plikĂłw Cookies" NO_COOKIE_DESC: | ObsĹ‚uga Cookies jest wyłączona w Twojej przeglÄ…darce. Włącz obsĹ‚ugÄ™ plikĂłw Cookie w przeglÄ…darce i sprĂłbuj ponowne. BAD_BROWSER_TITLE: "Twoja przeglÄ…darka jest przestarzaĹ‚a." BAD_BROWSER_DESC: | W celu wykorzystania wszystkich funkcji tej aplikacji, zaktualizuj aktualnie uĹĽywanÄ… lub pobierz i zainstaluj jednÄ… z poniĹĽszych przeglÄ…darek: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml000066400000000000000000001003501361462701300262040ustar00rootroot00000000000000pt_BR: LOGIN: LABEL_EMAIL: "E-mail" LABEL_LOGIN: "Usuário" LABEL_PASSWORD: "Senha" LABEL_SIGN_ME: "Lembrar-me" LABEL_VERIFICATION_CODE: "CĂłdigo de verificação" LABEL_DONT_ASK_VERIFICATION_CODE: "NĂŁo perguntar o cĂłdigo por 2 semanas" BUTTON_SIGN_IN: "Entrar" TITLE_SIGN_IN_GOOGLE: "Entrar com a conta do Google" TITLE_SIGN_IN_FACEBOOK: "Entrar com a conta do Facebook" TITLE_SIGN_IN_TWITTER: "Entrar com a conta do Twitter" LABEL_FORGOT_PASSWORD: "Esqueceu a senha?" LABEL_REGISTRATION: "Registre-se" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Adicionar Conta" BUTTON_SETTINGS: "Configurações" BUTTON_HELP: "Ajuda" BUTTON_LOGOUT: "Sair" MOBILE: BUTTON_MOBILE_VERSION: "VersĂŁo Mobile" BUTTON_DESKTOP_VERSION: "VersĂŁo Desktop" SEARCH: MAIN_INPUT_PLACEHOLDER: "Pesquisar" TITLE_ADV: "Pesquisa Avançada" LABEL_ADV_FROM: "De" LABEL_ADV_TO: "Para" LABEL_ADV_SUBJECT: "Assunto" LABEL_ADV_TEXT: "Texto" LABEL_ADV_HAS_ATTACHMENT: "Com anexo" LABEL_ADV_HAS_ATTACHMENTS: "Com anexos" LABEL_ADV_FLAGGED: "Sinalizada" LABEL_ADV_UNSEEN: "NĂŁo Lida" LABEL_ADV_DATE: "Data" LABEL_ADV_DATE_ALL: "Qualquer" LABEL_ADV_DATE_3_DAYS: "AtĂ© 3 dias atrás" LABEL_ADV_DATE_7_DAYS: "AtĂ© 1 semana atrás" LABEL_ADV_DATE_MONTH: "AtĂ© 1 mĂŞs atrás" LABEL_ADV_DATE_3_MONTHS: "AtĂ© 3 meses atrás" LABEL_ADV_DATE_6_MONTHS: "AtĂ© 6 meses atrás" LABEL_ADV_DATE_YEAR: "AtĂ© 1 ano atrás" BUTTON_ADV_SEARCH: "Pesquisar" PREVIEW_POPUP: FULLSCREEN: "Em tela cheia" ZOOM: "Zoom in/out" CLOSE: "Fechar (Esc)" LOADING: "Carregando..." GALLERY_PREV: "Anterior (Seta p/ Esquerda)" GALLERY_NEXT: "Posterior (Seta p/ Direita)" GALLERY_COUNTER: "%curr% de %total%" IMAGE_ERROR: "A imagem nĂŁo pĂ´de ser carregada." AJAX_ERROR: "O conteĂşdo nĂŁo pĂ´de ser carregado." FOLDER_LIST: BUTTON_COMPOSE: "Compor" BUTTON_CONTACTS: "Contatos" BUTTON_NEW_MESSAGE: "Nova mensagem" INBOX_NAME: "Caixa de Entrada" SENT_NAME: "Enviadas" DRAFTS_NAME: "Rascunhos" SPAM_NAME: "Lixo EletrĂ´nico" TRASH_NAME: "Lixeira" ARCHIVE_NAME: "Arquivadas" QUOTA: TITLE: "Uso do Armazenamento" MESSAGE_LIST: BUTTON_RELOAD: "Atualizar Lista de Mensagens" BUTTON_MOVE_TO: "Mover Para" BUTTON_DELETE: "Excluir" BUTTON_ARCHIVE: "Arquivar" BUTTON_SPAM: "Lixo EletrĂ´nico" BUTTON_NOT_SPAM: "NĂŁo Ă© Lixo EletrĂ´nico" BUTTON_EMPTY_FOLDER: "Esvaziar Pasta" BUTTON_MULTY_FORWARD: "Encaminhar mensagens" BUTTON_DELETE_WITHOUT_MOVE: "Excluir permanentemente" BUTTON_MORE: "Mais" MENU_SET_SEEN: "Marcar como lida" MENU_SET_ALL_SEEN: "Marcar todas como lidas" MENU_UNSET_SEEN: "Marcar como nĂŁo lida" MENU_SET_FLAG: "Sinalizar" MENU_UNSET_FLAG: "Remover sinalizador" MENU_SELECT_ALL: "Tudo" MENU_SELECT_NONE: "Nenhum" MENU_SELECT_INVERT: "Inverter" MENU_SELECT_UNSEEN: "NĂŁo Lidas" MENU_SELECT_SEEN: "Lidas" MENU_SELECT_FLAGGED: "Sinalizadas" MENU_SELECT_UNFLAGGED: "NĂŁo Sinalizadas" EMPTY_LIST: "Lista Vazia." EMPTY_SEARCH_LIST: "Nenhuma mensagem corresponde a sua pesquisa." SEARCH_RESULT_FOR: "Resultados de pesquisa para \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "Voltar para a lista de mensagens" LIST_LOADING: "Carregando" EMPTY_SUBJECT_TEXT: "(Sem assunto)" PUT_MESSAGE_HERE: "Coloque a mensagem aqui para vĂŞ-la na lista" TODAY_AT: "Hoje as %TIME%" YESTERDAY_AT: "Ontem as %TIME%" SEARCH_PLACEHOLDER: "Pesquisar" NEW_MESSAGE_NOTIFICATION: "VocĂŞ tem %COUNT% novas mensagens!" QUOTA_SIZE: "Utilizando %SIZE% (%PROC%%) de %LIMIT%" MESSAGE: BUTTON_EDIT: "Editar" BUTTON_BACK: "Voltar" BUTTON_CLOSE: "Fechar" BUTTON_DELETE: "Excluir" BUTTON_UNSUBSCRIBE: "Cancelar a assinatura desta lista" BUTTON_ARCHIVE: "Arquivar" BUTTON_SPAM: "Lixo EletrĂ´nico" BUTTON_NOT_SPAM: "NĂŁo Ă© Lixo EletrĂ´nico" BUTTON_MOVE_TO: "Mover para" BUTTON_MORE: "Mais" BUTTON_REPLY: "Responder" BUTTON_REPLY_ALL: "Responder a todos" BUTTON_FORWARD: "Encaminhar" BUTTON_FORWARD_AS_ATTACHMENT: "Encaminhar como anexo" BUTTON_EDIT_AS_NEW: "Editar como novo" BUTTON_SHOW_IMAGES: "Exibir Imagens" BUTTON_NOTIFY_READ_RECEIPT: "O emissor pediu para ser notificado quando vocĂŞ lesse essa mensagem." BUTTON_IN_NEW_WINDOW: "Ver em janela separada" BUTTON_THREAD_LIST: "TĂłpicos da Conversa" BUTTON_THREAD_PREV: "Anterior" BUTTON_THREAD_NEXT: "PrĂłximo" BUTTON_THREAD_MORE: "Mais mensagens" MENU_HEADERS: "Mostrar cabeçalho das mensagens" MENU_VIEW_ORIGINAL: "Mostrar original" MENU_DOWNLOAD_ORIGINAL: "Baixar como arquivo .eml" MENU_FILTER_SIMILAR: "Filtrar mensagens como esta" MENU_PRINT: "Imprimir" EMPTY_SUBJECT_TEXT: "(Sem assunto)" LABEL_SUBJECT: "Assunto" LABEL_DATE: "Data" LABEL_FROM: "De" LABEL_FROM_SHORT: "de" LABEL_TO: "Para" LABEL_TO_SHORT: "para" LABEL_CC: "Cc" LABEL_BCC: "Cco" LABEL_REPLY_TO: "Responder para" PRINT_LABEL_FROM: "De" PRINT_LABEL_TO: "Para" PRINT_LABEL_CC: "Cc" PRINT_LABEL_BCC: "Cco" PRINT_LABEL_REPLY_TO: "Responder para" PRINT_LABEL_DATE: "Data" PRINT_LABEL_SUBJECT: "Assunto" PRINT_LABEL_ATTACHMENTS: "Anexos" MESSAGE_LOADING: "Carregando" MESSAGE_VIEW_DESC: "Selecione uma mensagem para visualizá-la aqui." MESSAGE_VIEW_MOVE_DESC: "Clique no nome da pasta no painel esquerdo para selecionar o destino." PGP_PASSWORD_INPUT_PLACEHOLDER: "Senha" PGP_SIGNED_MESSAGE_DESC: "Mensagem assinada com OpenPGP (clique para verificar)" PGP_ENCRYPTED_MESSAGE_DESC: "Mensagem criptografada com OpenPGP (clique para descriptografar)" LINK_DOWNLOAD_AS_ZIP: "Baixar como zip" LINK_SAVE_TO_OWNCLOUD: "Salvar no ownCloud" LINK_SAVE_TO_CLOUD: "Salvar para a nuvem" LINK_SAVE_TO_DROPBOX: "Salvar no Dropbox" READ_RECEIPT: SUBJECT: "Aviso de recepção (Visualizada) - %SUBJECT%" BODY: | Comprovante de retorno para o e-mail que vocĂŞ enviou para %READ-RECEIPT%. Nota: Este comprovante de retorno apenas reconhece que a mensagem foi exibida no computador do destinatário. NĂŁo há garantia de que o destinatário tenha lido ou compreendido o conteĂşdo da mensagem. SUGGESTIONS: SEARCHING_DESC: "Procurando..." CONTACTS: LEGEND_CONTACTS: "Contatos" SEARCH_INPUT_PLACEHOLDER: "Pesquisar" BUTTON_ADD_CONTACT: "Adicionar Contato" BUTTON_CREATE_CONTACT: "Criar" BUTTON_UPDATE_CONTACT: "Atualizar" BUTTON_IMPORT: "Importar (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" BUTTON_EXPORT_CSV: "Exportar (csv)" ERROR_IMPORT_FILE: "Erro ao importar (formato de arquivo inválido)" LIST_LOADING: "Carregando" EMPTY_LIST: "Nenhum contato aqui" EMPTY_SEARCH: "Nenhum contato encontrado" CLEAR_SEARCH: "Limpar pesquisa" CONTACT_VIEW_DESC: "Selecione um contato na lista para visualizá-lo." LABEL_DISPLAY_NAME: "Nome de Exibição" LABEL_EMAIL: "E-mail" LABEL_PHONE: "Telefone" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Aniversário" LINK_ADD_EMAIL: "Adicionar um endereço e-mail" LINK_ADD_PHONE: "Adicionar um telefone" LINK_BIRTHDAY: "Aniversário" PLACEHOLDER_ENTER_DISPLAY_NAME: "Digite o nome de exibição" PLACEHOLDER_ENTER_LAST_NAME: "Digite o sobrenome" PLACEHOLDER_ENTER_FIRST_NAME: "Digite o primeiro nome" PLACEHOLDER_ENTER_NICK_NAME: "Digite o apelido" LABEL_READ_ONLY: "Somente Leitura" LABEL_SHARE: "Compartilhar" ADD_MENU_LABEL: "Adicionar" ADD_MENU_NICKNAME: "Apelido" ADD_MENU_NOTES: "Observações" ADD_MENU_EMAIL: "E-mail" ADD_MENU_PHONE: "Telefone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Endereço" ADD_MENU_BIRTHDAY: "Aniversário" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "NinguĂ©m" BUTTON_SHARE_ALL: "Todos" BUTTON_SYNC: "Sincronização (CardDAV)" COMPOSE: TITLE_FROM: "De" TITLE_TO: "Para" TITLE_CC: "Cc" TITLE_BCC: "Cco" TITLE_REPLY_TO: "Responder para" TITLE_SUBJECT: "Assunto" LINK_SHOW_INPUTS: "Exibir todos os campos" BUTTON_SEND: "Enviar" BUTTON_SAVE: "Salvar" BUTTON_DELETE: "Excluir" BUTTON_CANCEL: "Cancelar" BUTTON_MINIMIZE: "Minimizar" SAVED_TIME: "Salvo Ă s %TIME%" SAVED_ERROR_ON_SEND: "Sua mensagem foi enviada mas nĂŁo foi salva na pasta de itens enviados." DISCARD_UNSAVED_DATA: "Descartar os dados nĂŁo-salvos?" ATTACH_FILES: "Anexar arquivos" ATTACH_DROP_FILES_DESC: "Arraste os arquivos aqui" ATTACH_ITEM_CANCEL: "Cancelar" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escreveu" FORWARD_MESSAGE_TOP_TITLE: "-------- Mensagem Encaminhada -------" FORWARD_MESSAGE_TOP_FROM: "De" FORWARD_MESSAGE_TOP_TO: "Para" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Recebida" FORWARD_MESSAGE_TOP_SUBJECT: "Assunto" EMPTY_TO_ERROR_DESC: "Por favor, especifique pelo menos um destinatário" NO_ATTACHMENTS_HERE_DESC: "NĂŁo há anexos aqui." ATTACHMENTS_ERROR_DESC: "Alerta! Nem todos os arquivos foram anexados." ATTACHMENTS_UPLOAD_ERROR_DESC: "Alguns anexos ainda nĂŁo foram completamente enviados" BUTTON_REQUEST_READ_RECEIPT: "Pedir recibo de leitura" BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" BUTTON_OPEN_PGP: "OpenPGP (Somente Texto)" BUTTON_REQUEST_DSN: "Pedir recibo de entrega" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Fechar" POPUPS_ASK: BUTTON_YES: "Sim" BUTTON_NO: "NĂŁo" DESC_WANT_CLOSE_THIS_WINDOW: "VocĂŞ tem certeza que deseja fechar esta janela?" DESC_WANT_DELETE_MESSAGES: "VocĂŞ tem certeza de que deseja excluir essa(s) mensagem(s)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Escolha o idioma" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Nova conta" BUTTON_ADD_ACCOUNT: "Adicionar" TITLE_UPDATE_ACCOUNT: "Atualizar Conta?" BUTTON_UPDATE_ACCOUNT: "Atualizar" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Adicionar identidade" TITLE_UPDATE_IDENTITY: "Atualizar identidade?" BUTTON_ADD_IDENTITY: "Adicionar" BUTTON_UPDATE_IDENTITY: "Atualizar" LABEL_EMAIL: "E-mail" LABEL_NAME: "Nome" LABEL_REPLY_TO: "Responder para" LABEL_SIGNATURE: "Assinatura" LABEL_CC: "Cc" LABEL_BCC: "Cco" LABEL_SIGNATURE_INSERT_BEFORE: "Inserir esta assinatura antes do texto citado nas respostas" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Nova pasta" LABEL_NAME: "Nome da pasta" LABEL_PARENT: "Pasta principal" BUTTON_CREATE: "Criar" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" TITLE_CREATING_PROCESS: "Criando a pasta" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Excluir todas as mensagens da pasta?" BUTTON_CLEAR: "Limpar" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" DANGER_DESC_WARNING: "Atenção!" DANGER_DESC_HTML_1: "Esta ação irá resultar na remoção de todos os e-mails da pasta %FOLDER%." DANGER_DESC_HTML_2: "Uma vez iniciado, o processo nĂŁo poderá ser interrompido ou cancelado." TITLE_CLEARING_PROCESS: "Excluindo a pasta..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importar chave OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Ver chave OpenPGP" BUTTON_SELECT: "Selecionar" BUTTON_CLOSE: "Fechar" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Gerar chave OpenPGP" LABEL_EMAIL: "E-mail" LABEL_NAME: "Nome" LABEL_PASSWORD: "Senha" LABEL_KEY_BIT_LENGTH: "Tamanho da chave" BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Assinar/Criptografar" LABEL_SIGN: "Assinar" LABEL_ENCRYPT: "Criptografar" LABEL_PASSWORD: "Senha" BUTTON_SIGN: "Assinar" BUTTON_ENCRYPT: "Criptografar" BUTTON_SIGN_AND_ENCRYPT: "Assinar e criptografar" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Testar verificação de duas etapas" LABEL_CODE: "CĂłdigo" BUTTON_TEST: "Testar" POPUPS_FILTER: TITLE_CREATE_FILTER: "Criar um filtro?" TITLE_EDIT_FILTER: "Atualizar filtro?" FILTER_NAME: "Nome" LEGEND_CONDITIONS: "Condições" LEGEND_ACTIONS: "Ações" BUTTON_DONE: "Concluir" BUTTON_ADD_CONDITION: "Adicionar uma Condição" SELECT_ACTION_NONE: "Nenhuma" SELECT_ACTION_MOVE_TO: "Mover para" SELECT_ACTION_FORWARD_TO: "Encaminhar para" SELECT_ACTION_REJECT: "Rejeitar" SELECT_ACTION_VACATION_MESSAGE: "Mensagem de fĂ©rias" SELECT_ACTION_DISCARD: "Descartar" SELECT_FIELD_FROM: "De" SELECT_FIELD_RECIPIENTS: "Destinatários (Para ou Cc)" SELECT_FIELD_SUBJECT: "Assunto" SELECT_FIELD_HEADER: "Cabeçalho" SELECT_FIELD_SIZE: "Tamanho" SELECT_TYPE_CONTAINS: "ContĂ©m" SELECT_TYPE_NOT_CONTAINS: "NĂŁo ContĂ©m" SELECT_TYPE_MATCHES: "Corresponde (* e ? sĂŁo suportados)" SELECT_TYPE_NOT_MATCHES: "NĂŁo Corresponde (* e ? sĂŁo suportados)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "NĂŁo Regexp" SELECT_TYPE_EQUAL_TO: "Igual Ă " SELECT_TYPE_NOT_EQUAL_TO: "NĂŁo Ă© igual Ă " SELECT_TYPE_OVER: "Maior que" SELECT_TYPE_UNDER: "Menor que" SELECT_MATCH_ANY: "Corresponde Ă  qualquer regra seguinte" SELECT_MATCH_ALL: "Corresponde Ă  todas as regras seguintes" MARK_AS_READ_LABEL: "Marcar como Lida" REPLY_INTERVAL_LABEL: "Responder intervalo (dias)" KEEP_LABEL: "Manter" STOP_LABEL: "NĂŁo parar o processamento das regras" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Assunto (opcional)" VACATION_MESSAGE_LABEL: "Mensagem" VACATION_RECIPIENTS_LABEL: "Destinatários (separados por vĂ­rgulas)" REJECT_MESSAGE_LABEL: "Rejeitar mensagem" ALL_INCOMING_MESSAGES_DESC: "Todas as mensagens recebidas" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Selecionar pastas do sistema" SELECT_CHOOSE_ONE: "Selecione uma" SELECT_UNUSE_NAME: "NĂŁo usar" LABEL_SENT: "Enviadas" LABEL_DRAFTS: "Rascunhos" LABEL_SPAM: "Lixo EletrĂ´nico" LABEL_TRASH: "Lixeira" LABEL_ARCHIVE: "Arquivadas" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" NOTIFICATION_SENT: | VocĂŞ nĂŁo selecionou a pasta "Enviadas" do sistema que será colocada as mensagens apĂłs o envio. Se vocĂŞ nĂŁo quiser salvar a mensagem enviada, por favor selecione a opção"NĂŁo usar". NOTIFICATION_DRAFTS: "VocĂŞ nĂŁo selecionou a pasta \"Rascunhos\" do sistema que será colocada as mensagens salvas durante a composição." NOTIFICATION_SPAM: | VocĂŞ nĂŁo selecionou a pasta "Lixo EletrĂ´nico" do sistema que será colocada as mensagens spams. Se vocĂŞ deseja remover a mensagem permanentemente, por favor selecione a opção"NĂŁo usar". NOTIFICATION_TRASH: | VocĂŞ nĂŁo selecionou a pasta do sistema que serĂŁo colocadas as mensagens excluĂ­das. Se vocĂŞ deseja remover a mensagem permanentemente, por favor selecione a opção"NĂŁo usar". NOTIFICATION_ARCHIVE: "VocĂŞ nĂŁo selecionou a pasta \"Arquivadas\" do sistema que serĂŁo colocadas as mensagens arquivadas." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Verificação de duas etapas" LABEL_ENABLE_TWO_FACTOR: "Habilitar verificação de duas etapas" LABEL_TWO_FACTOR_USER: "Usuário" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Segredo" LABEL_TWO_FACTOR_BACKUP_CODES: "CĂłdigos de backup" BUTTON_CREATE: "Criar novo segredo" BUTTON_ACTIVATE: "Ativar" BUTTON_CLEAR: "Limpar" BUTTON_LOGOUT: "Sair" BUTTON_DONE: "Completo" BUTTON_TEST: "Testar" LINK_TEST: "teste" BUTTON_SHOW_SECRET: "Mostrar segredo" BUTTON_HIDE_SECRET: "Esconder segredo" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "NĂŁo configurado" TWO_FACTOR_SECRET_DESC: >- Importe este cĂłdigo no seu cliente Google Authenticator (ou outro cliente TOTP) usando o QR code abaixo ou informando o cĂłdigo manualmente. TWO_FACTOR_BACKUP_CODES_DESC: >- Se vocĂŞ nĂŁo puder receber os cĂłdigos via Google Authenticator, vocĂŞ pode usar esses cĂłdigos de backup para acessar sua conta. Depois de vocĂŞ usar um cĂłdigo de backup, ele se expira. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "VocĂŞ nĂŁo pode alterar essa configuração antes do teste." TITLES: LOADING: "Carregando" LOGIN: "Login" MAILBOX: "Caixa de Correio" SETTINGS: "Configurações" COMPOSE: "Compor" UPLOAD: ERROR_FILE_IS_TOO_BIG: "O arquivo Ă© muito grande" ERROR_FILE_PARTIALLY_UPLOADED: "O arquivo foi apenas parcialmente enviado devido a um erro desconhecido" ERROR_NO_FILE_UPLOADED: "Arquivo nĂŁo enviado" ERROR_MISSING_TEMP_FOLDER: "O arquivo temporário está faltando" ERROR_ON_SAVING_FILE: "Ocorreu um erro de envio de arquivo desconhecido" ERROR_FILE_TYPE: "Tipo de arquivo inválido" ERROR_UNKNOWN: "Ocorreu um erro de envio de arquivo desconhecido" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTO" TEXT_SWITCHER_RICH_FORMATTING: "Formatação avançada" TEXT_SWITCHER_CONFIRM: "A formatação de texto e as imagens serĂŁo perdidas. Tem certeza de que deseja continuar?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Pessoal" LABEL_GENERAL_NAME: "Geral" LABEL_CONTACTS_NAME: "Contatos" LABEL_FOLDERS_NAME: "Pastas" LABEL_ACCOUNTS_NAME: "Contas" LABEL_IDENTITY_NAME: "Identidade" LABEL_IDENTITIES_NAME: "Identidades" LABEL_FILTERS_NAME: "Filtros" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Segurança" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Temas" LABEL_CHANGE_PASSWORD_NAME: "Senha" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Voltar" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtros" BUTTON_SAVE: "Salvar" BUTTON_ADD_FILTER: "Adicionar um Filtro" BUTTON_DELETE: "Deletar" BUTTON_RAW_SCRIPT: "Usar Script de usuário personalizado" SUBNAME_NONE: "Nenhum" SUBNAME_MOVE_TO: "Mover para \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Encaminhar para \"%EMAIL%\"" SUBNAME_REJECT: "Rejeitar" SUBNAME_VACATION_MESSAGE: "Mensagem de fĂ©rias" SUBNAME_DISCARD: "Descartar" CAPABILITY_LABEL: "Capacidade" LOADING_PROCESS: "Atualizando Lista de filtros" DELETING_ASK: "VocĂŞ tem certeza?" CHACHES_NEED_TO_BE_SAVED_DESC: "Estas alterações precisam ser salvas no servidor." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identidade" LABEL_DISPLAY_NAME: "Nome" LABEL_REPLY_TO: "Responder para" LABEL_SIGNATURE: "Assinatura" LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar sua assinatura em todas as mensagens de saĂ­da" SETTINGS_SECURITY: LEGEND_SECURITY: "Segurança" LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificação de 2 etapas" LABEL_AUTOLOGOUT: "Deslogar Automaticamente" AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minutos" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hora(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "Geral" LABEL_LANGUAGE: "Idioma" LABEL_IDENTITY: "Identidade" LABEL_LAYOUT: "Painel de Leitura" LABEL_LAYOUT_NO_SPLIT: "Sem divisĂŁo" LABEL_LAYOUT_VERTICAL_SPLIT: "DivisĂŁo Vertical" LABEL_LAYOUT_HORIZONTAL_SPLIT: "DivisĂŁo Horizontal" LABEL_EDITOR: "Editor de texto padrĂŁo" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Texto Simples" LABEL_EDITOR_HTML_FORCED: "Html (forçado)" LABEL_EDITOR_PLAIN_FORCED: "Texto Simples (forçado)" LABEL_ANIMATION: "Animação de interface" LABEL_ANIMATION_FULL: "Completa" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Nenhuma" LABEL_VIEW_OPTIONS: "Opções de Visualização" LABEL_USE_PREVIEW_PANE: "Usar painel de prĂ©-visualização" LABEL_USE_CHECKBOXES_IN_LIST: "Exibir caixas de seleção na lista" LABEL_USE_THREADS: "Agrupar mensagens por conversa" LABEL_REPLY_SAME_FOLDER: "Colocar resposta na mesma pasta da mensagem respondida" LABEL_SHOW_IMAGES: "Sempre exibir imagens no corpo da mensagem" LABEL_SHOW_ANIMATION: "Mostrar animação" LABEL_MESSAGE_PER_PAGE: "Mensagens por Página" LABEL_NOTIFICATIONS: "Notificações" LABEL_SOUND_NOTIFICATION: "Notificação sonora" LABEL_CHROME_NOTIFICATION_DESC: "Mostrar notificação popup para novas mensagens" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado pelo navegador)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contatos" LABEL_CONTACTS_AUTOSAVE: "Adicionar automaticamente os destinatários na lista de endereços" LEGEND_CONTACTS_SYNC: "Sincronização remota (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Habilitar sincronização remota" LABEL_CONTACTS_SYNC_SERVER: "Servidor" LABEL_CONTACTS_SYNC_AB_URL: "URL da lista de contatos" LABEL_CONTACTS_SYNC_USER: "Usuário" LABEL_CONTACTS_SYNC_PASSWORD: "Senha" SETTINGS_THEMES: LEGEND_THEMES: "Temas" LEGEND_THEMES_CUSTOM: "Configurar tema personalizado" LABEL_CUSTOM_TYPE: "Tipo" LABEL_CUSTOM_TYPE_LIGHT: "Claro" LABEL_CUSTOM_TYPE_DARK: "Escuro" LABEL_CUSTOM_BACKGROUND_IMAGE: "Plano de fundo" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Enviar imagem de plano de fundo(JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Arquivo muito grande" ERROR_FILE_TYPE_ERROR: "Tipo de arquivo inválido (somente JPG e PNG)" ERROR_UNKNOWN: "Ocorreu um erro de envio de arquivo desconhecido" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Conectar ao Google" BUTTON_GOOGLE_DISCONNECT: "Desconectar do Google" MAIN_GOOGLE_DESC: "Depois de ativar com o login do Google, vocĂŞ poderá entrar nessa conta utilizando o botĂŁo Google na tela de login." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Conectar ao Facebook" BUTTON_FACEBOOK_DISCONNECT: "Desconectar do Facebook" MAIN_FACEBOOK_DESC: "Depois de ativar com o login do Facebook, vocĂŞ poderá entrar nessa conta utilizando o botĂŁo Facebook na tela de login." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Conectar ao Twitter" BUTTON_TWITTER_DISCONNECT: "Desconectar do Twitter" MAIN_TWITTER_DESC: "Depois de ativar com o login do Twitter, vocĂŞ poderá entrar nessa conta utilizando o botĂŁo Twitter na tela de login" SETTINGS_FOLDERS: LEGEND_FOLDERS: "Lista de pastas" BUTTON_CREATE: "Criar pasta" BUTTON_SYSTEM: "Pastas do Sistema" BUTTON_DELETE: "Excluir" BUTTON_SUBSCRIBE: "Acompanhar" BUTTON_UNSUBSCRIBE: "NĂŁo acompanhar" LOADING_PROCESS: "Atualizar lista de pastas" CREATING_PROCESS: "Criando a pasta" DELETING_PROCESS: "Excluindo a pasta" RENAMING_PROCESS: "Renomeando a pasta" DELETING_ASK: "VocĂŞ tem certeza?" TO_MANY_FOLDERS_DESC_1: "VocĂŞ possui muitas pastas!" TO_MANY_FOLDERS_DESC_2: "Mostraremos apenas uma parte delas, para evitar problemas de desempenho." HELP_DELETE_FOLDER: "Deletar pasta" HELP_SHOW_HIDE_FOLDER: "Mostrar/esconder pasta" HELP_CHECK_FOR_NEW_MESSAGES: "Ativar/Desativar verificação por novas mensagens" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Lista de contas" LEGEND_IDENTITIES: "Identidades" LEGEND_ACCOUNTS_AND_IDENTITIES: "Contas e Identidades" BUTTON_ADD_ACCOUNT: "Adicionar uma conta" BUTTON_ADD_IDENTITY: "Adicionar uma identidade" BUTTON_DELETE: "Excluir" LOADING_PROCESS: "Atualizando a lista de contas" DELETING_ASK: "VocĂŞ tem certeza?" DEFAULT_IDENTITY_LABEL: "padrĂŁo" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identidade" LEGEND_IDENTITIES: "Identidades adicionais" LABEL_DEFAULT: "PadrĂŁo" LABEL_DISPLAY_NAME: "Nome" LABEL_REPLY_TO: "Responder para" LABEL_SIGNATURE: "Assinatura" LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar sua assinatura em todas as mensagens de saĂ­da" BUTTON_ADD_IDENTITY: "Adicionar identidade" BUTTON_DELETE: "Excluir" LOADING_PROCESS: "Atualizando a lista de identidades" DELETING_ASK: "VocĂŞ tem certeza?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Mudar a Senha" LABEL_CURRENT_PASSWORD: "Senha atual" LABEL_NEW_PASSWORD: "Nova senha" LABEL_REPEAT_PASSWORD: "Repita a nova senha" BUTTON_UPDATE_PASSWORD: "Definir nova senha" ERROR_PASSWORD_MISMATCH: "As senhas nĂŁo conferem, por favor tente novamente" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importa chave OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar chave OpenPGP" TITLE_PRIVATE: "Privado" TITLE_PUBLIC: "PĂşblico" DELETING_ASK: "VocĂŞ tem certeza?" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "Salvar automaticamente rascunho" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Ajuda com os atalhos de teclado" TAB_MAILBOX: "Caixa de correio" TAB_MESSAGE_LIST: "Lista de mensagens" TAB_MESSAGE_VIEW: "Visualização de mensagem" TAB_COMPOSE: "Composição" LABEL_OPEN_USER_DROPDOWN: "Abrir menu de usuário" LABEL_REPLY: "Responder" LABEL_REPLY_ALL: "Responder todos" LABEL_FORWARD: "Encaminhar" LABEL_FORWARD_MULTIPLY: "Encaminhar como anexo" LABEL_HELP: "Ajuda" LABEL_CHECK_ALL: "Selecionar todas as mensagens" LABEL_ARCHIVE: "Arquivar" LABEL_DELETE: "Excluir" LABEL_OPEN_THREAD: "Abrir conversa selecionada" LABEL_MOVE: "Mover" LABEL_READ: "Marcar mensagens selecionadas como lidas" LABEL_UNREAD: "Marcar mensagens selecionadas como nĂŁo lidas" LABEL_IMPORTANT: "Sinalizar mensagens selecionadas" LABEL_SEARCH: "Pesquisar" LABEL_CANCEL_SEARCH: "Cancelar pesquisa" LABEL_FULLSCREEN_ENTER: "Tela-cheia (Com prĂ©-visualização)" LABEL_VIEW_MESSAGE_ENTER: "Ver mensagem (Sem prĂ©-visualização)" LABEL_SWITCH_TO_MESSAGE: "Mudar o foco para mensagem selecionada" LABEL_SWITCH_TO_FOLDER_LIST: "Mudar o foco para a lista de pastas" LABEL_FULLSCREEN_TOGGLE: "Alternar modo tela-cheia" LABEL_BLOCKQUOTES_TOGGLE: "Alternar blocos de citações de mensagem" LABEL_THREAD_NEXT: "Mensagem seguinte na conversa" LABEL_THREAD_PREV: "Mensagem anterior na conversa" LABEL_PRINT: "Imprimir" LABEL_EXIT_FULLSCREEN: "Sair do modo tela-cheia" LABEL_CLOSE_MESSAGE: "Fechar mensagem (Sem prĂ©-visualização)" LABEL_SWITCH_TO_LIST: "Mudar o foco volta para a lista de mensagens" LABEL_OPEN_COMPOSE_POPUP: "Abrir pop-up de composição" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir menu de identidades" LABEL_SAVE_MESSAGE: "Salvar mensagem" LABEL_SEND_MESSAGE: "Enviar mensagem" LABEL_CLOSE_COMPOSE: "Fechar composição" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Nenhuma chave pĂşblica encontrada" NO_PUBLIC_KEYS_FOUND_FOR: "Nenhuma chave pĂşblica encontrada para o e-mail \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Nenhuma chave privada encontrada" NO_PRIVATE_KEY_FOUND_FOR: "Nenhuma chave privada encontrada para o e-mail \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Adicionar uma chave pĂşblica" SELECT_A_PRIVATE_KEY: "Selecione a chave privada" UNVERIFIRED_SIGNATURE: "Assinatura nĂŁo verificada" DECRYPTION_ERROR: "Erro de decripitação de OpenPGP" GOOD_SIGNATURE: "Boa assinatura de %USER%" PGP_ERROR: "Erro OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "Por favor, especifique endereço de e-mail remetente" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Especifique pelo menos um destinatário" NOTIFICATIONS: INVALID_TOKEN: "Senha inválida" AUTH_ERROR: "Falha na autenticação" ACCESS_ERROR: "Erro ao acessar" CONNECTION_ERROR: "NĂŁo foi possĂ­vel conectar-se ao servidor" CAPTCHA_ERROR: "Verificação CAPTCHA incorreta." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Esta ID social nĂŁo Ă© atribuĂ­do para qualquer conta de e-mail ainda. Entre usando suas credenciais de e-mail e ative o recursso de logar pelo Facebook em configurações de conta. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Esta ID social nĂŁo Ă© atribuĂ­do para qualquer conta de e-mail ainda. Entre usando suas credenciais de e-mail e ative o recursso de logar pelo Twitter em configurações de conta. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Esta ID social nĂŁo Ă© atribuĂ­do para qualquer conta de e-mail ainda. Entre usando suas credenciais de e-mail e ative o recursso de logar pelo Google em configurações de conta. DOMAIN_NOT_ALLOWED: "Este domĂ­nio nĂŁo Ă© permitido" ACCOUNT_NOT_ALLOWED: "Conta nĂŁo permitida" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Verificação de duas etapas requerida" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verificação de duas etapas" COULD_NOT_SAVE_NEW_PASSWORD: "NĂŁo foi possĂ­vel salvar a nova senha" CURRENT_PASSWORD_INCORRECT: "Senha atual incorreta" NEW_PASSWORD_SHORT: "A senha Ă© muito curta" NEW_PASSWORD_WEAK: "A senha Ă© muito fácil" NEW_PASSWORD_FORBIDDENT: "A senha contĂ©m caracteres nĂŁo permitidos" CONTACTS_SYNC_ERROR: "Erro na sincronização dos contatos" CANT_GET_MESSAGE_LIST: "NĂŁo foi possĂ­vel obter a lista de mensagens" CANT_GET_MESSAGE: "NĂŁo foi possĂ­vel obter a mensagem" CANT_DELETE_MESSAGE: "NĂŁo foi possĂ­vel excluir a mensagem" CANT_MOVE_MESSAGE: "NĂŁo foi possĂ­vel mover a mensagem" CANT_SAVE_MESSAGE: "NĂŁo foi possĂ­vel salvar a mensagem" CANT_SEND_MESSAGE: "NĂŁo foi possĂ­vel enviar a mensagem" INVALID_RECIPIENTS: "Destinatário inválido" CANT_SAVE_FILTERS: "NĂŁo Ă© possĂ­vel salvar os filtros" CANT_GET_FILTERS: "NĂŁo Ă© possĂ­vel obter os filtros" FILTERS_ARE_NOT_CORRECT: "Os filtros nĂŁo estĂŁo corretos" CANT_CREATE_FOLDER: "NĂŁo foi possĂ­vel criar a pasta" CANT_RENAME_FOLDER: "NĂŁo foi possĂ­vel renomear a pasta" CANT_DELETE_FOLDER: "NĂŁo foi possĂ­vel exluir a pasta" CANT_DELETE_NON_EMPTY_FOLDER: "NĂŁo Ă© possĂ­vel excluir diretĂłrio nĂŁo vazio" CANT_SUBSCRIBE_FOLDER: "NĂŁo foi possĂ­vel inscrever esta pasta" CANT_UNSUBSCRIBE_FOLDER: "NĂŁo foi possĂ­vel desinscrever esta pasta" CANT_SAVE_SETTINGS: "NĂŁo foi possĂ­vel salvar as configurações" CANT_SAVE_PLUGIN_SETTINGS: "NĂŁo foi possĂ­vel salvar as configurações" DOMAIN_ALREADY_EXISTS: "O domĂ­nio já existe" CANT_INSTALL_PACKAGE: "Erro ao instalar pacote de plugin" CANT_DELETE_PACKAGE: "Erro ao remover pacote de plugin" INVALID_PLUGIN_PACKAGE: "Pacote de plugins inválido" UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugins insuportados" LICENSING_SERVER_IS_UNAVAILABLE: "A assinatura do servidor está indisponĂ­vel" LICENSING_DOMAIN_EXPIRED: "A assinatura para este domĂ­nio expirou." LICENSING_DOMAIN_BANNED: "A assinatura para este domĂ­nio Ă© proibida." DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta demo nĂŁo tem permissĂŁo para enviar mensagens para endereços de e-mail externo!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" ACCOUNT_DOES_NOT_EXIST: "Conta nĂŁo existente" MAIL_SERVER_ERROR: "Ocorreu um erro ao acessar o servidor de e-mail" INVALID_INPUT_ARGUMENT: "Argumento de entrada inválido" UNKNOWN_ERROR: "Erro desconhecido" STATIC: BACK_LINK: "Recarregar" DOMAIN_LIST_DESC: "A lista de domĂ­nios de webmail tem permissĂŁo para acessar." PHP_EXSTENSIONS_ERROR_DESC: "Extensões necessárias PHP nĂŁo estĂŁo disponĂ­veis na sua configuração do PHP!" PHP_VERSION_ERROR_DESC: "Sua versĂŁo PHP (%VERSION%) Ă© menor do que o mĂ­nimo exigido 5.3.0!" NO_SCRIPT_TITLE: "JavaScript Ă© necessário para esta aplicação." NO_SCRIPT_DESC: | O JavaScript nĂŁo está disponĂ­vel em seu navegador. Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." NO_COOKIE_DESC: | Os Cookies nĂŁo estĂŁo disponĂ­veis em seu navegador. Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. BAD_BROWSER_TITLE: "Seu navegador está desatualizado." BAD_BROWSER_DESC: | Para usar todos os recursos do aplicativo, baixe e instale um desses navegadores: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/pt_PT.yml000066400000000000000000000776221361462701300262430ustar00rootroot00000000000000pt_PT: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Utilizador" LABEL_PASSWORD: "Palavra-passe" LABEL_SIGN_ME: "Lembrar-me" LABEL_VERIFICATION_CODE: "CĂłdigo de verificação" LABEL_DONT_ASK_VERIFICATION_CODE: "NĂŁo pedir o cĂłdigo durante 2 semanas" BUTTON_SIGN_IN: "Entrar" TITLE_SIGN_IN_GOOGLE: "Entre com a conta do Google" TITLE_SIGN_IN_FACEBOOK: "Entre com a conta do Facebook" TITLE_SIGN_IN_TWITTER: "Entre com a conta do Twitter" LABEL_FORGOT_PASSWORD: "Esqueci-me da palavra-passe" LABEL_REGISTRATION: "Registo" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Adicionar conta" BUTTON_SETTINGS: "Definições" BUTTON_HELP: "Ajuda" BUTTON_LOGOUT: "Sair" SEARCH: MAIN_INPUT_PLACEHOLDER: "Pesquisar" TITLE_ADV: "Pesquisa avançada" LABEL_ADV_FROM: "De" LABEL_ADV_TO: "Para" LABEL_ADV_SUBJECT: "Assunto" LABEL_ADV_TEXT: "Texto" LABEL_ADV_HAS_ATTACHMENT: "Tem anexo" LABEL_ADV_HAS_ATTACHMENTS: "Tem anexos" LABEL_ADV_FLAGGED: "Sinalizada" LABEL_ADV_UNSEEN: "NĂŁo lida" LABEL_ADV_DATE: "Data" LABEL_ADV_DATE_ALL: "Qualquer" LABEL_ADV_DATE_3_DAYS: "AtĂ© 3 dias atrás" LABEL_ADV_DATE_7_DAYS: "AtĂ© 1 semana atrás" LABEL_ADV_DATE_MONTH: "AtĂ© 1 mĂŞs atrás" LABEL_ADV_DATE_3_MONTHS: "AtĂ© 3 meses atrás" LABEL_ADV_DATE_6_MONTHS: "AtĂ© 6 meses atrás" LABEL_ADV_DATE_YEAR: "AtĂ© 1 ano atrás" BUTTON_ADV_SEARCH: "Pesquisar" PREVIEW_POPUP: FULLSCREEN: "Alternar ecrĂŁ-inteiro" ZOOM: "Zoom +/-" CLOSE: "Fechar (Esc)" LOADING: "A carregar..." GALLERY_PREV: "Anterior (seta p/ esquerda)" GALLERY_NEXT: "PrĂłxima (seta p/ direita)" GALLERY_COUNTER: "%curr% de %total%" IMAGE_ERROR: "Imagem nĂŁo pode ser carregado." AJAX_ERROR: "ConteĂşdo nĂŁo pode ser carregado." FOLDER_LIST: BUTTON_COMPOSE: "Compor" BUTTON_CONTACTS: "Contactos" INBOX_NAME: "Caixa de entrada" SENT_NAME: "Correio enviado" DRAFTS_NAME: "Rascunhos" SPAM_NAME: "Spam" TRASH_NAME: "Lixo" ARCHIVE_NAME: "Arquivo" QUOTA: TITLE: "Uso da Cota" MESSAGE_LIST: BUTTON_RELOAD: "Atualizar lista de mensagens" BUTTON_MOVE_TO: "Mover para" BUTTON_DELETE: "Eliminar" BUTTON_ARCHIVE: "Arquivar" BUTTON_SPAM: "Marcar como spam" BUTTON_NOT_SPAM: "NĂŁo Ă© spam" BUTTON_EMPTY_FOLDER: "Esvaziar pasta" BUTTON_MULTY_FORWARD: "Encaminhar mensagens" BUTTON_DELETE_WITHOUT_MOVE: "Eliminar definitivamente" BUTTON_MORE: "Mais" MENU_SET_SEEN: "Marcar como lida" MENU_SET_ALL_SEEN: "Marcar todas como lidas" MENU_UNSET_SEEN: "Marcar como nĂŁo lida" MENU_SET_FLAG: "Sinalizar" MENU_UNSET_FLAG: "Remover sinalização" MENU_SELECT_ALL: "Todas" MENU_SELECT_NONE: "Nenhuma" MENU_SELECT_INVERT: "Inverter" MENU_SELECT_UNSEEN: "NĂŁo lida" MENU_SELECT_SEEN: "Lida" MENU_SELECT_FLAGGED: "Sinalizada" MENU_SELECT_UNFLAGGED: "NĂŁo sinalizada" EMPTY_LIST: "Lista vazia." EMPTY_SEARCH_LIST: "Nenhuma mensagem corresponde Ă  sua pesquisa." SEARCH_RESULT_FOR: "Resultados de pesquisa para \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "voltar Ă  lista de mensagens" LIST_LOADING: "A carregar" EMPTY_SUBJECT_TEXT: "(Sem assunto)" PUT_MESSAGE_HERE: "Coloque a mensagem aqui para vĂŞ-la na lista" TODAY_AT: "Hoje Ă s %TIME%" YESTERDAY_AT: "Ontem Ă s %TIME%" SEARCH_PLACEHOLDER: "Pesquisar" NEW_MESSAGE_NOTIFICATION: "VocĂŞ tem %COUNT% novas mensagens!" QUOTA_SIZE: "Está a usar %SIZE% (%PROC%%) dos %LIMIT%" MESSAGE: BUTTON_EDIT: "Editar" BUTTON_BACK: "Voltar" BUTTON_CLOSE: "Fechar" BUTTON_DELETE: "Eliminar" BUTTON_ARCHIVE: "Arquivar" BUTTON_SPAM: "Marcar como spam" BUTTON_NOT_SPAM: "NĂŁo Ă© spam" BUTTON_MOVE_TO: "Mover para" BUTTON_MORE: "Mais" BUTTON_REPLY: "Responder" BUTTON_REPLY_ALL: "Responder a todos" BUTTON_FORWARD: "Encaminhar" BUTTON_FORWARD_AS_ATTACHMENT: "Enviar como anexo" BUTTON_EDIT_AS_NEW: "Editar como novo" BUTTON_SHOW_IMAGES: "Mostrar imagens" BUTTON_NOTIFY_READ_RECEIPT: "O remetente pediu para ser notificado quando vocĂŞ lesse esta mensagem." BUTTON_IN_NEW_WINDOW: "Ver em janela separada" BUTTON_THREAD_LIST: "Lista de tĂłpicos" BUTTON_THREAD_PREV: "Anterior" BUTTON_THREAD_NEXT: "Seguinte" BUTTON_THREAD_MORE: "Mais mensagens" MENU_HEADERS: "Mostrar tĂ­tulo das mensagens" MENU_VIEW_ORIGINAL: "Mostrar original" MENU_DOWNLOAD_ORIGINAL: "Transferir como ficheiro .eml" MENU_FILTER_SIMILAR: "Filtrar mensagens semelhantes a esta" MENU_PRINT: "Imprimir" EMPTY_SUBJECT_TEXT: "(Sem assunto)" LABEL_SUBJECT: "Assunto" LABEL_DATE: "Data" LABEL_FROM: "De" LABEL_FROM_SHORT: "de" LABEL_TO: "Para" LABEL_TO_SHORT: "para" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Resp.-Para" PRINT_LABEL_FROM: "De" PRINT_LABEL_TO: "Para" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Resp.-Para" PRINT_LABEL_DATE: "Data" PRINT_LABEL_SUBJECT: "Assunto" PRINT_LABEL_ATTACHMENTS: "Anexos" MESSAGE_LOADING: "A carregar" MESSAGE_VIEW_DESC: "Selecione uma mensagem na lista para ver o conteĂşdo aqui." PGP_PASSWORD_INPUT_PLACEHOLDER: "Palavra-passe" PGP_SIGNED_MESSAGE_DESC: "Mensagem assinada com OpenPGP (clique para verificar)" PGP_ENCRYPTED_MESSAGE_DESC: "Mensagem encriptada com OpenPGP (clique para desencriptar)" LINK_DOWNLOAD_AS_ZIP: "Transferir em arquivo zip" LINK_SAVE_TO_OWNCLOUD: "Guardar no ownCloud" LINK_SAVE_TO_DROPBOX: "Guardar no Dropbox" READ_RECEIPT: SUBJECT: "Recibo de leitura (apresentado) - %SUBJECT%" BODY: | Este Ă© um comprovativo de leitura para o e-mail que vocĂŞ enviou para %READ-RECEIPT%. Nota: Este comprovativo apenas confirma que a mensagem foi apresentada no computador do destinatário. NĂŁo existe nenhuma garantia de que o destinatário tenha lido ou compreendido o conteĂşdo da mensagem. SUGGESTIONS: SEARCHING_DESC: "A procurar..." CONTACTS: LEGEND_CONTACTS: "Contactos" SEARCH_INPUT_PLACEHOLDER: "Procurar" BUTTON_ADD_CONTACT: "Adicionar contacto" BUTTON_CREATE_CONTACT: "Criar" BUTTON_UPDATE_CONTACT: "Atualizar" BUTTON_IMPORT: "Importar (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exportar (vcf, vCard)" BUTTON_EXPORT_CSV: "Exportar (csv)" ERROR_IMPORT_FILE: "Erro ao importar (formato do ficheiro inválido)" LIST_LOADING: "A carregar" EMPTY_LIST: "Nenhum contacto aqui" EMPTY_SEARCH: "Nenhum contacto encontrado" CLEAR_SEARCH: "Limpar pesquisa" CONTACT_VIEW_DESC: "Selecione o contacto na lista para visualizá-lo." LABEL_DISPLAY_NAME: "Nome a apresentar" LABEL_EMAIL: "Email" LABEL_PHONE: "Telefone" LABEL_WEB: "Página web" LABEL_BIRTHDAY: "Aniversário" LINK_ADD_EMAIL: "Adicionar um endereço e-mail" LINK_ADD_PHONE: "Adicionar um telefone" LINK_BIRTHDAY: "Aniversário" PLACEHOLDER_ENTER_DISPLAY_NAME: "Introduza o nome a apresentar" PLACEHOLDER_ENTER_LAST_NAME: "Introduza o Ăşltimo nome" PLACEHOLDER_ENTER_FIRST_NAME: "Introduza o primeiro nome" PLACEHOLDER_ENTER_NICK_NAME: "Introduza uma alcunha" LABEL_READ_ONLY: "Ler apenas" LABEL_SHARE: "Partilhar" ADD_MENU_LABEL: "Adicionar" ADD_MENU_NICKNAME: "Alcunha" ADD_MENU_NOTES: "Notas" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Telefone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Morada" ADD_MENU_BIRTHDAY: "Aniversário" ADD_MENU_TAGS: "Marcadores" BUTTON_SHARE_NONE: "NinguĂ©m" BUTTON_SHARE_ALL: "Todos" BUTTON_SYNC: "Sincronização (CardDAV)" COMPOSE: TITLE_FROM: "De" TITLE_TO: "Para" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Resp.-Para" TITLE_SUBJECT: "Assunto" LINK_SHOW_INPUTS: "Mostrar todos os campos" BUTTON_SEND: "Enviar" BUTTON_SAVE: "Guardar" BUTTON_DELETE: "Eliminar" BUTTON_CANCEL: "Cancelar" BUTTON_MINIMIZE: "Minimizar" SAVED_TIME: "Guardado Ă s %TIME%" SAVED_ERROR_ON_SEND: "A sua mensagem foi enviada, mas nĂŁo foi guardada na pasta dos itens enviados." DISCARD_UNSAVED_DATA: "Rejeitar o conteĂşdo que nĂŁo foi guardado?" ATTACH_FILES: "Anexar ficheiros" ATTACH_DROP_FILES_DESC: "Arraste os ficheiros para aqui" ATTACH_ITEM_CANCEL: "Cancelar" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% escreveu" FORWARD_MESSAGE_TOP_TITLE: "-------- Mensagem Encaminhada -------" FORWARD_MESSAGE_TOP_FROM: "De" FORWARD_MESSAGE_TOP_TO: "Para" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Enviado" FORWARD_MESSAGE_TOP_SUBJECT: "Assunto" EMPTY_TO_ERROR_DESC: "Por favor, especifique pelo menos um destinatário" NO_ATTACHMENTS_HERE_DESC: "Sem anexos aqui." ATTACHMENTS_ERROR_DESC: "Aviso! Nem todos os anexos foram carregados." ATTACHMENTS_UPLOAD_ERROR_DESC: "Ainda nĂŁo foram carregados todos os anexos" BUTTON_REQUEST_READ_RECEIPT: "Pedir um recibo de leitura" BUTTON_MARK_AS_IMPORTANT: "Marcar como importante" BUTTON_OPEN_PGP: "OpenPGP (apenas texto simples)" BUTTON_REQUEST_DSN: "Pedir um recibo de entrega" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Sim" BUTTON_NO: "NĂŁo" DESC_WANT_CLOSE_THIS_WINDOW: "Tem a certeza que deseja fechar esta janela?" DESC_WANT_DELETE_MESSAGES: "Tem a certeza de que deseja eliminar esta(s) mensagem(s)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Escolha o idioma" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Adicionar conta?" BUTTON_ADD_ACCOUNT: "Adicionar" TITLE_UPDATE_ACCOUNT: "Atualizar conta?" BUTTON_UPDATE_ACCOUNT: "Atualizar" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Adicionar identidade?" TITLE_UPDATE_IDENTITY: "Atualizar identidade?" BUTTON_ADD_IDENTITY: "Adicionar" BUTTON_UPDATE_IDENTITY: "Atualizar" LABEL_EMAIL: "E-mail" LABEL_NAME: "Nome" LABEL_REPLY_TO: "Resp.-Para" LABEL_SIGNATURE: "Assinatura" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Nas respostas, inserir esta assinatura acima da mensagem citada" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Criar pasta?" LABEL_NAME: "Nome da pasta" LABEL_PARENT: "Pasta principal" BUTTON_CREATE: "Criar" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" TITLE_CREATING_PROCESS: "A criar pasta" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Eliminar todas as mensagens da pasta?" BUTTON_CLEAR: "Limpar" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" DANGER_DESC_WARNING: "Atenção!" DANGER_DESC_HTML_1: "Esta ação irá resultar na remoção definitiva de todos os e-mails na pasta %FOLDER%." DANGER_DESC_HTML_2: "Uma vez iniciado, o processo nĂŁo pode ser interrompido ou cancelado." TITLE_CLEARING_PROCESS: "A eliminar a pasta..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importar chave OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Importar" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Ver chave OpenPGP" BUTTON_SELECT: "Escolher" BUTTON_CLOSE: "Fechar" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Gerar chaves OpenPGP" LABEL_EMAIL: "Email" LABEL_NAME: "Nome" LABEL_PASSWORD: "Palavra-passe" LABEL_KEY_BIT_LENGTH: "Comprimento da chave" BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "Assinar/Encriptar com OpenPGP" LABEL_SIGN: "Assinar" LABEL_ENCRYPT: "Encriptar" LABEL_PASSWORD: "Palavra-passe" BUTTON_SIGN: "Assinar" BUTTON_ENCRYPT: "Encriptar" BUTTON_SIGN_AND_ENCRYPT: "Assinar e encriptar" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "Teste de verificação em 2-Etapas" LABEL_CODE: "CĂłdigo" BUTTON_TEST: "Testar" POPUPS_FILTER: TITLE_CREATE_FILTER: "Criar um filtro?" TITLE_EDIT_FILTER: "Atualizar um filtro?" FILTER_NAME: "Nome" LEGEND_CONDITIONS: "Condições" LEGEND_ACTIONS: "Ações" BUTTON_DONE: "Terminado" BUTTON_ADD_CONDITION: "Adicionar uma condição" SELECT_ACTION_NONE: "Nenhuma" SELECT_ACTION_MOVE_TO: "Mover para" SELECT_ACTION_FORWARD_TO: "Encaminhar para" SELECT_ACTION_REJECT: "Rejeitar" SELECT_ACTION_VACATION_MESSAGE: "Mensagem de fĂ©rias" SELECT_ACTION_DISCARD: "Descartar" SELECT_FIELD_FROM: "De" SELECT_FIELD_RECIPIENTS: "Destinatários (Para ou CC)" SELECT_FIELD_SUBJECT: "Assunto" SELECT_FIELD_HEADER: "Cebeçalho" SELECT_FIELD_SIZE: "Tamanho" SELECT_TYPE_CONTAINS: "ContĂ©m" SELECT_TYPE_NOT_CONTAINS: "NĂŁo contĂ©m" SELECT_TYPE_MATCHES: "Corresponde (* e ? suportados)" SELECT_TYPE_NOT_MATCHES: "NĂŁo correponde (* e ? suportados)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Sem Regexp" SELECT_TYPE_EQUAL_TO: "Igual a" SELECT_TYPE_NOT_EQUAL_TO: "NĂŁo Ă© igual a" SELECT_TYPE_OVER: "Superior" SELECT_TYPE_UNDER: "Inferior" SELECT_MATCH_ANY: "Correspondendo a qualquer uma das regras que se seguem" SELECT_MATCH_ALL: "Correspondendo a todas as regras que se seguem" MARK_AS_READ_LABEL: "Marcar como lida" REPLY_INTERVAL_LABEL: "Intervalo de resposta (dias)" KEEP_LABEL: "Manter" STOP_LABEL: "NĂŁo parar de processar as regras" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Assunto (opcional)" VACATION_MESSAGE_LABEL: "Mensagem" VACATION_RECIPIENTS_LABEL: "Destinatários (separados por vĂ­rgula)" REJECT_MESSAGE_LABEL: "Rejeitar mensagem" ALL_INCOMING_MESSAGES_DESC: "Todas as mensagens recebidas" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Selecione as pastas do sistema" SELECT_CHOOSE_ONE: "Escolha uma" SELECT_UNUSE_NAME: "NĂŁo usar" LABEL_SENT: "Enviadas" LABEL_DRAFTS: "Rascunhos" LABEL_SPAM: "Spam" LABEL_TRASH: "Lixo" LABEL_ARCHIVE: "Arquivos" BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" NOTIFICATION_SENT: | VocĂŞ nĂŁo selecionou a pasta "Sent" de sistema, onde as mensagens enviadas sĂŁo colocadas. Se vocĂŞ nĂŁo quiser salvar as mensagens enviadas, por favor selecione a opção "Do not use". NOTIFICATION_DRAFTS: "VocĂŞ nĂŁo selecionou a pasta \"Drafts\" de sistema, onde as mensagens sĂŁo guardadas enquanto sĂŁo escritas." NOTIFICATION_SPAM: | VocĂŞ nĂŁo selecionou a pasta "Spam" de sistema, onde as mensagens de spam sĂŁo colocadas. Se vocĂŞ deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". NOTIFICATION_TRASH: | VocĂŞ nĂŁo selecionou a pasta "Trash" de sistema, onde as mensagens eliminadas sĂŁo colocadas. Se vocĂŞ deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". NOTIFICATION_ARCHIVE: "VocĂŞ nĂŁo selecionou a pasta \"Archive\" de sistema, onde as mensagens arquivadas sĂŁo colocadas." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Verificação em 2-Etapas" LABEL_ENABLE_TWO_FACTOR: "Ativar verificação em 2-Etapas" LABEL_TWO_FACTOR_USER: "Utilizador" LABEL_TWO_FACTOR_STATUS: "Estado" LABEL_TWO_FACTOR_SECRET: "Segredo" LABEL_TWO_FACTOR_BACKUP_CODES: "CĂłdigos secundários" BUTTON_CREATE: "Criar novo Segredo" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Limpar" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "Testar" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Mostrar Segredo" BUTTON_HIDE_SECRET: "Ocultar Segredo" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "NĂŁo configurado" TWO_FACTOR_SECRET_DESC: >- Importe esta informação no seu cliente Google Authenticator (ou outro cliente TOTP) utilizando o cĂłdigo QR fornecido abaixo ou introduzindo o cĂłdigo manualmente. TWO_FACTOR_BACKUP_CODES_DESC: >- Se nĂŁo consegue receber cĂłdigos atravĂ©s do Google Authenticator, pode usar os cĂłdigos secundários para entrar. ApĂłs ter usado um cĂłdigo secundário para entrar, este será desativado. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "NĂŁo pode alterar este parâmetro antes de testar." TITLES: LOADING: "A carregar" LOGIN: "Utilizador" MAILBOX: "Caixa de correio" SETTINGS: "Definições" COMPOSE: "Compor" UPLOAD: ERROR_FILE_IS_TOO_BIG: "O ficheiro Ă© muito grande" ERROR_FILE_PARTIALLY_UPLOADED: "O ficheiro foi carregado parcialmente devido a um erro desconhecido" ERROR_NO_FILE_UPLOADED: "Nenhum ficheiro carregado" ERROR_MISSING_TEMP_FOLDER: "O ficheiro temporário está em falta" ERROR_ON_SAVING_FILE: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" ERROR_FILE_TYPE: "Tipo de ficheiro inválido" ERROR_UNKNOWN: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" EDITOR: TEXT_SWITCHER_RICH_FORMATTING: "Formatação avançada" TEXT_SWITCHER_CONFIRM: "A formatação de texto e as imagens serĂŁo perdidas. Tem certeza de que deseja continuar?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Pessoal" LABEL_GENERAL_NAME: "Geral" LABEL_CONTACTS_NAME: "Contactos" LABEL_FOLDERS_NAME: "Pastas" LABEL_ACCOUNTS_NAME: "Contas" LABEL_IDENTITY_NAME: "Identidade" LABEL_IDENTITIES_NAME: "Identidades" LABEL_FILTERS_NAME: "Filtros" LABEL_TEMPLATES_NAME: "Modelos" LABEL_SECURITY_NAME: "Segurança" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Temas" LABEL_CHANGE_PASSWORD_NAME: "Palavra-passe" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Voltar" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtros" BUTTON_SAVE: "Guardar" BUTTON_ADD_FILTER: "Adicionar um filtro" BUTTON_DELETE: "Eliminar" BUTTON_RAW_SCRIPT: "Usar um script personalizado de utilizador" SUBNAME_NONE: "Nenhum" SUBNAME_MOVE_TO: "Mover para \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Encaminhar para \"%EMAIL%\"" SUBNAME_REJECT: "Rejeitar" SUBNAME_VACATION_MESSAGE: "Mensagem de fĂ©rias" SUBNAME_DISCARD: "Descartar" CAPABILITY_LABEL: "Capacidade" LOADING_PROCESS: "A atualizar lista de filtros" DELETING_ASK: "Tem a certeza?" CHACHES_NEED_TO_BE_SAVED_DESC: "Estas alterações tĂŞm que ser guardadas no servidor." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identidade" LABEL_DISPLAY_NAME: "Nome" LABEL_REPLY_TO: "Resp.-Para" LABEL_SIGNATURE: "Assinatura" LABEL_ADD_SIGNATURE_TO_ALL: "Adicionar a sua assinatura a todas as mensagens de saĂ­da" SETTINGS_SECURITY: LEGEND_SECURITY: "Segurança" LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificação de 2 etapas" LABEL_AUTOLOGOUT: "Terminar sessĂŁo auto." AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuto(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "Geral" LABEL_LANGUAGE: "Idioma" LABEL_IDENTITY: "Identidade" LABEL_LAYOUT: "Apresentação" LABEL_LAYOUT_NO_SPLIT: "Sem separação" LABEL_LAYOUT_VERTICAL_SPLIT: "Separação vertical" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Separação horizontal" LABEL_EDITOR: "Editor de texto padrĂŁo" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Texto simples" LABEL_EDITOR_HTML_FORCED: "Html (forçado)" LABEL_EDITOR_PLAIN_FORCED: "Texto simples (forçado)" LABEL_ANIMATION: "Animação de interface" LABEL_ANIMATION_FULL: "Completa" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Nenhuma" LABEL_VIEW_OPTIONS: "Ver opções" LABEL_USE_PREVIEW_PANE: "Use o painel de prĂ©-visualização" LABEL_USE_CHECKBOXES_IN_LIST: "Apresentar caixas de seleção na lista" LABEL_USE_THREADS: "Usar tĂłpicos de conversa" LABEL_REPLY_SAME_FOLDER: "Colocar respostas na pasta das mensagens a que responde" LABEL_SHOW_IMAGES: "Apresentar sempre as imagens no corpo da mensagem" LABEL_SHOW_ANIMATION: "Mostrar animação" LABEL_MESSAGE_PER_PAGE: "Mensagens por página" LABEL_NOTIFICATIONS: "Notificações" LABEL_SOUND_NOTIFICATION: "Notificações sonoras" LABEL_CHROME_NOTIFICATION_DESC: "Apresentar notificações para novas mensagens" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado pelo navegador)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contactos" LABEL_CONTACTS_AUTOSAVE: "Adicionar automaticamente destinatários Ă  sua lista de endereços" LEGEND_CONTACTS_SYNC: "Sincronização Remota (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Ativar sincronização remota" LABEL_CONTACTS_SYNC_SERVER: "Servidor" LABEL_CONTACTS_SYNC_AB_URL: "URL do livro de endereços" LABEL_CONTACTS_SYNC_USER: "Utilizador" LABEL_CONTACTS_SYNC_PASSWORD: "Palavra-passe" SETTINGS_THEMES: LEGEND_THEMES: "Temas" LEGEND_THEMES_CUSTOM: "Configuração de tema personalizado" LABEL_CUSTOM_TYPE: "Tipo" LABEL_CUSTOM_TYPE_LIGHT: "Claro" LABEL_CUSTOM_TYPE_DARK: "Escuro" LABEL_CUSTOM_BACKGROUND_IMAGE: "Imagem de fundo" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Carregar imagem de fundo (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Ficheiro muito grande" ERROR_FILE_TYPE_ERROR: "Tipo de ficheiro inválido (apenas JPG e PNG)" ERROR_UNKNOWN: "Ocorreu um erro desconhecido durante o carregamento do ficheiro" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Ligar ao Google" BUTTON_GOOGLE_DISCONNECT: "Desligar do Google" MAIN_GOOGLE_DESC: "Depois de ativar o inĂ­cio de sessĂŁo atravĂ©s do Google, poderá entrar nesta conta usando o botĂŁo do Google no ecrĂŁ de inĂ­cio de sessĂŁo." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Ligar ao Facebook" BUTTON_FACEBOOK_DISCONNECT: "Desligar do Facebook" MAIN_FACEBOOK_DESC: "Depois de ativar o inĂ­cio de sessĂŁo atravĂ©s do Facebook, poderá entrar nesta conta usando o botĂŁo do Facebook no ecrĂŁ de inĂ­cio de sessĂŁo." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Ligar ao Twitter" BUTTON_TWITTER_DISCONNECT: "Desligar do Twitter" MAIN_TWITTER_DESC: "Depois de ativar o inĂ­cio de sessĂŁo atravĂ©s do Twitter, poderá entrar nesta conta usando o botĂŁo do Twitter no ecrĂŁ de inĂ­cio de sessĂŁo." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Lista de pastas" BUTTON_CREATE: "Criar pasta" BUTTON_DELETE: "Excluir" BUTTON_SUBSCRIBE: "Assinar" BUTTON_UNSUBSCRIBE: "Anular" LOADING_PROCESS: "Atualizar lista de pastas" CREATING_PROCESS: "Criar a pasta" DELETING_PROCESS: "Eliminar a pasta" RENAMING_PROCESS: "Renomear a pasta" DELETING_ASK: "Tem a certeza?" TO_MANY_FOLDERS_DESC_1: "VocĂŞ tem demasiadas pastas!" TO_MANY_FOLDERS_DESC_2: "Apenas apresentámos parte delas, para evitar problemas de desempenho." HELP_DELETE_FOLDER: "Eliminar pasta" HELP_SHOW_HIDE_FOLDER: "Mostrar/ocultar pasta" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Lista de contas" LEGEND_IDENTITIES: "Identidades" LEGEND_ACCOUNTS_AND_IDENTITIES: "Contas e Identidades" BUTTON_ADD_ACCOUNT: "Adicionar uma conta" BUTTON_ADD_IDENTITY: "Adicionar uma identidade" BUTTON_DELETE: "Eliminar" LOADING_PROCESS: "A atualizar..." DELETING_ASK: "Tem a certeza?" DEFAULT_IDENTITY_LABEL: "predefinida" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identidade" LEGEND_IDENTITIES: "Identidades adicionais" LABEL_DEFAULT: "Predefinida" LABEL_DISPLAY_NAME: "Nome" LABEL_REPLY_TO: "Resp.-Para" LABEL_SIGNATURE: "Assinatura" LABEL_ADD_SIGNATURE_TO_ALL: "Adicione a sua assinatura a todas as mensagens enviadas" BUTTON_ADD_IDENTITY: "Adicionar identidade" BUTTON_DELETE: "Eliminar" LOADING_PROCESS: "A atualizar lista de identidades" DELETING_ASK: "Tem a certeza?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Mudar a palavra-passe" LABEL_CURRENT_PASSWORD: "Palavra-passe atual" LABEL_NEW_PASSWORD: "Nova palavra-passe" LABEL_REPEAT_PASSWORD: "Repita a nova palavra-passe" BUTTON_UPDATE_PASSWORD: "Defina a nova palavra-passe" ERROR_PASSWORD_MISMATCH: "As palavras-passe nĂŁo sĂŁo idĂŞnticas, tente novamente por favor" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importar chave OpenPGP" BUTTON_GENERATE_OPEN_PGP_KEYS: "Gerar chaves OpenPGP" TITLE_PRIVATE: "Privada" TITLE_PUBLIC: "PĂşblica" DELETING_ASK: "Tem a certeza?" GENERATE_ONLY_HTTPS: "Apenas HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Ajuda para atalhos de teclado" TAB_MAILBOX: "Caixa de correio" TAB_MESSAGE_LIST: "Lista de mensagens" TAB_MESSAGE_VIEW: "Vista da mensagem" TAB_COMPOSE: "Compor" LABEL_OPEN_USER_DROPDOWN: "Abrir menu do utilizador" LABEL_REPLY: "Responder" LABEL_REPLY_ALL: "Responder a todos" LABEL_FORWARD: "Encaminhar" LABEL_FORWARD_MULTIPLY: "Encaminhar (multiplicar)" LABEL_HELP: "Ajuda" LABEL_CHECK_ALL: "Selecionar todas as mensagens" LABEL_ARCHIVE: "Arquivar" LABEL_DELETE: "Eliminar" LABEL_OPEN_THREAD: "Abrir tĂłpico selecionado" LABEL_MOVE: "Mover" LABEL_READ: "Ler as mensagens selecionadas" LABEL_UNREAD: "Marcar as mensagens selecionadas como nĂŁo lidas" LABEL_IMPORTANT: "Marcar como Importantes as mensagens selecionadas" LABEL_SEARCH: "Pesquisar" LABEL_CANCEL_SEARCH: "Cancelar pesquisa" LABEL_FULLSCREEN_ENTER: "EcrĂŁ-inteiro (com janela de prĂ©-visualização)" LABEL_VIEW_MESSAGE_ENTER: "Ver mensagem (sem janela de prĂ©-visualização)" LABEL_SWITCH_TO_MESSAGE: "Dar foco Ă  mensagem selecionada" LABEL_SWITCH_TO_FOLDER_LIST: "Dar foco Ă  lista de pastas" LABEL_FULLSCREEN_TOGGLE: "Alternar modo ecrĂŁ-inteiro" LABEL_BLOCKQUOTES_TOGGLE: "Alternar visibilidade do texto citado" LABEL_THREAD_NEXT: "Mensagem seguinte deste tĂłpico" LABEL_THREAD_PREV: "Mensagem anterior deste tĂłpico" LABEL_PRINT: "Imprimir" LABEL_EXIT_FULLSCREEN: "Sair do modo ecrĂŁ-inteiro" LABEL_CLOSE_MESSAGE: "Fechar mensagem (sem janela de prĂ©-visualização)" LABEL_SWITCH_TO_LIST: "Dar foco Ă  lista de mensagens" LABEL_OPEN_COMPOSE_POPUP: "Abrir janela de composição" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir menu de identidades" LABEL_SAVE_MESSAGE: "Guardar mensagem" LABEL_SEND_MESSAGE: "Enviar mensagem" LABEL_CLOSE_COMPOSE: "Fechar janela de composição" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Nenhuma chave pĂşblica encontrada" NO_PUBLIC_KEYS_FOUND_FOR: "Nenhuma chave pĂşblica encontrada para o email \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Nenhuma chave privada encontrada" NO_PRIVATE_KEY_FOUND_FOR: "Nenhuma chave privada encontrada para o email \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Adicionar uma chave pĂşblica" UNVERIFIRED_SIGNATURE: "Assinatura nĂŁo verificada" DECRYPTION_ERROR: "Erro de desencriptação OpenPGP" GOOD_SIGNATURE: "Boa assinatura de %USER%" PGP_ERROR: "Erro OpenPGP: %ERROR%" SPECIFY_FROM_EMAIL: "Por favor especifique o endereço de email DE" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Por favor especifique pelo menos um destinatário" NOTIFICATIONS: INVALID_TOKEN: "Token inválido" AUTH_ERROR: "Falha na autenticação" ACCESS_ERROR: "Erro de acesso" CONNECTION_ERROR: "NĂŁo foi possĂ­vel conectar ao servidor" CAPTCHA_ERROR: "Verificação CAPTCHA inválido." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Esse usuário Facebook nĂŁo está associado a nenhuma conta de email ainda. Entre utilizando seu email e senha e habilite essa função em suas configurações de conta. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Esse usuário Twitter nĂŁo está associado a nenhuma conta de email ainda. Entre utilizando seu email e senha e habilite essa função em suas configurações de conta. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Esse usuário Google nĂŁo está associado a nenhuma conta de email ainda. Entre utilizando seu email e senha e habilite essa função em suas configurações de conta. DOMAIN_NOT_ALLOWED: "Este domĂ­nio nĂŁo Ă© permitido" ACCOUNT_NOT_ALLOWED: "Esta conta nĂŁo Ă© permitida" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "É necessária a verificação em duas etapas" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Erro na verifricação em duas etapas" COULD_NOT_SAVE_NEW_PASSWORD: "NĂŁo foi possĂ­vel guardar a nova palavra-passe" CURRENT_PASSWORD_INCORRECT: "A palavra-passe atual está incorreta" NEW_PASSWORD_SHORT: "A palavra-passe Ă© muito curta" NEW_PASSWORD_WEAK: "A palavra-passe Ă© muito simples" NEW_PASSWORD_FORBIDDENT: "A palavra-passe contĂ©m caracteres proibidos" CONTACTS_SYNC_ERROR: "Erro na sincronização de contactos" CANT_GET_MESSAGE_LIST: "NĂŁo Ă© possĂ­vel obter a lista de mensagens" CANT_GET_MESSAGE: "NĂŁo Ă© possĂ­vel obter a mensagem" CANT_DELETE_MESSAGE: "NĂŁo Ă© possĂ­vel eliminar a mensagem" CANT_MOVE_MESSAGE: "NĂŁo Ă© possĂ­vel mover a mensagem" CANT_SAVE_MESSAGE: "NĂŁo Ă© possĂ­vel guardar a mensagem" CANT_SEND_MESSAGE: "NĂŁo Ă© possĂ­vel enviar a mensagem" INVALID_RECIPIENTS: "Destinatário inválido" CANT_SAVE_FILTERS: "NĂŁo Ă© possĂ­vel guardar os filtros" CANT_GET_FILTERS: "NĂŁo Ă© possĂ­vel obter os filtros" FILTERS_ARE_NOT_CORRECT: "Os filtros nĂŁo estĂŁo corretos" CANT_CREATE_FOLDER: "NĂŁo Ă© possĂ­vel criar a pasta" CANT_RENAME_FOLDER: "NĂŁo Ă© possĂ­vel renomear a pasta" CANT_DELETE_FOLDER: "NĂŁo Ă© possĂ­vel eliminar a pasta" CANT_DELETE_NON_EMPTY_FOLDER: "NĂŁo Ă© possĂ­vel eliminar pastas com conteĂşdos" CANT_SUBSCRIBE_FOLDER: "NĂŁo Ă© possĂ­vel assinar esta pasta" CANT_UNSUBSCRIBE_FOLDER: "NĂŁo Ă© possĂ­vel cancelar esta pasta" CANT_SAVE_SETTINGS: "NĂŁo Ă© possĂ­vel salvar as definições" CANT_SAVE_PLUGIN_SETTINGS: "NĂŁo Ă© possĂ­vel guardar as definições" DOMAIN_ALREADY_EXISTS: "O domĂ­nio já existe" CANT_INSTALL_PACKAGE: "Erro ao instalar pacote" CANT_DELETE_PACKAGE: "Erro ao remover pacote" INVALID_PLUGIN_PACKAGE: "Pacote de plugin inválido" UNSUPPORTED_PLUGIN_PACKAGE: "Pacote de plugin nĂŁo suportado" LICENSING_SERVER_IS_UNAVAILABLE: "O servidor de subscrição está indisponĂ­vel" LICENSING_DOMAIN_EXPIRED: "A subscrição para este domĂ­nio expirou." LICENSING_DOMAIN_BANNED: "A subscrição para este domĂ­nio está proibida." DEMO_SEND_MESSAGE_ERROR: "Por motivos de segurança, esta conta de demonstração nĂŁo tem permissĂŁo para enviar mensagens para endereços de e-mail externos!" DEMO_ACCOUNT_ERROR: "Por motivos de segurança, esta conta nĂŁo tem permissĂŁo de executar esta ação!" ACCOUNT_ALREADY_EXISTS: "Esta conta já existe" ACCOUNT_DOES_NOT_EXIST: "Conta inexistente" MAIL_SERVER_ERROR: "Ocorreu um erro ao aceder ao servidor de email" INVALID_INPUT_ARGUMENT: "Parâmetro de entrada inválido" UNKNOWN_ERROR: "Erro desconhecido" STATIC: BACK_LINK: "Recarregar" DOMAIN_LIST_DESC: "Lista de domĂ­nios que o webmail tem permissĂŁo para aceder." PHP_EXSTENSIONS_ERROR_DESC: "As extensões PHP necessárias nĂŁo estĂŁo disponĂ­veis na sua configuração do PHP!" PHP_VERSION_ERROR_DESC: "A sua versĂŁo do PHP (%VERSION%) Ă© menor do que a mĂ­nima exigida: 5.3.0!" NO_SCRIPT_TITLE: "É necessário JavaScript para esta aplicação." NO_SCRIPT_DESC: | O suporte de JavaScript nĂŁo está disponĂ­vel no seu navegador. Por favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente. NO_COOKIE_TITLE: "É necessário suporte de cookies para esta aplicação." NO_COOKIE_DESC: | O suport de Cookies nĂŁo está disponĂ­vel no seu navegador. Por favor ative o suporte de Cookies nas definições do seu navegador e tente novamente. BAD_BROWSER_TITLE: "O seu navegador está desatualizado." BAD_BROWSER_DESC: | Para usar todas as funções da aplicação, transfira e instale um destes navegadores: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/ro_RO.yml000066400000000000000000000770001361462701300262230ustar00rootroot00000000000000ro_RO: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "Conectare" LABEL_PASSWORD: "ParolÄ" LABEL_SIGN_ME: "Čšine-mÄ minte" LABEL_VERIFICATION_CODE: "Cod de verificare" LABEL_DONT_ASK_VERIFICATION_CODE: "Nu mai cereČ›i codul timp de 2 sÄptÄmâni" BUTTON_SIGN_IN: "Conectare" TITLE_SIGN_IN_GOOGLE: "ConectaČ›i-vÄ cu Google" TITLE_SIGN_IN_FACEBOOK: "ConectaČ›i-vÄ cu Facebook" TITLE_SIGN_IN_TWITTER: "ConectaČ›i-vÄ cu Twitter" LABEL_FORGOT_PASSWORD: "Am uitat parola" LABEL_REGISTRATION: "ĂŽnregistrare" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "AdaugÄ un cont" BUTTON_SETTINGS: "OpČ›iuni" BUTTON_HELP: "Help" BUTTON_LOGOUT: "Deconectare" MOBILE: BUTTON_MOBILE_VERSION: "Versiunea de mobil" BUTTON_DESKTOP_VERSION: "Versiunea desktop" SEARCH: MAIN_INPUT_PLACEHOLDER: "CautÄ Ă®n mesaje" TITLE_ADV: "CÄutare avansatÄ" LABEL_ADV_FROM: "De la" LABEL_ADV_TO: "cÄtre" LABEL_ADV_SUBJECT: "Subiect" LABEL_ADV_TEXT: "ConČ›inut" LABEL_ADV_HAS_ATTACHMENT: "Are ataČ™ament" LABEL_ADV_HAS_ATTACHMENTS: "AtaČ™amente" LABEL_ADV_FLAGGED: "Importante" LABEL_ADV_UNSEEN: "Necitit" LABEL_ADV_DATE: "Data" LABEL_ADV_DATE_ALL: "Tot timpul" LABEL_ADV_DATE_3_DAYS: "Đ— zile" LABEL_ADV_DATE_7_DAYS: "7 zile" LABEL_ADV_DATE_MONTH: "Ă®n aceastÄ lunÄ" LABEL_ADV_DATE_3_MONTHS: "3 luni" LABEL_ADV_DATE_6_MONTHS: "6 luni" LABEL_ADV_DATE_YEAR: "Ă®n acest an" BUTTON_ADV_SEARCH: "cÄutare" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "ĂŽnchide (Esc)" LOADING: "Se Ă®carcÄ..." GALLERY_PREV: "Precedentul (sÄgeatÄ stânga)" GALLERY_NEXT: "UrmÄtorul (sÄgeatÄ dreapta)" GALLERY_COUNTER: "%curr% din %total%" IMAGE_ERROR: "Imaginea nu a putut fi Ă®ncÄrcatÄ" AJAX_ERROR: "ConČ›inutul nu a putut fi Ă®ncÄrcat" FOLDER_LIST: BUTTON_COMPOSE: "Compune" BUTTON_CONTACTS: "Contacte" BUTTON_NEW_MESSAGE: "Mesaj nou" INBOX_NAME: "IntrÄri" SENT_NAME: "Trimise" DRAFTS_NAME: "Salvate" SPAM_NAME: "SPAM" TRASH_NAME: "Čterse" ARCHIVE_NAME: "Archive" QUOTA: TITLE: "CotÄ" MESSAGE_LIST: BUTTON_RELOAD: "Actualizare" BUTTON_MOVE_TO: "MutÄ la" BUTTON_DELETE: "Čterge" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "SPAM" BUTTON_NOT_SPAM: "Not SPAM" BUTTON_EMPTY_FOLDER: "GoleČ™te folderul" BUTTON_MULTY_FORWARD: "RedirecČ›ioneazÄ mesajul" BUTTON_DELETE_WITHOUT_MOVE: "Čterge definitiv" BUTTON_MORE: "Mai mult" MENU_SET_SEEN: "MarcheazÄ ca citit" MENU_SET_ALL_SEEN: "MarcheazÄ toate ca citite" MENU_UNSET_SEEN: "MarcheazÄ ca necitit" MENU_SET_FLAG: "Seteaza ca important" MENU_UNSET_FLAG: "SeteazÄ ca neimportant" MENU_SELECT_ALL: "Toate" MENU_SELECT_NONE: "DeselecteazÄ" MENU_SELECT_INVERT: "InverseazÄ selecČ›ia" MENU_SELECT_UNSEEN: "Necitit" MENU_SELECT_SEEN: "Citit" MENU_SELECT_FLAGGED: "Important" MENU_SELECT_UNFLAGGED: "Neimportant" EMPTY_LIST: "Nimic aici, deocamdatÄ" EMPTY_SEARCH_LIST: "Nu am gÄsit nimic." SEARCH_RESULT_FOR: "Rezultat cÄutare \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "Ă®napoi la lista de mesaje" LIST_LOADING: "Caut..." EMPTY_SUBJECT_TEXT: "(nici un subiect)" PUT_MESSAGE_HERE: "EROARE! CONTACTAČšI ADIMISTRATORUL! (trimiteČ›i un prt.scr)" TODAY_AT: "azi %TIME%" YESTERDAY_AT: "ieri %TIME%" SEARCH_PLACEHOLDER: "cautÄ mesaje" NEW_MESSAGE_NOTIFICATION: "AveČ›i %COUNT% mesaje noi!" QUOTA_SIZE: "AČ›i folosit %SIZE% (%PROC%%) din %LIMIT%" MESSAGE: BUTTON_EDIT: "EditeazÄ" BUTTON_BACK: "ĂŽnapoi" BUTTON_CLOSE: "ĂŽnchide" BUTTON_DELETE: "Čterge" BUTTON_UNSUBSCRIBE: "Dezabonare de la aceastÄ listÄ" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_MOVE_TO: "MutÄ la" BUTTON_MORE: "Mai mult" BUTTON_REPLY: "RÄspunde" BUTTON_REPLY_ALL: "RÄspunde la toČ›i" BUTTON_FORWARD: "RedirecČ›ioneazÄ" BUTTON_FORWARD_AS_ATTACHMENT: "RedirecČ›ioneazÄ cu ataČ™ament" BUTTON_EDIT_AS_NEW: "EditeazÄ ca nou" BUTTON_SHOW_IMAGES: "AratÄ imaginile" BUTTON_NOTIFY_READ_RECEIPT: "AnunČ›Ä expeditorul cÄ am citit mesajul" BUTTON_IN_NEW_WINDOW: "Deschide Ă®ntr-o fereastrÄ separatÄ" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "ĂŽnapoi" BUTTON_THREAD_NEXT: "ĂŽnainte" BUTTON_THREAD_MORE: "Mai multe mesaje" MENU_HEADERS: "Vezi titlurile" MENU_VIEW_ORIGINAL: "Vezi originalul" MENU_DOWNLOAD_ORIGINAL: "DescÄrcaČ›i ca fiČ™ier eml" MENU_FILTER_SIMILAR: "FiltreazÄ similarele" MENU_PRINT: "PrinteazÄ" EMPTY_SUBJECT_TEXT: "(nici un subiect)" LABEL_SUBJECT: "Subiect" LABEL_DATE: "Data" LABEL_FROM: "De la" LABEL_FROM_SHORT: "de la" LABEL_TO: "cÄtre" LABEL_TO_SHORT: "cÄtre" LABEL_CC: "copie cÄtre" LABEL_BCC: "copie 2 cÄtre" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "de la" PRINT_LABEL_TO: "cÄtre" PRINT_LABEL_CC: "copie cÄtre" PRINT_LABEL_BCC: "a doua copie cÄtre" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "Data" PRINT_LABEL_SUBJECT: "Subiect" PRINT_LABEL_ATTACHMENTS: "AtaČ™ament" MESSAGE_LOADING: "Se Ă®ncarcÄ..." MESSAGE_VIEW_DESC: "SelectaČ›i un mesaj pentru a-l vizualiza." MESSAGE_VIEW_MOVE_DESC: "FaceČ›i clic pe numele dosarului din panoul din stânga pentru a selecta destinaČ›ia." PGP_PASSWORD_INPUT_PLACEHOLDER: "ParolÄ" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" LINK_SAVE_TO_CLOUD: "SalvaČ›i Ă®n Cloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Mesajul dumneavoastrÄ a fost citit - %SUBJECT%" BODY: | Aceasta este o confirmare de citire pentru mesajul trimis la adresa %READ-RECEIPT%. Примечание: AceastÄ notificare de citire Ă®nsemnÄ cÄ mesajul ajuns la destinatar. AceastÄ funČ›ie nu garantezÄ cÄ destinatarul a citit conČ›inutul mesajului SUGGESTIONS: SEARCHING_DESC: "CÄutare..." CONTACTS: LEGEND_CONTACTS: "Contact" SEARCH_INPUT_PLACEHOLDER: "CautÄ contacte" BUTTON_ADD_CONTACT: "AdugÄ un contact" BUTTON_CREATE_CONTACT: "SalveazÄ" BUTTON_UPDATE_CONTACT: "ActualizeazÄ" BUTTON_IMPORT: "ImportÄ (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Nu s-a putut importa (formatul fiČ™ierului este greČ™it)" LIST_LOADING: "Se Ă®ncarcÄ..." EMPTY_LIST: "Agenda este goalÄ" EMPTY_SEARCH: "Nu am gÄsit nimic." CLEAR_SEARCH: "GoleČ™te cÄutarea" CONTACT_VIEW_DESC: "SelectaČ›i un contact pentru a-l vizualiza" LABEL_DISPLAY_NAME: "Nume complet" LABEL_EMAIL: "Adresa de eMail" LABEL_PHONE: "Тelefon" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Birthday" LINK_ADD_EMAIL: "AdugÄ Mail nou" LINK_ADD_PHONE: "AdaugÄ un numÄr nou" LINK_BIRTHDAY: "Birthday" PLACEHOLDER_ENTER_DISPLAY_NAME: "IntroduceČ›i numele complet" PLACEHOLDER_ENTER_LAST_NAME: "Prenume" PLACEHOLDER_ENTER_FIRST_NAME: "Nume" PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" LABEL_READ_ONLY: "Doar pentru citire" LABEL_SHARE: "Distribuie" ADD_MENU_LABEL: "Add" ADD_MENU_NICKNAME: "Nickname" ADD_MENU_NOTES: "Notes" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "Phone" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Address" ADD_MENU_BIRTHDAY: "Birthday" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "Nimic" BUTTON_SHARE_ALL: "Toate" BUTTON_SYNC: "Synchronization (CardDAV)" COMPOSE: TITLE_FROM: "De la" TITLE_TO: "CÄtre" TITLE_CC: "Copie" TITLE_BCC: "Copie 2" TITLE_REPLY_TO: "RÄspune la" TITLE_SUBJECT: "Subiect" LINK_SHOW_INPUTS: "Extinde" BUTTON_SEND: "Trimite" BUTTON_SAVE: "SalveazÄ" BUTTON_DELETE: "Čterge" BUTTON_CANCEL: "AnuleazÄ" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "Salvat la %TIME%" SAVED_ERROR_ON_SEND: "Mesajul a fost trimis, dar nu a fost slavat" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "AtaČ™eazÄ fiČ™iere" ATTACH_DROP_FILES_DESC: "PuneČ›i fiČ™ierele aici" ATTACH_ITEM_CANCEL: "AnuleazÄ" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% a scris" FORWARD_MESSAGE_TOP_TITLE: "-------- Mesajul original -------" FORWARD_MESSAGE_TOP_FROM: "De la" FORWARD_MESSAGE_TOP_TO: "CÄtre" FORWARD_MESSAGE_TOP_CC: "Copie" FORWARD_MESSAGE_TOP_SENT: "Primit la" FORWARD_MESSAGE_TOP_SUBJECT: "Subiect" EMPTY_TO_ERROR_DESC: "VÄ rugÄm sÄ specificaČ›i cel puČ›in un destinatar" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" BUTTON_REQUEST_READ_RECEIPT: "Cere confirmare de citire" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Da" BUTTON_NO: "Nu" DESC_WANT_CLOSE_THIS_WINDOW: "Sigur doriČ›i sÄ Ă®nchideČ›i aceastÄ fereastrÄ?" DESC_WANT_DELETE_MESSAGES: "Sigur doriČ›i sÄ Č™tergeČ›i mesajul(e)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "LimbÄ" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "AdÄugaČ›i un cont" BUTTON_ADD_ACCOUNT: "AdaugÄ" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "AdÄugaČ›i un profil" TITLE_UPDATE_IDENTITY: "ActualizaČ›i profilul" BUTTON_ADD_IDENTITY: "AdÄugaČ›i" BUTTON_UPDATE_IDENTITY: "ActualizaČ›i" LABEL_EMAIL: "eMail" LABEL_NAME: "Nume" LABEL_REPLY_TO: "RÄspune la" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Copie" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "CreaČ›i un dosar" LABEL_NAME: "Nume" LABEL_PARENT: "Dosar pÄrinte" BUTTON_CREATE: "СreazÄ" BUTTON_CANCEL: "AnuleazÄ" BUTTON_CLOSE: "ĂŽnchide" TITLE_CREATING_PROCESS: "Creez dosarul" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "GoliČ›i dosarul ?" BUTTON_CLEAR: "CurÄČ›Ä" BUTTON_CANCEL: "AnuleazÄ" BUTTON_CLOSE: "ĂŽnchide" DANGER_DESC_WARNING: "AtenČ›ie!" DANGER_DESC_HTML_1: "AceastÄ acČ›iune va conduce la eliminarea completÄ a tuturor mesajelor din dosarul %FOLDER%." DANGER_DESC_HTML_2: "DupÄ Ă®nceperea procesului de curÄČ›are nu mai puteČ›i anula procesul." TITLE_CLEARING_PROCESS: "CurÄČ› dosarul..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" BUTTON_SELECT: "Select" BUTTON_CLOSE: "Close" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_PASSWORD: "Password" LABEL_KEY_BIT_LENGTH: "Key length" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "Sign" LABEL_ENCRYPT: "Encrypt" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Sign" BUTTON_ENCRYPT: "Encrypt" BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Step verification test" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Equal To" SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching any of the following rules" SELECT_MATCH_ALL: "Matching all of the following rules" MARK_AS_READ_LABEL: "Mark as read" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subject (optional)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Reject message" ALL_INCOMING_MESSAGES_DESC: "All incoming messages" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "SelectaČ›i dosarul de sistem" SELECT_CHOOSE_ONE: "Nu a fost Ă®ncÄ selectat" SELECT_UNUSE_NAME: "Nu uitilizaČ›i" LABEL_SENT: "Trimise" LABEL_DRAFTS: "Salvate" LABEL_SPAM: "SPAM" LABEL_TRASH: "Čterse" LABEL_ARCHIVE: "Archive" BUTTON_CANCEL: "AnuleazÄ" BUTTON_CLOSE: "ĂŽnchide" NOTIFICATION_SENT: | Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ "Отправленные", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńообщения поŃле отправки. Đ•Ńли вы не хотите Ńохранять отправленные пиŃьма, пожалŃĐąŃта, выберите ĐżŃнкт "Не иŃпользовать". NOTIFICATION_DRAFTS: "Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ \"Черновики\", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńохраненые Ńообщения." NOTIFICATION_SPAM: | Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ "Спам", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńпамовые Ńообщения. Đ•Ńли же вы хотите Ńдалять пиŃьма ŃразŃ, пожалŃĐąŃта, выберите ĐżŃнкт "Не иŃпользовать". NOTIFICATION_TRASH: | Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ "Удаленные", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńообщения поŃле Ńдаления. Đ•Ńли же вы хотите Ńдалять пиŃьма ŃразŃ, пожалŃĐąŃта, выберите ĐżŃнкт "Не иŃпользовать". NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" LABEL_TWO_FACTOR_USER: "User" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" BUTTON_CREATE: "Create New Secret" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Clear" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Show Secret" BUTTON_HIDE_SECRET: "Hide Secret" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" TWO_FACTOR_SECRET_DESC: >- Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: >- If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "Se Ă®ncarcÄ" LOGIN: "Conectare" MAILBOX: "PoČ™tÄ" SETTINGS: "OpČ›iuni" COMPOSE: "Compune" UPLOAD: ERROR_FILE_IS_TOO_BIG: "FiČ™ierul este prea mare" ERROR_FILE_PARTIALLY_UPLOADED: "FiČ™ierul nu este Ă®ncÄrcat complet" ERROR_NO_FILE_UPLOADED: "Nici un fiČ™ier Ă®ncÄrcat" ERROR_MISSING_TEMP_FOLDER: "Eroare la salvarea unui fiČ™ier" ERROR_ON_SAVING_FILE: "Eroare la salvarea unui fiČ™ier" ERROR_FILE_TYPE: "Tip de fiČ™ier invalid" ERROR_UNKNOWN: "Eroare la Ă®ncÄrcarea de fiČ™iere" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Text formatat" TEXT_SWITCHER_CONFIRM: "Formatarea textului Č™i imaginile vor fi pierdute. Sigur doriČ›i sÄ continuaČ›i?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personal" LABEL_GENERAL_NAME: "De bazÄ" LABEL_CONTACTS_NAME: "Contacte" LABEL_FOLDERS_NAME: "Dosare" LABEL_ACCOUNTS_NAME: "Conturi" LABEL_IDENTITY_NAME: "Profil" LABEL_IDENTITIES_NAME: "Profiluri" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Security" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Subiecte" LABEL_CHANGE_PASSWORD_NAME: "ParolÄ" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "ĂŽnapoi" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Save" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Delete" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "SetÄrile de profil" LABEL_DISPLAY_NAME: "Nume" LABEL_REPLY_TO: "RÄspunde la" LABEL_SIGNATURE: "SemnÄturÄ" LABEL_ADD_SIGNATURE_TO_ALL: "AdÄugÄ semnÄtura la toate mesajele trimise" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_CONFIGURE_TWO_FACTOR: "ConfiguraČ›i verificarea Ă®n 2 paČ™i" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% orÄ(ore)" SETTINGS_GENERAL: LEGEND_GENERAL: "SetÄri de bazÄ" LABEL_LANGUAGE: "LimbÄ" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "Editor de text implicit" LABEL_EDITOR_HTML: "Formatat" LABEL_EDITOR_PLAIN: "Simplu" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "InterfaČ›Ä animaČ›ie" LABEL_ANIMATION_FULL: "Complet" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "nu" LABEL_VIEW_OPTIONS: "AfiČ™are" LABEL_USE_PREVIEW_PANE: "FolosiČ›i un mod de afiČ™are cu trei coloane" LABEL_USE_CHECKBOXES_IN_LIST: "AfiČ™eazÄ listele checkbox" LABEL_USE_THREADS: "MinimizeazÄ scrisorile" LABEL_REPLY_SAME_FOLDER: "RÄspunsurile Ă®n acelaČ™i folder cu originalul" LABEL_SHOW_IMAGES: "AratÄ imaginile externe Ă®n corpul mesajului, fÄrÄ avertisment" LABEL_SHOW_ANIMATION: "UtilizaČ›i animaČ›ia" LABEL_MESSAGE_PER_PAGE: "Mesaje pe o paginÄ" LABEL_NOTIFICATIONS: "NotificÄri" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "AfiČ™aČ›i notificÄri desktop pentru mesaje noi" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(browser-ul blocat)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Contacte" LABEL_CONTACTS_AUTOSAVE: "AdaugÄ automat destinatarii la agenda de scrisori" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" LABEL_CONTACTS_SYNC_USER: "User" LABEL_CONTACTS_SYNC_PASSWORD: "Password" SETTINGS_THEMES: LEGEND_THEMES: "TematicÄ" LEGEND_THEMES_CUSTOM: "SetaČ›i o temÄ particularizatÄ" LABEL_CUSTOM_TYPE: "Tip Teme" LABEL_CUSTOM_TYPE_LIGHT: "Lumina" LABEL_CUSTOM_TYPE_DARK: "UmbrÄ" LABEL_CUSTOM_BACKGROUND_IMAGE: "Imaginea de pe fundal" BUTTON_UPLOAD_BACKGROUND_IMAGE: "ĂŽncÄrcaČ›i o imagine de fundal (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "FiČ™ier prea mare" ERROR_FILE_TYPE_ERROR: "Tip de fiČ™ier invalid (numai JPG sau PNG)" ERROR_UNKNOWN: "Eroare la Ă®ncÄrcarea de fiČ™iere" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "ConecteazÄ-te cu Google" BUTTON_GOOGLE_DISCONNECT: "DeconectaČ›i contul Google" MAIN_GOOGLE_DESC: "DupÄ conectarea la Google, vÄ puteČ›i conecta la acest cont folosind butonul Google de pe ecranul de login." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "ConectaČ›i-va cu Facebook" BUTTON_FACEBOOK_DISCONNECT: "DeconectaČ›i contul de Facebook" MAIN_FACEBOOK_DESC: "DupÄ conectarea la Facebook, vÄ puteČ›i conecta la acest cont folosind butonul Facebook de pe ecranul de login." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "ConectaČ›i-vÄ cu Twitter" BUTTON_TWITTER_DISCONNECT: "DeconectaČ›i contul de Twitter" MAIN_TWITTER_DESC: "DupÄ conectarea la Twitter, vÄ puteČ›i conecta la acest cont folosind butonul Twitter de pe ecranul de login." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Lista de dosare" BUTTON_CREATE: "Creare dosar" BUTTON_SYSTEM: "System Folders" BUTTON_DELETE: "Čterge" BUTTON_SUBSCRIBE: "Abonare" BUTTON_UNSUBSCRIBE: "Dezabonare" LOADING_PROCESS: "Actualizez lista de dosare" CREATING_PROCESS: "Crearea dosarului..." DELETING_PROCESS: "Čterg dosarul..." RENAMING_PROCESS: "Redenumesc dosarul" DELETING_ASK: "SunteČ›i sigur?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Lista de Conturi" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "AdaugÄ un alt cont" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "Čterge" LOADING_PROCESS: "Actualizez lista de conturi" DELETING_ASK: "SunteČ›i sigur?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "SetÄrile de profil de bazÄ" LEGEND_IDENTITIES: "Profiluri suplimentare" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "Nume" LABEL_REPLY_TO: "RÄspunde la" LABEL_SIGNATURE: "SemnÄturÄ" LABEL_ADD_SIGNATURE_TO_ALL: "AdaugÄ semnÄtura la toate mesajele trimise" BUTTON_ADD_IDENTITY: "AdÄugaČ›i un profil" BUTTON_DELETE: "Čterge" LOADING_PROCESS: "Actualizez lista de profile" DELETING_ASK: "SunteČ›i sigur?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Schimbare parolÄ" LABEL_CURRENT_PASSWORD: "Parola curentÄ" LABEL_NEW_PASSWORD: "Noua parolÄ" LABEL_REPEAT_PASSWORD: "ConfirmaČ›i parola" BUTTON_UPDATE_PASSWORD: "SalvaČ›i noua parolÄ" ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" TITLE_PRIVATE: "Private" TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "SalveazÄ ciorna automat" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Message list" TAB_MESSAGE_VIEW: "Message view" TAB_COMPOSE: "Compose" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "Reply" LABEL_REPLY_ALL: "Reply All" LABEL_FORWARD: "Forward" LABEL_FORWARD_MULTIPLY: "Forward (multiply)" LABEL_HELP: "Help" LABEL_CHECK_ALL: "Select all messages" LABEL_ARCHIVE: "Archive" LABEL_DELETE: "Delete" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "Move" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" LABEL_IMPORTANT: "Important, flag selected messages" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Print" LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" LABEL_SWITCH_TO_LIST: "Switch focus back to message list" LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" LABEL_SAVE_MESSAGE: "Save message" LABEL_SEND_MESSAGE: "Send message" LABEL_CLOSE_COMPOSE: "Close compose" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "SetectaČ›i o cheie privatÄ" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "Please specify FROM email address" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" NOTIFICATIONS: INVALID_TOKEN: "Semn invalid" AUTH_ERROR: "Nu se poate realiza conectarea" ACCESS_ERROR: "Eroare de acces" CONNECTION_ERROR: "Eroare la conectarea la server." CAPTCHA_ERROR: "Cuvântul de securitate nu este corect." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Pentru acest utilizator nu sa asigurat Ă®ncÄ un cont de e-mail. ConectaČ›i-vÄ cu contul dvs. de e-mail Č™i activaČ›i aceastÄ caracteristicÄ Ă®n setÄrile. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Pentru acest utilizator nu sa asigurat Ă®ncÄ un cont de e-mail. ConectaČ›i-vÄ cu contul dvs. de e-mail Č™i activaČ›i aceastÄ caracteristicÄ Ă®n setÄrile. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Pentru acest utilizator nu sa asigurat Ă®ncÄ un cont de e-mail. ConectaČ›i-vÄ cu contul dvs. de e-mail Č™i activaČ›i aceastÄ caracteristicÄ Ă®n setÄrile. DOMAIN_NOT_ALLOWED: "Domeniul nu apartine de Wey5" ACCOUNT_NOT_ALLOWED: "Contul nu are permisiunea de conectare" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Nu gÄsesc o lista de scrisori" CANT_GET_MESSAGE: "Nu pot obČ›ine scrisoarea. ĂŽncercaČ›i din nou" CANT_DELETE_MESSAGE: "Nu pot Č™terge scrisoarea. ĂŽncercaČ›i din nou" CANT_MOVE_MESSAGE: "Nu pot muta scrisoarea.ĂŽncercaČ›i din nou" CANT_SAVE_MESSAGE: "Nu pot salva mesajul. ĂŽncercaČ›i din nou" CANT_SEND_MESSAGE: "Nu pot trimite scrisoarea.ĂŽncercaČ›i din nou" INVALID_RECIPIENTS: "VerificaČ›i dacÄ aČ›i introdus toate adresele." CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Nu crea dosarul. ĂŽncercaČ›i din nou" CANT_RENAME_FOLDER: "Nu pot redenumi dosarul. ĂŽncercaČ›i din nou" CANT_DELETE_FOLDER: "Nu pot Č™terge dosarul. ĂŽncercaČ›i din nou" CANT_DELETE_NON_EMPTY_FOLDER: "Nu pot Č™terge un dosar care nu este gol" CANT_SUBSCRIBE_FOLDER: "Nu pot semna dosarul. ĂŽncercaČ›i din nou" CANT_UNSUBSCRIBE_FOLDER: "Nu mÄ pot dezbona. ĂŽncercaČ›i din nou" CANT_SAVE_SETTINGS: "Nu pot salva opČ›iunile. ĂŽncercaČ›i din nou" CANT_SAVE_PLUGIN_SETTINGS: "Nu pot salva setÄrile. ĂŽncercaČ›i din nou" DOMAIN_ALREADY_EXISTS: "Domeniu existÄ deja." CANT_INSTALL_PACKAGE: "Nu pot instala pachetul.ĂŽncercaČ›i din nou" CANT_DELETE_PACKAGE: "Nu pot Č™terge pachetul. ĂŽncercaČ›i din nou" INVALID_PLUGIN_PACKAGE: "Pachetul este invalid" UNSUPPORTED_PLUGIN_PACKAGE: "Plugin-ul necesitÄ sprijinul complet al serverului" LICENSING_SERVER_IS_UNAVAILABLE: "Server de abonamente este temporar indisponibil." LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." DEMO_SEND_MESSAGE_ERROR: "Cont demo trimite e-mail la adresele de e-mail externe este interzisÄ!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Contul deja existÄ" ACCOUNT_DOES_NOT_EXIST: "contul nu existÄ" MAIL_SERVER_ERROR: "Nu am reuČ™it sÄ accesez serverul de e-mail" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Eroare necunoscutÄ" STATIC: BACK_LINK: "Actualizare" DOMAIN_LIST_DESC: "Lista de domenii care au permisiunea de a fi accesate prin webmail." PHP_EXSTENSIONS_ERROR_DESC: "Extensiile PHP necesare nu sunt instalate pe server-ul dvs.!" PHP_VERSION_ERROR_DESC: "Versiunea dvs. de PHP (%VERSION%) este mai mica de cea doritÄ, 5.3.0!" NO_SCRIPT_TITLE: "Pentru rulare este necesar JavaScript." NO_SCRIPT_DESC: | Aparent, JavaScript nu este instalat, sau nu este acceptat de browserul dumneavoastrÄ. ActivaČ›i JavaScript, schimband optiunile browserului dvs., apoi Ă®ncercaČ›i din nou. NO_COOKIE_TITLE: "Cererea necesitÄ Cookie-uri." NO_COOKIE_DESC: | Aparent, Cookie sau nu este acceptat de browser-ul dvs. sau oprit. ĂŽntoarceČ›i Cookie, schimband optiunile browserului dvs., apoi Ă®ncercaČ›i din nou. BAD_BROWSER_TITLE: "Browser-ul dvs. este depÄČ™it." BAD_BROWSER_DESC: | Pentru a utiliza toate caracteristicile cererii, descÄrcaČ›i Č™i instalaČ›i unul dintre aceste browsere: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/ru_RU.yml000066400000000000000000001237701361462701300262450ustar00rootroot00000000000000ru_RU: LOGIN: LABEL_EMAIL: "Почта" LABEL_LOGIN: "Логин" LABEL_PASSWORD: "Пароль" LABEL_SIGN_ME: "Запомнить меня" LABEL_VERIFICATION_CODE: "Код подтверждения" LABEL_DONT_ASK_VERIFICATION_CODE: "Не ŃпраŃивать код в течение 2-Ń… недель" BUTTON_SIGN_IN: "Войти" TITLE_SIGN_IN_GOOGLE: "Войти, иŃпользŃŃŹ Google" TITLE_SIGN_IN_FACEBOOK: "Войти, иŃпользŃŃŹ Facebook" TITLE_SIGN_IN_TWITTER: "Войти, иŃпользŃŃŹ Twitter" LABEL_FORGOT_PASSWORD: "Забытый пароль" LABEL_REGISTRATION: "РегиŃтрация" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Добавить ещё аккаŃнт" BUTTON_SETTINGS: "НаŃтройки" BUTTON_HELP: "Помощь" BUTTON_LOGOUT: "Выйти" MOBILE: BUTTON_MOBILE_VERSION: "Мобильная верŃия" BUTTON_DESKTOP_VERSION: "Полная верŃия" SEARCH: MAIN_INPUT_PLACEHOLDER: "ПоиŃĐş пиŃем" TITLE_ADV: "РаŃŃиренный поиŃĐş пиŃем" LABEL_ADV_FROM: "От" LABEL_ADV_TO: "КомŃ" LABEL_ADV_SUBJECT: "Тема" LABEL_ADV_TEXT: "ТекŃŃ‚" LABEL_ADV_HAS_ATTACHMENT: "С файлами" LABEL_ADV_HAS_ATTACHMENTS: "С файлами" LABEL_ADV_FLAGGED: "Помеченные" LABEL_ADV_UNSEEN: "Непрочитанные" LABEL_ADV_DATE: "Дата" LABEL_ADV_DATE_ALL: "За вŃе время" LABEL_ADV_DATE_3_DAYS: "За три дня" LABEL_ADV_DATE_7_DAYS: "За неделю" LABEL_ADV_DATE_MONTH: "За меŃяц" LABEL_ADV_DATE_3_MONTHS: "За 3 меŃяца" LABEL_ADV_DATE_6_MONTHS: "За полгода" LABEL_ADV_DATE_YEAR: "За год" BUTTON_ADV_SEARCH: "ĐŃкать" PREVIEW_POPUP: FULLSCREEN: "Полный экран" ZOOM: "Увеличить/ŃменьŃить" CLOSE: "Закрыть (Esc)" LOADING: "ЗагрŃзка..." GALLERY_PREV: "Назад (Стрелка â†)" GALLERY_NEXT: "Вперед (Стрелка →)" GALLERY_COUNTER: "%curr% из %total%" IMAGE_ERROR: "Đзображение не загрŃзилоŃŃŚ." AJAX_ERROR: "Данные не загрŃзилиŃŃŚ." FOLDER_LIST: BUTTON_COMPOSE: "НапиŃать" BUTTON_CONTACTS: "Контакты" BUTTON_NEW_MESSAGE: "Новое Ńообщение" INBOX_NAME: "Входящие" SENT_NAME: "Отправленные" DRAFTS_NAME: "Черновики" SPAM_NAME: "Спам" TRASH_NAME: "Корзина" ARCHIVE_NAME: "Đрхив" QUOTA: TITLE: "ДиŃковая квота" MESSAGE_LIST: BUTTON_RELOAD: "Обновить СпиŃок ПиŃем" BUTTON_MOVE_TO: "ПеремеŃтить" BUTTON_DELETE: "Удалить" BUTTON_ARCHIVE: "Đрхивировать" BUTTON_SPAM: "Đ’ Ńпам" BUTTON_NOT_SPAM: "Не Ńпам" BUTTON_EMPTY_FOLDER: "ОчиŃтить вŃŃŽ папкŃ" BUTTON_MULTY_FORWARD: "ПереŃлать Ńообщения" BUTTON_DELETE_WITHOUT_MOVE: "Удалить мимо корзины" BUTTON_MORE: "Еще" MENU_SET_SEEN: "Отметить как прочитанное" MENU_SET_ALL_SEEN: "Отметить вŃе как прочитанные" MENU_UNSET_SEEN: "Отметить как непрочитанное" MENU_SET_FLAG: "ĐŁŃтановить флаг" MENU_UNSET_FLAG: "Снять флаг" MENU_SELECT_ALL: "Đ’Ńе" MENU_SELECT_NONE: "Ни одного" MENU_SELECT_INVERT: "Đнвентировать" MENU_SELECT_UNSEEN: "Непрочитанные" MENU_SELECT_SEEN: "Прочитанные" MENU_SELECT_FLAGGED: "Помеченные" MENU_SELECT_UNFLAGGED: "Без пометок" EMPTY_LIST: "Đ’ папке нет пиŃем." EMPTY_SEARCH_LIST: "ПиŃьма не найдены." SEARCH_RESULT_FOR: "РезŃльтат поиŃка \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "back to message list" LIST_LOADING: "ЗагрŃзка" EMPTY_SUBJECT_TEXT: "(Без темы)" PUT_MESSAGE_HERE: "Киньте Ńообщение Ńюда, чтобы поŃмотреть его в ŃпиŃке" TODAY_AT: "Ńегодня в %TIME%" YESTERDAY_AT: "вчера в %TIME%" SEARCH_PLACEHOLDER: "ПоиŃĐş пиŃем" NEW_MESSAGE_NOTIFICATION: "ĐŁ Đ˛Đ°Ń %COUNT% новых Ńообщений!" QUOTA_SIZE: "ĐŃпользовано %SIZE% (%PROC%%) из %LIMIT%" MESSAGE: BUTTON_EDIT: "Редактировать" BUTTON_BACK: "Назад" BUTTON_CLOSE: "Закрыть" BUTTON_DELETE: "Удалить" BUTTON_UNSUBSCRIBE: "ОтпиŃатьŃŃŹ" BUTTON_ARCHIVE: "Đрхивировать" BUTTON_SPAM: "Đ’ Ńпам" BUTTON_NOT_SPAM: "Не Ńпам" BUTTON_MOVE_TO: "ПеремеŃтить" BUTTON_MORE: "Еще" BUTTON_REPLY: "Ответить на ПиŃŃŚĐĽĐľ" BUTTON_REPLY_ALL: "Ответить Đ’Ńем" BUTTON_FORWARD: "ПереŃлать" BUTTON_FORWARD_AS_ATTACHMENT: "ПереŃлать как файл" BUTTON_EDIT_AS_NEW: "Редактировать как новое" BUTTON_SHOW_IMAGES: "Показать внеŃние изображения в пиŃьме" BUTTON_NOTIFY_READ_RECEIPT: "Уведомить отправителя Đľ прочтении этого Ńообщения." BUTTON_IN_NEW_WINDOW: "Đ’ отдельном окне" BUTTON_THREAD_LIST: "СпиŃок" BUTTON_THREAD_PREV: "ПредыдŃщее" BUTTON_THREAD_NEXT: "СледŃющее" BUTTON_THREAD_MORE: "БольŃе Ńообщений" MENU_HEADERS: "ПроŃмотреть заголовки" MENU_VIEW_ORIGINAL: "ПроŃмотреть оригинал" MENU_DOWNLOAD_ORIGINAL: "Скачать как .eml файл" MENU_FILTER_SIMILAR: "Фильтровать похожие" MENU_PRINT: "РаŃпечатать" EMPTY_SUBJECT_TEXT: "(Без темы)" LABEL_SUBJECT: "Тема" LABEL_DATE: "Дата" LABEL_FROM: "От" LABEL_FROM_SHORT: "от" LABEL_TO: "КомŃ" LABEL_TO_SHORT: "комŃ" LABEL_CC: "Копия" LABEL_BCC: "Скрытая" LABEL_REPLY_TO: "Ответить-на" PRINT_LABEL_FROM: "От" PRINT_LABEL_TO: "КомŃ" PRINT_LABEL_CC: "Копия" PRINT_LABEL_BCC: "Скрытая" PRINT_LABEL_REPLY_TO: "Ответить-на" PRINT_LABEL_DATE: "Дата" PRINT_LABEL_SUBJECT: "Тема" PRINT_LABEL_ATTACHMENTS: "Файлы" MESSAGE_LOADING: "ЗагрŃзка" MESSAGE_VIEW_DESC: "Выберите Ńообщение для проŃмотра." MESSAGE_VIEW_MOVE_DESC: "Выберите имя папки в левой панели, чтобы перемеŃтить Ńообщение." PGP_PASSWORD_INPUT_PLACEHOLDER: "Пароль" PGP_SIGNED_MESSAGE_DESC: "OpenPGP подпиŃанное Ńообщение (нажмите, чтобы подтвердить)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP Ńифрованное Ńообщение (нажмите, чтобы раŃŃифровать)" LINK_DOWNLOAD_AS_ZIP: "Сохранить как zip" LINK_SAVE_TO_OWNCLOUD: "Сохранить в ownCloud" LINK_SAVE_TO_CLOUD: "Сохранить в облаке" LINK_SAVE_TO_DROPBOX: "Сохранить в Dropbox" READ_RECEIPT: SUBJECT: "Уведомление Đľ прочтении пиŃьма - %SUBJECT%" BODY: | Это Ńведомление Đľ прочтении для Ńообщения, которое вы отправили в Đ°Đ´Ń€ĐµŃ %READ-RECEIPT%. Примечание: Это Ńведомление Đľ прочтении означает лиŃŃŚ то, что Ńообщение было отображено на маŃине полŃчателя. Оно не гарантирŃет того, что полŃчатель прочёл или понял Ńодержимое Ńообщения. SUGGESTIONS: SEARCHING_DESC: "ПоиŃĐş..." CONTACTS: LEGEND_CONTACTS: "Контакты" SEARCH_INPUT_PLACEHOLDER: "ПоиŃĐş контактов" BUTTON_ADD_CONTACT: "Добавить контакт" BUTTON_CREATE_CONTACT: "Сохранить" BUTTON_UPDATE_CONTACT: "Обновить" BUTTON_IMPORT: "Đмпорт (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Đ­ĐşŃпорт (vcf, vCard)" BUTTON_EXPORT_CSV: "Đ­ĐşŃпорт (csv)" ERROR_IMPORT_FILE: "ĐžŃибка импорта (Неправильный формат файла)" LIST_LOADING: "ЗагрŃзка" EMPTY_LIST: "Нет контактов" EMPTY_SEARCH: "Контакты не найдены" CLEAR_SEARCH: "ОчиŃтить поиŃĐş" CONTACT_VIEW_DESC: "Выберите контакт для проŃмотра." LABEL_DISPLAY_NAME: "Полное имя" LABEL_EMAIL: "Электронная почта" LABEL_PHONE: "Телефон" LABEL_WEB: "Сайт" LABEL_BIRTHDAY: "День рождения" LINK_ADD_EMAIL: "Добавьте Đ°Đ´Ń€ĐµŃ ŃŤĐ»ĐµĐşŃ‚Ń€ĐľĐ˝Đ˝ĐľĐą почты" LINK_ADD_PHONE: "Добавьте телефон" LINK_BIRTHDAY: "День рождения" PLACEHOLDER_ENTER_DISPLAY_NAME: "Введите полное имя" PLACEHOLDER_ENTER_LAST_NAME: "Введите имя" PLACEHOLDER_ENTER_FIRST_NAME: "Введите фамилию" PLACEHOLDER_ENTER_NICK_NAME: "Введите ник" LABEL_READ_ONLY: "Только чтение" LABEL_SHARE: "ПоделитьŃŃŹ" ADD_MENU_LABEL: "Добавить" ADD_MENU_NICKNAME: "Ник" ADD_MENU_NOTES: "Примечания" ADD_MENU_EMAIL: "ПочтŃ" ADD_MENU_PHONE: "Телефон" ADD_MENU_URL: "Сайт" ADD_MENU_ADDRESS: "ĐдреŃ" ADD_MENU_BIRTHDAY: "День рождения" ADD_MENU_TAGS: "Тэги" BUTTON_SHARE_NONE: "Отменить" BUTTON_SHARE_ALL: "Đ’Ńем" BUTTON_SYNC: "Синхронизация (CardDAV)" COMPOSE: TITLE_FROM: "От" TITLE_TO: "КомŃ" TITLE_CC: "Копия" TITLE_BCC: "Скрытая" TITLE_REPLY_TO: "Отвечать на" TITLE_SUBJECT: "Тема" LINK_SHOW_INPUTS: "Показать вŃе поля" BUTTON_SEND: "Отправить" BUTTON_SAVE: "Сохранить" BUTTON_DELETE: "Удалить" BUTTON_CANCEL: "Отменить" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "Сохранено в %TIME%" SAVED_ERROR_ON_SEND: "Сообщение было отправлено, но не было Ńохранено" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "Прикрепить файлы" ATTACH_DROP_FILES_DESC: "ПомеŃтите файлы Ńюда" ATTACH_ITEM_CANCEL: "Отменить" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% напиŃал" FORWARD_MESSAGE_TOP_TITLE: "-------- ПереŃланное Ńообщение -------" FORWARD_MESSAGE_TOP_FROM: "От" FORWARD_MESSAGE_TOP_TO: "КомŃ" FORWARD_MESSAGE_TOP_CC: "Копия" FORWARD_MESSAGE_TOP_SENT: "Отправлено" FORWARD_MESSAGE_TOP_SUBJECT: "Тема" EMPTY_TO_ERROR_DESC: "Укажите как минимŃĐĽ одного полŃчателя" NO_ATTACHMENTS_HERE_DESC: "Прикреплённые файлы отŃŃŃ‚ŃтвŃŃŽŃ‚." ATTACHMENTS_ERROR_DESC: "Внимание! Не вŃе прикреплённые файлы были загрŃжены." ATTACHMENTS_UPLOAD_ERROR_DESC: "Не вŃе прикреплённые файлы были загрŃжены" BUTTON_REQUEST_READ_RECEIPT: "Đ—Đ°ĐżŃ€ĐľŃ Đľ прочтении пиŃьма" BUTTON_MARK_AS_IMPORTANT: "Отметить как важное" BUTTON_OPEN_PGP: "OpenPGP (только обычный текŃŃ‚)" BUTTON_REQUEST_DSN: "ЗапроŃить Ńведомление Đľ Đ´ĐľŃтавке" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Да" BUTTON_NO: "Нет" DESC_WANT_CLOSE_THIS_WINDOW: "Đ’Ń‹ Ńверены, что хотите закрыть это окно?" DESC_WANT_DELETE_MESSAGES: "Đ’Ń‹ Ńверены, что хотите Ńдалить Ńообщение(ŃŹ)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Выберите язык" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Добавить ещё аккаŃнт?" BUTTON_ADD_ACCOUNT: "Добавить" TITLE_UPDATE_ACCOUNT: "Обновить аккаŃнт?" BUTTON_UPDATE_ACCOUNT: "Обновить" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Добавить Профиль?" TITLE_UPDATE_IDENTITY: "Обновить Профиль?" BUTTON_ADD_IDENTITY: "Добавить" BUTTON_UPDATE_IDENTITY: "Обновить" LABEL_EMAIL: "Почта" LABEL_NAME: "ĐĐĽŃŹ" LABEL_REPLY_TO: "Отвечать на" LABEL_SIGNATURE: "ПодпиŃŃŚ" LABEL_CC: "Cc" LABEL_BCC: "Скрытая" LABEL_SIGNATURE_INSERT_BEFORE: "Đ’Ńтавлять подпиŃŃŚ перед отцитированным текŃтом в ответах" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Создать папкŃ?" LABEL_NAME: "ĐĐĽŃŹ папки" LABEL_PARENT: "РодительŃкая папка" BUTTON_CREATE: "Создать" BUTTON_CANCEL: "Отменить" BUTTON_CLOSE: "Закрыть" TITLE_CREATING_PROCESS: "Cоздание папки" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "ОчиŃтить ĐżĐ°ĐżĐşŃ ĐľŃ‚ пиŃем?" BUTTON_CLEAR: "ОчиŃтить" BUTTON_CANCEL: "Отменить" BUTTON_CLOSE: "Закрыть" DANGER_DESC_WARNING: "Внимание!" DANGER_DESC_HTML_1: "Данное дейŃтвие приведет Đş ĐżĐľĐ»Đ˝ĐľĐĽŃ Ńдалению вŃех пиŃем из папки %FOLDER%." DANGER_DESC_HTML_2: "ПоŃле начала очиŃтки, процеŃŃ Đ˝ĐµĐ»ŃŚĐ·ŃŹ бŃдет ĐľŃтановить или отменить." TITLE_CLEARING_PROCESS: "ОчиŃтка папки..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Đмпорт OpenPGP ключа" BUTTON_IMPORT_OPEN_PGP_KEY: "Đмпорт" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "ПроŃмотр OpenPGP ключа" BUTTON_SELECT: "Выбрать" BUTTON_CLOSE: "Закрыть" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Генерация OpenPGP ключа" LABEL_EMAIL: "Почта" LABEL_NAME: "ĐĐĽŃŹ" LABEL_PASSWORD: "Пароль" LABEL_KEY_BIT_LENGTH: "Длина ключа" BUTTON_GENERATE_OPEN_PGP_KEYS: "Создать" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP подпиŃŃŚ и Ńифрование" LABEL_SIGN: "ПодпиŃŃŚ" LABEL_ENCRYPT: "Шифрование" LABEL_PASSWORD: "Пароль" BUTTON_SIGN: "ПодпиŃŃŚ" BUTTON_ENCRYPT: "Шифрование" BUTTON_SIGN_AND_ENCRYPT: "ПодпиŃŃŚ и Ńифрование" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "РаŃŃифровать (OpenPGP)" LABEL_KEY: "Приватный ключ" LABEL_PASSWORD: "Пароль" BUTTON_DECRYPT: "РаŃŃифровать" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "ТеŃŃ‚ двŃхфакторной верификации" LABEL_CODE: "Код" BUTTON_TEST: "ТеŃŃ‚" POPUPS_FILTER: TITLE_CREATE_FILTER: "Создать фильтр?" TITLE_EDIT_FILTER: "Обновить фильтр?" FILTER_NAME: "Название" LEGEND_CONDITIONS: "Правила" LEGEND_ACTIONS: "ДейŃтвия" BUTTON_DONE: "Закончить" BUTTON_ADD_CONDITION: "Добавить правило" SELECT_ACTION_NONE: "Ничего" SELECT_ACTION_MOVE_TO: "ПеремеŃтить в" SELECT_ACTION_FORWARD_TO: "ПереŃлать на" SELECT_ACTION_REJECT: "Не принимать" SELECT_ACTION_VACATION_MESSAGE: "Đвтоответчик" SELECT_ACTION_DISCARD: "Уничтожить" SELECT_FIELD_FROM: "От" SELECT_FIELD_RECIPIENTS: "ПолŃчатели (To или CC)" SELECT_FIELD_SUBJECT: "Тема" SELECT_FIELD_HEADER: "Заголовок" SELECT_FIELD_SIZE: "Размер" SELECT_TYPE_CONTAINS: "Содержит" SELECT_TYPE_NOT_CONTAINS: "Не Ńодержит" SELECT_TYPE_MATCHES: "Содержит (поддерживаютŃŃŹ * и ?)" SELECT_TYPE_NOT_MATCHES: "Не Ńодержит (поддерживаютŃŃŹ * и ?)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Не Regexp" SELECT_TYPE_EQUAL_TO: "Совпадает Ń" SELECT_TYPE_NOT_EQUAL_TO: "Не Ńовпадает Ń" SELECT_TYPE_OVER: "БольŃе" SELECT_TYPE_UNDER: "МеньŃе" SELECT_MATCH_ANY: "Подходит под хотя бы одно из нижеперечиŃленных правил" SELECT_MATCH_ALL: "Подходит под вŃе нижеперечиŃленные правила" MARK_AS_READ_LABEL: "Отметить как прочитанное" REPLY_INTERVAL_LABEL: "Отвечать каждые (в днях)" KEEP_LABEL: "Сохранить копию" STOP_LABEL: "Не преращать ĐľĐ±Ń€Đ°Đ±ĐľŃ‚ĐşŃ ĐżŃ€Đ°Đ˛Đ¸Đ»" EMAIL_LABEL: "Почтка" VACATION_SUBJECT_LABEL: "Тема (необязательно)" VACATION_MESSAGE_LABEL: "Сообщение" VACATION_RECIPIENTS_LABEL: "ПолŃчатели (через запятŃŃŽ)" REJECT_MESSAGE_LABEL: "Причина (бŃдет поŃлана отправителю)" ALL_INCOMING_MESSAGES_DESC: "Đ’Ńе входящие Ńообщения" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Выберите ŃиŃтемые папки" SELECT_CHOOSE_ONE: "Еще не выбрана" SELECT_UNUSE_NAME: "Не иŃпользовать" LABEL_SENT: "Отправленные" LABEL_DRAFTS: "Черновики" LABEL_SPAM: "Спам" LABEL_TRASH: "Удаленные" LABEL_ARCHIVE: "Đрхив" BUTTON_CANCEL: "Отменить" BUTTON_CLOSE: "Закрыть" NOTIFICATION_SENT: | Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ "Отправленные", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńообщения поŃле отправки. Đ•Ńли вы не хотите Ńохранять отправленные пиŃьма, пожалŃĐąŃта, выберите ĐżŃнкт "Не иŃпользовать". NOTIFICATION_DRAFTS: "Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ \"Черновики\", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńохраненные Ńообщения." NOTIFICATION_SPAM: | Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ "Спам", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńпамовые Ńообщения. Đ•Ńли же вы хотите Ńдалять пиŃьма ŃразŃ, пожалŃĐąŃта, выберите ĐżŃнкт "Не иŃпользовать". NOTIFICATION_TRASH: | Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ "Удаленные", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńообщения поŃле Ńдаления. Đ•Ńли же вы хотите Ńдалять пиŃьма ŃразŃ, пожалŃĐąŃта, выберите ĐżŃнкт "Не иŃпользовать". NOTIFICATION_ARCHIVE: "Đ’Ń‹ еще не выбрали ŃиŃтемнŃŃŽ ĐżĐ°ĐżĐşŃ \"Đрхив\", в которŃŃŽ ŃкладываютŃŃŹ вŃе Ńообщения поŃле архивации." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "ДвŃхфакторная верификация" LABEL_ENABLE_TWO_FACTOR: "Включить двŃхфакторнŃŃŽ верификацию" LABEL_TWO_FACTOR_USER: "Пользователь" LABEL_TWO_FACTOR_STATUS: "СтатŃŃ" LABEL_TWO_FACTOR_SECRET: "Секретный ключ" LABEL_TWO_FACTOR_BACKUP_CODES: "Резервные коды" BUTTON_CREATE: "Создать новый Ńекретный ключ" BUTTON_ACTIVATE: "Đктивировать" BUTTON_CLEAR: "ОчиŃтить" BUTTON_LOGOUT: "Выйти" BUTTON_DONE: "Закончить" BUTTON_TEST: "ТеŃŃ‚" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Показать Ńекретный ключ" BUTTON_HIDE_SECRET: "Скрыть Ńекретный ключ" TWO_FACTOR_REQUIRE_DESC: "Đ’Đ°Ń Đ°ĐşĐşĐ°Ńнт требŃет двŃхфакторнŃŃŽ наŃтройкŃ." TWO_FACTOR_SECRET_CONFIGURED_DESC: "НаŃтроен" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не наŃтроен" TWO_FACTOR_SECRET_DESC: > ĐŃпользŃйте ŃŤŃ‚Ń Đ¸Đ˝Ń„ĐľŃ€ĐĽĐ°Ń†Đ¸ŃŽ для наŃтройки Google Authenticator клиента (или Đ´Ń€Ńгого TOTP клиента) Ń ĐżĐľĐĽĐľŃ‰ŃŚŃŽ прилагаемого QR-кода, или врŃчнŃŃŽ. TWO_FACTOR_BACKUP_CODES_DESC: > Đ•Ńли вы не можете полŃчить коды через Google Authenticator, вы можете иŃпользовать резервные коды, чтобы войти. ПоŃле того как вы иŃпользовали резервный код для входа в ŃиŃтемŃ, он ŃтановитŃŃŹ неактивным. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Đ’Ń‹ должны выполнить теŃŃ‚ перед тем, как вы Ńможете поменять ŃŤŃ‚Ń Đ˝Đ°ŃтройкŃ." TITLES: LOADING: "ЗагрŃзка" LOGIN: "Вход" MAILBOX: "Почта" SETTINGS: "НаŃтройки" COMPOSE: "НапиŃать пиŃŃŚĐĽĐľ" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Файл ŃлиŃком больŃой" ERROR_FILE_PARTIALLY_UPLOADED: "Файл не загрŃзилŃŃŹ полноŃтью" ERROR_NO_FILE_UPLOADED: "Файл не был загрŃжен" ERROR_MISSING_TEMP_FOLDER: "ĐžŃибка при Ńохранении файла" ERROR_ON_SAVING_FILE: "ĐžŃибка при Ńохранении файла" ERROR_FILE_TYPE: "Неверный тип файла" ERROR_UNKNOWN: "ĐžŃибка загрŃзки файла" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Форматированный текŃŃ‚" TEXT_SWITCHER_CONFIRM: "Форматирование текŃта и изображения бŃĐ´ŃŃ‚ потеряны. Đ’Ń‹ Ńверены, что хотите продолжить?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "ПерŃональные" LABEL_GENERAL_NAME: "ĐžŃновные" LABEL_CONTACTS_NAME: "Контакты" LABEL_FOLDERS_NAME: "Папки" LABEL_ACCOUNTS_NAME: "ĐккаŃнты" LABEL_IDENTITY_NAME: "Профиль" LABEL_IDENTITIES_NAME: "Профили" LABEL_FILTERS_NAME: "Фильтры" LABEL_TEMPLATES_NAME: "Шаблоны" LABEL_SECURITY_NAME: "БезопаŃноŃть" LABEL_SOCIAL_NAME: "Социальные" LABEL_THEMES_NAME: "Темы" LABEL_CHANGE_PASSWORD_NAME: "Пароль" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Назад" SETTINGS_FILTERS: LEGEND_FILTERS: "Фильтры" BUTTON_SAVE: "Сохранить" BUTTON_ADD_FILTER: "Добавить фильтр" BUTTON_DELETE: "Удалить" BUTTON_RAW_SCRIPT: "ĐŃпользовать ŃобŃтвенный Ńкрипт" SUBNAME_NONE: "Ничего" SUBNAME_MOVE_TO: "ПеремеŃтить в \"%FOLDER%\"" SUBNAME_FORWARD_TO: "ПереŃлать на \"%EMAIL%\"" SUBNAME_REJECT: "Не принимать" SUBNAME_VACATION_MESSAGE: "Сообщение автоответчика" SUBNAME_DISCARD: "Уничтожить" CAPABILITY_LABEL: "ВозможноŃть" LOADING_PROCESS: "Обновление ŃпиŃка фильтров" DELETING_ASK: "Точно?" CHACHES_NEED_TO_BE_SAVED_DESC: "Đзменения ещё не Ńохранены на Ńервер." SETTINGS_IDENTITY: LEGEND_IDENTITY: "НаŃтройки профиля" LABEL_DISPLAY_NAME: "ĐĐĽŃŹ" LABEL_REPLY_TO: "Отвечать на" LABEL_SIGNATURE: "ПодпиŃŃŚ" LABEL_ADD_SIGNATURE_TO_ALL: "Добавлять подпиŃŃŚ ко вŃем иŃходящим Ńообщениям" SETTINGS_SECURITY: LEGEND_SECURITY: "БезопаŃноŃть" LABEL_CONFIGURE_TWO_FACTOR: "НаŃтроить двŃхфакторнŃŃŽ верификацию" LABEL_AUTOLOGOUT: "ĐвтоматичеŃкий выход" AUTOLOGIN_NEVER_OPTION_NAME: "Никогда" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% минŃŃ‚(Ń‹)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% чаŃ(Ń‹)" SETTINGS_GENERAL: LEGEND_GENERAL: "ĐžŃновные НаŃтройки" LABEL_LANGUAGE: "Язык" LABEL_IDENTITY: "Профиль" LABEL_LAYOUT: "Разметка" LABEL_LAYOUT_NO_SPLIT: "Одна панель" LABEL_LAYOUT_VERTICAL_SPLIT: "Вертикальные панели" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Горизонтальные панели" LABEL_EDITOR: "Редактор текŃта по Ńмолчанию" LABEL_EDITOR_HTML: "Форматированный" LABEL_EDITOR_PLAIN: "ПроŃтой" LABEL_EDITOR_HTML_FORCED: "Форматированный (форŃированный)" LABEL_EDITOR_PLAIN_FORCED: "ПроŃтой (форŃированный)" LABEL_ANIMATION: "Đнимация интерфейŃа" LABEL_ANIMATION_FULL: "Полная" LABEL_ANIMATION_NORMAL: "Нормальная" LABEL_ANIMATION_NONE: "ОтŃŃŃ‚ŃтвŃет" LABEL_VIEW_OPTIONS: "Отображение" LABEL_USE_PREVIEW_PANE: "ĐŃпользовать трехколоночный режим отображения" LABEL_USE_CHECKBOXES_IN_LIST: "Показывать чекбокŃŃ‹ в ŃпиŃках" LABEL_USE_THREADS: "Сворачивать пиŃьма в перепиŃках" LABEL_REPLY_SAME_FOLDER: "Помещать ответы в Ń‚Ń Đ¶Đµ папкŃ, где находитŃŃŹ оригинал" LABEL_SHOW_IMAGES: "Показывать внеŃние изображения в теле пиŃьма без предŃпреждения" LABEL_SHOW_ANIMATION: "ĐŃпользовать анимацию" LABEL_MESSAGE_PER_PAGE: "Cообщений на одной Ńтранице" LABEL_NOTIFICATIONS: "Уведомления" LABEL_SOUND_NOTIFICATION: "ЗвŃковые Ńведомления" LABEL_CHROME_NOTIFICATION_DESC: "Показывать Ńведомления Đľ новых Ńообщениях в вŃплывающих подŃказках" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Блокировано браŃзером)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Контакты" LABEL_CONTACTS_AUTOSAVE: "ĐвтоматичеŃки добавлять полŃчателей пиŃем в адреŃĐ˝ŃŃŽ книгŃ" LEGEND_CONTACTS_SYNC: "Синхронизация (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Включить Ńинхронизация" LABEL_CONTACTS_SYNC_SERVER: "Сервер" LABEL_CONTACTS_SYNC_AB_URL: "ĐдреŃная книга (URL)" LABEL_CONTACTS_SYNC_USER: "Пользователь" LABEL_CONTACTS_SYNC_PASSWORD: "Пароль" SETTINGS_THEMES: LEGEND_THEMES: "Темы Оформления" LEGEND_THEMES_CUSTOM: "НаŃтройка ПользовательŃкой Темы" LABEL_CUSTOM_TYPE: "Тип Темы" LABEL_CUSTOM_TYPE_LIGHT: "Светлая" LABEL_CUSTOM_TYPE_DARK: "Темная" LABEL_CUSTOM_BACKGROUND_IMAGE: "Картинка на фоне" BUTTON_UPLOAD_BACKGROUND_IMAGE: "ЗагрŃзить фоновŃŃŽ ĐşĐ°Ń€Ń‚Đ¸Đ˝ĐşŃ (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Файл ŃлиŃком больŃой" ERROR_FILE_TYPE_ERROR: "Неверный тип файла (только JPG и PNG)" ERROR_UNKNOWN: "ĐžŃибка загрŃзки файла" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Подключить Google аккаŃнт" BUTTON_GOOGLE_DISCONNECT: "Отключить Google аккаŃнт" MAIN_GOOGLE_DESC: "ПоŃле подключения Đş Google вы Ńможете залогинитьŃŃŹ в данный аккаŃнт, иŃпользŃŃŹ ĐşĐ˝ĐľĐżĐşŃ Google на экране логина." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Подключить Facebook аккаŃнт" BUTTON_FACEBOOK_DISCONNECT: "Отключить Facebook аккаŃнт" MAIN_FACEBOOK_DESC: "ПоŃле подключения Đş Facebook вы Ńможете залогинитьŃŃŹ в данный аккаŃнт, иŃпользŃŃŹ ĐşĐ˝ĐľĐżĐşŃ Facebook на экране логина." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Подключить Twitter аккаŃнт" BUTTON_TWITTER_DISCONNECT: "Отключить Twitter аккаŃнт" MAIN_TWITTER_DESC: "ПоŃле подключения Đş Twitter вы Ńможете залогинитьŃŃŹ в данный аккаŃнт, иŃпользŃŃŹ ĐşĐ˝ĐľĐżĐşŃ Twitter на экране логина." SETTINGS_FOLDERS: LEGEND_FOLDERS: "СпиŃок Папок" BUTTON_CREATE: "Создать ПапкŃ" BUTTON_SYSTEM: "СиŃтемые папки" BUTTON_DELETE: "Удалить" BUTTON_SUBSCRIBE: "ПодпиŃатьŃŃŹ" BUTTON_UNSUBSCRIBE: "ОтпиŃатьŃŃŹ" LOADING_PROCESS: "Обновление ŃпиŃка папок" CREATING_PROCESS: "Cоздание папки" DELETING_PROCESS: "Удаление папки" RENAMING_PROCESS: "Переименование папки" DELETING_ASK: "Точно?" TO_MANY_FOLDERS_DESC_1: "ĐŁ Đ˛Đ°Ń ŃлиŃком много папок!" TO_MANY_FOLDERS_DESC_2: "Мы показали только чаŃть из них, чтобы избежать проблем Ń ĐżŃ€ĐľĐ¸Đ·Đ˛ĐľĐ´Đ¸Ń‚ĐµĐ»ŃŚĐ˝ĐľŃтью." HELP_DELETE_FOLDER: "Удалить папкŃ" HELP_SHOW_HIDE_FOLDER: "Показывать/прятать папкŃ" HELP_CHECK_FOR_NEW_MESSAGES: "Проверять/не проверять новые Ńообщения" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "СпиŃок ĐккаŃнтов" LEGEND_IDENTITIES: "ПерŃоны" LEGEND_ACCOUNTS_AND_IDENTITIES: "ĐккаŃнты и перŃоны" BUTTON_ADD_ACCOUNT: "Добавить ещё аккаŃнт" BUTTON_ADD_IDENTITY: "Добавить перŃонŃ" BUTTON_DELETE: "Удалить" LOADING_PROCESS: "Обновление ŃпиŃка аккаŃнтов" DELETING_ASK: "Точно?" DEFAULT_IDENTITY_LABEL: "ĐľŃновной" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "НаŃтройки ĐľŃновного профиля" LEGEND_IDENTITIES: "Дополнительные профили" LABEL_DEFAULT: "ĐžŃновной" LABEL_DISPLAY_NAME: "ĐĐĽŃŹ" LABEL_REPLY_TO: "Отвечать на" LABEL_SIGNATURE: "ПодпиŃŃŚ" LABEL_ADD_SIGNATURE_TO_ALL: "Добавлять Ńвою подпиŃŃŚ ко вŃем иŃходящим Ńообщениям" BUTTON_ADD_IDENTITY: "Добавить профиль" BUTTON_DELETE: "Удалить" LOADING_PROCESS: "Обновление ŃпиŃка профилей" DELETING_ASK: "Точно?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Đзменить Пароль" LABEL_CURRENT_PASSWORD: "ТекŃщий пароль" LABEL_NEW_PASSWORD: "Новый пароль" LABEL_REPEAT_PASSWORD: "Повторить" BUTTON_UPDATE_PASSWORD: "ĐŁŃтановить Новый Пароль" ERROR_PASSWORD_MISMATCH: "Пароли не Ńовпадают, попробŃйте еще раз" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Đпортировать OpenPGP ключ" BUTTON_GENERATE_OPEN_PGP_KEYS: "Новый OpenPGP ключ" TITLE_PRIVATE: "Приватный" TITLE_PUBLIC: "ĐźŃбличный" DELETING_ASK: "Точно?" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "ĐвтоматичеŃки Ńохранять черновик" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Сочетания клавиŃ" TAB_MAILBOX: "Почта" TAB_MESSAGE_LIST: "СпиŃок Ńообщений" TAB_MESSAGE_VIEW: "ПроŃмотр Ńообщения" TAB_COMPOSE: "НапиŃание пиŃьма" LABEL_OPEN_USER_DROPDOWN: "Открыть выпадающий ŃпиŃок пользователя" LABEL_REPLY: "Ответить" LABEL_REPLY_ALL: "Ответить вŃем" LABEL_FORWARD: "ПереŃлать" LABEL_FORWARD_MULTIPLY: "ПереŃлать вŃе выбранные Ńообщения" LABEL_HELP: "Помощь" LABEL_CHECK_ALL: "Выбрать вŃе Ńообщения" LABEL_ARCHIVE: "Đрхивировать" LABEL_DELETE: "Удалить" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "ПеремеŃтить" LABEL_READ: "Пометить выбранные пиŃьма прочитанными" LABEL_UNREAD: "Пометить выбранные пиŃьма непрочитанными" LABEL_IMPORTANT: "Пометить выбранные пиŃьма как важные" LABEL_SEARCH: "ПоиŃĐş" LABEL_CANCEL_SEARCH: "Отменить поиŃĐş" LABEL_FULLSCREEN_ENTER: "Полноэкранный режим" LABEL_VIEW_MESSAGE_ENTER: "ПроŃмотр Ńообщения" LABEL_SWITCH_TO_MESSAGE: "Переключить фокŃŃ Đ˝Đ° выбранное Ńообщение" LABEL_SWITCH_TO_FOLDER_LIST: "Переключить фокŃŃ Đ˝Đ° ŃпиŃок папок" LABEL_FULLSCREEN_TOGGLE: "Переключить полноэкранный режим" LABEL_BLOCKQUOTES_TOGGLE: "Переключение видимоŃти цитат в пиŃьме" LABEL_THREAD_NEXT: "СледŃющее Ńообщение в цепочке" LABEL_THREAD_PREV: "ПредыдŃщее Ńообщение в цепочке" LABEL_PRINT: "РаŃпечатать" LABEL_EXIT_FULLSCREEN: "Выйти из полноэкранного режима" LABEL_CLOSE_MESSAGE: "Закрыть Ńообщение" LABEL_SWITCH_TO_LIST: "Переключить фокŃŃ Đ˝Đ° ŃпиŃок пиŃем" LABEL_OPEN_COMPOSE_POPUP: "НапиŃать пиŃŃŚĐĽĐľ" LABEL_MINIMIZE_COMPOSE_POPUP: "Минимизировать окно" LABEL_OPEN_IDENTITIES_DROPDOWN: "Выбрать отправителя" LABEL_SAVE_MESSAGE: "Сохранить Ńообщение" LABEL_SEND_MESSAGE: "Отправить Ńообщение" LABEL_CLOSE_COMPOSE: "Закрыть Ńообщение" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "ĐźŃбличные ключи не найдены" NO_PUBLIC_KEYS_FOUND_FOR: "ĐźŃбличные ключи для \"%EMAIL%\" не найдены" NO_PRIVATE_KEY_FOUND: "Приватный ключ не найден" NO_PRIVATE_KEY_FOUND_FOR: "Приватный ключ для \"%EMAIL%\" не найден" ADD_A_PUBLICK_KEY: "Добавить ĐżŃбличный ключ" SELECT_A_PRIVATE_KEY: "Выберите Ńекретный ключ" UNVERIFIRED_SIGNATURE: "Неподтвержденная ŃигнатŃра" DECRYPTION_ERROR: "OpenPGP ĐľŃибка раŃŃифровки" GOOD_SIGNATURE: "Подтвержденная ŃигнатŃра для %USER%" PGP_ERROR: "OpenPGP ĐľŃибка: %ERROR%" SPECIFY_FROM_EMAIL: "Укажите почтовый Đ°Đ´Ń€ĐµŃ ĐľŃ‚ĐżŃ€Đ°Đ˛Đ¸Ń‚ĐµĐ»ŃŹ" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Укажите как минимŃĐĽ одного полŃчателя" NOTIFICATIONS: INVALID_TOKEN: "Неверный токен запроŃа" AUTH_ERROR: "Не ŃдалоŃŃŚ авторизоватьŃŃŹ" ACCESS_ERROR: "ĐžŃибка Đ´ĐľŃŃ‚Ńпа" CONNECTION_ERROR: "ĐžŃибка Ńоединения Ń Ńервером." CAPTCHA_ERROR: "Неправильное проверочное Ńлово." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Đš Đ´Đ°Đ˝Đ˝ĐľĐĽŃ ŃĐľŃ†Đ¸Đ°Đ»ŃŚĐ˝ĐľĐĽŃ ĐżĐľĐ»ŃŚĐ·ĐľĐ˛Đ°Ń‚ĐµĐ»ŃŽ еще не прикреплен почтовый аккаŃнт. Войдите в ŃиŃŃ‚ĐµĐĽŃ ĐżĐľĐ´ Ńвоим почтовым аккаŃнтом и включите ŃŤŃ‚Ń Đ˛ĐľĐ·ĐĽĐľĐ¶Đ˝ĐľŃть в наŃтройках. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Đš Đ´Đ°Đ˝Đ˝ĐľĐĽŃ ŃĐľŃ†Đ¸Đ°Đ»ŃŚĐ˝ĐľĐĽŃ ĐżĐľĐ»ŃŚĐ·ĐľĐ˛Đ°Ń‚ĐµĐ»ŃŽ еще не прикреплен почтовый аккаŃнт. Войдите в ŃиŃŃ‚ĐµĐĽŃ ĐżĐľĐ´ Ńвоим почтовым аккаŃнтом и включите ŃŤŃ‚Ń Đ˛ĐľĐ·ĐĽĐľĐ¶Đ˝ĐľŃть в наŃтройках. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Đš Đ´Đ°Đ˝Đ˝ĐľĐĽŃ ŃĐľŃ†Đ¸Đ°Đ»ŃŚĐ˝ĐľĐĽŃ ĐżĐľĐ»ŃŚĐ·ĐľĐ˛Đ°Ń‚ĐµĐ»ŃŽ еще не прикреплен почтовый аккаŃнт. Войдите в ŃиŃŃ‚ĐµĐĽŃ ĐżĐľĐ´ Ńвоим почтовым аккаŃнтом и включите ŃŤŃ‚Ń Đ˛ĐľĐ·ĐĽĐľĐ¶Đ˝ĐľŃть в наŃтройках. DOMAIN_NOT_ALLOWED: "Данный домен не разреŃен" ACCOUNT_NOT_ALLOWED: "Данный аккаŃнт не разреŃен" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необходима двŃхфакторная верификация" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "ĐžŃибка двŃхфакторной верификации" COULD_NOT_SAVE_NEW_PASSWORD: "Не ŃдалоŃŃŚ Ńохранить новый пароль" CURRENT_PASSWORD_INCORRECT: "ТекŃщий пароль неверный" NEW_PASSWORD_SHORT: "Пароль ŃлиŃком короткий" NEW_PASSWORD_WEAK: "Пароль ŃлиŃком проŃтой" NEW_PASSWORD_FORBIDDENT: "Пароль Ńодержит запрещенные Ńимволы" CONTACTS_SYNC_ERROR: "ĐžŃибка Ńинхронизации контактов" CANT_GET_MESSAGE_LIST: "Не ĐĽĐľĐłŃ ĐżĐľĐ»Ńчить ŃпиŃок пиŃем" CANT_GET_MESSAGE: "Не ĐĽĐľĐłŃ ĐżĐľĐ»Ńчить пиŃŃŚĐĽĐľ" CANT_DELETE_MESSAGE: "Не ĐĽĐľĐłŃ Ńдалить пиŃŃŚĐĽĐľ" CANT_MOVE_MESSAGE: "Не ĐĽĐľĐłŃ ĐżĐµŃ€ĐµĐĽĐµŃтить пиŃŃŚĐĽĐľ" CANT_SAVE_MESSAGE: "Не ĐĽĐľĐłŃ Ńохранить пиŃŃŚĐĽĐľ" CANT_SEND_MESSAGE: "Не ĐĽĐľĐłŃ ĐľŃ‚ĐżŃ€Đ°Đ˛Đ¸Ń‚ŃŚ пиŃŃŚĐĽĐľ" INVALID_RECIPIENTS: "Проверьте правильноŃть ввода вŃех адреŃов." CANT_SAVE_FILTERS: "Не ĐĽĐľĐłŃ Ńохранить фильтры" CANT_GET_FILTERS: "Не ĐĽĐľĐłŃ Đ·Đ°ĐłŃ€Ńзить фильтры" FILTERS_ARE_NOT_CORRECT: "Фильтры неправильны" CANT_CREATE_FOLDER: "Не ĐĽĐľĐłŃ Ńоздать папкŃ" CANT_RENAME_FOLDER: "Не ĐĽĐľĐłŃ ĐżĐµŃ€ĐµĐ¸ĐĽĐµĐ˝ĐľĐ˛Đ°Ń‚ŃŚ папкŃ" CANT_DELETE_FOLDER: "Не ĐĽĐľĐłŃ Ńдалить папкŃ" CANT_DELETE_NON_EMPTY_FOLDER: "Не ĐĽĐľĐłŃ Ńдалить непŃŃŃ‚ŃŃŽ папкŃ" CANT_SUBSCRIBE_FOLDER: "Не ĐĽĐľĐłŃ ĐżĐľĐ´ĐżĐ¸Ńать папкŃ" CANT_UNSUBSCRIBE_FOLDER: "Не ĐĽĐľĐłŃ ĐľŃ‚ĐżĐ¸Ńать папкŃ" CANT_SAVE_SETTINGS: "Не ĐĽĐľĐłŃ Ńохранить наŃтройки" CANT_SAVE_PLUGIN_SETTINGS: "Не ĐĽĐľĐłŃ Ńохранить наŃтройки" DOMAIN_ALREADY_EXISTS: "Домен Ńже ŃŃщеŃтвŃет" CANT_INSTALL_PACKAGE: "ĐžŃибка ŃŃтановки пакета" CANT_DELETE_PACKAGE: "ĐžŃибка Ńдаления пакета" INVALID_PLUGIN_PACKAGE: "ĐžŃибка пакета плагина" UNSUPPORTED_PLUGIN_PACKAGE: "Для работы плагина необходима полная поддержка Ńервера" LICENSING_SERVER_IS_UNAVAILABLE: "Сервер подпиŃок временно не Đ´ĐľŃŃ‚Ńпен." LICENSING_DOMAIN_EXPIRED: "ПодпиŃка на данный домен ŃŃтарела." LICENSING_DOMAIN_BANNED: "ПодпиŃка на данный домен заблокирована." DEMO_SEND_MESSAGE_ERROR: "Демо аккаŃĐ˝Ń‚Ń ĐľŃ‚ĐżŃ€Đ°Đ˛ĐşĐ° пиŃем на внеŃние почтовые адреŃа запрещена!" DEMO_ACCOUNT_ERROR: "По Ńоображениям безопаŃноŃти данный аккаŃнт не может выполнить это дейŃтвие." ACCOUNT_ALREADY_EXISTS: "ĐккаŃнт Ńже добавлен" ACCOUNT_DOES_NOT_EXIST: "ĐккаŃнт не ŃŃщеŃтвŃет" MAIL_SERVER_ERROR: "ĐžŃибка Đ´ĐľŃŃ‚Ńпа Đş ĐżĐľŃ‡Ń‚ĐľĐ˛ĐľĐĽŃ ŃерверŃ" INVALID_INPUT_ARGUMENT: "Неверный параметр" UNKNOWN_ERROR: "НеизвеŃтная ĐľŃибка" STATIC: BACK_LINK: "Обновить" DOMAIN_LIST_DESC: "СпиŃок доменов, Đş которым разреŃен Đ´ĐľŃŃ‚ŃĐż через веб почтŃ." PHP_EXSTENSIONS_ERROR_DESC: "Необходимые раŃŃирения PHP не ŃŃтановлены на ваŃем Ńервере!" PHP_VERSION_ERROR_DESC: "ВаŃа верŃия PHP (%VERSION%) ниже требŃемой 5.3.0!" NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." NO_SCRIPT_DESC: | По-видимомŃ, JavaScript либо не поддерживаетŃŃŹ ваŃим браŃзером, либо отключен. Включите JavaScript, изменив наŃтройки браŃзера, затем повторите попыткŃ. NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." NO_COOKIE_DESC: | По-видимомŃ, Cookie либо не поддерживаютŃŃŹ ваŃим браŃзером, либо отключены. Включите Cookie, изменив наŃтройки браŃзера, затем повторите попыткŃ. BAD_BROWSER_TITLE: "Đ’Đ°Ń Đ±Ń€Đ°Ńзер ŃŃтарел." BAD_BROWSER_DESC: | Чтобы иŃпользовать вŃе возможноŃти приложения, загрŃзите и ŃŃтановите один из этих браŃзеров rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml000066400000000000000000000767561361462701300262360ustar00rootroot00000000000000sk_SK: LOGIN: LABEL_EMAIL: "Email" LABEL_LOGIN: "PoužívateÄľskĂ© meno" LABEL_PASSWORD: "Heslo" LABEL_SIGN_ME: "ZapamätaĹĄ" LABEL_VERIFICATION_CODE: "VerifikaÄŤnĂ˝ kĂłd" LABEL_DONT_ASK_VERIFICATION_CODE: "NevyĹľadovaĹĄ kĂłd 2 týždne" BUTTON_SIGN_IN: "PrihlásiĹĄ sa" TITLE_SIGN_IN_GOOGLE: "PrihlásiĹĄ sa pomocu Google" TITLE_SIGN_IN_FACEBOOK: "PrihlásiĹĄ sa pomocou Facebook" TITLE_SIGN_IN_TWITTER: "PrihlásiĹĄ sa pomocou Twitter" LABEL_FORGOT_PASSWORD: "Zabudol som heslo" LABEL_REGISTRATION: "Registrácia" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "PridaĹĄ účet" BUTTON_SETTINGS: "Nastavenia" BUTTON_HELP: "Pomoc" BUTTON_LOGOUT: "OdhlásiĹĄ" MOBILE: BUTTON_MOBILE_VERSION: "Verzia pre mobil" BUTTON_DESKTOP_VERSION: "Verzia pre desktop" SEARCH: MAIN_INPUT_PLACEHOLDER: "HÄľadaĹĄ" TITLE_ADV: "RozšírenĂ© hÄľadanie" LABEL_ADV_FROM: "OdosielateÄľ" LABEL_ADV_TO: "PrĂ­jemca" LABEL_ADV_SUBJECT: "Predmet" LABEL_ADV_TEXT: "Text" LABEL_ADV_HAS_ATTACHMENT: "S prĂ­lohou" LABEL_ADV_HAS_ATTACHMENTS: "S prĂ­lohami" LABEL_ADV_FLAGGED: "OznaÄŤenĂ© hviezdiÄŤkou" LABEL_ADV_UNSEEN: "NepreÄŤĂ­tanĂ©" LABEL_ADV_DATE: "Dátum" LABEL_ADV_DATE_ALL: "KedykoÄľvek" LABEL_ADV_DATE_3_DAYS: "Nie staršie ako 3 dni" LABEL_ADV_DATE_7_DAYS: "Nie staršie ako týždeĹ" LABEL_ADV_DATE_MONTH: "Nie staršie ako mesiac" LABEL_ADV_DATE_3_MONTHS: "Nie staršie ako 3 mesiace" LABEL_ADV_DATE_6_MONTHS: "Nie staršie ako 6 mesiacov" LABEL_ADV_DATE_YEAR: "Nie staršie ako 1 rok" BUTTON_ADV_SEARCH: "HÄľadaĹĄ" PREVIEW_POPUP: FULLSCREEN: "Prepnúť na celĂş obrazovku" ZOOM: "Zoom" CLOSE: "ZatvoriĹĄ (Esc)" LOADING: "NaÄŤĂ­tavam..." GALLERY_PREV: "PredchádzajĂşci (šípka vÄľavo)" GALLERY_NEXT: "NasledujĂşci (šípka vpravo)" GALLERY_COUNTER: "%curr% z %total%" IMAGE_ERROR: "Obrázok sa nepodarilo naÄŤĂ­taĹĄ." AJAX_ERROR: "Obsah sa nepodarilo naÄŤĂ­taĹĄ." FOLDER_LIST: BUTTON_COMPOSE: "VytvoriĹĄ" BUTTON_CONTACTS: "Adresár" BUTTON_NEW_MESSAGE: "Nová správa" INBOX_NAME: "PrijatĂ©" SENT_NAME: "OdoslanĂ©" DRAFTS_NAME: "Koncepty" SPAM_NAME: "Spam" TRASH_NAME: "Kôš" ARCHIVE_NAME: "ArchĂ­v" QUOTA: TITLE: "Spotreba kvĂłty" MESSAGE_LIST: BUTTON_RELOAD: "Znovu naÄŤĂ­taĹĄ zoznam správ" BUTTON_MOVE_TO: "Presunúť do" BUTTON_DELETE: "OdstrániĹĄ" BUTTON_ARCHIVE: "ArchĂ­v" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Nie je spam" BUTTON_EMPTY_FOLDER: "VyÄŤistiĹĄ prieÄŤinok" BUTTON_MULTY_FORWARD: "PreposlaĹĄ ako prĂ­lohu" BUTTON_DELETE_WITHOUT_MOVE: "NavĹľdy odstrániĹĄ" BUTTON_MORE: "Viac" MENU_SET_SEEN: "OznaÄŤiĹĄ ako preÄŤĂ­tanĂ©" MENU_SET_ALL_SEEN: "OznaÄŤiĹĄ všetko ako preÄŤĂ­tanĂ©" MENU_UNSET_SEEN: "OznaÄŤiĹĄ ako nepreÄŤĂ­tanĂ©" MENU_SET_FLAG: "OznaÄŤiĹĄ hviezdiÄŤkou" MENU_UNSET_FLAG: "ZrušiĹĄ oznaÄŤenie hviezdiÄŤkou" MENU_SELECT_ALL: "Všetko" MENU_SELECT_NONE: "Ĺ˝iadne" MENU_SELECT_INVERT: "InvertovaĹĄ" MENU_SELECT_UNSEEN: "NepreÄŤĂ­tanĂ©" MENU_SELECT_SEEN: "PreÄŤĂ­tanĂ©" MENU_SELECT_FLAGGED: "OznaÄŤenĂ©" MENU_SELECT_UNFLAGGED: "NeoznaÄŤenĂ©" EMPTY_LIST: "Zoznam je prázdny." EMPTY_SEARCH_LIST: "Vášmu vyhÄľadávaniu nezodpovedajĂş Ĺľiadne správy." SEARCH_RESULT_FOR: "VĂ˝sledky vyhÄľadávania pre \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "späť do zoznamu správ" LIST_LOADING: "NaÄŤĂ­tavam" EMPTY_SUBJECT_TEXT: "(Bez predmetu)" PUT_MESSAGE_HERE: "PusĹĄte správu tu pre jej zobrazenie v zozname" TODAY_AT: "dnes o %TIME%" YESTERDAY_AT: "vÄŤera o %TIME%" SEARCH_PLACEHOLDER: "HÄľadaĹĄ" NEW_MESSAGE_NOTIFICATION: "Máte %COUNT% novĂ˝ch správ!" QUOTA_SIZE: "Používate %SIZE% (%PROC%%) z vašich %LIMIT%" MESSAGE: BUTTON_EDIT: "EditovaĹĄ" BUTTON_BACK: "Späť" BUTTON_CLOSE: "ZatvoriĹĄ" BUTTON_DELETE: "OdstrániĹĄ" BUTTON_UNSUBSCRIBE: "OdhlásiĹĄ sa z mailing listu" BUTTON_ARCHIVE: "ArchĂ­v" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Nie je spam" BUTTON_MOVE_TO: "Presunúť do" BUTTON_MORE: "Viac" BUTTON_REPLY: "OdpovedaĹĄ" BUTTON_REPLY_ALL: "OdpovedaĹĄ všetkĂ˝m" BUTTON_FORWARD: "PreposlaĹĄ" BUTTON_FORWARD_AS_ATTACHMENT: "PreposlaĹĄ ako prĂ­lohu" BUTTON_EDIT_AS_NEW: "PouĹľiĹĄ ako predlohu" BUTTON_SHOW_IMAGES: "ZobraziĹĄ externĂ© obrázky" BUTTON_NOTIFY_READ_RECEIPT: "OdosielateÄľ poĹľiadal o potvrdenie preÄŤĂ­tania tejto správy." BUTTON_IN_NEW_WINDOW: "ZobraziĹĄ v novom okne" BUTTON_THREAD_LIST: "Zoznam konverzáciĂ­" BUTTON_THREAD_PREV: "PredchádzajĂşci" BUTTON_THREAD_NEXT: "NasledujĂşci" BUTTON_THREAD_MORE: "ÄŽalšie správy" MENU_HEADERS: "ZobraziĹĄ hlaviÄŤku správy" MENU_VIEW_ORIGINAL: "ZobraziĹĄ zdroj" MENU_DOWNLOAD_ORIGINAL: "PrevziaĹĄ ako sĂşbor .eml" MENU_FILTER_SIMILAR: "FiltrovaĹĄ správy ako táto" MENU_PRINT: "TlaÄŤiĹĄ" EMPTY_SUBJECT_TEXT: "(Bez predmetu)" LABEL_SUBJECT: "Predmet" LABEL_DATE: "Dátum" LABEL_FROM: "OdosielateÄľ" LABEL_FROM_SHORT: "od" LABEL_TO: "PrĂ­jemca" LABEL_TO_SHORT: "pre" LABEL_CC: "KĂłpia" LABEL_BCC: "Skrytá kĂłpia" LABEL_REPLY_TO: "Adresa pre odpoveÄŹ" PRINT_LABEL_FROM: "OdosielateÄľ" PRINT_LABEL_TO: "PrĂ­jemca" PRINT_LABEL_CC: "KĂłpia" PRINT_LABEL_BCC: "Skrytá kĂłpia" PRINT_LABEL_REPLY_TO: "Adresa pre odpoveÄŹ" PRINT_LABEL_DATE: "Dátum" PRINT_LABEL_SUBJECT: "Predmet" PRINT_LABEL_ATTACHMENTS: "PrĂ­lohy" MESSAGE_LOADING: "NaÄŤĂ­tavam" MESSAGE_VIEW_DESC: "Vyberte správu zo zoznamu pre jej zobrazenie." MESSAGE_VIEW_MOVE_DESC: "ZvoÄľte cieÄľ kliknutĂ­m na názov prieÄŤinka v Äľavom stÄşpci." PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" PGP_SIGNED_MESSAGE_DESC: "Správa podpĂ­saná s OpenPGP (kliknite pre overenie)" PGP_ENCRYPTED_MESSAGE_DESC: "Správa šifrovaná s OpenPGP (kliknite pre dešifrovanie)" LINK_DOWNLOAD_AS_ZIP: "PrevziaĹĄ ako zip" LINK_SAVE_TO_OWNCLOUD: "UloĹľiĹĄ do ownCloud" LINK_SAVE_TO_CLOUD: "UloĹľiĹĄ do Cloud" LINK_SAVE_TO_DROPBOX: "UloĹľiĹĄ do Dropbox" READ_RECEIPT: SUBJECT: "Potvrdenie o doruÄŤenĂ­ (zobrazenĂ©) - %SUBJECT%" BODY: | Toto je potvrdenie o doruÄŤenĂ­ pre mail, ktorĂ˝ ste poslali %READ-RECEIPT%. Poznámka: Potvrdenie o doruÄŤenĂ­ znamená, Ĺľe správa bola zobrazená na poÄŤĂ­taÄŤi adresáta. Potvrdenie nezaruÄŤuje, Ĺľe adresát správu naozaj preÄŤĂ­tal alebo porozumel jej obsahu. SUGGESTIONS: SEARCHING_DESC: "HÄľadám..." CONTACTS: LEGEND_CONTACTS: "Adresár" SEARCH_INPUT_PLACEHOLDER: "HÄľadaĹĄ" BUTTON_ADD_CONTACT: "PridaĹĄ kontakt" BUTTON_CREATE_CONTACT: "VytvoriĹĄ" BUTTON_UPDATE_CONTACT: "AktualizovaĹĄ" BUTTON_IMPORT: "ImportovaĹĄ (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "ExportovaĹĄ (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Chyba importu (nesprávny formát sĂşboru)" LIST_LOADING: "NaÄŤĂ­tavam" EMPTY_LIST: "Nemáte Ĺľiadne kontakty" EMPTY_SEARCH: "Nenašli sa Ĺľiadne kontakty" CLEAR_SEARCH: "ZrušiĹĄ vyhÄľadávanie" CONTACT_VIEW_DESC: "ZvoÄľte kontakt zo zoznamu pre jeho zobrazenie tu." LABEL_DISPLAY_NAME: "ZobraziĹĄ ako" LABEL_EMAIL: "Email" LABEL_PHONE: "TelefĂłn" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Dátum narodenia" LINK_ADD_EMAIL: "PridaĹĄ emailovĂş adresu" LINK_ADD_PHONE: "PridaĹĄ telefĂłn" LINK_BIRTHDAY: "Dátum narodenia" PLACEHOLDER_ENTER_DISPLAY_NAME: "Zadajte ZobrazovanĂ© meno" PLACEHOLDER_ENTER_LAST_NAME: "Zadajte priezvisko" PLACEHOLDER_ENTER_FIRST_NAME: "Zadajte meno" PLACEHOLDER_ENTER_NICK_NAME: "Zadajte prezĂ˝vku" LABEL_READ_ONLY: "Len pre ÄŤĂ­tanie" LABEL_SHARE: "ZdielaĹĄ" ADD_MENU_LABEL: "PridaĹĄ" ADD_MENU_NICKNAME: "PrezĂ˝vka" ADD_MENU_NOTES: "Poznámky" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "TelefĂłn" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adresa" ADD_MENU_BIRTHDAY: "Dátum narodenia" ADD_MENU_TAGS: "ZnaÄŤky" BUTTON_SHARE_NONE: "Ĺ˝iadne" BUTTON_SHARE_ALL: "Všetko" BUTTON_SYNC: "Synchronizácia (CardDAV)" COMPOSE: TITLE_FROM: "OdosielateÄľ" TITLE_TO: "PrĂ­jemca" TITLE_CC: "KĂłpia" TITLE_BCC: "Skrytá kĂłpia" TITLE_REPLY_TO: "OdpovedaĹĄ na" TITLE_SUBJECT: "Predmet" LINK_SHOW_INPUTS: "zobraziĹĄ všetky polia" BUTTON_SEND: "OdoslaĹĄ" BUTTON_SAVE: "UloĹľiĹĄ" BUTTON_DELETE: "OdstrániĹĄ" BUTTON_CANCEL: "ZrušiĹĄ" BUTTON_MINIMIZE: "MinimalizovaĹĄ" SAVED_TIME: "UloĹľenĂ© o %TIME%" SAVED_ERROR_ON_SEND: "Správa bola odoslaná ale nebola uloĹľená do prieÄŤinka odoslanĂ˝ch správ" DISCARD_UNSAVED_DATA: "ZahodiĹĄ neuloĹľenĂ© dáta?" ATTACH_FILES: "PripojiĹĄ sĂşbory" ATTACH_DROP_FILES_DESC: "SĂşbory pusĹĄte tu" ATTACH_ITEM_CANCEL: "ZrušiĹĄ" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE: "-------- Preposlaná správa -------" FORWARD_MESSAGE_TOP_FROM: "OdosielateÄľ" FORWARD_MESSAGE_TOP_TO: "PrĂ­jemca" FORWARD_MESSAGE_TOP_CC: "KĂłpia" FORWARD_MESSAGE_TOP_SENT: "OdoslaĹĄ" FORWARD_MESSAGE_TOP_SUBJECT: "Predmet" EMPTY_TO_ERROR_DESC: "Zadajte prosĂ­m aspoĹ jednĂ©ho prĂ­jemcu" NO_ATTACHMENTS_HERE_DESC: "Ĺ˝iadne prĂ­lohy." ATTACHMENTS_ERROR_DESC: "Pozor! Nie všetky prĂ­lohy boli nahratĂ©." ATTACHMENTS_UPLOAD_ERROR_DESC: "Nie všetky prĂ­lohy boli uĹľ nahratĂ© na server." BUTTON_REQUEST_READ_RECEIPT: "VyĹľiadaĹĄ potvrdenie o preÄŤĂ­tanĂ­" BUTTON_MARK_AS_IMPORTANT: "OznaÄŤiĹĄ ako dĂ´leĹľitĂ©" BUTTON_OPEN_PGP: "Open PGP (iba text)" BUTTON_REQUEST_DSN: "VyĹľiadaĹĄ potvrdenie o doruÄŤenĂ­" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "ZatvoriĹĄ" POPUPS_ASK: BUTTON_YES: "Ăno" BUTTON_NO: "Nie" DESC_WANT_CLOSE_THIS_WINDOW: "Ste si istĂ˝ Ĺľe chcete zatvoriĹĄ toto okno?" DESC_WANT_DELETE_MESSAGES: "Ste si istĂ˝ Ĺľe chcete odstrániĹĄ tieto správy?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "ZvoÄľte jazyk" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "PridaĹĄ účet?" BUTTON_ADD_ACCOUNT: "PridaĹĄ" TITLE_UPDATE_ACCOUNT: "UpraviĹĄ účet?" BUTTON_UPDATE_ACCOUNT: "UpraviĹĄ" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "PridaĹĄ identitu?" TITLE_UPDATE_IDENTITY: "UpraviĹĄ identitu?" BUTTON_ADD_IDENTITY: "PridaĹĄ" BUTTON_UPDATE_IDENTITY: "UpraviĹĄ" LABEL_EMAIL: "Email" LABEL_NAME: "Meno" LABEL_REPLY_TO: "Adresa pre odpoveÄŹ" LABEL_SIGNATURE: "Podpis" LABEL_CC: "KĂłpia" LABEL_BCC: "Skrytá kĂłpia" LABEL_SIGNATURE_INSERT_BEFORE: "V odpovediach vloĹľiĹĄ tento podpis nad citovanĂ˝ text" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "VytvoriĹĄ prieÄŤinok?" LABEL_NAME: "Názov prieÄŤinka" LABEL_PARENT: "NadradenĂ˝ prieÄŤinok" BUTTON_CREATE: "VytvoriĹĄ" BUTTON_CANCEL: "ZrušiĹĄ" BUTTON_CLOSE: "ZatvoriĹĄ" TITLE_CREATING_PROCESS: "Vytváram prieÄŤinok" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "OdstrániĹĄ všetky správy v prieÄŤinku?" BUTTON_CLEAR: "VyÄŤistiĹĄ" BUTTON_CANCEL: "ZrušiĹĄ" BUTTON_CLOSE: "ZatvoriĹĄ" DANGER_DESC_WARNING: "Upozornenie!" DANGER_DESC_HTML_1: "Chystáte sa nenávratne odstrániĹĄ všetky správy z prieÄŤinka %FOLDER%." DANGER_DESC_HTML_2: "Tento proces nie je moĹľnĂ© prerušiĹĄ." TITLE_CLEARING_PROCESS: "OdstraĹujem prieÄŤinok..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "ImportovaĹĄ kľúč OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "ZobraziĹĄ kľúč OpenPGP" BUTTON_SELECT: "VybraĹĄ" BUTTON_CLOSE: "Close" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" LABEL_EMAIL: "Email" LABEL_NAME: "Name" LABEL_PASSWORD: "Password" LABEL_KEY_BIT_LENGTH: "Key length" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "Sign" LABEL_ENCRYPT: "Encrypt" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Sign" BUTTON_ENCRYPT: "Encrypt" BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Step verification test" LABEL_CODE: "Code" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Záhlavie" SELECT_FIELD_SIZE: "VeÄľkosĹĄ" SELECT_TYPE_CONTAINS: "Obsahuje" SELECT_TYPE_NOT_CONTAINS: "Neobsahuje" SELECT_TYPE_MATCHES: "Zhoduje sa (* a ? je podporovanĂ©)" SELECT_TYPE_NOT_MATCHES: "Nezhoduje sa (* a ? je podporovanĂ©)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "NegatĂ­vny regexp" SELECT_TYPE_EQUAL_TO: "Rovná sa" SELECT_TYPE_NOT_EQUAL_TO: "Nerovná sa" SELECT_TYPE_OVER: "Nad" SELECT_TYPE_UNDER: "Pod" SELECT_MATCH_ANY: "Vyhovuje akĂ©koÄľvek z nasledujĂşcich pravidiel" SELECT_MATCH_ALL: "VyhovujĂş všetky nasledujĂşce pravidlá" MARK_AS_READ_LABEL: "OznaÄŤiĹĄ ako preÄŤĂ­tanĂ©" REPLY_INTERVAL_LABEL: "Interval odpovede (v dĹoch)" KEEP_LABEL: "PonechaĹĄ" STOP_LABEL: "PokraÄŤovaĹĄ vo vykonávanĂ­ pravidiel" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Predmet (voliteÄľne)" VACATION_MESSAGE_LABEL: "Správa" VACATION_RECIPIENTS_LABEL: "Adresáti (oddelenĂ­ ÄŤiarkou)" REJECT_MESSAGE_LABEL: "OdmietnuĹĄ správu" ALL_INCOMING_MESSAGES_DESC: "Všetky prichádzajĂşce správy" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "SpravovaĹĄ SystĂ©movĂ© prieÄŤinky" SELECT_CHOOSE_ONE: "VybraĹĄ" SELECT_UNUSE_NAME: "NepoužívaĹĄ" LABEL_SENT: "OdoslanĂ©" LABEL_DRAFTS: "Koncepty" LABEL_SPAM: "Spam" LABEL_TRASH: "Kôš" LABEL_ARCHIVE: "ArchĂ­v" BUTTON_CANCEL: "ZrušiĹĄ" BUTTON_CLOSE: "ZatvoriĹĄ" NOTIFICATION_SENT: | Nepriradili ste systĂ©movĂ˝ prieÄŤinok "OdoslanĂ©" kam budĂş správy presunutĂ© po ich odoslanĂ­. Ak nechcete ukladaĹĄ odoslanĂ© správy, vyberte prosĂ­m moĹľnosĹĄ "NepoužívaĹĄ". NOTIFICATION_DRAFTS: "Nepriradili ste systĂ©movĂ˝ prieÄŤinok pre \"Koncepty\" kam sĂş správy ukladanĂ© poÄŤas ich pĂ­sania." NOTIFICATION_SPAM: | Nepriradili ste systĂ©movĂ˝ prieÄŤinok pre "Spam" kam sĂş ukladanĂ© nevyĹľiadanĂ© správy. Ak si Ĺľeláte takĂ©to správy odstraĹovaĹĄ natrvalo, vyberte prosĂ­m moĹľnosĹĄ "NepoužívaĹĄ". NOTIFICATION_TRASH: | Nepriradili ste systĂ©movĂ˝ prieÄŤinok pre "Kôš" kam sĂş správy presunutĂ© po ich odstránenĂ­. Ak si Ĺľeláte takĂ©to správy odstraĹovaĹĄ natrvalo, vyberte prosĂ­m moĹľnosĹĄ "NepoužívaĹĄ". NOTIFICATION_ARCHIVE: "Nepriradili ste systĂ©movĂ˝ prieÄŤinok pre \"ArchĂ­v\" kam budĂş uloĹľenĂ© archivovanĂ© správy." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" LABEL_TWO_FACTOR_USER: "PoužívateÄľ" LABEL_TWO_FACTOR_STATUS: "Stav" LABEL_TWO_FACTOR_SECRET: "TajnĂ˝ kľúč" LABEL_TWO_FACTOR_BACKUP_CODES: "ZáloĹľnĂ© kĂłdy" BUTTON_CREATE: "VygenerovaĹĄ novĂ˝ tajnĂ˝ kľúč" BUTTON_ACTIVATE: "AktivovaĹĄ" BUTTON_CLEAR: "VyÄŤistiĹĄ" BUTTON_LOGOUT: "OdhlásiĹĄ" BUTTON_DONE: "DokonÄŤenĂ©" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "ZobraziĹĄ tajnĂ˝ kľúč" BUTTON_HIDE_SECRET: "SkryĹĄ tajnĂ˝ kľúč" TWO_FACTOR_REQUIRE_DESC: "Váš účet vyĹľaduje konfiguráciu 2-krokovej verifikácie." TWO_FACTOR_SECRET_CONFIGURED_DESC: "NakonfigurovanĂ©" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "NenakonfigurovanĂ©" TWO_FACTOR_SECRET_DESC: > Naimportujte do vášho Google Authenticator klienta (alebo inĂ©ho TOTP klienta) s pouĹľitĂ­m QR kĂłdu alebo manuálne zadanĂ­m kĂłdu. TWO_FACTOR_BACKUP_CODES_DESC: > Ak sa nemĂ´Ĺľete prihlásiĹĄ pouĹľitĂ­m kĂłdu z Google Authenticator (alebo inĂ©ho TOTP klienta), pouĹľite záloĹľnĂ© kĂłdy. PouĹľitĂ˝ záloĹľnĂ˝ kĂłd bude deaktivovanĂ˝. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Toto nastavenie nemĂ´Ĺľete zmeniĹĄ pred testom." TITLES: LOADING: "NaÄŤĂ­tavam" LOGIN: "PoužívateÄľskĂ© meno" MAILBOX: "Schránka správ" SETTINGS: "Nastavenia" COMPOSE: "NapĂ­saĹĄ" UPLOAD: ERROR_FILE_IS_TOO_BIG: "SĂşbor je prĂ­liš veÄľkĂ˝" ERROR_FILE_PARTIALLY_UPLOADED: "Z dĂ´vodu neznámej chyby bol sĂşbor nahranĂ˝ len ÄŤiastoÄŤne" ERROR_NO_FILE_UPLOADED: "SĂşbor nebol nahranĂ˝" ERROR_MISSING_TEMP_FOLDER: "DoÄŤasnĂ˝ sĂşbor chĂ˝ba" ERROR_ON_SAVING_FILE: "Nastala neznáma chyba pri nahrávanĂ­" ERROR_FILE_TYPE: "Nesprávny typ sĂşboru" ERROR_UNKNOWN: "Nastala neznáma chyba pri nahrávanĂ­" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "FormátovanĂ˝ text" TEXT_SWITCHER_CONFIRM: "Formátovanie textu a obrázky budĂş stratenĂ©. Ĺ˝eláte si pokraÄŤovaĹĄ?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "OsobnĂ©" LABEL_GENERAL_NAME: "VšeobecnĂ©" LABEL_CONTACTS_NAME: "Kontakty" LABEL_FOLDERS_NAME: "PrieÄŤinky" LABEL_ACCOUNTS_NAME: "Účty" LABEL_IDENTITY_NAME: "Identita" LABEL_IDENTITIES_NAME: "Identity" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "ZabezpeÄŤenie" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "MotĂ­vy" LABEL_CHANGE_PASSWORD_NAME: "Heslo" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Späť" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtre" BUTTON_SAVE: "UloĹľiĹĄ" BUTTON_ADD_FILTER: "PridaĹĄ filter" BUTTON_DELETE: "VymazaĹĄ" BUTTON_RAW_SCRIPT: "PouĹľiĹĄ používateÄľskĂ˝ skript" SUBNAME_NONE: "Ĺ˝iadny" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identita" LABEL_DISPLAY_NAME: "Meno" LABEL_REPLY_TO: "Adresa pre odpoveÄŹ" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "PripojiĹĄ podpis k všetkĂ˝ch odchádzajĂşcim správam" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_CONFIGURE_TWO_FACTOR: "NakonfigurovaĹĄ 2-krokovĂş verifikáciu" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hodĂ­n" SETTINGS_GENERAL: LEGEND_GENERAL: "VšeobecnĂ©" LABEL_LANGUAGE: "Jazyk" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "PredvolenĂ˝ editor správ" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Text" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "Animácie prostredia" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "None" LABEL_VIEW_OPTIONS: "MoĹľnosti zobrazenia" LABEL_USE_PREVIEW_PANE: "PoužívaĹĄ panel rĂ˝chleho zobrazenia" LABEL_USE_CHECKBOXES_IN_LIST: "Zobrazenie zaštkrtávacĂ­ch polĂ­ÄŤok v zozname" LABEL_USE_THREADS: "ZobraziĹĄ ako konverzácie" LABEL_REPLY_SAME_FOLDER: "UmiestĹovaĹĄ odpovede do prieÄŤinka so správou ktorej sa tĂ˝kajĂş" LABEL_SHOW_IMAGES: "VĹľdy zobrazovaĹĄ obrázky v tele správy" LABEL_SHOW_ANIMATION: "AnimovaĹĄ" LABEL_MESSAGE_PER_PAGE: "Správ na stranu" LABEL_NOTIFICATIONS: "Notifikácie" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "ZobrazovaĹĄ upozornenia na novĂ© správy" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(ZablokovanĂ© prehliadaÄŤom)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakty" LABEL_CONTACTS_AUTOSAVE: "Automaticky pridávaĹĄ prĂ­jemcov správ do Adresára" LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" LABEL_CONTACTS_SYNC_USER: "User" LABEL_CONTACTS_SYNC_PASSWORD: "Password" SETTINGS_THEMES: LEGEND_THEMES: "MotĂ­vy" LEGEND_THEMES_CUSTOM: "Správa vlastnĂ©ho motĂ­vu" LABEL_CUSTOM_TYPE: "Typ" LABEL_CUSTOM_TYPE_LIGHT: "SvetlĂ˝" LABEL_CUSTOM_TYPE_DARK: "TmavĂ˝" LABEL_CUSTOM_BACKGROUND_IMAGE: "Pozadie" BUTTON_UPLOAD_BACKGROUND_IMAGE: "NahraĹĄ obrázok pozadia (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "SĂşbor je prĂ­liš veÄľkĂ˝" ERROR_FILE_TYPE_ERROR: "Nesprávny typ sĂşboru (JPG and PNG only)" ERROR_UNKNOWN: "Nastala nezáma chyba pri nahrávanĂ­ sĂşboru" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "PripojiĹĄ Google" BUTTON_GOOGLE_DISCONNECT: "OdpojiĹĄ Google" MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "PripojiĹĄ Facebook" BUTTON_FACEBOOK_DISCONNECT: "OdpojiĹĄ Facebook" MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "PripojiĹĄ Twitter" BUTTON_TWITTER_DISCONNECT: "OdpojiĹĄ Twitter" MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Zoznam prieÄŤinkov" BUTTON_CREATE: "VytvoriĹĄ prieÄŤinok" BUTTON_SYSTEM: "SystĂ©movĂ© prieÄŤinky" BUTTON_DELETE: "OdstrániĹĄ" BUTTON_SUBSCRIBE: "PrihlásiĹĄ sa" BUTTON_UNSUBSCRIBE: "OdhlásiĹĄ sa" LOADING_PROCESS: "Aktualizujem zoznam prieÄŤinkov" CREATING_PROCESS: "Vytváram prieÄŤinok" DELETING_PROCESS: "OdstraĹujem prieÄŤinok" RENAMING_PROCESS: "Premenovávam preÄŤinok" DELETING_ASK: "Ste si istĂ˝?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Zoznam účtov" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "PridaĹĄ účet" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "OdstrániĹĄ" LOADING_PROCESS: "Aktualizácia zoznamu účtov" DELETING_ASK: "Ste si istĂ˝?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identita" LEGEND_IDENTITIES: "ÄŽalšie identity" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "Meno" LABEL_REPLY_TO: "Adresa pre odpoveÄŹ" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "PripojiĹĄ podpis ku všetkĂ˝m odosielanĂ˝m správam" BUTTON_ADD_IDENTITY: "PridaĹĄ Identitu" BUTTON_DELETE: "OdstrániĹĄ" LOADING_PROCESS: "Aktualizácia zoznamu identĂ­t" DELETING_ASK: "Ste si istĂ˝?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "ZmeniĹĄ heslo" LABEL_CURRENT_PASSWORD: "SúčasnĂ© heslo" LABEL_NEW_PASSWORD: "NovĂ© heslo" LABEL_REPEAT_PASSWORD: "NovĂ© heslo znova" BUTTON_UPDATE_PASSWORD: "NastaviĹĄ novĂ© heslo" ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" TITLE_PRIVATE: "Private" TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" LABEL_ALLOW_DRAFT_AUTOSAVE: "Automaticky uloĹľiĹĄ koncept." SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Message list" TAB_MESSAGE_VIEW: "Message view" TAB_COMPOSE: "Compose" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "Reply" LABEL_REPLY_ALL: "Reply All" LABEL_FORWARD: "Forward" LABEL_FORWARD_MULTIPLY: "Forward (multiply)" LABEL_HELP: "Help" LABEL_CHECK_ALL: "Select all messages" LABEL_ARCHIVE: "Archive" LABEL_DELETE: "Delete" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "Move" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" LABEL_IMPORTANT: "OznaÄŤiĹĄ vybranĂ© správy ako DĂ´leĹľitĂ©" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Print" LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" LABEL_SWITCH_TO_LIST: "Switch focus back to message list" LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" LABEL_SAVE_MESSAGE: "Save message" LABEL_SEND_MESSAGE: "Send message" LABEL_CLOSE_COMPOSE: "Close compose" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "VybraĹĄ sĂşkromnĂ˝ kľúč" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "Please specify FROM email address" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" NOTIFICATIONS: INVALID_TOKEN: "NeplatnĂ˝ token" AUTH_ERROR: "Overenie zlyhalo" ACCESS_ERROR: "Chyba prĂ­stupu" CONNECTION_ERROR: "Nepodarilo sa pripojiĹĄ k serveru" CAPTCHA_ERROR: "Nesprávne CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "DomĂ©na nie je povolená" ACCOUNT_NOT_ALLOWED: "Účet nie je povolenĂ˝" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "Current password incorrect" NEW_PASSWORD_SHORT: "Password is too short" NEW_PASSWORD_WEAK: "Password is too easy" NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" CONTACTS_SYNC_ERROR: "Contacts synchronization error" CANT_GET_MESSAGE_LIST: "Chyba pri vytváranĂ­ zoznamu správ." CANT_GET_MESSAGE: "Správu sa nepodarilo naÄŤĂ­taĹĄ" CANT_DELETE_MESSAGE: "Správu sa nepodarilo odstrániĹĄ" CANT_MOVE_MESSAGE: "Správu sa nepodarilo presunúť" CANT_SAVE_MESSAGE: "Správu sa nepodarilo uloĹľiĹĄ" CANT_SEND_MESSAGE: "Správu sa nepodarilo odoslaĹĄ" INVALID_RECIPIENTS: "NeplatnĂ˝ prĂ­jemcovia" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "PrieÄŤinok sa nepodarilo vytvoriĹĄ" CANT_RENAME_FOLDER: "PrieÄŤinok sa nepodarilo premenovaĹĄ" CANT_DELETE_FOLDER: "PrieÄŤinok sa nepodarilo odstrániĹĄ" CANT_DELETE_NON_EMPTY_FOLDER: "NemĂ´Ĺľem odstrániĹĄ neprázdny prieÄŤinok" CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" CANT_SAVE_SETTINGS: "Nastavenia sa nepodarilo uloĹľiĹĄ" CANT_SAVE_PLUGIN_SETTINGS: "Nastavenia sa nepodarilo uloĹľiĹĄ" DOMAIN_ALREADY_EXISTS: "Táto DomĂ©na uĹľ existuje" CANT_INSTALL_PACKAGE: "Inštalácia balĂ­ÄŤka zlyhala" CANT_DELETE_PACKAGE: "Odstránenie balĂ­ÄŤka zlyhalo" INVALID_PLUGIN_PACKAGE: "Invalid plugin package" UNSUPPORTED_PLUGIN_PACKAGE: "NepodporovanĂ˝ balĂ­ÄŤek rozšírenia" LICENSING_SERVER_IS_UNAVAILABLE: "Subscription server is unvailable" LICENSING_DOMAIN_EXPIRED: "Subscription for this domain has expired." LICENSING_DOMAIN_BANNED: "Subscription for this domain is banned." DEMO_SEND_MESSAGE_ERROR: "For security purposes, this demo account is not allowed to send messages to external e-mail addresses!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "účet uĹľ existuje" ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" MAIL_SERVER_ERROR: "Nastala chyba poÄŤas prĂ­stupu na poštovĂ˝ server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Neznáma chyba" STATIC: BACK_LINK: "ObnoviĹĄ" DOMAIN_LIST_DESC: "Zoznam domĂ©n ku ktorĂ˝m je povolenĂ© pristupovaĹĄ cez webmail." PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "Táto aplikácia vyĹľaduje JavaScript." NO_SCRIPT_DESC: | Váš internetovĂ˝ prehliadaÄŤ nepodporuje JavaScript. ProsĂ­m povoÄľte podporu JavaScriptu v nastaveniach vášho internetovĂ©ho prehliadaÄŤa a skĂşste to znova. NO_COOKIE_TITLE: "Táto aplikácia vyĹľaduje podporu Cookies." NO_COOKIE_DESC: | Váš internetovĂ˝ prehliadaÄŤ nepodporuje Cookies. ProsĂ­m povoÄľte podporu Cookies v nastaveniach vášho internetovĂ©ho prehliadaÄŤa a skĂşste to znova. BAD_BROWSER_TITLE: "Používate zastaralĂ˝ internetovĂ˝ prehliadaÄŤ." BAD_BROWSER_DESC: | Aby ste mohli využívaĹĄ všetky funkcie tejto aplikácie, pouĹľite niektorĂ˝ z nasledujĂşcich internetovĂ˝ch prehliadaÄŤov: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml000066400000000000000000000742771361462701300262310ustar00rootroot00000000000000sl_SI: LOGIN: LABEL_EMAIL: "E-pošta" LABEL_LOGIN: "Prijava" LABEL_PASSWORD: "Geslo" LABEL_SIGN_ME: "Zapomni si prijavo" LABEL_VERIFICATION_CODE: "Potrditvena koda" LABEL_DONT_ASK_VERIFICATION_CODE: "Ponoven vnos kode ÄŤez 2 tedna" BUTTON_SIGN_IN: "Prijavi se" TITLE_SIGN_IN_GOOGLE: "Za prijavo uporabi Google" TITLE_SIGN_IN_FACEBOOK: "Za prijavo uporabi Facebook" TITLE_SIGN_IN_TWITTER: "Za prijavo uporabi Twitter" LABEL_FORGOT_PASSWORD: "Pozabljeno geslo" LABEL_REGISTRATION: "Registracija" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Dodaj raÄŤun" BUTTON_SETTINGS: "Nastavitve" BUTTON_HELP: "PomoÄŤ" BUTTON_LOGOUT: "Odjavi" MOBILE: BUTTON_MOBILE_VERSION: "Mobilna razliÄŤica" BUTTON_DESKTOP_VERSION: "Namizna razliÄŤica" SEARCH: MAIN_INPUT_PLACEHOLDER: "Iskanje" TITLE_ADV: "Napredno iskanje" LABEL_ADV_FROM: "Od" LABEL_ADV_TO: "Za" LABEL_ADV_SUBJECT: "Zadeva" LABEL_ADV_TEXT: "Besedilo" LABEL_ADV_HAS_ATTACHMENT: "Ima prilogo" LABEL_ADV_HAS_ATTACHMENTS: "Ima prilogi/-e" LABEL_ADV_FLAGGED: "Z zvezdico" LABEL_ADV_UNSEEN: "Neprebrano" LABEL_ADV_DATE: "Datum" LABEL_ADV_DATE_ALL: "Vsa" LABEL_ADV_DATE_3_DAYS: "Do 3 dni nazaj" LABEL_ADV_DATE_7_DAYS: "Do 1 tedna nazaj" LABEL_ADV_DATE_MONTH: "Do 1 meseca nazaj" LABEL_ADV_DATE_3_MONTHS: "Do 3 mesecev nazaj" LABEL_ADV_DATE_6_MONTHS: "Do 6 mesecev nazaj" LABEL_ADV_DATE_YEAR: "Do 1 leta nazaj" BUTTON_ADV_SEARCH: "Išči" PREVIEW_POPUP: FULLSCREEN: "Preklopi celozaslonski pogled" ZOOM: "PribliĹľaj/oddalji" CLOSE: "Zapri (Esc)" LOADING: "Nalaganje..." GALLERY_PREV: "Nazaj (puščica levo)" GALLERY_NEXT: "Naprej (puščica desno)" GALLERY_COUNTER: "%curr% od %total%" IMAGE_ERROR: "Slike ni bilo mogoÄŤe naloĹľiti." AJAX_ERROR: "Vsebine ni bilo mogoÄŤe naloĹľiti." FOLDER_LIST: BUTTON_COMPOSE: "Sestavi" BUTTON_CONTACTS: "Stiki" BUTTON_NEW_MESSAGE: "Novo sporoÄŤilo" INBOX_NAME: "Prejeto" SENT_NAME: "Poslano" DRAFTS_NAME: "Osnutki" SPAM_NAME: "Vsiljena pošta" TRASH_NAME: "Smeti" ARCHIVE_NAME: "Arhiv" QUOTA: TITLE: "Poraba prostora" MESSAGE_LIST: BUTTON_RELOAD: "Ponovno naloĹľi seznam sporoÄŤil" BUTTON_MOVE_TO: "Premakni v" BUTTON_DELETE: "Izbriši" BUTTON_ARCHIVE: "Arhiviraj" BUTTON_SPAM: "Vsiljena pošta" BUTTON_NOT_SPAM: "Ni vsiljena pošta" BUTTON_EMPTY_FOLDER: "Izprazni mapo" BUTTON_MULTY_FORWARD: "Posreduj kot prilogo/-e" BUTTON_DELETE_WITHOUT_MOVE: "Trajno izbriši" BUTTON_MORE: "VeÄŤ" MENU_SET_SEEN: "OznaÄŤi kot prebrano" MENU_SET_ALL_SEEN: "OznaÄŤi vsa kot prebrano" MENU_UNSET_SEEN: "OznaÄŤi kot neprebrano" MENU_SET_FLAG: "Dodaj zvezdico" MENU_UNSET_FLAG: "Odstrani zvezdico" MENU_SELECT_ALL: "Vsa" MENU_SELECT_NONE: "Nobeno" MENU_SELECT_INVERT: "Obrni izbiro" MENU_SELECT_UNSEEN: "Neprebrana" MENU_SELECT_SEEN: "Prebrana" MENU_SELECT_FLAGGED: "Z zvezdico" MENU_SELECT_UNFLAGGED: "Brez zvezdice" EMPTY_LIST: "Prazen seznam." EMPTY_SEARCH_LIST: "Brez ujemanj." SEARCH_RESULT_FOR: "Ujemanja za \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "nazaj na seznam sporoÄŤil" LIST_LOADING: "Nalaganje" EMPTY_SUBJECT_TEXT: "(Brez zadeve)" PUT_MESSAGE_HERE: "Spustite sporoÄŤilo tu za ogled na seznamu" TODAY_AT: "danes ob %TIME%" YESTERDAY_AT: "vÄŤeraj ob %TIME%" SEARCH_PLACEHOLDER: "Iskanje" NEW_MESSAGE_NOTIFICATION: "Imate %COUNT% novih sporoÄŤil!" QUOTA_SIZE: "Uporabljenih %SIZE% (%PROC%%) od %LIMIT%" MESSAGE: BUTTON_EDIT: "Uredi" BUTTON_BACK: "Nazaj" BUTTON_CLOSE: "Zapri" BUTTON_DELETE: "Izbriši" BUTTON_UNSUBSCRIBE: "Odjava s tega seznama" BUTTON_ARCHIVE: "Arhiviraj" BUTTON_SPAM: "Vsiljena pošta" BUTTON_NOT_SPAM: "Ni vsiljena pošta" BUTTON_MOVE_TO: "Premakni v" BUTTON_MORE: "VeÄŤ" BUTTON_REPLY: "Odgovori" BUTTON_REPLY_ALL: "Odgovori vsem" BUTTON_FORWARD: "Posreduj" BUTTON_FORWARD_AS_ATTACHMENT: "Posreduj kot prilogo" BUTTON_EDIT_AS_NEW: "Uredi kot novo" BUTTON_SHOW_IMAGES: "PrikaĹľi zunanje slike" BUTTON_NOTIFY_READ_RECEIPT: "Pošiljatelj Ĺľeli biti obveščen, ko bo pismo prebrano." BUTTON_IN_NEW_WINDOW: "Ogled v novem oknu" BUTTON_THREAD_LIST: "Seznam niti" BUTTON_THREAD_PREV: "Prejšnja" BUTTON_THREAD_NEXT: "Naslednja" BUTTON_THREAD_MORE: "VeÄŤ sporoÄŤil" MENU_HEADERS: "PokaĹľi glavo sporoÄŤila" MENU_VIEW_ORIGINAL: "PokaĹľi izvorno" MENU_DOWNLOAD_ORIGINAL: "Prenesi kot .eml datoteko" MENU_FILTER_SIMILAR: "Filtriraj sporoÄŤila, kot je to" MENU_PRINT: "Natisni" EMPTY_SUBJECT_TEXT: "(Brez zadeve)" LABEL_SUBJECT: "Zadeva" LABEL_DATE: "Datum" LABEL_FROM: "Od" LABEL_FROM_SHORT: "od" LABEL_TO: "Za" LABEL_TO_SHORT: "za" LABEL_CC: "Kp" LABEL_BCC: "Skp" LABEL_REPLY_TO: "Odgovor na" PRINT_LABEL_FROM: "Od" PRINT_LABEL_TO: "Za" PRINT_LABEL_CC: "Kp" PRINT_LABEL_BCC: "Skp" PRINT_LABEL_REPLY_TO: "Odgovor na" PRINT_LABEL_DATE: "Datum" PRINT_LABEL_SUBJECT: "Zadeva" PRINT_LABEL_ATTACHMENTS: "Priloge" MESSAGE_LOADING: "Nalaganje" MESSAGE_VIEW_DESC: "Izberite sporoÄŤilo s seznama za ogled." MESSAGE_VIEW_MOVE_DESC: "Za izbor cilja kliknite na ime mape na levi strani." PGP_PASSWORD_INPUT_PLACEHOLDER: "Geslo" PGP_SIGNED_MESSAGE_DESC: "SporoÄŤilo, podpisano z OpenPGP (kliknite za overovitev)" PGP_ENCRYPTED_MESSAGE_DESC: "SporoÄŤilo, šifrirano z OpenPGP (kliknite za dešifriranje)" LINK_DOWNLOAD_AS_ZIP: "Prenesi kot .zip datoteko" LINK_SAVE_TO_OWNCLOUD: "Shrani na ownCloud" LINK_SAVE_TO_CLOUD: "Shrani v oblak" LINK_SAVE_TO_DROPBOX: "Shrani na Dropbox" READ_RECEIPT: SUBJECT: "Povratno poroÄŤilo (prikazano) - %SUBJECT%" BODY: | To je povratno poroÄŤilo za sporoÄŤilo, ki je bilo poslano na %READ-RECEIPT%. Opomba: "To povratno poroÄŤilo pomeni le, da je bilo sporoÄŤilo prikazano na raÄŤunalniku prejemnika." Ni jamstva za prejemnikovo razumevanje vsebine sporoÄŤila. SUGGESTIONS: SEARCHING_DESC: "Iskanje..." CONTACTS: LEGEND_CONTACTS: "Stiki" SEARCH_INPUT_PLACEHOLDER: "Iskanje" BUTTON_ADD_CONTACT: "Dodaj stik" BUTTON_CREATE_CONTACT: "Ustvari" BUTTON_UPDATE_CONTACT: "Posodobi" BUTTON_IMPORT: "Uvozi (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Izvozi (vcf, vCard)" BUTTON_EXPORT_CSV: "Izvozi (csv)" ERROR_IMPORT_FILE: "Napaka uvoza (neveljaven format datoteke)" LIST_LOADING: "Nalaganje" EMPTY_LIST: "Ni stikov" EMPTY_SEARCH: "Ni ujemajoÄŤih stikov" CLEAR_SEARCH: "PoÄŤisti iskalne kriterije" CONTACT_VIEW_DESC: "Izberite stik s seznama za ogled." LABEL_DISPLAY_NAME: "Prikazno ime" LABEL_EMAIL: "E-pošta" LABEL_PHONE: "Telefon" LABEL_WEB: "Splet" LABEL_BIRTHDAY: "Rojstni dan" LINK_ADD_EMAIL: "Dodaj e-poštni naslov" LINK_ADD_PHONE: "Dodaj telefon" LINK_BIRTHDAY: "Rojstni dan" PLACEHOLDER_ENTER_DISPLAY_NAME: "Vnos prikaznega imena" PLACEHOLDER_ENTER_LAST_NAME: "Vnos priimka" PLACEHOLDER_ENTER_FIRST_NAME: "Vnos imena" PLACEHOLDER_ENTER_NICK_NAME: "Vnos vzdevka" LABEL_READ_ONLY: "Samo za branje" LABEL_SHARE: "Deljenje" ADD_MENU_LABEL: "Dodajanje" ADD_MENU_NICKNAME: "Vzdevek" ADD_MENU_NOTES: "Zapiski" ADD_MENU_EMAIL: "E-pošta" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Naslov" ADD_MENU_BIRTHDAY: "Rojstni dan" ADD_MENU_TAGS: "ZnaÄŤke" BUTTON_SHARE_NONE: "Nobenega" BUTTON_SHARE_ALL: "Vse" BUTTON_SYNC: "Sinhronizacija (CardDAV)" COMPOSE: TITLE_FROM: "Od" TITLE_TO: "Za" TITLE_CC: "Kp" TITLE_BCC: "Skp" TITLE_REPLY_TO: "Odgovor na" TITLE_SUBJECT: "Zadeva" LINK_SHOW_INPUTS: "prikaz vseh polj" BUTTON_SEND: "Pošlji" BUTTON_SAVE: "Shrani" BUTTON_DELETE: "Izbriši" BUTTON_CANCEL: "PrekliÄŤi" BUTTON_MINIMIZE: "Minimiraj" SAVED_TIME: "Shranjeno ob %TIME%" SAVED_ERROR_ON_SEND: "SporoÄŤilo je bilo poslano, a ne shranjeno med poslana sporoÄŤila" DISCARD_UNSAVED_DATA: "ZavrĹľem neshranjene podatke?" ATTACH_FILES: "PriloĹľi datoteke" ATTACH_DROP_FILES_DESC: "Spustite datoteke tu" ATTACH_ITEM_CANCEL: "PrekliÄŤi" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% je napisal/-a" FORWARD_MESSAGE_TOP_TITLE: "-------- Posredovano sporoÄŤilo -------" FORWARD_MESSAGE_TOP_FROM: "Od" FORWARD_MESSAGE_TOP_TO: "Za" FORWARD_MESSAGE_TOP_CC: "Kp" FORWARD_MESSAGE_TOP_SENT: "Poslano" FORWARD_MESSAGE_TOP_SUBJECT: "Zadeva" EMPTY_TO_ERROR_DESC: "Navedite vsaj enega/-o prejemnika/-co" NO_ATTACHMENTS_HERE_DESC: "Ni prilog." ATTACHMENTS_ERROR_DESC: "Pozor! Priloge niso bile vse naloĹľene." ATTACHMENTS_UPLOAD_ERROR_DESC: "Priloge še niso bile naloĹľene v celoti." BUTTON_REQUEST_READ_RECEIPT: "Zahtevaj potrdilo o branju" BUTTON_MARK_AS_IMPORTANT: "OznaÄŤi kot pomembno" BUTTON_OPEN_PGP: "OpenPGP (Navadno besedilo)" BUTTON_REQUEST_DSN: "Zahtevaj potrdilo o dostavi" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Zapri" POPUPS_ASK: BUTTON_YES: "Da" BUTTON_NO: "Ne" DESC_WANT_CLOSE_THIS_WINDOW: "Ĺ˝elite zapreti to okno?" DESC_WANT_DELETE_MESSAGES: "Ĺ˝elite izbrisati sporoÄŤilo/-a?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Izberite jezik" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Dodam raÄŤun?" BUTTON_ADD_ACCOUNT: "Dodaj" TITLE_UPDATE_ACCOUNT: "Posodobim raÄŤun?" BUTTON_UPDATE_ACCOUNT: "Posodobi" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Dodam identiteto?" TITLE_UPDATE_IDENTITY: "Posodobim identiteto?" BUTTON_ADD_IDENTITY: "Dodaj" BUTTON_UPDATE_IDENTITY: "Posodobi" LABEL_EMAIL: "E-pošta" LABEL_NAME: "Ime" LABEL_REPLY_TO: "Odgovor na" LABEL_SIGNATURE: "Podpis" LABEL_CC: "Kp" LABEL_BCC: "Skp" LABEL_SIGNATURE_INSERT_BEFORE: "Vstavi ta podpis pred citirano besedilo v odgovorih" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Ustvarim mapo?" LABEL_NAME: "Ime mape" LABEL_PARENT: "Nadrejena mapa" BUTTON_CREATE: "Ustvari" BUTTON_CANCEL: "PrekliÄŤi" BUTTON_CLOSE: "Zapri" TITLE_CREATING_PROCESS: "Ustvarjam mapo" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "PoÄŤistim vsa sporoÄŤila iz mape?" BUTTON_CLEAR: "PoÄŤisti" BUTTON_CANCEL: "PrekliÄŤi" BUTTON_CLOSE: "Zapri" DANGER_DESC_WARNING: "Pozor!" DANGER_DESC_HTML_1: "To dejanje bo izbrisalo vsa sporoÄŤila iz mape %FOLDER% v celoti." DANGER_DESC_HTML_2: "Tega postopka ne bo mogoÄŤe preklicati ali zaustaviti." TITLE_CLEARING_PROCESS: "ÄŚistim mapo." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Uvoz OpenPGP kljuÄŤa" BUTTON_IMPORT_OPEN_PGP_KEY: "Uvozi" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Ogled OpenPGP kljuÄŤa" BUTTON_SELECT: "Izberi" BUTTON_CLOSE: "Zapri" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generiraj OpenPGP kljuÄŤe" LABEL_EMAIL: "E-pošta" LABEL_NAME: "Ime" LABEL_PASSWORD: "Geslo" LABEL_KEY_BIT_LENGTH: "DolĹľina kljuÄŤa" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generiraj" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP podpis/šifriranje" LABEL_SIGN: "Podpis" LABEL_ENCRYPT: "Ĺ ifriranje" LABEL_PASSWORD: "Geslo" BUTTON_SIGN: "Podpiši" BUTTON_ENCRYPT: "Ĺ ifriraj" BUTTON_SIGN_AND_ENCRYPT: "Podpiši in šifriraj" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP dešifriranje" LABEL_KEY: "Zasebni kljuÄŤ" LABEL_PASSWORD: "Geslo" BUTTON_DECRYPT: "Dešifriraj" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-stopenjski overitveni preizkus" LABEL_CODE: "Koda" BUTTON_TEST: "Preizkusi" POPUPS_FILTER: TITLE_CREATE_FILTER: "Ustvarim filter?" TITLE_EDIT_FILTER: "Posodobim filter?" FILTER_NAME: "Ime" LEGEND_CONDITIONS: "Pogoji" LEGEND_ACTIONS: "Dejanja" BUTTON_DONE: "KonÄŤaj" BUTTON_ADD_CONDITION: "Dodaj pogoj" SELECT_ACTION_NONE: "Nobeno" SELECT_ACTION_MOVE_TO: "Premakni v" SELECT_ACTION_FORWARD_TO: "Posreduj na" SELECT_ACTION_REJECT: "Zavrni" SELECT_ACTION_VACATION_MESSAGE: "SporoÄŤilo odsotnosti" SELECT_ACTION_DISCARD: "Zavrzi" SELECT_FIELD_FROM: "Od" SELECT_FIELD_RECIPIENTS: "Prejemniki (Za ali Kp)" SELECT_FIELD_SUBJECT: "Zadeva" SELECT_FIELD_HEADER: "Glava" SELECT_FIELD_SIZE: "Velikost" SELECT_TYPE_CONTAINS: "Vsebuje" SELECT_TYPE_NOT_CONTAINS: "Ne vsebuje" SELECT_TYPE_MATCHES: "Se ujema (* in ? sta podprta)" SELECT_TYPE_NOT_MATCHES: "Se ne ujema (* in ? sta podprta)" SELECT_TYPE_REGEXP: "Regularni izraz" SELECT_TYPE_NOT_REGEXP: "Inverz regularnega izraza" SELECT_TYPE_EQUAL_TO: "Enako kot" SELECT_TYPE_NOT_EQUAL_TO: "RazliÄŤno od" SELECT_TYPE_OVER: "Nad" SELECT_TYPE_UNDER: "Pod" SELECT_MATCH_ANY: "Ustreza katerem koli od sledeÄŤih pravil" SELECT_MATCH_ALL: "Ustreza vsem od sledeÄŤih pravil" MARK_AS_READ_LABEL: "OznaÄŤi kot prebrano" REPLY_INTERVAL_LABEL: "Interval odgovorov (dnevi)" KEEP_LABEL: "ObdrĹľi" STOP_LABEL: "Ne prenehaj z obdelovanjem pravil" EMAIL_LABEL: "E-pošta" VACATION_SUBJECT_LABEL: "Zadeva (izbirno)" VACATION_MESSAGE_LABEL: "SporoÄŤilo" VACATION_RECIPIENTS_LABEL: "Prejemniki (loÄŤeni z vejico)" REJECT_MESSAGE_LABEL: "Zavrni sporoÄŤilo" ALL_INCOMING_MESSAGES_DESC: "Vsa dohodna sporoÄŤila" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Izbor sistemskih map" SELECT_CHOOSE_ONE: "Izberite eno" SELECT_UNUSE_NAME: "Ne uporabi" LABEL_SENT: "Poslano" LABEL_DRAFTS: "Osnutki" LABEL_SPAM: "Vsiljena pošta" LABEL_TRASH: "Smeti" LABEL_ARCHIVE: "Arhiv" BUTTON_CANCEL: "PrekliÄŤi" BUTTON_CLOSE: "Zapri" NOTIFICATION_SENT: | Niste izbrali sistemske mape "Poslano" za shranjevanje poslanih sporoÄŤil. ÄŚe ne Ĺľelite shranjevati poslanih sporoÄŤil, izberite moĹľnost "Ne uporabi". NOTIFICATION_DRAFTS: "Niste izbrali sistemske mape \"Osnutki\" za zaÄŤasno shranjevanje sporoÄŤil med sestavljanjem." NOTIFICATION_SPAM: | Niste izbrali sistemske mape "Vsiljena pošta" za shranjevanje vsiljene pošte. ÄŚe Ĺľelite vsiljeno pošto sproti brisati, izberite moĹľnost "Ne uporabi". NOTIFICATION_TRASH: | Niste izbrali sistemske mape "Smetnjak" za izbrisana sporoÄŤila pred trajnim brisanjem. ÄŚe jih Ĺľelite vedno trajno izbrisati, izberite moĹľnost "Ne uporabi". NOTIFICATION_ARCHIVE: "Niste izbrali sistemske mape \"Arhiv\" za trajno arhiviranje sporoÄŤil." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-stopenjsko overjanje (TOTP)" LABEL_ENABLE_TWO_FACTOR: "OmogoÄŤi 2-stopenjsko overjanje" LABEL_TWO_FACTOR_USER: "Uporabnik" LABEL_TWO_FACTOR_STATUS: "Stanje" LABEL_TWO_FACTOR_SECRET: "Skrivnost" LABEL_TWO_FACTOR_BACKUP_CODES: "PomoĹľne kode" BUTTON_CREATE: "Ustvari skrivnost" BUTTON_ACTIVATE: "Aktiviraj" BUTTON_CLEAR: "PoÄŤisti" BUTTON_LOGOUT: "Odjavi" BUTTON_DONE: "KonÄŤaj" BUTTON_TEST: "Preizkusi" LINK_TEST: "preizkus" BUTTON_SHOW_SECRET: "PokaĹľi skrivnost" BUTTON_HIDE_SECRET: "Skrij skrivnost" TWO_FACTOR_REQUIRE_DESC: "RaÄŤun zahteva 2-stopenjsko overjanje." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nastavljena" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ni nastavljena" TWO_FACTOR_SECRET_DESC: > Uvozite te podatke v Google Authenticator (ali drugo TOTP aplikacijo) z uporabo spodnje QR kode ali roÄŤnim vnosom kode. TWO_FACTOR_BACKUP_CODES_DESC: > ÄŚe ne morete prejeti kode preko Google Authenticator (ali druge TOTP aplikacije), lahko uporabite pomoĹľne kode za vpis. Vsaka pomoĹľna koda je za enkratno uporabo. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Ne morete spremenite te nastavitve brez preizkusa." TITLES: LOADING: "Nalaganje" LOGIN: "Prijava" MAILBOX: "Nabiralnik" SETTINGS: "Nastavitve" COMPOSE: "Sestavi" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Prevelika datoteka" ERROR_FILE_PARTIALLY_UPLOADED: "Zaradi napake je bila datoteka delno naloĹľena" ERROR_NO_FILE_UPLOADED: "Nobena datoteka ni bila naloĹľena" ERROR_MISSING_TEMP_FOLDER: "ManjkajoÄŤa zaÄŤasna mapa" ERROR_ON_SAVING_FILE: "Neznana napaka pri nalaganju datoteke" ERROR_FILE_TYPE: "Neveljaven tip datoteke" ERROR_UNKNOWN: "Neznana napaka pri nalaganju datoteke" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Navadno besedilo" TEXT_SWITCHER_RICH_FORMATTING: "Obogateno besedilo" TEXT_SWITCHER_CONFIRM: "Oblikovanje ter postavitev besedila in slik bosta izgubljena. Ĺ˝elite nadaljevati?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Osebno" LABEL_GENERAL_NAME: "Splošno" LABEL_CONTACTS_NAME: "Stiki" LABEL_FOLDERS_NAME: "Mape" LABEL_ACCOUNTS_NAME: "RaÄŤuni" LABEL_IDENTITY_NAME: "Identiteta" LABEL_IDENTITIES_NAME: "Identitete" LABEL_FILTERS_NAME: "Filtri" LABEL_TEMPLATES_NAME: "Predloge" LABEL_SECURITY_NAME: "Varnost" LABEL_SOCIAL_NAME: "DruĹľabno" LABEL_THEMES_NAME: "Teme" LABEL_CHANGE_PASSWORD_NAME: "Geslo" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Nazaj" SETTINGS_FILTERS: LEGEND_FILTERS: "Filtri" BUTTON_SAVE: "Shrani" BUTTON_ADD_FILTER: "Dodaj filter" BUTTON_DELETE: "Izbriši" BUTTON_RAW_SCRIPT: "Uporabi lastno skriptno datoteko" SUBNAME_NONE: "Nobeno" SUBNAME_MOVE_TO: "Premakni v \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Posreduj na \"%EMAIL%\"" SUBNAME_REJECT: "Zavrni" SUBNAME_VACATION_MESSAGE: "SporoÄŤilo odsotnosti" SUBNAME_DISCARD: "Zavrzi" CAPABILITY_LABEL: "ZmoĹľnosti" LOADING_PROCESS: "Posodabljanje seznama filtrov" DELETING_ASK: "Ste prepriÄŤani?" CHACHES_NEED_TO_BE_SAVED_DESC: "Spremembe morajo biti shranjene na streĹľnik." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identiteta" LABEL_DISPLAY_NAME: "Ime" LABEL_REPLY_TO: "Odgovor na" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis vsem odhodnim sporoÄŤilom" SETTINGS_SECURITY: LEGEND_SECURITY: "Varnost" LABEL_CONFIGURE_TWO_FACTOR: "Nastavljanje 2-stopenjskega overjanja" LABEL_AUTOLOGOUT: "Samodejna odjava" AUTOLOGIN_NEVER_OPTION_NAME: "Nikoli" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% ur" SETTINGS_GENERAL: LEGEND_GENERAL: "Splošno" LABEL_LANGUAGE: "Jezik" LABEL_IDENTITY: "Identiteta" LABEL_LAYOUT: "Postavitev" LABEL_LAYOUT_NO_SPLIT: "Brez razdelitve" LABEL_LAYOUT_VERTICAL_SPLIT: "NavpiÄŤno razdeljeno" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Vodoravno razdeljeno" LABEL_EDITOR: "Privzeta vrsta besedila" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Navadno besedilo" LABEL_EDITOR_HTML_FORCED: "HTML (obvezno)" LABEL_EDITOR_PLAIN_FORCED: "Navadno besedilo (obvezno)" LABEL_ANIMATION: "Animacije vmesnika" LABEL_ANIMATION_FULL: "Vse" LABEL_ANIMATION_NORMAL: "Normalno" LABEL_ANIMATION_NONE: "Nobena" LABEL_VIEW_OPTIONS: "MoĹľnosti ogleda" LABEL_USE_PREVIEW_PANE: "Uporabi polje za predogled" LABEL_USE_CHECKBOXES_IN_LIST: "Na seznamu pokaĹľi kvadratke za izbor" LABEL_USE_THREADS: "Uporabi niti" LABEL_REPLY_SAME_FOLDER: "Shrani odgovore v mapo sporoÄŤila, na katerega se odgovarja" LABEL_SHOW_IMAGES: "Vedno prikaĹľi zunanje slike v telesu sporoÄŤila" LABEL_SHOW_ANIMATION: "Prikazna animacija" LABEL_MESSAGE_PER_PAGE: "SporoÄŤil na strani" LABEL_NOTIFICATIONS: "Obvestila" LABEL_SOUND_NOTIFICATION: "ZvoÄŤno obvestilo" LABEL_CHROME_NOTIFICATION_DESC: "PrikaĹľi obvestila ob novih sporoÄŤilih" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zavrnil brskalnik)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Stiki" LABEL_CONTACTS_AUTOSAVE: "Samodejno dodaj prejemnike v imenik" LEGEND_CONTACTS_SYNC: "Oddaljena sinhronizacija (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "OmogoÄŤi oddaljeno sinhronizacijo" LABEL_CONTACTS_SYNC_SERVER: "StreĹľnik" LABEL_CONTACTS_SYNC_AB_URL: "URL imenika" LABEL_CONTACTS_SYNC_USER: "Uporabnik" LABEL_CONTACTS_SYNC_PASSWORD: "Geslo" SETTINGS_THEMES: LEGEND_THEMES: "Teme" LEGEND_THEMES_CUSTOM: "Prilagojena konfiguracija teme" LABEL_CUSTOM_TYPE: "Tip" LABEL_CUSTOM_TYPE_LIGHT: "Svetla" LABEL_CUSTOM_TYPE_DARK: "Temna" LABEL_CUSTOM_BACKGROUND_IMAGE: "Ozadje" BUTTON_UPLOAD_BACKGROUND_IMAGE: "NaloĹľi sliko ozadja (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Prevelika datoteka" ERROR_FILE_TYPE_ERROR: "Neveljaven tip datoteke (samo JPG in PNG)" ERROR_UNKNOWN: "Neznana napaka pri nalaganju datoteke" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "PoveĹľi Google" BUTTON_GOOGLE_DISCONNECT: "Odklopi Google" MAIN_GOOGLE_DESC: "Ko omogoÄŤite prijavo z Google raÄŤunom, se lahko prijavite v ta raÄŤun z Google gumbom na prijavnem zaslonu." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "PoveĹľi Facebook" BUTTON_FACEBOOK_DISCONNECT: "Odklopi Facebook" MAIN_FACEBOOK_DESC: "Ko omogoÄŤite prijavo s Facebook raÄŤunom, se lahko prijavite v ta raÄŤun s Facebook gumbom na prijavnem zaslonu." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "PoveĹľi Twitter" BUTTON_TWITTER_DISCONNECT: "Odklopi Twitter" MAIN_TWITTER_DESC: "Ko omogoÄŤite prijavo s Twitter raÄŤunom, se lahko prijavite v ta raÄŤun s Twitter gumbom na prijavnem zaslonu." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Seznam map" BUTTON_CREATE: "Ustvari mapo" BUTTON_SYSTEM: "Sistemske mape" BUTTON_DELETE: "Izbriši" BUTTON_SUBSCRIBE: "Spremljaj" BUTTON_UNSUBSCRIBE: "Ne spremljaj" LOADING_PROCESS: "Posodabljanje seznama map" CREATING_PROCESS: "Ustvarjanje mape" DELETING_PROCESS: "Brisanje mape" RENAMING_PROCESS: "Preimenovanje mape" DELETING_ASK: "Ste prepriÄŤani?" TO_MANY_FOLDERS_DESC_1: "Imate preveÄŤ map!" TO_MANY_FOLDERS_DESC_2: "Prikazanih je le del, da se izognemo tehniÄŤnim teĹľavam." HELP_DELETE_FOLDER: "Izbriši mapo" HELP_SHOW_HIDE_FOLDER: "PrikaĹľi/skrij mapo" HELP_CHECK_FOR_NEW_MESSAGES: "Preverjaj/ne preverjaj za nova sporoÄŤila" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "RaÄŤuni" LEGEND_IDENTITIES: "Identitete" LEGEND_ACCOUNTS_AND_IDENTITIES: "RaÄŤuni in identitete" BUTTON_ADD_ACCOUNT: "Dodaj raÄŤun" BUTTON_ADD_IDENTITY: "Dodaj identiteto" BUTTON_DELETE: "Izbriši" LOADING_PROCESS: "Posodabljanje..." DELETING_ASK: "Ste prepriÄŤani?" DEFAULT_IDENTITY_LABEL: "privzeto" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identiteta" LEGEND_IDENTITIES: "Dodatne identitete" LABEL_DEFAULT: "Privzeto" LABEL_DISPLAY_NAME: "Ime" LABEL_REPLY_TO: "Odgovor na" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis vsem odhodnim sporoÄŤilom" BUTTON_ADD_IDENTITY: "Dodaj identiteto" BUTTON_DELETE: "Izbriši" LOADING_PROCESS: "Posodabljanje seznama identitet" DELETING_ASK: "Ste prepriÄŤani?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Sprememba gesla" LABEL_CURRENT_PASSWORD: "Trenutno geslo" LABEL_NEW_PASSWORD: "Novo geslo" LABEL_REPEAT_PASSWORD: "Potrditev novega gesla" BUTTON_UPDATE_PASSWORD: "Nastavi novo geslo" ERROR_PASSWORD_MISMATCH: "Gesli se ne ujemata, poskusite znova" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Uvozi OpenPGP kljuÄŤ" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generiraj OpenPGP kljuÄŤe" TITLE_PRIVATE: "Zasebni" TITLE_PUBLIC: "Javni" DELETING_ASK: "Ste prepriÄŤani?" GENERATE_ONLY_HTTPS: "Samo HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Samodejno shrani osnutek" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Tipkovne bliĹľnjice" TAB_MAILBOX: "Nabiralnik" TAB_MESSAGE_LIST: "Seznam sporoÄŤil" TAB_MESSAGE_VIEW: "Pogled sporoÄŤil" TAB_COMPOSE: "Sestavi" LABEL_OPEN_USER_DROPDOWN: "Prikaz seznama uporabnikov" LABEL_REPLY: "Odgovori" LABEL_REPLY_ALL: "Odgovori vsem" LABEL_FORWARD: "Posreduj" LABEL_FORWARD_MULTIPLY: "Posreduj kot prilogo/-e" LABEL_HELP: "PomoÄŤ" LABEL_CHECK_ALL: "Izberi vsa sporoÄŤila" LABEL_ARCHIVE: "Arhiv" LABEL_DELETE: "Izbriši" LABEL_OPEN_THREAD: "Odpri izbrano nit" LABEL_MOVE: "Premakni" LABEL_READ: "OznaÄŤi kot prebrano" LABEL_UNREAD: "OznaÄŤi kot neprebrano" LABEL_IMPORTANT: "Pomembno, dodaj zvezdico" LABEL_SEARCH: "Iskanje" LABEL_CANCEL_SEARCH: "Preklic iskanja" LABEL_FULLSCREEN_ENTER: "Celozaslonsko (polje za predogled)" LABEL_VIEW_MESSAGE_ENTER: "Ogled sporoÄŤila (brez polja za predogled)" LABEL_SWITCH_TO_MESSAGE: "OsredotoÄŤi na izbrano sporoÄŤilo" LABEL_SWITCH_TO_FOLDER_LIST: "OsredotoÄŤi na seznam map" LABEL_FULLSCREEN_TOGGLE: "Preklopi celozaslonski naÄŤin" LABEL_BLOCKQUOTES_TOGGLE: "Preklopi bloÄŤne citate v sporoÄŤilu" LABEL_THREAD_NEXT: "Naslednje sporoÄŤilo v niti" LABEL_THREAD_PREV: "Prejšnje sporoÄŤilo v niti" LABEL_PRINT: "Natisni" LABEL_EXIT_FULLSCREEN: "Izhod iz celozaslonskega naÄŤina" LABEL_CLOSE_MESSAGE: "Zapri sporoÄŤilo (brez polja za predogled)" LABEL_SWITCH_TO_LIST: "OsredotoÄŤi na seznam sporoÄŤil" LABEL_OPEN_COMPOSE_POPUP: "Odpri okno za sestavljanje" LABEL_MINIMIZE_COMPOSE_POPUP: "Skrij okno za sestavljanje" LABEL_OPEN_IDENTITIES_DROPDOWN: "Odpri izbor identitet" LABEL_SAVE_MESSAGE: "Shrani sporoÄŤilo" LABEL_SEND_MESSAGE: "Pošlji sporoÄŤilo" LABEL_CLOSE_COMPOSE: "Zapri sestavljanje" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Ni najdenih javnih kljuÄŤev" NO_PUBLIC_KEYS_FOUND_FOR: "Ni najdenih javnih kljuÄŤev za naslov \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Ni najdenega zasebnega kljuÄŤa" NO_PRIVATE_KEY_FOUND_FOR: "Ni najdenega zasebnega kljuÄŤa za naslov \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Dodaj javni kljuÄŤ" SELECT_A_PRIVATE_KEY: "Izberite zasebni kljuÄŤ" UNVERIFIRED_SIGNATURE: "Neoverjen podpis" DECRYPTION_ERROR: "OpenPGP napaka dešifriranja" GOOD_SIGNATURE: "Dober podpis od %USER%" PGP_ERROR: "OpenPGP napaka: %ERROR%" SPECIFY_FROM_EMAIL: "DoloÄŤite naslov pošiljatelja/-ice" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Navedite vsaj enega/-o prejemnika/-co" NOTIFICATIONS: INVALID_TOKEN: "Neveljaven Ĺľeton" AUTH_ERROR: "Spodletelo overjanje" ACCESS_ERROR: "Napaka dostopa" CONNECTION_ERROR: "Ni mogoÄŤe vzpostaviti povezave s streĹľnikom" CAPTCHA_ERROR: "NapaÄŤen CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Ta druĹľabni ID še ni doloÄŤen nobenemu e-poštnemu raÄŤunu. Prijavite se z podatki za e-pošto in omogoÄŤite to v nastavitvah raÄŤuna. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Ta druĹľabni ID še ni doloÄŤen nobenemu e-poštnemu raÄŤunu. Prijavite se z podatki za e-pošto in omogoÄŤite to v nastavitvah raÄŤuna. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Ta druĹľabni ID še ni doloÄŤen nobenemu e-poštnemu raÄŤunu. Prijavite se z podatki za e-pošto in omogoÄŤite to v nastavitvah raÄŤuna. DOMAIN_NOT_ALLOWED: "Domena ni dovoljena" ACCOUNT_NOT_ALLOWED: "RaÄŤun ni dovoljen" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Obvezno 2-stopenjsko overjanje" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Napaka 2-stopenjskega overjanja" COULD_NOT_SAVE_NEW_PASSWORD: "Ni bilo mogoÄŤe shraniti novega gesla" CURRENT_PASSWORD_INCORRECT: "NapaÄŤno trenutno geslo" NEW_PASSWORD_SHORT: "Prekratko geslo" NEW_PASSWORD_WEAK: "PreveÄŤ enostavno geslo" NEW_PASSWORD_FORBIDDENT: "Geslo vsebuje nedovoljene znake" CONTACTS_SYNC_ERROR: "Napaka sinhronizacije stikov" CANT_GET_MESSAGE_LIST: "Ni mogoÄŤe pridobiti seznama sporoÄŤil" CANT_GET_MESSAGE: "Ni mogoÄŤe pridobiti sporoÄŤila" CANT_DELETE_MESSAGE: "Ni mogoÄŤe izbrisati sporoÄŤila" CANT_MOVE_MESSAGE: "Ni mogoÄŤe premakniti sporoÄŤila" CANT_SAVE_MESSAGE: "Ni mogoÄŤe shraniti sporoÄŤila" CANT_SEND_MESSAGE: "Ni mogoÄŤe poslati sporoÄŤila" INVALID_RECIPIENTS: "Neveljavni prejemniki" CANT_SAVE_FILTERS: "Ni mogoÄŤe shraniti filtrov" CANT_GET_FILTERS: "Ni mogoÄŤe pridobiti filtrov" FILTERS_ARE_NOT_CORRECT: "Filtri so nepravilni" CANT_CREATE_FOLDER: "Ni mogoÄŤe ustvariti mape" CANT_RENAME_FOLDER: "Ni mogoÄŤe preimenovati mape" CANT_DELETE_FOLDER: "Ni mogoÄŤe izbrisati mape" CANT_DELETE_NON_EMPTY_FOLDER: "Ni mogoÄŤe izbrisati neprazne mape" CANT_SUBSCRIBE_FOLDER: "Ni mogoÄŤe slediti mapi" CANT_UNSUBSCRIBE_FOLDER: "Ni mogoÄŤe prenehati slediti mapi" CANT_SAVE_SETTINGS: "Ni mogoÄŤe shraniti nastavitev" CANT_SAVE_PLUGIN_SETTINGS: "Ni mogoÄŤe shraniti nastavitev" DOMAIN_ALREADY_EXISTS: "Domena Ĺľe obstaja" CANT_INSTALL_PACKAGE: "Neuspešna namestitev paketa" CANT_DELETE_PACKAGE: "Neuspešno odstranjevanje paketa" INVALID_PLUGIN_PACKAGE: "Neveljaven paket vtiÄŤnika" UNSUPPORTED_PLUGIN_PACKAGE: "Nepodprt paket vtiÄŤnika" LICENSING_SERVER_IS_UNAVAILABLE: "NaroÄŤniški streĹľnik ni dosegljiv" LICENSING_DOMAIN_EXPIRED: "NaroÄŤnina na to domeno je potekla." LICENSING_DOMAIN_BANNED: "NaroÄŤnina na to domeno ni dovoljena" DEMO_SEND_MESSAGE_ERROR: "Iz varnostnih razlogov ta raÄŤun ne sme pošiljati pošte na zunanje e-naslove!" DEMO_ACCOUNT_ERROR: "Iz varnostnih razlogov ta raÄŤun ne sme izvršiti tega dejanja!" ACCOUNT_ALREADY_EXISTS: "RaÄŤun Ĺľe obstaja" ACCOUNT_DOES_NOT_EXIST: "RaÄŤun ne obstaja" MAIL_SERVER_ERROR: "Napaka pri dostopu do poštnega streĹľnika" INVALID_INPUT_ARGUMENT: "Neveljaven vhodni argument" UNKNOWN_ERROR: "Neznana napaka" STATIC: BACK_LINK: "Ponovno naloĹľi" DOMAIN_LIST_DESC: "Seznam domen, na katere je dovoljen dostop" PHP_EXSTENSIONS_ERROR_DESC: "Potrebne PHP razširitve niso omogoÄŤene v vaši PHP nastavitveni datoteki!" PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogoÄŤen JavaScript." NO_SCRIPT_DESC: | Brskalnik nima podpore za JavaScript. OmogoÄŤite JavaScript v brskalniku in poskusite znova. NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogoÄŤene piškotke." NO_COOKIE_DESC: | Brskalnik nima omogoÄŤenih piškotkov. OmogoÄŤite piškotke v brskalniku in poskusite znova. BAD_BROWSER_TITLE: "Brskalnik je zastarel." BAD_BROWSER_DESC: | Za uporabo vseh funkcij te aplikacije prenesite in namestite enega od teh brskalnikov: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml000066400000000000000000000740661361462701300262330ustar00rootroot00000000000000sv_SE: LOGIN: LABEL_EMAIL: "E-post" LABEL_LOGIN: "Användarnamn" LABEL_PASSWORD: "Lösenord" LABEL_SIGN_ME: "Kom ihĂĄg mig" LABEL_VERIFICATION_CODE: "Verifikationskod" LABEL_DONT_ASK_VERIFICATION_CODE: "FrĂĄga inte efter koden pĂĄ 2 veckor" BUTTON_SIGN_IN: "Logga in" TITLE_SIGN_IN_GOOGLE: "Logga in med Google" TITLE_SIGN_IN_FACEBOOK: "Logga in med Facebook" TITLE_SIGN_IN_TWITTER: "Logga in med Twitter" LABEL_FORGOT_PASSWORD: "Glömt lösenord" LABEL_REGISTRATION: "Registrera" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Lägg till konto" BUTTON_SETTINGS: "Inställningar" BUTTON_HELP: "Hjälp" BUTTON_LOGOUT: "Logga ut" MOBILE: BUTTON_MOBILE_VERSION: "Mobilversion" BUTTON_DESKTOP_VERSION: "Datorversion" SEARCH: MAIN_INPUT_PLACEHOLDER: "Sök" TITLE_ADV: "Avancerad sök" LABEL_ADV_FROM: "FrĂĄn" LABEL_ADV_TO: "Till" LABEL_ADV_SUBJECT: "Ă„mne" LABEL_ADV_TEXT: "Text" LABEL_ADV_HAS_ATTACHMENT: "Har bilaga" LABEL_ADV_HAS_ATTACHMENTS: "Har bilagor" LABEL_ADV_FLAGGED: "Flaggad" LABEL_ADV_UNSEEN: "Oläst" LABEL_ADV_DATE: "Datum" LABEL_ADV_DATE_ALL: "Alla" LABEL_ADV_DATE_3_DAYS: "Upp till 3 dagar gammalt" LABEL_ADV_DATE_7_DAYS: "Upp till 1 vecka gammalt" LABEL_ADV_DATE_MONTH: "Upp till 1 mĂĄnad gammalt" LABEL_ADV_DATE_3_MONTHS: "Upp till 3 mĂĄnader gammalt" LABEL_ADV_DATE_6_MONTHS: "Upp till 6 mĂĄnader gammalt" LABEL_ADV_DATE_YEAR: "Upp till 1 ĂĄr gammalt" BUTTON_ADV_SEARCH: "Sök" PREVIEW_POPUP: FULLSCREEN: "Växla fullskärmsläge" ZOOM: "Zooma in/ut" CLOSE: "Stäng (Esc)" LOADING: "Laddar..." GALLERY_PREV: "FöregĂĄende (Vänster pil knapp)" GALLERY_NEXT: "Nästa (Höger pil knapp)" GALLERY_COUNTER: "%curr% av %total%" IMAGE_ERROR: "Bilden kunde inte laddas." AJAX_ERROR: "InnehĂĄllet kunde inte laddas." FOLDER_LIST: BUTTON_COMPOSE: "Skriv nytt" BUTTON_CONTACTS: "Kontakter" BUTTON_NEW_MESSAGE: "Nytt meddelande" INBOX_NAME: "Inkorg" SENT_NAME: "Skickat" DRAFTS_NAME: "Utkast" SPAM_NAME: "Spam" TRASH_NAME: "Papperskorg" ARCHIVE_NAME: "Arkiv" QUOTA: TITLE: "Kvotanvändning" MESSAGE_LIST: BUTTON_RELOAD: "Ladda meddelandelista" BUTTON_MOVE_TO: "Flytta till" BUTTON_DELETE: "Ta bort" BUTTON_ARCHIVE: "Arkivera" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Inte spam" BUTTON_EMPTY_FOLDER: "Rensa mapp" BUTTON_MULTY_FORWARD: "Vidarebefordra som bilaga(or)" BUTTON_DELETE_WITHOUT_MOVE: "Ta bort permanent" BUTTON_MORE: "Mer" MENU_SET_SEEN: "Markera som läst" MENU_SET_ALL_SEEN: "Markera alla som lästa" MENU_UNSET_SEEN: "Markera som oläst" MENU_SET_FLAG: "Flagga" MENU_UNSET_FLAG: "Avflagga" MENU_SELECT_ALL: "Alla" MENU_SELECT_NONE: "Ingen" MENU_SELECT_INVERT: "Vänd" MENU_SELECT_UNSEEN: "Oläst" MENU_SELECT_SEEN: "Läst" MENU_SELECT_FLAGGED: "Flaggad" MENU_SELECT_UNFLAGGED: "Avflaggad" EMPTY_LIST: "Tom lista" EMPTY_SEARCH_LIST: "Inga meddelanden matchar din sökning." SEARCH_RESULT_FOR: "Sök resultat för \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "Tillbaka till meddelanden" LIST_LOADING: "Laddar" EMPTY_SUBJECT_TEXT: "(Inget ämne)" PUT_MESSAGE_HERE: "Släpp meddelandet för att se det i listan" TODAY_AT: "idag kl %TIME%" YESTERDAY_AT: "igĂĄr kl %TIME%" SEARCH_PLACEHOLDER: "Sök" NEW_MESSAGE_NOTIFICATION: "Du har %COUNT% nya meddelanden!" QUOTA_SIZE: "Använder %SIZE% (%PROC%%) av dina %LIMIT%" MESSAGE: BUTTON_EDIT: "Redigera" BUTTON_BACK: "Backa" BUTTON_CLOSE: "Stäng" BUTTON_DELETE: "Ta bort" BUTTON_UNSUBSCRIBE: "Avprenumerera frĂĄn denna lista" BUTTON_ARCHIVE: "Arkivera" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Inte spam" BUTTON_MOVE_TO: "Flytta till" BUTTON_MORE: "Mera" BUTTON_REPLY: "Svara" BUTTON_REPLY_ALL: "Svara alla" BUTTON_FORWARD: "Vidarebefordra" BUTTON_FORWARD_AS_ATTACHMENT: "Vidarebefordra som bilaga" BUTTON_EDIT_AS_NEW: "Redigera som nytt" BUTTON_SHOW_IMAGES: "Visa yttre bilder" BUTTON_NOTIFY_READ_RECEIPT: "Avsändaren vill ha kvitto när du läst detta meddelande." BUTTON_IN_NEW_WINDOW: "Visa i separat fönster" BUTTON_THREAD_LIST: "trĂĄdremsa" BUTTON_THREAD_PREV: "FöregĂĄende" BUTTON_THREAD_NEXT: "Nästa" BUTTON_THREAD_MORE: "Mer meddelanden" MENU_HEADERS: "Visa meddelanderubriker" MENU_VIEW_ORIGINAL: "Visa källa" MENU_DOWNLOAD_ORIGINAL: "Ladda ner som .eml fil" MENU_FILTER_SIMILAR: "Filtrera meddelanden som detta" MENU_PRINT: "Skriv ut" EMPTY_SUBJECT_TEXT: "(Inget ämne)" LABEL_SUBJECT: "Ă„mne" LABEL_DATE: "Datum" LABEL_FROM: "FrĂĄn" LABEL_FROM_SHORT: "frĂĄn" LABEL_TO: "Till" LABEL_TO_SHORT: "till" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Svara till" PRINT_LABEL_FROM: "FrĂĄn" PRINT_LABEL_TO: "Till" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Svara till" PRINT_LABEL_DATE: "Datum" PRINT_LABEL_SUBJECT: "Ă„mne" PRINT_LABEL_ATTACHMENTS: "Bilagor" MESSAGE_LOADING: "Laddar" MESSAGE_VIEW_DESC: "Välj meddelande i listan att visa här." MESSAGE_VIEW_MOVE_DESC: "Klicka pĂĄ mapp till vänster för att välja mĂĄl mapp." PGP_PASSWORD_INPUT_PLACEHOLDER: "Lösenord" PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signerat meddelande (klicka för att verifiera)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-krypterat meddelande (klicka för att dekryptera)" LINK_DOWNLOAD_AS_ZIP: "Ladda ner som ZIP-fil" LINK_SAVE_TO_OWNCLOUD: "Spara till ownCloud" LINK_SAVE_TO_CLOUD: "Spara till Molnet" LINK_SAVE_TO_DROPBOX: "Spara i Dropbox" READ_RECEIPT: SUBJECT: "Mottagar kvitto (visad) - %SUBJECT%" BODY: | Detta är ett kvitto pĂĄ det meddelande du skickat till %READ-RECEIPT%. Notera: Detta kvitto säger bara att mottagaren öppnat meddelandet. Det finns ingen garanti att mottagare vare sig läst eller förstĂĄtt innehĂĄllet. SUGGESTIONS: SEARCHING_DESC: "Söker..." CONTACTS: LEGEND_CONTACTS: "Kontakter" SEARCH_INPUT_PLACEHOLDER: "Sök" BUTTON_ADD_CONTACT: "Lägg till" BUTTON_CREATE_CONTACT: "Ny" BUTTON_UPDATE_CONTACT: "Uppdatera" BUTTON_IMPORT: "Importera (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exportera (vcf, vCard)" BUTTON_EXPORT_CSV: "Exportera (csv)" ERROR_IMPORT_FILE: "Importfel (ogiltigt filformat)" LIST_LOADING: "Laddar" EMPTY_LIST: "Inga kontakter här" EMPTY_SEARCH: "Inga kontakter funna" CLEAR_SEARCH: "Nollställ sök" CONTACT_VIEW_DESC: "Välj kontakt i listan för att visa här." LABEL_DISPLAY_NAME: "Visnings namn" LABEL_EMAIL: "Epost" LABEL_PHONE: "Telefon" LABEL_WEB: "Web" LABEL_BIRTHDAY: "Födelsedag" LINK_ADD_EMAIL: "Lägg till epostadress" LINK_ADD_PHONE: "Lägg till telefonnummer" LINK_BIRTHDAY: "Födelsedag" PLACEHOLDER_ENTER_DISPLAY_NAME: "Ange visningsnamn" PLACEHOLDER_ENTER_LAST_NAME: "Ange efternamn" PLACEHOLDER_ENTER_FIRST_NAME: "Ange förnamn" PLACEHOLDER_ENTER_NICK_NAME: "Ange smeknamn" LABEL_READ_ONLY: "Endast läs" LABEL_SHARE: "Dela" ADD_MENU_LABEL: "Lägg till..." ADD_MENU_NICKNAME: "Smeknamn" ADD_MENU_NOTES: "Anteckning" ADD_MENU_EMAIL: "Epost" ADD_MENU_PHONE: "Telefon" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adress" ADD_MENU_BIRTHDAY: "Födelsedag" ADD_MENU_TAGS: "Taggar" BUTTON_SHARE_NONE: "Ingen" BUTTON_SHARE_ALL: "Alla" BUTTON_SYNC: "Synkronisering (CardDAV)" COMPOSE: TITLE_FROM: "FrĂĄn" TITLE_TO: "Till" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Svara-till" TITLE_SUBJECT: "Ă„mne" LINK_SHOW_INPUTS: "visa alla fält" BUTTON_SEND: "Skicka" BUTTON_SAVE: "Spara" BUTTON_DELETE: "Ta bort" BUTTON_CANCEL: "Avbryt" BUTTON_MINIMIZE: "Minimera" SAVED_TIME: "Sparat kl %TIME%" SAVED_ERROR_ON_SEND: "Meddelandet skickat men inte sparat i skickat-mappen" DISCARD_UNSAVED_DATA: "Kasta osparade data?" ATTACH_FILES: "Bifoga filer" ATTACH_DROP_FILES_DESC: "Släpp filer här" ATTACH_ITEM_CANCEL: "Avbryt" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% skrev" FORWARD_MESSAGE_TOP_TITLE: "-------- Vidarebefordrat -------" FORWARD_MESSAGE_TOP_FROM: "FrĂĄn" FORWARD_MESSAGE_TOP_TO: "Till" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Skickat" FORWARD_MESSAGE_TOP_SUBJECT: "Ă„mne" EMPTY_TO_ERROR_DESC: "Ange minst en mottagare" NO_ATTACHMENTS_HERE_DESC: "Inga filer är ännu valda" ATTACHMENTS_ERROR_DESC: "Varning! Inte alla bilagor har överförts." ATTACHMENTS_UPLOAD_ERROR_DESC: "Alla bilagor är inte uppladddade än" BUTTON_REQUEST_READ_RECEIPT: "Begär mottagningskvitto" BUTTON_MARK_AS_IMPORTANT: "Markera som viktigt" BUTTON_OPEN_PGP: "OpenPGP (Endast enkel text)" BUTTON_REQUEST_DSN: "Begär ett leveranskvitto" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Stäng" POPUPS_ASK: BUTTON_YES: "Ja" BUTTON_NO: "Nej" DESC_WANT_CLOSE_THIS_WINDOW: "Vill du stänga detta fönster?" DESC_WANT_DELETE_MESSAGES: "Ă„r du säker att du vill ta bort meddelandet?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Välj sprĂĄk" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Lägg till konto?" BUTTON_ADD_ACCOUNT: "Lägg till" TITLE_UPDATE_ACCOUNT: "Uppdatera konto?" BUTTON_UPDATE_ACCOUNT: "Uppdatera" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Lägg till identitet" TITLE_UPDATE_IDENTITY: "Uppdatera identitet" BUTTON_ADD_IDENTITY: "Lägg till" BUTTON_UPDATE_IDENTITY: "Uppdatera" LABEL_EMAIL: "Epost" LABEL_NAME: "Namn" LABEL_REPLY_TO: "Svara-till" LABEL_SIGNATURE: "Signatur" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Sätt denna signatur före citerad text i svar" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Skapa mapp?" LABEL_NAME: "Mappnamn" LABEL_PARENT: "Ă–verliggande mapp" BUTTON_CREATE: "Skapa" BUTTON_CANCEL: "Avbryt" BUTTON_CLOSE: "Stäng" TITLE_CREATING_PROCESS: "Skapar mapp" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Rensa alla meddelanden i mappen?" BUTTON_CLEAR: "Rensa" BUTTON_CANCEL: "Avbryt" BUTTON_CLOSE: "Stäng" DANGER_DESC_WARNING: "Varning!" DANGER_DESC_HTML_1: "Denna ĂĄtgärd kommer att rensa alla mail i %FOLDER%." DANGER_DESC_HTML_2: "När detta är startat kan det inte avbrytas." TITLE_CLEARING_PROCESS: "Rensar mappen..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Import av OpenPGP-nyckel" BUTTON_IMPORT_OPEN_PGP_KEY: "Importera" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Visa OpenPGP-nyckel" BUTTON_SELECT: "Välj" BUTTON_CLOSE: "Stäng" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" LABEL_EMAIL: "Epost" LABEL_NAME: "Namn" LABEL_PASSWORD: "Lösenord" LABEL_KEY_BIT_LENGTH: "Nyckellängd" BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP signera/kryptera" LABEL_SIGN: "Signera" LABEL_ENCRYPT: "Kryptera" LABEL_PASSWORD: "Lösenord" BUTTON_SIGN: "Singera" BUTTON_ENCRYPT: "Kryptera" BUTTON_SIGN_AND_ENCRYPT: "Signera och kryptera" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP avkryptera" LABEL_KEY: "Privat Key" LABEL_PASSWORD: "Lösenord" BUTTON_DECRYPT: "Avkryptera" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "TvĂĄstegsverifieringstest" LABEL_CODE: "Kod" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Skapa ett filter?" TITLE_EDIT_FILTER: "Uppdatera filter?" FILTER_NAME: "Namn" LEGEND_CONDITIONS: "Villkor" LEGEND_ACTIONS: "Handlingar" BUTTON_DONE: "Klar" BUTTON_ADD_CONDITION: "Lägg till ett villkor" SELECT_ACTION_NONE: "Inget" SELECT_ACTION_MOVE_TO: "Flytta till" SELECT_ACTION_FORWARD_TO: "Vidarebefordra till" SELECT_ACTION_REJECT: "Avvisa" SELECT_ACTION_VACATION_MESSAGE: "Autosvar" SELECT_ACTION_DISCARD: "Ta bort" SELECT_FIELD_FROM: "FrĂĄn" SELECT_FIELD_RECIPIENTS: "Mottagare (Till eller CC)" SELECT_FIELD_SUBJECT: "Rubrik" SELECT_FIELD_HEADER: "Rubrik" SELECT_FIELD_SIZE: "Storlek" SELECT_TYPE_CONTAINS: "innehĂĄller" SELECT_TYPE_NOT_CONTAINS: "innehĂĄller inte" SELECT_TYPE_MATCHES: "Matchar (* och ? stöds)" SELECT_TYPE_NOT_MATCHES: "Matchar inte (* och ? stöds)" SELECT_TYPE_REGEXP: "regexp" SELECT_TYPE_NOT_REGEXP: "inte regexp" SELECT_TYPE_EQUAL_TO: "lika med" SELECT_TYPE_NOT_EQUAL_TO: "inte lika med" SELECT_TYPE_OVER: "över" SELECT_TYPE_UNDER: "under" SELECT_MATCH_ANY: "Matcha nĂĄgon av följande regler" SELECT_MATCH_ALL: "Matcha samtliga av följande regler" MARK_AS_READ_LABEL: "Markera som läst" REPLY_INTERVAL_LABEL: "Svarsintervall (dagar)" KEEP_LABEL: "BehĂĄll" STOP_LABEL: "Sluta inte bearbeta andra regler" EMAIL_LABEL: "Epost" VACATION_SUBJECT_LABEL: "Ă„mne (valfritt)" VACATION_MESSAGE_LABEL: "Meddelande" VACATION_RECIPIENTS_LABEL: "Mottagare (kommaseparerade)" REJECT_MESSAGE_LABEL: "meddelande" ALL_INCOMING_MESSAGES_DESC: "Alla inkommande meddelanden" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Välj systemmappar" SELECT_CHOOSE_ONE: "Välj en" SELECT_UNUSE_NAME: "Använd inte" LABEL_SENT: "Skickat" LABEL_DRAFTS: "Utkast" LABEL_SPAM: "Spam" LABEL_TRASH: "Papperskorg" LABEL_ARCHIVE: "Arkiv" BUTTON_CANCEL: "Avbryt" BUTTON_CLOSE: "Stäng" NOTIFICATION_SENT: | Du har inte valt "Skickat" systemmapp, där skickade meddelande ska sparas. Om du inte vill spara skickade meddelanden, välj dĂĄ "Använd inte" valet. NOTIFICATION_DRAFTS: "Du har inte valt \"Drafts\" systemmapp, där meddelanden sparas medan det skrivs." NOTIFICATION_SPAM: | Du har inte valt "Spam"-systemmapp, där spam-meddelanden ska sparas. Om du vill ta bort meddelanden permanent, välj dĂĄ "Använd inte"-valet. NOTIFICATION_TRASH: | Du har inte valt "Papperskorg" systemmapp, där borttagna meddelanden ska sparas. Om du vill ta meddelanden permanent, väl dĂĄ "Använd inte" valet. NOTIFICATION_ARCHIVE: "Du har inte valt \"Arkiv\" systemmapp, där arkiverade meddelanden ska läggas." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "TvĂĄstegsverifiering (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Aktivera tvĂĄstegsverifiering" LABEL_TWO_FACTOR_USER: "Användare" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Hemlig kod" LABEL_TWO_FACTOR_BACKUP_CODES: "Backupkoder" BUTTON_CREATE: "Skapa ny hemlig kod" BUTTON_ACTIVATE: "Aktivera" BUTTON_CLEAR: "Rensa" BUTTON_LOGOUT: "Logga ut" BUTTON_DONE: "Klar" BUTTON_TEST: "Testa" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Visa hemlig kod" BUTTON_HIDE_SECRET: "Göm hemlig kod" TWO_FACTOR_REQUIRE_DESC: "Ditt konto kräver tvĂĄstegsverifiering." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfigurerad" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Inte konfigurarad" TWO_FACTOR_SECRET_DESC: >- Importera denna information till din Google Authenticator klient (eller annan TOTP klient) med denna QR kod eller manuellt med koden här nedan. TWO_FACTOR_BACKUP_CODES_DESC: >- Om du inte kan ta emot koderna med Google Authenticator, sĂĄ använd backupkoderna för att logga in. När du använt backupkoderna för att logga in sĂĄ blir dom inaktiva. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Du kan inte ändra denna inställning innan test." TITLES: LOADING: "Laddar" LOGIN: "Logga in" MAILBOX: "BrevlĂĄda" SETTINGS: "Inställningar" COMPOSE: "Skriv" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Filen är för stor" ERROR_FILE_PARTIALLY_UPLOADED: "Filen blev delvis uppladdad av okänd anledning" ERROR_NO_FILE_UPLOADED: "Ingen fil uppladdad" ERROR_MISSING_TEMP_FOLDER: "Den temporära filen saknas" ERROR_ON_SAVING_FILE: "Okänt uppladdingsfel" ERROR_FILE_TYPE: "Ogiltig filtyp" ERROR_UNKNOWN: "Okänt uppladdingsfel" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "HTML-formatering" TEXT_SWITCHER_CONFIRM: "Textformatering och bilder kommer att försvinna. Vill du fortsätta?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Personligt" LABEL_GENERAL_NAME: "Allmänt" LABEL_CONTACTS_NAME: "Kontakter" LABEL_FOLDERS_NAME: "Mappar" LABEL_ACCOUNTS_NAME: "Konton" LABEL_IDENTITY_NAME: "Identitet" LABEL_IDENTITIES_NAME: "Identiteter" LABEL_FILTERS_NAME: "Filter" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Säkerhet" LABEL_SOCIAL_NAME: "Socialt" LABEL_THEMES_NAME: "Teman" LABEL_CHANGE_PASSWORD_NAME: "Lösenord" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Tillbaka" SETTINGS_FILTERS: LEGEND_FILTERS: "Filter" BUTTON_SAVE: "Spara" BUTTON_ADD_FILTER: "Lägg till filter" BUTTON_DELETE: "Ta bort" BUTTON_RAW_SCRIPT: "Använd anpassat användarscript" SUBNAME_NONE: "Ingen" SUBNAME_MOVE_TO: "Flytta till \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Vidarebefordra till \"%EMAIL%\"" SUBNAME_REJECT: "Avvisa" SUBNAME_VACATION_MESSAGE: "semestermeddelande" SUBNAME_DISCARD: "Kassera" CAPABILITY_LABEL: "FörmĂĄga" LOADING_PROCESS: "Uppdaterar filter listan" DELETING_ASK: "Ă„r du säker?" CHACHES_NEED_TO_BE_SAVED_DESC: "Dessa förändringar mĂĄste sparas pĂĄ servern." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identitet" LABEL_DISPLAY_NAME: "Namn" LABEL_REPLY_TO: "Svara-till" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur pĂĄ alla utgĂĄende meddelanden." SETTINGS_SECURITY: LEGEND_SECURITY: "Säkerhet" LABEL_CONFIGURE_TWO_FACTOR: "Konfigurera tvĂĄstegsverifiering" LABEL_AUTOLOGOUT: "Automatisk utloggning" AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(er)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% timme/timmar" SETTINGS_GENERAL: LEGEND_GENERAL: "Allmänt" LABEL_LANGUAGE: "SprĂĄk" LABEL_IDENTITY: "Identitet" LABEL_LAYOUT: "Stil" LABEL_LAYOUT_NO_SPLIT: "Utan delad vy" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikalt delad vy" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontellt delad vy" LABEL_EDITOR: "Textredigerare" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Oformaterad text" LABEL_EDITOR_HTML_FORCED: "HTML (tvinga)" LABEL_EDITOR_PLAIN_FORCED: "Oformaterad text (tvinga)" LABEL_ANIMATION: "Animerat utseende" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Ingen" LABEL_VIEW_OPTIONS: "Visa alternativ" LABEL_USE_PREVIEW_PANE: "Avänd förhandsgranskningsfönster" LABEL_USE_CHECKBOXES_IN_LIST: "Visa kryssrutor i listan" LABEL_USE_THREADS: "Använd trĂĄdar" LABEL_REPLY_SAME_FOLDER: "Placera svar i samma mapp som mottagna meddelandet" LABEL_SHOW_IMAGES: "Visa alltid bilder i mail" LABEL_SHOW_ANIMATION: "Visa animeringar" LABEL_MESSAGE_PER_PAGE: "Meddelanden per sida" LABEL_NOTIFICATIONS: "Aviseringar" LABEL_SOUND_NOTIFICATION: "Ljudnotifikation" LABEL_CHROME_NOTIFICATION_DESC: "Visa nya meddelande-aviseringar som popup-fönster" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Blockat av webbläsaren)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakter" LABEL_CONTACTS_AUTOSAVE: "Lägg till mottagare automatiskt i din adressbok" LEGEND_CONTACTS_SYNC: "Fjärrsynkronisering (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Aktivera fjärrsynkronisering" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Adressboks-URL" LABEL_CONTACTS_SYNC_USER: "Användare" LABEL_CONTACTS_SYNC_PASSWORD: "Lösenord" SETTINGS_THEMES: LEGEND_THEMES: "Teman" LEGEND_THEMES_CUSTOM: "Anpassad temakonfiguration" LABEL_CUSTOM_TYPE: "Typ" LABEL_CUSTOM_TYPE_LIGHT: "Ljus" LABEL_CUSTOM_TYPE_DARK: "Mörk" LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrund" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Ladda upp bakgrundsbild (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Filen är för stor" ERROR_FILE_TYPE_ERROR: "Ogiltig fil typ (endast JPG och PNG)" ERROR_UNKNOWN: "Okänt uppladdingsfel" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Anslut till Google" BUTTON_GOOGLE_DISCONNECT: "Koppla frĂĄn Google" MAIN_GOOGLE_DESC: "Efter aktivering av Googleinloggning, kan du logga in pĂĄ detta konto med Google-knappen pĂĄ inloggningssidan." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Anslut till Facebook" BUTTON_FACEBOOK_DISCONNECT: "Koppla frĂĄn Facebook" MAIN_FACEBOOK_DESC: "Efter aktivering av Facebookinloggning, kan du logga in pĂĄ detta konto med Facebook-knappen pĂĄ inloggningssidan." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Anslut till Twitter" BUTTON_TWITTER_DISCONNECT: "Koppla frĂĄn Twitter" MAIN_TWITTER_DESC: "Efter aktivering av Twitterinloggning, kan du logga in pĂĄ detta konto med Twitterknappen pĂĄ inloggningssidan." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Mapplista" BUTTON_CREATE: "Skapa mapp" BUTTON_SYSTEM: "Systemmappar" BUTTON_DELETE: "Ta bort" BUTTON_SUBSCRIBE: "Prenumerera" BUTTON_UNSUBSCRIBE: "Avprenumerera" LOADING_PROCESS: "Uppdaterar mapplista" CREATING_PROCESS: "Skapar en mapp" DELETING_PROCESS: "Ta bort en mapp" RENAMING_PROCESS: "Byter namn pĂĄ en mapp" DELETING_ASK: "Ă„r du säker?" TO_MANY_FOLDERS_DESC_1: "Du har för mĂĄnga mappar" TO_MANY_FOLDERS_DESC_2: "Vi har visat endast en del av dem, för att undvika prestandaproblem." HELP_DELETE_FOLDER: "Ta bort mapp" HELP_SHOW_HIDE_FOLDER: "Visa/dölj mapp" HELP_CHECK_FOR_NEW_MESSAGES: "Kontrollera/inte söka efter nya meddelanden" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Kontolista" LEGEND_IDENTITIES: "Indentiteter" LEGEND_ACCOUNTS_AND_IDENTITIES: "Konton och identiteter" BUTTON_ADD_ACCOUNT: "Lägg till konto" BUTTON_ADD_IDENTITY: "Lägg till identitet" BUTTON_DELETE: "Ta bort" LOADING_PROCESS: "Uppdaterar kontolista" DELETING_ASK: "Ă„r du säker?" DEFAULT_IDENTITY_LABEL: "standard" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identitet" LEGEND_IDENTITIES: "Ytterligare identiteter" LABEL_DEFAULT: "Standard" LABEL_DISPLAY_NAME: "Namn" LABEL_REPLY_TO: "Svara-till" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur pĂĄ alla utgĂĄende meddelanden." BUTTON_ADD_IDENTITY: "Lägg till identitet" BUTTON_DELETE: "Ta bort" LOADING_PROCESS: "Uppdaterar identitetslistan" DELETING_ASK: "Ă„r du säker?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Ă„ndra lösenord" LABEL_CURRENT_PASSWORD: "Nuvarande lösenord" LABEL_NEW_PASSWORD: "Nytt lösenord" LABEL_REPEAT_PASSWORD: "Bekräfta nytt lösenord" BUTTON_UPDATE_PASSWORD: "Byt lösenord" ERROR_PASSWORD_MISMATCH: "Lösenorden matchar inte, vänligen försök igen" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importera OpenPGP-nyckel" BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" TITLE_PRIVATE: "Privat" TITLE_PUBLIC: "Publik" DELETING_ASK: "Ă„r du säker?" GENERATE_ONLY_HTTPS: "Endast HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Spara utkast automatiskt" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Tangentbordsgenvägar hjälp" TAB_MAILBOX: "Inkorg" TAB_MESSAGE_LIST: "Meddelandelista" TAB_MESSAGE_VIEW: "Meddelandevy" TAB_COMPOSE: "Skapa" LABEL_OPEN_USER_DROPDOWN: "Ă–ppna användarval" LABEL_REPLY: "Svara" LABEL_REPLY_ALL: "Svara alla" LABEL_FORWARD: "Vidarebefordra" LABEL_FORWARD_MULTIPLY: "Vidarebefordra som bilaga(or)" LABEL_HELP: "Hjälp" LABEL_CHECK_ALL: "Kontrollera alla meddelanden" LABEL_ARCHIVE: "Arkiv" LABEL_DELETE: "Ta bort" LABEL_OPEN_THREAD: "Ă–ppna valda trĂĄdar" LABEL_MOVE: "Flytta" LABEL_READ: "Markera valda meddelanden som lästa" LABEL_UNREAD: "Markera valda meddelanden som olästa" LABEL_IMPORTANT: "Markera valda meddelanden som viktigt" LABEL_SEARCH: "Sök" LABEL_CANCEL_SEARCH: "Avbryt sökning" LABEL_FULLSCREEN_ENTER: "Fullskärm (förhandsgranskningslayout)" LABEL_VIEW_MESSAGE_ENTER: "Visa meddelande (ingen förhandsgranskningslayout)" LABEL_SWITCH_TO_MESSAGE: "Flytta fokus till valda meddelande" LABEL_SWITCH_TO_FOLDER_LIST: "Flytta fokus till mapplistan" LABEL_FULLSCREEN_TOGGLE: "Växla fullskärmsläge" LABEL_BLOCKQUOTES_TOGGLE: "Växla meddelandecitat" LABEL_THREAD_NEXT: "Nästa meddelande i trĂĄden" LABEL_THREAD_PREV: "FöregĂĄende meddelande i trĂĄden" LABEL_PRINT: "Skriv ut" LABEL_EXIT_FULLSCREEN: "Avsluta fullskärmsläge" LABEL_CLOSE_MESSAGE: "Stäng meddelande (ingen förhandsgranskningslayout)" LABEL_SWITCH_TO_LIST: "Växla fokus tillbaka till meddelandelistan" LABEL_OPEN_COMPOSE_POPUP: "Ă–ppna skrivfönster" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimera skrivfönster" LABEL_OPEN_IDENTITIES_DROPDOWN: "Ă–ppna identitetsval" LABEL_SAVE_MESSAGE: "Spara meddelande" LABEL_SEND_MESSAGE: "Skicka meddelande" LABEL_CLOSE_COMPOSE: "Stäng fönster" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Inga publika nycklar funna" NO_PUBLIC_KEYS_FOUND_FOR: "Inga publika nycklar funna för \"%EMAIL%\" epost" NO_PRIVATE_KEY_FOUND: "Inga privata nycklar funna" NO_PRIVATE_KEY_FOUND_FOR: "Inga privata nycklar funna för \"%EMAIL%\" epost" ADD_A_PUBLICK_KEY: "Lägg till en publicerad nyckel" SELECT_A_PRIVATE_KEY: "Välj en privat nyckel" UNVERIFIRED_SIGNATURE: "Overifierad signatur" DECRYPTION_ERROR: "OpenPGP dekrypteringsfel" GOOD_SIGNATURE: "Godkänd signatur för %USER%" PGP_ERROR: "OpenPGP-fel: %ERROR%" SPECIFY_FROM_EMAIL: "Ange FRĂ…N epost adress" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Ange minst en mottagare" NOTIFICATIONS: INVALID_TOKEN: "Ogiltigt tecken" AUTH_ERROR: "Autentisering misslyckades" ACCESS_ERROR: "Ă…tkomstfel" CONNECTION_ERROR: "Kan inte ansluta till servern" CAPTCHA_ERROR: "Felaktig CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Detta ID är inte tilldelat nĂĄgot epost konto än. Logga in med epost uppgifter och aktivera detta i konto inställningarna. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Detta ID är inte tilldelat nĂĄgot epost konto än. Logga in med epost uppgifter och aktivera detta i konto inställningarna. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Detta ID är inte tilldelat nĂĄgot epost konto än. Logga in med epost uppgifter och aktivera detta i konto inställningarna. DOMAIN_NOT_ALLOWED: "Domän är inte tillĂĄtet" ACCOUNT_NOT_ALLOWED: "Konto är inte tillĂĄtet" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "TvĂĄstegsverifiering krävs" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "TvĂĄstegsverifieringsfel" COULD_NOT_SAVE_NEW_PASSWORD: "Kunde inte spara lösenord" CURRENT_PASSWORD_INCORRECT: "Nuvarande lösenord är felaktigt" NEW_PASSWORD_SHORT: "Lösenordet är för kort" NEW_PASSWORD_WEAK: "Lösenordet är för enkelt" NEW_PASSWORD_FORBIDDENT: "Lösenordet innehĂĄller ogiltiga tecken" CONTACTS_SYNC_ERROR: "Kontakt-synkroniseringsfel" CANT_GET_MESSAGE_LIST: "Kan inte hämta meddelandelista" CANT_GET_MESSAGE: "Kan inte hämta meddelande" CANT_DELETE_MESSAGE: "Kan inte ta bort meddelande" CANT_MOVE_MESSAGE: "Kan inte flytta meddelande" CANT_SAVE_MESSAGE: "Kan inte spara meddelande" CANT_SEND_MESSAGE: "Kan inte skicka meddelande" INVALID_RECIPIENTS: "Ogiltig mottagare" CANT_SAVE_FILTERS: "Kan inte spara filter" CANT_GET_FILTERS: "Kan inte ta emot filter" FILTERS_ARE_NOT_CORRECT: "Filter är inte korrekt" CANT_CREATE_FOLDER: "Kan inte skapa mapp" CANT_RENAME_FOLDER: "Kan inte byta namn pĂĄ mapp" CANT_DELETE_FOLDER: "Kan inte ta bort mapp" CANT_DELETE_NON_EMPTY_FOLDER: "Kan inte ta bort mapp med innehĂĄll" CANT_SUBSCRIBE_FOLDER: "Kan inte prenumerera pĂĄ mapp" CANT_UNSUBSCRIBE_FOLDER: "Kan inte avprenumerera pĂĄ mapp" CANT_SAVE_SETTINGS: "Kan inte spara inställningarna" CANT_SAVE_PLUGIN_SETTINGS: "Kan inte spara inställningarna" DOMAIN_ALREADY_EXISTS: "Domänen finns redan" CANT_INSTALL_PACKAGE: "Misslyckades att installera paket" CANT_DELETE_PACKAGE: "Misslyckades ta bort paket" INVALID_PLUGIN_PACKAGE: "Ogiltigt pluginpaket" UNSUPPORTED_PLUGIN_PACKAGE: "Inget stöd för detta pluginpaket" LICENSING_SERVER_IS_UNAVAILABLE: "Prenumerationsserver inte tillgänglig" LICENSING_DOMAIN_EXPIRED: "Prenumeration för denna domän har gĂĄtt ut." LICENSING_DOMAIN_BANNED: "Prenumeration för denna domän är bannad." DEMO_SEND_MESSAGE_ERROR: "Av säkerhets skäl kan inte detta demo-konto skicka epost till externa adressater!" DEMO_ACCOUNT_ERROR: "Av säkerhetsskäl är det här kontot inte tillĂĄtet för denna ĂĄtgärd!" ACCOUNT_ALREADY_EXISTS: "Kontot finns redan" ACCOUNT_DOES_NOT_EXIST: "Kontot finns inte" MAIL_SERVER_ERROR: "Ett fel har inträffat vid anslutning till epostservern" INVALID_INPUT_ARGUMENT: "Ogiltigt argument" UNKNOWN_ERROR: "Okänt fel" STATIC: BACK_LINK: "Ladda om" DOMAIN_LIST_DESC: "Lista över domän(er) som webbmailen har ĂĄtkomst till." PHP_EXSTENSIONS_ERROR_DESC: "Erfodrade PHP-tillägg finns inte i PHP konfigurationen!" PHP_VERSION_ERROR_DESC: "Din PHP version (%VERSION%) uppfyller inte kravet pĂĄ 5.3.0!" NO_SCRIPT_TITLE: "JavaScript krävs för denna applikation." NO_SCRIPT_DESC: | JavaScript är inte tillgängligt i webb läsaren. Aktivera JavaScript stöd och försök igen. NO_COOKIE_TITLE: "Kakstöd krävs för denna applikation." NO_COOKIE_DESC: | Kakstöd är inte tillgängligt i webbläsaren. Aktivera kakstöd och försök igen. BAD_BROWSER_TITLE: "Webbläsaren är för gammal." BAD_BROWSER_DESC: | För att använda funktioner i denna applikation, ladda ner och installera nĂĄgon av följande webbläsare: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/tr_TR.yml000066400000000000000000000746751361462701300262540ustar00rootroot00000000000000tr_TR: LOGIN: LABEL_EMAIL: "E-Posta" LABEL_LOGIN: "GiriĹź" LABEL_PASSWORD: "Ĺžifre" LABEL_SIGN_ME: "Beni Hatırla" LABEL_VERIFICATION_CODE: "DoÄźrulama Kodu" LABEL_DONT_ASK_VERIFICATION_CODE: "2 hafta boyunca kodu sormayın" BUTTON_SIGN_IN: "GiriĹź Yap" TITLE_SIGN_IN_GOOGLE: "Google İle GiriĹź Yap" TITLE_SIGN_IN_FACEBOOK: "Facebook ile GiriĹź yap" TITLE_SIGN_IN_TWITTER: "Twitter İle GiriĹź Yap" LABEL_FORGOT_PASSWORD: "Ĺžifremi Unuttum" LABEL_REGISTRATION: "Registration" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Hesap Ekle" BUTTON_SETTINGS: "Ayarlar" BUTTON_HELP: "Yardım" BUTTON_LOGOUT: "Çıkış" MOBILE: BUTTON_MOBILE_VERSION: "Mobil versiyonu" BUTTON_DESKTOP_VERSION: "MasaĂĽstĂĽ versiyonu" SEARCH: MAIN_INPUT_PLACEHOLDER: "Arama" TITLE_ADV: "Detaylı Arama" LABEL_ADV_FROM: "Kimden" LABEL_ADV_TO: "Kime" LABEL_ADV_SUBJECT: "Konu" LABEL_ADV_TEXT: "Metin" LABEL_ADV_HAS_ATTACHMENT: "Eki" LABEL_ADV_HAS_ATTACHMENTS: "Ekleri" LABEL_ADV_FLAGGED: "İşaretli" LABEL_ADV_UNSEEN: "GörĂĽnmeyen" LABEL_ADV_DATE: "Tarih" LABEL_ADV_DATE_ALL: "Hepsi" LABEL_ADV_DATE_3_DAYS: "3 gĂĽn önceki" LABEL_ADV_DATE_7_DAYS: "1 hafta önceki" LABEL_ADV_DATE_MONTH: "1 ay önceki" LABEL_ADV_DATE_3_MONTHS: "3 ay önceki" LABEL_ADV_DATE_6_MONTHS: "6 ay önceki" LABEL_ADV_DATE_YEAR: "1 yıl önceki" BUTTON_ADV_SEARCH: "Arama" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "YakınlaĹźtır/UzaklaĹźtır" CLOSE: "Kapat (Esc)" LOADING: "YĂĽkleniyor..." GALLERY_PREV: "Ă–nceki (Sol yön tuĹźu)" GALLERY_NEXT: "Sonraki (SaÄź yön tuĹźu)" GALLERY_COUNTER: "%curr% of %total%" IMAGE_ERROR: "Bu resim yĂĽklenemedi." AJAX_ERROR: "Bu içerik yĂĽklenemedi." FOLDER_LIST: BUTTON_COMPOSE: "Yaz" BUTTON_CONTACTS: "KiĹźi Listesi" BUTTON_NEW_MESSAGE: "Yeni Mesaj" INBOX_NAME: "Gelen Kutusu" SENT_NAME: "Gönderilen" DRAFTS_NAME: "Taslaklar" SPAM_NAME: "Spam" TRASH_NAME: "Çöp Kutusu" ARCHIVE_NAME: "ArĹźiv" QUOTA: TITLE: "Kota Kullanımı" MESSAGE_LIST: BUTTON_RELOAD: "Mesaj Listesini Yenile" BUTTON_MOVE_TO: "Taşı" BUTTON_DELETE: "Sil" BUTTON_ARCHIVE: "ArĹźiv" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Spam DeÄźil" BUTTON_EMPTY_FOLDER: "KlasörĂĽ temizle" BUTTON_MULTY_FORWARD: "Mesajları İlet" BUTTON_DELETE_WITHOUT_MOVE: "Kalıcı olarak sil" BUTTON_MORE: "devamı" MENU_SET_SEEN: "Okundu olarak iĹźaretle" MENU_SET_ALL_SEEN: "TĂĽmĂĽnĂĽ okundu olarak iĹźaretle" MENU_UNSET_SEEN: "Okunmadı olarak iĹźaretle" MENU_SET_FLAG: "İşaretle" MENU_UNSET_FLAG: "İşaretleme" MENU_SELECT_ALL: "TĂĽmĂĽ" MENU_SELECT_NONE: "Hiçbiri" MENU_SELECT_INVERT: "Invert" MENU_SELECT_UNSEEN: "Okunmamış" MENU_SELECT_SEEN: "Oku" MENU_SELECT_FLAGGED: "İşaretlenmiĹź" MENU_SELECT_UNFLAGGED: "İşaretlenmemiĹź" EMPTY_LIST: "Herhangi Bir Sonuç Bulunamadı." EMPTY_SEARCH_LIST: "Arama sonuçlarına uyan herhangi bir mesaj bulunamadı." SEARCH_RESULT_FOR: "\"%SEARCH%\" için arama sonuçları" BACK_TO_MESSAGE_LIST: "mesaj listesine geri dön" LIST_LOADING: "YĂĽkleniyor" EMPTY_SUBJECT_TEXT: "(Konu Yok)" PUT_MESSAGE_HERE: "Listede görĂĽntĂĽlemek istediÄźiniz mesajı buraya sĂĽrĂĽkleyin." TODAY_AT: "bugĂĽn %TIME%" YESTERDAY_AT: "dĂĽn %TIME%" SEARCH_PLACEHOLDER: "Arama" NEW_MESSAGE_NOTIFICATION: "Toplam %COUNT% yeni mesajınız var!" QUOTA_SIZE: "Size ayrılan %LIMIT%'dan %SIZE% (%PROC%%) kullanıyorsunuz" MESSAGE: BUTTON_EDIT: "DĂĽzenle" BUTTON_BACK: "Geri" BUTTON_CLOSE: "Kapat" BUTTON_DELETE: "Sil" BUTTON_UNSUBSCRIBE: "Bu listeden aboneliÄźi sonlandir" BUTTON_ARCHIVE: "ArĹźiv" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Spam DeÄźil" BUTTON_MOVE_TO: "Taşı" BUTTON_MORE: "More" BUTTON_REPLY: "Yanıtla" BUTTON_REPLY_ALL: "TĂĽmĂĽnĂĽ Yanıtla" BUTTON_FORWARD: "Yönlendir" BUTTON_FORWARD_AS_ATTACHMENT: "TĂĽmĂĽnĂĽ Yönlendir(ekler dahil)" BUTTON_EDIT_AS_NEW: "DĂĽzenle ve yeni" BUTTON_SHOW_IMAGES: "Resimleri görĂĽntĂĽle" BUTTON_NOTIFY_READ_RECEIPT: "Gönderen, bu mesaj için okundu onayı istedi." BUTTON_IN_NEW_WINDOW: "Ayrı bir pencerede görĂĽntĂĽle" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "Ă–nceki" BUTTON_THREAD_NEXT: "Sonraki" BUTTON_THREAD_MORE: "More messages" MENU_HEADERS: "İleti baĹźlıklarını göster" MENU_VIEW_ORIGINAL: "Kaynağı görĂĽntĂĽle" MENU_DOWNLOAD_ORIGINAL: ".eml dosyası olarak indir" MENU_FILTER_SIMILAR: "Bunun gibi iletileri filtrele" MENU_PRINT: "yazdır" EMPTY_SUBJECT_TEXT: "(Konu Yok)" LABEL_SUBJECT: "Konu" LABEL_DATE: "Tarih" LABEL_FROM: "Kimden" LABEL_FROM_SHORT: "kimden" LABEL_TO: "Kime" LABEL_TO_SHORT: "kime" LABEL_CC: "CC" LABEL_BCC: "BCC" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "Kimden" PRINT_LABEL_TO: "To" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "Tarih" PRINT_LABEL_SUBJECT: "Konu" PRINT_LABEL_ATTACHMENTS: "Ekler" MESSAGE_LOADING: "YĂĽkleniyor" MESSAGE_VIEW_DESC: "Burada görĂĽntĂĽlemek için listeden mesaj seçin." PGP_PASSWORD_INPUT_PLACEHOLDER: "Ĺžifre" PGP_SIGNED_MESSAGE_DESC: "OpenPGP imzalı mesaj (onay için tıklayın)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP Ĺźifreli mesaj (çözmek için tıklayın)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" LINK_SAVE_TO_DROPBOX: "Dropbox'a Kaydet" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Aranıyor..." CONTACTS: LEGEND_CONTACTS: "Adres Defteri" SEARCH_INPUT_PLACEHOLDER: "Arama" BUTTON_ADD_CONTACT: "Ekle" BUTTON_CREATE_CONTACT: "OluĹźtur" BUTTON_UPDATE_CONTACT: "GĂĽncelle" BUTTON_IMPORT: "İçe Aktar (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Dışa Aktar (vcf, vCard)" BUTTON_EXPORT_CSV: "Dışa Aktar (csv)" ERROR_IMPORT_FILE: "İçe aktarma hatası (geçersiz dosya formatı)" LIST_LOADING: "YĂĽkleniyor" EMPTY_LIST: "Adres defterinizide kayıt bulunmuyor" EMPTY_SEARCH: "KiĹźi bulunamadı" CLEAR_SEARCH: "Aramayı temizle" CONTACT_VIEW_DESC: "GörĂĽntĂĽlemek istediÄźiniz kiĹźiyi listeden seçin." LABEL_DISPLAY_NAME: "Ekran Adı" LABEL_EMAIL: "E-Posta" LABEL_PHONE: "Telefon" LABEL_WEB: "Web" LABEL_BIRTHDAY: "DoÄźum GĂĽnĂĽ" LINK_ADD_EMAIL: "Bir e-posta adresi ekleyin" LINK_ADD_PHONE: "Bir telefon numarası ekleyin" LINK_BIRTHDAY: "DoÄźrum GĂĽnĂĽ" PLACEHOLDER_ENTER_DISPLAY_NAME: "GörĂĽntĂĽlenecek Ad" PLACEHOLDER_ENTER_LAST_NAME: "Soyadını yazın" PLACEHOLDER_ENTER_FIRST_NAME: "Adı yazın" PLACEHOLDER_ENTER_NICK_NAME: "Nickname yazın" LABEL_READ_ONLY: "Sadece Okunabilir" LABEL_SHARE: "paylaĹź" ADD_MENU_LABEL: "Ekle" ADD_MENU_NICKNAME: "Nickname" ADD_MENU_NOTES: "Notlar" ADD_MENU_EMAIL: "E-Posta" ADD_MENU_PHONE: "Gsm" ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adres" ADD_MENU_BIRTHDAY: "DoÄźum GĂĽnĂĽ" ADD_MENU_TAGS: "Etiketler" BUTTON_SHARE_NONE: "Hiçbiri" BUTTON_SHARE_ALL: "Herkes" BUTTON_SYNC: "Senkronize Et (CardDAV)" COMPOSE: TITLE_FROM: "Kimden" TITLE_TO: "Kime" TITLE_CC: "CC" TITLE_BCC: "BCC" TITLE_REPLY_TO: "Yanıtla" TITLE_SUBJECT: "Konu" LINK_SHOW_INPUTS: "tĂĽm alanları görĂĽntĂĽle" BUTTON_SEND: "Gönder" BUTTON_SAVE: "Kaydet" BUTTON_DELETE: "Sil" BUTTON_CANCEL: "Vazgeç" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "%TIME% tarihinde kaydedildi" SAVED_ERROR_ON_SEND: "Mesaj gönderildi fakat gönderilenler klasörĂĽne kaydedilmedi" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "Ek dosyalar" ATTACH_DROP_FILES_DESC: "Dosyaları buraya sĂĽrĂĽkleyin" ATTACH_ITEM_CANCEL: "Vazgeç" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% yazdı" FORWARD_MESSAGE_TOP_TITLE: "-------- YönlendirilmiĹź İleti -------" FORWARD_MESSAGE_TOP_FROM: "Kimden" FORWARD_MESSAGE_TOP_TO: "Kime" FORWARD_MESSAGE_TOP_CC: "CC" FORWARD_MESSAGE_TOP_SENT: "Gönder" FORWARD_MESSAGE_TOP_SUBJECT: "Konu" EMPTY_TO_ERROR_DESC: "En az bir alıcı belirtin" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" BUTTON_REQUEST_READ_RECEIPT: "Okundu bilgisi iste" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "Evet" BUTTON_NO: "Hayır" DESC_WANT_CLOSE_THIS_WINDOW: "Bu pencereyi kapatmak istediÄźinizden emin misiniz?" DESC_WANT_DELETE_MESSAGES: "Mesaj(ları) silmek istediÄźinizden emin misiniz?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Dil Seçimi" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Hesap Ekle?" BUTTON_ADD_ACCOUNT: "Ekle" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Kimlik Ekle?" TITLE_UPDATE_IDENTITY: "Kimlik GĂĽncelle?" BUTTON_ADD_IDENTITY: "Ekle" BUTTON_UPDATE_IDENTITY: "GĂĽncelle" LABEL_EMAIL: "E-Posta" LABEL_NAME: "Ad" LABEL_REPLY_TO: "Yanıtla" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Bcc" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Klasör OluĹźtur?" LABEL_NAME: "Klasör Adı" LABEL_PARENT: "Ăśst Klasör" BUTTON_CREATE: "OluĹźtur" BUTTON_CANCEL: "Vazgeç" BUTTON_CLOSE: "Kapat" TITLE_CREATING_PROCESS: "Klasör OluĹźtur" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Klasördeki tĂĽm mesajları temizle?" BUTTON_CLEAR: "Temizle" BUTTON_CANCEL: "Vazgeç" BUTTON_CLOSE: "Kapat" DANGER_DESC_WARNING: "Uyarı!" DANGER_DESC_HTML_1: "Bu iĹźlem ile %FOLDER% klasörĂĽndeki tĂĽm mailler silinecek." DANGER_DESC_HTML_2: "Bu iĹźlem bir kez baĹźladıktan sonra, iĹźlem durdurulamaz veya iptal edilemez." TITLE_CLEARING_PROCESS: "Klasör temizleniyor..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "OpenPGP key'i içe aktar" BUTTON_IMPORT_OPEN_PGP_KEY: "İçe aktar" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "OpenPGP key'i göster" BUTTON_SELECT: "Seç" BUTTON_CLOSE: "Kapat" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "OpenPGP key'leri OluĹźtur" LABEL_EMAIL: "E-Posta" LABEL_NAME: "Ad" LABEL_PASSWORD: "Ĺžifre" LABEL_KEY_BIT_LENGTH: "Key UzunluÄźu" BUTTON_GENERATE_OPEN_PGP_KEYS: "OluĹźtur" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP GiriĹź/Ĺžifrele" LABEL_SIGN: "GiriĹź Yap" LABEL_ENCRYPT: "Ĺžifrele" LABEL_PASSWORD: "Password" BUTTON_SIGN: "GiriĹź Yap" BUTTON_ENCRYPT: "Ĺžifrele" BUTTON_SIGN_AND_ENCRYPT: "GiriĹź Yap and Ĺźifrele" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "2-Basamaklı doÄźrulama testi" LABEL_CODE: "Kod" BUTTON_TEST: "Test" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Equal To" SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching any of the following rules" SELECT_MATCH_ALL: "Matching all of the following rules" MARK_AS_READ_LABEL: "Okundu olarak iĹźaretle" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Eposta" VACATION_SUBJECT_LABEL: "Konu (Opsiyonel)" VACATION_MESSAGE_LABEL: "Mesaj" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Reject message" ALL_INCOMING_MESSAGES_DESC: "All incoming messages" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Sistem klasörĂĽ seç" SELECT_CHOOSE_ONE: "Birini seçin" SELECT_UNUSE_NAME: "Kullanmayın" LABEL_SENT: "Gönderilen" LABEL_DRAFTS: "Taslaklar" LABEL_SPAM: "Spam" LABEL_TRASH: "Çöp" LABEL_ARCHIVE: "ArĹźiv" BUTTON_CANCEL: "Vazgeç" BUTTON_CLOSE: "Kapat" NOTIFICATION_SENT: | Herhangi bir sistem gönderilen klasörĂĽ seçmediniz normalde mesaj gönderildikten sonra "Gönderilen"'ler klasörĂĽne kaydedilir EÄźer gönderilenlerin kaydedilmesini istemiyorsanız lĂĽtfen ayarlardan "Kullanma" seçeneÄźini seçin. NOTIFICATION_DRAFTS: "Herhangi bir sistem taslak klasörĂĽ seçmediniz.\"Taslak\" klasörĂĽ otomatik mesajınızı kaydeder" NOTIFICATION_SPAM: |- Herhangi bir sistem spam klasörĂĽ seçmediniz."Spam" klasörĂĽ spam iletileri barındırır. NOTIFICATION_TRASH: |- Herhangi bir sistem çöp kutusu klasörĂĽ seçmediniz normalde mesaj silindikten sonra "Çöp Kutusu" klasörĂĽne kaydedilir NOTIFICATION_ARCHIVE: "Herhangi bir sistem arĹźiv klasörĂĽ seçmediniz." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Basamaklı doÄźrumalama" LABEL_ENABLE_TWO_FACTOR: "2-Basamaklı DoÄźrulama EtkinleĹźtir" LABEL_TWO_FACTOR_USER: "Kullanıcı Adı" LABEL_TWO_FACTOR_STATUS: "Durum" LABEL_TWO_FACTOR_SECRET: "Gizli" LABEL_TWO_FACTOR_BACKUP_CODES: "Kodları yedekle" BUTTON_CREATE: "Yeni Secret kodu oluĹźtur" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Temizle" BUTTON_LOGOUT: "Oturumu Kapat" BUTTON_DONE: "Tamamla" BUTTON_TEST: "Test" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Gizli kodu göster" BUTTON_HIDE_SECRET: "Gizli kodu gizle" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Yapılandırılmış" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Yapılandırılmamış" TWO_FACTOR_SECRET_DESC: >- AĹźağıda sunulan QR kodu kullanarak Google Ĺžifrematik istemcisi (veya baĹźka TOTP istemci) içine veya elle kod girerek bu bilgi aktarın. TWO_FACTOR_BACKUP_CODES_DESC: >- Google Ĺžifrematik'te aracılığıyla kodları alamıyorsa EÄźer oturum için bir yedek kod kullandım sonra, bunu pasif olacaktır, oturum yedekleme kodlarını kullanabilirsiniz. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "YĂĽkleniyor" LOGIN: "GiriĹź" MAILBOX: "PostaKutusu" SETTINGS: "Ayarlar" COMPOSE: "Yaz" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Dosya çok bĂĽyĂĽk" ERROR_FILE_PARTIALLY_UPLOADED: "Dosya yĂĽklenirken kısmen bilinmeyen hata oluĹźtu" ERROR_NO_FILE_UPLOADED: "Hiç bir dosya yĂĽklenmedi" ERROR_MISSING_TEMP_FOLDER: "Geçici dosya eksik" ERROR_ON_SAVING_FILE: "Bilinmeyen bir dosya yĂĽkleme bir hatası oluĹźtu" ERROR_FILE_TYPE: "Geçersiz dosya tipi" ERROR_UNKNOWN: "Bilinmeyen bir dosya yĂĽkleme bir hatası oluĹźtu" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> Yazi Formati" TEXT_SWITCHER_RICH_FORMATTING: "Zengin yazı formatı" TEXT_SWITCHER_CONFIRM: "Metin biçimlendirme ve görĂĽntĂĽleri kaybolacak. Devam etmek istediÄźinizden emin misiniz?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "KiĹźisel" LABEL_GENERAL_NAME: "Genel" LABEL_CONTACTS_NAME: "KiĹźi Listesi" LABEL_FOLDERS_NAME: "Klasörler" LABEL_ACCOUNTS_NAME: "Hesaplar" LABEL_IDENTITY_NAME: "Kimlik" LABEL_IDENTITIES_NAME: "Kimlikler" LABEL_FILTERS_NAME: "Filtreler" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "GĂĽvenlik" LABEL_SOCIAL_NAME: "Sosyal Media" LABEL_THEMES_NAME: "Temalar" LABEL_CHANGE_PASSWORD_NAME: "Ĺžifre" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Geri" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Kaydet" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Sil" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Kimlik" LABEL_DISPLAY_NAME: "İsim" LABEL_REPLY_TO: "Yanıt-için" LABEL_SIGNATURE: "İmza" LABEL_ADD_SIGNATURE_TO_ALL: "TĂĽm giden iletilere imza ekle" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_CONFIGURE_TWO_FACTOR: "2 AĹźamali GĂĽvenlik Konfikasyonu" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% saat" SETTINGS_GENERAL: LEGEND_GENERAL: "Genel" LABEL_LANGUAGE: "Dil" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "Varsayılan text editör" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "DĂĽz" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "ArayĂĽz animasyonu" LABEL_ANIMATION_FULL: "Tam Ekran" LABEL_ANIMATION_NORMAL: "Normal" LABEL_ANIMATION_NONE: "Yok" LABEL_VIEW_OPTIONS: "Ayarları görĂĽntĂĽle" LABEL_USE_PREVIEW_PANE: "Ă–nizleme bölmesini kullanın" LABEL_USE_CHECKBOXES_IN_LIST: "Listede ekran onay kutularını göster" LABEL_USE_THREADS: "Konuları kullanın" LABEL_REPLY_SAME_FOLDER: "Klasördeki cevapları mesajlarda göster" LABEL_SHOW_IMAGES: "Herzaman gelen maillerdeki resimleri görĂĽntĂĽle." LABEL_SHOW_ANIMATION: "Animasyonu göster" LABEL_MESSAGE_PER_PAGE: "Messages on page" LABEL_NOTIFICATIONS: "Bildirimler" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "Yeni mesajları pop-up ile göster" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Tarayıcınız tarafından engellendi)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "KiĹźi Listesi" LABEL_CONTACTS_AUTOSAVE: "Otomatik olarak adres defterinize alıcıyı ekle" LEGEND_CONTACTS_SYNC: "Uzaktan EĹźleĹźtirme (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Uzaktan eĹźleĹźtirme etkin" LABEL_CONTACTS_SYNC_SERVER: "Sunucu" LABEL_CONTACTS_SYNC_AB_URL: "Adres Defteri URL" LABEL_CONTACTS_SYNC_USER: "Kullanıcı Adı" LABEL_CONTACTS_SYNC_PASSWORD: "Ĺžifre" SETTINGS_THEMES: LEGEND_THEMES: "Temalar" LEGEND_THEMES_CUSTOM: "Ă–zel Tema Yapılandırması" LABEL_CUSTOM_TYPE: "Tip" LABEL_CUSTOM_TYPE_LIGHT: "Aydınlık" LABEL_CUSTOM_TYPE_DARK: "Koyu" LABEL_CUSTOM_BACKGROUND_IMAGE: "Arka Plan" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Arka Plan Resmi YĂĽkleyin(JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Dosya çok bĂĽyĂĽk (1MB+)" ERROR_FILE_TYPE_ERROR: "Geçersiz dosya tipi (sadece JPG ve PNG kabul edilir)" ERROR_UNKNOWN: "Bilinmeyen bir dosya yĂĽkleme bir hatası oluĹźtu" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Google'a baÄźlan" BUTTON_GOOGLE_DISCONNECT: "Google baÄźlantısını kes" MAIN_GOOGLE_DESC: "Google ĂĽzerinden giriĹź etkinleĹźtirdikten sonra, giriĹź ekranında Google dĂĽÄźmesini kullanarak bu hesaba oturum açabilirsiniz." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Facebook'a baÄźlan" BUTTON_FACEBOOK_DISCONNECT: "Facebook baÄźlantısını kes" MAIN_FACEBOOK_DESC: "Facebook ĂĽzerinden giriĹź etkinleĹźtirdikten sonra, giriĹź ekranında Facebook dĂĽÄźmesini kullanarak bu hesaba oturum açabilirsiniz." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Twitter'a baÄźlan" BUTTON_TWITTER_DISCONNECT: "Twitter baÄźlantısını kes" MAIN_TWITTER_DESC: "Twitter ĂĽzerinden giriĹź etkinleĹźtirdikten sonra, giriĹź ekranında Twitter dĂĽÄźmesini kullanarak bu hesaba oturum açabilirsiniz." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Klasör Listesi" BUTTON_CREATE: "Klasör OluĹźtur" BUTTON_SYSTEM: "Sistem Klasörleri" BUTTON_DELETE: "Sil" BUTTON_SUBSCRIBE: "Abone" BUTTON_UNSUBSCRIBE: "Abonelikten Çık" LOADING_PROCESS: "Klasör listesi gĂĽncelleniyor" CREATING_PROCESS: "Klasör oluĹźturuluyor" DELETING_PROCESS: "Klasör siliniyor" RENAMING_PROCESS: "Klasör deÄźiĹźtiriliyor" DELETING_ASK: "Eminmisiniz?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Hesap Listesi" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "Hesap Ekle" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "Sil" LOADING_PROCESS: "Hesap listesi gĂĽncelleniyor" DELETING_ASK: "Eminmisiniz?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Kimlik" LEGEND_IDENTITIES: "Ek kimlikler" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "Ad" LABEL_REPLY_TO: "Yanıt için" LABEL_SIGNATURE: "İmza" LABEL_ADD_SIGNATURE_TO_ALL: "TĂĽm gönderilen mailler imza ekle" BUTTON_ADD_IDENTITY: "Kimlik ekle" BUTTON_DELETE: "Sil" LOADING_PROCESS: "Kimlik listesi gĂĽncelleniyor" DELETING_ASK: "Eminmisiniz?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Ĺžifreyi DeÄźiĹźtir" LABEL_CURRENT_PASSWORD: "Ĺžimdiki Ĺžifreniz" LABEL_NEW_PASSWORD: "Yeni Ĺžifreniz" LABEL_REPEAT_PASSWORD: "Yeni Ĺžifre Tekrar" BUTTON_UPDATE_PASSWORD: "Yeni Ĺžifreyi Kaydet" ERROR_PASSWORD_MISMATCH: "Ĺžifre eĹźleĹźmesi hatalı,lĂĽtfen tekrar deneyiniz" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "OpenPGP Key İçe Aktar" BUTTON_GENERATE_OPEN_PGP_KEYS: "OpenPGP Key OluĹźtur" TITLE_PRIVATE: "Private" TITLE_PUBLIC: "Public" DELETING_ASK: "Eminmisiniz?" GENERATE_ONLY_HTTPS: "HTTPS only" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Klavye kısayolları yardım" TAB_MAILBOX: "Posta Kutusu" TAB_MESSAGE_LIST: "Mesaj Listesi" TAB_MESSAGE_VIEW: "Mesaj görĂĽnĂĽmĂĽ" TAB_COMPOSE: "OluĹźtur" LABEL_OPEN_USER_DROPDOWN: "Kullanıcı açılır pencresini aç" LABEL_REPLY: "Yanıtla" LABEL_REPLY_ALL: "TĂĽmĂĽnĂĽ Yanıtla" LABEL_FORWARD: "Yönlendir" LABEL_FORWARD_MULTIPLY: "Yönlendir (çoklu)" LABEL_HELP: "Yardım" LABEL_CHECK_ALL: "TĂĽm mesajları seç" LABEL_ARCHIVE: "ArĹźiv" LABEL_DELETE: "Sil" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "Taşı" LABEL_READ: "Seçili mesajları oku" LABEL_UNREAD: "Seçili mesajları okuma" LABEL_IMPORTANT: "Seçili iĹźaretli mesajları içe aktar" LABEL_SEARCH: "Arama" LABEL_CANCEL_SEARCH: "Aramayı durdur" LABEL_FULLSCREEN_ENTER: "Tam Ekran (Ă–nizleme bölmesi dĂĽzeni)" LABEL_VIEW_MESSAGE_ENTER: "Mesaj görĂĽnĂĽmĂĽ (Ă–nizleme bölmesi taslağı bulunamadı)" LABEL_SWITCH_TO_MESSAGE: "GörĂĽnen ile seçilen mesajı deÄźiĹźtir" LABEL_SWITCH_TO_FOLDER_LIST: "GörĂĽntĂĽlen ile klasör listesini deÄźiĹźtir" LABEL_FULLSCREEN_TOGGLE: "Tam ekran modunu aç kapat" LABEL_BLOCKQUOTES_TOGGLE: "Alıntılanan metni aç kapat" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Yazdır" LABEL_EXIT_FULLSCREEN: "Tam ekran modundan çık" LABEL_CLOSE_MESSAGE: "Mesajı kapat (önizleme bölmedĂĽzen taslağı bulunamadı)" LABEL_SWITCH_TO_LIST: "GörĂĽntĂĽlenen'den mesaj listesine geri dön" LABEL_OPEN_COMPOSE_POPUP: "Yazma pencresini popup olarak aç" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Kimlik açılır pencresini aç" LABEL_SAVE_MESSAGE: "Mesajı Kaydet" LABEL_SEND_MESSAGE: "Mesajı Gönder" LABEL_CLOSE_COMPOSE: "OluĹźturulanı Kapat" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Public key bulunamadı" NO_PUBLIC_KEYS_FOUND_FOR: "Public key bulunamadı %EMAIL%" NO_PRIVATE_KEY_FOUND: "Private key bulunamadı" NO_PRIVATE_KEY_FOUND_FOR: "Private key bulunamadı %EMAIL%" ADD_A_PUBLICK_KEY: "Add a public key" SELECT_A_PRIVATE_KEY: "Ă–zel anahtari seç" UNVERIFIRED_SIGNATURE: "DoÄźrulanmamış imza" DECRYPTION_ERROR: "OpenPGP çözme hatası" GOOD_SIGNATURE: "Geçerli imza %USER%" PGP_ERROR: "OpenPGP hatası: %ERROR%" SPECIFY_FROM_EMAIL: "LĂĽtfen bir gönderici belirtin" SPECIFY_AT_LEAST_ONE_RECIPIENT: "En az bir alıcı belirtin" NOTIFICATIONS: INVALID_TOKEN: "Geçersiz token" AUTH_ERROR: "Kimlik doÄźrulama baĹźarısız oldu" ACCESS_ERROR: "EriĹźim hatası" CONNECTION_ERROR: "Sunucuya baÄźlanılamadı" CAPTCHA_ERROR: "Yanlış GĂĽvenlik Kodu." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- Bu, sosyal kimliÄźi henĂĽz herhangi bir e-posta hesabı için atanmadı.E-kimlik bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliÄźi etkinleĹźtirmek ekleyin. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- Bu, sosyal kimliÄźi henĂĽz herhangi bir e-posta hesabı için atanmadı.E-kimlik bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliÄźi etkinleĹźtirmek ekleyin. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- Bu, sosyal kimliÄźi henĂĽz herhangi bir e-posta hesabı için atanmadı.E-kimlik bilgilerini kullanarak oturum ve hesap ayarlarında bu özelliÄźi etkinleĹźtirmek ekleyin. DOMAIN_NOT_ALLOWED: "Alan Adına izin verilmemiĹź" ACCOUNT_NOT_ALLOWED: "Hesaba izin verilmemiĹź" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "İki AĹźamalı DoÄźrulama Gerekiyor" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Tİki AĹźamalı DoÄźrulama Hatası" COULD_NOT_SAVE_NEW_PASSWORD: "Yeni Ĺžifre Kaydedilemedi" CURRENT_PASSWORD_INCORRECT: "Ĺžimdiki Ĺźifreniz hatalı" NEW_PASSWORD_SHORT: "Ĺžifreniz çok kısa" NEW_PASSWORD_WEAK: "Ĺžifreniz çok kolay" NEW_PASSWORD_FORBIDDENT: "Ĺžifrenizde geçersiz karekterler bulunuyor" CONTACTS_SYNC_ERROR: "KiĹźi listesi senkronizasyon hatası" CANT_GET_MESSAGE_LIST: "Mesaj listesi alınamadı" CANT_GET_MESSAGE: "Mesaj alınamadı" CANT_DELETE_MESSAGE: "Mesaj silinemedi" CANT_MOVE_MESSAGE: "Mesaj taşınamadı" CANT_SAVE_MESSAGE: "Mesaj kaydedilemedi" CANT_SEND_MESSAGE: "Mesaj gönderilemedi" INVALID_RECIPIENTS: "Geçersiz alıcılar" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Klasör oluĹźturulamadı" CANT_RENAME_FOLDER: "Klasör oluĹźturulamadı" CANT_DELETE_FOLDER: "Klasör silimedi" CANT_DELETE_NON_EMPTY_FOLDER: "BoĹź olmayan dizin silinemedi" CANT_SUBSCRIBE_FOLDER: "Klasöre abone olunamadı" CANT_UNSUBSCRIBE_FOLDER: "Klasör AboneliÄźinden çıkılamadı" CANT_SAVE_SETTINGS: "Ayarlar kaydedilemedi" CANT_SAVE_PLUGIN_SETTINGS: "Ayarlar kaydedilemedi" DOMAIN_ALREADY_EXISTS: "Alanadı bulunuyor" CANT_INSTALL_PACKAGE: "Paket kurulamadı" CANT_DELETE_PACKAGE: "Paket silinemedi" INVALID_PLUGIN_PACKAGE: "Geçersiz eklenti paketi" UNSUPPORTED_PLUGIN_PACKAGE: "Desteklenmeyen eklenti paketi" LICENSING_SERVER_IS_UNAVAILABLE: "Abone sunucusu cevap vermiyor" LICENSING_DOMAIN_EXPIRED: "Bu etki alanı için abonelik sĂĽresi doldu." LICENSING_DOMAIN_BANNED: "Bu etki alanı için abonelik yasaklandı." DEMO_SEND_MESSAGE_ERROR: "GĂĽvenlik amacıyla, bu demo hesabı harici e-posta adreslerine mesaj göndermek için izin verilmez!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "Hesap zaten var" MAIL_SERVER_ERROR: "Posta sunucusuna eriĹźirken bir hata oluĹźtu" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Bilinmeyen Hata" STATIC: BACK_LINK: "Yenile" DOMAIN_LIST_DESC: "Alanadı webmail listesi eriĹźime izini." PHP_EXSTENSIONS_ERROR_DESC: "Gerekli PHP eklentileri PHP yapılandırmasında mevcut deÄźildir!" PHP_VERSION_ERROR_DESC: "PHP sĂĽrĂĽmĂĽnĂĽz (%VERSION%) en az php 5.3.0 sĂĽrĂĽmĂĽ gerekli!" NO_SCRIPT_TITLE: "JavaScript bu uygulama için gereklidir." NO_SCRIPT_DESC: | JavaScript desteÄźi tarayıcınızda mevcut deÄźil. Tarayıcı ayarlarında JavaScript desteÄźini etkinleĹźtirin ve yeniden deneyin. NO_COOKIE_TITLE: "Çerezler desteÄźi bu uygulama için gerekli." NO_COOKIE_DESC: | Çerezler destek tarayıcınızda mevcut deÄźil. Tarayıcı ayarlarında Cookie desteÄźi etkinleĹźtirin ve yeniden deneyin. BAD_BROWSER_TITLE: "Tarayıcınız çok eski." BAD_BROWSER_DESC: | Uygulamanın tĂĽm özelliklerini kullanmak için, Bu tarayıcılardan birini indirmek ve yĂĽkleyin: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/uk_UA.yml000066400000000000000000001175731361462701300262210ustar00rootroot00000000000000uk_UA: LOGIN: LABEL_EMAIL: "ПоŃта" LABEL_LOGIN: "Логін" LABEL_PASSWORD: "Пароль" LABEL_SIGN_ME: "Запам'ятати мене" LABEL_VERIFICATION_CODE: "Код підтвердження" LABEL_DONT_ASK_VERIFICATION_CODE: "Не питати код на протязі 2-Ń… тижнів" BUTTON_SIGN_IN: "Увійти" TITLE_SIGN_IN_GOOGLE: "Увійти, викориŃтовŃючи Google" TITLE_SIGN_IN_FACEBOOK: "Увійти, викориŃтовŃючи Facebook" TITLE_SIGN_IN_TWITTER: "Увійти, викориŃтовŃючи Twitter" LABEL_FORGOT_PASSWORD: "ЗабŃли пароль?" LABEL_REGISTRATION: "РеєŃтрація" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Додати ще акаŃнт" BUTTON_SETTINGS: "НалаŃŃ‚Ńвання" BUTTON_HELP: "Допомога" BUTTON_LOGOUT: "Вийти" MOBILE: BUTTON_MOBILE_VERSION: "Мобільна верŃŃ–ŃŹ" BUTTON_DESKTOP_VERSION: "Повна верŃŃ–ŃŹ" SEARCH: MAIN_INPUT_PLACEHOLDER: "ПоŃŃĐş лиŃтів" TITLE_ADV: "РозŃирений поŃŃĐş лиŃтів" LABEL_ADV_FROM: "Đ’Ń–Đ´" LABEL_ADV_TO: "КомŃ" LABEL_ADV_SUBJECT: "Тема" LABEL_ADV_TEXT: "ТекŃŃ‚" LABEL_ADV_HAS_ATTACHMENT: "Đ— файлами" LABEL_ADV_HAS_ATTACHMENTS: "Đ— файлами" LABEL_ADV_FLAGGED: "Відмічені" LABEL_ADV_UNSEEN: "Непрочитані" LABEL_ADV_DATE: "Дата" LABEL_ADV_DATE_ALL: "За веŃŃŚ чаŃ" LABEL_ADV_DATE_3_DAYS: "За три дні" LABEL_ADV_DATE_7_DAYS: "За тиждень" LABEL_ADV_DATE_MONTH: "За ĐĽŃ–Ńяць" LABEL_ADV_DATE_3_MONTHS: "За 3 ĐĽŃ–Ńяці" LABEL_ADV_DATE_6_MONTHS: "За піврокŃ" LABEL_ADV_DATE_YEAR: "За рік" BUTTON_ADV_SEARCH: "ШŃкати" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "Закрити (Esc)" LOADING: "Завантаження..." GALLERY_PREV: "Назад (Стрілка â†)" GALLERY_NEXT: "Вперед (Стрілка →)" GALLERY_COUNTER: "%curr% Đ· %total%" IMAGE_ERROR: "Зображення не завантажилоŃŃŹ." AJAX_ERROR: "Дані не завантажилиŃŃŚ." FOLDER_LIST: BUTTON_COMPOSE: "НапиŃати" BUTTON_CONTACTS: "Контакти" INBOX_NAME: "Вхідні" SENT_NAME: "Вихідні" DRAFTS_NAME: "Чорновики" SPAM_NAME: "Спам" TRASH_NAME: "КоŃик" ARCHIVE_NAME: "Đрхів" QUOTA: TITLE: "ДиŃкова квота" MESSAGE_LIST: BUTTON_RELOAD: "Оновити ŃпиŃок лиŃтів" BUTTON_MOVE_TO: "ПереміŃтити" BUTTON_DELETE: "Видалити" BUTTON_ARCHIVE: "ĐрхівŃвати" BUTTON_SPAM: "Đ’ Ńпам" BUTTON_NOT_SPAM: "Не Ńпам" BUTTON_EMPTY_FOLDER: "ОчиŃтити вŃŃŽ папкŃ" BUTTON_MULTY_FORWARD: "ПереŃлати ŃŹĐş вкладення" BUTTON_DELETE_WITHOUT_MOVE: "Видалити повз коŃик" BUTTON_MORE: "Ще" MENU_SET_SEEN: "Відмітити ŃŹĐş прочитане" MENU_SET_ALL_SEEN: "Відмітити вŃŃ– ŃŹĐş прочитані" MENU_UNSET_SEEN: "Відмітити ŃŹĐş непрочитане" MENU_SET_FLAG: "Đ’Ńтановити флаг" MENU_UNSET_FLAG: "Зняти флаг" MENU_SELECT_ALL: "Đ’Ńе" MENU_SELECT_NONE: "Жодного" MENU_SELECT_INVERT: "ІнвертŃвати" MENU_SELECT_UNSEEN: "Непрочитані" MENU_SELECT_SEEN: "Прочитані" MENU_SELECT_FLAGGED: "Відмічені" MENU_SELECT_UNFLAGGED: "Без поміток" EMPTY_LIST: "Đ’ папці немає лиŃтів." EMPTY_SEARCH_LIST: "ЛиŃти не знайдено." SEARCH_RESULT_FOR: "РезŃльтат поŃŃĐşŃ \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "повернŃтиŃŃŚ Đ´Đľ ŃпиŃĐşŃ Đ»Đ¸Ńтів" LIST_LOADING: "Завантаження" EMPTY_SUBJECT_TEXT: "(Без теми)" PUT_MESSAGE_HERE: "Киньте повідомлення Ńюди, щоб подивитиŃŃŹ його в ŃпиŃĐşŃ" TODAY_AT: "Ńьогодні в %TIME%" YESTERDAY_AT: "вчора в %TIME%" SEARCH_PLACEHOLDER: "ПоŃŃĐş лиŃтів" NEW_MESSAGE_NOTIFICATION: "ĐŁ Đ˛Đ°Ń %COUNT% нових повідомлень!" QUOTA_SIZE: "ВикориŃтано %SIZE% (%PROC%%) Đ· %LIMIT%" MESSAGE: BUTTON_EDIT: "РедагŃвати" BUTTON_BACK: "Назад" BUTTON_CLOSE: "Закрити" BUTTON_DELETE: "Видалити" BUTTON_ARCHIVE: "ĐрхівŃвати" BUTTON_SPAM: "Đ’ Ńпам" BUTTON_NOT_SPAM: "Не Ńпам" BUTTON_MOVE_TO: "ПереміŃтити" BUTTON_MORE: "Ще" BUTTON_REPLY: "ВідповіŃти на ЛиŃта" BUTTON_REPLY_ALL: "ВідповіŃти Đ’ŃŃ–ĐĽ" BUTTON_FORWARD: "ПереŃлати" BUTTON_FORWARD_AS_ATTACHMENT: "ПереŃлати ŃŹĐş файл" BUTTON_EDIT_AS_NEW: "РедагŃвати ŃŹĐş нове" BUTTON_SHOW_IMAGES: "Показати зовніŃні зображення в лиŃті" BUTTON_NOTIFY_READ_RECEIPT: "СповіŃтити відправника про прочитання цього повідомлення." BUTTON_IN_NEW_WINDOW: "Đ’ ĐľĐşŃ€ĐµĐĽĐľĐĽŃ Đ˛Ń–ĐşĐ˝Ń–" BUTTON_THREAD_LIST: "ЛиŃŃ‚Ńвання" BUTTON_THREAD_PREV: "Попереднє" BUTTON_THREAD_NEXT: "НаŃŃ‚Ńпне" BUTTON_THREAD_MORE: "ще лиŃти" MENU_HEADERS: "ПодивитиŃŃŹ заголовки" MENU_VIEW_ORIGINAL: "ПодивитиŃŃŹ оригінал" MENU_DOWNLOAD_ORIGINAL: "Завантажити ŃŹĐş .eml файл" MENU_FILTER_SIMILAR: "ФільтрŃвати Ńхожі" MENU_PRINT: "НадрŃĐşŃвати" EMPTY_SUBJECT_TEXT: "(Без теми)" LABEL_SUBJECT: "Тема" LABEL_DATE: "Дата" LABEL_FROM: "Đ’Ń–Đ´" LABEL_FROM_SHORT: "від" LABEL_TO: "КомŃ" LABEL_TO_SHORT: "комŃ" LABEL_CC: "Копія" LABEL_BCC: "Прихована" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "Đ’Ń–Đ´" PRINT_LABEL_TO: "КомŃ" PRINT_LABEL_CC: "Копія" PRINT_LABEL_BCC: "Прихована" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "Дата" PRINT_LABEL_SUBJECT: "Тема" PRINT_LABEL_ATTACHMENTS: "Файли" MESSAGE_LOADING: "Завантаження" MESSAGE_VIEW_DESC: "Виберіть повідомлення для переглядŃ." PGP_PASSWORD_INPUT_PLACEHOLDER: "Пароль" PGP_SIGNED_MESSAGE_DESC: "OpenPGP підпиŃане повідомлення (натиŃніть, щоб підтвердити)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP Ńифроване повідомлення (натиŃніть, щоб розŃифрŃвати)" LINK_DOWNLOAD_AS_ZIP: "Завантажити ŃŹĐş zip" LINK_SAVE_TO_OWNCLOUD: "Зберегти в ownCloud" LINK_SAVE_TO_DROPBOX: "Зберегти в Dropbox" READ_RECEIPT: SUBJECT: "Сповіщення про прочитання цього повідомлення - %SUBJECT%" BODY: | Це Ńповіщення про прочитання для повідомлення, яке ви надіŃлали в адреŃŃ %READ-RECEIPT%. Примітка: Це Ńповіщення про прочитання означає лиŃе, що повідомлення бŃло відображено на маŃĐ¸Đ˝Ń ĐľŃ‚Ń€Đ¸ĐĽŃвача. Воно не гарантŃŃ”, що отримŃвач прочитав чи зрозŃмів Đ·ĐĽŃ–ŃŃ‚ повідомлення. SUGGESTIONS: SEARCHING_DESC: "ПоŃŃĐş..." CONTACTS: LEGEND_CONTACTS: "Контакти" SEARCH_INPUT_PLACEHOLDER: "ПоŃŃĐş контактів" BUTTON_ADD_CONTACT: "Додати контакт" BUTTON_CREATE_CONTACT: "Зберегти" BUTTON_UPDATE_CONTACT: "Оновити" BUTTON_IMPORT: "Імпорт (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "ЕкŃпорт (vcf, vCard)" BUTTON_EXPORT_CSV: "ЕкŃпорт (csv)" ERROR_IMPORT_FILE: "Помилка Ń–ĐĽĐżĐľŃ€Ń‚Ń (Неправильний формат файлŃ)" LIST_LOADING: "Завантаження" EMPTY_LIST: "Немає контактів" EMPTY_SEARCH: "Контакти не знайдено" CLEAR_SEARCH: "ОчиŃтити поŃŃĐş" CONTACT_VIEW_DESC: "Виберіть контакт для переглядŃ." LABEL_DISPLAY_NAME: "Повне Ń–ĐĽ'ŃŹ" LABEL_EMAIL: "Електронна поŃта" LABEL_PHONE: "Телефон" LABEL_WEB: "Сайт" LABEL_BIRTHDAY: "День нарождення" LINK_ADD_EMAIL: "Додайте адреŃŃ ĐµĐ»ĐµĐşŃ‚Ń€ĐľĐ˝Đ˝ĐľŃ— поŃти" LINK_ADD_PHONE: "Додайте телефон" LINK_BIRTHDAY: "День народження" PLACEHOLDER_ENTER_DISPLAY_NAME: "Введіть повне Ń–ĐĽ'ŃŹ" PLACEHOLDER_ENTER_LAST_NAME: "Введіть Ń–ĐĽ'ŃŹ" PLACEHOLDER_ENTER_FIRST_NAME: "Введіть прізвище" PLACEHOLDER_ENTER_NICK_NAME: "Введіть нік" LABEL_READ_ONLY: "Тільки читання" LABEL_SHARE: "ПоділитиŃŃŹ" ADD_MENU_LABEL: "Додати" ADD_MENU_NICKNAME: "Нік" ADD_MENU_NOTES: "Примітки" ADD_MENU_EMAIL: "ПоŃŃ‚Ń" ADD_MENU_PHONE: "Телефон" ADD_MENU_URL: "Сайт" ADD_MENU_ADDRESS: "ĐдреŃа" ADD_MENU_BIRTHDAY: "День народження" ADD_MENU_TAGS: "Теги" BUTTON_SHARE_NONE: "Відмінити" BUTTON_SHARE_ALL: "Đ’ŃŃ–ĐĽ" BUTTON_SYNC: "Синхронизація (CardDAV)" COMPOSE: TITLE_FROM: "Đ’Ń–Đ´" TITLE_TO: "КомŃ" TITLE_CC: "Копія" TITLE_BCC: "Прихована" TITLE_REPLY_TO: "ВідповіŃти на" TITLE_SUBJECT: "Тема" LINK_SHOW_INPUTS: "Показати вŃŃ– поля" BUTTON_SEND: "НадіŃлати" BUTTON_SAVE: "Зберегти" BUTTON_DELETE: "Видалити" BUTTON_CANCEL: "Відмінити" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "Збережено в %TIME%" SAVED_ERROR_ON_SEND: "Повідомлення бŃло надіŃлано, але не збережено" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "Додати файли" ATTACH_DROP_FILES_DESC: "ПоміŃтити файли Ńюди" ATTACH_ITEM_CANCEL: "Відмінити" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% напиŃав" FORWARD_MESSAGE_TOP_TITLE: "-------- ПереŃлане повідомлення -------" FORWARD_MESSAGE_TOP_FROM: "Đ’Ń–Đ´" FORWARD_MESSAGE_TOP_TO: "КомŃ" FORWARD_MESSAGE_TOP_CC: "Копія" FORWARD_MESSAGE_TOP_SENT: "НадіŃлано" FORWARD_MESSAGE_TOP_SUBJECT: "Тема" EMPTY_TO_ERROR_DESC: "Вкажіть ŃŹĐş мінімŃĐĽ одного отримŃвача" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" BUTTON_REQUEST_READ_RECEIPT: "Запит про прочитання лиŃта" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Закрити" POPUPS_ASK: BUTTON_YES: "Так" BUTTON_NO: "Ні" DESC_WANT_CLOSE_THIS_WINDOW: "Ви впевнені, що хочете закрити це вікно?" DESC_WANT_DELETE_MESSAGES: "Ви впевнені, що хочете видалити повідомлення?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Виберіть мовŃ" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Додати ще акаŃнт?" BUTTON_ADD_ACCOUNT: "Додати" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "Додати Профіль?" TITLE_UPDATE_IDENTITY: "Оновити Профіль?" BUTTON_ADD_IDENTITY: "Додати" BUTTON_UPDATE_IDENTITY: "Оновити" LABEL_EMAIL: "ПоŃта" LABEL_NAME: "Ім'ŃŹ" LABEL_REPLY_TO: "ВідповіŃти на" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "Прихована" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Створити текŃ?" LABEL_NAME: "Ім'ŃŹ теки" LABEL_PARENT: "БатьківŃька тека" BUTTON_CREATE: "Створити" BUTTON_CANCEL: "Відмінити" BUTTON_CLOSE: "Закрити" TITLE_CREATING_PROCESS: "Створення теки" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "ОчиŃтити Ń‚ĐµĐşŃ Đ˛Ń–Đ´ лиŃтів?" BUTTON_CLEAR: "ОчиŃтити" BUTTON_CANCEL: "Відмінити" BUTTON_CLOSE: "Закрити" DANGER_DESC_WARNING: "Увага!" DANGER_DESC_HTML_1: "Ця Đ´Ń–ŃŹ призведе Đ´Đľ повного видалення вŃŃ–Ń… лиŃтів Đ· теки %FOLDER%." DANGER_DESC_HTML_2: "ПіŃля ĐżĐľŃ‡Đ°Ń‚ĐşŃ ĐľŃ‡Đ¸Ń‰ĐµĐ˝Đ˝ŃŹ, ĐżŃ€ĐľŃ†ĐµŃ Đ˝ĐµĐĽĐľĐ¶Đ»Đ¸Đ˛Đľ бŃде Đ·Ńпинити чи відмінити." TITLE_CLEARING_PROCESS: "Очищення теки..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Імпорт OpenPGP ключа" BUTTON_IMPORT_OPEN_PGP_KEY: "Імпорт" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "Перегляд OpenPGP ключа" BUTTON_SELECT: "Вибрати" BUTTON_CLOSE: "Закрити" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Генерація OpenPGP ключа" LABEL_EMAIL: "ПоŃта" LABEL_NAME: "Ім'ŃŹ" LABEL_PASSWORD: "Пароль" LABEL_KEY_BIT_LENGTH: "Довжина ключа" BUTTON_GENERATE_OPEN_PGP_KEYS: "Створити" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP ĐżŃ–Đ´ĐżĐ¸Ń Ń– ŃифрŃвання" LABEL_SIGN: "ПідпиŃ" LABEL_ENCRYPT: "ШифрŃвання" LABEL_PASSWORD: "Пароль" BUTTON_SIGN: "ПідпиŃ" BUTTON_ENCRYPT: "ШифрŃвання" BUTTON_SIGN_AND_ENCRYPT: "ĐźŃ–Đ´ĐżĐ¸Ń Đ¸ ŃифрŃвання" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Пароль" BUTTON_DECRYPT: "ДеŃифрŃвати" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "ТеŃŃ‚ двофакторної верифікації" LABEL_CODE: "Код" BUTTON_TEST: "ТеŃŃ‚" POPUPS_FILTER: TITLE_CREATE_FILTER: "Створити фільтер?" TITLE_EDIT_FILTER: "Оновити фільтер?" FILTER_NAME: "ĐĐĽ'ŃŹ" LEGEND_CONDITIONS: "Умови" LEGEND_ACTIONS: "Дії" BUTTON_DONE: "Зроблено" BUTTON_ADD_CONDITION: "Додати ŃмовŃ" SELECT_ACTION_NONE: "Нічого" SELECT_ACTION_MOVE_TO: "ПереміŃтити в" SELECT_ACTION_FORWARD_TO: "ПереŃлати Đ´Đľ" SELECT_ACTION_REJECT: "Відклонити" SELECT_ACTION_VACATION_MESSAGE: "Повідомлення про відпŃŃткŃ" SELECT_ACTION_DISCARD: "Відклонити" SELECT_FIELD_FROM: "Đ’Ń–Đ´" SELECT_FIELD_RECIPIENTS: "ОтримŃвачі (To or CC)" SELECT_FIELD_SUBJECT: "Тема" SELECT_FIELD_HEADER: "Заголовок" SELECT_FIELD_SIZE: "Розмір" SELECT_TYPE_CONTAINS: "МіŃтить" SELECT_TYPE_NOT_CONTAINS: "Не ĐĽŃ–Ńтить" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Дорівнює" SELECT_TYPE_NOT_EQUAL_TO: "Не дорівнює" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching any of the following rules" SELECT_MATCH_ALL: "Matching all of the following rules" MARK_AS_READ_LABEL: "Mark as read" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Тема (не обов'язково)" VACATION_MESSAGE_LABEL: "Повідомлення" VACATION_RECIPIENTS_LABEL: "ОтримŃвачі (розділяти комами)" REJECT_MESSAGE_LABEL: "Відклонити повідомлення" ALL_INCOMING_MESSAGES_DESC: "Đ’ŃŃ– повідомлення, що надійŃли" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Виберіть ŃиŃтемні теки" SELECT_CHOOSE_ONE: "Ще не вибрано" SELECT_UNUSE_NAME: "Не викориŃтовŃвати" LABEL_SENT: "Вихідні" LABEL_DRAFTS: "Чорновики" LABEL_SPAM: "Спам" LABEL_TRASH: "Видалені" LABEL_ARCHIVE: "Đрхів" BUTTON_CANCEL: "Відмінити" BUTTON_CLOSE: "Закрити" NOTIFICATION_SENT: | Ви ще не обрали ŃиŃŃ‚ĐµĐĽĐ˝Ń Ń‚ĐµĐşŃ "Вихідні", в ŃŹĐşŃ ŃкладаютьŃŃŹ вŃŃ– повідомлення піŃле надŃилання. Якщо ви не хочете зберігати вихідні лиŃти, бŃĐ´ŃŚ лаŃка, виберіть ĐżŃнкт "Не викориŃтовŃвати". NOTIFICATION_DRAFTS: "Ви ще не обрали ŃиŃŃ‚ĐµĐĽĐ˝Ń Ń‚ĐµĐşŃ \"Чорновики\", в ŃŹĐşŃ ŃкладаютьŃŃŹ вŃŃ– збережені повідомлення." NOTIFICATION_SPAM: | Ви ще не обрали ŃиŃŃ‚ĐµĐĽĐ˝Ń Ń‚ĐµĐşŃ "Спам", в ŃŹĐşŃ ŃкладаютьŃŃŹ вŃŃ– Ńпам повідомлення. Якщо ви не хочете видаляти лиŃти одразŃ, бŃĐ´ŃŚ лаŃка, виберіть ĐżŃнкт "Не викориŃтовŃвати". NOTIFICATION_TRASH: | Ви ще не обрали ŃиŃŃ‚ĐµĐĽĐ˝Ń Ń‚ĐµĐşŃ "Удаленные", в ŃŹĐşŃ ŃкладаютьŃŃŹ вŃŃ– повідомлення піŃля видалення. Якщо ви не хочете видаляти лиŃти одразŃ, бŃĐ´ŃŚ лаŃка, виберіть ĐżŃнкт "Не викориŃтовŃвати". NOTIFICATION_ARCHIVE: "Ви ще не обрали ŃиŃŃ‚ĐµĐĽĐ˝Ń Ń‚ĐµĐşŃ \"Đрхив\", в ŃŹĐşŃ ŃкладаютьŃŃŹ вŃŃ– повідомлення піŃля архівації." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Двофакторна верификація" LABEL_ENABLE_TWO_FACTOR: "УвімкнŃти Đ´Đ˛ĐľŃ„Đ°ĐşŃ‚ĐľŃ€Đ˝Ń Đ˛ĐµŃ€Đ¸Ń„Ń–ĐşĐ°Ń†Ń–ŃŽ" LABEL_TWO_FACTOR_USER: "КориŃŃ‚Ńвач" LABEL_TWO_FACTOR_STATUS: "СтатŃŃ" LABEL_TWO_FACTOR_SECRET: "Секретний ключ" LABEL_TWO_FACTOR_BACKUP_CODES: "Резервні коди" BUTTON_CREATE: "Створити новий Ńекретний ключ" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "ОчиŃтити" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "ТеŃŃ‚" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Показати Ńекретний ключ" BUTTON_HIDE_SECRET: "Приховати Ńекретний ключ" TWO_FACTOR_REQUIRE_DESC: "Đ’Đ°Ń ĐľĐ±Đ»Ń–ĐşĐľĐ˛Đ¸Đą Đ·Đ°ĐżĐ¸Ń Đ˛Đ¸ĐĽĐ°ĐłĐ°Ń” 2-Ń„Đ°ĐşŃ‚ĐľŃ€Đ˝Ń Ń–Đ´ĐµĐ˝Ń‚Đ¸Ń„Ń–ĐşĐ°Ń†Ń–ŃŽ" TWO_FACTOR_SECRET_CONFIGURED_DESC: "НалаŃтований" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Не налаŃтований" TWO_FACTOR_SECRET_DESC: >- ВикориŃтовŃйте цю інформацію для налаŃŃ‚Ńвання Google Authenticator ĐşĐ»Đ¸ĐµĐ˝Ń‚Ń (чи Ń–Đ˝Ńого TOTP клиентŃ) за допомогою прикладеного QR-кодŃ, чи врŃчнŃ. TWO_FACTOR_BACKUP_CODES_DESC: >- Якщо Ви не можете отримати коди через Google Authenticator, ви можете викориŃтовŃвати резервні коди, щоб Ńвійти. ПіŃля того ŃŹĐş Ви викориŃтали резервний код для Đ˛Ń…ĐľĐ´Ń Đ˛ ŃиŃтемŃ, він Ńтає неактивним. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Ви не можете змінити ці налаŃŃ‚Ńвання Đ´Đľ теŃŃ‚Ń." TITLES: LOADING: "Завантаження" LOGIN: "Đ’Ń…Ń–Đ´" MAILBOX: "ПоŃта" SETTINGS: "НалаŃŃ‚Ńвання" COMPOSE: "НапиŃати лиŃта" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Файл надто великий" ERROR_FILE_PARTIALLY_UPLOADED: "Файл не завантаживŃŃŹ повніŃтю" ERROR_NO_FILE_UPLOADED: "Файл не бŃло завантажено" ERROR_MISSING_TEMP_FOLDER: "Помилка при збереженні файлŃ" ERROR_ON_SAVING_FILE: "Помилка при збереженні файлŃ" ERROR_FILE_TYPE: "Неправильний тип файлŃ" ERROR_UNKNOWN: "Помилка завантаження файлŃ" EDITOR: TEXT_SWITCHER_RICH_FORMATTING: "Форматований текŃŃ‚" TEXT_SWITCHER_CONFIRM: "ФорматŃвання текŃŃ‚Ń Ń– зображень бŃĐ´Ńть втрачені. Ви впевнені, що хочете продовжити?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "ПерŃональні" LABEL_GENERAL_NAME: "ĐžŃновні" LABEL_CONTACTS_NAME: "Контакти" LABEL_FOLDERS_NAME: "Теки" LABEL_ACCOUNTS_NAME: "ĐкаŃнти" LABEL_IDENTITY_NAME: "Профіль" LABEL_IDENTITIES_NAME: "Профілі" LABEL_FILTERS_NAME: "Фильтры" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "Безпека" LABEL_SOCIAL_NAME: "Соціальні" LABEL_THEMES_NAME: "Теми" LABEL_CHANGE_PASSWORD_NAME: "Пароль" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Назад" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Save" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Delete" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Повідомлення про відпŃŃткŃ" SUBNAME_DISCARD: "Відклонити" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Ви впевнені?" CHACHES_NEED_TO_BE_SAVED_DESC: "Ці зміни необхідно зберегти на Ńервер." SETTINGS_IDENTITY: LEGEND_IDENTITY: "НалаŃŃ‚Ńвання профілю" LABEL_DISPLAY_NAME: "Ім'ŃŹ" LABEL_REPLY_TO: "Відповідати на" LABEL_SIGNATURE: "ПідпиŃ" LABEL_ADD_SIGNATURE_TO_ALL: "Додавати Đ’Đ°Ń ĐżŃ–Đ´ĐżĐ¸Ń Đ´Đľ вŃŃ–Ń… вихідних повідомлень" SETTINGS_SECURITY: LEGEND_SECURITY: "Безпека" LABEL_CONFIGURE_TWO_FACTOR: "НалаŃŃ‚Ńвати 2-Ń„Đ°ĐşŃ‚ĐľŃ€Đ˝Ń Đ˛ĐµŃ€Đ¸Ń„Ń–ĐşĐ°Ń†Ń–ŃŽ" LABEL_AUTOLOGOUT: "Đвтовихід" AUTOLOGIN_NEVER_OPTION_NAME: "Ніколи" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "ĐžŃновні налаŃŃ‚Ńвання" LABEL_LANGUAGE: "Мова" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "Редактор текŃŃ‚Ń Đ·Đ° змовчŃванням" LABEL_EDITOR_HTML: "Форматований" LABEL_EDITOR_PLAIN: "ПроŃтий" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "Đнімація інтерфейŃŃ" LABEL_ANIMATION_FULL: "Повна" LABEL_ANIMATION_NORMAL: "Нормальна" LABEL_ANIMATION_NONE: "Đ’Ń–Đ´ŃŃтня" LABEL_VIEW_OPTIONS: "Відображення" LABEL_USE_PREVIEW_PANE: "ВикориŃтовŃвати трьохколонний режим відображення" LABEL_USE_CHECKBOXES_IN_LIST: "ПоказŃвати чекбокŃи Ń ŃпиŃках" LABEL_USE_THREADS: "Згортати лиŃти Ń Đ»Đ¸ŃŃ‚Ńваннях" LABEL_REPLY_SAME_FOLDER: "Поміщати відповіді в Ń‚Ń Đ¶ текŃ, де знаходитьŃŃŹ оригінал" LABEL_SHOW_IMAGES: "ПоказŃвати зовніŃні зображення в тілі лиŃта без попередження" LABEL_SHOW_ANIMATION: "ВикориŃтовŃвати анімацію" LABEL_MESSAGE_PER_PAGE: "Повідомлень на одній Ńторінці" LABEL_NOTIFICATIONS: "Сповіщення" LABEL_SOUND_NOTIFICATION: "ЗвŃкове Ńповіщення" LABEL_CHROME_NOTIFICATION_DESC: "ПоказŃвати Ńповіщення про нові повідомлення Ń ĐżŃ–Đ´ĐşĐ°Đ·ĐşĐ°Ń…" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Заблоковано браŃзером)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Контакти" LABEL_CONTACTS_AUTOSAVE: "Đвтоматично додавати отримŃвачів Ń Đ°Đ´Ń€ĐµŃĐ˝Ń ĐşĐ˝Đ¸ĐłŃ" LEGEND_CONTACTS_SYNC: "Синхронізація (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "УвімкнŃти Ńинхронизацію" LABEL_CONTACTS_SYNC_SERVER: "Сервер" LABEL_CONTACTS_SYNC_AB_URL: "ĐдреŃна книга (URL)" LABEL_CONTACTS_SYNC_USER: "КориŃŃ‚Ńвач" LABEL_CONTACTS_SYNC_PASSWORD: "Пароль" SETTINGS_THEMES: LEGEND_THEMES: "Теми Оформлення" LEGEND_THEMES_CUSTOM: "НалаŃŃ‚Ńвання КориŃŃ‚Ńвацької Теми" LABEL_CUSTOM_TYPE: "Тип Теми" LABEL_CUSTOM_TYPE_LIGHT: "Світла" LABEL_CUSTOM_TYPE_DARK: "Темна" LABEL_CUSTOM_BACKGROUND_IMAGE: "Картинка на фоні" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Завантажити Ń„ĐľĐ˝ĐľĐ˛Ń ĐşĐ°Ń€Ń‚Đ¸Đ˝ĐşŃ (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Файл надто великий" ERROR_FILE_TYPE_ERROR: "Невірний тип Ń„Đ°ĐąĐ»Ń (тільки JPG и PNG)" ERROR_UNKNOWN: "Помилка завантаження файлŃ" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Підключити Google акаŃнт" BUTTON_GOOGLE_DISCONNECT: "Відключити Google акаŃнт" MAIN_GOOGLE_DESC: "ПіŃля підключення Đ´Đľ Google ви зможете залогінітиŃŃŹ в цей акаŃнт, викориŃтовŃючи ĐşĐ˝ĐľĐżĐşŃ Google на екрані логінŃ." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Підключити Facebook акаŃнт" BUTTON_FACEBOOK_DISCONNECT: "Відключити Facebook акаŃнт" MAIN_FACEBOOK_DESC: "ПіŃля підключення Đ´Đľ Facebook ви зможете залогінітиŃŃŹ в цей акаŃнт, викориŃтовŃючи ĐşĐ˝ĐľĐżĐşŃ Facebook на екрані логінŃ." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Підключити Twitter акаŃнт" BUTTON_TWITTER_DISCONNECT: "Відключити Twitter акаŃнт" MAIN_TWITTER_DESC: "ПіŃля підключення Đ´Đľ Twitter ви зможете залогінітиŃŃŹ в цей акаŃнт, викориŃтовŃючи ĐşĐ˝ĐľĐżĐşŃ Twitter на екрані логінŃ." SETTINGS_FOLDERS: LEGEND_FOLDERS: "СпиŃок Тек" BUTTON_CREATE: "Створити ТекŃ" BUTTON_SYSTEM: "СиŃтемні теки" BUTTON_DELETE: "Видалити" BUTTON_SUBSCRIBE: "ПідпиŃатиŃŃŹ" BUTTON_UNSUBSCRIBE: "ВідпиŃатиŃŃŹ" LOADING_PROCESS: "Оновлення ŃпиŃĐşŃ Ń‚ĐµĐş" CREATING_PROCESS: "Створення теки" DELETING_PROCESS: "Видалення теки" RENAMING_PROCESS: "ПерейменŃвання теки" DELETING_ASK: "Впевнені?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Видалити текŃ" HELP_SHOW_HIDE_FOLDER: "Відобразити/приховати текŃ" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "СпиŃок акаŃнтів" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "Додати ще акаŃнт" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "Видалити" LOADING_PROCESS: "Оновлення ŃпиŃĐşŃ Đ°ĐşĐ°Ńнтів" DELETING_ASK: "Впевнені?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "НалаŃŃ‚Ńвання ĐľŃновного профілю" LEGEND_IDENTITIES: "Додаткові профілі" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "Ім'ŃŹ" LABEL_REPLY_TO: "Відповідати на" LABEL_SIGNATURE: "ПідпиŃ" LABEL_ADD_SIGNATURE_TO_ALL: "Додавати Đ’Đ°Ń ĐżŃ–Đ´ĐżĐ¸Ń Đ´Đľ вŃŃ–Ń… вихідних повідомлень" BUTTON_ADD_IDENTITY: "Додати профіль" BUTTON_DELETE: "Видалити" LOADING_PROCESS: "Оновлення ŃпиŃĐşŃ ĐżŃ€ĐľŃ„Ń–Đ»Ń–Đ˛" DELETING_ASK: "Впевнені?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Змінити Пароль" LABEL_CURRENT_PASSWORD: "Порочний пароль" LABEL_NEW_PASSWORD: "Новий пароль" LABEL_REPEAT_PASSWORD: "Повторити" BUTTON_UPDATE_PASSWORD: "Đ’Ńтановити Новий Пароль" ERROR_PASSWORD_MISMATCH: "Паролі не Ńпівпадають, ŃпробŃйте ще раз" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "ІмпортŃвати OpenPGP ключ" BUTTON_GENERATE_OPEN_PGP_KEYS: "Новий OpenPGP ключ" TITLE_PRIVATE: "Приватний" TITLE_PUBLIC: "ĐźŃблічний" DELETING_ASK: "Впевнені?" GENERATE_ONLY_HTTPS: "тільки HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "СполŃчення клавіŃ" TAB_MAILBOX: "ПоŃта" TAB_MESSAGE_LIST: "СпиŃок повідомлень" TAB_MESSAGE_VIEW: "Перегляд повідомлень" TAB_COMPOSE: "НапиŃанні повідомлення" LABEL_OPEN_USER_DROPDOWN: "Відкрити випадаючий ŃпиŃок кориŃŃ‚Ńвача" LABEL_REPLY: "ВідповіŃти" LABEL_REPLY_ALL: "ВідповіŃти вŃŃ–ĐĽ" LABEL_FORWARD: "ПереŃлати" LABEL_FORWARD_MULTIPLY: "ПереŃлати вŃŃ– вибрані повідомлення" LABEL_HELP: "Допомога" LABEL_CHECK_ALL: "Вибрати вŃŃ– повідомлення" LABEL_ARCHIVE: "ĐрхівŃвати" LABEL_DELETE: "Видалити" LABEL_OPEN_THREAD: "Відкрити відмічене лиŃŃ‚Ńвання" LABEL_MOVE: "ПереміŃтити" LABEL_READ: "Відмітити вибрані лиŃти прочитаними" LABEL_UNREAD: "Відмітити вибрані лиŃти непрочитаними" LABEL_IMPORTANT: "Відпітити вибрані лиŃти ŃŹĐş важливі" LABEL_SEARCH: "ПоŃŃĐş" LABEL_CANCEL_SEARCH: "Відмінити поŃŃĐş" LABEL_FULLSCREEN_ENTER: "Повноекранний режим" LABEL_VIEW_MESSAGE_ENTER: "Перегляд повідомлення" LABEL_SWITCH_TO_MESSAGE: "Переключити фокŃŃ Đ˝Đ° вибране повідомлення" LABEL_SWITCH_TO_FOLDER_LIST: "Переключити фокŃŃ Đ˝Đ° ŃпиŃок тек" LABEL_FULLSCREEN_TOGGLE: "Переключити повноекранний режим" LABEL_BLOCKQUOTES_TOGGLE: "Перемикання видимоŃті цитат Ń Đ»Đ¸Ńті" LABEL_THREAD_NEXT: "НаŃŃ‚Ńпний лиŃŃ‚ Ń Đ»Đ¸ŃŃ‚Ńванні" LABEL_THREAD_PREV: "Попередній лиŃŃ‚ Ń Đ»Đ¸ŃŃ‚Ńванні" LABEL_PRINT: "НадрŃĐşŃвати" LABEL_EXIT_FULLSCREEN: "Вийти Đ· повноекранного режимŃ" LABEL_CLOSE_MESSAGE: "Закрити повідомлення" LABEL_SWITCH_TO_LIST: "Переключити фокŃŃ Đ˝Đ° ŃпиŃок лиŃтів" LABEL_OPEN_COMPOSE_POPUP: "НапиŃати лиŃта" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Вибрати відправника" LABEL_SAVE_MESSAGE: "Зберегти повідомлення" LABEL_SEND_MESSAGE: "НадіŃлати повідомлення" LABEL_CLOSE_COMPOSE: "Закрити повідомлення" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "ĐźŃблічні ключі не знайдено" NO_PUBLIC_KEYS_FOUND_FOR: "ĐźŃблічні ключі для \"%EMAIL%\" не знайдено" NO_PRIVATE_KEY_FOUND: "Приватний ключ не знайдено" NO_PRIVATE_KEY_FOUND_FOR: "Приватний ключ для \"%EMAIL%\" не знайдено" ADD_A_PUBLICK_KEY: "Add a public key" UNVERIFIRED_SIGNATURE: "Непідтверджена ŃигнатŃра" DECRYPTION_ERROR: "OpenPGP помилка розŃифрŃвання" GOOD_SIGNATURE: "Підтверджена ŃигнатŃра для %USER%" PGP_ERROR: "OpenPGP помилка: %ERROR%" SPECIFY_FROM_EMAIL: "Вкажіть поŃŃ‚ĐľĐ˛Ń Đ°Đ´Ń€ĐµŃŃ Đ˛Ń–Đ´ĐżŃ€Đ°Đ˛Đ˝Đ¸ĐşĐ°" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Вкажіть ŃŹĐş мінімŃĐĽ одного отримŃвача" NOTIFICATIONS: INVALID_TOKEN: "Невірний токен запитŃ" AUTH_ERROR: "Не вдалоŃŃŹ авторизŃватиŃŃŹ" ACCESS_ERROR: "Помилка Đ´ĐľŃŃ‚ŃĐżŃ" CONNECTION_ERROR: "Помилка Đ·'єднання Đ· Ńервером." CAPTCHA_ERROR: "Неправильне перевірочне Ńлово." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > До даного Ńоціального кориŃŃ‚Ńвача ще не прикріплений поŃтовий акаŃнт. Увійдіть Ń ŃиŃŃ‚ĐµĐĽŃ ĐżŃ–Đ´ Ńвоїм поŃтовим акаŃнтом Ń– включіть цю можливіŃть Ń Đ˝Đ°Đ»Đ°ŃŃ‚Ńваннях. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > До даного Ńоціального кориŃŃ‚Ńвача ще не прикріплений поŃтовий акаŃнт. Увійдіть Ń ŃиŃŃ‚ĐµĐĽŃ ĐżŃ–Đ´ Ńвоїм поŃтовим акаŃнтом Ń– включіть цю можливіŃть Ń Đ˝Đ°Đ»Đ°ŃŃ‚Ńваннях. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > До даного Ńоціального кориŃŃ‚Ńвача ще не прикріплений поŃтовий акаŃнт. Увійдіть Ń ŃиŃŃ‚ĐµĐĽŃ ĐżŃ–Đ´ Ńвоїм поŃтовим акаŃнтом Ń– включіть цю можливіŃть Ń Đ˝Đ°Đ»Đ°ŃŃ‚Ńваннях. DOMAIN_NOT_ALLOWED: "Цей домен заборонений" ACCOUNT_NOT_ALLOWED: "Цей акаŃнт заборонений" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Необхідна двофакторна верификація" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Помилка двофакторної верифікації" COULD_NOT_SAVE_NEW_PASSWORD: "Не вдалоŃŃŹ зберегти новий пароль" CURRENT_PASSWORD_INCORRECT: "Поточний пароль Ń” хибним" NEW_PASSWORD_SHORT: "Пароль надто короткий" NEW_PASSWORD_WEAK: "Пароль надто проŃтий" NEW_PASSWORD_FORBIDDENT: "Пароль ĐĽŃ–Ńтить заборонені Ńимволи" CONTACTS_SYNC_ERROR: "Помилка Ńинхронізації контактів" CANT_GET_MESSAGE_LIST: "Не ĐĽĐľĐ¶Ń ĐľŃ‚Ń€Đ¸ĐĽĐ°Ń‚Đ¸ ŃпиŃок лиŃтів" CANT_GET_MESSAGE: "Не ĐĽĐľĐ¶Ń ĐľŃ‚Ń€Đ¸ĐĽĐ°Ń‚Đ¸ лиŃта" CANT_DELETE_MESSAGE: "Не ĐĽĐľĐ¶Ń Đ˛Đ¸Đ´Đ°Đ»Đ¸Ń‚Đ¸ лиŃта" CANT_MOVE_MESSAGE: "Не ĐĽĐľĐ¶Ń ĐżĐµŃ€ĐµĐĽŃ–Ńтити лиŃта" CANT_SAVE_MESSAGE: "Не ĐĽĐľĐ¶Ń Đ·Đ±ĐµŃ€ĐµĐłŃ‚Đ¸ лиŃта" CANT_SEND_MESSAGE: "Не ĐĽĐľĐ¶Ń Đ˛Ń–Đ´ĐżŃ€Đ°Đ˛Đ¸Ń‚Đ¸ лиŃта" INVALID_RECIPIENTS: "Перевірити правильніŃть Đ˛Đ˛ĐľĐ´Ń Đ˛ŃŃ–Ń… адреŃ." CANT_SAVE_FILTERS: "Не ĐĽĐľĐ¶Ń Đ·Đ±ĐµŃ€ĐµĐłŃ‚Đ¸ фільтри" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "Не ĐĽĐľĐ¶Ń Ńтворити текŃ" CANT_RENAME_FOLDER: "Не ĐĽĐľĐ¶Ń ĐżĐµŃ€ĐµĐąĐĽĐµĐ˝Ńвати текŃ" CANT_DELETE_FOLDER: "Не ĐĽĐľĐ¶Ń Đ˛Đ¸Đ´Đ°Đ»Đ¸Ń‚Đ¸ текŃ" CANT_DELETE_NON_EMPTY_FOLDER: "Не ĐĽĐľĐ¶Ń Đ˛Đ¸Đ´Đ°Đ»Đ¸Ń‚Đ¸ не порожню текŃ" CANT_SUBSCRIBE_FOLDER: "Не ĐĽĐľĐ¶Ń ĐżŃ–Đ´ĐżĐ¸Ńати текŃ" CANT_UNSUBSCRIBE_FOLDER: "Не ĐĽĐľĐ¶Ń Đ˛Ń–Đ´ĐżĐ¸Ńати текŃ" CANT_SAVE_SETTINGS: "Не ĐĽĐľĐ¶Ń Đ·Đ±ĐµŃ€ĐµĐłŃ‚Đ¸ налаŃŃ‚Ńвання" CANT_SAVE_PLUGIN_SETTINGS: "Не ĐĽĐľĐ¶Ń Đ·Đ±ĐµŃ€ĐµĐłŃ‚Đ¸ налаŃŃ‚Ńвання" DOMAIN_ALREADY_EXISTS: "Домен вже Ń–ŃĐ˝ŃŃ”" CANT_INSTALL_PACKAGE: "Помилка вŃтановлення пакетŃ" CANT_DELETE_PACKAGE: "Помилка видалення пакетŃ" INVALID_PLUGIN_PACKAGE: "Помилка ĐżĐ°ĐşĐµŃ‚Ń ĐżĐ»Đ°ĐłŃ–Đ˝Ń" UNSUPPORTED_PLUGIN_PACKAGE: "Для роботи ĐżĐ»Đ°ĐłĐ¸Đ˝Ń Đ˝ĐµĐľĐ±Ń…Ń–Đ´Đ˝Đ° повна підтримка ŃерверŃ" LICENSING_SERVER_IS_UNAVAILABLE: "Сервер підпиŃок тимчаŃово не Đ´ĐľŃŃ‚Ńпний." LICENSING_DOMAIN_EXPIRED: "ПідпиŃка на цей домен заŃтаріла." LICENSING_DOMAIN_BANNED: "ПідпиŃка на цей домен заблокована." DEMO_SEND_MESSAGE_ERROR: "Демо акаŃĐ˝Ń‚Ń Đ˝Đ°Đ´Ńилання лиŃтів на зовніŃні поŃтові адреŃи заборонена!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "акаŃнт вже додано" MAIL_SERVER_ERROR: "Помилка Đ´ĐľŃŃ‚ŃĐżŃ Đ´Đľ поŃтового ŃерверŃ" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Невідома помилка" STATIC: BACK_LINK: "Оновити" DOMAIN_LIST_DESC: "СпиŃок доменів, Đ´Đľ яких дозволено Đ´ĐľŃŃ‚ŃĐż через веб поŃŃ‚Ń." PHP_EXSTENSIONS_ERROR_DESC: "Необхідні розŃирення PHP не вŃтановлені на ваŃĐľĐĽŃ Ńервері!" PHP_VERSION_ERROR_DESC: "ВаŃа верŃŃ–ŃŹ PHP (%VERSION%) нижче потрібної 5.3.0!" NO_SCRIPT_TITLE: "Для роботи Đ´ĐľĐ´Đ°Ń‚ĐşŃ Đ˝ĐµĐľĐ±Ń…Ń–Đ´Đ˝Đ¸Đą JavaScript." NO_SCRIPT_DESC: | ЗдаєтьŃŃŹ, JavaScript або не підтримŃєтьŃŃŹ ваŃим браŃзером, або вимкнений. Увімкніть JavaScript, змінив налаŃтівання браŃзера, Ń– ŃпробŃйте зновŃ. NO_COOKIE_TITLE: "Для роботи Đ´ĐľĐ´Đ°Ń‚ĐşŃ Đ˝ĐµĐľĐ±Ń…Ń–Đ´Đ˝Ń– Cookie." NO_COOKIE_DESC: | ЗдаєтьŃŃŹ, Cookie або не підтримŃютьŃŃŹ ваŃим браŃзером, або вимкнені. Увімкніть Cookie, змінив налаŃтівання браŃзера, Ń– ŃпробŃйте зновŃ. BAD_BROWSER_TITLE: "Đ’Đ°Ń Đ±Ń€Đ°Ńзер заŃтарів." BAD_BROWSER_DESC: | Щоб викориŃтовŃвати вŃŃ– можливоŃті додаткŃ, завантажте Ń– вŃтановіть один Đ· цих браŃзерів rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/zh_CN.yml000066400000000000000000000705221361462701300262060ustar00rootroot00000000000000zh_CN: LOGIN: LABEL_EMAIL: "邮箱" LABEL_LOGIN: "登入" LABEL_PASSWORD: "密ç " LABEL_SIGN_ME: "记住ć‘" LABEL_VERIFICATION_CODE: "验čŻç " LABEL_DONT_ASK_VERIFICATION_CODE: "在两周内不再询问密ç " BUTTON_SIGN_IN: "登陆" TITLE_SIGN_IN_GOOGLE: "使用Googleĺ¸ĺŹ·ç™»é™†" TITLE_SIGN_IN_FACEBOOK: "使用Facebookĺ¸ĺŹ·ç™»é™†" TITLE_SIGN_IN_TWITTER: "使用Twitterĺ¸ĺŹ·ç™»é™†" LABEL_FORGOT_PASSWORD: "ĺżč®°ĺ݆ç " LABEL_REGISTRATION: "注册" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "添加账ć·" BUTTON_SETTINGS: "设置" BUTTON_HELP: "帮助" BUTTON_LOGOUT: "注销" MOBILE: BUTTON_MOBILE_VERSION: "移动端ç‰ćś¬" BUTTON_DESKTOP_VERSION: "桌面端ç‰ćś¬" SEARCH: MAIN_INPUT_PLACEHOLDER: "ćśç´˘" TITLE_ADV: "é«çş§ćśç´˘" LABEL_ADV_FROM: "发é€č‡Ş" LABEL_ADV_TO: "发é€ĺ°" LABEL_ADV_SUBJECT: "主é˘" LABEL_ADV_TEXT: "内容" LABEL_ADV_HAS_ATTACHMENT: "带有附件" LABEL_ADV_HAS_ATTACHMENTS: "有附件" LABEL_ADV_FLAGGED: "标记" LABEL_ADV_UNSEEN: "不可č§" LABEL_ADV_DATE: "ć—Ąćśź" LABEL_ADV_DATE_ALL: "所有邮件" LABEL_ADV_DATE_3_DAYS: "3天以内" LABEL_ADV_DATE_7_DAYS: "1周以内" LABEL_ADV_DATE_MONTH: "1ćśä»Ąĺ†…" LABEL_ADV_DATE_3_MONTHS: "3ćśä»Ąĺ†…" LABEL_ADV_DATE_6_MONTHS: "半年以内" LABEL_ADV_DATE_YEAR: "1年以内" BUTTON_ADV_SEARCH: "ćśç´˘" PREVIEW_POPUP: FULLSCREEN: "ĺ‡ćŤ˘ĺ…¨ĺ±Ź" ZOOM: "放大/缩小" CLOSE: "ĺ…łé—­ (Esc)" LOADING: "加载..." GALLERY_PREV: "ĺ‘前 (左箭头键)" GALLERY_NEXT: "ĺ‘ĺŽ (右箭头键)" GALLERY_COUNTER: "%curr% / %total%" IMAGE_ERROR: "图片 无法加载。" AJAX_ERROR: "内容 无法加载。" FOLDER_LIST: BUTTON_COMPOSE: "写邮件" BUTTON_CONTACTS: "č”系人" BUTTON_NEW_MESSAGE: "新信ćŻ" INBOX_NAME: "ć”¶ä»¶ç®±" SENT_NAME: "已发邮件" DRAFTS_NAME: "草稿" SPAM_NAME: "ĺžĺśľé‚®ä»¶" TRASH_NAME: "ĺ·˛ĺ é™¤é‚®ä»¶" ARCHIVE_NAME: "ĺ­ćˇŁ" QUOTA: TITLE: "ĺ­ĺ‚¨ç©şé—´ä˝żç”¨é‡Ź" MESSAGE_LIST: BUTTON_RELOAD: "重新加载邮件ĺ—表" BUTTON_MOVE_TO: "移至" BUTTON_DELETE: "ĺ·˛ĺ é™¤é‚®ä»¶" BUTTON_ARCHIVE: "ĺ­ćˇŁ" BUTTON_SPAM: "ĺžĺśľé‚®ä»¶" BUTTON_NOT_SPAM: "不ćŻĺžĺśľé‚®ä»¶" BUTTON_EMPTY_FOLDER: "清空文件夹" BUTTON_MULTY_FORWARD: "转发邮件" BUTTON_DELETE_WITHOUT_MOVE: "永久ĺ é™¤" BUTTON_MORE: "更多" MENU_SET_SEEN: "标记为已读" MENU_SET_ALL_SEEN: "标记全é¨ä¸şĺ·˛čŻ»" MENU_UNSET_SEEN: "标记为未读" MENU_SET_FLAG: "加注ćźć ‡" MENU_UNSET_FLAG: "移除ćźć ‡" MENU_SELECT_ALL: "ĺ…¨é¨" MENU_SELECT_NONE: "ć— " MENU_SELECT_INVERT: "选择" MENU_SELECT_UNSEEN: "未读" MENU_SELECT_SEEN: "已读" MENU_SELECT_FLAGGED: "已加ćźć ‡" MENU_SELECT_UNFLAGGED: "未加ćźć ‡" EMPTY_LIST: "空ĺ—表。" EMPTY_SEARCH_LIST: "未找ĺ°ć‚¨ćłč¦çš„。" SEARCH_RESULT_FOR: "ćśç´˘ \"%SEARCH%\" 的结果" BACK_TO_MESSAGE_LIST: "回ĺ°äżˇćŻĺ—表" LIST_LOADING: "加载中" EMPTY_SUBJECT_TEXT: "(无主é˘)" PUT_MESSAGE_HERE: "在这里查看邮件" TODAY_AT: "今日于 %TIME%" YESTERDAY_AT: "ć¨ĺ¤© %TIME%" SEARCH_PLACEHOLDER: "ćśç´˘" NEW_MESSAGE_NOTIFICATION: "您有 %COUNT% ĺ°ć–°é‚®ä»¶ďĽ" QUOTA_SIZE: "使用了%LIMIT% ĺ­ĺ‚¨ç©şé—´ä¸­çš„%SIZE% (%PROC%%)" MESSAGE: BUTTON_EDIT: "编辑" BUTTON_BACK: "返回" BUTTON_CLOSE: "ĺ…łé—­" BUTTON_DELETE: "ĺ é™¤" BUTTON_UNSUBSCRIBE: "从此ĺ—表取ć¶č®˘é…" BUTTON_ARCHIVE: "ĺ­ćˇŁ" BUTTON_SPAM: "ĺžĺśľé‚®ä»¶" BUTTON_NOT_SPAM: "不ćŻĺžĺśľé‚®ä»¶" BUTTON_MOVE_TO: "移至" BUTTON_MORE: "更多" BUTTON_REPLY: "回复" BUTTON_REPLY_ALL: "ĺ…¨é¨ĺ›žĺ¤Ť" BUTTON_FORWARD: "转发" BUTTON_FORWARD_AS_ATTACHMENT: "带附件转发" BUTTON_EDIT_AS_NEW: "Edit as New" BUTTON_SHOW_IMAGES: "ćľç¤şĺ¤–é¨ĺ›ľç‰‡" BUTTON_NOTIFY_READ_RECEIPT: "发é€äşşčŻ·ć±‚ć‚¨ĺŹ‘é€é…读回执。" BUTTON_IN_NEW_WINDOW: "在新窗口中查看" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "上一页" BUTTON_THREAD_NEXT: "下一页" BUTTON_THREAD_MORE: "更多信ćŻ" MENU_HEADERS: "ćľç¤şčŻ¦ç»†äżˇćŻ" MENU_VIEW_ORIGINAL: "ćľç¤şĺŽźĺ§‹ĺ†…ĺ®ą" MENU_DOWNLOAD_ORIGINAL: "作为 .eml 文件下载" MENU_FILTER_SIMILAR: "筛选类似邮件" MENU_PRINT: "打印邮件" EMPTY_SUBJECT_TEXT: "(无主é˘)" LABEL_SUBJECT: "主é˘" LABEL_DATE: "ć—Ąćśź" LABEL_FROM: "发é€č‡Ş" LABEL_FROM_SHORT: "from" LABEL_TO: "发é€ĺ°" LABEL_TO_SHORT: "to" LABEL_CC: "抄é€" LABEL_BCC: "密é€" LABEL_REPLY_TO: "回复" PRINT_LABEL_FROM: "发é€č‡Ş" PRINT_LABEL_TO: "发é€ĺ°" PRINT_LABEL_CC: "抄é€" PRINT_LABEL_BCC: "密é€" PRINT_LABEL_REPLY_TO: "回复" PRINT_LABEL_DATE: "ć—Ąćśź" PRINT_LABEL_SUBJECT: "主é˘" PRINT_LABEL_ATTACHMENTS: "附件" MESSAGE_LOADING: "加载中" MESSAGE_VIEW_DESC: "在此查看ĺ—表中选中的邮件。" PGP_PASSWORD_INPUT_PLACEHOLDER: "密ç " PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "下载为zip压缩包" LINK_SAVE_TO_OWNCLOUD: "äżťĺ­ĺ°ownCloud" LINK_SAVE_TO_DROPBOX: "äżťĺ­ĺ°Dropbox" READ_RECEIPT: SUBJECT: "妥投回执 - %SUBJECT%" BODY: | 本回执表示您发é€ç»™ %READ-RECEIPT% 的邮件已妥投。 注意:本回执仅意味着邮件已妥投并已在收件人的电脑中出示过,但并不č˝äżťčŻć”¶ä»¶äşşĺ·˛é…读ć–ĺ·˛ćŽç™˝é‚®ä»¶ĺ†…容。 SUGGESTIONS: SEARCHING_DESC: "ćśç´˘ä¸­..." CONTACTS: LEGEND_CONTACTS: "č”系人" SEARCH_INPUT_PLACEHOLDER: "ćśç´˘" BUTTON_ADD_CONTACT: "添加č”系人" BUTTON_CREATE_CONTACT: "新增č”系人" BUTTON_UPDATE_CONTACT: "ć›´ć–°č”系人" BUTTON_IMPORT: "导入 (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "导出 (vcf, vCard)" BUTTON_EXPORT_CSV: "导出 (csv)" ERROR_IMPORT_FILE: "导入错误 (invalid file format)" LIST_LOADING: "加载中" EMPTY_LIST: "暂无č”系人" EMPTY_SEARCH: "没找ĺ°č”系人" CLEAR_SEARCH: "清除ćśç´˘" CONTACT_VIEW_DESC: "在此查看在ĺ—表中选中的č”系人。" LABEL_DISPLAY_NAME: "ćľç¤şĺŤĺ­—" LABEL_EMAIL: "邮箱" LABEL_PHONE: "电话" LABEL_WEB: "网站" LABEL_BIRTHDAY: "生日" LINK_ADD_EMAIL: "添加 Email 地址" LINK_ADD_PHONE: "添加电话" LINK_BIRTHDAY: "生日" PLACEHOLDER_ENTER_DISPLAY_NAME: "ćľç¤şĺŤç§°" PLACEHOLDER_ENTER_LAST_NAME: "ĺ§“" PLACEHOLDER_ENTER_FIRST_NAME: "ĺŤ" PLACEHOLDER_ENTER_NICK_NAME: "ćµç§°" LABEL_READ_ONLY: "只读" LABEL_SHARE: "ĺ†äş«" ADD_MENU_LABEL: "添加" ADD_MENU_NICKNAME: "ćµç§°" ADD_MENU_NOTES: "笔记" ADD_MENU_EMAIL: "邮箱" ADD_MENU_PHONE: "电话" ADD_MENU_URL: "网址" ADD_MENU_ADDRESS: "地址" ADD_MENU_BIRTHDAY: "生日" ADD_MENU_TAGS: "标签" BUTTON_SHARE_NONE: "ć— " BUTTON_SHARE_ALL: "所有人" BUTTON_SYNC: "ĺŚć­Ą (CardDAV)" COMPOSE: TITLE_FROM: "发é€č‡Ş" TITLE_TO: "发é€ĺ°" TITLE_CC: "抄é€" TITLE_BCC: "密é€" TITLE_REPLY_TO: "回复" TITLE_SUBJECT: "主é˘" LINK_SHOW_INPUTS: "ćľç¤şć‰€ćś‰äżˇćŻ" BUTTON_SEND: "发é€" BUTTON_SAVE: "äżťĺ­" BUTTON_DELETE: "ĺ é™¤" BUTTON_CANCEL: "取ć¶" BUTTON_MINIMIZE: "最小化" SAVED_TIME: "äżťĺ­äşŽ %TIME%" SAVED_ERROR_ON_SEND: "邮件已发é€ä˝†ĺą¶ćśŞäżťĺ­ĺś¨ĺ·˛ĺʑ邮件ĺ—表中。" DISCARD_UNSAVED_DATA: "放ĺĽćśŞäżťĺ­çš„数据?" ATTACH_FILES: "添加附件" ATTACH_DROP_FILES_DESC: "拖动文件至此" ATTACH_ITEM_CANCEL: "取ć¶" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% 写ĺ°" FORWARD_MESSAGE_TOP_TITLE: "-------- 转发邮件 -------" FORWARD_MESSAGE_TOP_FROM: "发é€č‡Ş" FORWARD_MESSAGE_TOP_TO: "发é€ĺ°" FORWARD_MESSAGE_TOP_CC: "抄é€" FORWARD_MESSAGE_TOP_SENT: "发é€" FORWARD_MESSAGE_TOP_SUBJECT: "主é˘" EMPTY_TO_ERROR_DESC: "请至少选择一位接收人" NO_ATTACHMENTS_HERE_DESC: "无附件。" ATTACHMENTS_ERROR_DESC: "注意ďĽčżćś‰ć­Łĺś¨ä¸ŠäĽ çš„附件。" ATTACHMENTS_UPLOAD_ERROR_DESC: "čżćś‰é™„件正在上传" BUTTON_REQUEST_READ_RECEIPT: "č¦ć±‚é…读回执" BUTTON_MARK_AS_IMPORTANT: "标记为“重č¦â€ť" BUTTON_OPEN_PGP: "OpenPGP (ä»…é™ć™®é€šć–‡ćś¬)" BUTTON_REQUEST_DSN: "č¦ć±‚妥投回执" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "ĺ…łé—­" POPUPS_ASK: BUTTON_YES: "ćŻ" BUTTON_NO: "ĺ¦" DESC_WANT_CLOSE_THIS_WINDOW: "你确定č¦ĺ…łé—­ć­¤çŞ—ĺŹŁĺ—?" DESC_WANT_DELETE_MESSAGES: "你确定你č¦ĺ é™¤čż™ćťˇć¶ćŻĺ—?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "选择语言" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "添加账ć·?" BUTTON_ADD_ACCOUNT: "添加" TITLE_UPDATE_ACCOUNT: "ć›´ć–°č´¦ć·?" BUTTON_UPDATE_ACCOUNT: "ć›´ć–°" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "添加签ĺŤ?" TITLE_UPDATE_IDENTITY: "ć›´ć–°ç­ľĺŤ?" BUTTON_ADD_IDENTITY: "添加" BUTTON_UPDATE_IDENTITY: "ć›´ć–°" LABEL_EMAIL: "邮箱" LABEL_NAME: "ĺ§“ĺŤ" LABEL_REPLY_TO: "回复" LABEL_SIGNATURE: "ç­ľĺŤ" LABEL_CC: "Cc" LABEL_BCC: "密é€" LABEL_SIGNATURE_INSERT_BEFORE: "在回信中插入签ĺŤĺ†ŤĺĽ•用来信。" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "ĺ›ĺ»şć–‡ä»¶ĺ¤ą?" LABEL_NAME: "文件夹ĺŤç§°" LABEL_PARENT: "ç¶ć–‡ä»¶ĺ¤ą" BUTTON_CREATE: "ĺ›ĺ»ş" BUTTON_CANCEL: "取ć¶" BUTTON_CLOSE: "ĺ…łé—­" TITLE_CREATING_PROCESS: "文件夹ĺ›ĺ»şä¸­" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "清ç†ć–‡ä»¶ĺ¤ąä¸­ć‰€ćś‰é‚®ä»¶?" BUTTON_CLEAR: "清ç†" BUTTON_CANCEL: "取ć¶" BUTTON_CLOSE: "ĺ…łé—­" DANGER_DESC_WARNING: "警告ďĽ" DANGER_DESC_HTML_1: "此操作将完全ĺ é™¤ć–‡ä»¶ĺ¤ą %FOLDER% 中的所有邮件ďĽ" DANGER_DESC_HTML_2: "一旦操作执行,不可中断和撤销ďĽ" TITLE_CLEARING_PROCESS: "文件夹清ç†ä¸­..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "导入 OpenPGP 密匙" BUTTON_IMPORT_OPEN_PGP_KEY: "导入" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "查看 OpenPGP 密匙" BUTTON_SELECT: "选择" BUTTON_CLOSE: "ĺ…łé—­" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "生ć OpenPGP 密匙" LABEL_EMAIL: "邮箱" LABEL_NAME: "ĺŤĺ­—" LABEL_PASSWORD: "密ç " LABEL_KEY_BIT_LENGTH: "密匙长度" BUTTON_GENERATE_OPEN_PGP_KEYS: "生ć" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP ç­ľĺŤ/加密" LABEL_SIGN: "ç­ľĺŤ" LABEL_ENCRYPT: "加密" LABEL_PASSWORD: "密ç " BUTTON_SIGN: "ç­ľĺŤ" BUTTON_ENCRYPT: "加密" BUTTON_SIGN_AND_ENCRYPT: "ç­ľĺŤĺŠ ĺŻ†" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP 解密" LABEL_KEY: "ç§é’Ą" LABEL_PASSWORD: "密ç " BUTTON_DECRYPT: "解密" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "两步验čŻćµ‹čŻ•" LABEL_CODE: "代ç " BUTTON_TEST: "测试" POPUPS_FILTER: TITLE_CREATE_FILTER: "ĺ›ĺ»şç­›é€‰ćťˇä»¶ďĽź" TITLE_EDIT_FILTER: "更新筛选条件?" FILTER_NAME: "ĺŤĺ­—" LEGEND_CONDITIONS: "条件" LEGEND_ACTIONS: "操作" BUTTON_DONE: "完ć" BUTTON_ADD_CONDITION: "添加条件" SELECT_ACTION_NONE: "无操作" SELECT_ACTION_MOVE_TO: "移动ĺ°" SELECT_ACTION_FORWARD_TO: "转发ĺ°" SELECT_ACTION_REJECT: "ć‹’ć”¶" SELECT_ACTION_VACATION_MESSAGE: "ĺ‡ćśźč‡ŞĺŠ¨ĺ›žĺ¤Ť" SELECT_ACTION_DISCARD: "取ć¶" SELECT_FIELD_FROM: "发é€č‡Ş" SELECT_FIELD_RECIPIENTS: "接收人 (To ć– CC)" SELECT_FIELD_SUBJECT: "主é˘" SELECT_FIELD_HEADER: "ć ‡é˘" SELECT_FIELD_SIZE: "大小" SELECT_TYPE_CONTAINS: "包ĺ«" SELECT_TYPE_NOT_CONTAINS: "不包ĺ«" SELECT_TYPE_MATCHES: "满足条件 (可用通配符 * ć– ?)" SELECT_TYPE_NOT_MATCHES: "不满足条件 (可用通配符 * and ?)" SELECT_TYPE_REGEXP: "ć­Łĺ™čˇ¨čľľĺĽŹ" SELECT_TYPE_NOT_REGEXP: "ć— ć­Łĺ™čˇ¨čľľĺĽŹ" SELECT_TYPE_EQUAL_TO: "等于" SELECT_TYPE_NOT_EQUAL_TO: "不等于" SELECT_TYPE_OVER: "超过" SELECT_TYPE_UNDER: "不超过" SELECT_MATCH_ANY: "满足下ĺ—任何条件" SELECT_MATCH_ALL: "满足下ĺ—所有条件" MARK_AS_READ_LABEL: "标记为已读" REPLY_INTERVAL_LABEL: "答复间隔 (天) " KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subject (optional)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "ć”¶ä»¶äşş (半角逗号“,”ĺ†éš”)" REJECT_MESSAGE_LABEL: "拒收邮件" ALL_INCOMING_MESSAGES_DESC: "所有来信" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "选择系统文件夹" SELECT_CHOOSE_ONE: "选择一个" SELECT_UNUSE_NAME: "不使用" LABEL_SENT: "已发邮件" LABEL_DRAFTS: "草稿" LABEL_SPAM: "ĺžĺśľé‚®ä»¶" LABEL_TRASH: "ĺ·˛ĺ é™¤é‚®ä»¶" LABEL_ARCHIVE: "ĺ­ćˇŁ" BUTTON_CANCEL: "取ć¶" BUTTON_CLOSE: "ĺ…łé—­" NOTIFICATION_SENT: | 您没有选择 已发邮件 文件夹来ĺ­ĺ‚¨ĺ·˛ĺŹ‘é€é‚®ä»¶ă€‚ 如果您不希望保ĺ­ĺ·˛ĺŹ‘é‚®ä»¶ďĽŚčŻ·é€‰ć‹© 不使用 选项。 NOTIFICATION_DRAFTS: "您没有选择 草稿 文件夹来ĺ­ĺ‚¨é‚®ä»¶čŤ‰ç¨żă€‚" NOTIFICATION_SPAM: | 您没有选择 ĺžĺśľé‚®ä»¶ 文件夹来ĺ­ĺ‚¨ĺžĺśľé‚®ä»¶ă€‚ 如果您希望永久ĺ é™¤é‚®ä»¶ďĽŚčݷ选㋩ 不使用 选项。 NOTIFICATION_TRASH: | 您没有选择 ĺ·˛ĺ é™¤é‚®ä»¶ 文件夹来ĺ­ĺ‚¨ĺžĺśľé‚®ä»¶ă€‚ 如果您希望永久ĺ é™¤é‚®ä»¶ďĽŚčݷ选㋩ 不使用 选项。 NOTIFICATION_ARCHIVE: "您没有选择“已归档邮件”文件夹来ĺ­ĺ‚¨ĺ˝’档邮件。" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "两步验čŻ" LABEL_ENABLE_TWO_FACTOR: "ĺŻç”¨ä¸¤ć­ĄéŞŚčŻ" LABEL_TWO_FACTOR_USER: "用ć·" LABEL_TWO_FACTOR_STATUS: "状ć€" LABEL_TWO_FACTOR_SECRET: "密钥" LABEL_TWO_FACTOR_BACKUP_CODES: "备份代ç " BUTTON_CREATE: "ĺ›ĺ»şć–°ĺŻ†é’Ą" BUTTON_ACTIVATE: "ĺ·˛ĺŻç”¨" BUTTON_CLEAR: "清除" BUTTON_LOGOUT: "登出" BUTTON_DONE: "完ć" BUTTON_TEST: "测试" LINK_TEST: "测试" BUTTON_SHOW_SECRET: "ćľç¤şĺŻ†é’Ą" BUTTON_HIDE_SECRET: "éšč—ŹĺŻ†é’Ą" TWO_FACTOR_REQUIRE_DESC: "您的账ć·éś€č¦č®ľç˝®ä¸¤ć­ĄéŞŚčŻă€‚" TWO_FACTOR_SECRET_CONFIGURED_DESC: "已设置" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "未设置" TWO_FACTOR_SECRET_DESC: >- Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: >- If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "加载中" LOGIN: "登陆" MAILBOX: "邮箱" SETTINGS: "设置" COMPOSE: "写邮件" UPLOAD: ERROR_FILE_IS_TOO_BIG: "文件太大" ERROR_FILE_PARTIALLY_UPLOADED: "é­é‡ćśŞçźĄé”™čŻŻďĽŚć–‡ä»¶é¨ĺ†ä¸ŠäĽ " ERROR_NO_FILE_UPLOADED: "没有文件上传" ERROR_MISSING_TEMP_FOLDER: "临时文件丢失" ERROR_ON_SAVING_FILE: "é­é‡ćśŞçźĄé”™čŻŻ" ERROR_FILE_TYPE: "ć— ć•文件类型" ERROR_UNKNOWN: "未知文件上传错误" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "富文本" TEXT_SWITCHER_CONFIRM: "文件格式及图片将丢失,您确定继续这äąĺšďĽź" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "个人" LABEL_GENERAL_NAME: "一č¬č®ľç˝®" LABEL_CONTACTS_NAME: "č”系人" LABEL_FOLDERS_NAME: "文件夹" LABEL_ACCOUNTS_NAME: "č´¦ć·" LABEL_IDENTITY_NAME: "ç­ľĺŤ" LABEL_IDENTITIES_NAME: "ç­ľĺŤ" LABEL_FILTERS_NAME: "筛选条件" LABEL_TEMPLATES_NAME: "模ç‰" LABEL_SECURITY_NAME: "安全" LABEL_SOCIAL_NAME: "社交" LABEL_THEMES_NAME: "主é˘" LABEL_CHANGE_PASSWORD_NAME: "密ç " LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "返回" SETTINGS_FILTERS: LEGEND_FILTERS: "筛选器" BUTTON_SAVE: "äżťĺ­" BUTTON_ADD_FILTER: "添加筛选条件" BUTTON_DELETE: "ĺ é™¤" BUTTON_RAW_SCRIPT: "使用自定义脚本" SUBNAME_NONE: "ć— " SUBNAME_MOVE_TO: "ç§»ĺŠ¨ĺ° \"%FOLDER%\"" SUBNAME_FORWARD_TO: "č˝¬ĺŹ‘ĺ° \"%EMAIL%\"" SUBNAME_REJECT: "拒绝" SUBNAME_VACATION_MESSAGE: "ĺ‡ćśźč‡ŞĺŠ¨ĺ›žĺ¤Ť" SUBNAME_DISCARD: "取ć¶" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "正在更新筛选规ĺ™ĺ—表" DELETING_ASK: "确定ĺ é™¤ďĽź" CHACHES_NEED_TO_BE_SAVED_DESC: "这些更改需č¦äżťĺ­ă€‚" SETTINGS_IDENTITY: LEGEND_IDENTITY: "ç­ľĺŤ" LABEL_DISPLAY_NAME: "ĺŤç§°" LABEL_REPLY_TO: "回复" LABEL_SIGNATURE: "ç­ľĺŤ" LABEL_ADD_SIGNATURE_TO_ALL: "发é€é‚®ä»¶ć—¶ĺť‡é™„加签ĺŤ" SETTINGS_SECURITY: LEGEND_SECURITY: "安全" LABEL_CONFIGURE_TWO_FACTOR: "配置两步验čŻ" LABEL_AUTOLOGOUT: "自动登出" AUTOLOGIN_NEVER_OPTION_NAME: "从不" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% ĺ†é’ź" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS%ĺ°Źć—¶" SETTINGS_GENERAL: LEGEND_GENERAL: "一č¬č®ľç˝®" LABEL_LANGUAGE: "语言" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "ĺ¸ĺ±€" LABEL_LAYOUT_NO_SPLIT: "不ĺ†éš”" LABEL_LAYOUT_VERTICAL_SPLIT: "垂直ĺ†éš”" LABEL_LAYOUT_HORIZONTAL_SPLIT: "ć°´ĺąłĺ†éš”" LABEL_EDITOR: "é»č®¤ć ĽĺĽŹ" LABEL_EDITOR_HTML: "Html文本" LABEL_EDITOR_PLAIN: "普通文本" LABEL_EDITOR_HTML_FORCED: "强ĺ¶HTML文本" LABEL_EDITOR_PLAIN_FORCED: "强ĺ¶ć™®é€šć–‡ćś¬" LABEL_ANIMATION: "界面动画" LABEL_ANIMATION_FULL: "完整" LABEL_ANIMATION_NORMAL: "正常" LABEL_ANIMATION_NONE: "ć— " LABEL_VIEW_OPTIONS: "视图选项" LABEL_USE_PREVIEW_PANE: "使用预č§" LABEL_USE_CHECKBOXES_IN_LIST: "ĺ—表中ćľç¤şĺ¤šé€‰ćˇ†" LABEL_USE_THREADS: "使用对话" LABEL_REPLY_SAME_FOLDER: "将回复的邮件放置ĺ°ĺ…¶ĺ›žĺ¤Ťçš„邮件所在文件夹" LABEL_SHOW_IMAGES: "总ćŻćľç¤şĺ¤–é¨ĺ›ľç‰‡äżˇćŻ" LABEL_SHOW_ANIMATION: "ćľç¤şĺŠ¨ç”»" LABEL_MESSAGE_PER_PAGE: "ĺ°é‚®ä»¶ćŻŹéˇµ" LABEL_NOTIFICATIONS: "通知" LABEL_SOUND_NOTIFICATION: "ćŹç¤şéźł" LABEL_CHROME_NOTIFICATION_DESC: "ćľç¤şć–°é‚®ä»¶ĺĽąçŞ—" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(被浏č§ĺ™¨é»ć­˘)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "č”系人" LABEL_CONTACTS_AUTOSAVE: "自动添加ĺ°ä˝ çš„地址簿" LEGEND_CONTACTS_SYNC: "远程ĺŚć­Ą(CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "ĺŻç”¨čżśç¨‹ĺŚć­Ą" LABEL_CONTACTS_SYNC_SERVER: "服务器" LABEL_CONTACTS_SYNC_AB_URL: "地址簿URL" LABEL_CONTACTS_SYNC_USER: "用ć·ĺŤ" LABEL_CONTACTS_SYNC_PASSWORD: "密ç " SETTINGS_THEMES: LEGEND_THEMES: "主é˘" LEGEND_THEMES_CUSTOM: "自定义主é˘č®ľç˝®" LABEL_CUSTOM_TYPE: "类型" LABEL_CUSTOM_TYPE_LIGHT: "ćŽäş®" LABEL_CUSTOM_TYPE_DARK: "暗沉" LABEL_CUSTOM_BACKGROUND_IMAGE: "čŚć™Ż" BUTTON_UPLOAD_BACKGROUND_IMAGE: "上传čŚć™Ż (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "文件太大" ERROR_FILE_TYPE_ERROR: "ć— ć•类型 (只支ćŚJPGĺ’ŚPNG)" ERROR_UNKNOWN: "上传时发生未知错误" SETTINGS_SOCIAL: LEGEND_GOOGLE: "č°·ć­Ś" BUTTON_GOOGLE_CONNECT: "čżžćŽĄĺ° Google" BUTTON_GOOGLE_DISCONNECT: "断开 Google 连接" MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." LEGEND_FACEBOOK: "非死不可" BUTTON_FACEBOOK_CONNECT: "čżžćŽĄĺ° Facebook" BUTTON_FACEBOOK_DISCONNECT: "断开 Facebook 链接" MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." LEGEND_TWITTER: "推特" BUTTON_TWITTER_CONNECT: "čżžćŽĄĺ° Twitter" BUTTON_TWITTER_DISCONNECT: "断开 Twitter 连接" MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "文件夹" BUTTON_CREATE: "新建文件夹" BUTTON_SYSTEM: "系统文件夹" BUTTON_DELETE: "ĺ é™¤" BUTTON_SUBSCRIBE: "订é…" BUTTON_UNSUBSCRIBE: "取ć¶č®˘é…" LOADING_PROCESS: "文件夹ĺ—表更新" CREATING_PROCESS: "文件夹ĺ›ĺ»şä¸­" DELETING_PROCESS: "文件夹ĺ é™¤ä¸­" RENAMING_PROCESS: "文件夹重命ĺŤ" DELETING_ASK: "确定?" TO_MANY_FOLDERS_DESC_1: "文件夹数量已达上é™ďĽ" TO_MANY_FOLDERS_DESC_2: "为éżĺ…Ťć€§č˝é—®é˘ďĽŚćš‚时只ćľç¤şé¨ĺ†ďĽć–‡ä»¶ĺ¤ąďĽ‰ă€‚" HELP_DELETE_FOLDER: "ĺ é™¤ć–‡ä»¶ĺ¤ą" HELP_SHOW_HIDE_FOLDER: "ćľç¤ş/éšč—Źć–‡ä»¶ĺ¤ą" HELP_CHECK_FOR_NEW_MESSAGES: "检查/不检查新邮件" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "č´¦ć·ĺ—表" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "添加一个账ć·" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "ĺ é™¤" LOADING_PROCESS: "ć›´ć–°č´¦ć·ĺ—表中" DELETING_ASK: "确定?" DEFAULT_IDENTITY_LABEL: "é»č®¤" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "ç­ľĺŤ" LEGEND_IDENTITIES: "附加签ĺŤ" LABEL_DEFAULT: "é»č®¤" LABEL_DISPLAY_NAME: "ĺŤç§°" LABEL_REPLY_TO: "回复" LABEL_SIGNATURE: "ç­ľĺŤ" LABEL_ADD_SIGNATURE_TO_ALL: "发é€çš„所有邮件均附加签ĺŤ" BUTTON_ADD_IDENTITY: "添加签ĺŤ" BUTTON_DELETE: "ĺ é™¤" LOADING_PROCESS: "ć›´ć–°ç­ľĺŤä¸­" DELETING_ASK: "确定?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "修改密ç " LABEL_CURRENT_PASSWORD: "当前密ç " LABEL_NEW_PASSWORD: "新密ç " LABEL_REPEAT_PASSWORD: "再次新密ç " BUTTON_UPDATE_PASSWORD: "设置新密ç " ERROR_PASSWORD_MISMATCH: "密ç ä¸ŤĺŚąé…Ť,请再试一次" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "导入 OpenPGP 密匙" BUTTON_GENERATE_OPEN_PGP_KEYS: "生ć OpenPGP 密匙" TITLE_PRIVATE: "ç§ćś‰" TITLE_PUBLIC: "公开" DELETING_ASK: "你确定ĺ—?" GENERATE_ONLY_HTTPS: "ä»…é™HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "快捷键说ćŽ" TAB_MAILBOX: "邮箱目录" TAB_MESSAGE_LIST: "邮件ĺ—表" TAB_MESSAGE_VIEW: "邮件视图" TAB_COMPOSE: "撰写" LABEL_OPEN_USER_DROPDOWN: "打开用ć·čŹśĺŤ•" LABEL_REPLY: "回复" LABEL_REPLY_ALL: "回复所有" LABEL_FORWARD: "转发" LABEL_FORWARD_MULTIPLY: "转发所有" LABEL_HELP: "帮助" LABEL_CHECK_ALL: "检查所有ć¶ćŻ" LABEL_ARCHIVE: "ĺ­ćˇŁ" LABEL_DELETE: "ĺ é™¤" LABEL_OPEN_THREAD: "打开选定的邮件往来" LABEL_MOVE: "移动" LABEL_READ: "将选定的邮件标记为“已读”" LABEL_UNREAD: "将选定的邮件标记为“未读”" LABEL_IMPORTANT: "将选定的邮件标记为“重č¦â€ť" LABEL_SEARCH: "ćśç´˘" LABEL_CANCEL_SEARCH: "取ć¶ćśç´˘" LABEL_FULLSCREEN_ENTER: "全屏邮件é…读窗格" LABEL_VIEW_MESSAGE_ENTER: "取ć¶ĺ…¨ĺ±Źé‚®ä»¶é…读窗格" LABEL_SWITCH_TO_MESSAGE: "ĺ‡ćŤ˘é‚®ä»¶é…读窗格" LABEL_SWITCH_TO_FOLDER_LIST: "ĺ‡ćŤ˘é‚®ä»¶é…读窗格" LABEL_FULLSCREEN_TOGGLE: "全屏窗格ĺ‡ćŤ˘" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "下一ĺ°ĺľ€ćťĄé‚®ä»¶" LABEL_THREAD_PREV: "上一ĺ°ĺľ€ćťĄé‚®ä»¶" LABEL_PRINT: "打印" LABEL_EXIT_FULLSCREEN: "退出全屏模式" LABEL_CLOSE_MESSAGE: "关闭独立邮件é…读窗格" LABEL_SWITCH_TO_LIST: "ĺ‡ćŤ˘ĺ°é‚®ä»¶ĺ—表" LABEL_OPEN_COMPOSE_POPUP: "打开撰写窗格" LABEL_MINIMIZE_COMPOSE_POPUP: "最小化撰写窗格" LABEL_OPEN_IDENTITIES_DROPDOWN: "打开账ć·ç®ˇç†çŞ—ć Ľ" LABEL_SAVE_MESSAGE: "äżťĺ­é‚®ä»¶" LABEL_SEND_MESSAGE: "发é€é‚®ä»¶" LABEL_CLOSE_COMPOSE: "退出撰写" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "无法找ĺ°ĺ…¬é’Ą" NO_PUBLIC_KEYS_FOUND_FOR: "ć— ćł•ć‰ľĺ° \\\"%EMAIL%\\\" 的公钥" NO_PRIVATE_KEY_FOUND: "无法找ĺ°ç§é’Ą" NO_PRIVATE_KEY_FOUND_FOR: "ć— ćł•ć‰ľĺ° \\\"%EMAIL%\\\" çš„ç§é’Ą" ADD_A_PUBLICK_KEY: "添加公钥" SELECT_A_PRIVATE_KEY: "选择一个ç§é’Ą" UNVERIFIRED_SIGNATURE: "未验čŻçš„ç­ľĺŤ" DECRYPTION_ERROR: "OpenPGP 解密出错" GOOD_SIGNATURE: "来自 %USER% 的可用签ĺŤ" PGP_ERROR: "OpenPGP 错误: %ERROR%" SPECIFY_FROM_EMAIL: "请指定发件人电邮地址" SPECIFY_AT_LEAST_ONE_RECIPIENT: "请指定至少一个收件人地址" NOTIFICATIONS: INVALID_TOKEN: "ć— ć•标记" AUTH_ERROR: "认čŻĺ¤±č´Ą" ACCESS_ERROR: "访问错误" CONNECTION_ERROR: "无法连接服务器" CAPTCHA_ERROR: "验čŻç ä¸Ťć­Łçˇ®ă€‚" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "域不ĺ…许" ACCOUNT_NOT_ALLOWED: "č´¦ć·ä¸Ťĺ…许" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "需č¦čż›čˇŚä¸¤ć­ĄéŞŚčŻ" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "两步验čŻé”™čŻŻ" COULD_NOT_SAVE_NEW_PASSWORD: "无法保ĺ­ć–°ĺ݆ç " CURRENT_PASSWORD_INCORRECT: "当前密ç ä¸Ťć­Łçˇ®" NEW_PASSWORD_SHORT: "密ç ĺ¤Şçź­" NEW_PASSWORD_WEAK: "密ç čż‡äşŽç®€ĺŤ•" NEW_PASSWORD_FORBIDDENT: "密ç ĺŚ…ĺ«ç¦ć­˘ĺ­—符" CONTACTS_SYNC_ERROR: "č”系人ĺŚć­Ąé”™čŻŻ" CANT_GET_MESSAGE_LIST: "无法获取邮件ĺ—表" CANT_GET_MESSAGE: "无法获取邮件" CANT_DELETE_MESSAGE: "ć— ćł•ĺ é™¤é‚®ä»¶" CANT_MOVE_MESSAGE: "无法移动邮件" CANT_SAVE_MESSAGE: "无法保ĺ­é‚®ä»¶" CANT_SEND_MESSAGE: "无法发é€é‚®ä»¶" INVALID_RECIPIENTS: "ć— ć•接收人" CANT_SAVE_FILTERS: "无法保ĺ­ç­›é€‰ĺ™¨č§„ĺ™" CANT_GET_FILTERS: "无法获取筛选器规ĺ™" FILTERS_ARE_NOT_CORRECT: "不正确的筛选器规ĺ™" CANT_CREATE_FOLDER: "ć— ćł•ĺ›ĺ»şć–‡ä»¶ĺ¤ą" CANT_RENAME_FOLDER: "无法重命ĺŤć–‡ä»¶ĺ¤ą" CANT_DELETE_FOLDER: "ć— ćł•ĺ é™¤ć–‡ä»¶ĺ¤ą" CANT_DELETE_NON_EMPTY_FOLDER: "ć— ćł•ĺ é™¤éťžç©şć–‡ä»¶ĺ¤ą" CANT_SUBSCRIBE_FOLDER: "无法订é…文件夹" CANT_UNSUBSCRIBE_FOLDER: "无法取ć¶č®˘é…文件夹" CANT_SAVE_SETTINGS: "无法保ĺ­č®ľç˝®" CANT_SAVE_PLUGIN_SETTINGS: "无法保ĺ­č®ľç˝®" DOMAIN_ALREADY_EXISTS: "域已经ĺ­ĺś¨" CANT_INSTALL_PACKAGE: "安装包失败" CANT_DELETE_PACKAGE: "移除包失败" INVALID_PLUGIN_PACKAGE: "ć— ć•插件" UNSUPPORTED_PLUGIN_PACKAGE: "不支ćŚçš„插件" LICENSING_SERVER_IS_UNAVAILABLE: "订é…服务器无ć•" LICENSING_DOMAIN_EXPIRED: "此域订é…服务已失ć•。" LICENSING_DOMAIN_BANNED: "此域订é…服务已ç¦ć­˘ă€‚" DEMO_SEND_MESSAGE_ERROR: "出于安全č€č™‘,测试账号无法发é€ĺ¤–é¨é‚®ä»¶ă€‚" DEMO_ACCOUNT_ERROR: "由于安保原因,本账号无法进行此操作ďĽ" ACCOUNT_ALREADY_EXISTS: "č´¦ć·ĺ·˛ĺ­ĺś¨" ACCOUNT_DOES_NOT_EXIST: "č´¦ć·ä¸Ťĺ­ĺś¨" MAIL_SERVER_ERROR: "访问邮件服务器é‡ĺ°é”™čŻŻă€‚" INVALID_INPUT_ARGUMENT: "ć— ć•的参数输入" UNKNOWN_ERROR: "未知错误" STATIC: BACK_LINK: "重新加载" DOMAIN_LIST_DESC: "可以通过webmail访问的域ĺ—表" PHP_EXSTENSIONS_ERROR_DESC: "需č¦çš„PHP扩展未配置ďĽ" PHP_VERSION_ERROR_DESC: "您的PHPç‰ćś¬ (%VERSION%) 低于所需的 5.3.0ďĽ" NO_SCRIPT_TITLE: "JavaScript 需č¦ĺŻç”¨ďĽ" NO_SCRIPT_DESC: | 您的浏č§ĺ™¨ä¸Ťć”ŻćŚJavaScript。 请ĺŻç”¨ćµŹč§ĺ™¨çš„JavaScript支ćŚĺą¶é‡ŤčŻ•ă€‚ NO_COOKIE_TITLE: "Cookies 需č¦ĺŻç”¨ďĽ" NO_COOKIE_DESC: | 您的浏č§ĺ™¨ä¸Ťć”ŻćŚCookies。 请ĺŻç”¨ćµŹč§ĺ™¨çš„Cookies支ćŚĺą¶é‡ŤčŻ•ă€‚ BAD_BROWSER_TITLE: "您的浏č§ĺ™¨ç‰ćś¬ĺ¤Şä˝Ž" BAD_BROWSER_DESC: | 如果ćłä˝żç”¨ć‰€ćś‰ĺŠźč˝ďĽŚ 下载并安装下ĺ—其中一款浏č§ĺ™¨ďĽš rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/localization/webmail/zh_TW.yml000066400000000000000000000700611361462701300262360ustar00rootroot00000000000000zh_TW: LOGIN: LABEL_EMAIL: "éµä»¶" LABEL_LOGIN: "登錄" LABEL_PASSWORD: "密碼" LABEL_SIGN_ME: "č¨ä˝Źć‘" LABEL_VERIFICATION_CODE: "驗證碼" LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" BUTTON_SIGN_IN: "登入" TITLE_SIGN_IN_GOOGLE: "使用Google帳號登錄" TITLE_SIGN_IN_FACEBOOK: "使用Facebook帳號登錄" TITLE_SIGN_IN_TWITTER: "使用Twitter帳號登錄" LABEL_FORGOT_PASSWORD: "Forgot password" LABEL_REGISTRATION: "Registration" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "添加帳ć¶" BUTTON_SETTINGS: "設置" BUTTON_HELP: "Help" BUTTON_LOGOUT: "註銷" SEARCH: MAIN_INPUT_PLACEHOLDER: "ćśç´˘" TITLE_ADV: "é«ç´šćśç´˘" LABEL_ADV_FROM: "發é€č‡Ş" LABEL_ADV_TO: "發é€ĺ°" LABEL_ADV_SUBJECT: "主題" LABEL_ADV_TEXT: "內容" LABEL_ADV_HAS_ATTACHMENT: "有附件" LABEL_ADV_HAS_ATTACHMENTS: "有附件" LABEL_ADV_FLAGGED: "標č¨" LABEL_ADV_UNSEEN: "Unseen" LABEL_ADV_DATE: "ć—Ąćśź" LABEL_ADV_DATE_ALL: "所有éµä»¶" LABEL_ADV_DATE_3_DAYS: "3天以內" LABEL_ADV_DATE_7_DAYS: "1周以內" LABEL_ADV_DATE_MONTH: "1ćśä»Ąĺ…§" LABEL_ADV_DATE_3_MONTHS: "3ćśä»Ąĺ…§" LABEL_ADV_DATE_6_MONTHS: "半年以內" LABEL_ADV_DATE_YEAR: "1年以內" BUTTON_ADV_SEARCH: "ćśç´˘" PREVIEW_POPUP: FULLSCREEN: "Toggle fullscreen" ZOOM: "Zoom in/out" CLOSE: "é—śé–‰ (Esc)" LOADING: "載入..." GALLERY_PREV: "ĺ‘前 (Left arrow key)" GALLERY_NEXT: "ĺ‘後 (Right arrow key)" GALLERY_COUNTER: "%curr% / %total%" IMAGE_ERROR: "圖片 無法載入。" AJAX_ERROR: "內容 無法載入。" FOLDER_LIST: BUTTON_COMPOSE: "寫éµä»¶" BUTTON_CONTACTS: "連絡人" INBOX_NAME: "ć”¶ä»¶ç®±" SENT_NAME: "已發éµä»¶" DRAFTS_NAME: "草稿" SPAM_NAME: "ĺžĺśľéµä»¶" TRASH_NAME: "ĺ·˛ĺŞé™¤éµä»¶" ARCHIVE_NAME: "ĺ­ćŞ”" QUOTA: TITLE: "ĺ­ĺ„˛ç©şé–“使用量" MESSAGE_LIST: BUTTON_RELOAD: "重新載入éµĺŻ„ć¸…ĺ–®" BUTTON_MOVE_TO: "移至" BUTTON_DELETE: "ĺ·˛ĺŞé™¤éµä»¶" BUTTON_ARCHIVE: "ĺ­ćŞ”" BUTTON_SPAM: "ĺžĺśľéµä»¶" BUTTON_NOT_SPAM: "Not Spam" BUTTON_EMPTY_FOLDER: "清空資料夾" BUTTON_MULTY_FORWARD: "轉發éµä»¶" BUTTON_DELETE_WITHOUT_MOVE: "永久ĺŞé™¤" BUTTON_MORE: "更多" MENU_SET_SEEN: "標č¨ç‚şĺ·˛č®€" MENU_SET_ALL_SEEN: "標č¨ĺ…¨é¨ç‚şĺ·˛č®€" MENU_UNSET_SEEN: "標č¨ç‚şćśŞč®€" MENU_SET_FLAG: "加注ćźć¨™" MENU_UNSET_FLAG: "移除ćźć¨™" MENU_SELECT_ALL: "ĺ…¨é¨" MENU_SELECT_NONE: "無" MENU_SELECT_INVERT: "é¸ć“‡" MENU_SELECT_UNSEEN: "未讀" MENU_SELECT_SEEN: "已讀" MENU_SELECT_FLAGGED: "已加ćźć¨™" MENU_SELECT_UNFLAGGED: "未加ćźć¨™" EMPTY_LIST: "空ĺ—表。" EMPTY_SEARCH_LIST: "未找ĺ°ć‚¨ćłč¦çš„。" SEARCH_RESULT_FOR: "ćśç´˘ \"%SEARCH%\" çš„çµćžś" BACK_TO_MESSAGE_LIST: "back to message list" LIST_LOADING: "載入中" EMPTY_SUBJECT_TEXT: "(無主題)" PUT_MESSAGE_HERE: "在這裡查看éµä»¶" TODAY_AT: "今日於 %TIME%" YESTERDAY_AT: "ć¨ĺ¤© %TIME%" SEARCH_PLACEHOLDER: "ćśç´˘" NEW_MESSAGE_NOTIFICATION: "您有 %COUNT% ĺ°ć–°éµä»¶ďĽ" QUOTA_SIZE: "使用了%LIMIT% ĺ­ĺ„˛ç©şé–“中的%SIZE% (%PROC%%)" MESSAGE: BUTTON_EDIT: "編輯" BUTTON_BACK: "返回" BUTTON_CLOSE: "é—śé–‰" BUTTON_DELETE: "ĺŞé™¤" BUTTON_ARCHIVE: "ĺ­ćŞ”" BUTTON_SPAM: "ĺžĺśľéµä»¶" BUTTON_NOT_SPAM: "Not Spam" BUTTON_MOVE_TO: "移至" BUTTON_MORE: "更多" BUTTON_REPLY: "回復" BUTTON_REPLY_ALL: "ĺ…¨é¨ĺ›žĺľ©" BUTTON_FORWARD: "轉發" BUTTON_FORWARD_AS_ATTACHMENT: "帶附件轉發" BUTTON_EDIT_AS_NEW: "Edit as New" BUTTON_SHOW_IMAGES: "顯示外é¨ĺś–片" BUTTON_NOTIFY_READ_RECEIPT: "The sender has asked to be notified when you read this message." BUTTON_IN_NEW_WINDOW: "在新窗口中查看" BUTTON_THREAD_LIST: "Thread list" BUTTON_THREAD_PREV: "Previous" BUTTON_THREAD_NEXT: "Next" BUTTON_THREAD_MORE: "More messages" MENU_HEADERS: "顯示詳細資訊" MENU_VIEW_ORIGINAL: "顯示原始內容" MENU_DOWNLOAD_ORIGINAL: "作為 .eml 文件下載" MENU_FILTER_SIMILAR: "éŽćżľéµä»¶ĺ¦‚ć­¤" MENU_PRINT: "ĺ—印éµä»¶" EMPTY_SUBJECT_TEXT: "(無主題)" LABEL_SUBJECT: "主題" LABEL_DATE: "ć—Ąćśź" LABEL_FROM: "發é€č‡Ş" LABEL_FROM_SHORT: "from" LABEL_TO: "發é€ĺ°" LABEL_TO_SHORT: "to" LABEL_CC: "複本" LABEL_BCC: "密件複本" LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_FROM: "發é€č‡Ş" PRINT_LABEL_TO: "發é€ĺ°" PRINT_LABEL_CC: "複本" PRINT_LABEL_BCC: "密件複本" PRINT_LABEL_REPLY_TO: "Reply-To" PRINT_LABEL_DATE: "ć—Ąćśź" PRINT_LABEL_SUBJECT: "主題" PRINT_LABEL_ATTACHMENTS: "附件" MESSAGE_LOADING: "載入中" MESSAGE_VIEW_DESC: "在此查看ĺ—表中é¸ä¸­çš„éµä»¶ă€‚" PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "ćśç´˘ä¸­..." CONTACTS: LEGEND_CONTACTS: "連絡人" SEARCH_INPUT_PLACEHOLDER: "ćśç´˘" BUTTON_ADD_CONTACT: "添加連絡人" BUTTON_CREATE_CONTACT: "新增連絡人" BUTTON_UPDATE_CONTACT: "更新連絡人" BUTTON_IMPORT: "ĺ°Žĺ…Ą (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "匯出 (vcf, vCard)" BUTTON_EXPORT_CSV: "匯出 (csv)" ERROR_IMPORT_FILE: "導入錯誤 (invalid file format)" LIST_LOADING: "載入中" EMPTY_LIST: "暫無連絡人" EMPTY_SEARCH: "沒找ĺ°é€Łçµˇäşş" CLEAR_SEARCH: "清除ćśç´˘" CONTACT_VIEW_DESC: "在此查看在ĺ—表中é¸ä¸­çš„連絡人。" LABEL_DISPLAY_NAME: "顯示ĺŤĺ­—" LABEL_EMAIL: "Email" LABEL_PHONE: "電話" LABEL_WEB: "網站" LABEL_BIRTHDAY: "生日" LINK_ADD_EMAIL: "添加 Email 地址" LINK_ADD_PHONE: "添加電話" LINK_BIRTHDAY: "生日" PLACEHOLDER_ENTER_DISPLAY_NAME: "顯示ĺŤç¨±" PLACEHOLDER_ENTER_LAST_NAME: "ĺ§“" PLACEHOLDER_ENTER_FIRST_NAME: "ĺŤ" PLACEHOLDER_ENTER_NICK_NAME: "ćµç¨±" LABEL_READ_ONLY: "Read only" LABEL_SHARE: "ĺ†äş«" ADD_MENU_LABEL: "添加" ADD_MENU_NICKNAME: "暱稱" ADD_MENU_NOTES: "Notes" ADD_MENU_EMAIL: "Email" ADD_MENU_PHONE: "電話" ADD_MENU_URL: "網址" ADD_MENU_ADDRESS: "地址" ADD_MENU_BIRTHDAY: "生日" ADD_MENU_TAGS: "Tags" BUTTON_SHARE_NONE: "無" BUTTON_SHARE_ALL: "所有人" BUTTON_SYNC: "ĺŚć­Ą (CardDAV)" COMPOSE: TITLE_FROM: "發é€č‡Ş" TITLE_TO: "發é€ĺ°" TITLE_CC: "複本" TITLE_BCC: "密件複本" TITLE_REPLY_TO: "回復" TITLE_SUBJECT: "主題" LINK_SHOW_INPUTS: "顯示所有資訊" BUTTON_SEND: "發é€" BUTTON_SAVE: "äżťĺ­" BUTTON_DELETE: "ĺŞé™¤" BUTTON_CANCEL: "取ć¶" BUTTON_MINIMIZE: "Minimize" SAVED_TIME: "äżťĺ­ć–Ľ %TIME%" SAVED_ERROR_ON_SEND: "éµä»¶ĺ·˛ç™Ľé€ä˝†ä¸¦ćśŞäżťĺ­ĺś¨ĺ·˛ç™ĽéµĺŻ„ć¸…ĺ–®ä¸­ă€‚" DISCARD_UNSAVED_DATA: "Discard unsaved data?" ATTACH_FILES: "添加附件" ATTACH_DROP_FILES_DESC: "拖動文件至此" ATTACH_ITEM_CANCEL: "取ć¶" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% 寫ĺ°" FORWARD_MESSAGE_TOP_TITLE: "-------- 轉發éµä»¶ -------" FORWARD_MESSAGE_TOP_FROM: "發é€č‡Ş" FORWARD_MESSAGE_TOP_TO: "發é€ĺ°" FORWARD_MESSAGE_TOP_CC: "複本" FORWARD_MESSAGE_TOP_SENT: "發é€" FORWARD_MESSAGE_TOP_SUBJECT: "主題" EMPTY_TO_ERROR_DESC: "請至少é¸ć“‡ä¸€ä˝ŤćŽĄć”¶äşş" NO_ATTACHMENTS_HERE_DESC: "No attachments here." ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" BUTTON_REQUEST_READ_RECEIPT: "Request a read receipt" BUTTON_MARK_AS_IMPORTANT: "Mark as important" BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" BUTTON_REQUEST_DSN: "Request a delivery receipt" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Close" POPUPS_ASK: BUTTON_YES: "ćŻ" BUTTON_NO: "ĺ¦" DESC_WANT_CLOSE_THIS_WINDOW: "你確定č¦é—śé–‰ć­¤çŞ—ĺŹŁĺ—Ž?" DESC_WANT_DELETE_MESSAGES: "你確定你č¦ĺŞé™¤é€™ć˘ťć¶ćŻĺ—Ž?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "é¸ć“‡čŞžč¨€" POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "添加帳ć¶?" BUTTON_ADD_ACCOUNT: "添加" TITLE_UPDATE_ACCOUNT: "Update Account?" BUTTON_UPDATE_ACCOUNT: "Update" POPUPS_IDENTITY: TITLE_ADD_IDENTITY: "添加簽ĺŤ?" TITLE_UPDATE_IDENTITY: "ć›´ć–°ç°˝ĺŤ?" BUTTON_ADD_IDENTITY: "添加" BUTTON_UPDATE_IDENTITY: "ć›´ć–°" LABEL_EMAIL: "Email" LABEL_NAME: "ĺ§“ĺŤ" LABEL_REPLY_TO: "回復" LABEL_SIGNATURE: "Signature" LABEL_CC: "Cc" LABEL_BCC: "密件複本" LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "創建資料夾?" LABEL_NAME: "資料夾ĺŤç¨±" LABEL_PARENT: "ç¶čł‡ć–™ĺ¤ľ" BUTTON_CREATE: "創建" BUTTON_CANCEL: "取ć¶" BUTTON_CLOSE: "é—śé–‰" TITLE_CREATING_PROCESS: "資料夾創建中" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "清ç†čł‡ć–™ĺ¤ľä¸­ć‰€ćś‰éµä»¶?" BUTTON_CLEAR: "清ç†" BUTTON_CANCEL: "取ć¶" BUTTON_CLOSE: "é—śé–‰" DANGER_DESC_WARNING: "警告ďĽ" DANGER_DESC_HTML_1: "此操作將完全ĺŞé™¤čł‡ć–™ĺ¤ľ %FOLDER% 中的所有éµä»¶ďĽ" DANGER_DESC_HTML_2: "一旦操作執行,不可中斷和撤銷ďĽ" TITLE_CLEARING_PROCESS: "資料夾清ç†ä¸­..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "ĺ°Žĺ…Ą OpenPGP 密鑰" BUTTON_IMPORT_OPEN_PGP_KEY: "ĺ°Žĺ…Ą" POPUPS_VIEW_OPEN_PGP_KEY: TITLE_VIEW_OPEN_PGP_KEY: "查看 OpenPGP 密鑰" BUTTON_SELECT: "é¸ć“‡" BUTTON_CLOSE: "é—śé–‰" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "生ć OpenPGP 密鑰" LABEL_EMAIL: "Email" LABEL_NAME: "ĺŤĺ­—" LABEL_PASSWORD: "密碼" LABEL_KEY_BIT_LENGTH: "密鑰長度" BUTTON_GENERATE_OPEN_PGP_KEYS: "生ć" POPUPS_COMPOSE_OPEN_PGP: TITLE_COMPOSE_OPEN_PGP: "OpenPGP Sign/Encrypt" LABEL_SIGN: "Sign" LABEL_ENCRYPT: "Encrypt" LABEL_PASSWORD: "Password" BUTTON_SIGN: "Sign" BUTTON_ENCRYPT: "Encrypt" BUTTON_SIGN_AND_ENCRYPT: "Sign and encrypt" POPUPS_MESSAGE_OPEN_PGP: TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" LABEL_KEY: "Private Key" LABEL_PASSWORD: "Password" BUTTON_DECRYPT: "Decrypt" POPUPS_TWO_FACTOR_TEST: TITLE_TEST_CODE: "兩步驗證測試" LABEL_CODE: "代碼" BUTTON_TEST: "測試" POPUPS_FILTER: TITLE_CREATE_FILTER: "Create a filter?" TITLE_EDIT_FILTER: "Update filter?" FILTER_NAME: "Name" LEGEND_CONDITIONS: "Conditions" LEGEND_ACTIONS: "Actions" BUTTON_DONE: "Done" BUTTON_ADD_CONDITION: "Add a Condition" SELECT_ACTION_NONE: "None" SELECT_ACTION_MOVE_TO: "Move to" SELECT_ACTION_FORWARD_TO: "Forward to" SELECT_ACTION_REJECT: "Reject" SELECT_ACTION_VACATION_MESSAGE: "Vacation message" SELECT_ACTION_DISCARD: "Discard" SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" SELECT_FIELD_HEADER: "Header" SELECT_FIELD_SIZE: "Size" SELECT_TYPE_CONTAINS: "Contains" SELECT_TYPE_NOT_CONTAINS: "Not Contains" SELECT_TYPE_MATCHES: "Matches (* and ? supported)" SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" SELECT_TYPE_EQUAL_TO: "Equal To" SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" SELECT_TYPE_OVER: "Over" SELECT_TYPE_UNDER: "Under" SELECT_MATCH_ANY: "Matching any of the following rules" SELECT_MATCH_ALL: "Matching all of the following rules" MARK_AS_READ_LABEL: "Mark as read" REPLY_INTERVAL_LABEL: "Reply interval (days)" KEEP_LABEL: "Keep" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" VACATION_SUBJECT_LABEL: "Subject (optional)" VACATION_MESSAGE_LABEL: "Message" VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" REJECT_MESSAGE_LABEL: "Reject message" ALL_INCOMING_MESSAGES_DESC: "All incoming messages" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "é¸ć“‡çł»çµ±čł‡ć–™ĺ¤ľ" SELECT_CHOOSE_ONE: "é¸ć“‡ä¸€ĺ€‹" SELECT_UNUSE_NAME: "不使用" LABEL_SENT: "已發éµä»¶" LABEL_DRAFTS: "草稿" LABEL_SPAM: "ĺžĺśľéµä»¶" LABEL_TRASH: "ĺ·˛ĺŞé™¤éµä»¶" LABEL_ARCHIVE: "ĺ­ćŞ”" BUTTON_CANCEL: "取ć¶" BUTTON_CLOSE: "é—śé–‰" NOTIFICATION_SENT: | 您沒有é¸ć“‡ 已發éµä»¶ 資料夾來ĺ­ĺ„˛ĺ·˛ç™Ľé€éµä»¶ă€‚ 如果您不希望保ĺ­ĺ·˛ç™Ľéµä»¶ďĽŚč«‹é¸ć“‡ 不使用 é¸é …。 NOTIFICATION_DRAFTS: "您沒有é¸ć“‡ 草稿 資料夾來ĺ­ĺ„˛éµä»¶čŤ‰ç¨żă€‚" NOTIFICATION_SPAM: | 您沒有é¸ć“‡ ĺžĺśľéµä»¶ 資料夾來ĺ­ĺ„˛ĺžĺśľéµä»¶ă€‚ 如果您希望永久ĺŞé™¤éµä»¶ďĽŚč«‹é¸ć“‡ 不使用 é¸é …。 NOTIFICATION_TRASH: | 您沒有é¸ć“‡ ĺ·˛ĺŞé™¤éµä»¶ 資料夾來ĺ­ĺ„˛ĺžĺśľéµä»¶ă€‚ 如果您希望永久ĺŞé™¤éµä»¶ďĽŚč«‹é¸ć“‡ 不使用 é¸é …。 NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "ĺ…©ć­Ąé©—č­‰" LABEL_ENABLE_TWO_FACTOR: "啟用兩步驗證" LABEL_TWO_FACTOR_USER: "用ć¶" LABEL_TWO_FACTOR_STATUS: "狀態" LABEL_TWO_FACTOR_SECRET: "Secret" LABEL_TWO_FACTOR_BACKUP_CODES: "備份代碼" BUTTON_CREATE: "Create New Secret" BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Clear" BUTTON_LOGOUT: "Logout" BUTTON_DONE: "Done" BUTTON_TEST: "測試" LINK_TEST: "test" BUTTON_SHOW_SECRET: "Show Secret" BUTTON_HIDE_SECRET: "Hide Secret" TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" TWO_FACTOR_SECRET_DESC: >- Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually. TWO_FACTOR_BACKUP_CODES_DESC: >- If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "載入中" LOGIN: "登錄" MAILBOX: "éµç®±" SETTINGS: "設置" COMPOSE: "寫éµä»¶" UPLOAD: ERROR_FILE_IS_TOO_BIG: "文件太大" ERROR_FILE_PARTIALLY_UPLOADED: "é­é‡ćśŞçźĄéŚŻčŞ¤ďĽŚćŞ”ç„ˇćł•ä¸Šĺ‚ł" ERROR_NO_FILE_UPLOADED: "沒有檔上傳" ERROR_MISSING_TEMP_FOLDER: "ćš«ĺ­ćŞ”ćˇä¸źĺ¤±" ERROR_ON_SAVING_FILE: "é­é‡ćśŞçźĄéŚŻčŞ¤" ERROR_FILE_TYPE: "無ć•檔ćˇéˇžĺž‹" ERROR_UNKNOWN: "未知檔上傳錯誤" EDITOR: TEXT_SWITCHER_RICH_FORMATTING: "完整文本" TEXT_SWITCHER_CONFIRM: "檔ćˇć ĽĺĽŹĺŹŠĺś–ç‰‡ĺ°‡ä¸źĺ¤±ďĽŚć‚¨ç˘şĺ®šçąĽçşŚé€™éşĽĺšďĽź" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "個人" LABEL_GENERAL_NAME: "一č¬č¨­ç˝®" LABEL_CONTACTS_NAME: "連絡人" LABEL_FOLDERS_NAME: "資料夾" LABEL_ACCOUNTS_NAME: "帳ć¶" LABEL_IDENTITY_NAME: "ç°˝ĺŤ" LABEL_IDENTITIES_NAME: "ç°˝ĺŤ" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" LABEL_SECURITY_NAME: "安全" LABEL_SOCIAL_NAME: "社交" LABEL_THEMES_NAME: "主題" LABEL_CHANGE_PASSWORD_NAME: "密碼" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "返回" SETTINGS_FILTERS: LEGEND_FILTERS: "Filters" BUTTON_SAVE: "Save" BUTTON_ADD_FILTER: "Add a Filter" BUTTON_DELETE: "Delete" BUTTON_RAW_SCRIPT: "Use Custom User Script" SUBNAME_NONE: "None" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" SUBNAME_VACATION_MESSAGE: "Vacation message" SUBNAME_DISCARD: "Discard" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Updating filter list" DELETING_ASK: "Are you sure?" CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." SETTINGS_IDENTITY: LEGEND_IDENTITY: "ç°˝ĺŤ" LABEL_DISPLAY_NAME: "ĺŤç¨±" LABEL_REPLY_TO: "回復" LABEL_SIGNATURE: "ç°˝ĺŤ" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "一č¬č¨­ç˝®" LABEL_LANGUAGE: "語言" LABEL_IDENTITY: "Identity" LABEL_LAYOUT: "Layout" LABEL_LAYOUT_NO_SPLIT: "No Split" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" LABEL_EDITOR: "é»čŞŤć ĽĺĽŹ" LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Plain" LABEL_EDITOR_HTML_FORCED: "Html (forced)" LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" LABEL_ANIMATION: "介面動畫" LABEL_ANIMATION_FULL: "完整" LABEL_ANIMATION_NORMAL: "正常" LABEL_ANIMATION_NONE: "無" LABEL_VIEW_OPTIONS: "視圖é¸é …" LABEL_USE_PREVIEW_PANE: "使用é č¦˝" LABEL_USE_CHECKBOXES_IN_LIST: "清單中顯示多é¸ćˇ†" LABEL_USE_THREADS: "使用對話" LABEL_REPLY_SAME_FOLDER: "將回復的éµä»¶ć”ľç˝®ĺ°ĺ…¶ĺ›žĺľ©çš„éµä»¶ć‰€ĺś¨čł‡ć–™ĺ¤ľ" LABEL_SHOW_IMAGES: "總ćŻéˇŻç¤şĺ¤–é¨ĺś–片資訊" LABEL_SHOW_ANIMATION: "顯示動畫" LABEL_MESSAGE_PER_PAGE: "ĺ°éµä»¶ćŻŹé " LABEL_NOTIFICATIONS: "通知" LABEL_SOUND_NOTIFICATION: "Sound notification" LABEL_CHROME_NOTIFICATION_DESC: "顯示新éµä»¶ĺ˝çŞ—" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(被瀏覽器é»ć­˘)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "連絡人" LABEL_CONTACTS_AUTOSAVE: "自動添加ĺ°ä˝ çš„位址簿" LEGEND_CONTACTS_SYNC: "é ç¨‹ĺŚć­Ą(CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "啟用é ç¨‹ĺŚć­Ą" LABEL_CONTACTS_SYNC_SERVER: "伺服器" LABEL_CONTACTS_SYNC_AB_URL: "地址簿URL" LABEL_CONTACTS_SYNC_USER: "用ć¶ĺŤ" LABEL_CONTACTS_SYNC_PASSWORD: "密碼" SETTINGS_THEMES: LEGEND_THEMES: "主題" LEGEND_THEMES_CUSTOM: "自訂主題設置" LABEL_CUSTOM_TYPE: "類型" LABEL_CUSTOM_TYPE_LIGHT: "ćŽäş®" LABEL_CUSTOM_TYPE_DARK: "暗沉" LABEL_CUSTOM_BACKGROUND_IMAGE: "čŚć™Ż" BUTTON_UPLOAD_BACKGROUND_IMAGE: "上傳čŚć™Ż (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "文件太大" ERROR_FILE_TYPE_ERROR: "無ć•類型 (只支援JPGĺ’ŚPNG)" ERROR_UNKNOWN: "上傳時發生未知錯誤" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "é€ŁćŽĄĺ° Google" BUTTON_GOOGLE_DISCONNECT: "ć–·é–‹ Google 連接" MAIN_GOOGLE_DESC: "After enabling login via Google, you can log into this account using Google button on the login screen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "é€ŁćŽĄĺ° Facebook" BUTTON_FACEBOOK_DISCONNECT: "ć–·é–‹ Facebook 連çµ" MAIN_FACEBOOK_DESC: "After enabling login via Facebook, you can log into this account using Facebook button on the login screen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "é€ŁćŽĄĺ° Twitter" BUTTON_TWITTER_DISCONNECT: "ć–·é–‹ Twitter 連接" MAIN_TWITTER_DESC: "After enabling login via Twitter, you can log into this account using Twitter button on the login screen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "資料夾" BUTTON_CREATE: "新建資料夾" BUTTON_DELETE: "ĺŞé™¤" BUTTON_SUBSCRIBE: "訂閱" BUTTON_UNSUBSCRIBE: "取ć¶č¨‚é–±" LOADING_PROCESS: "資料夾清單更新" CREATING_PROCESS: "資料夾創建中" DELETING_PROCESS: "資料夾ĺŞé™¤ä¸­" RENAMING_PROCESS: "資料夾重命ĺŤ" DELETING_ASK: "確定?" TO_MANY_FOLDERS_DESC_1: "You have too many folders!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." HELP_DELETE_FOLDER: "Delete folder" HELP_SHOW_HIDE_FOLDER: "Show/hide folder" HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "帳ć¶ĺ—表" LEGEND_IDENTITIES: "Identities" LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" BUTTON_ADD_ACCOUNT: "添加一個帳ć¶" BUTTON_ADD_IDENTITY: "Add an Identity" BUTTON_DELETE: "ĺŞé™¤" LOADING_PROCESS: "更新帳ć¶ĺ—表中" DELETING_ASK: "確定?" DEFAULT_IDENTITY_LABEL: "default" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "ç°˝ĺŤ" LEGEND_IDENTITIES: "附加簽ĺŤ" LABEL_DEFAULT: "Default" LABEL_DISPLAY_NAME: "ĺŤç¨±" LABEL_REPLY_TO: "回復" LABEL_SIGNATURE: "ç°˝ĺŤ" LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" BUTTON_ADD_IDENTITY: "添加簽ĺŤ" BUTTON_DELETE: "ĺŞé™¤" LOADING_PROCESS: "ć›´ć–°ç°˝ĺŤä¸­" DELETING_ASK: "確定?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "修改密碼" LABEL_CURRENT_PASSWORD: "當前密碼" LABEL_NEW_PASSWORD: "新密碼" LABEL_REPEAT_PASSWORD: "再次新密碼" BUTTON_UPDATE_PASSWORD: "設置新密碼" ERROR_PASSWORD_MISMATCH: "密碼不匹配,請再試一次" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "ĺ°Žĺ…Ą OpenPGP Key" BUTTON_GENERATE_OPEN_PGP_KEYS: "生ć OpenPGP 密鑰" TITLE_PRIVATE: "ç§ćś‰" TITLE_PUBLIC: "公開" DELETING_ASK: "你確定嗎?" GENERATE_ONLY_HTTPS: "HTTPS only" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" TAB_MESSAGE_LIST: "Message list" TAB_MESSAGE_VIEW: "Message view" TAB_COMPOSE: "Compose" LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" LABEL_REPLY: "回復" LABEL_REPLY_ALL: "回復所有" LABEL_FORWARD: "Forward" LABEL_FORWARD_MULTIPLY: "Forward (multiply)" LABEL_HELP: "幫助" LABEL_CHECK_ALL: "檢查所有ć¶ćŻ" LABEL_ARCHIVE: "ĺ­ćŞ”" LABEL_DELETE: "ĺŞé™¤" LABEL_OPEN_THREAD: "Open selected thread" LABEL_MOVE: "移動" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" LABEL_THREAD_NEXT: "Next message in thread" LABEL_THREAD_PREV: "Previous message in thread" LABEL_PRINT: "Print" LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" LABEL_SWITCH_TO_LIST: "Switch focus back to message list" LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" LABEL_SAVE_MESSAGE: "Save message" LABEL_SEND_MESSAGE: "Send message" LABEL_CLOSE_COMPOSE: "Close compose" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "No public keys found" NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" PGP_ERROR: "OpenPGP error: %ERROR%" SPECIFY_FROM_EMAIL: "Please specify FROM email address" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" NOTIFICATIONS: INVALID_TOKEN: "無ć•標č¨" AUTH_ERROR: "認證失敗" ACCESS_ERROR: "訪問錯誤" CONNECTION_ERROR: "無法連接伺服器" CAPTCHA_ERROR: "驗證碼不正確。" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- This social ID is not assigned for any email account yet. Log in using email credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "無法連接ĺ°č©˛ĺźźć–者未輸入域" ACCOUNT_NOT_ALLOWED: "帳ć¶ä¸Ťĺ…許" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "兩步驗證錯誤" COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" CURRENT_PASSWORD_INCORRECT: "當前密碼不正確" NEW_PASSWORD_SHORT: "密碼太短" NEW_PASSWORD_WEAK: "密碼éŽć–Ľç°ˇĺ–®" NEW_PASSWORD_FORBIDDENT: "密碼包ĺ«ç¦ć­˘ĺ­—ĺ…" CONTACTS_SYNC_ERROR: "連絡人ĺŚć­ĄéŚŻčŞ¤" CANT_GET_MESSAGE_LIST: "無法獲取éµĺŻ„ć¸…ĺ–®" CANT_GET_MESSAGE: "無法獲取éµä»¶" CANT_DELETE_MESSAGE: "無法ĺŞé™¤éµä»¶" CANT_MOVE_MESSAGE: "無法移動éµä»¶" CANT_SAVE_MESSAGE: "無法保ĺ­éµä»¶" CANT_SEND_MESSAGE: "無法發é€éµä»¶" INVALID_RECIPIENTS: "無ć•接收人" CANT_SAVE_FILTERS: "Can't save filters" CANT_GET_FILTERS: "Can't get filters" FILTERS_ARE_NOT_CORRECT: "Filters are not correct" CANT_CREATE_FOLDER: "無法創建資料夾" CANT_RENAME_FOLDER: "無法重命ĺŤčł‡ć–™ĺ¤ľ" CANT_DELETE_FOLDER: "無法ĺŞé™¤čł‡ć–™ĺ¤ľ" CANT_DELETE_NON_EMPTY_FOLDER: "無法ĺŞé™¤éťžç©şčł‡ć–™ĺ¤ľ" CANT_SUBSCRIBE_FOLDER: "無法訂閱資料夾" CANT_UNSUBSCRIBE_FOLDER: "無法取ć¶č¨‚閱資料夾" CANT_SAVE_SETTINGS: "無法保ĺ­č¨­ç˝®" CANT_SAVE_PLUGIN_SETTINGS: "無法保ĺ­č¨­ç˝®" DOMAIN_ALREADY_EXISTS: "域已經ĺ­ĺś¨" CANT_INSTALL_PACKAGE: "安裝包失敗" CANT_DELETE_PACKAGE: "移除包失敗" INVALID_PLUGIN_PACKAGE: "無ć•外掛程式" UNSUPPORTED_PLUGIN_PACKAGE: "不支ćŚçš„外掛程式" LICENSING_SERVER_IS_UNAVAILABLE: "訂閱伺服器無ć•" LICENSING_DOMAIN_EXPIRED: "此域訂閱服務已失ć•。" LICENSING_DOMAIN_BANNED: "此域訂閱服務已ç¦ć­˘ă€‚" DEMO_SEND_MESSAGE_ERROR: "出於安全č€ć…®ďĽŚć¸¬č©¦ĺ¸łč™źç„ˇćł•發é€ĺ¤–é¨éµä»¶ă€‚" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "帳ć¶ĺ·˛ĺ­ĺś¨" MAIL_SERVER_ERROR: "訪問éµä»¶äĽşćśŤĺ™¨é‡ĺ°éŚŻčŞ¤ă€‚" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "未知錯誤" STATIC: BACK_LINK: "重新載入" DOMAIN_LIST_DESC: "可以通éŽwebmail訪問的域ĺ—表" PHP_EXSTENSIONS_ERROR_DESC: "需č¦çš„PHP擴展未配置ďĽ" PHP_VERSION_ERROR_DESC: "您的PHPç‰ćś¬ (%VERSION%) 低於所需的 5.3.0ďĽ" NO_SCRIPT_TITLE: "JavaScript 需č¦ĺ•źç”¨ďĽ" NO_SCRIPT_DESC: | 您的瀏覽器不支ćŚJavaScript。 請啟用瀏覽器的JavaScript支ćŚä¸¦é‡Ťč©¦ă€‚ NO_COOKIE_TITLE: "Cookies 需č¦ĺ•źç”¨ďĽ" NO_COOKIE_DESC: | 您的瀏覽器不支ćŚCookies。 請啟用瀏覽器的Cookies支ćŚä¸¦é‡Ťč©¦ă€‚ BAD_BROWSER_TITLE: "您的瀏覽器éŽć™‚了" BAD_BROWSER_DESC: | 為了使用所有特性, 下載並安裝其中一款瀏覽器: rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/000077500000000000000000000000001361462701300223565ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/RainLoop.asc000066400000000000000000000016521361462701300245750ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQENBFVN/RoBCAD4NYpb/iMtDARKdTnvV/9ycoTOWdAJoGAasuLprVqyI8bB0z6X ztJTqswgQcMzEwba5hQ9vuJ/Ylfww6mPvWJs/nmTUKxs2LlBldoSg25UDm7hyt59 hi9zvOTwmeDNjGf5DXMib4Uuk5pH/jsmprRDZx25xA8qD2pDo0LOv5hexTwl5teA Zh8EAAzyiNsXbX+kab9IFwSArsvYK0YJln+tPHvT29X5B5YVt9gkwY+CWA3QV/ZG d71KEp+zReHICSjSy9G646JHDoG8CQ4Nytaih5oboqjU+Hkt8GeGlRlaPm3AIXqc 3q76Og/KD1Itx7MKrfXUvCau/4HowSiO9neJABEBAAG0H1JhaW5Mb29wIDxzdXBw b3J0QHJhaW5sb29wLm5ldD6JATkEEwEIACMFAlVN/RoCGw8HCwkIBwMCAQYVCAIJ CgsEFgIDAQIeAQIXgAAKCRDtfEnZh9pFkTxVCAD0S4RMXVKsbjLm22zXE01yHWQM 25QBRb5Z8p4ER3GcRNiKRWsNRTMRpiTdPgCyfj+tgIooMbBravDJwTkoztfWOb/P l3oazxhY/ivvLalk5kVY7lflWyYYn9tfGwVJYIZCKuZ67VZwtTcf6dBhbc4DizVw LuJAY6VNwycSHe8nrESabWzYRnw5c5ex/dmk8a1rsFXcDJBUB9MdZR7pxpniS9qB JByxjP6hHo5vo1y6mPDiN1wWBd+objA7ZJaXd0jnsXRHlBAk74/O5cWvmVeExYjx aERJEMQdBoAZNG1uTnQwjNdHfVoWDpqDSUr4QPfRv8M2pwvP4V1i6qji1r5T =dVNE -----END PGP PUBLIC KEY BLOCK----- rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/000077500000000000000000000000001361462701300236235ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/empty-contact.png000066400000000000000000000035311361462701300271220ustar00rootroot00000000000000‰PNG  IHDR..Wą+7 IDAThCµYŰNW=c Ř´`ĚĹZ-‘*¤Hy¨ň›MojűP©UőZő)OT)ĄĄ"!@ $€m.ľö¬=^ĂÎÁžŰd$Ëž™3gÖľ­}±×°‡ 9ęőşI$†Ë<Ď“Ő8—k^Â4/™JĄfŞŐŞÜç:ĐnCH],žš7oŢ‹‹ ^©TD¨ľľ>ů@đááa3::jŇéA]Żăľ'ŔőŢaJÔ÷bw7Ä˲tznŽŽŽLˇPŔÖj5YĐĐ8­…ó›7oš©©)30´÷ěš„\[)řŽ€kÍ‹Esxxh VۇĚ přĆZşĎéF?>>n…\ĹŐz”bç&ü ýý}spp`}ýÖo“š&XhŤÚĆ=|°×Ę岹qă†Éçóf¸é˙®Öő>­, 8A“>6[[[M:ô}ZkÝĄ0>ŹëŚţž™Î™‘‘±h\*”@Ž˘Cw3śźśśgĎž ÍŐ.Çá„Ë5c™333Ó’»Ă4¸ Ŕź>}ę'&ë*˝™Ń÷ŰŰ·cŕŘ p1wŹĎŽŤšéééXŮR Ňpp8€ Ýő¨ńńlFh±]jď‰UÜ(nnnú‰§GŤOMŽ›\.×±·Ej\3ŠDłuňäɵźÎO™ÉÉÉ+<ŢsćlEQpGbęŐUfgňfbbâ đ(Dj\o@!PP=~üX€3sF˝¨Ý}$ ď´ĐŠĹÓ2 snllřŐ_ ×î†ßRNˇq¸J'ɧă„X`˝xńB4Ž"+ě`•Čşś"ă%ź›|‹ăZ.Ră®&°ńóçĎÍË—/ý.(‚uš‡† Ľżż_”VAćdAĺV—í ­HŕęV‡(iă¦|·Ő°Mć>śWy'ŔÝŔAćDpžźźŰ–Ó/IŰxVk çpP*ŠO? ŞCşbX9Ë÷Djś¦ÓŠßh"P“_”ýć8 8ýYОf+‡`źťµÚžČľUş•h»}cwkrÔÔp™­íťPŕôq‚§őććć$ŐŁçÄŃŞËęą‘HřĄë20÷ĘźŹbŕ¨cyyŮvü)“hVĹď¸.ţő €Ł-0¸ľ!$®±qÚ´n‚oÜOĄRćÎť;2Wp7˝ÇIF‘®ĄÎţýĎĽző*x9Á1Ý®Ł¨şuë–ĐvOęQő‰Ć śÚ˘ą9z [źÍÚÚš°zHj×í=±‰¬ą¸¸h۵÷dËŞµ““«¤°N?¸ţf á»X:3ëëë}(čĚ!}vv&uÉ‚P šřV#8—B[Y=p-ą¦EhůŃ_‹¶Ý—q8DAáFeîÝűĚZÇZÁŽáZůt”ŰÄ®ÍOéIho˙ (Ŕ ­˘š<ë¬3·oß6©AżÖi ašŹÜ5@oooË™“Tǵš­`Îq¬3??o?^wŇs>F ‘Ŕµ›ŔÜH÷Śä#ZU)ß­7čRŚ5kěÁ©,™· “ł"ë•( H˘nW–mÚĆôü.aÉ•3o\Ă\ÎťťóúőkżĚ{9š ÓPë{vöŢś)bŤ*1›Í Mr~ÎçÜĺ•+µF2yu6R­úX”Ż(cQ›@S`6µAĐ^ŽZµ0Ţ—Éd„ăaâŇV©Đ84 )‹ …’ĚńA›źÔn@÷ Ô~·ŕÓ6‹BŘJ aOŚĺőLĆN»ŕbś ă]Ćů/ÁęęŞÔÚŘHłĄ†Lßx‰žâvľÖl ĐŘC+ VĹËËź &Ţ÷jVĺř[}äĘĘŠźHÔĚš!Č čUă´é“ IťaËbKGD˙˙˙ ˝§“ pHYs  šśtIMEÜ ' dn_M IDATxÚě˝y”\W}ďűŮűŚ5vWő µÔ’,[˛%cCp!7Λä> Ľ„ŘXYć†ä’ŘŹÜH½„ĽŕŘ€3Ë ±‹x,p°vpql°`Ë,ŮHęVĎ5žůěýţ8uŽŞ[˛$cYÂŕ­uVU«Ş«OíýŰżáűűţ~[h­9ťăD˙z’&$I‚ÖĂ0°, @ €Ö´ŰíćČčč2@š$¦ €JSŇ4E)€bđ+!RJ¤”!Š×o$‰c´ÖX–…Öš0 ł{°mz~˲°-ĄÝn×*•J±mŮh4qĚď%8˝C<[ ©JI’ĄZk*n™v«ŐTJ˝´ŃlîĘß×i·­rąŮâĆš?¬QJ!Ądx„0$i’ „@kŤÖşř,•¦DQ„éÚ2űě8‰I’×u’4Á4ĚçŕéŚ$IŠ7M۶W˝îőú”+•l˘!¦i’$ †a°˛˛r…çyWݬ¬°ĽĽL·Ű%‚BäZEQh×uq˲زe ÍfSÔęőB ň{R’ŞcH¸rˇ:,gz•ĆůQ§_çďç»ořçt°ű’$ˇV­‘±×ëí4Ms÷ťwŢ©o»í6ćććđ}źN§ĂÜÜłłł,..ŇívIUz”Ý(°m›R©Dą\ƶmÎ9ç¶mŰĆÄÄ–eqÎ9çđęWżú†±ńńË @š™ĐxžW<ŹÂčşîŞĹ˙Q„g…Äq\ě®|Çi­iŻ´®źźżúć›o檫®bfv€z­N©Tbii ۶q]—R©„mŰ…ÚĎíz’$Äq¦ľLÓIJ,LÓdqq‘ĺ•eFę#t:4š ^xoűŰů…˙ú‹4›M‘ j­V[u˙ą¦9šü(Ăi€µt4ń<ĄµZ )%aňŔčGy„?˙äµ<đŔôű}*• řľO†LLL†aáä !PJf%MSjµiš?›)%AP.—‘R’$IćđŮvˇUR­ř•_ůŢö¶·ńâżXT«ŐBXmŰ>ŇżXóüt Áéש:®€ä“Ôëő¬={öDßúÖ·¸é¦›¸űî»1Ţ{­VCA†T*Â0DJYěđ0 ‰ă XD˲ĂpŐߎ¤”xžGą\FkŤďűH)©T*$IB«Ő"Őšn·KĄRáŻxoyË[¸ä’KD­^giqńúŃŃŃËŽµó…!ź€c ß÷±,‹™™ýµŻ}ŤëŻżž»îş ۶™žžĆ±,úý~±°ý~źuëÖŃëőŠpM)µ*ü3 ُrˇÖ8ůűµÖ¦Y<ćÂäyBJĄÂ0˘~żĎââ"–eń‹żř‹üîďţ.ݏđB‘ĚĘ“j€źtýÇułÉěöÜë÷ĐŹodŕL·Ű˝x¤ŮÜ•F‹‹‹zddD¬¬¬č÷ż˙ýÜvŰm¬¬¬022‚RŞŘ˝KKKŚÔę§őöĄ™i€|ÇAkMš¦„aČ…^ȇ?üaFFFn¨×ë—0Öëv)×jhôO¶¤a€aŰý>nąĚňââŢĄĄĄ­ď~÷»ůć7żIŁŃ V«!VǤiŠeY¨$=­÷§IaVVVh6›¦Iš¦8pĎóxík_Ëţáň3Żx…=§\Î~70]ç'[T# ‹ÖÄaČ˝÷Ţ«_˙ú×;}jjŠ(Ščv»8ŽSxěccc´–WNëýGIŚa¸®K†¦IEEÔ`š&Oüŕ Î{Ţy|ő«_ebbBÄqĽłZ­î––uÚ5Ŕéő@€$ŠAC„€ŕK˙řEýłŻ~ ¶iŃĄ12ʡ™YB? ^­á÷=tިWk´–WšÓzŐ«5LiĐiµâ0±ltްM ‰`jr=#µ:gťu&K ‹ş>ÚŘ!:ŠO;pÚŔ˛,bßÇpnűÖ·ôeż~###4 LÓ¤×둦iŰ;ŽCš¦ ó#c§iŠă8ĹŽ‚ 1sŕęŚ3Îŕ?îř®ľújćgf´iš\óý$ €R ˶ůö­·ęßůťßaÇŮ;h4ĚÎÎ*pbbĂ0č÷ű8Ž‚n·{D^ŕtŚ ĐZS­V‘R& G-ËbĎž=ě8{[6máÚż¸–›nş ÓuI‚ŕ9B°űÁőWľňöíŰWěšńńq|ßǶmÚí6¶m3::Šçy¦IłŮdee… Öď÷IÓ!ÍfłŔrże||Ľ€/|á ,ÍÍió'EAPŕěki[üëż}‹Ź_ű 6nš&Ś#Zť6–c%1‰J1m‹DĄxR Đ¤ZQ©UIŃÄ*EZ&‰VHË$Lââ˙c•"LÓ±QzľG§ß#V)vÉ%–ĐŤ|• \m›ĹŐ }"ˇ‰„&–š˛x-5eöZaX&©VCŇóú(4 Ť[.Q­×čűHlŮr7óţáóź#˘("đ rÍ‘ŁźQýx€ëş…˝6 ŁŔÜľ{Çú˝ď}/[ĎŘŠÖšĺĺe\×%Š˘UiÖc!…•J…ĺĺeÂ0DkÍčč(Ýn—8Žń<Ďóă˲ ˙"ż§ax7MSâ8¦T*»u^‹žPǦIÇĹâNŚOđŮĎ~–N§ŁsÜ`ŘŰĎÓɧ"OpĘL@Τɓ99nŐUWŃë÷ żaĂ<Ď+B¨ăŤfłI†LNNbŰ6ĺr™R­V™žžfbb‚jµŠ‚8މ˘¨H/--~Hî[„aH„aëşGŔ0?áD(MÓ"©”Fą\ćľűď㦛nZe óTwţąĂĽ‚g=Çî¶mÇ1¶msŰm·éW_x!Ľđ8PŕűŹ?ţx± Çu"“´Xm۶ńĐC±aĂâ8Î&úľűHÔa¸Ř±ŤcccT«UÜj…{ď˝—~żO…Ň(„©ŃhĐétŠűČł†9-Í0 Ä Ěź‚^ŻGĄR)T˝iš4 ţóţűDÝä˘ă8…`>ÓB`žŞĹĎ',‚ řĘWľ‚mŮt»]FFF8xđ ŤF$I ›xL@€RĄĚĂŹ>ÂHc”v·C’$ě}|/{ĹË9ďĽóxŐ«^Ĺ‹^ô"¦§§…é8 5:M¦I·Ó!Š˘ëďĽóÎKżôĄ/qÇwpđŕÁ 5M3c ń µ}Č5€aB°~ýzîĽëNćććtłŮą äI«Ő0Ď ŕű>ĄR  ĺďż˙~ýÖ·ľ•ÖâťN‡fłąĘfş®[ě¸cÚ0)™śśäˇ‡băĆŤüŕ?(&đňË/çWőW™`jj*[x ř †a€”Ĺd !č÷ű<ôĐCúď˙ţďůô§?MµZĄT*e™żc– ´eYčôŘPtEvQ*•H’)%ý~ź™ŮnąőV^ůĘW Ă0 íbYV!8Ď´<ă`8üÉĄ<ľóťďđđĂ3Ńh266F»ÝĆqšÍ&‹‹‹h­O(ÎŹ˘C‡Q­Vń}źrąĚôô4o~ó›ůíßţma¦eÁ@•ŞÇmҲH“Ó˛ču»”J%jő:/~ń‹…aZkÍu×]‡iš”JĄb?•Ý™›2)eI)ń}ÇvxŕxÍk^S|fžľÎ…řDái'0'Pć_JJI·Ű˝~÷îÝAP¨×ŃŃQǡÓé011A·Ű=‚¬qTó˘H‰4Mü0dąŐâ}ř‡üß˙óŠą…m:‘Ń“¤xŻ"#‘ćśçýŁ0$MS.řéźü௠ðĐByZ÷©ěĚÜîçŮAȸSSS„QČÁ‹Ť’kˇă±¤žU3q´Ö…'ň‘Źđľá ˘Ýj57oŮ"ô d¦… Űä< ĺşîázŔŚŽŽ^s˙ý÷łĽ’…+++…*öÖŹ5Úí6RJÇ)4šeY,//SrK´Űm|ß/Tľďű¦YřLĎzČqńaŽÝüü<ťN‡0 QJA±ăMÓ¤Z­R©TŠ 3 ۶q‡R©„ëşiÓ0rćććxÝk_Ç/˙ň/‡ü°čd>Î:ë,qĺW˛˙Ŕ~ĆÇÇ ĂN§mŰ'¤ˇÖ:ŽĂ1żĎóđ}ç颏?ăEQá8 ľđőŹ<ň­V‹z˝^ěJÓ4©T*4›Í‚ßçyRĘ"Ôëőčőzţnš&A"MnżÇĺ˙ýť¬ß0% Ń$i‚óz˛…ϟ۶ÍßřĆŃĚ=űÜtť¨”_ĂΫa´ŰmşÝîůë§bןRČůő9iÂuÝËr»7Śö强áÂŤAaGµç…!ą˝Îѵ0 yń‹_ĚË_ţň}ů"AP¨éc]¬©Z+9ÝëěígsčĐ!jµ•JĄŔ2žŠ3¬†ĚQ®â[­ťN§xO÷—±=ë‘Ŕ(Šźźß»´´tq»ÝÖŐj•FŁmŰEHU.—W©ý|·¬[·®€nsLa¸šÇu]fffř­ßú-lŰ>'gúć&â)čýŁ í8¸®ËE]T¨|)%Q1ýS5ůg¦‰ďűřľ_x˙ů†x*póŹtcgj­^xˇľŕ‚ ř÷˙wLÄ*{žSąmŰ.ř÷k'.wऔ´Z-JĄ/|á )—Ëqžźďt:|ě­ąFŽb‹ŤŐjĄËËË…úOÓô„kűôP-b®ňĎČóɲµůg­äęÚó'Ϥ®ënŕdYVQ­;śiąyXű7V Á ¸3Š"‚ ¸Ţ÷ýK (€­5`aaÓ4év»«Uń#ŢbçÇÂČUöp‰w‘C©Ŕ¨Y50a^Üh6wĺ˙×ď÷YYYŃ‹‹‹¬¬¬ä‰<Ďcqq‘™™8ŔĚĚ ‹‹‹ôű}ΤZ©R­V±m›‰‰‰˘EMĎ9Ďôȉ¤9Bx„ĆĐ`fQZÎ Gŕűţőý~˙ŇĎ~öł?qq‘˛˙~fggi·Ű„QfĂ ™íč_üâůĘWľB·×]ýE łpÜǡR©022rDťÂ“ÝwNíĘCŃ—qÚ5@żß§:µ‡ťľ|’®ź¸ (Rʶmłoß>}Ď=÷đŔ}÷łk×.ţůź˙™TĄ4M¦7l(´ÇpC©áŚśJ˘$AüěâgµT‡€–ś>&DÍ4M™¸¬ßďĹ—÷ÝwźľóÎ;ů×ýWľńŤo•r…éé颸Ă÷ý‚…422˛jńWyúĎrîÇBrĐZ TîÝw:LÓäî»ďÖ_ř¸őÖ[yâ‰'p‡ť;wŇ]iaŰvÎäEŽăÇ1ív»†Ż<:HN!˙î9x’8?·­ľďŁ”˘R©`YAđÝď~W˙Áüwß}wŃďŻZ­2::Ęňň2qßÇ11- /Ś .żă8BRvź©Ó<ëC¸+“Gë–¬wÝu—ţęWżĘźüÉź°iÓ&¶nÝZÔ†A·Ű-˛ŚJ)úý>J©¬ÚÇuI’„^Ż·ĘÄ ;ˇ…úĎ Ŕi9ý+WŰľďsóÍ7ëO}ęS|ík_cóćÍE V×u Űž÷ô<Çq ř7÷Ř Ă V«<ľáhcuGpýśśÖ°bňâĐżţëżÖúЇhµZlßľĎóžž&–——±m»blŰĆ­V VMžbÍȵÝ:×j­őqŰ´ý¸ŹSVś;uy­pČ”F¤ żŰăĘw˙Žţý÷Ľ‡ucăĽŕyçQ+•qM‹îJ‹Ř¨•Ę8†‰‰Ŕ1LDŞ0›®ďˇ¤Ŕ­Vµ"AăV+Ë$R)±VĹs%±VX%·–<˝›CŔyRÉ÷ý"ü+„u8ńś8Ću„EŤ@EX–•óúôUW]Ĺ?ţă?˛iz†a0;;[řÇir¸8o˝¸¸H»Ý¦\.ŮĂz˝^8–y­‚çyT«Ő˘·ONĐ Ă89 ŐŞµ˘60ç/A@ԭꟀcxůzPy“׿Ł€KKKúă˙8×]w]·ç4éĽ`ňxź?22‚çy:tJĄÂřřxa,Ëb~~ž~żOŁŃ(LŤçyEp)$SSSlßľť­[·˛yóf&''© ·Őjqűí·ó­o} Ó4 Ą\.“Ćńsp¬‘;vĂmߣ(˘T*áyţçε×^KŁŃ`jjŠ™™,ˢZ­Ůľc ĎóŠŽyó‡śq›SŻĆÇÇyř‘‡98s’[Â|Fę#Ľýmoç÷~ď÷ŠjdÇqţŃqś7Ó·Jĺ2ł33:ľůÍoR*• ˙áDhá?ń „(âüaŕźţéźô‡?üaJĄÓÓÓ,,,djuཟN?66ĆÜÜ®ëŇl6ét:řľĎčč(ŁŁŁ´Z-Űűçźw>Ż{Ýë8ăŚ3¸đ 9˙ůĎ*Mń<ŻŕGÉí'C­]z˝ŤFŁř9ŽcÜgy^ŕ€Ü[Ď>/řÜ»wŻţ›żů Ă`óćÍĚÎλµ×ëqŇƱ˘ávî¶mS«ŐăG}”rąĚ•W\ÉßřF¶mŰv÷äşu/‚¬1µ¤aáQ˘3łůWĄiúű©:ĚáĎsĎi€p×j„N§sń?üĂ?pűí·łóśsňš6lŘ€‚ĺĺĺbaŽ7fffŠÖlą×étčv»¸®ËżřE~ę§~JŚ6ÄQDEX¶Ť•¦«“rÎAĺ~_kŤeZdťwđ’ĎňdŇ3ćEĂݲ8pÓ—żüe’$áŕÁDQÄôô4ËËË,..˝yz˝Ţq??ďşŃív‹TűßÇ™gžÉ­·ŢĘk~ögE­VC č×J)’8.xą6a`ŽHćN¤›u9%ôR]OžÓ'ôäÔíąą9ý—ů—ÜsĎ=lŢĽKd27‚ÎMEyĐQ{mŮôE~^~VĎŢ˝{ąô×.ĺ#ůČJ˝^oŞ5uüyâ(wP„¨OĆĂśvQ·Ű%MSĘĺrA€)ĺsŕDâôÜ©“Rň™Ď|†ť;wž“w"¦Z­Ňëőđ<ŹW˝ęUĽë]ď˘^Ż7K!:šŕ<ĄI’ň–R©´Š—kçŔr0Č0 ţöo˙¶`Ő®Ąt˙0cpŘ–eqŕŕŢůÎwň3/{™(•Ë™ŞçéťÔ•űĺr9; tđűyUósp ”·U‰˘Ź}ěc<˙ůĎgnnî¤xŃ9ŁWkÍĆ ąä’KDÇÄŇć“.ţš°c @Jĺ?ç„’çŕM@n_|đAÝjµč÷űlŢĽąčÔůt5LłŮd~~ž÷ż˙ýTŞUĚAçęĐ~G,ţSřü(Š>Üď÷1¤qłč98ÎȡW€»îş‹JĄB§Ó)Nţ8#*• o|ăďv>óüa?żďűż???Oî '„ž€q7s`¦ßďS«ŐXXXXE}:cff†‹.ş۶_ hfG[ĚfřľĎĚĚLŃ,ç.&§ůIJgŤĐh4–WVVöÎÍ͇y€'C…ćů˙AłĹ‹|ĎĂđ““”¨É[Äٶ]¨ 7t|NŽăěŮłgë#ŹÝaY·Ývžç]‘n~/ľď?ű`-y2oę0\îýt?_ ¸çž{ЉKÓ=ÔäX—JS’8>Üc`@'—†ÁüÜÜ]×\s ›7o&‚‚«0lN 099É7żůM:ťÎŐZë# Ăđ”dOIÓµótp.'cóJßů—Áó<ßĎĘĹźÂîn)Ö¦‰×ďsăŤ7ţtŞŇ˘Đd8ěöţÔ§>Ĺ®]»ŠSľ”RK)ŻL:él×u™žžć–[náóź˙|”•“·Ž}ŞÇÔ=ĺ0ý™Nhä¶ö¶ŰnÓ—]vYQ š/€c<=IO”beeĄhZ­–0 N§sfŁŮÜ;Ürmăf V–—Ϩ×ë{?ýéOë?ţă?.R<“;HrŐŮHwŢy'ÍfSxž×l4ËĂmqN–ă|Ę ß÷i6›ś}öŮŮY9Zľ“1ňǶoßN|ň“źÔ"Ó˝ą&0LiĹî—†Q,Ľ×ď“Ä1ŤfsoŁŮÜű™Ď|Fŕ@kÍÄÄÄ)‰šÍ&Zk<ȧ?ýéĽ úňŃŐg-066ĆÄÄDqRgŃšőiŽŤ7R©TŘ»w/ÍF“O}ęS|űŰßÖ9š§”ĘÚÁO Ö9Ő‹rĄRă'>ţqýž÷Ľ‡4Mi4ĚĎĎ?ă󒣉qłyóf>ůÉOróÍ7ëR©DŻ×;jwÓg•äUAőz]ŚŚŚ§‡ś,JUŢí묳ÎÂu]LÓä ox˙ďUWéčUCVK…I8xŕ€ľ÷Ţ{őë^űZýľ÷˝Ź©©)jµZQşöLŹ$IXZZ*ÎKXZZâĎţěĎřîwż«×.ü3! ϸÄq\^lßľý&P'# ĺ±Çcrr’V«Ĺşuëřŕ?Č»Ţő.~řa˝oß>}hvV·VVh­¬phvVďŰ·O?üđĂúúëŻç‚źľ€oÜü 6oŢ\T1ťL3uĽűĎĎ@ęt:lÚ´‰»ďľ›?ýÓ?Ĺ÷ý˝Gk¬ő¬róc]îąçý’—Ľ„íŰ·ŽOÎ ţˇ5ĚŔů›śśäŃGett­5Őj•v»M§ÓaÇŽĽěe/cÇŽ<ôĐCÜ~űí<ôĐCxľÇ¦éME˛Ľ® ç2–‡ĄĎ”“dr6ôŔ™ĺ}ď{W^yĄvbO¶3xJ˘Ďó ¬Ţ4M˝cÇ’AčĺšOO͆Ӿ»Ý.SSSʼnáůˇS9#©ÝnŁÍ ‚‘‘*• őzť^Ż·Šó—'ňň™€X«â ę<웜ś¤Ýn3;;KżßkŁ#XN?Ę;9¶mE×\sŤ~ď{ß[śh%Yśmš& LOO3;;[°oŽç'¤ňřQȱPÓÓv§hNť¦)•J…$IXYYˇŮlŔVą\>Ťz˝N»Ý^uÜ@⊠IDATFÂQŁ'l{p,]L»ŐÁ4]~đř~v?ş‡őë¦ěZÍŤŹÖ̤#hqYuĽ‘€±ćQh}‘XŐĺ”89đć7żąPŃŽă0>>^ôâgnn®Čť ,üh@˰şÍ=ń<’ÉzjjŠ4MCQś{źo°ĽĽĚ†AżÂcj€ ¦RŞ2ŢcţĐPr]tš`YÇĆ2d,Éš™díđ_&,۰lfϱŹĂď«ÎEşN…äę4G·¦¦¦ÄoüĆođđĂcľďłnÝ:šÍfˇ ëő:ľďý}NE®břH·aÖNŽ\ć€L™Č;‰Ôëuľ÷Ŕ÷ضmýčGٱcËËËDQTT%ĺ\µZeăĆŤ'”Α Qn`ăph˙,±Q2nýĆ׹袟ő˛{Ťi „ňłK{€Źˇ} —Đ!BÇť€VŮ5Ľđk´Ŕ)€ĽćĎóď‚rĽů­á°°°ŔŠ×â˙áxÓ›ŢÄ–sĎŢňâŢrcôL ‘-4)H ¤¨$±¤1ŇČZ]!AËěQ ôüP¨ťĎ—:<Ýśüń•H^ž3jňŚ×ťwŢ©/ąč˙@Áôô4Ýn—~żĎÄÄDŃđx)ă§+yąÜ&« Č™Ľăďŕw÷w9ëěłEŻÝ¶,ËŠťR‰Ą…˝cǤ”lÚ´‰………⛼WÁńŁ%a˛çń=|âcźŕíoűĺşËb°Ř›fź!,Đ(ťÝ›!ŤLµ~°.…ł'W˝¤W‡Ď¬ä'‡ćľ@ ĺťşľú˙}Yżńż˝‘©őSŚŽŽâş.žçŃív©V«O›y{Ľč vé0Iełđkżök|ä#˝^Ď*•JqÎhÎ_żí¶ŰôE]ÄŘŘXżçÝČň.eÇűźxś¸ţz~ţçžrą,śJŻ×Ďş’ Č0ŠXŽr^ł©7Ôšu?®ÓˇÖü¨’ăĆĘy#Ćá6î‡'X<ĺĹ^C|c×.}íµ×rë­·bŰY<śsărş4dąóüú$I ő=|‚ČÚ“:Ëĺ2˝^Ź0 ‹ăhsŐoŰ6­ęg•JĄč6vŢyçńÖ·ľ•w˝ë]bí=ŻşÓäóźűśţÍßüM*• ŤFĄĄĄÂé-•J,--Q©Tp]—•••bž™ťáćŮĹ _řBšŤ¦oJeűď8űě˙•‡W–eQŻ× ´0oť$ žçeňŕ|áµ¤ŚµG´ćIťR©T´śŹă¸6Í&+++čĐ!~é—~‰«Żľš×˙Â/ŽC`ŐJ±qăĆmI’<˙ž{î! CŤív)%Ýn—łÎ:«č\î8łłłlÝş•ż˝îo9ďEç1Ň`ŕ'!aˇ… ŐcŢ´r`Ć5™Ď§“ĚßKH¬Ăö\łúů°h­@%•€P­ł TúČsyňÇU‡&>6Ił‰tťę­’µÖô:Ýf­V[–†Á}÷Ţ«?ůÉOňąĎ}Ž8ŽŮ¶m[¬„aXŘ”·…‹ăq”~AQČ™ź\ôű}ü8b||śď}ď{T*®şę*Ţö¶·‰Ľ™Ő°r4-Đjµ®ż¦Ýnóţ÷ż_öłź%I6mÚTś}°°°P Ýn—×˝îuĽűÝďćĽóÎv-Ű@‘NHÓÔZÄ–é „AÄX¦Đ™ ą[éĘŐ >ŚúIŽ”*ŤĐi :µ !cŚĚĎJGG 0 †ä6;W“rMňFkă„vű“©P)$ťvŰr'v\—0¸ůć›ő_ýŐ_±ëë»BŇl6©×뤶n9D,Ąd´^?ęÁĚąY>X2ÇöÓ4Ą×ëŃív Aýם|ŕlÝşµžĽá“™ŻüűA€ă8ôű}>ň‘Źč}čCLMM122Â8묳č÷űěŮł‡WżúŐ\{íµśţůbqqńŠęřč5ý¨±D|§l——Ĺ*Ł€’=hcŁA¨5tw ľqx~ uŠÔůĎ×ɡ蝤‚.ç>âÄ_µčňŮ95†ßs˘đdB07{HŹŹŹ Ë¶éu»(Ą¬úČHř>wŢy§ţ»żű;îąçî»ď>4š S/şŚC͡ š× ę(?^>÷aň65###ěرíŰ·óęźű/\|ńĹű&''ĎŚă¸8ęX÷<ü<¶Ľ5˝çy\sÍ5ú–[náöŰogË–-<ňČ#\~ůĺ|ěcŐj•ĹĹĹ+ĆÇÇŻ €v·ŁËĄ’pL ‰Â E Đ:B($z Z]š;éa€§đÉäľÁăµůu{@Ƈ˝€0ś;M.¨—Q¶×póňóv ąz“4)hцa °źR2ćÄęr.=č(6ŚÓĎĚĚč={öđýďźď|ç;ÜyçťěßżŤĆ’™šÖk)2zGŚÔłÁ ^Ŕ¶mŰزe çśs[·n•‘zarż˛‚Íá#gžLraYKKKW«Ő]ŽăpăŤ7ęn¸V«E˝^çőŻ=_|1µZM8ŽsX+Q†Ű­âČÇ6RKXj±˙ "‘=&Ů…Ę®0ad—” m6H+{Ô&Hë\¤˝,4j :Ó4Wíę$Mđ}gÇ*Ąp]w¬\./K!Ńč˘˙/€mUžr6nUâe ‰éŔ9Ë=ä<|îÖëőv®¬¬<Řn· ÓôŘŁŹÝľ‡»|çMťwîÜYä!FFFh6›ÂuÝÂDdÂ\ś,˛¸´x˝išż3:2şĽvC<™ Ű÷ř>˝aĂáŘ˝~ŹJĄ’™— ĐKKK¬_żţÜrąĽŰ÷ý¦ÖzťmŰ»mŰĆ2­ĚŰ×G PX¦B'}H}-]i’>DmRżEŕ· ü6q9Ă#ĘF ‰0L00]´QF›eRéRk®G[U §~‰°Ë»´pH‘´¤ADqkMNľďő­n·ůľĎňň2ŤFÉÉɱjĄZLJŞŤź¤ű´ ßÍ&l¸Hł?¨ľ©Őë,-.^?::zŮŃ >µRĹ{Pv– ŤeYX¶}Řct’dŃăqSäűÇ*´źŇŞŘšL@ňמL˘(Âu\ş˝.µjí¨f37QRJ,Ó*´+@ěD!HbJU DŢ‚F†|ě~tŇ% VĽE‚Ţ2ž×" z$IÄXb#¤ ¦0K`—Ŕ¬šU”QaÇ ^ŠpF0« LwD`VH„)Všr‘Đ+ß×”FAÖD JÇB‹űďŐ‡ü&+Źţ;[’37OĂô9ĐÜîvsZřÍ>ˇáRs­«ą¦,c$!¤áĹ$ÁM9*eŢ€p.SÂ"j …µc}rżG °k˝ÍrŹôślő07ńQ“mąÝ•Ă@™ĘwČT©ů˝čx+Ä™ÉN;Đ:€7ű(˝Ĺ}ě}ŕ6ŽšTeź¤3‹whTLx Ěő8¨Ä"I}ěŞbe`úGIΡtîŻŃxŮ˙EÇY':$şŽu"T»«M¤†}ÂĚŁ~ ŔµmęŐqµN’t8°˙ ŞÝ„Ń-ś9…+}LJˇ|uiÉ‘—”$»L‰™‚iş»Ž@%VöÍ;"™šqL@e­´Î’@‚ŤĂ^ÄĐÍé>«UŻćÎŞŻ«Í×cš ÄôVhz‚ů<ČňĚĂ­ŚWGP"%Q1Pi@Gh ©SM\RYB;.’r¶xޱ&PĘÄ*%ŽC„Í ĚÍ0n01]Ö;•†¦ě–0Ćף–&ź^Ż…ü€~bŇ ĘzÚÝŔ:kTčTŁS6L iieB€’ć …T`ˇ€Ä+í#&mxőĹ@,5cMúÄ2§bÚ< ĚŞŽň}b°úZęB\Rst·AŚNb–ş||?­ŮYĚD3RŇ‹"łŠëNcmĄIR(Kzí.hKô1˘%icŘrI0iB…$X¤W 5Č Ö;Le•Ż”Ň‰5RfH“Đ×­ěs'6n-%ĎŁµ?ˇ=@Ó_zŻÓfdn/“ÎÄ:ű•šXˇ1QVíéŚě 1‰Ps…!ř¬€® ±­»^ …2Ž\ĺj) ú°’«Ń­ě7śÓ+é°Jşä ôaŹ˝ ć¤E"+˘†–Ž-Ý‘hd|#e›ńޤ^sÁ1łů2\(×Ŕ®˛!$Jbövź¶VŰűYúA—”.6}0+$‰…)@Ĺ6)6ú‘&;Qr†›±U˝F HDJ€ˇA*Ŕ,ťIµˇíłÎgRF$AźÎÂ[ŘqŹhv‘Ůůď1ô)ŹŽ#Ć7a”ÄM` M•ąS ţGW4ß,›:ꓬZtutČ'SMHNł¨Ł-ô 'ŐjL–,\Ő"µ˛o˘¶µúŢeŰ5«ŹOź!Ć'šš¸›ĺ˙Mť9A† ŇÉľ«(]‚(íJ•I)Ěń1M˘pgqZM-=Ś™¶ł)“%´t0mC‚ ÂB˘µzʸĂÄLp[g=č•”ż`To@¦—˛ů<¦tBx‹O0ę$”D›°×eî{_§:6ĹřćéçAc«.™ZDTwű‰±Ő4AŔľ#3P¤«ţWĹţçžÉQÔŞćôźű—ßĂÚGŕ˝P…fĐYlAŠŚAY ÷ÔmKbYś†Ŕ©Y¤Ńèt«„QáŚëu©’{¤)0,›˛ Ëaí\GiL;}ĐőHÝ:*©E>é–)W+¸¶‰"išËăł ´…™äÉ4R™ŁDʜ˴o\*jëg]Ŕf4‹{ Dë$[‘xŹ&sĚůs”ۇ¨n<Ń]  DjŚuA¤Ń™ß§ZIlCdÖJg$­S ˇ3‹!!‘ťާŃ]ćay/Áߣ{h©żD)hSr3Ľˇź†„JaUĐÇĄŤ°,ĎĐŮ˙05Cc I ]´Q§6ľś&ŕÄhő˙!şQ&Ó6ŁZ®˛]TpنsĽN#¬;ÖqeĚĆî(Ł?ó’O0»w7Ţň "ő°d‚m‚-Fę.^ä±´Ľ—•ĺâŮÇq'÷Q]wĺ‘1š“ŰAdX6ŇyPHT|‰µKhaŘ(dfGŐaßOęăÂ=Ó¬g…®^d˙ @HŤ”©ic X#KÁ4ŃÉ'Hő+Pjkŕy”,Á˝ý÷3˙čw‰ç˘!űŚWaiq?ٵBÖXňR]˘ľq+S[wŔ†ÍHÝÍ6A{–ţň eKŕÇş*cgÂřY`Ť ´‹ŃîAę­€âMq)‹y5›»ÝY­™ŤRz9VvOľD›•łw6±¸÷{tf!đ–h #NĆar€†ĄpT/ś%:Ôˇ˝ř-é`l8·ZĂiLBs”GÁ(ßDbBb Üú Bż#0–‡ŰÁĘBgą§9 ÝĂ‹źĹ-5Pé #ńŻ@¦Wcę żOC{z‡…ýö˛đř÷0złLŘS,ăÍ-Qł, !é…[cTĆ·Ó8ëŘr.¸uŔ‡ČG·Hâe™ř‘ŔjN0±ů§ Ľń( Üż˘Ý+3±9% -Ý33îy¦•±J0 “üKJĚ,účçÔšŃ ’ŢßcćÁďâxšn3î&¨ţrć!MRa*đSM˘Ŕ76 ín­Ait’js§9őuPn€Sé’BňźC©·$—Ş4EŰSâtš€ČđšR`’9°Ů<¦ ă‹ŃŃMč´Á2tćIZ‡č´ ýsűî ęHę–ÂJzŢ""îR6%–í*›®®Ń‘cŚl}1Łg˝ŃÜFZ]G?6n¨Ű\*Ű-–îąÎc˙IIxřšgżś‘s˙+4~F(eĘR”Zľ^Ö;*q -Ě °kФD†ěĚ&f îŔngď[R“ű*RśY6G)o*é ˘B·Ú$šßCŻwŰL0ŇFč#čáEI¨a€)XqF’Áň"ýĺý,ÎîĹYŹŰŘ€,Ź1:ąáÔpJ#růR ÷ŇěS¤H9ÝG6ŘŮD¨¬ë‰ŽĂ+d_-ŇRâ.„+hoŻs~{Ż;ŹďŻĆgŰO “ĺ$Dh…mÚ–KbT9ŘNp&¦)OśË虯ŔŘđR{JDÂ&6¸^!BźĄvgŕwhF¦¦ٸŞ/†’ †0Đir©ńĄ†´„Đ`®Zü!çO @§"˝Ňż Ś·ŞÄ@J˛:đÄۤ{cíž3jŻĺ­–.ŹTé?(XŮŰE+QXqŚLCP~FgŤS­Ş8†…a–pL‹@řx­C,¬´đ´p¦Tgtr#“ë6ĐhN"*°,° N·H$MŞ*Św&QxµHúIźîůwD´B, âe¤ę`%[Sv Ü~âđĆł%´Ŕך~¨íQÎÜůŘúR¨lĂ‹*Wv[[Îí%\:jJ˘TŃńű¸J“$šéć$LlłŚź@”˛ÓÍĚ8BgQS¦H’“P–ł®˝NAEM—Đ}ţ·Ż‘t :?ŔNµ}*†‡H:$AäX掩!‚D‚F˘¤Ť’ü´BŰ·éGeĚŇÍÉ­ŚŤOQzŢfF2J`”—›™YľDcÜ’`ÄYu]†9¤čťΨŢtÁUHâ}’ôZIňuřŚ /‹nŇDb´ŠĐIV{§uJiá ű$Ţ"a÷aűÄť¤ýYDÜfjbŐët}Tj`›e,«Ú&M 4÷"­*Ňnčşi Ź1"k©;É ~ö +Y.Ŕ°@WbČŻ#őń8íyđń;îâĐR›0µŮtöůśyŢKHq0j“çjíěVy­đ`ł‹ˇ”ôÓ5Ôî]čt 9bPÁőĐż”ÖAĽůÇ{üşłŁĽYjv@Ł$);’Öň,¶)±MÇ20¤@hEšjRĄAXř©źHbí˘ť*†SÇtkHĂćçašŽS§T©ăV›”*M,·Ž0KN…T:`šËFVFľ3 ‚XUĚ,Ö:TÖfĹ—ĘďB‘Ä}’ zġO¤*ˇuŕAĐ1†Š°”‡ťzŮc`*ô¨–l·I‚×ďĹ)ŽS˘T*±¶f™XVđT•XŽaŤžĹŘôůڬŰÍÍ Ë Ý}Hă·Ć-ŮCÄAx˙uú®»ď%H%#“›ŮńüS=cq_cU›çj2PČŁŔÓ¤Q­A *Í*X .CëWĐܰµěl-™´#tçötfYJş´âÉŃöHâX‘¤†¶H„´°Ä’ťb:!ÚZ$f ى^–RŘhé.‘á"„’6%´ae‹oٶ…iŮ3c lj»:_Żc ­:AŕuZ cte¶: PiLšfsĂl!XHl$% \Llن%«Ň(QčŃďőĐRaą&ĺ’‰Ö1ýÄŁ#&CIj”±kë[ż±éóëΆęÄň%JÚ»´h!B#yC‹}"ĺ0:¶ŽÍgî¤:µ„CŞ"L%÷hi®ĘI¬ňóôIĐIŢz_Ć?3"rڎş#Ůp–÷Ó?đłű÷°˛<ĎŮő‡˛¬p¬!Dc¦&†Î¬kVTŞQFŠ05ĘIDB¬â4Ą™`,%PÚ$U’D›(m !mR!3nŽ4˛ę™aśCW 2‡,ęé‚©qŘG ťŐQË 9 Ń/•ú%ĘÄH$Fţ¨%Beś6Ë1– Q^ě‘ęĂ5q]›ď{›pĘ#ŚŚO3±ńś©02 rRDE$ÂBKëpćY®ęÜőyÝ#&¦6R^·9‹ś”‰×‹pëăi Ŕ~‘e{‹š>I`¨N_. ÚB ‰Y¶Úk’XK¸.¬ŻQ)Źłiô j+ ¬|CH,ˇ°MŤe¦Č4A¤¤1Ň1AĹ:â˙oí\vă:Ž0üUwź3ĂËP$EY˛â‹¨p”ť˝ d›…ý Îd?D–É"đŘČ#XYĽA6¶Ç $˶d“Éąť9ÝUYtźą‰–Áđ6gÎtWUWWý˙ßÖ&\4jgTf$ b“!ŃĄ™ě‚§’B“Fˇż(Âkš‘L‰…lfôCĘ„‹®uŰqĐÜĎďfĄ…"ZŔ–-+d 1‡·Ňč˛â[[ GçŚĎ#ŐÖ€Áţ!®îód8âţ÷gT·ßá•×ŢäÚáĎ`ď'`0«Í#ęÝŰÉꬅ°¨ĚćHUîçૼsPU°łź§łu áC_W_]B.éaëËÉâvgYHĘî]¬ˇ?±ÚµHŹ\™Ma|Nü×_MĎ™ Ź™Ťcłc*†l„)}7#…éf<sôŞÍ VmÂmöÁ\6¦ą“I«®-!±&!Ů6:Ts×µ‘eĹ-§›%+śÇ•CĄ®löKĎż$ÎŰÔ ÇٰˇŢş†Ô{Śf5M…Ô»\{ĺkŻŇüô]z]ŘŢ6Đ 4Zá{»âBď©rřüűb”›ícĂ…#T>ł&~\ř$lěüFńÄ$řĘŻ”řć%˙B}aX'$¦ËŞó1!ÖRC$±"ÎîŃLiŹax Ç8;ţ/ăł#tü->SqAmc\šBLxuxj‚TzPá˘PźrH.”0Yč˙?%Ó"ş#0úˇ^)éń#ôꥂ‘C×$eÓYŢHÄhHI$Z1˘TÔkŚbźiÜF«ëlîŢb˙•·W߀­=¸ů&>Ń6}Đ$w„۸ŤßÄyż2¶+08#âLé·“Ľ ŇĽ›ŻPçqŢuµń´j…üűâµr]éŰë ÚĆA¨|ů–HÍ”6Îö5¶˙ŘňĂĂ\ŘźŔô;ľĎńĂ/řá›Ď™ś~MÍ˝MĎ ď ™ŚĂŔ˝eĺIDAT†č¬ˇWĂS Kžť › Íţ˛ŃëÎhŃüÝkzu•CkĄĐË»áöůújĺĚ`[–Řšf2Š9ď0ďIľ"şšč69apťÁÁmö_}›ŢőŰ0¸‘;t¦Ňżę]uâB…Z…š#•ĄTäRYLF‹3p3Ă×ýĚ/_“&á+OGęzÚâ˘ýü íÓ%Kưâ|¶Šúń'wŔnAü”ÔŔlłÄ!¤1˙ůë]$žbíOSů•OátLYÍ«ňE ERl±Ô˘±Ĺˇ9sĆpHnÖt÷˛éKVh*±´˘S!X†ş—A,.ÓŻĚŚ¨ E·±&Ç,9bęˇ~ Â.Ô{h¸Â­wő6vac'7|ż´ľĺHµŰÝŘ­Ź™]2y®E¤«€iŃŔc=XW†[ńţe°í‹Ŕd ă– €„•­Çň[Nü¨Ü dTRTü¬ýť‹íĐ)ĚžŔř1Ółśź1şřšfzڦ °†·ĆX—Ôé D "oŮ)´]„<łUV ’jŔ‡LÔs5ŕN¦ä\ÂśsčŇÔ< ôa‡ş•íť×ŮŢ;¤wĺ Řş˛Ő¬×_6úwS¨H±€Ä6ŘZqŠe˝ŤÎaÜÜű‹VĐ|c{©5ý¬ŠĺšĽ´šË1qsXB¬d1ËoůÄsGŕQąÉ݆O)L¬©Äf÷đÓC¤ř.ľcřĂŽŹże8‚t¨ř#đżUzw•šüX Ź l˲ŔÖF¦<Ď·m‰ľ/?ưzyí… ­!sÝ<—NK7˛0Ă/–€“˘;ßŮĺI,Ťe–â÷Ą§nťô ů ­*:9őNnF5í¨Šítć%QWyg t–ďˇ űÝł•⏶…_ź+…d/ƤR]f“#Ď şâ÷<šL÷NĽĎ/q”‘DÜ÷řá&hň =<2|r~™*ŻĎś<ëĆqů·źĺ‘—Lľ[M2_Ô¦—ŔâÝüĂčR (+ăçą@ĹÉĚ}‰¸6÷ˇ«°˛pÁĚ ™BŰĆr®®§Čđ(b!đ~ßqw‘qD”I'ďŐÎý]Đ_飮 âĚýi‘Ştj]đ˛)¨ÚuĂ}zm_Ď[GYIl;µň¦M´m{„^¨>ďŐnžý*šZĐ6OŁ#‡;1¬K»5ymň­0Ť¬+gŰB%Lz<ďöNdť§đ’"Ŕč’­Ęâç¸dŻÍÓĎť –{–'»Ú˙Ýü#¶9“Z.ěĘĹ­{ĆPŤś»ęŽŔ#G^K *ĹŢÂf6·‚ă®VNlŕ ţDDĘ6ĐQuzl¬+kşÂŤ0¬ä.t(ĺ°fŰNją%]IĽ(µöĂr…ěÜôcŞöNúŐěPć/zY·m>ůvI6ĐgrIÔp—S–’ńĄżţ’őkŰž´IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/apple.com.png000066400000000000000000000046351361462701300300420ustar00rootroot00000000000000‰PNG  IHDR22‘]ćsRGB®ÎégAMA±Ź üa pHYsĂĂÇo¨dtEXtSoftwarePaint.NET v3.5.100ôrˇ IDATXG˝™ipSU€óG±J›Ąmş¤I—¤;¶´HWpˇ Ł2nŁ2*ŕ>ŚŠúC—şjQD”UýĄŽ ?ŕŹKťQtAg\X ´Ąmş$i“úÝwâmúÚ:šĆŢ9sçľ÷î»÷Ë9çž{î‹eŕż–ČČŇ Q‡Á ĎżŔWäÍÉĘvfdRć¸]yČ”É)ź}ň©ęŽ(úú %aXĚÓk^‡Ć•“ Lžülg—Čě‹.¦[g{Ç·†‹Q‡8väče—\ę°Ů˝…EůnOşÝ‘—ëňäąisçŁ>”nĐëWFŁ$ ‹É6oÜ”›ť“•éDU™éÖÔ4Dy/{>GˇnkiŐoŤ FI¤¶\}M†#&”,+)MM™Â}ŇŇí"FI$–‚ €p,Ľ Jţříwžzz©˝Ýd1J°N4Ç™0KŹ©ťVsÍUWżë;žŠ§ź<~‚ZřFŁ$ ëŔĎűK|ŸŞÂ‚çÖÍ|sí:ńîĂI $Ńdd1ŠĄżż_Z===ŇĐ%G[Fé3Jôĺa±§ĺÄÉgź~ćÎ%wĽřü _ŐÔú»§ˇ9nÇŢîžž®îčĄQ”¶4šŐ(mmm˝˝˝ŇnnnŢľ}űŠ+–/_ŢĐĐĐřň+ź~üÉ‘C‡e”H»:ý´;Nµ›8ňÓŹ»ß÷˝GzřúkŻ»rţ·ÜtsĂ“Om۲•Dyím§b_AM‘HDaµ¶¶ ß(ҦěرcѢEUUUEFqą\¸>„;ĎŻź·aý[šĎ$űöě}¦áiLYTP(Ń«ŘëĂĘ0F›82çâŮk^} UA޵Ť·h‡B!Č–VL0¤ćASSS}}}YYYŞQňňň|>źŰíNOOgq±·L­¨d&»ŐVQV~ß=÷nÝĽEÜšU+V^1o>îE¸‚€éů ÝćWɲ_doŕ]14ŞRÚ  .WŻ^ D~~~AAJňx<Ф¤¤8ČŚ)eý#h}ĐDÝ93xĘX‚›h—‰éĂŹˇ¦Đ€ČŢšVUÍ}ŚUĽQ”¶€8~GGŢPrr˛ÍfUĺää@éőza˘Íd`1.› šcQ1 §#¸Iýx‘;@`D´ô§›ô!š¨¨k”(5^µrĺʬ¬¬¤¤¤šš,(Ş‚#rßétfg«Ý2„ąťŠz ¤Á¬<ĺRL&t††§€Âo@ť´yĘ ¶4kÚ”TRüŹbĺYÔrĄD6nÜČ›v»˝Ľ´Ějµ2.N “ÂĄöĎŕG#ÜŃ:@Ś9čĂPÁ#ÔŔť<Ł!=Ĺľ\R‹YőŁęęjÖ_ww· üżőř ĺ†ňŤůÜF6bŞăO¶ů ć7đËńŤÜÜ\¬±xńâ––Ą#eDc=7<ţ„Ż 0'±;J˝>ČLŁÄ-i‰˝ŹžÎ8íôââbś&‚â±ăÍţî®A¬ý{ö–—¸˛˛éM j‹b,2 Ĺ#âg¬!ÓÂ… ±ť„<) ë‘—yđS«Í›_Pć+N›śňżjK°ÄĂPUmm-¶cŮ Áęë TUTB#ď”yiVi'DFĂÂÁY€ÄBv6A DBýŃÝĎňĂ®ďP˝+JJí©iYx"iS̸c”ѰP›Ä‚ şş”?QŁŞž@tż±¬i\ VN¦łĐíɰŮÁÂĺYĎzÜ1ĘhXšé5µŤŤŤ@Hŕ „‚FĽď®»ťŽtŚ89i"d¬Çl˛oĂý"Ła±I °Ý»wKúD¬â[łfÔˇ-Pps*îe:ÇÁĺŮ XŚH~@éđwbUWNEID,# őZâT…چ…ËźS;ťdA硸|_8Ú¶€˘uCCÚă`D´5on=; ±˘ŞîŢhBjÁ|tŐdRÚ(O.Ç.Ła±˛1C€oQ™_ĐŘ Áó"«oܰČ|fΨ@2uÁô-âgąJ®K AvkĽźů,¶jhÄ·HB‰ĄXuµÓ!CUĐ *Č8ě‰dDě?;wâÖś /bźÖ+‘‚ţô¸c”ѰȝHĄ^xîyEaŕ /‰a r ¶'|E«ň-·‡¶Ľ<\ô|c6bé¬óÓßÂńNljáÜISJŇČҬä gAĆFĽţŤµÎşý„-EĆůťYšľüJ”D-z’<ŘDŁĹ4zÜ‚ű˛“­°ÍŔÔe|¤PgFŽë`µžl)Ĺ·Śłd0±FP‰F‹iô¸=M:+ ·fŻ[rŰíŠ&Š~"Ŕ“38J;‚űkƢĊiô¸…T…F¶Â cíßzó-úن:ľrńňŞ—ŕ,řÔ‹+¦Ńă€p/Čjήš’<‰ uăµ×úó`W§Ż·ŕbżě?Ŕ±­$ÚšĂ$¦Ńăö6µ¬śÜ“´ W#B±KîŰł·˝˝Ý"źMj§ŐŔD Á«ÜËDŁĹ4zÜą1=‘đqÉîŚĹ`;w®:bŕh[6mNNšČJ”Ĺ8FÄĄ° ^ 2u•~âs™ÎĄK—*,Öżř…s0 ĂĺáĺY,J¬FŹ[8_·°#; ë‘óię¤ÉS+*™‚Ia…űú©Ľ˙ GşDůq[ś˙d/ ÷‡’6ządöśča!LüĽww1–O#Šiô¸Ô™$|ŘôěňŠI“ßŮđ¶Š[0…AqüE·ÝŽÁ’#ď;ôXĂ…Ş°#zâAĐź5ó\GgK˝üňó/jާŤŹoˇ$Üś5LÄ‹‰gNxoŰ»ŠD°˘_yö$B+1 ť™h´FŹ[Đ űžŽ%ŹşéúNµ¶©m¬č·r#đcM4Wâ+fUšhŘAÇ.ÄOü‰=IŚřţ›o‰ ň­ÔB*ÍŽ-żßżë›o!3Ť‚č<î?‰é·i±¦¦U–WČÚÇ8ë×˝Ů|ôXb1śJ}ŇŽ˘îE–?úXěĐĂ3Ě/&- `ÎÖľ"ďĺ—^&˙ E±ţn0;2˛}8čIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/asana.com.png000066400000000000000000000017431361462701300300210ustar00rootroot00000000000000‰PNG  IHDR@@ť·ěsBITŰáOŕđPLTE ŤÖçóűsĆO4­0•ŮŁÚ‹“Čër·ĺľŢóTş(¶ÚňR§ßÔé÷ÄçµáóŮ‘Óu˙˙˙JŁŢ?˛¦ŇďcŻâŔčäńú:›Ű!”ÖŢńŐŇíĆ÷űţ„ÍdČăőťÍífÁ?˛ŕžě÷çůü÷žŘ…e±ăłŘńAžÜŢîůR­Ţ|Ľçaż9ŤĹęĹáôůüţ:ŻzÉXJ¶»äŞŁĐî×ďÍĎiŞÝ”*“ŘóúđiĂCÎćöZ«á­Őđk´ä1”Ţd°ăď÷ü—ĘěćőߙֺÜňM· Čéş{ĘY·âĄśÖډĎkoĹJŢďήޙňúďxČUÖďĹů·s pHYs  ŇÝ~ütEXtSoftwareAdobe Fireworks CS4˛Ó bIDATX…íÖ[sš@`,T¨f)ę¶AHă4Ő„ÄâH¬ąL;I˙˙Ď),‚śuWéôˇ}ŕ<‰ěů–sô—!4@4p;moĄŞşŞve?ÖĚ?,Ď`ŕĺä €@X횀ÇLĎB×já7nľ DÁq`YN·ôŤŽ˘(Ł-ëQ!¸Ç€É6Űîó­x{ajőß“ŃW1ĆZ.%?Uą‰_˘(No! AćUşRvN.Ź?‹YśB@ÎĆô8÷i›+ź0…€žŤiq—TCXžŕ 8Ę‚\Č€3ô<Ď›pňMhţóáüÁ[8J޸ÚĂň×1ŔťýŮ=ĹĚ–¶ą—őJKŐLmâ/UGŠő×îbN?Ő:ś†TĄZ€ĹŢNôŢa¬Ż§Oó= MgJŽ*·7Y‡¸¸JëčrN~™řŃűF őw3šřNJů ”bZą7Ŕl¦ĽÚ$;a-Üŕ¬|˝ö'gĂ»4˙ÝČ Dś|@áËŕí+ŮQWś|ú)€ŘÝ ŕmH®@® ËË7Ž—rďĐř5za“?ÖCTô:ÍdJů •ÄeTáű[ @v1Ě›hIľ˙&‹ŮXb¶óóx5˘Téä;é¦v”pF*ń™Ě/gÝŔ5î( ígz+Ň `@€ó=ő{űŰ–ł—Ş™ÚQ <ŕfHkÖjŻśbá"g|żŘľĎ‚Ů,Ţ ]Šâ€^Ä]$®fA ńŢ”i¬??˙ÇÍh€ü¦ôąÍ–§IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/battle.net.png000066400000000000000000000061721361462701300302220ustar00rootroot00000000000000‰PNG  IHDR00Wů‡sBIT|d 1IDAThÍ™y\ŐuĆçÜ×Ët·f¤ŃŚ–íhE  HÂ"Č‚°Ä",&–÷T9›8e㥒¸R®JpE$v\°‡"€ŤˇŚ…ŤCpBŮ„Jb3Ň ´oŚ43ŁŃH3Ó=˝Ľ{ňÇëmŁY$ĹΩş]]Żß»ďűîůÎąçÜĘ6jÔ¨OŹ7îËétz!˙Ź­···ą­­íÁîîîÇ ˇˇáßëęę>ó»…62ëččx¤µµőO\&“ą»±±ńß5 ‘Z*•ZÜŰŰ»Í544<šH$/f2QAĹ!€€Š  ˘¨`v‰ ź2çÜô ťN/ş¸i11đĹH“€©"f ŕ)a\zétz‘:ç7Ťa"ŕ=VSŤł S‹zŹâŔ1 źÚĄ3ç\"¸řió!±Ëđţ>ŽĹ6ţ¶ĽD¤ĄČ˙^Đ‘ăD4é¸ăóxsX¶ ‚8ţúObM·aŢp"ĺ'Ęńq.ATQQ-Ď~© ýŔÁ0tÉďQŞm„B/B€h€äsČ7 sV€… `•pŃś!bÉęň…ˇáŚ€BČRĎyŕŐ_†/ôVţÁmřA\v§±ŐźŁ0Ł ßŐA°ţqĽ "Q‹ŘŻžDJ% %ܶŠ]ű˝{çe*Ť”ł“EĚ#AĆM†-˙S~™€śĹ°= f†NžIiîRČv#í‡áŠ›#ʏŽîGÚ[Ękë(n{™`ë‹ŘÜ•Ď ćŁM­LBE*@¦,@Š}H> ˘çuŇé6<Č©| Óâ35°÷]ôçk 'Ď…Ĺ×`AkÝ=™0?=IgHN™Cé®?‡w7vBNÇźě$¬d(Ť#ł®Ć^ý &D‘nCGńDŔÄ* Фk±xŢ]ŢCë^4ßA Ń$vÝ'ĐI3±BßÓ‰e») ń۱ SŃ…+T ÉçŢŰŰ6 oݧŘx%zâ}žc:Ľ bĄ 'Đżâ§ąQXM5óHŰ{ aËvcŁĆŕjńÍOľň$Rf¬DJ0S%LfIs`θň:Xóuâ7†Ş®v§Öâ!’Ş^dČJ-ZtęQÔ<>™BjT5¤2 Éj/ů౓-AĎĚ]@ßčÉđô¸–Řčz8ކ?ţ>äłŔ)9K¬ ҵĐuilöpëź!'ĎCůĹ—Ö˘‚y?|§ĺL UPĚ!ÇOvBĚăKyJcFˇSćÁŽW ëVŰL˝?Ö †żöĂHÓÍP̡=íHÇaäĐNlßV|űaěÄ1,× Ó®BĽŮÁžwđŻţ„ľ?MpŰ˝$ÇM'űĚ·QÂAá ˇ¤e7ÇI©"ZwAşó5äÎ/6ÝH<ß‹űń·Číi” SM¸ňně§ß)Ë Uż +ô U),ۇu X(‘Íö’Ífű‡™ťZ¨łÍ9G2™$Y•"™LÇ©šµ”Řę{`Űzlă3¨*â=˛ę“řq—a?űAM ĄúiđÁ»`Ú•Ýíđř7)ěiF+ĹŮÇľAĽş˙ó‡ “Őř±“ĆYXý LKřX’bÁ“{ńQ žĄ7_ ŻŻŹb©0€ĚmDpĺÍLîüKâ‹o!Řôc›ž%ž¨Â9!¸ů+ĐąËb‚^ýűP=Šdű~x|-ůÖ}X,庯_Ţvţµ—ȡK/yJą,Ĺž6ŠÇ»čkنg=zü}PŢ0ń6gCô†ĹĚă2ő„SŇçKŘŚkČnţ%Öщw7f>9¦-ĆŹ›DL«H˝w„Âż>H_ëAśy¬íml填ď#ţĐéŰđ_KF=K)Ąš=IXěë_Y/Ń™SĘ€6dCcFĹ\M-V7)xÜôyŘýŹA×$Sź8KŽ„S’˙ýoäGϦĐ~imĆÂ"ÜôÇč—¦jÝwé}îg-S8DÍůŮ0öšs…eâ ‚¤ÓŘĚŘÄé %TĺŹűÇĎŇóđ_á·żŚ,»3‚·ć«đ•Úđ ąď Äa˘X95JůS„Sýň0mđA!!3ý›§°úzČ•đ‰ŞŞ‰em‘˝»(>˙Ą-/F[@ďůňőµ¸ëî$µţQŠßş‡|ˇ€ŠBEÓvʢ‚?Ť€ YĚ Ä"ŠC€Ě]˙něDB¤ý ňÚ 7™¨JaµučŃTíŰ‚kŮGďŹÖbGv!.ÎJU±0ÄşXʆBT߇Ćşşńą%'–;A°ó5âÉ$1ŠÄwżEđýű)|u5ą§˙ç Ł"ĺS¬@s±aRBZîÎ C1|Ąá|%kXŐ>ă&Gší8„/źÄ8@W~ úz7­ Î8™öaq@đg_Ěl°!Ş&8CÄg"ť-‹š˘&¨9Q“¨ ‹†©¨9Ä$HX쎯Lśm:5u1S;ç}ç»>ČöŤ5tĚD nú¬iäY$ΗZá äxó‚ĐžŘé`|X–ýEĺËCü–Ň)§ĄÇćűłÇCgłů8°ő·IäÇÖ2Vţ]öó™Q”XIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/blizzard.com.png000066400000000000000000000061721361462701300305600ustar00rootroot00000000000000‰PNG  IHDR00Wů‡sBIT|d 1IDAThÍ™y\ŐuĆçÜ×Ët·f¤ŃŚ–íhE  HÂ"Č‚°Ä",&–÷T9›8e㥒¸R®JpE$v\°‡"€ŤˇŚ…ŤCpBŮ„Jb3Ň ´oŚ43ŁŃH3Ó=˝Ľ{ňÇëmŁY$ĹΩş]]Żß»ďűîůÎąçÜĘ6jÔ¨OŹ7îËétz!˙Ź­···ą­­íÁîîîÇ ˇˇáßëęę>ó»…62ëččx¤µµőO\&“ą»±±ńß5 ‘Z*•ZÜŰŰ»Í544<šH$/f2QAĹ!€€Š  ˘¨`v‰ ź2çÜô ťN/ş¸i11đĹH“€©"f ŕ)a\zétz‘:ç7Ťa"ŕ=VSŤł S‹zŹâŔ1 źÚĄ3ç\"¸řió!±Ëđţ>ŽĹ6ţ¶ĽD¤ĄČ˙^Đ‘ăD4é¸ăóxsX¶ ‚8ţúObM·aŢp"ĺ'Ęńq.ATQQ-Ď~© ýŔÁ0tÉďQŞm„B/B€h€äsČ7 sV€… `•pŃś!bÉęň…ˇáŚ€BČRĎyŕŐ_†/ôVţÁmřA\v§±ŐźŁ0Ł ßŐA°ţqĽ "Q‹ŘŻžDJ% %ܶŠ]ű˝{çe*Ť”ł“EĚ#AĆM†-˙S~™€śĹ°= f†NžIiîRČv#í‡áŠ›#ʏŽîGÚ[Ękë(n{™`ë‹ŘÜ•Ď ćŁM­LBE*@¦,@Š}H> ˘çuŇé6<Č©| Óâ35°÷]ôçk 'Ď…Ĺ×`AkÝ=™0?=IgHN™Cé®?‡w7vBNÇźě$¬d(Ť#ł®Ć^ý &D‘nCGńDŔÄ* Фk±xŢ]ŢCë^4ßA Ń$vÝ'ĐI3±BßÓ‰e») ń۱ SŃ…+T ÉçŢŰŰ6 oݧŘx%zâ}žc:Ľ bĄ 'Đżâ§ąQXM5óHŰ{ aËvcŁĆŕjńÍOľň$Rf¬DJ0S%LfIs`θň:Xóuâ7†Ş®v§Öâ!’Ş^dČJ-ZtęQÔ<>™BjT5¤2 Éj/ů౓-AĎĚ]@ßčÉđô¸–Řčz8ކ?ţ>äłŔ)9K¬ ҵĐuilöpëź!'ĎCůĹ—Ö˘‚y?|§ĺL UPĚ!ÇOvBĚăKyJcFˇSćÁŽW ëVŰL˝?Ö †żöĂHÓÍP̡=íHÇaäĐNlßV|űaěÄ1,× Ó®BĽŮÁžwđŻţ„ľ?MpŰ˝$ÇM'űĚ·QÂAá ˇ¤e7ÇI©"ZwAşó5äÎ/6ÝH<ß‹űń·Číi” SM¸ňně§ß)Ë Uż +ô U),ۇu X(‘Íö’Ífű‡™ťZ¨łÍ9G2™$Y•"™LÇ©šµ”Řę{`Űzlă3¨*â=˛ę“řq—a?űAM ĄúiđÁ»`Ú•Ýíđř7)ěiF+ĹŮÇľAĽş˙ó‡ “Őř±“ĆYXý LKřX’bÁ“{ńQ žĄ7_ ŻŻŹb©0€ĚmDpĺÍLîüKâ‹o!Řôc›ž%ž¨Â9!¸ů+ĐąËb‚^ýűP=Šdű~x|-ůÖ}X,庯_Ţvţµ—ȡK/yJą,Ĺž6ŠÇ»čkنg=zü}PŢ0ń6gCô†ĹĚă2ő„SŇçKŘŚkČnţ%Öщw7f>9¦-ĆŹ›DL«H˝w„Âż>H_ëAśy¬íml填ď#ţĐéŰđ_KF=K)Ąš=IXěë_Y/Ń™SĘ€6dCcFĹ\M-V7)xÜôyŘýŹA×$Sź8KŽ„S’˙ýoäGϦĐ~imĆÂ"ÜôÇč—¦jÝwé}îg-S8DÍůŮ0öšs…eâ ‚¤ÓŘĚŘÄé %TĺŹűÇĎŇóđ_á·żŚ,»3‚·ć«đ•Úđ ąď Äa˘X95JůS„Sýň0mđA!!3ý›§°úzČ•đ‰ŞŞ‰em‘˝»(>˙Ą-/F[@ďůňőµ¸ëî$µţQŠßş‡|ˇ€ŠBEÓvʢ‚?Ť€ YĚ Ä"ŠC€Ě]˙něDB¤ý ňÚ 7™¨JaµučŃTíŰ‚kŮGďŹÖbGv!.ÎJU±0ÄşXʆBT߇Ćşşńą%'–;A°ó5âÉ$1ŠÄwżEđýű)|u5ą§˙ç Ł"ĺS¬@s±aRBZîÎ C1|Ąá|%kXŐ>ă&Gší8„/źÄ8@W~ úz7­ Î8™öaq@đg_Ěl°!Ş&8CÄg"ť-‹š˘&¨9Q“¨ ‹†©¨9Ä$HX쎯Lśm:5u1S;ç}ç»>ČöŤ5tĚD nú¬iäY$ΗZá äxó‚ĐžŘé`|X–ýEĺËCü–Ň)§ĄÇćűłÇCgłů8°ő·IäÇÖ2Vţ]öó™Q”XIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/cnet.online.com.png000066400000000000000000000147371361462701300311610ustar00rootroot00000000000000‰PNG  IHDR€€ôŕ‘ůsRGB®ÎégAMA±Ź üaPLTE44/.:DCI D[Z\ X] Z I)'D99Z%%W4.W<;jk mxp w vh%|"f%$e36w((^>AGFGETQXFFYZZSedlLMjPRpFHuTOfffjnpkqojvvwfhvyzt~€w€{„„‡ ‰‡• ꛕ™!Š#›$Ť0.¦¬ §¦· ˝ ··¸"¨$´*§'$Ł6/«74¶+&ą-8´0&±48„=Aş=AŹA=ŠEF‚XZ‘KI—VUś`_…gf…oqťec¦KD¦RLĄ\X·HA˝OXąPL˛\X±onĆ Í Ć ÉÔ Ř Ń ×Ó%Đ#Č%(Í'3Ă7*Ě58Ř&&Ú-7×9.×54ç č çő ÷ ůď é'ű !ű#ü#č)$é,:ę;*ę3;ü')ő(4ý3-ý:1ď3Aő;GËC;ŐA:çJ;ýE5ţQ=ĘJEĘKTÉWSŃGCŇNUŇREÖZYŢ[aÇ`[ÂuoĹ}yŘfdŇ|}íDKęISéW[úGJ÷KSţXFúUVĺ]gřZfţ`MýhWýp^ćagďiręptýfhřhsýwfúuxŐ€ć€ú|‚„€˛}ĘŇ}ţ€oý‡vţ†††Ź‰–•—‘Ź‘–—Ą¦ „·‡ą•“§­¬¨¶µ·¸¸ŻľÁşĆĆżÔŐʉ‡ĂŚĘ›—Ô„‚Ú‘‹Ř›šÝź¤ÖˇžĘŞ©Ď±ŻÎł°ŐŞ©Ů°ŻŘ´łĺ…„ꕖý…†űŠ‘ý•…÷•—řť˘ć¨¨ćą·ú©§ř¬˛ţ°®÷¶ąĂľÁô˝ÁýŔżĆČÉĚÎĐĂŇĎĘÖ×ÚĆĆÔ×ŘŰŢŕ×ŕßÚćĺćÉĆéĚĐćŘŘúĆÇýÎŃđŃĎűŮŮřßâęŕŢčçčçîńëö÷řččůďńöđîţţţ”EotRNS˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙S÷% pHYsaa¨?§itEXtSoftwarePaint.NET v3.5.100ôrˇ6IDATx^íZm›ĺuĹMŤđ $$n7!K-[ł.±X„\Bq MéôËÚ]ɢ¤DÚ•°dŔňnLY hHă šx ÓÁqI `\—B]hŤ66qĂłĆtť.(+üţč9÷ŢçýĐ~xťf&ÓŽ´ň«wĄ÷ś{î}îó<ďúďWŚ÷Ľ/ŕ˙­€ĆčľÝ/oxhýşuëÚđȮ׍Ú/Žż€€Ćˇ—ׯ\Q*•úúúJ}ňJµUv˛ŹŽVŔˇ—×’»TŞVĘ•jŔ±Ľ”Š}…âŠu»ŹŇŠŁđł—VVK媡R-Ř4e¸Q(ô~s×;öůé`ú»WUËĺZ­V­9*ŁX,÷– á[űěKGĆtŚ>2@rˇ÷%TĹËQ.!˘·X(,ßŐ°oÓ0şˇ¦ôŠj`‚˛;+Š|!ˇ·˝á?§%a:¤ďď7v"dB9¨€ôT …ěµ;íSav ,ë }TBŮCĹŕřs˝yH8r-QŔˇUËjŕjý82zţ˘8ĐĎgłw)GđR­6Đ Đ`6řYĐ:DXz ů\ňŻÚ•&ÁÔF×,óą&RX üĹ\±0áďŮŐ&Ä”öÂó0š$8lFJOčPdĐ‚%Kň™k§ęĐS ŘČâ3nCXoA-ĐĎ«@Ń[Ě÷BŔ’îL÷i\ŔáőËŚu``Pž‚ŠhSv€ÔĐ[ĚöfaAvIwwća»čxL* ±FěTŕ_„<0 ŕŹ( r˝Š9đCAęn»ě8L&`tUŤ„ÂRᥨ(…<@ †l~ ę@ÜanĆ$F™|ŁŤ ˘ŔYŔ‰9˘€@ 1 ł¨ őu»t&ĐX~±˝Z !Ä Ä` ”ÉĎź\‘ť ź!˙¤ &ĐXĄůp«ýKř H’0Δ3 ¤Ó×Á„ÖÖűŤŤÜkn˝őVüŘ{:(đůC­ŔĆAV  ‚{ěúaL$ŕ;Ë@atäv0 ˇ,ß$°8HřČj@z,HC@:őĽ1„0€]hż( ô÷á! \*T@¸ Ř ťh†9 s ťî|Ű8Śđz¸Ü˙}÷!Ä‚qDs`Ů@k€ ’‹ĆMŽă4Bá ·ŕ>(0(Ń·@ře „řEâ‡ÝyßtrÜP'`= p €ű`ţöw€oS‚Y(P?R–j€t 3Ý™Üf<ÍöbíAâ?ŮVŕr`Ȥl@€HXÂĐQhtv.|× MţúŐř%üG7ú d(DŞŔ$„ú€_Lšˇs€š“Đ$`f`g€&Ä8 ÂU`ô˘ Â/ňEđ経IŘn\Ѝ€×-˘ŕVĺ䯄h„ß, =öK‘^ r˝Z†ä7ťÉEF¦ XŞgĽlÜř( $*@ŔH¤! ZPE °$âlh‚gŚMđăe¸(A˘ŔlÜř= 4`‹dZ€2 „ż*˘¨ňű)čL^n«¸ünv@ězĺ{Qăj°Ô€s€ł!RĐzŔʧ8Đ™¸Ëř°€}e´– ›Sŕj@‹p0¨“NJ` 2y¬ ŐňŁ Ă„¬]F*Ŕ4 h`Ќ߯aŹ C‰@řX’`F$˝ ž3F $ŕuNî!$h„eŔ)ÂP ¨9q ż$~ěqǵł"6΀őeى±@&ÄÍČřµŽăWl„› ĚěńOďúé??•rô@"č€wy-É€9(Pp6°QčŠ0”Rx¤eO>ČËď'!™řSˇ$»ä€*ĐNÄÉŔÍE𬚠 ĺ`*°>čJ {šŘAĘßŃŃ™N °Vp,°éŃÓ˙Ŕ€fB뉞q=^Ľb úüpľ€Q– ŔËş* )Öřčřĺ B_-Ó±3űŽÂě N€«ŽŽŽÄ%B řv•„ŢUI  †űîŁűżć@řQ`%.~„ć@Ňtđ%‘p‹3_ŔZ» ÄČ0!Ą˙¦›nŚßüěżé†j҉uTyŹN‹ ÍĐ‹e ÂśáöŚßŠŕ@‡ß ś€®Ł a`ŕ† N;ůĂű؇ý´óţJ5Ür饋>űŮKEŔ3ńË3Ožµź62 +ąÄ)ż9űÓ_üĎĎOzť'“ŕ…ÖÖx+ŃAÉÄ m `_‰«KˇŻ \;ó¤9OĂéúţ'fźx—7Ş˝˝ýwÚľ28xщçüŰ:çôĽ«_ÉĹNzl?żĺy7_‘*€>—íÉΆ?uÎ'Ďikűd“Đ‘HĚ·věl(ů Ěźń„ť<çt(¸ŁÎăá[Ž˙č9MüD^`¨$˘_Űr±(čÎ~H(ĆĽ‘ ’LAGbŹžqV—8śÉżâŘŹ W‹oĽCăřĘçČ)ĂŘĺzç¶\ŞĆ>Úôµý—dE&5P÷ęŔČČÁ7AŢ™ččŰŞŔ X i Z" Ä[· ń·‰€‘c“S>ö_#M¨Z‰}ÜÎ4ŢihĽáE\ X cŔđEâ@"ţzÎü ĐzŽž9ĽwĂÚµ÷oř1RőŻŘ(ő«o‰ËŁ{wîu‹ŰĹüfąš8Kßî^ątéŐ×-ţ©Ľy!Ő€ĂúČłĎ?K<© ‘ř}ůđZꍮXh:´j—GýµÁ]#·`Ü üŤ FďŻŐ–•kĎhś;ŠěąRŤŐ}lÄ…ÂĽÍ|;vVćŔŽ$H$á>ş@˘ĂUˇ xYÔŞÇÉű}Č…4»AźOµĘ~4uÜÖ±úúţŹŘlŢ”Ż€]…^QPZŞë”gĆ!‡7Sżńkł8É™zôFH‚"ćŕĚ÷ĺŘú˝ †Bľ7źIĆŽiż%Ž=Ç?k‰µ2[çę˘Îü„켷ԷVOxsN<;ĺä¶-Ţě\Ą×9đ5pł`Ż÷Sp× Ą…ş’ň~qŻŢňÁ“ć {O¦¸#Ť·Ő‡‡ŚÜ2; bžd`~ÁčÂ…*…GôŚçmÝüÄÓ[Ů7·"ds`%§‚bÉĄ@ży‰ţŢólŢ4ç±'†řĹú"®BR'l…hŔşü@ý`}ř<Đ»FčxËÉN *… v*ŔY9ô¨¨j)¸5ľŔ·^Pxő±g%ď‰Ůű ż1üĆĐ8łk†ŻŻÁâ zź<®˙Úq=źá=YáGđxę)¶>’Ë ¨ô’w·Öŕ]›ż“  „:B@‚÷%taŔ؝ƀĐĹŹŕȵ°ŃÇ[ý „<ĹĄäŞ R ­:0NC{W&‡—śťý>ü—Ä\BÉ:",a*ŕ3;—PŔ{âČ?ůý;bŘ“ťJ°;En „xËł’7ôs2™6 ,€TJf`a×ř («S ĆĘ@XŔÎ,˙Ľ€Á á~_B¶ @ü™î¬AYţŇ€Đdü‰ş µDňďÔ†ľV“@Á„ŞĂżş2Ů®.DʧxĎáď ţs,Ś?vĄQ!ŢĂŮ|D‚ĎhŻÂ!gĺçz@Ź'’źfJĎúw ÂáC@čoŘaŤ<2ve" Šú őČ>^=‹ýG‚—ňv<ć—‘6 "Ŕ{8Ó“ÍŘŐŁ@ňŽ…găgőń€®ýt&żô_[:b1]Ś)"™éĆ…]1N-;äĹĎęŁńŇý%z†Ďúůáú÷ůĂDx?â1ŞpyÔö$Đě<ş9řá>r/ý‡áKőËŤ0Iżî‚z†ŕ}5 Ů\&›—GTŕŚ;ô`ĺOútʶ!×ř=éP€ˇ@4 ř ®Č- ·$‘×VťXß•îJńG†>ř­ű)ą&ŔĚ}ě Ł24 đîfE‹ä˘Ç(}0fîx}w !CŠ_ĘŹ±SŞO‡¨ţZc/“ˇY@ăš·t=Úb0 ¨8>ÁŚ7it]y!{(zm˙®˙ |­-W‘CłoOŞ;Ą„Ý YÍŔAĂvŠÂrŹ…u,<ü»ź~?|7˙»ěkä7nŢô-Â6ďžTšIÁá”Ö‚­÷^S*@ĂwÍż ?żÚ7{3ß4ĂŰ$·¶&ŕýĎB‰NŁ ľ˘čiŚľ˝¸Oz˝şO{´Ř€Z.“Ë·yďžäy3Ëí͉x{’ôŔ Ć*ˇ'ńŻţWł_ljŁ÷±ű ą_ô?v†d˝ŃćŐg´ÍŘä˝;ąďU\1j¤BN$éş-v}×ů,~7ô€Ŕ0ÓöBmőúŚúđYŢÜŃźX€· ”HśNĘ8!§¸ßč‘x›ó”Cô?R}V3Ýđř&ő7»ŽŤ?0‰o[RHÂ*äČ\ç?âąú/ô|îfz h™LAmĽ›1Ö®›ëÉ ä8čYţéŕŞCÉi}­Çş@ońźžçĚno?ŰnďN*ŔŰsz 2ô‡0 ą0sÉ#жk•¸?Ô’ü ´ë8Ô‡ě†ĘTĽ‘‹„B-ž´I.ő@Ëž§üĚ<˘wCźěb¬%˛‰b ^ăĎä÷áŽÉŞ>ŘŚ#ľ;vµ_DHôŕg˙› S đĽgČdÝÝé!ŔÉÂO zagŔě`áźćoĂ&ÂÔĽ·/™F-!ˡ8@!Řq v?ü+ŁéoĆxŢb ™Ů–¨5ťaË]gŢx;Ň{0ú›ÖăpDŢŰ— Ps#k\ Á·ÜÂĽŻČÍüXKËUS‡YšŇg@ĂyMžüsşEn"„ݧwö·\ŢL‚éđŢ{f>¨tŤěó =FčMěxiůüżŰ×§Ä´PÂŇŃv–>‰avÚ*ÍżlZôÓ<˙’ˇŢÂäQnK~KËĚ?ś†ůŠé đĽ˙ľk}z’óĹ×vZ»ě)wj8ŔŰw-K®xëÜÖS#ŃźŞ•7óň§";Ż#â(ďl_|Ů8{rXŽWHň;Ž1›Ŕ83˘©N1€µVrB&]‚™Mŕ¬&3Ą”EÄ€µ˙ YhŠđě&™MřäëęEšş…ýÂÔľg.O¨ôSťž—iđŽę_ŞîĐT|TÜÎÄQ°·2+Ǭ3;Ą•_lć@F11±p^>ĹÍÔ¶>{ei|sEcóď¶ íÝ}¦ŮA°Ż¤%¶SŞŔ5Ź'v§MT»_‘>SýnBQNqoô©¶­:;{[ÂA1ă¶ť ŘcäY'ă/{Ď”~üťčŻ˙#ň˘ęDyqÇ đ3WEž®×ś+×]ěÂI´[Hb–vΨűş!ĺËĘü„ć«_µ.JhXŘ4WUQŇ™ßÄr›·«Z©i\ß8W]µ9·˘˛0C·[ÚóÉ©ć?|׳ż´#îűú¡~8vttŤlsN÷lmŰmĺ Mc÷™2l`ĺĆüO=băě”ËĺÚß:l_˛ółń[ó&‡¤ű®Ű]Ým…ˇĘCl宨źM:÷TF/°ťqßx)4ľŰŽúg?°%Ă70Ń;𳀗bţXh¶P¶XýV´gHÚ”­–ďJ5ŤÂ4c'Ęűf…g>?căź"rKJMl•¶v^lÍií+´úV8%ľÂĘţ1ňü3™ĆG’ /¤Wt3öĆ ĂŻÔĺţQúąq˝łŐ‹4ËcĘVEw肱™In0łgăjfĆ·,KŞZŁ3PΓă ňR8>´&QY˘ )—ăĐɱ3]3÷y†ä=¨Ô=ąă Ź +”ő°!‘pňŮ›2ŢNm´˛ßĽ“çů›,ßŔÓ•YÓ¶«|B)Č=7§řĹ|SÚ1ĚŘć=ąža'ďŰvÄW‘lp…Q0Ú¶ďŘßl92!ěČĘ·rZGXá0[[ý¸¦^›ÝBÎiGchż~“˙UbéÔ¨&DcHú5ŘpéńŢGâĘ47žOi~FĄ_ÝęŰ»@=˛ę@ń‘š~RĄÁSýşuY\ůçI‰›ĐRV#Â7Ę´˛ÁŃ…ŢÁü«S7ś¸-oâƬ—"Ż`V6ô‹ŻĹú%ß·ésĎŕŘ˝W:cO’N÷MŁľ“őŘ¤Š– řĆ'ü°Wř)źSĺ–"…ěÉ)™ˇĚűEčlkj˝ }ç×ĚÝ´÷[?ź–ˇ>Ó‚MăŻt-‰+˙ejőăÉmŻg ĘY™‰˝ůeíŠLĂMď’čę‚7‘l^hýŞÎTÓ'̬l”}\lôS—ÎČhő‹©‰+jÂvűľm Đ6.Ôv=sU۰ źÎq‹D„ݢTCéçĄ}_N J–5=ěčóoőfTáď"N¬}çđ” QSCr˝CŹŻ|%˝¤ĂbaönóëzĎ]Ö˝ŇüĎçآöXźń°"« ´×‰'J}×Ex†ćűnŽ«jě´˛µż×ĚŘp`’B·ěuµ ťozďxĺJMĹQ%óâÖëô‘ô»Ď4lJŻ_W5W]űxF÷ÎäďG,L°Y‘©äű…âö‘#­ć·.6/Múv^Ú5mKúoĎŻđOn]ßľZuą”ÂúÉŮhŔ´đkCo,;;ăŤ6öüËI>[ŇƇg=°5ŮkcôŁ;’¦)â'oŃŔcŽ]˛]UR>ŚBpąŞ÷őČ‚•»4s^Ü?}}Ě[óŢéžć¦[–PÝjö“Ź„i&+Rf)´'‹Ťńgۦ+Ô3•şYŰłö坆ÚűĚÖŕěÚĺÚęÇb®ĎOîx6ľlEtŮÓÚ˛Gµ-Ťix.áň¦Ôď.µYGŻŠě˝ ]›RJV©Š–«./Žý~YBÝ’¸Z˙¨ jK:F{E¶&­tNb“źŞ-$Ą¬‘ë¬CcG(´îč;¨3…G)‰9PJmu˝˙ Č)Až;u“”±>ŰîÖLئ›¸#ç±×ż›VR;@)ńBEËs˙?EyÄ#čsźŮ<·öQdŤ K˘^ýoÉT0Dľ¸Ëá©POQhÚ’đijéSŻgM =ćą1wŮ›Ç:Đó\ Ďâ*ýÔ5~IMs´ÝĎŞ«fĆ÷ű'ęçĹç˙ńۦëŐŻkť˝OĄ\šź¨źť źťÔ°U»ţeME'kę1·vűzÍÎ,ňčG´öýcăCó˝vćř‡FHÎŻ7vUŇí»5rŠ2uFXĆkŽS*Śtł€PŐäÍ)‡%OMrx’ň‹×Ç|… Ŕ÷1Ń|˛š-Ž®_¦™۵9ݬµ_¨z†*2Ž'č…(ʲ«‹7,JęyîŔŮ/ŞŤe}–ŁťlU⍹I†)=/źĽjçY\ťé…¸‹ńmSłzŁŠšé$w˘ó0őܶA‹Eü8­xjĘ[™öPHÚGŞł$r Ů=ŕő(׆ż ýŢ;?˙Ű@őĆŹOôË]‡ę ˝ďöŚű•ŮS™Í’qőŰwó}™>ĘdďĐ”)ˇ:€Wě=ŰM©T‡÷žo^ .óKi<®öĎĹí4Ôo4&4ťÄ—síô\táÉĆĹ‘UoŃŁIŰü:ë?E_Z[鯪úěR%Ô{Űž‰-Z§ź•¬?ŤěçÎĎĂ"áĐ ĘjűŮ‹{ Ľ”éH*“SsNÝ€vIt!»ĽǙꎞ'”Ń^ŰrÇ+3üvĺý÷ńĆ÷uĹłU“Bu”GP–ŽŐP=@·OŰú_G¦)RĽ”™ă‚Ó|Â2ćFśľĂńDÝÚpěÚ¬Ôrź¤ň‡ŠOŐC·‚ÄŁÓĺm"ťˇaĚ,łł§UßÍH2ÎMnAWżżÂ´÷;ĂĆô« ŁJüÓšć&V4 »gk˛ëjŞ–h[Rjš Pęć~ś<¨ ¤–Ą_š’5Q™ă­ČŞh0b?^Äs+vÖo&@Đç^M81<Ó+0uNjfxÔô൏"c^Xr9ő™đĆ>´ć¦M Nžś‰:ç˝Eőď‡NŘś cÍ[śZ<'őĆ´ÔëO%”7ö‘Ö­ô2ŹÉ#ŃŕN+c;˛ËĽćźnžżżrulĺ‹Úú'#*T-OjQŇômVVeaKôłbë´ AGš!!ťĄď@¨Ă襣…Wź¸ţäK‘˙vöŠ]IĎ˙.mÄB!î  +5č`Ar f5˛őćÎ Ú3oSĆwuźťmů‡ÝOîŚXµKóĘľăĂSbö(Z}˛úˇpݸ-©(Ń˙[‡dŠđƉAb5ő\`ćŐ@]ĹşśŇWóŞű(±’I©‚ Ń`;ş yR?úŃ—uK®?ŁąüŇéÎŹ+¤Đ‚Îu9 ë˛+ŹÖ+i Í®[“ü}pf)ʵw¶0s ]Á)ěđĂuż×Lą‘VIv°ťŽ€2`zÉ&š óĎĘ ýÍťlÄF'Ď ×.BBb;zAÓ€Ä^;xzrÎ'$ÝgÝţ}ŮĄp%ĘNř ŠŞ…uHtví6,9aĚéૠŘQŢ»-¬¦×Ü4h~0°ł>+Ŕaü¸Ń!G'v‡˛–?Ŕäf?JtÔDÇ!a&öÁn‚`Ą3 äFď…C˝’p*žČĘl˝4KÎ/$ş_frHϸÇfbÂT–ömçŁ!šűB˛f…%Ży#ˇe™¨‡%e’\HůôRçbU5‚r2n2XA^⨠˂QŘŤJjbÓ(R™„şq€žÓ9Ś“oÔ°ý8ˇń =á2'bG‰ -Î90ľÂŕŠ†‡&ŰčЇßli@†1 ­Ń» z &ěě×ďçyeMŘqtÚćCéßP*ÁهT'@˘›ŕÇq&fłB›ČöĚn…§a 5"™ÔíÜQmvVz‰[¤Ř•ÇZśU>ĺËSŰčmy^=0rď÷2®N ×üÝölźµĽ|ŕËz„9płĹJa~Żčn¦§°sí˝ŁŇO…š~čôî´sůĄ-0ťQŕr” Č2÷Šî`Î.Ú,v9×ŃázÔdć&]<Ĺü>(9D^„ÉéřŃÝümÉYQ¨Ë‘ č=N&ô6·č6M’ĺ·{Cw °ü“‡ŚWřNď™yĂI‚ăśď6e”x€#>ęË˝ˇ»ĂřĎÂaŃ"âËXĽR&§)ą2o·#Ł´Üş›. B%ĂiŰigŔÄ S°#!>éU6ŮůŢĐ]ŚĄ—Fôűť:ú‘N.XqŰů{'ˇÇ•=ŰůűĚ=ˇ»lá˙˙äěęäěęäěęäěęäěęäěęäěęäěęäěęäěęäěęô3ĚŘ˙„żND,‘ŞIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/ea.com.png000066400000000000000000000140151361462701300273170ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢ pHYs.#.#xĄ?v OiCCPPhotoshop ICC profilexÚťSgTSé=÷ŢôBK€”KoR RB‹€‘&*! J!ˇŮQÁEEČ ŽŽ€ŚQ, Š Řä!˘ŽŁŠĘűá{ŁkÖĽ÷ćÍţµ×>ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹF 8IDATxÚä[yTTWš˙˝WŻŞ¨*¨}aUP,n¨Ät–Ö„Ö ‚Fͦ1Ι̤Ł!1f&9¦µ»MĎ‘Nfb˘IÚ@ÄÄtÓ14:FăQV‰6Ł‚Ú×WUďÍh @)(;Â|ç|çÔ»÷űľ{ß˝÷»[]âŘ7•Ś4j5ĘBáţ<‘.— —˻Æa`±Za·Ů01&F“V« B‘.š†H(˲°XĚQÝZm˛A§Ku:qfł)Ňf±„ş\. MÓŕry>źß) ;ůAA×…"Q“L.Żâń5 Ąâ‡âÂn·Ăf±@(ÂÍ0A@ 'MCŁVCgĐvŇI7. ÓSRÁĺRp»Ýb¤bY<>\^<Śí×®Ąëşµ™ÝÚÎ…zť.…aňvú. —‹–Z,ćřľé$I˛©¬Z©R•)”_Š%ŇÓR™ &‹N§3U™X–—ÇR­FkK‹řű‹őkÚŻ_{JßÓťĘ1 Cču=©z]O*€×ĹIuĚÄŘBUhřG2ĄŇȧ(ŘŽĽX–‡ĂL®@ʶKpüë#żŻ«ŰhłY•¸‹d2Sj«.¤PÜş7⦼›x_Ňź*••˘(°,3,›¤ßŕb‰A®4ÔŻ;Qq¤ńüŮ3¸Űŕű’Űĺ’_ŞŻÝZţyYă÷µµë!Ćą{=€eY$ ĄF榦賧NĽŁ˝í×řÉép„ť?{úýŽźÚ–'MźńOJµş™$I°~8‚âXŹĎ‡D&ÇĹÚę'•|zé—ß—Ú®ýřĐáĎ^ş|ńâj©LŽ  Á{5đB‘2ą_•˙u[]Őů7po÷Üé“En—sę# 3_ ’Č;u{P·ÇCŠ˙r÷RŐąď6—í+ EP(đx<Ăs€Űí†D"R©Dc]MÉ—.=QBW[šWżłă?±, •JuŰ…9X·—˰;iěŰ»ç0žeÔP_—µ~ÝÚbŹ•J–eAD?&)ŠB_ćp8 …ŚŠÄ+ą·}{úÔSĄT]UµrÆ߾-S(@r8 i\.·s–,͆Óéô˛ÍnGÔ¸ńx/?ÉľŹ?Ú‰QNMŤŤó–˝Ľ`ÁŁ Ú®.°˝Á ěM&JĘ>÷ {<DFEá‡+WTĎŻ}¦ c >ř0<>!áĆőë×@r8˙\n7\n7\.¸<ś4Ťßo}ëĆműÝ–/l6[ďŽÖIĂE÷2i0`0 Óë$âĂ=¬úńjëܱ怟ÚŰf>« ë]°X€ęčěX˘ŕ`ÔÖÖeĄűßÇĄ’â˘]“&'ńřn«ĹČq‘‘ŠŚÄô´4ś>YůăńŹU0 #(˙âóçPĚf3, ČŽÎN­V|÷Ý9~ĺ7ÇßħÚę ˙ÖŮqC(•Éz§~švBŠĂĺ}ÎápFb|Ë–-JĄ#Ş D"Aii)Ž=  …4ijjjŠÚIo+ívóÎť=ł~QÖŇw (ˇP«ĹŚşšš—FRń~áĽőÖ[iĄĽĽ<ďďÍ›7ăÍ7ßEQđxą§[;i¸–JĄŘůŢ{ż,; €ŕŕ`lÚ´ °{÷n€ŃhŔ™oĎ ĄĄ=:ݰĘ0čőęjjf°,€˙Ú˝éó2ţďÄŕ?WUU± Ę'|ě–<č“?-9™I=űrꌙ;ňň @9v47ţ°x¸-6gÎŚ?ÍÍÍ#jyš¦±jĺJď÷üůó‘˝l™ŹĚŇRÄÇǤ§ýŘҲH«ízżÍ}U=OJĄR– €µĚ-îęę°—ĽürnŔĘČ^ődŮvýú¬‘xŇ`0€eŮ€NUożý'¨TŞAä¨Őꀔc·Zç`fúś­n˝‘pLĚ„;ĆŠăÇŹ¤¬´™ł·“F!î^Z¨”,»ŁĚ>Çł˛F\–AŻ‹ŁŚC„żŠK–,EÎňÜÜ\˙,—č“Füü”Ń›.WČ‘——‡ŠŻżöć®Yłi©©>˙]Y‰ť;wá`ŮźôÂO>D*őëüçd1›Â!‰~đ§ŰH$R6PéµĚŇNşźLZZ €=räHżĽ]»vŤh„Ĺ—@qąF”ţV^đó22|ě~öŮgýdö—”xó Ĺ€v¦M›6lđxĽźŔ:T…çׯř’ŇR»üęWýdśN'+|ä<«ź\Ssó°Ŕĺr-ÄMď4^ř|>ľúę+h4¸ÝnL&Ě›7Żź\kk+Ěfó v¬V+~řaŘl6oÚŤ ŐřČ­^˝ĹĹĹŢďääd-TTT &:ÚGöŐW_ĹŽ;üżIár­ ¨ˇ Š˘XŹçý^łvm˙Öhjö{QôÇíŰűŮ9s挏ĚŢ˝zólvű€˝J©R oDÁŤţ*ň‚X«ÍÖŻ))©~ىŤŤLÔ¸q^™YłgiXUT^ ;ĺŻâáÇ‘/\¸ĐĎζmŰ|dÚÚÚ†[ĎĘň«|ĄJý-&ÄĆî÷Gé7‹ő+¸¶¶Îođkź{®źť¶öv™={öř\Ť&Ëáp†\‡ ±q)ąBŮÔŇÔ4¤ A’$Š ‹úĄS…EE%?[ ´ ęM[´hQ?;O¬đ˝«¨¨Ŕ—_~9č^#77ŢoqH °~ýú!áQ(•MČĘY±x¨Űąs'{·čÓO‹ýîE2ą|@[IIC[,^˛,9«źÖ ExJbâ]ď`Î*oظ±ź˝K—/I÷ĄÜMäřčńť2ąüŇťŽĽjŞ«ďÚčůuë`·Ű‡Ąűî;ďŕňĺ+>i ńńŘUPpűĂW©´IŇNĹĹĆaę}I;u˘rň`ÂéééhnnFwww@Ʀ&ŽČNvv6vď.đĆ‚ š’ ą\Ý ç†IÓ’Ëc'Ć‚2™Lž0ńŔ©•Ż VŔ±cÇ0yňä{ö¬żˇá˘O0ěłŇT'aJb Ăx@666BŞPV‡„4&ěrąFĺ%Č`ő ą,–ž«®©©T(€ôąůřB‰÷%ç+UJ€HŹ»Í†łfďŕëŕ9Žű±ĚĚ÷E"„‡‡t:ťčÖv!"2Ę>ďţ~?Ö>7ăí„ÄD+ít‚ĎçÔ¨ŐŐh ŕółbĺvŠËµŚUđ$IÚ<–ą­íÚuX,–ŢŰá[KUÁ€čOÖ˛ěĆŞ–ć,qć¬Y´0Źđ°P„…j@ě/űĚ»Fçó “Ëńě“«Îţxőꬱ>4,¬j_Ńţ4“É»Ýâćö„ôx<čefł,Ă"wÓ欱Öú[˙°}±D"Ë0 … z™äR\Üâ >ť—qÇżĽřŇň±~ĂËąOţ&3łÝb2B©C&•x™¨<ů?ľ'÷7źżDGÇŕůuk·ţ{ůćŃ ţ× ýó‡śŰÚŇ §Ó ‚𽫠z4Ĺ0 d2BĬ\‘S\]uaĺh?}ĆŚű>ů4Çî°Ł§»ś>˙ôÎ |ôôô€v:đÁŢŹV%N˝ď‹Ń>D"-cËÖ>ʇn­v@đ: ÷”‡‚V«í=yyíő%băŠG ř¸ř„Źe-[l2™ ×ë@Q?‹ ď°lD·V §Ă‰ĄO¬Zť”’ú§{üÔ䔼ěUO® Ţ«{’ĽýŁ;>™áp80›MpÚíxhaććů=ň4I’÷âöypÁŁkd.zĹfµŔl2 ÚíýrŔ­ŕp8 ŐvaöÜŚÂUϬť"WŞżąW«4ˇ'–?őě”YsćţĄG«…Ăá¸cËűĺ€[§7ŚÇnmäJeÓüG<4=}Î ˇ°ó—Îăóµ3ćĚý×Ě%ËP©ŐWş:;Ŕx<ý¦şŰ‘_' ‚A0Ťp8ě–:˝`|ô„˘úšę—[›7¸hZúŹÎĺňL ‰S˙3~Jbž\Ą2ZL&¸iA‚ Ŕđ~; Ż#<ôşpyŇ„Gt۬čş»A’$ř|ţ°lŽčí0A ťNô:…Áşä´yc'ĺµ67Ţo22u== Ť}ŇHţD%‘ĘęĂ##ŹĆLŚý»Ëí>!…@$B×Ó °,’‘Sňzś ĐtŻ#Ŕ ĄúäĸI'AŻ™ úłÉ˘ďŃĄZ­–8‡Ýáp84M‡€eĹ˝ú¤™Çç™x<ľ.H h‹ĹM™¬JŁ ­¦xü±D ‘H„†úz zP$‡§ýďEĹ×HDä´«IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/ebay.com.png000066400000000000000000000110151361462701300276470ustar00rootroot00000000000000‰PNG  IHDR@@% ć‰sRGB®ÎégAMA±Ź üa pHYs  ŇÝ~ütEXtSoftwarePaint.NET v3.5.100ôrˇ|IDAThCíYTVGÚžű˘QW,ôŢěÉVš‚=Ć‚Á‚-‰QS0&»¶ŘQlqŐ¨1şgM6*‚t°ĹëŞkܨk…Ź_ą÷űźwćňĺwŁ«żç?Ç÷ĚćŢ™;ó>óöfúNŻĽjz ŕUÓkŻš^x2Éęß'’˘ţ%RÇO]˙Tzf5O) ˝ýď!ľěÇćo«¨z,˲:zÂÎŐh1űx–ŰzřôGx1?>ÎĄxÁů§Ńă Ŕ˝Tţ R#ß˙QR§ÍôřŃśdΕ®—\ľ]văvÉŐüŇëćvłôúÝŠŰ|KÜŠŻjî&›ç`”MŁ‚fä=oęU‰ŢLĘg^– ˛QŹąźďě”ĺŇ5×7<×7,ÇÇ܇f{÷ÜŢŔÄ'üójâ›ĐËç@WďÉ• —DX¸d"ş=qńm¬$Ńń zÉO8:şmşmp¶O§,·ÎŮ®˘…äx·Jk°öěb,0őbĄ™đ;ÁŕٍΧ/˙¶ýTt\ćK¶ŤNĘ}qŢđ„śIköé ć;6ź§B"î 4-u…JÉeĄđ”ńÁqSŮÍă·2;¤»uŮáşË+$×=8Ç#8Ç-8Ű«}–S˙]Ku%üóę=Ĺ„ń3nÎĄ<6!‡ůM±ě8ŹΑ‚ć˛63\ßYV©3`Ťşw•Âđžn]ÖÎ/1í U˛›*[-ä-š1E2e×=ÝŃc˘G‡eîÁ;<:f{@h®OŰôĆ×7błČ h;:čŕÝÝĎŁBPwôăżÚ)u«Ýs±&rˇe÷…,lÇđUf|ˇŠDŐ™»{LŮŽň’Ľ‰“™Ľ…’jiÜbiJc»—×¶ŕěĺäűKÇő^!Ű!hQ@†ý}Ő­TRť^~qtäď ˛„ŤČ|Aă–îg[F&˛D‹®Išxס_€ywiPp\Ůb ÖM[­”-JŠFNŐ(™ü5c 3ĄKŃź5¶ěě2ŘŃckç žˇyîťłÝCr=˙épčŢ^0€[;ĂŕńTÁ?Űg9?€łöT‚ šmŐ-‰u%RpĽëŐ\fĄń+Ďľîŕžî;ERRčúĺ+Ó‘!Ę™8ĺčP}jÂŞşM˘]=†;;˝ëÔ"Ö54Ďŕ‹`ßSŹŤáGD€3Č•xśýĎOˇ`ĎcÄÂR’@×D)ć `Jř"νR|AI­%§2\<¸'ÍÁÝźK˘yYG ®ţŐ¸ÂŃDĹ6¶ŤvqŹqrěüťgđ62hŔ@ąčÖÓÎ<&\)>šç…©çPS5¸ YYÓ¨ú“źFŞ’ŞQ­6™‘•^ÄĽl¬ ٬ĽŻO·v¬¬Ó$ÚŮ 9µ[á§Ăr˝ „Ą§ç`[2ö\ôË´6iŤ0ĹH(UŚÔŚzřiô Ź2jżXP•śŕăGhşTK@§çó¬ĆhäÂd®¬3éŚúJÚJZ=(’)ŰA©ĽK+I›ˇŰĄrŽYHšfŕ§M` °ć ĹŢ!;É pý˛]zíh[XˇĹ' _Ëó#óZ V`Š žž@żË†lĐUP%s„HÁqŔ@×c0T›z˝ľŘPrM)ż©”_7–^•Ë®)wjžK÷•çi€ ¶cąµm´´Oô Ůé BmŇě6_^+ÖŻ9—(®źTČxĺšáč }ŢnýćôĘő›*WmĐŻř[ĹňučÖo¬Üś†)ă?N`™RZ&ľ»h$`ÁŤXHŔmŘŞŠJ@k rţýŇ«żi‹+đv9‘„ŚŚĆbSŃiĺŢ~Óť<ĺ×sďc c€SZ–rëE4Ř{ň*@—EëĆ:›ŔöÇJű>bw×hHy~&WR$– äF«.ĄZ’jť™9úȰ€t;¤tÂĺ›L`ÖMڞtx,mW}ýj"€G€ÁňÁ2h˙h|GJ>Ł5Ím:Ng]O\¸ŤőÂĎ–T裿fał3>ip$Vn,µ gfÓţŕžźH§äy›%@)Óß™r~ᎻڦۀŃB¨nx˙fFK…˘ď? Oő–|-ź÷|c¸|UÖjË'Ĺi-ě ·¨ `U-_Íüci‘[‹ńÖýVţvźŠŠŰĺŔŹ7Ö ™üclťC±ě@,Ű3Nş”Äś_Ę »$¬¨ä¬FR4ČL…”Ó3±É¨˝‘ȨCr| C– …›¸~8%ë$ýF4hŇBřŐ ˇń7ä^«”­¨‘/ŚÖZűĂ`¸ä7ŽyzyŤ˛ömIi98CÉ&޶I[Xçiyę€Pˇsó-ŕőŤ§g€o®B—öĆjŕô ´ÄîfÉë¦d9KM¶Ä@Ä2Xq+đËŔ{űzRčÍń®)”2“Ž}i3¤@eď}ÎWVU!‚čëšUÂŁšĚ­ŘÍ‚[öYÁz­”zŻ`! ĚŤP! ΂ ĹŐé¶ yĽ=„°sĽ…^M[4Âjĺď™|x(…3Şi¬)źCى }| #+#÷ő Ělí7ϵLcÁĹ]ٰ´fޤÁpyEE⊲Éqe_&ULK(źžX2-Ń·8ľËŘVv˝ťúwtęâôN­Ŕ©CWW”W@ßwz*k?‹E,óë=qWlťź?Őś„ŰdÎýf 5ľ˛»=–›®~Żl”M¸{$K† LŢ×SÜݨźz“  pB€#(™«žĐZťNü^'` `Ľ‘Źl´€5)*ÚfŻ“ě×1çaĚusĂÜĆXz×j7­ń»_ /Ř uźĽ Flą …cŻ)_Ć´=6·)k|ÚňŽV¸x*Ę@ÇMú(Ł”Ă•Ch|j˛<˘B°‡6{µp.=´QM©DüWR‘ý›ZŰ–0hô“#‚aŃr s qęË"7čłřne˙$>^wžđ=r;duČö,#ŞGĹ'›”Ć‚SĆŠ[$i:WĆ•ňa,`ŔUH Rhł¸ TĄ˘ĄŃăô'O#›_"Ź0\ąY>e®ßśĆÁeˇG ]SŰóËÜŢ­T',ŽuMBuváĆ)®*é7j­H餭ş% ×°b·"ÖŤ\oAT¨S‹žlQáůO“@f Ŕ˙p PS7jĆPT×»°M—’.QhĹou'×iá XY7ÂŤVÚú­µňĆ<ű6 ­2_ŠXHż¬tš·í(©˘ž—”·î•Ôďł”…-5'źAł&ĆÇ`"ęń†Ź‰ ~5©@–—pŁI€TyzD\ôÚúžČ=Ń ëyS|@MS ( ŠŐq»Ďě Ľ—9†8ů˝§‰\Ä"Š%ň¤oč‚…/JŢ{Ö¬?h4h??çđEL ?öt2@ĘrDâivD(ÇM=ţf•ލcP» ß´v%îˇ3hX;X:CXS¨q(¬íVdß¶8¸_ŃäyĘżOSQß!žîµK± á 6}–ě9y űžż~ßoÄ7¨3 ¸G՞а÷Ň;÷J1+,äéd6¤‘űzŔi"!m—é„R ăÖ[üůč{eşÄ•ĺf” ý¨ôí%ŠBúĹâΊC”E)8¦ôĂĎËg,Ş\÷qĎ!ůÖě)îoÜŇm,`–řeN`‹ŕŤë°5(h¤ŕ8™DS¨ËPµµ›3đË|H>ZŤ.OˇJ@1}ňŹčČĽoď č˝ý-´^;Ţz{gPx®ďܓ꒫Ë9ń]iÓÇŚ7\ž´/ý¬B?în‡‹´î±wL?î†Ć÷ĽĹ=zĄÔi>•Â\g¸ň€{Ľ±Ž?|–’mÜ+qö‰VѲR]q‘® XŻ-Ö©MŻĹ›rC18{٬^ě+>âěňh ~óâUŽ9ĚřO‹âçu‹qRŕôĚgrě’Ľý§oIˇ TŇƓ@€$dp˘­Ěú_áúůxä±J2ü*1őČäĂD E궢Ŕ¤î«>TĆÂK®ÍýWż™éò†Ĺgˇď73mmÎIĽ?qé·¨ŮiQ+ (mże‘Ú´÷gúO<%¸©ąŰéˇăT„ËŞIŞűzćßFż:1ý†ĘĘőWŐ^Ě/*(ˇ˘Ţ]Uýßŕ™čŮp+ŕ  ŻŻ7Đ@H†ĺfF‰řĘí8ëUćűÂč9>Bć÷d1 đ_ő’ô‚éżđżç_e·×Â4_0˝˙—ô‚T]üKąě'Ň‹đR4ü?ÓKVˇ—Źęµ Ľjz ŕUÓkŻš^xµd2ýe0‚’o±CIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/em.ea.com.png000066400000000000000000000140151361462701300277170ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢ pHYs.#.#xĄ?v OiCCPPhotoshop ICC profilexÚťSgTSé=÷ŢôBK€”KoR RB‹€‘&*! J!ˇŮQÁEEČ ŽŽ€ŚQ, Š Řä!˘ŽŁŠĘűá{ŁkÖĽ÷ćÍţµ×>ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹF 8IDATxÚä[yTTWš˙˝WŻŞ¨*¨}aUP,n¨Ät–Ö„Ö ‚Fͦ1Ι̤Ł!1f&9¦µ»MĎ‘Nfb˘IÚ@ÄÄtÓ14:FăQV‰6Ł‚Ú×WUďÍh @)(;Â|ç|çÔ»÷űľ{ß˝÷»[]âŘ7•Ś4j5ĘBáţ<‘.— —˻Æa`±Za·Ů01&F“V« B‘.š†H(˲°XĚQÝZm˛A§Ku:qfł)Ňf±„ş\. MÓŕry>źß) ;ůAA×…"Q“L.Żâń5 Ąâ‡âÂn·Ăf±@(ÂÍ0A@ 'MCŁVCgĐvŇI7. ÓSRÁĺRp»Ýb¤bY<>\^<Śí×®Ąëşµ™ÝÚÎ…zť.…aňvú. —‹–Z,ćřľé$I˛©¬Z©R•)”_Š%ŇÓR™ &‹N§3U™X–—ÇR­FkK‹řű‹őkÚŻ_{JßÓťĘ1 Cču=©z]O*€×ĹIuĚÄŘBUhřG2ĄŇȧ(ŘŽĽX–‡ĂL®@ʶKpüë#żŻ«ŰhłY•¸‹d2Sj«.¤PÜş7⦼›x_Ňź*••˘(°,3,›¤ßŕb‰A®4ÔŻ;Qq¤ńüŮ3¸Űŕű’Űĺ’_ŞŻÝZţyYă÷µµë!Ćą{=€eY$ ĄF榦賧NĽŁ˝í×řÉép„ť?{úýŽźÚ–'MźńOJµş™$I°~8‚âXŹĎ‡D&ÇĹÚę'•|zé—ß—Ú®ýřĐáĎ^ş|ńâj©LŽ  Á{5đB‘2ą_•˙u[]Őů7po÷Üé“En—sę# 3_ ’Č;u{P·ÇCŠ˙r÷RŐąď6—í+ EP(đx<Ăs€Űí†D"R©Dc]MÉ—.=QBW[šWżłă?±, •JuŰ…9X·—˰;iěŰ»ç0žeÔP_—µ~ÝÚbŹ•J–eAD?&)ŠB_ćp8 …ŚŠÄ+ą·}{úÔSĄT]UµrÆ߾-S(@r8 i\.·s–,͆Óéô˛ÍnGÔ¸ńx/?ÉľŹ?Ú‰QNMŤŤó–˝Ľ`ÁŁ Ú®.°˝Á ěM&JĘ>÷ {<DFEá‡+WTĎŻ}¦ c >ř0<>!áĆőë×@r8˙\n7\n7\.¸<ś4Ťßo}ëĆműÝ–/l6[ďŽÖIĂE÷2i0`0 Óë$âĂ=¬úńjëܱ怟ÚŰf>« ë]°X€ęčěX˘ŕ`ÔÖÖeĄűßÇĄ’â˘]“&'ńřn«ĹČq‘‘ŠŚÄô´4ś>YůăńŹU0 #(˙âóçPĚf3, ČŽÎN­V|÷Ý9~ĺ7ÇßħÚę ˙ÖŮqC(•Éz§~švBŠĂĺ}ÎápFb|Ë–-JĄ#Ş D"Aii)Ž=  …4ijjjŠÚIo+ívóÎť=ł~QÖŇw (ˇP«ĹŚşšš—FRń~áĽőÖ[iĄĽĽ<ďďÍ›7ăÍ7ßEQđxą§[;i¸–JĄŘůŢ{ż,; €ŕŕ`lÚ´ °{÷n€ŃhŔ™oĎ ĄĄ=:ݰĘ0čőęjjf°,€˙Ú˝éó2ţďÄŕ?WUU± Ę'|ě–<č“?-9™I=űrꌙ;ňň @9v47ţ°x¸-6gÎŚ?ÍÍÍ#jyš¦±jĺJď÷üůó‘˝l™ŹĚŇRÄÇǤ§ýŘҲH«ízżÍ}U=OJĄR– €µĚ-îęę°—ĽürnŔĘČ^ődŮvýú¬‘xŇ`0€eŮ€NUożý'¨TŞAä¨Őꀔc·Zç`fúś­n˝‘pLĚ„;ĆŠăÇŹ¤¬´™ł·“F!î^Z¨”,»ŁĚ>Çł˛F\–AŻ‹ŁŚC„żŠK–,EÎňÜÜ\˙,—č“Füü”Ń›.WČ‘——‡ŠŻżöć®Yłi©©>˙]Y‰ť;wá`ŮźôÂO>D*őëüçd1›Â!‰~đ§ŰH$R6PéµĚŇNşźLZZ €=räHżĽ]»vŤh„Ĺ—@qąF”ţV^đó22|ě~öŮgýdö—”xó Ĺ€v¦M›6lđxĽźŔ:T…çׯř’ŇR»üęWýdśN'+|ä<«ź\Ssó°Ŕĺr-ÄMď4^ř|>ľúę+h4¸ÝnL&Ě›7Żź\kk+Ěfó v¬V+~řaŘl6oÚŤ ŐřČ­^˝ĹĹĹŢďääd-TTT &:ÚGöŐW_ĹŽ;üżIár­ ¨ˇ Š˘XŹçý^łvm˙Öhjö{QôÇíŰűŮ9s挏ĚŢ˝zólvű€˝J©R oDÁŤţ*ň‚X«ÍÖŻ))©~ىŤŤLÔ¸q^™YłgiXUT^ ;ĺŻâáÇ‘/\¸ĐĎζmŰ|dÚÚÚ†[ĎĘň«|ĄJý-&ÄĆî÷Gé7‹ő+¸¶¶Îođkź{®źť¶öv™={öř\Ť&Ëáp†\‡ ±q)ąBŮÔŇÔ4¤ A’$Š ‹úĄS…EE%?[ ´ ęM[´hQ?;O¬đ˝«¨¨Ŕ—_~9č^#77ŢoqH °~ýú!áQ(•MČĘY±x¨Űąs'{·čÓO‹ýîE2ą|@[IIC[,^˛,9«źÖ ExJbâ]ď`Î*oظ±ź˝K—/I÷ĄÜMäřčńť2ąüŇťŽĽjŞ«ďÚčůuë`·Ű‡Ąűî;ďŕňĺ+>i ńńŘUPpűĂW©´IŇNĹĹĆaę}I;u˘rň`ÂéééhnnFwww@Ʀ&ŽČNvv6vď.đĆ‚ š’ ą\Ý ç†IÓ’Ëc'Ć‚2™Lž0ńŔ©•Ż VŔ±cÇ0yňä{ö¬żˇá˘O0ěłŇT'aJb Ăx@666BŞPV‡„4&ěrąFĺ%Č`ő ą,–ž«®©©T(€ôąůřB‰÷%ç+UJ€HŹ»Í†łfďŕëŕ9Žű±ĚĚ÷E"„‡‡t:ťčÖv!"2Ę>ďţ~?Ö>7ăí„ÄD+ít‚ĎçÔ¨ŐŐh ŕółbĺvŠËµŚUđ$IÚ<–ą­íÚuX,–ŢŰá[KUÁ€čOÖ˛ěĆŞ–ć,qć¬Y´0Źđ°P„…j@ě/űĚ»Fçó “Ëńě“«Îţxőꬱ>4,¬j_Ńţ4“É»Ýâćö„ôx<čefł,Ă"wÓ欱Öú[˙°}±D"Ë0 … z™äR\Üâ >ť—qÇżĽřŇň±~ĂËąOţ&3łÝb2B©C&•x™¨<ů?ľ'÷7źżDGÇŕůuk·ţ{ůćŃ ţ× ýó‡śŰÚŇ §Ó ‚𽫠z4Ĺ0 d2BĬ\‘S\]uaĺh?}ĆŚű>ů4Çî°Ł§»ś>˙ôÎ |ôôô€v:đÁŢŹV%N˝ď‹Ń>D"-cËÖ>ʇn­v@đ: ÷”‡‚V«í=yyíő%băŠG ř¸ř„Źe-[l2™ ×ë@Q?‹ ď°lD·V §Ă‰ĄO¬Zť”’ú§{üÔ䔼ěUO® Ţ«{’ĽýŁ;>™áp80›MpÚíxhaććů=ň4I’÷âöypÁŁkd.zĹfµŔl2 ÚíýrŔ­ŕp8 ŐvaöÜŚÂUϬť"WŞżąW«4ˇ'–?őě”YsćţĄG«…Ăá¸cËűĺ€[§7ŚÇnmäJeÓüG<4=}Î ˇ°ó—Îăóµ3ćĚý×Ě%ËP©ŐWş:;Ŕx<ý¦şŰ‘_' ‚A0Ťp8ě–:˝`|ô„˘úšę—[›7¸hZúŹÎĺňL ‰S˙3~Jbž\Ą2ZL&¸iA‚ Ŕđ~; Ż#<ôşpyŇ„Gt۬čş»A’$ř|ţ°lŽčí0A ťNô:…Áşä´yc'ĺµ67Ţo22u== Ť}ŇHţD%‘ĘęĂ##ŹĆLŚý»Ëí>!…@$B×Ó °,’‘Sňzś ĐtŻ#Ŕ ĄúäĸI'AŻ™ úłÉ˘ďŃĄZ­–8‡Ýáp84M‡€eĹ˝ú¤™Çç™x<ľ.H h‹ĹM™¬JŁ ­¦xü±D ‘H„†úz zP$‡§ýďEĹ×HDä´«IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/email.blizzard.com.png000066400000000000000000000061721361462701300316460ustar00rootroot00000000000000‰PNG  IHDR00Wů‡sBIT|d 1IDAThÍ™y\ŐuĆçÜ×Ët·f¤ŃŚ–íhE  HÂ"Č‚°Ä",&–÷T9›8e㥒¸R®JpE$v\°‡"€ŤˇŚ…ŤCpBŮ„Jb3Ň ´oŚ43ŁŃH3Ó=˝Ľ{ňÇëmŁY$ĹΩş]]Żß»ďűîůÎąçÜĘ6jÔ¨OŹ7îËétz!˙Ź­···ą­­íÁîîîÇ ˇˇáßëęę>ó»…62ëččx¤µµőO\&“ą»±±ńß5 ‘Z*•ZÜŰŰ»Í544<šH$/f2QAĹ!€€Š  ˘¨`v‰ ź2çÜô ťN/ş¸i11đĹH“€©"f ŕ)a\zétz‘:ç7Ťa"ŕ=VSŤł S‹zŹâŔ1 źÚĄ3ç\"¸řió!±Ëđţ>ŽĹ6ţ¶ĽD¤ĄČ˙^Đ‘ăD4é¸ăóxsX¶ ‚8ţúObM·aŢp"ĺ'Ęńq.ATQQ-Ď~© ýŔÁ0tÉďQŞm„B/B€h€äsČ7 sV€… `•pŃś!bÉęň…ˇáŚ€BČRĎyŕŐ_†/ôVţÁmřA\v§±ŐźŁ0Ł ßŐA°ţqĽ "Q‹ŘŻžDJ% %ܶŠ]ű˝{çe*Ť”ł“EĚ#AĆM†-˙S~™€śĹ°= f†NžIiîRČv#í‡áŠ›#ʏŽîGÚ[Ękë(n{™`ë‹ŘÜ•Ď ćŁM­LBE*@¦,@Š}H> ˘çuŇé6<Č©| Óâ35°÷]ôçk 'Ď…Ĺ×`AkÝ=™0?=IgHN™Cé®?‡w7vBNÇźě$¬d(Ť#ł®Ć^ý &D‘nCGńDŔÄ* Фk±xŢ]ŢCë^4ßA Ń$vÝ'ĐI3±BßÓ‰e») ń۱ SŃ…+T ÉçŢŰŰ6 oݧŘx%zâ}žc:Ľ bĄ 'Đżâ§ąQXM5óHŰ{ aËvcŁĆŕjńÍOľň$Rf¬DJ0S%LfIs`θň:Xóuâ7†Ş®v§Öâ!’Ş^dČJ-ZtęQÔ<>™BjT5¤2 Éj/ů౓-AĎĚ]@ßčÉđô¸–Řčz8ކ?ţ>äłŔ)9K¬ ҵĐuilöpëź!'ĎCůĹ—Ö˘‚y?|§ĺL UPĚ!ÇOvBĚăKyJcFˇSćÁŽW ëVŰL˝?Ö †żöĂHÓÍP̡=íHÇaäĐNlßV|űaěÄ1,× Ó®BĽŮÁžwđŻţ„ľ?MpŰ˝$ÇM'űĚ·QÂAá ˇ¤e7ÇI©"ZwAşó5äÎ/6ÝH<ß‹űń·Číi” SM¸ňně§ß)Ë Uż +ô U),ۇu X(‘Íö’Ífű‡™ťZ¨łÍ9G2™$Y•"™LÇ©šµ”Řę{`Űzlă3¨*â=˛ę“řq—a?űAM ĄúiđÁ»`Ú•Ýíđř7)ěiF+ĹŮÇľAĽş˙ó‡ “Őř±“ĆYXý LKřX’bÁ“{ńQ žĄ7_ ŻŻŹb©0€ĚmDpĺÍLîüKâ‹o!Řôc›ž%ž¨Â9!¸ů+ĐąËb‚^ýűP=Šdű~x|-ůÖ}X,庯_Ţvţµ—ȡK/yJą,Ĺž6ŠÇ»čkنg=zü}PŢ0ń6gCô†ĹĚă2ő„SŇçKŘŚkČnţ%Öщw7f>9¦-ĆŹ›DL«H˝w„Âż>H_ëAśy¬íml填ď#ţĐéŰđ_KF=K)Ąš=IXěë_Y/Ń™SĘ€6dCcFĹ\M-V7)xÜôyŘýŹA×$Sź8KŽ„S’˙ýoäGϦĐ~imĆÂ"ÜôÇč—¦jÝwé}îg-S8DÍůŮ0öšs…eâ ‚¤ÓŘĚŘÄé %TĺŹűÇĎŇóđ_á·żŚ,»3‚·ć«đ•Úđ ąď Äa˘X95JůS„Sýň0mđA!!3ý›§°úzČ•đ‰ŞŞ‰em‘˝»(>˙Ą-/F[@ďůňőµ¸ëî$µţQŠßş‡|ˇ€ŠBEÓvʢ‚?Ť€ YĚ Ä"ŠC€Ě]˙něDB¤ý ňÚ 7™¨JaµučŃTíŰ‚kŮGďŹÖbGv!.ÎJU±0ÄşXʆBT߇Ćşşńą%'–;A°ó5âÉ$1ŠÄwżEđýű)|u5ą§˙ç Ł"ĺS¬@s±aRBZîÎ C1|Ąá|%kXŐ>ă&Gší8„/źÄ8@W~ úz7­ Î8™öaq@đg_Ěl°!Ş&8CÄg"ť-‹š˘&¨9Q“¨ ‹†©¨9Ä$HX쎯Lśm:5u1S;ç}ç»>ČöŤ5tĚD nú¬iäY$ΗZá äxó‚ĐžŘé`|X–ýEĺËCü–Ň)§ĄÇćűłÇCgłů8°ő·IäÇÖ2Vţ]öó™Q”XIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/email.microsoft.com.png000066400000000000000000000202341361462701300320250ustar00rootroot00000000000000‰PNG  IHDR€€L\öśsRGB®ÎégAMA±Ź üa pHYs  ŇÝ~üAtEXtCommentCREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 °EX“tEXtSoftwarePaint.NET v3.5.100ôrˇľIDATx^íÜ‹»VÓöđýŻžăŇ…TJm]8‰RRŽ[§ă\ş#*DEBW:”R"$I!ú}Öú®=˝íw·Űčś÷ůń~źőĚg®ąćsŚńťsĚ9ß.=şč(şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐa\a~®ŃĽt1\yšZCC7u˙]ş Ⲹ<uV˙ŤqěpY\†€D?hš† "?ýôSóŇĹ%pIt,HKóą ů ĺ•ČůóçÓ8tDüĎK ‹ŕŹ5TŇŇ|nCżyŐ™`¤†Žhűó`°$ß}÷]ęçÎťS PáOaK%ĚEö‡~Pž:uJ»Ę™3g´čźvĐóűďż/Ż*\’áčÇR™Ľ…‰Ô•4”Ň'4¨DU”ٶ•‰Tţ<¸Ě& gĎžMĹĚU ë€hý$Ž‚ ™éZň5Ťô;věŔ‡:qâD­e5Ěź mÂeb ÍéÓ§Ź?.v¦đ€ÁoľůF‡ä–" ę¦9VTöďß˙đĂß~űí7ß|óôéÓď»ďľ-[¶|ńĹéIIŘúó`° *·nÝ*Rwß}÷ś9sîşn»í¶ŮłgżôŇKeĹ`B@q“WlܸńĆoĽúꫯşęŞńăÇŹ;öŻýë#(ß»woDDęŹţ4Ţ×HNřňË/xŕ!»îşë† vý Xşt©ţI)QB°ÂkŻ˝ÖŰŰ+ú'NĽé¦›FŤ5yňd|¨hyě±ÇŽ=Úπʠ?:." ń»ZL˙·ŢzkÚ´i×^{mw)ÜpĂ xňÉ'%"‚"^«¬ŇW¶Ů… Šľ‰/îT ˝účŃŁÉâ@FÚ´i“žÍŘ5˘áŹŤÁŃ\±b…\!^7nÜ8Q€ĺË—űí·TeőXa–+Ä”P5fĚ˝íPٰať¦¸•Yhô”©Ę[őř¬’îŰ·OŢ5}!SxĆŹź0aÂ$Ąy\7›ŃăÇŚąqٲ'OžŠJ·`ÔĄř©S§FOaB “&MB‰ĄđÔSOá;fü9ŕ Ľ űŔy·0Űf”ŮZOÜ ýŃG†Ź8Z±bŐ·ßžĘTh;|ř° Ŕ"ůČT82e ťŃléPľjŐ*;vmŐ/¨W*ţ¸€€â˙gź}¶hŃ"ń2[ła V{ôó ŔłrĺęÓ§Ď&h}K«şEýő× ,>|řŚ32÷MůŠĚ 4ÜdëŁu Ţhů˘! řÉgÉǫԱcLJËLĎl›ő:¨â&â…<Úĺ˘U«Ö  ¬H4•۶m3߯ąćšľT6Î:Pq 5Ä?˙ůO«$ýűˇŇňÇE˙M¸Lş“'OÚQ]¤ĚYĄzŤ*Đ"ž‰źč«č’pę”»Uż¬€čĨ$#ˇ ·é?räH{/h±Îţýď§[?4*ÚĐ|ţ˙COcn›Á=Ą©őłX·ˇů÷ˇim%@ĐS/‘r§•÷“©A ˛ŕž{N›6#ë ¨ @ –/_ŮoÎu1EŮp‡r¸2ĺŤ>účŁ'NÚ ­f ŽĘ˙oŕcAÓTă—=ŕÇúgduÓđóĎ?wű5ým’¦ż¸ă@ş0í—,YzÇł…Ű“Ą îĄÉ@'…ŃśiXÉźJµ¶ ´ýf$íh>·ˇů=gDG%xµm>÷ÜşŰn›yĂ >U)HEY/j“pksŁ$aŞĂUApËR)^3VFŹ­" š¦>%Ĺň@Kľ.Óî"ž˛LP÷U7őô×'ŞňZdŐ‹ÁpćĚÝ|J‹nJ-E[ô(I¤’©ş5 âMłҦ$|üřń•+Wšň2ľ˛Úw¸^v…­[·Íś9Ëť«ě˝“&9ĚT Şť('Ë´X ĹyŻľĆÄÖ( ýK·řD=«öů˘ź¸µ':Í{}>Ö’>tęÍ*­Ý@{”«ë/E{ͧâN~ Nť8°!Ę[µ™é©(ă zîÜą˛•ňÇŤËTĹąĺÉ'źÜłçť©S§Źí,_mŮ ęĘŔ´V€‰lJÓ^zćµŇȖž*”Ď˝‚W ":"•Ř%‘ˇ®bJŁn‹’XŘo¸tĐžţľB1ŻđzćUł‹&eß§f)T)ČgĐŞ·ęBtË-·$čŇ’´8ËżýöżÍ}o‰~NAÖÁĄ€xe G[ĄO1×'ŻÜŕÎ?ĹŤmÍKźµ* 4ĺ|đÁćÍ›ź}öYçÝGűđŘcŹ-[¶ěąçž{ýő×ß}÷ÝŻľúŞěIˇÔÓŽ-śaln;ÍqĐSŇGűÇĽ}űvú׬YóÚkŻíÚµë?˙ů%şůZŇře(K˝¤#”ür Š:WÖĹ‹ %XÉB0ýďĽóÎ#GŽXš…^ÚIôëüsÉ@gôřá‡4?ôĐCî\ţ?üđżjh&bńĽôůä“Ůłgľ gŤĐ F÷ÜsŹÓs7o~µIčéUáOB©i@˘|÷nK§˘.«*{{L7 Ě)–@¤݉{ńäčŃŁF!{ŐUW)\‹@Ü…X¸3÷ĹZĺćIS|Ň.e5đEČ”®™LĘĚË(Ńo- kq?®±9ěرĂ%iőęŐ†¦$^đ Oq "hp¤źý'OžÚ°áĹŢŢ©×_/ÇTůŁÚ„}đYRCEÔŐŁW0Tr$nJ2-č!n§bń-7÷3ýµX :Śşîe•nŞâżěśVĺ… W óśÍt˘dáÂ…ćÝÁó73Ú$OVi—ô—,YÂS˛4X”ŐćXoŹF•ÔŤÂ0:c=uęT×çQăJú¦‘«K …ďż˙ţüůóEßÂ૸gîĘB^«?”礵@0Ë`*0¤WŢ M.1Ö“˛Ž„>ą(‚í(SéG@)5ŞȦż‰©„/ľřbîÜąNę "îôdzŐh{\ąrĺM(ó:e*ľâĆÄ5›C}R„OłCý”§4„JP28łŢíĚ©ÔŢqĘMůcÇŽÉlĎ<óLNíîç\«eťh›ß.qE0yň”ŠçKşx(ÜĆË0€€ŰożÝľĎJĐ“W…Źx†€÷6ßT@3OâUĘ~cE ¸ôâ‹/–e®”:ô·ŘM´,yˇt~łË…x™+J-PkjęľŇ/jbçržżÇ—ÎJő~$O˛S@RújŕűСCu`ŞĂľ˛Ś"J|‘Q5:8ţvőüd‰©=AŔ*ŐÄáUx2lFRq Gi´Ç>›p}¬Ö3Ł"@g„€~›p;,ά/{—ŇčN>nˇ&H‰”şčłÜbĎ/‚[ÖMˇSń‰at"Ui8ŻÚ‹µ© 饆S2[iĐü vÂS# ô °ë6@ă9- ™ű˘ŹŻ9őś˙á§•ËW9¨ĺ¨`Cs€smąáúQ“'NÚą}ÇŮÓgÎ˙đăĎçşđóeV÷[W€2A`¸@ňüĎ~Úą{‡ śÔuŁťC´…Śź0öĆńc3~ÂÚçÖť>{†@dÍ©żöšěďtQ9`ń2Ýp‰N(‘vÝKIED%‚­ĐR CúôCÓőÂ…§ź~6ÖUÓ‹§rEśµ˙Íž}—«¬¸CH˝X!*=ĘŁGż¸˙ţË‘?ó5Ă„ŰŔĽyó{>;rtîśy#‡_'č.“ůŮÄYbĚ ŁçĎ»{˙‡űýź~<Á(5ąü—¨Mo~Ĺ=wî‡ÇrÄëŘ2bÖŇęŢ·oź(č,FTϸ­¨C40Ş5h:÷# v­:°×«wĽL˛bĹŞŻľúşŤ®Ż©nďŢî¸c¶pŃCśÂ¸ ’™$=۶ľ!ôWGćDßj¸iÜř5«Vź8ţµ‰/ô?~˙Ăŕţ•" L˙/ľ8vűíw €Ű†`}0ýe3lj+żH‹)ăŞÔ:~UiŞ „KÉ«ž…8kÖť;wîÖůŃ—â*ßŕôéł›7żšý6±R§MćáŽŢu×cÚô];vVq2‚‚ű>;QÍ*Î_L@%7(dIE|Ďžwb1ý! ¨Ę Ćr'Ú»wŻE¶Aő"«,¨#Óú\ڦs;5ĺŐ:@Ŕ}÷=đÉ'źęÜhi(Q~óÍ·._IžÄiËH +K—>!N=B?üÚJÉÇ"Č&v‚<´čł#ź şä#îID—%`ٲeý@šGvíÚŃ· W‰•HĽŠ’çž[çä@J(«0Ô•őë_°T yZŞäéyđÁ“ýĹ="­§±š÷––4źÚ÷eÖ._ľňĚ™ďř×ő‰5/ŞWă›Ý˙úףb•ĺkúĎň¨oÚ´Ą"`Ř5ĂĺAżyŇsJ4l~e“í·P*C'@Yt÷ŕD6“zٲfJÎ -U*,‡U«VÉ?­±&• ”Ć!bpŘÉ áăľC@#0ôůôÓŁ÷Ţ{źü)ô´‘ĄÄÜǧ”vŠ€áĂG#=âˇ{Ť‹OąÜ‘ĺ@TIůJs†3‹LźH§ÇIÜýžIFÉÄW¦’Ф *+.Ż| ŇŇN@Ƶ›oî}óÍí K«H;ŕŕÁCÎKbEĽ/P•*ľhś>ýV QĐ#I…©ŕŮń.?ë©\j(ýßQŔőPÂ5VBŻ[™"î_v`7»22ч’Ä â¨4M‡>H{?Śn\Q¨iÓfĽóλ.ÚŠT+´yöíűhćĚYTO^jł™;bŕ±GzííťjŁËJ!0uęÔüąĎ€h'@ôĐz ę+”­çwďŢ™>,o))Q®]ű|ąŐSů<.ü;{ dÁęOHŮÜżvěŘQűű» i)d^ĆÚÄÎéÖČÔHKPŢřxĆŚŰr‚ČÔQR+ÎÆŤ3g®[‚n=ZsËČx*‹/>räHěĐJ€çŠ@„KřúëŻďągaNz–XŃJš>}úÎť;ă˙€ çWˇô# °.”S§NwKçVD°>üp?Â$®Lťoş+m 8vě¸n>IÉS¦Übwţá‡&ÇµŁťë8Vh' ůçW­R8qâ„‹"·‹…ú«ëś‚¶oßž!®J׬y&†ĂÝc* `×®=ú6Ń"Ř m|°ďÖ[˙†ËhP˛?ĂŠ čé)q´4ôv; Ůo€V iĆŇ«Lp‡H@1HŮJýBOĘNđÍ7ßĚť{7·–ţž —“_}őŐtţÍG}h %^y z¶Ć§ëCít…ýűÜy籊ÍQÇD· >|Ämą'TÇ7Ě<őÔrXňŤú‹ˇ˝üGDŤdĺeÁÍîÝúÚ¸šĺžÝ;o3ÖS_ł«?ąÍťĂĄOůüÚu9őfVž:uĘ ôÇ<¦Ń~`H«®Áůő-0hA3t jó+4=j4M šž­Ę=­)¨DąöŐT>ţřđüů ň;ŠGˇÉ¤D/Ţ}÷ýjŽK´cŘ1kűöťňůĆŞŃ´ŕ‰qC$`ěhwŞ‹PA€˛ ”„”çÎť[˛diĆb}=DU±cŐ·ąqŹ>ú¨}˘~…ÄÚmNKĐtjCcěĎVŻ~ZÔ’¬ă đyZ7á‹Ő_„ňÉ)óÁ9ĺł™8űĂ„ U|IÝz2F¸˙ţťŤ"ßŘ[#-A;Q:D<)UqB€ĽÖ©ú)Ôeĺý÷ßď _jÄ64ßj¤;c7ÇŹźx≧$Şb|AĽ°ČÜrNź>[ŕŃĂă0žĹŐş ×Ú~Á˙€âIDoĽńĺF1ś!ň×ęq«? čííÝ´iÓ€ÓŞˇűĐ4ŐhúŐhš¤ç% 0GpŮDCTť={N<ëČTHš ĽĐrőŐ׺ 9ň™SP;ţüío;xđ`~ŐŞý‚J_r JDŘ§Ś‰! ›pDZŐwíÚĄ ­$( ů±""˙ĐW_}5cĆŚh‹'±Ć?úč#=ŮśźE!‘M]ĹkH*Ť|T7D^AźR–żĹ¶ęxP˙! XsÓ¦MŰł§:*á`8&ą*ć_G;7×W ©˘SŔ)äµPŤäeÉ’%N~„cG3BŤZg đüءěG@Ŕzfś={–U#GŽÔÓ‚žáŚë¸ě«WŻţěłĎšaúŚo­^Cz”#Ě@ČČź=¤Ź˛ťřU”öŹ?ţřŢ{ďuf‹%&âŻrřđáÚ„+Lž<ٱşĚ}¦ÔúD]PRP! AˇäWPlҢl%@” ‡IÄsý3ëEÜZć…­XÝT9sććÍ›ó× Ö·˘6ˇAţXÜ]6™Z“Ň,ŽÁ Čý… Sˇ˙ů矏ýNBJnp7=´[ ,Č˙r˝H˘« ™¬[·Ž[Ă^á°˙”©Ôáúé­·lĹ&ŕeDĄBÚIĂ˝fĹŠU˙ůχůgâ&’s„Č÷Mî gÎ|çňąsçNˇżąţżŢ|óMT%îJű_K©ă_ ˇ‡=‹‘"Ş`a4ÁÉÜW§-îWľăÄ|„ľŘÔŽ+•‚ôWH”Ú/^ůÔéĹ™ä‘G–Ür‹Ícě5×\Ăëä“‚~PL…ˇĆ”ě‡÷Ţ{/݉ËÖ/ÍهA˝G˛Ńťů$…8Nfô¸,$Ü1"© )ČĎ,‹{ĽňĐeŽ YĘ3$4}°ăĺ4–¸‡3zUĎ?Q*6´"n¤îłgĎ;sçŢŤ#®“X¤‘ĹAć>Ĺ w=”*#ËŁŹŤ>lŘ0ţ;_µd°2`!ď}›wux T:@á@ăéÓ§_xá[qţ Hµ¸íłN%a‘©5 )(żđ•9ĹŐÚŰ*˛RPuLŚÚ2ťć‘)€¦ÁňŹôUů/(BÄńă'ž}öą©S§ł„4„Sö¤žE'däę .¸`čyóć9ź”As5d(:%Q×h—µÜžp¦› é ‘ş)3Ňë-Z$Ěřĺź©–JË€Č/”<©ŁÇ¶ŠM˝?ţřă6zâŚţ)ą—Ä î)ud¨s’ŰNb…­AÓ÷ß˙xöě9ëŕ»ďľw¸|晵wŢy§¸PÂsÖ•MőŹ+©PžąŚ™µpá—_~9˙?Hnů»˝ ®YłFô‘DCbÄ5µxQüJĺ˛ĐM4 *âŁîކ†_ţłý†BŔáĂGp°aĂ‹–Â+ŻlölŢüŞĽôj ÷ ‰+ł¤˘źćĎ?˙śŰ[¶lŃmëÖ­7nÜ´i“ŠÜc÷ďß?¸?®QJş=©Ô˙ćů#GŽ8M:I;k P8@INܢ–„;{öěGyDpąťżďÄZĆT÷íŰÇ*¶1’o)™ÍH•ük€HAmÚĺQz"8g  DŮcnu©äó ¨˙†}“” jb}Öfőąď'ĺZqĄS‹ŻĘĽćk܆ŇYٵ‚T˙ÖŮX đhaoÝĄrĆ,FĆ»ďľűĆoŕرUĽd yćСCÖeŽüzFD=B‚ŔĽŞÄ0µŠ°_™%¤ý˛HϢ‡ZĆ]ĺ—%™oé4ęx®;<B^ă ń îYĄWő(OIłžĄ‘é¬*í R‡Ł2©ßúTâOę =^ô‰W#¦E˝ŐÚ4‚4ä5"i×’Ć´ÄŻŇ8čYă&ôi¤Şů7bí¨@óą ,ýľV×h}Môl†©Ů éŃ‚Kµ˙~Ds+š-ö7j4ćЦëĹÓó« hDŰĐ]MżK#Ýšaj¤ep4ÂżŤşKŁéׇ¦µFcî hşÖhTÔ¨NAż ŤŽ!Ł]*7/#ť šÖMSšĎWŤŢ‹Ń|«ŃnÓihhdúđ« řťh†m#&Żíh>˙J'˙{h¬iAóáW˘ţßĐE?\±Ô|îâW˘K@‡ŃMAá N¬LShŢűĐ% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@GqáÂ˙˘k™3¶L IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/email.skype.com.png000066400000000000000000000065531361462701300311630ustar00rootroot00000000000000‰PNG  IHDR22‘]ćtIMEÝ(a%C‚ IDATxśĄYkŚ]ŐuţÖÚçś{ď<îĚxŢ~€ c0ĎóJCŇ *Đ„¨iÚ¦$i¨ŞTôˇ¦RŇT‰˘ŞRZ)!© UIÔ$UI$THÚ¨‘(!…@, Ą¦`\l`llO<öĽgîÜ;÷ś˝××çÎűÚ˛µíł÷Úß^{­ý­µŽ„Ь4B ‘Óű|¦’ĎČ,@Ťq"0@Dš ?o‹šŽ ¸Řô#•éĆ«/ű±™ůí h<˝19˝§}Ű®Nm+v®\´,—Išx@}ëřd˝¶;«>9uě[oÄŹťŚN§%0ŔJ đŮĄ­őŹlťşŁÔ?[śÍÄ/lf°¸Ř:Ü+zˇnŮŘÁ8iĚL@}ÓŕÖŔb b'Ç'~ń—/O=8•ŘB\5]Ľ@1ćŔŮ",ŤĚľ@‡d\)ťÚvqijď`űű6č }qą°Đ,Ř›ÔÜ*XŚUž:1s×ÁSGgzśfFM©pEZ2"3D~gűđÇŰ>ąc``C‰ToÁťŮ2¬üîžžřđł~ŇťóD3@+µ»RÔĘA("‚ 0ł?ŢžţÁ޶––Î,ČŮ…7`©ęŽNży˙ÂHĄO]f|›NÔdˇ@̬ľ»0őŤë W÷eFĎvˇ €$ *ź=092ӡΛN~›Ť#D‚ş–}éŕ­O»>t8vfP˛ůN Ŕ§ňăă'~8ÝŞQÁĚ@€|3]@ÝŠ®  ÉLf^…3ˇç®Wř•#ŹĆ’ž Yd¤Šř´ň'ęđ˝R«Ť¦I I’ŕâ P‰ÁŐ˘Ś·€°ńó/Ôź|î’_ÉB˘ŕ;“z–ĹνtâŘőűŞU7dç3s¨ŔŚđĐX¶·éĄĺhk‹v%*ŔdjŻÍۡY?\1xuŇÄ$ÄÄJÔß*ܵ{(łŕV;@D`ĎÔ|BOśGU"°”ť%˝k{ńŁv—ŁÖDVź„3uö?©?t˘>Z EÖĄ@Şđď9\ą´řšţ‹Č–vY!±pĎKŹŢ÷Ęĺě,6Ř Đóö-…ż˝ĽmG9@c †…@!N'ćý׎ÔţîHŐr%Ż–­B3\[<ţř­ŰJĄŇ–h@e““—ĂbˇťŰş™ŮÝCĹGövě(»Ô3 „q"ů#@oČÓ`[ZÜ˝{ÚŢŰŃîÁ°Ų́➭öß˙ÚŚ“ŔUřÎcç"`Ć[“ű®,Č<#…‘"q98ç;Mś:‘7Ô˝ýúćâw®kŹšl „‡µ|}4:™N:ŃĄ»Šo'°VË+‰(Â_íjŤi`¤BÂ)¦Sű—c OŤ§Óž‘`sÉ˝§7ą}sˇ%’,Љ$őöá-Ą;¶,<|tA“U@Bbj"ţ§«_Ľ2(I‰@®·ë5śŢJ‹›ŞLôÜÝ“\ŰćžO9Uł>5őüéK!ńŔáůwő&߼®cWG”:#łŔ÷÷'W…Úl÷˝‘úíś/·–Í(€’€ÓÝťČ΢-`Ľ˛+ŠUŤ„ŔůÖpőůŃz\ŤÝ%˘±4ąF€‡ě§'Ď,9¬ Ä]ÝRčh™‚ĺq\łNö4ü—üřđ¬‡PFH#]˘GgłŹ<=ud60çůí×+÷™G$Ćő¡bđĹÇ&2„ "$# ˛Ł˝đžÎ×~8Ű­Ęő$-°âíČŁćŹ^P|čX-]pUäÇ F‰äą±ôúÇĆ··Gc vtÎCrkX9KÄű«łŐl¦Tč!¨!,IzîÜÔŤdŢLÖ«Š „#Ő `ţú83|psń±÷v˙öĹ-—]¬°ÔBjć  €q,“u{ötýč\&şx¸fťś?:Ń?2ér䑍ÎiaP°u=˙€Čţ‰¬’Y)R"¸ążpsaşŽÎ‡ç&Ň}ăéţńěHĹ[jF ’(#Î’Śg˘3Ăâ»FyT#F&6#Ť5ĘŁšŐTAH„W§Ó‡NÔ>uqŰ‚·"dÁҙ螂۳!ůý!TR;4›ý÷döó±úgŇ_ĚeP‡sŇD<}űéŮvl4P˘ES µZ+Ÿ–ÁÁçĚěęŻí)ŃsŞ ć+Ű"ą¶§pmOá3—´ŤVýoTżňňÜx5HtÖč*× }ˇVË}Nuů<IDłĹ$cµpŰOÇţţ•ąj°$ŇŘ©SĚ4'˘"Č‚ĺ} äţlgůÉ[űvm™…łGđůŽ4]ţ˛|wg9)N&S»g˙äőŹžůŇ˙N?~Ş6ľ`‘ÓŘižĺi .RdN>—vĆ?¸©gK{Ä@•¦Âsç_Öf´´e1)@2Є³ #)‰äŕDzp¬ŽH¶´F7ôn(ÜŘW*GNŤžąň "u¶—ăĎď*fßT×[™„A4‰â°„`Ô×5‚¸ŐB+Ĺšk ˘# D±˙ý™ěűŻWÚ‹îŞ ńű‹·ô÷t%ĄXC`~kN$?´ąôĄ¶h¬dý ERčíň`?ŔHD„„ȶÖr$ôkŁÜUËÍ[«7řzXBťKĂ#ţ‰“5—čÎrôďěřضV("ŃWtWtĆŹÍeŞÖl!-×Y(’×zÜąŇ(‚±ő/ž€0ű“Ë:ö`ŕé_í˙Ä%íô¦ É`̉Rcq‰ňŕDú;OŤ=9şó4‘M%…QÖ 'TC:ßúč°Wx χ#[»v—Đ/"]^¦Bz»q xď5]Wvööľ˝·çÓ;Ú- ‘.Ď42ĐHaĆ˙8Yd‰Có·{Ťäe÷đôÄT:îD Śăö÷nđĐZ‡®\¨oě-“ZROoüÚU]WőýBeŻh$ÁË:ăĄó©@ŔÉ44Üm}$`„ł#cť/śŞ‹@Đ Ń­˝Ý]ĄŞ•Őnśçs™©Ŕ‰D*$Űc}poďPWś-. -Đׇ.jűŤ­­FËINEŞ™śNŃ4Üʡ´ä@í ¸h[1pgצôćeµŞ ÂÉžŞÍgAUŚt"޸Ł3~üýw_ZlQA‹•Ł/_łáÁz‹* dѰöŤŐ_ťNĹISuIŢ„hd˘đËe7’Qˇí“[’GF*iÚ.+‚[#ÔÉá‰ú7^™ýÂî uŞÜŇ=đîľŃŞu6KŤ-‘ěěH: ŽFcÎ)TA0ţőKS t*ˇ5"/2xr1–i˘7őmşsăđ÷†ĹE +/’áË&KîSC4ËŚ*đF‚%7вü2çü 0'ůěsăOŽT5Ö¦olŮb–ÉGDH&ĄňźoëîoťŢ)–ó3’2łO?}ú ĎŹMg–D.ršgNőŔ…Ěj™-d–†<ŕDä4‰t´~ďéÓ_}qJ#1;{¶—ď lmU¬)»‘¤hTŻÜčŘľěÔb®&ČFh‘ŮŽîÂ'¶·ß±Ąő’râÜš¬Cŕ‘Ůô‘ăó™9>ťI˘çl…‡ďŢ>~á;ÖÖNIB\:;ú§ýăŃ ťzĂZvUó†Ŕ–wYGrYg˛­-î-şHŕ‰±…p´’˝<ťţßLV©y8Q§çNÖL:Zk?»ąűť}MJşF*dâĚ™»TţíťÚzd"ŔŚl8ëúĎNTeýÇ¦Í C¦ż¶­úŻ×oŚK=M ŕ ĐÝ×s˙FVţ}TTMdmÚI 'iśvU#ąĐů媢H~wST,tůeN\}V :Đß˙ŔĄ»/Cd®ń¬bM!ÖužĂş×u¨ŔĽż­ţ¶Á NČ&—¸¤Š9?5ńÍĂSsLÎÔ1ŐfőŞ_˘9Ađěow?şĆ®Ů:äóŇÝYaˇˇ@PťyćÄÄ˝ĂŮŹĆ%͡ °Čśż,¦Ŕ¶büŔîÂo^Ň’DH9,äľ©Îůtfzňń“łß=ţkJćRůźČş‚qnR*çŇ« @ZŢ÷ŐË˘Ź uŁĄ=Ç„ójk™hVźžžúźÓ•źŚů}Sv¨Şă))Ëţ&' ÂÜ)Wí–g¸*·lŕ‡â›.ęg±MhKÇ{S°V€SŃ…ÚüdĄúĆTĺőިÚŘĚ\=k$-ImęjŹa?ĂĎgu¶n+ąhĹX®,ó·őÎ Űú{{C”( +Tţ`a)5‘ĽĐ e€ĎčSš-e-""ęLÍU^«ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹF“IDATxÚÜ][ŚĄYUţľµ˙ŞľNĎĄŃĐŃĆ@F” ABĽ j4řdFŢÔßŐřę%ľaHLxĐ'4ŠŃŁ1áÁxA"( Ě ÓséTwŐ9{/öÚ{Ż˝˙˙Ô0ăśš¦OŇPSçÔţ_ÖúÖ÷­µ6űŕŻő~ćńßĆŃ*B¸‹¤ëýI‹Î×ď÷Fd}‹$tś ÷q&Gç5LžŘ ł‚¤©6»qö×´ŰQ€‘|Ď7ořŮ>ţŃĆŁoüN{<µĎÚ$0s™Đ|{„Bg÷ꦧţ¬T»şë“„¸ {{ű¸~ýçÎî–ç›&klx‘lĐa5,ÝýŔs¸–Ř)»˘}&ßjżúIÚŁŽ«Lě}±q$ŔdFP{{7đďx~őńăío~ĂÂŕpżó…±<řĂrśŽáďH»çü¬_űúsXŻ"ćé"×ÓâĺCÔVHŃ~¶•*mSJ†aBĘ‹»ÝŽyĎ۫ߩf•ŻÎ¨ł_ůú%„ y ív&şî&٬vćA/OÎěŤ3±›ĄB(Í_)ň4‘ŐçAEÝaZ&Ť¬źÄÔĹ8€ë¨ë„?üť_»ßůf$Ť`Ý•úŞ­ţf¦€#ž}~SČOTÖń÷đe°1 é·~łÍĹU˙©Ŕ@ý `ŰŮf› َm“/ŔL\DD(µ-€ü]ФЛ×oŕ·~ýçđîwľ9ßo‡F^ĹÁŻ›Opůęž|ú2vv&7&ŔTᣟ®ÁĚ´AŻŔ¬ź ˙áđíŻ4HKÍQ gzŚc‹˛…´M­ŕęŢu|ěCďĆGâ=nksĽ/±{Ř»~ G·0…µťť ’=”m0˛]çŔÔyzżk2ε!JA¦ůl‡ĘLR]c`´Čȡ„ Ş ZHlX˛öžˇ(?ĐĂgÔ!0oćÝdů÷Wřȇ~çΞ2 €;ňU€Í3Ďîaw'ŰJŞÄäW¶Çíu¶(Ĺ,á`^8˙fcG|ô,@á‚D,I€sŔÍ>ÂĹ' @TŕÂąÓřŃ÷~og.‰;snÝľŤg.]Áî޵הĚT™¬¶ĽáoĚ‘ÍHĚŤä‹)@:Ž L˝˘ă'RĘ7Ą2óD…ŁQ[% Ä­#ĽëíoŔkĽ éîĚ×µk¸Ľ·Ź`€Üc’n@z›«Łą¨.Žëčľ D‰+R žH ZĂî$sDęř"íľtЏZáťo}}ÇÝÉŻg_ŘÇÁ­Ű8{ćtćRmĐ„Ŕ”ru\X~§ć,˝9 ÚRJf.B ~ţż¦€3YKŃ”P°Ň„‹÷žÁ=çÎś@ř¤ ëńo˙ůżřÜçźŔS—žÇţţ­Ą5îąç,^sńî;wŻ{č~Ľţ‘‡pĎąsxÍĹ{+BüÚSĎ L»mĹągË0”či'"xöł pJi°˝|‘ŐĚŤ!YĄĽ‘‘.…±ÎżÄqńâL;ÓVůXĽó÷źý>ůéĎŕ‹_~:«4ź†Őh˙˛uś„SŔůs§ńßv}ăĂx뛾 O?{»»F<'…gL&šúA"ŰýM*Ö‹[ßúw:@VŰ5=ójnž M©!)3YµJĐśÚŮŮ®ĺ·ďűÔźţ-ţŕSŤÓ§&ÜwßyhR$ orje ó}'$á‹O|˙ńĄŻăĎ>óYś=°»;Uë".$› C`%2Óq pŃLŤ’PűB5n ŐĽŞ¬]  ‹„ŃóVŰâ/ţć_đűźüKŻ*ëîéLPď ‹˝OÇ8ć^ ÷0´p.ś©‹•_h%çňÍĹŃJĐ^†ZD -N·ńGňw¸çÂY&ŞŮł¶ĹGŹC}0›§ˇńW¬Ô}ó«T5AĆ /3DSüCęĹú*FI?QtC•"YŃëäk‰‚‘˝!›&iů…ąÝ2î˙×ĎO=s÷Ý{¦Eí–‰A‘şčňŞÎP=!!k~´ŔwÓ&L$" ŮT_;u:ěŇ)\ äĹäŐŃKŇÖo©(#iÁWâ ŤępO.ę>‰ëŇs{ KT®n1ÁĹ0ÚRq´=G—ÔâŞ÷‡&vd™w€lÄîUŕ°/#§Ěą”=9S FVČÜŤ6*­…EętĽĐ¦D úĚÁ¶éţo|ărN<`QFŃŠÎ?ť;3–5`ÎG×]PTFR1-1wŐF[-Ĺ<•ďĚ›éďOYÉe*Bk´fN±‹cÎďIpi,>ťe¸áŽt“`ÜżłŁÎÔeÂN'EBŘú­Dv€ Ő5{®Ľpµ9jĘ,ËćgÎYX ULPŕK&ěű ņüOő+ ač3&ěó~¬ap2\OCMä÷QpłÁAĺvcŐĘvµÁäŰdŇ‘C~ë0C:'RŞJ«P€Ç4WbŮ2'Ҩę2R2šŮ/UEf-ËčŔ*ĐQH©—C»Ě TE-Bv[ť€Ău´XȉGh©ŞËµŃŔ ŞsŁkf«í„’$r|Đ5łíŇ!ĄÍ®“ëęiću^{ ¸dÖ}gŤBkŇmɤ(j*…[ökł˙DlÉż‡îţćś—Îy,U@MR»jÂD†ůŠň©|.KnD™:ć–¤.”\*ĘśSjYw-śo&O;?¤'Äţ“ÁN ¨ü? ăköC: D[` GÍ O`Š Š%fÍŕ^łKü‹úI˛ş˛ö„Öń¬c“󟥳—ܬ@ż˘ŻX"“=ŃpY!&©@`v°š1ť$Ű)}âą Ç‘J ÷ą‹Ű†X .z¬čKĎÇAÚ¬ź)j6‰mGba mŃC)PÄl• ŞLŇÜl»Ń\gć»&ŚFdq…ŤĘÖŇJôZ®ç–ĆAžß }I8TŁv©Ů•PS÷žÇ§‹¨©I: ;\G6”"nµ/ŻR8ҡć{\íM×KŇ+ëIxfŐˇ.’ő[}ĺ*WvU'ÁňI I-XTMćPk*FňjäµT5ű€>ű3˛l4?Ż{‹đbU&>ů«řBˇ cęo§ř}'!@¶=ćř}"q 3ÝÓ[%Đ Ěď%fß@$Ű)™ŻVUKŐÉčÄ.ňťŰăL7¤™m>n ›ŽYîP)[ÚĘő#h:˛HĎBř0ž×oáćáŃv#áĂ#\»~i˝FŞÉdEő˛"=·óËă§Tx ă$DW8{ć$Ą˘¸'Ú”Á®VsGéÍ}A[]Ó•ëđá:Ćú) Óę}ß3§wt3nĘ[;aµJxăĂl-N|ŕ˝oÁ#Ź<Äţµ[!´q0š‡"®DiaĄ§.üFeůf;¤¨<…ß9.ú`¨řH®zů°Â•k7łů‘\żŕk‰'YČ2c*»ĚóÁ~/•QdTĐ„›>+bŕFhTCLwőÄp´Ną˛bńŔ0!Ĺő\«ĎPéŇ9k—9‡Eěß—˝rŹ~,Ń~×ě€5 bjˇVŞż ©T+ć2Y°ú˝ĐŢłśX6~ßR:ˇ fîÎ×Ő˝ëX­"NťŮÍés5[BA 8…Ťy‹ţC_±ľHŚ6Ţg;뀂'_*bwçĄTĽ_>őĘ ţH5ľĽ Ź)âęµ›ąCX3ŐúD0ELëu„„€ ľD©I‘ĄŤAKĎ{ý°őë\x_¬ĐRĺ}ž„€/~ő2žżr1ö"ËRąjŠňţ7á7˙–†źřôź˙;ţęţ ÷žßĹjťťi\âhĄQˇë#$0sk)ąBĽTňŇ­‚HpćĚi)*„Ѝ˝ďĚééŞX­ëő 8\Ő*¸ugg!䦨!É?ű]ÖŹMu4¬H«5H)!âěąssC° \»ÝÓ§¶ę&¬ 1áh ¬×VŔěě»$TO[ČD«űŤ}ŐŚ%«ó%"„Şu˘Č‚L+Ćf‡ SR$MqŐATR!$$‚ä,˛ü3ëäPheů¬i$!řt= „Pů$ož|mr?™V™żĺŕíöJq¸RśŃl>Ĺ*_KżŁÖJÓ3ľ]Rš@ăĐ:?sé2`×s[“Ą˘dŤÔ 4aŤdć}!iň‚M€eÝ•ÝŐš/Y®‘ÁÔÖ )ĺšC60«ܸyG··›–2IĘ‹JZ€Z˛T×nѸ@Ô˛#’&ăýQ+l4EhM˙If’˘•(g¤ć_ú ®ŢqjMe×ÔŠg«fĚÔ.YŠj÷bÍŻYkÁjźĐ±%osÚ$Ü:ÂzµÝ '×®ažj©łqYÔ°šsöęi•7ľNxhYĘl|‹ 'ZňŞ®[K˘Ëĺ/Ą<^¬aČ@×$¶|OÖQYM·l‚rŁ©L¤kť0Uˇ*ÖB1ëân‹„#Ý´±ËZ`{Ę˝®-čťZŰřó‹tĹťĆ!—˙ˇŐĹąRµGÖĺ}ć‰É}•uQsľĘĄś@Ь>–©IX…–3•×çríÚ’ąţ]BíßË<6šÔjë çžËMdÔ™"ÖZ·*󩝣j;Gu±ĚYű^á tČR×ÇbYuj Ml"€T}DKĄWkÁÖ~ßęÍš Sšç ş,÷Ýý˛oQVMŤTóŃ ńˇ·ĄĄ#·ľL]‹ăŞ‚::űŮ@ ĽŇ6(¸VÎ śÔ µř&łëądU­Ď]+_­¨Q”âLđ"I5—šmĆĹŕˇ:ČĺMŃ"7T‚¨ŇaťÁ”u›'7U-NűąôŞW—ŤHÄhHäĘH¦yŽé–^ÂäZD—î|_‚cÚî™R¬¤–Q˘á¶Î†ĄÎ±.Ő7ącJĽ†Đfżď[ş‹ĹşźŰ! ®łJÂçYŽ˙@M“Q+O  úŚîmˇ`ĐĐ$]ELEF"­-ĽúúíD¨‚đRmÓc“—SµńCJ—X%"µz|ń*¬.8 zëĐ%Ăđc”[vĐ•ťÓmYT=FY{ĺQPőuË”Ö4ąÂ´/ĘKqÎ ł”ҵSĽUŚz¨=u58†ł‹ Š?@Ł(rg©ŮDöIó Kו­ć"Žőh«¨÷>&»)nŰw˙_ęą4iŐËŐőÝÉírŞeJ©)_$&ćńµ˙–ŕę€^ :“2` ¶B;˘#·±T‡˘tFÎměąË…'Gca!î䌭CŃŇń}8ÓHXˇyą\Y:ćXS>H":ź Ýą<ťČ ‡"ęőt 2űI¨†ˇ^k¨zěÎđuA¨×!¨S@¨–Í— ‰-}~Ű&”M«˝0k|Çš-NĚÔ b,™pľŐA=Őĺ“B€i.N†$WŠĘőTřćţ›*[Ż®~du5VdÚäű8B‡†G'¤âkNX5…¶-4¶CŤ¤l“”ău»Ł0ÁŞ’ů!X×D¨]Čšo•NµĎPéS†nµbAńmhčĎÜr šJ˙źR´V;Ź(\:·kâAŮzł óA ÁĐŠˇ°BĹ0´Ž`­_P)ânB’%ĄŐ`4´ŇV[ŕ“Â÷ÖÎľ±Ř=í±~“é­ µ«á*‡˛q`^ýĘq•‰ľĂJ—sŞĆˇl{HÓĂ©ÍVˇFíF«Oătçă ţO»~bÎZ[™jJYT±fśŚ[)µˇź; ‘N„Iš*ÓŞČöTĽ)óćË7Š*U”•uug l»uĄËÖTeżúŮźş§®•Cł÷l1LJí~k‡Čܸ)ƩӮfUí. ‹\8 Cz ă g9&(]!GFI]mÁ‚©GŁřP’ŁhЏ`‹3PCqîěz߀zĖʎJ-€“X 0Őţ.I7Ó×Z´4'r±„µ_˝. ZÚAl´¬„ĐmY8P‰Ľ=ÇÔ™»­ŽÓ=„ÉT°ÖĄ.Ym1R*ůNC´<(7Cy—ëšXš 5Ŕš˛#®}p§×Jß7h)¸ň§ńuPt @–Ć´n_ď—x2@¨”bI&˘ęŰŤŮŔXő{ęűA€„L)¦NQ+«>ĄXŹţšş„Ü’.č !‡ÖĆXH1émÜBţ§ČKŽ^»Vh~bO„Ś+g$4üSA‚ú2lµ).ůŚŠb;‹ˇöŮÖę˝ÖˇA?¶dÚ˛U’& TµmŻÚѰýw7ř. ©Ű°;šd8»rmá=ä–Éf Ń}ń Cb‡tÚ^NMA,'!I˛ÓCĄ$jvti AwĚ`Yí’ć*™:›Źăě˝j×Ěh©Ě Ł&7D—~ő‹„ŤÉ+o†•+ŔRĘëŠi‰¶Ą{pëďš˙†9ű!|ꏦ/§ś–Ň)P®/ôLpżdű=™UČ8]0'Ő^:úbTž–˙¤ĎŠ©-jüY7Ăi• Í"ą§kdeÉ R›Ľgl’ –DTŹŠµŐ>âí Sťł™ť 1TQrÔ“‡UŽĹł 2DzśypB§Ćx“Цa'—´šiwŇk@GĄëŔ×3„rŚUËÇ•XPČ Ő›?®ć*ôĚ»Łx9˛¤›˛ŕtélű“2?>ÉŔ‰F%M>Ň’Đfd˛#Šď&ÎźN>ůA[B·˝ożĺýÁ!Ő·Ć˙ćŹ_l%aë(h ´ĘÔ%+Ŕ¸2Y\uλ»RN?™ť‰Včhl€z\®?ťM–F°ŰąYlé®EGNůcQ´NP÷ Ú~J=/să$Ŕ(ę¶; cí3)ÝQ‡¨ÚâťĆ`é8G'ĺ 1ť“hťLą4ql­ j´č*i*«ęÓAJDIwąő0 2XŔ!]ĘÉ´­)U1ß&ŘřČ^]]űĎ8oŇÖµ»C+ô+˛t7&˝V0 Ľ‚;–„ţlWﬥŁcŘZŐ ®áK¶?hí RtmÚ5¬‚;öŠUŔŃvf=i©aR&wš¦PmWĆׂ»–ŤŤmSwĽĄÂĐÍ2i©9+rsq8 –:4-Ŷű¦Éůřvö@Vä¦xďn˙0vwÓÎŤĂŞŐ’f@¤DËůń]‘R‹šsSŰ*‚´^!¦”Kĺ@LďxŰwWÜZ‘ŤWˇ\eĚŘłd>s¨jń+5×%eŮYÄď ŰáNĺ,…Ą—ďâęţ<říç¶:?t/ľď­;¸pţ´!ťuȨ¬ôŇ=–C5SücŚ «Ő×®ŕŇs{ , •č*iHŇ+_’ÚIFl©‹Ł¤H~Ła÷zĆđČY5L9%CÝßĎěľn[Ρ —Ü™-'Š)Őő:r ‹Ż­ą¸z>2ˇv€ßŮ9…óçOăÁ‡€ä~=¬ŔŁś°]V ˝«é„ń:»ŽU€Ë"ĆóĽÔť-?8zEťđm 2­Eťdj4+j,‹¦ĺbőţۡŔŠr€C6Y«U4.č»Ö–cc“şĽG—Tőa Źë˝ %Ťď'§(ŤgV*N¶ÍŤÎ~Övšx9ĺc">ýľ÷^«K˘b—oEN5CÁŻJ)]^›éčQRďFNéE»čňĹŹAŃÖ}ĺ$ZŘ÷f´IŞăyčĘOĄúąÔµ»®ÔNĎL“—I®Kљ۠žóy‘U®˘áMÉn©éµ“Z·NDŚr«źŚčŮ]'ÎÓŚ}nÓži˙˙á-~>ťPIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/facebookmail.com.png000066400000000000000000000235501361462701300313520ustar00rootroot00000000000000‰PNG  IHDR``âw8 pHYs  šś OiCCPPhotoshop ICC profilexÚťSgTSé=÷ŢôBK€”KoR RB‹€‘&*! J!ˇŮQÁEEČ ŽŽ€ŚQ, Š Řä!˘ŽŁŠĘűá{ŁkÖĽ÷ćÍţµ×>ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹF“IDATxÚÜ][ŚĄYUţľµ˙ŞľNĎĄŃĐŃĆ@F” ABĽ j4řdFŢÔßŐřę%ľaHLxĐ'4ŠŃŁ1áÁxA"( Ě ÓséTwŐ9{/öÚ{Ż˝˙˙Ô0ăśš¦OŇPSçÔţ_ÖúÖ÷­µ6űŕŻő~ćńßĆŃ*B¸‹¤ëýI‹Î×ď÷Fd}‹$tś ÷q&Gç5LžŘ ł‚¤©6»qö×´ŰQ€‘|Ď7ořŮ>ţŃĆŁoüN{<µĎÚ$0s™Đ|{„Bg÷ꦧţ¬T»şë“„¸ {{ű¸~ýçÎî–ç›&klx‘lĐa5,ÝýŔs¸–Ř)»˘}&ßjżúIÚŁŽ«Lě}±q$ŔdFP{{7đďx~őńăío~ĂÂŕpżó…±<řĂrśŽáďH»çü¬_űúsXŻ"ćé"×ÓâĺCÔVHŃ~¶•*mSJ†aBĘ‹»ÝŽyĎ۫ߩf•ŻÎ¨ł_ůú%„ y ív&şî&٬vćA/OÎěŤ3±›ĄB(Í_)ň4‘ŐçAEÝaZ&Ť¬źÄÔĹ8€ë¨ë„?üť_»ßůf$Ť`Ý•úŞ­ţf¦€#ž}~SČOTÖń÷đe°1 é·~łÍĹU˙©Ŕ@ý `ŰŮf› َm“/ŔL\DD(µ-€ü]ФЛ×oŕ·~ýçđîwľ9ßo‡F^ĹÁŻ›Opůęž|ú2vv&7&ŔTᣟ®ÁĚ´AŻŔ¬ź ˙áđíŻ4HKÍQ gzŚc‹˛…´M­ŕęŢu|ěCďĆGâ=nksĽ/±{Ř»~ G·0…µťť ’=”m0˛]çŔÔyzżk2ε!JA¦ůl‡ĘLR]c`´Čȡ„ Ş ZHlX˛öžˇ(?ĐĂgÔ!0oćÝdů÷Wřȇ~çΞ2 €;ňU€Í3Ďîaw'ŰJŞÄäW¶Çíu¶(Ĺ,á`^8˙fcG|ô,@á‚D,I€sŔÍ>ÂĹ' @TŕÂąÓřŃ÷~og.‰;snÝľŤg.]Áî޵הĚT™¬¶ĽáoĚ‘ÍHĚŤä‹)@:Ž L˝˘ă'RĘ7Ą2óD…ŁQ[% Ä­#ĽëíoŔkĽ éîĚ×µk¸Ľ·Ź`€Üc’n@z›«Łą¨.Žëčľ D‰+R žH ZĂî$sDęř"íľtЏZáťo}}ÇÝÉŻg_ŘÇÁ­Ű8{ćtćRmĐ„Ŕ”ru\X~§ć,˝9 ÚRJf.B ~ţż¦€3YKŃ”P°Ň„‹÷žÁ=çÎś@ř¤ ëńo˙ůżřÜçźŔS—žÇţţ­Ą5îąç,^sńî;wŻ{č~Ľţ‘‡pĎąsxÍĹ{+BüÚSĎ L»mĹągË0”či'"xöł pJi°˝|‘ŐĚŤ!YĄĽ‘‘.…±ÎżÄqńâL;ÓVůXĽó÷źý>ůéĎŕ‹_~:«4ź†Őh˙˛uś„SŔůs§ńßv}ăĂx뛾 O?{»»F<'…gL&šúA"ŰýM*Ö‹[ßúw:@VŰ5=ójnž M©!)3YµJĐśÚŮŮ®ĺ·ďűÔźţ-ţŕSŤÓ§&ÜwßyhR$ orje ó}'$á‹O|˙ńĄŻăĎ>óYś=°»;Uë".$› C`%2Óq pŃLŤ’PűB5n ŐĽŞ¬]  ‹„ŃóVŰâ/ţć_đűźüKŻ*ëîéLPď ‹˝OÇ8ć^ ÷0´p.ś©‹•_h%çňÍĹŃJĐ^†ZD -N·ńGňw¸çÂY&ŞŮł¶ĹGŹC}0›§ˇńW¬Ô}ó«T5AĆ /3DSüCęĹú*FI?QtC•"YŃëäk‰‚‘˝!›&iů…ąÝ2î˙×ĎO=s÷Ý{¦Eí–‰A‘şčňŞÎP=!!k~´ŔwÓ&L$" ŮT_;u:ěŇ)\ äĹäŐŃKŇÖo©(#iÁWâ ŤępO.ę>‰ëŇs{ KT®n1ÁĹ0ÚRq´=G—ÔâŞ÷‡&vd™w€lÄîUŕ°/#§Ěą”=9S FVČÜŤ6*­…EętĽĐ¦D úĚÁ¶éţo|ărN<`QFŃŠÎ?ť;3–5`ÎG×]PTFR1-1wŐF[-Ĺ<•ďĚ›éďOYÉe*Bk´fN±‹cÎďIpi,>ťe¸áŽt“`ÜżłŁÎÔeÂN'EBŘú­Dv€ Ő5{®Ľpµ9jĘ,ËćgÎYX ULPŕK&ěű ņüOő+ ač3&ěó~¬ap2\OCMä÷QpłÁAĺvcŐĘvµÁäŰdŇ‘C~ë0C:'RŞJ«P€Ç4WbŮ2'Ҩę2R2šŮ/UEf-ËčŔ*ĐQH©—C»Ě TE-Bv[ť€Ău´XȉGh©ŞËµŃŔ ŞsŁkf«í„’$r|Đ5łíŇ!ĄÍ®“ëęiću^{ ¸dÖ}gŤBkŇmɤ(j*…[ökł˙DlÉż‡îţćś—Îy,U@MR»jÂD†ůŠň©|.KnD™:ć–¤.”\*ĘśSjYw-śo&O;?¤'Äţ“ÁN ¨ü? ăköC: D[` GÍ O`Š Š%fÍŕ^łKü‹úI˛ş˛ö„Öń¬c“󟥳—ܬ@ż˘ŻX"“=ŃpY!&©@`v°š1ť$Ű)}âą Ç‘J ÷ą‹Ű†X .z¬čKĎÇAÚ¬ź)j6‰mGba mŃC)PÄl• ŞLŇÜl»Ń\gć»&ŚFdq…ŤĘÖŇJôZ®ç–ĆAžß }I8TŁv©Ů•PS÷žÇ§‹¨©I: ;\G6”"nµ/ŻR8ҡć{\íM×KŇ+ëIxfŐˇ.’ő[}ĺ*WvU'ÁňI I-XTMćPk*FňjäµT5ű€>ű3˛l4?Ż{‹đbU&>ů«řBˇ cęo§ř}'!@¶=ćř}"q 3ÝÓ[%Đ Ěď%fß@$Ű)™ŻVUKŐÉčÄ.ňťŰăL7¤™m>n ›ŽYîP)[ÚĘő#h:˛HĎBř0ž×oáćáŃv#áĂ#\»~i˝FŞÉdEő˛"=·óËă§Tx ă$DW8{ć$Ą˘¸'Ú”Á®VsGéÍ}A[]Ó•ëđá:Ćú) Óę}ß3§wt3nĘ[;aµJxăĂl-N|ŕ˝oÁ#Ź<Äţµ[!´q0š‡"®DiaĄ§.üFeůf;¤¨<…ß9.ú`¨řH®zů°Â•k7łů‘\żŕk‰'YČ2c*»ĚóÁ~/•QdTĐ„›>+bŕFhTCLwőÄp´Ną˛bńŔ0!Ĺő\«ĎPéŇ9k—9‡Eěß—˝rŹ~,Ń~×ě€5 bjˇVŞż ©T+ć2Y°ú˝ĐŢłśX6~ßR:ˇ fîÎ×Ő˝ëX­"NťŮÍés5[BA 8…Ťy‹ţC_±ľHŚ6Ţg;뀂'_*bwçĄTĽ_>őĘ ţH5ľĽ Ź)âęµ›ąCX3ŐúD0ELëu„„€ ľD©I‘ĄŤAKĎ{ý°őë\x_¬ĐRĺ}ž„€/~ő2žżr1ö"ËRąjŠňţ7á7˙–†źřôź˙;ţęţ ÷žßĹjťťi\âhĄQˇë#$0sk)ąBĽTňŇ­‚HpćĚi)*„Ѝ˝ďĚééŞX­ëő 8\Ő*¸ugg!䦨!É?ű]ÖŹMu4¬H«5H)!âěąssC° \»ÝÓ§¶ę&¬ 1áh ¬×VŔěě»$TO[ČD«űŤ}ŐŚ%«ó%"„Şu˘Č‚L+Ćf‡ SR$MqŐATR!$$‚ä,˛ü3ëäPheů¬i$!řt= „Pů$ož|mr?™V™żĺŕíöJq¸RśŃl>Ĺ*_KżŁÖJÓ3ľ]Rš@ăĐ:?sé2`×s[“Ą˘dŤÔ 4aŤdć}!iň‚M€eÝ•ÝŐš/Y®‘ÁÔÖ )ĺšC60«ܸyG··›–2IĘ‹JZ€Z˛T×nѸ@Ô˛#’&ăýQ+l4EhM˙If’˘•(g¤ć_ú ®ŢqjMe×ÔŠg«fĚÔ.YŠj÷bÍŻYkÁjźĐ±%osÚ$Ü:ÂzµÝ '×®ažj©łqYÔ°šsöęi•7ľNxhYĘl|‹ 'ZňŞ®[K˘Ëĺ/Ą<^¬aČ@×$¶|OÖQYM·l‚rŁ©L¤kť0Uˇ*ÖB1ëân‹„#Ý´±ËZ`{Ę˝®-čťZŰřó‹tĹťĆ!—˙ˇŐĹąRµGÖĺ}ć‰É}•uQsľĘĄś@Ь>–©IX…–3•×çríÚ’ąţ]BíßË<6šÔjë çžËMdÔ™"ÖZ·*󩝣j;Gu±ĚYű^á tČR×ÇbYuj Ml"€T}DKĄWkÁÖ~ßęÍš Sšç ş,÷Ýý˛oQVMŤTóŃ ńˇ·ĄĄ#·ľL]‹ăŞ‚::űŮ@ ĽŇ6(¸VÎ śÔ µř&łëądU­Ď]+_­¨Q”âLđ"I5—šmĆĹŕˇ:ČĺMŃ"7T‚¨ŇaťÁ”u›'7U-NűąôŞW—ŤHÄhHäĘH¦yŽé–^ÂäZD—î|_‚cÚî™R¬¤–Q˘á¶Î†ĄÎ±.Ő7ącJĽ†Đfżď[ş‹ĹşźŰ! ®łJÂçYŽ˙@M“Q+O  úŚîmˇ`ĐĐ$]ELEF"­-ĽúúíD¨‚đRmÓc“—SµńCJ—X%"µz|ń*¬.8 zëĐ%Ăđc”[vĐ•ťÓmYT=FY{ĺQPőuË”Ö4ąÂ´/ĘKqÎ ł”ҵSĽUŚz¨=u58†ł‹ Š?@Ł(rg©ŮDöIó Kו­ć"Žőh«¨÷>&»)nŰw˙_ęą4iŐËŐőÝÉírŞeJ©)_$&ćńµ˙–ŕę€^ :“2` ¶B;˘#·±T‡˘tFÎměąË…'Gca!î䌭CŃŇń}8ÓHXˇyą\Y:ćXS>H":ź Ýą<ťČ ‡"ęőt 2űI¨†ˇ^k¨zěÎđuA¨×!¨S@¨–Í— ‰-}~Ű&”M«˝0k|Çš-NĚÔ b,™pľŐA=Őĺ“B€i.N†$WŠĘőTřćţ›*[Ż®~du5VdÚäű8B‡†G'¤âkNX5…¶-4¶CŤ¤l“”ău»Ł0ÁŞ’ů!X×D¨]Čšo•NµĎPéS†nµbAńmhčĎÜr šJ˙źR´V;Ź(\:·kâAŮzł óA ÁĐŠˇ°BĹ0´Ž`­_P)ânB’%ĄŐ`4´ŇV[ŕ“Â÷ÖÎľ±Ř=í±~“é­ µ«á*‡˛q`^ýĘq•‰ľĂJ—sŞĆˇl{HÓĂ©ÍVˇFíF«Oătçă ţO»~bÎZ[™jJYT±fśŚ[)µˇź; ‘N„Iš*ÓŞČöTĽ)óćË7Š*U”•uug l»uĄËÖTeżúŮźş§®•Cł÷l1LJí~k‡Čܸ)ƩӮfUí. ‹\8 Cz ă g9&(]!GFI]mÁ‚©GŁřP’ŁhЏ`‹3PCqîěz߀zĖʎJ-€“X 0Őţ.I7Ó×Z´4'r±„µ_˝. ZÚAl´¬„ĐmY8P‰Ľ=ÇÔ™»­ŽÓ=„ÉT°ÖĄ.Ym1R*ůNC´<(7Cy—ëšXš 5Ŕš˛#®}p§×Jß7h)¸ň§ńuPt @–Ć´n_ď—x2@¨”bI&˘ęŰŤŮŔXő{ęűA€„L)¦NQ+«>ĄXŹţšş„Ü’.č !‡ÖĆXH1émÜBţ§ČKŽ^»Vh~bO„Ś+g$4üSA‚ú2lµ).ůŚŠb;‹ˇöŮÖę˝ÖˇA?¶dÚ˛U’& TµmŻÚѰýw7ř. ©Ű°;šd8»rmá=ä–Éf Ń}ń Cb‡tÚ^NMA,'!I˛ÓCĄ$jvti AwĚ`Yí’ć*™:›Źăě˝j×Ěh©Ě Ł&7D—~ő‹„ŤÉ+o†•+ŔRĘëŠi‰¶Ą{pëďš˙†9ű!|ꏦ/§ś–Ň)P®/ôLpżdű=™UČ8]0'Ő^:úbTž–˙¤ĎŠ©-jüY7Ăi• Í"ą§kdeÉ R›Ľgl’ –DTŹŠµŐ>âí Sťł™ť 1TQrÔ“‡UŽĹł 2DzśypB§Ćx“Цa'—´šiwŇk@GĄëŔ×3„rŚUËÇ•XPČ Ő›?®ć*ôĚ»Łx9˛¤›˛ŕtélű“2?>ÉŔ‰F%M>Ň’Đfd˛#Šď&ÎźN>ůA[B·˝ożĺýÁ!Ő·Ć˙ćŹ_l%aë(h ´ĘÔ%+Ŕ¸2Y\uλ»RN?™ť‰Včhl€z\®?ťM–F°ŰąYlé®EGNůcQ´NP÷ Ú~J=/să$Ŕ(ę¶; cí3)ÝQ‡¨ÚâťĆ`é8G'ĺ 1ť“hťLą4ql­ j´č*i*«ęÓAJDIwąő0 2XŔ!]ĘÉ´­)U1ß&ŘřČ^]]űĎ8oŇÖµ»C+ô+˛t7&˝V0 Ľ‚;–„ţlWﬥŁcŘZŐ ®áK¶?hí RtmÚ5¬‚;öŠUŔŃvf=i©aR&wš¦PmWĆׂ»–ŤŤmSwĽĄÂĐÍ2i©9+rsq8 –:4-Ŷű¦Éůřvö@Vä¦xďn˙0vwÓÎŤĂŞŐ’f@¤DËůń]‘R‹šsSŰ*‚´^!¦”Kĺ@LďxŰwWÜZ‘ŤWˇ\eĚŘłd>s¨jń+5×%eŮYÄď ŰáNĺ,…Ą—ďâęţ<říç¶:?t/ľď­;¸pţ´!ťuȨ¬ôŇ=–C5SücŚ «Ő×®ŕŇs{ , •č*iHŇ+_’ÚIFl©‹Ł¤H~Ła÷zĆđČY5L9%CÝßĎěľn[Ρ —Ü™-'Š)Őő:r ‹Ż­ą¸z>2ˇv€ßŮ9…óçOăÁ‡€ä~=¬ŔŁś°]V ˝«é„ń:»ŽU€Ë"ĆóĽÔť-?8zEťđm 2­Eťdj4+j,‹¦ĺbőţۡŔŠr€C6Y«U4.č»Ö–cc“şĽG—Tőa Źë˝ %Ťď'§(ŤgV*N¶ÍŤÎ~Övšx9ĺc">ýľ÷^«K˘b—oEN5CÁŻJ)]^›éčQRďFNéE»čňĹŹAŃÖ}ĺ$ZŘ÷f´IŞăyčĘOĄúąÔµ»®ÔNĎL“—I®Kљ۠žóy‘U®˘áMÉn©éµ“Z·NDŚr«źŚčŮ]'ÎÓŚ}nÓži˙˙á-~>ťPIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/github.com.png000066400000000000000000000035341361462701300302200ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢ#IDATxÚíšwlMmŔźöRÔ¦fŤÄl[PbŹDÔŢ{¶F #öŁ(A‰?ł„„äłjďjUÍŠÚ´Fµßý=ÉąiűU}Ň^=Őó$7=ç˝çľ÷}ďło]4h+"6É„o;€řô^HzŠŔ`°XŇ{ €Ŕ`ř[téŇE˘˘˘äňĺËňţýűTĎ—#G©Ył¦”(QBBBB$::ÚĽĽ˝˝eýúőz+'NśM›6IxxřoĎU¸paéÓ§Ź´iÓF˛gĎ®csçΕC‡™@·nÝÄßß?ŃŘŹ?dďŢ˝˛k×.)_ľĽľŠ+&ůóç—¬Yłę3ßż—ׯ_ËÓ§OĺŢ˝{Rştiéׯźcㆠ .4/€qăĆ‰ŻŻoš.0ˇ\ştIĆŚc^Ň©S'§ŔŻŚ=ÚĽşwď.~~~N`z¨WŻž,^ĽŘiĐĚ żb:8¬Ť7J©RĄśٶm›¬YłĆ| $ pęćÂkďŢ˝5b@–,Ydßľ}’7o^§@¶oß.+W®4€ęŐ«ËŞU«ţČć‘éŐ«—yűqNIguţüy “Ďź?kâăćć& Đżîîî'111úz÷îť|ýúU?‡6U«VMŞV­úźyăăăĄqăĆúYSŔöń ĺŐ«W2aÂyđŕAŞćöńń‘™3gjMPÚµk§ŔL ˙ţ2xđ`Çý·oßôţáÇzŇ}űöŐ ŢĽY˘ě)oJB4! fĂÁÁÁňöí[iÖ¬™Ěš5+Ńsm۶•>@‡dâĉŽű;vČŠ+ôzüřńR¨P!őÚ¨ô!CRśkęÔ©’-[6­ *V¬(#FŚĐńŐ«Wëç iÔ¨‘yL nÝş˛dÉÇýرcĺâĹ‹¨9Q ¤ýű÷Ëť;w’ť‡S'ĆcRŘůôéÓeëÖ­ZM&Ě2ń'­[·NőćÓ @ľ|ů4MuqqŃ{NůöíŰR´hQ>|¸Ě1CÇQ[ĚăčŃŁÉÎC•ČćçÍ›§÷8×'Ož¨#Ą,ž2eŠŽăT“ú§(X° ľHDđć1ŃŃâfWUWWWc“eĘ”Ńgq~gĎžUű třÔůäÉ“róćÍdż#gÎś˛hŃ"9r¤ŢŘ#KČZ"÷ěŮÓ1~äČٲe‹®M!rŕ;hćCS&M”-[VOöÍ›7ú2u‹¦žç„zôčˇďm¶;» 6čő´iÓě Š’GâŰąłÂ0l—9X4ZaČś9s4ÎGFFJűöíečС:Ž9´jŐJŻń/†‰}ůňE7ŚY‚F˛6›Í&wďŢM6O‚Ódá6›«ýoĽ~!ˇŽÍ#hBĐşuâĺí­ Âf‰íÄzl—(°víZUiC€ńâĹ 9xđ c,wîÜú<źC{xźëÝ»wK®\ąäĆŤÇ'Ë{¬•5˛ÖČ_9Ę_ ¸aĆFS’"EЍŁťuüřq=µźUnžĹ‹KäË—ân×›})ĹôI“&©6ö† –âĎ0ĹíßńřńăÔř]ńđđP@zf÷öv tr’ §ÚĽys=ˇĂ‡' ĘĂ®Ć~ţţҢE Ł8ÁÔ&Vi;Łż—Ôé4mÚT{„UŞTQ{ĆfY<×?~TóŔysŕÄ03l—0)pŤ5t^ÔźžbB_a$$8?N˙üůóDďcµk×///ő%h6šśŕŃoÝşĺhŽ^˝zUCž3%ML€ľýäÉ“ĺĚ™3ščÜż?Ůçpn8Ç”‡8ţ|§n:Í h!UE ő6¤RĄJôżć"}>wî\Ć€ĐŔž‰F ‹¦ŘTÆ =ĎŻ<$QyňäI4ţ'µ MŘçŇ®í•+W4A‘<Ű©ß|^ĺĘ•µÉIÎвeKMXHŚJ–,©źOúK†€°pĽ˙Ďáéé)µjŐŇČ ›ëׯkŠLĘ‹ósf{Ý©š;vÔ4š|ť$‡üU§źW®\9@‘ŇhdŕŔ@r˛lŮ2©S§Žö  &L„*1S ŐźĐ3-Jc˛ÂL`ůňĺš&đϱcÚWH ŕÚµk2jÔ¨ż=ľť;wj;ś’ßI‰)‚ČřE™0HW‰|ÁűôéSĆ@iLšŚúSšňó6IąÁ‚ ´Ż0{ölÍ»ví*K—.U !$2ţěŮłŚ  B… š …‡?’Ó§C5ÎÓąpá‚¶Î(‡Ůh“&M4DŇO¨_żľB੣ ©`ď8ľS§Niőg›¦‰şgĎž?ąëßä, €ŔŢ‹°X, @zđńń‰s1ţµ#Ęż%xâjZŠřîIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/google.com.png000066400000000000000000000134751361462701300302170ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢIDATxś­›ŮłeW}ß?żµöď<µz˘ŐšZjI … Ů 0%`vLBŞ’PN•ň’—ĽdřR•§<ÄU~„Š#ˇT6±…p@BČĐÍ­V·z¸Ýwϸ÷úýň°‡łĎąçŢ©¬Şu÷x÷^ßďo\żµŹ5U€I`p"‚šqk7ćŮ7vxůZ›^p  ””ÇĚ5ŕ_=q‚‡OM9á°fqĚÎ /˛ú_żB´¶FM„ FĹŚđđ€ŚtËž‘ď[éśšu+[†/lowăË—w“­­î’¤śoŹř;ÝXygŁÇ«·şĽ»HL3đTIâ@’ÄLřŔ«ËmîZ¬3Ó†@‹¤„8G4;‹«Vč_˝Šë÷đfůŔ­tŤ‡/ź×Rf‰¶ŰËaoď9K’\qîúYUŤ˛Á5ÍěÓ"ňŻÍěq ."ý`\¸ŮáO.ěđ“}:‰CM !1’ÄŇml$qÂ×^\cľńé‡çń%-0łŢÓ¸ë.f?őëlľň áâ;XŇ 8ł±ŔË„ŘČy9?–„tóiŻ›ęą$rĹ›™ţ-đ„TóšÁ•­Żţt‡oÄ$RĹąÄdTA…•ť+;]~ĺ®Ićšµ 'ÂŐŞÔÎśÁU«ô_żłMĹR3ČžŽ+=™1ŕ#©LŔ9b0epźÁ-Wť™UÍěQŕqq/Ď_ióňÍsU|!Î#Î!’ ywqž@ÄKďµůĆËk´űaxpfCÇ~f†™ĎŽćď|ždrŠ€ c@Ť‚-S~Ř}‡‘–µEh0ďHýŔ1`ÚĚŠAŞë­„çŻtč¨GĽHݬ4!˝î<ťÄńí ›\¸Ú:ΠEÇŽ1óĄ/!ü ý¨‚ćĎ~ív÷Ť’6ŇN4]vŕDÄĺŇH .nôyw+I!ĄfaFţłÜeĄDć".­Ç|ç•uv:ÉmF)Ôz‰ô»$ós$"…3+µ1çĆ‘0Î`ě˙;ŔąâD&ý\’ \߉i÷ LPËď3-Č˙GŐ˛—¤DtřÉĺ}Ţ]íM@ŃüřßĂÝ{/‰Ůo> pśĂGĆűi.—xą‰‰Ë»}â$§!ďš«ˇŞ)šÇŻ” ‚9Ţ^íňăwwéĄ!—qďĘ[őî{¨}üăÄâ"cĄ7ňĘmÔéŤs‚ăîsŁŽ R©& ­ž’h–č¨ ŕ#ݲ®60¶ŰĘ…«űlîÇĹskҨSűđ‡ Ť:á>nŕ‡GŘQ& eŹ.–:BMŚK>(Ş (ĚFó^6ˇ—ŔŰ·:,o÷^Ľß{*wť…©i …â`f÷˙«çÍ eh lÚ9¨8HBH5 č)fzPĚPĄČčÔ„ĺ­>×7{˝Ť…:G4?ŹLOŹ}X–÷~Ŕő¬¨¬–ĺýČ łu‡†@’$xÔdČţCĐoPÍh‰l¶–·zôŃ8b~ ő:4ęCŮŰč<`4®˙2`Ç8śŞ•šw±ÉQ%$Š8! r°eiĽľ++»1ýXiTÜaŻK›s¸Á†Ťćŕߏ]ëmúű" rpf¶J32¶ű1ÎáÎN3đ™ôsi%‚â6÷ă"Ő´Ó!t:xJn<Ś×‚ĂLă°ó‡k€'g*›p¬µŢ;ŔĐÜ9–Lˇ0ÂAf‘ {I/·÷Ş$[[$»{T$ý˙|Ŕ‡Ą˝e‡6:ľťäó^8ÁŃ-ó͇qBI’šCH˛šäľ@ “°‚$¶·ÁoŞô._!ěíhČúaŔÂ!űďçx(mŤŞç±3M&"%IB„˛"e]‹ă\L3đf8ŚfŐůŁ v:´/\€N7 Á‡×ogóĺ˙%× ÍÓGZĹ Źśžäžů q?&$I–•BbnąÝg’' §µŽMW¨WŹv€˝÷®˛˙Ł´8•Ŕ–Ř”÷Ë˙( í‡ú€”83_ă‰ű¦řůőU:}0ńą,˙§ňJ.ÉRé›šŽ»Ž5¨Wüˇď±$aű{ߣűÚ«4„b‚UPuôšž^ÝÓkxúU‡IFB0˘n Ń T;JµpÁƚѨ)•‹ăÚL#âÉós|˙Í^ĽŇÁÄ0óąłËU~ ÁŔ*>5Íç'©xaě»TŮűŮ6ž~67ÁC·±µPeëL“Ő;›¬źl°ąT§5Qˇ]úŢ‘KÍĐő”¨ŘŽ™[írÇr‡“×Ú»Ůar7ĆĹŠé!ĄNŕüń&˙ŕŢĽŃf˝“d$ä5BŽ™äLMXš>őŕgéŁŕÍč­®˛ňŤ§č\|¦kççąůč,7ĎOłuĽNkÂÓŹ}Ä,Ý*5b…`hJ†Ău•ĆNĚ7:śu›{ßŢăÔµŐn@ő—$`n"⋏/ńöÍ˙óo7i% H”Ő ˛ňAJs‚XÂbĂřŇŻÜÁő“őŻ1Uú«kĽ÷'_ăŇŹľÍę“Ó¬~ô,›MÓkú"Ü& ¦†¨ b‚XV—D 1@s7…í†çęń?~d–‰í^Űá±—7¸÷ť=¦·űXśN»ŁË«mš5ĎL#˘vD¦v×R?řä)Ööú<˙Ö.­Ä˛ Q&Y3Ä ośžőüăÇŹń/ý 'çęÁ›Ň^_á­çľÉO—˙śk_šˇu~ ™ôxHŤe“E*,YĄA˛nmˇWY¶”˙ŹÓäöl…żůč"?{`šűßÜĺ±—7¸çť=š­óô«oÜh={ňÄlíPD„ăł5Î,Ôpý~LZT^YhŔącU>ýÁ9~˙'ů§;ĹńŮ1ŕUŮŢşÉ ŻüĎ­—KôčžmâkB$„GˇćűĹvh_ФIMĆŢkٶ]Oµâíł“\_¨¬Ľ{˘öLôô‹ëL5#ľ˙Ö6—VŰ|öĂKś]l •´óVńÂÇÎÍqϱ&Żßhq}łËn'Af›w.68w|‚Ąé*•qqߌk+oó7—ţ‚ď=GëT‹j˝B5Őábň3.ôŤ¦°Ĺ#±’ŘđĹQ!jŞ« 5n<ľ€őc"ó»}řéŐ7¶®ń·—wůň'ůµűf©Wý4rÂéů:'çęÄYˇ$?yÇa>5ĺĘÚEžzí+\lżNŇlS« â ĐÂŹ¤‘B4O˝łsf#„ -/¬ :,âŞ#A¨·ö•oýt×něóĎ>v‚Ď<şÄ}w4ńî`sµč6ł»R»şó˙ă­?ćç­ DŐ@5Ü@ĹÉÔ4oˇ¤şeU¶Ň>%Ó–D Ýox>ôĺŞ8yĚ9yR$e{u/ć‡omńWżXçňZ‹v/ťë5’`ÄYÖ9Çeľ˘mt6řÓ7ţ—VTb˘|$ĹşĘčŔsű Î>)Ůuv®¸f°˙ …?ą_ş±ęŠš>Ą· ‡LÁÓ ‹·şĽ·ľĚ·^ZáĚbŤł NĚŐ®{Îťlň䇎35&Ä•›a\Ü|›×7^%ˇŹ÷ ’^ĘŇ0 óQJ?d}HJ÷ťŃ­š2t>ëQš´€C\ľŔ‘:%p$‰±Ľťpc«Ç om§–©1˙â‰S|âü܆€ k»×ŮęmcÎ0É%“ŽŢDP1\Ňň6JB^ŐDč ł!†"yz-C¤D΂Cq¸Ç’’‘ÎĄ"2HTŞW¨F‡ç÷CŹt9=„ĚŐç`•T\ßÓŐ&Ŕx-f©zŰŕ^‘ăiäŕ`4ĽĽ7‡3ĹŠ4b É­ÓŇŔÇ ·Żňxńśš:ĹTeŽVwď-[S,řE$źš¦Ł*śX‰€¸•HHŁ„e‘  đĺ¨pŔIfÎkŚ×oiLJL ˛„(?oˇH~nměł×‰ß‡ô…ó đŃżF…&ý’$u¦‰¦KpAÓžćúižź_K˛kÁl°Í4  †’‰Ś$C6d*3ÉI"Ťń"Dępć2–˛RůĐQžó+žŔ;×·řĹ»ś^¸m$©Ďđ…sźĂ9Ďź_ţÝţ>j†÷ŠsR¨ąâ›KK3i-kĂŔĄ dŘDJ=Ď'5đŤó_¨z±Ç"Ç“é')ŠĂ2ź÷€ĎösÍăÍŞăWϧV=ÚÂDu‚»gďĆLXŢ[ażżź}IEsµ.Ą¸ 2‡T䀓Ň„˛Ę!5hXQÓgüÔůß®FbŹUDźŚ$€ťĺ=U§ ÎśĆ8‹Ń¸ÇęĆ.ÇfëÜ÷9"tR$Ť¨Á‹rfęNnŃŮ"Ń2H‹9»Ą:d1TŐCćů‡$N©2’? ž'éó‚®é3~ćÜoU#ŃÇ"Ń'=– &E÷–PqJ#R&Ş0Ýp,LV¨ ‘űĎ,0;Ő8Ú˛ą“Ç93}†VżËJkťn蕼x‰ŚŇŕ‰Ź Űć7BI3‚ŽšGI“r2TW0}&ňÚ# B„ĂTRwBł1Ő¬˛8ŰdaşÎâlĹ™&óÓu¦šU¦›Ušőé‰*3“őtęú>˛Âś„‡—bş:Ĺ|}ž˙}í{lÇ8Ëěł\¤ ŠLP&fH Ś ’e­9ĐFäa8(Eé2˛ĐCM@<3UN›ćŢÓóś»s“KÓś\śb~şÁdłJł^ˇZń8\)”ýż4ď‘eÚ2>×çÜĐÇůVă]âÖ[´×žĄżóC×đÎS«Ôń®‚8Ăů>ÎÚě; -TuBEút»?gďâ$Ţ{—éł˙śÚÔ}«R?°‰p×Ě~űŢĎđćöeVâU\V(Ě'1–*Ě+©{fű¤Ń`@”&yĂóśč࢑tWŮżů-ş«ßDÚ?¦ő©TT˘Nj8ń`†vë] EEPđ†D†ôWé\˙ď$Ý fîůš >RŞľÂ#Kçydńaľ{íyšVŽdôpáÓłMLŹócK.eŰhT Iç;WţÝ›_%ŇëÔ« µČ𲇷6˘ĚS(KŔ {±Ôs9Ň$©ý=:·žeŁ×Â}č?Đą$bÜş¤°ŘçŃcóüňËěčNj’Ą9Ď †Ěácžâ=(g [ÍúŰě\ýíë_#JnP÷JŐeź­›Ćö°ĐÁB =,„ż ŞŐôJ,uâ^ ę…št‰×žcýő?˘»{y,đü¸Ő¸gć óőyâĎ…DexV­$féĘP¶2$ů<Ž…Á&ĺq }Zk?b˙ÚSřř&uź®;Ň– ÁaÁa¬;4ďš_“´«`ꜥ\Ő¤Owů»l]zŠĐß?tM҉°Ô\`ľ6OkZ‡L˛Ą°Á”9;ΧÓ9řlÍ2-®”Ŕ„Hq­ émŇZym_&’ôłuQMÁĺ 5ČtČĄž/öU={YJ‚i‹öň÷él˝5|® ͨÎDe‚`B‡z)µÍ÷u´ô‘&ß–˛+ËÖÍ”ŢŢ:ë/i/‚¨¤őzÍ"xQÂŃôźóg–Ş%ŔŞéĎ4űÁ‹Łć Ű^¦µüh.>ڏęX"I%őć.5rËŠ©&N%Ě7rÇ'ĂŰü=f†&âÖ2ˇłFŐ2ŚYńŇąd“G=xáX3»7HŢrm°ôëŹ'rńŢ{„ŢQca,é„F3•¶Bkĺ.)ŔŹĂ;äô,“Ř/`Lű„ţ.ÄÄĄWGš>ФÉäĎÁC G“W\µ¤–7‡ĂxĽDx´·‹&-D‡|Aî{ˇĎ~Ň%VE]îżĘd[i0Ł­¬˘Ů=V:λ––ÇÓh:XËÔͰ8dŐËÜňH1­$X¦ö©F8$űů“ŕÁ*žÂ÷Ž/'bŰ˝}ÖÚ»Äf#R§âcśÝřÁG·Ůo†"śoâ\ŘE,¤IGЬ‚kTY !/e 3›J)×Őađb>}ťy„ .šÂůz‘z—IH4pmo•[íŤ,ú¬RKx !ů~ţĘ0g$"¸¨NÔ8ŽT±Îć]ú$-0™šŻĎ#cŁKş“ýŇÇ$“´ĎR˘”#Â,¨5OâŞÓč2 űq›W×/±ŇÝĘ0Ť’oG´a¬ôK¦RV˙ÜĚ qjÓg¨Îś'i_EµO$M~ęÝ2©Ź“„dZ!™z b™ÚgyT#’PAý<ŤĄGq•A­PŚËŰ7ůÁőźŃJşP)nŹňčňÖ†‰8Pe)}(5ŽŃXü-BŐ*h±*BeLŹJŰhä¸2tŤLňA#­ágî§ľôĐŘOóÚq—oľĘk›ďfE‘’jp0ŞÎ%đĺ>¤ Żç“!uQC'OÂu7^ŁóŻpI‰<Ţ„´`=ü†Ł5€LýÍŞž8DtŹNÜËě}_ 2yâxĂx}ý úĆ_˛ÖŰ!ýf¶üžÂŰ2°ůr4°v1&ŠŠF@¬ŠČneňôěĚ}żÇVw‹îĆO0úT|„wŠ“ü÷\v x"…„żö3Ë?Ż÷ĉ§*„úi¦ř'LśüČy€š˛ŢŢ᫿x–—×Ţ,¸G´`ąáýĂĽ˙0 Ë´#é›Ů3{Iś˙TóŘ#‘=řűlżQˇ·őˇżEĹśO'6":H ‡ČÂ"išőŕHd·đ 3w˙“w~Wi2Ú6;»<ýć_óôĹż¦kýŚ€ClĽ8¶‘óŁ KN0'-ÍžÖ1ţâ6#QU}ř# .®ňřÄńż[÷µişkŻĐ]~‘ŢîE¤ż‰X/ˇXĆĘżŇJHż M“ź`ę§p3g©Ść©ŹR›ż >śĘ˝˙vwźŻżö—üá…o˛ŃßI§źĺŚŤŇqń!±}Č [®bÜÂěë>+ÚŚ˙ń´é¤Ć-ú{Ëô6ޤ·ń ú[Ńö ޤ  `˛¬O0WĂOťĄşô!wŚŠúC—şjQD”UýĄŽ ?ŕŹKťQtAg\X ´Ąmş$i“úÝwâmúÚ:šĆŢ9sçľ÷î»÷Ë9çž{î‹eŕż–ČČŇ Q‡Á ĎżŔWäÍÉĘvfdRć¸]yČ”É)ź}ň©ęŽ(úú %aXĚÓk^‡Ć•“ Lžülg—Čě‹.¦[g{Ç·†‹Q‡8väče—\ę°Ů˝…EůnOşÝ‘—ëňäąisçŁ>”nĐëWFŁ$ ‹É6oÜ”›ť“•éDU™éÖÔ4Dy/{>GˇnkiŐoŤ FI¤¶\}M†#&”,+)MM™Â}ŇŇí"FI$–‚ €p,Ľ Jţříwžzz©˝Ýd1J°N4Ç™0KŹ©ťVsÍUWżë;žŠ§ź<~‚ZřFŁ$ ëŔĎűK|ŸŞÂ‚çÖÍ|sí:ńîĂI $Ńdd1ŠĄżż_Z===ŇĐ%G[Fé3Jôĺa±§ĺÄÉgź~ćÎ%wĽřü _ŐÔú»§ˇ9nÇŢîžž®îčĄQ”¶4šŐ(mmm˝˝˝ŇnnnŢľ}űŠ+–/_ŢĐĐĐřň+ź~üÉ‘C‡e”H»:ý´;Nµ›8ňÓŹ»ß÷˝GzřúkŻ»rţ·ÜtsĂ“Om۲•Dyím§b_AM‘HDaµ¶¶ ß(ҦěرcѢEUUUEFqą\¸>„;ĎŻź·aý[šĎ$űöě}¦áiLYTP(Ń«ŘëĂĘ0F›82çâŮk^} UA޵Ť·h‡B!Č–VL0¤ćASSS}}}YYYŞQňňň|>źŰíNOOgq±·L­¨d&»ŐVQV~ß=÷nÝĽEÜšU+V^1o>îE¸‚€éů ÝćWɲ_doŕ]14ŞRÚ  .WŻ^ D~~~AAJňx<Ф¤¤8ČŚ)eý#h}ĐDÝ93xĘX‚›h—‰éĂŹˇ¦Đ€ČŢšVUÍ}ŚUĽQ”¶€8~GGŢPrr˛ÍfUĺää@éőza˘Íd`1.› šcQ1 §#¸Iýx‘;@`D´ô§›ô!š¨¨k”(5^µrĺʬ¬¬¤¤¤šš,(Ş‚#rßétfg«Ý2„ąťŠz ¤Á¬<ĺRL&t††§€Âo@ť´yĘ ¶4kÚ”TRüŹbĺYÔrĄD6nÜČ›v»˝Ľ´Ějµ2.N “ÂĄöĎŕG#ÜŃ:@Ś9čĂPÁ#ÔŔť<Ł!=Ĺľ\R‹YőŁęęjÖ_ww· üżőř ĺ†ňŤůÜF6bŞăO¶ů ć7đËńŤÜÜ\¬±xńâ––Ą#eDc=7<ţ„Ż 0'±;J˝>ČLŁÄ-i‰˝ŹžÎ8íôââbś&‚â±ăÍţî®A¬ý{ö–—¸˛˛éM j‹b,2 Ĺ#âg¬!ÓÂ… ±ť„<) ë‘—yđS«Í›_Pć+N›śňżjK°ÄĂPUmm-¶cŮ Áęë TUTB#ď”yiVi'DFĂÂÁY€ÄBv6A DBýŃÝĎňĂ®ďP˝+JJí©iYx"iS̸c”ѰP›Ä‚ şş”?QŁŞž@tż±¬i\ VN¦łĐíɰŮÁÂĺYĎzÜ1ĘhXšé5µŤŤŤ@Hŕ „‚FĽď®»ťŽtŚ89i"d¬Çl˛oĂý"Ła±I °Ý»wKúD¬â[łfÔˇ-Pps*îe:ÇÁĺŮ XŚH~@éđwbUWNEID,# őZâT…چ…ËźS;ťdA硸|_8Ú¶€˘uCCÚă`D´5on=; ±˘ŞîŢhBjÁ|tŐdRÚ(O.Ç.Ła±˛1C€oQ™_ĐŘ Áó"«oܰČ|fΨ@2uÁô-âgąJ®K AvkĽźů,¶jhÄ·HB‰ĄXuµÓ!CUĐ *Č8ě‰dDě?;wâÖś /bźÖ+‘‚ţô¸c”ѰȝHĄ^xîyEaŕ /‰a r ¶'|E«ň-·‡¶Ľ<\ô|c6bé¬óÓßÂńNljáÜISJŇČҬä gAĆFĽţŤµÎşý„-EĆůťYšľüJ”D-z’<ŘDŁĹ4zÜ‚ű˛“­°ÍŔÔe|¤PgFŽë`µžl)Ĺ·Śłd0±FP‰F‹iô¸=M:+ ·fŻ[rŰíŠ&Š~"Ŕ“38J;‚űkƢĊiô¸…T…F¶Â cíßzó-úن:ľrńňŞ—ŕ,řÔ‹+¦Ńă€p/Čjήš’<‰ uăµ×úó`W§Ż·ŕbżě?Ŕ±­$ÚšĂ$¦Ńăö6µ¬śÜ“´ W#B±KîŰł·˝˝Ý"źMj§ŐŔD Á«ÜËDŁĹ4zÜą1=‘đqÉîŚĹ`;w®:bŕh[6mNNšČJ”Ĺ8FÄĄ° ^ 2u•~âs™ÎĄK—*,Öżř…s0 ĂĺáĺY,J¬FŹ[8_·°#; ë‘óię¤ÉS+*™‚Ia…űú©Ľ˙ GşDůq[ś˙d/ ÷‡’6ządöśča!LüĽww1–O#Šiô¸Ô™$|ŘôěňŠI“ßŮđ¶Š[0…AqüE·ÝŽÁ’#ď;ôXĂ…Ş°#zâAĐź5ó\GgK˝üňó/jާŤŹoˇ$Üś5LÄ‹‰gNxoŰ»ŠD°˘_yö$B+1 ť™h´FŹ[Đ űžŽ%ŹşéúNµ¶©m¬č·r#đcM4Wâ+fUšhŘAÇ.ÄOü‰=IŚřţ›o‰ ň­ÔB*ÍŽ-żßżë›o!3Ť‚č<î?‰é·i±¦¦U–WČÚÇ8ë×˝Ů|ôXb1śJ}ŇŽ˘îE–?úXěĐĂ3Ě/&- `ÎÖľ"ďĺ—^&˙ E±ţn0;2˛}8čIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/intl.paypal.com.png000066400000000000000000000107011361462701300311630ustar00rootroot00000000000000‰PNG  IHDRPPseúsRGB®ÎégAMA±Ź üa pHYsĂĂÇo¨dtEXtSoftwarePaint.NET v3.5.100ôrˇ0IDATx^íY TTWšfz&jP‰%ŤŤ &âł´“™¤ťnm5*(U€¨3“ś¤3™¤“LĆlÓ¶qÚŽ @UPěP˛Ť!ăŠ!‚˘˝Ř‹ĄŘ…‚ÚŢ{őŢťď…Nź“8§sŽç8§R˙ąőŢ»÷ż˙÷ď÷•ű™‘°«“°«“°«“°«“°«“°«“°«“°«“°«“°«“°«ÓĎ0Ď…s€1$ĆƬ"“p…‹[—"fákđÔÁÎůP™mŚß_OX)ĎŰ™$08Ř%É*3…`ĎlŘBć/ĐÓ;SjYX!Úd{Nŕy‡Áń)ËÉ’čľN´V%é– ·!:‡óť«ĺ!`Cčŕ§‘,‘sG\áźŕă(cm@ŕyČěśüC’DĖщPÉOIr"–Ź=uACO·‰°6°;/ţ’ŔŽ #t'Ŕ+dádµqÂŹĚ˙żiL,hĘ$¨˛űđŚo˛qoićljĽ$‚›<ť9°f˘o @0&Xy%hËh‚s<ćÍŚˇÝL”đ‰ď·‡Äŕ-v”wpđ™Űöů©Ä9˙ń"Ćd"I9÷9ěËKÜ–·F|YîĚóĺőpŮ€Ň`0ľŹá!{nÉ€ť$Kŕt*y@/(ČÁ[Žq.‰†Čó˛łýĹĘż’Ć‚–%?†Vy0P’ű¶čDÄüvśý`G„ F™0ÂřQ¬9Ša§µť_ř[čëËV‚żňđX(ĚÂŃ*o¤ÎY@&G1ľ±ŰáŔěp@˛ŰJű dq -ńěXc7eé9Én—xç.đ/R·hg–Á±e? ČI2jhMĽÉ CŚő2ffĚ$˛QqL##’¸ ‚FVD)Đ^n·íÉ*ü$íŇ&^x7ţ Ć{ęł$]ÜźW¦9ÝbĽI,lĺŕz·Bşř‰$ŔŚd¦ďs*ŞűđJëÇ%˝{ űŁ®tě=ßřiˇ!îZ߉[7MXŕ$ŁABË\5š#ÎTpľsw‰9·H®¦˙Lyű…ëzCß(1!ˉy hÉ8ÂXŇ…†9»')3&*Ň˝BłĽ·çŕs–\NÝ™÷űÝń-F”f'oPl(»ÎO$$ZDZŻkLkÔ§¨‹$ÖúĹ6úiŰćišj;©jy¨xß9CÝ©řŽ„şă TÉ®]}q~ä÷ Ňú2.µ_ëcÇŻ"Rż8ů&`Áîf{Ä€Ů8&îŠ*đŢ~rRh¶opĘÔµžŻĐNŃŤŰ”9>8{rXŽWHň;Ž1›Ŕ83˘©N1€µVrB&]‚™Mŕ¬&3Ą”EÄ€µ˙ YhŠđě&™MřäëęEšş…ýÂÔľg.O¨ôSťž—iđŽę_ŞîĐT|TÜÎÄQ°·2+Ǭ3;Ą•_lć@F11±p^>ĹÍÔ¶>{ei|sEcóď¶ íÝ}¦ŮA°Ż¤%¶SŞŔ5Ź'v§MT»_‘>SýnBQNqoô©¶­:;{[ÂA1ă¶ť ŘcäY'ă/{Ď”~üťčŻ˙#ň˘ęDyqÇ đ3WEž®×ś+×]ěÂI´[Hb–vΨűş!ĺËĘü„ć«_µ.JhXŘ4WUQŇ™ßÄr›·«Z©i\ß8W]µ9·˘˛0C·[ÚóÉ©ć?|׳ż´#îűú¡~8vttŤlsN÷lmŰmĺ Mc÷™2l`ĺĆüO=băě”ËĺÚß:l_˛ółń[ó&‡¤ű®Ű]Ým…ˇĘCl宨źM:÷TF/°ťqßx)4ľŰŽúg?°%Ă70Ń;𳀗bţXh¶P¶XýV´gHÚ”­–ďJ5ŤÂ4c'Ęűf…g>?căź"rKJMl•¶v^lÍií+´úV8%ľÂĘţ1ňü3™ĆG’ /¤Wt3öĆ ĂŻÔĺţQúąq˝łŐ‹4ËcĘVEw肱™In0łgăjfĆ·,KŞZŁ3PΓă ňR8>´&QY˘ )—ăĐɱ3]3÷y†ä=¨Ô=ąă Ź +”ő°!‘pňŮ›2ŢNm´˛ßĽ“çů›,ßŔÓ•YÓ¶«|B)Č=7§řĹ|SÚ1ĚŘć=ąža'ďŰvÄW‘lp…Q0Ú¶ďŘßl92!ěČĘ·rZGXá0[[ý¸¦^›ÝBÎiGchż~“˙UbéÔ¨&DcHú5ŘpéńŢGâĘ47žOi~FĄ_ÝęŰ»@=˛ę@ń‘š~RĄÁSýşuY\ůçI‰›ĐRV#Â7Ę´˛ÁŃ…ŢÁü«S7ś¸-oâƬ—"Ż`V6ô‹ŻĹú%ß·ésĎŕŘ˝W:cO’N÷MŁľ“őŘ¤Š– řĆ'ü°Wř)źSĺ–"…ěÉ)™ˇĚűEčlkj˝ }ç×ĚÝ´÷[?ź–ˇ>Ó‚MăŻt-‰+˙ejőăÉmŻg ĘY™‰˝ůeíŠLĂMď’čę‚7‘l^hýŞÎTÓ'̬l”}\lôS—ÎČhő‹©‰+jÂvűľm Đ6.Ôv=sU۰ źÎq‹D„ݢTCéçĄ}_N J–5=ěčóoőfTáď"N¬}çđ” QSCr˝CŹŻ|%˝¤ĂbaönóëzĎ]Ö˝ŇüĎçآöXźń°"« ´×‰'J}×Ex†ćűnŽ«jě´˛µż×ĚŘp`’B·ěuµ ťozďxĺJMĹQ%óâÖëô‘ô»Ď4lJŻ_W5W]űxF÷ÎäďG,L°Y‘©äű…âö‘#­ć·.6/Múv^Ú5mKúoĎŻđOn]ßľZuą”ÂúÉŮhŔ´đkCo,;;ăŤ6öüËI>[ŇƇg=°5ŮkcôŁ;’¦)â'oŃŔcŽ]˛]UR>ŚBpąŞ÷őČ‚•»4s^Ü?}}Ě[óŢéžć¦[–PÝjö“Ź„i&+Rf)´'‹Ťńgۦ+Ô3•şYŰłö坆ÚűĚÖŕěÚĺÚęÇb®ĎOîx6ľlEtŮÓÚ˛Gµ-Ťix.áň¦Ôď.µYGŻŠě˝ ]›RJV©Š–«./Žý~YBÝ’¸Z˙¨ jK:F{E¶&­tNb“źŞ-$Ą¬‘ë¬CcG(´îč;¨3…G)‰9PJmu˝˙ Č)Až;u“”±>ŰîÖLئ›¸#ç±×ż›VR;@)ńBEËs˙?EyÄ#čsźŮ<·öQdŤ K˘^ýoÉT0Dľ¸Ëá©POQhÚ’đijéSŻgM =ćą1wŮ›Ç:Đó\ Ďâ*ýÔ5~IMs´ÝĎŞ«fĆ÷ű'ęçĹç˙ńۦëŐŻkť˝OĄ\šź¨źť źťÔ°U»ţeME'kę1·vűzÍÎ,ňčG´öýcăCó˝vćř‡FHÎŻ7vUŇí»5rŠ2uFXĆkŽS*Śtł€PŐäÍ)‡%OMrx’ň‹×Ç|… Ŕ÷1Ń|˛š-Ž®_¦™۵9ݬµ_¨z†*2Ž'č…(ʲ«‹7,JęyîŔŮ/ŞŤe}–ŁťlU⍹I†)=/źĽjçY\ťé…¸‹ńmSłzŁŠšé$w˘ó0őܶA‹Eü8­xjĘ[™öPHÚGŞł$r Ů=ŕő(׆ż ýŢ;?˙Ű@őĆŹOôË]‡ę ˝ďöŚű•ŮS™Í’qőŰwó}™>ĘdďĐ”)ˇ:€Wě=ŰM©T‡÷žo^ .óKi<®öĎĹí4Ôo4&4ťÄ—síô\táÉĆĹ‘UoŃŁIŰü:ë?E_Z[鯪úěR%Ô{Űž‰-Z§ź•¬?ŤěçÎĎĂ"áĐ ĘjűŮ‹{ Ľ”éH*“SsNÝ€vIt!»ĽǙꎞ'”Ń^ŰrÇ+3üvĺý÷ńĆ÷uĹłU“Bu”GP–ŽŐP=@·OŰú_G¦)RĽ”™ă‚Ó|Â2ćFśľĂńDÝÚpěÚ¬Ôrź¤ň‡ŠOŐC·‚ÄŁÓĺm"ťˇaĚ,łł§UßÍH2ÎMnAWżżÂ´÷;ĂĆô« ŁJüÓšć&V4 »gk˛ëjŞ–h[Rjš Pęć~ś<¨ ¤–Ą_š’5Q™ă­ČŞh0b?^Äs+vÖo&@Đç^M81<Ó+0uNjfxÔô൏"c^Xr9ő™đĆ>´ć¦M Nžś‰:ç˝Eőď‡NŘś cÍ[śZ<'őĆ´ÔëO%”7ö‘Ö­ô2ŹÉ#ŃŕN+c;˛ËĽćźnžżżrulĺ‹Úú'#*T-OjQŇômVVeaKôłbë´ AGš!!ťĄď@¨Ă襣…Wź¸ţäK‘˙vöŠ]IĎ˙.mÄB!î  +5č`Ar f5˛őćÎ Ú3oSĆwuźťmů‡ÝOîŚXµKóĘľăĂSbö(Z}˛úˇpݸ-©(Ń˙[‡dŠđƉAb5ő\`ćŐ@]ĹşśŇWóŞű(±’I©‚ Ń`;ş yR?úŃ—uK®?ŁąüŇéÎŹ+¤Đ‚Îu9 ë˛+ŹÖ+i Í®[“ü}pf)ʵw¶0s ]Á)ěđĂuż×Lą‘VIv°ťŽ€2`zÉ&š óĎĘ ýÍťlÄF'Ď ×.BBb;zAÓ€Ä^;xzrÎ'$ÝgÝţ}ŮĄp%ĘNř ŠŞ…uHtví6,9aĚéૠŘQŢ»-¬¦×Ü4h~0°ł>+Ŕaü¸Ń!G'v‡˛–?Ŕäf?JtÔDÇ!a&öÁn‚`Ą3 äFď…C˝’p*žČĘl˝4KÎ/$ş_frHϸÇfbÂT–ömçŁ!šűB˛f…%Ży#ˇe™¨‡%e’\HůôRçbU5‚r2n2XA^⨠˂QŘŤJjbÓ(R™„şq€žÓ9Ś“oÔ°ý8ˇń =á2'bG‰ -Î90ľÂŕŠ†‡&ŰčЇßli@†1 ­Ń» z &ěě×ďçyeMŘqtÚćCéßP*ÁهT'@˘›ŕÇq&fłB›ČöĚn…§a 5"™ÔíÜQmvVz‰[¤Ř•ÇZśU>ĺËSŰčmy^=0rď÷2®N ×üÝölźµĽ|ŕËz„9płĹJa~Żčn¦§°sí˝ŁŇO…š~čôî´sůĄ-0ťQŕr” Č2÷Šî`Î.Ú,v9×ŃázÔdć&]<Ĺü>(9D^„ÉéřŃÝümÉYQ¨Ë‘ č=N&ô6·č6M’ĺ·{Cw °ü“‡ŚWřNď™yĂI‚ăśď6e”x€#>ęË˝ˇ»ĂřĎÂaŃ"âËXĽR&§)ą2o·#Ł´Üş›. B%ĂiŰigŔÄ S°#!>éU6ŮůŢĐ]ŚĄ—Fôűť:ú‘N.XqŰů{'ˇÇ•=ŰůűĚ=ˇ»lá˙˙äěęäěęäěęäěęäěęäěęäěęäěęäěęäěęäěęô3ĚŘ˙„żND,‘ŞIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/microsoft.com.png000066400000000000000000000202341361462701300307370ustar00rootroot00000000000000‰PNG  IHDR€€L\öśsRGB®ÎégAMA±Ź üa pHYs  ŇÝ~üAtEXtCommentCREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 °EX“tEXtSoftwarePaint.NET v3.5.100ôrˇľIDATx^íÜ‹»VÓöđýŻžăŇ…TJm]8‰RRŽ[§ă\ş#*DEBW:”R"$I!ú}Öú®=˝íw·Űčś÷ůń~źőĚg®ąćsŚńťsĚ9ß.=şč(şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐa\a~®ŃĽt1\yšZCC7u˙]ş Ⲹ<uV˙ŤqěpY\†€D?hš† "?ýôSóŇĹ%pIt,HKóą ů ĺ•ČůóçÓ8tDüĎK ‹ŕŹ5TŇŇ|nCżyŐ™`¤†Žhűó`°$ß}÷]ęçÎťS PáOaK%ĚEö‡~Pž:uJ»Ę™3g´čźvĐóűďż/Ż*\’áčÇR™Ľ…‰Ô•4”Ň'4¨DU”ٶ•‰Tţ<¸Ě& gĎžMĹĚU ë€hý$Ž‚ ™éZň5Ťô;věŔ‡:qâD­e5Ěź mÂeb ÍéÓ§Ź?.v¦đ€ÁoľůF‡ä–" ę¦9VTöďß˙đĂß~űí7ß|óôéÓď»ďľ-[¶|ńĹéIIŘúó`° *·nÝ*Rwß}÷ś9sîşn»í¶ŮłgżôŇKeĹ`B@q“WlܸńĆoĽúꫯşęŞńăÇŹ;öŻýë#(ß»woDDęŹţ4Ţ×HNřňË/xŕ!»îşë† vý Xşt©ţI)QB°ÂkŻ˝ÖŰŰ+ú'NĽé¦›FŤ5yňd|¨hyě±ÇŽ=Úπʠ?:." ń»ZL˙·ŢzkÚ´i×^{mw)ÜpĂ xňÉ'%"‚"^«¬ŇW¶Ů… Šľ‰/îT ˝účŃŁÉâ@FÚ´i“žÍŘ5˘áŹŤÁŃ\±b…\!^7nÜ8Q€ĺË—űí·TeőXa–+Ä”P5fĚ˝íPٰať¦¸•Yhô”©Ę[őř¬’îŰ·OŢ5}!SxĆŹź0aÂ$Ąy\7›ŃăÇŚąqٲ'OžŠJ·`ÔĄř©S§FOaB “&MB‰ĄđÔSOá;fü9ŕ Ľ űŔy·0Űf”ŮZOÜ ýŃG†Ź8Z±bŐ·ßžĘTh;|ř° Ŕ"ůČT82e ťŃléPľjŐ*;vmŐ/¨W*ţ¸€€â˙gź}¶hŃ"ń2[ła V{ôó ŔłrĺęÓ§Ď&h}K«şEýő× ,>|řŚ32÷MůŠĚ 4ÜdëŁu Ţhů˘! řÉgÉǫԱcLJËLĎl›ő:¨â&â…<Úĺ˘U«Ö  ¬H4•۶m3߯ąćšľT6Î:Pq 5Ä?˙ůO«$ýűˇŇňÇE˙M¸Lş“'OÚQ]¤ĚYĄzŤ*Đ"ž‰źč«č’pę”»Uż¬€čĨ$#ˇ ·é?räH{/h±Îţýď§[?4*ÚĐ|ţ˙COcn›Á=Ą©őłX·ˇů÷ˇim%@ĐS/‘r§•÷“©A ˛ŕž{N›6#ë ¨ @ –/_ŮoÎu1EŮp‡r¸2ĺŤ>účŁ'NÚ ­f ŽĘ˙oŕcAÓTă—=ŕÇúgduÓđóĎ?wű5ým’¦ż¸ă@ş0í—,YzÇł…Ű“Ą îĄÉ@'…ŃśiXÉźJµ¶ ´ýf$íh>·ˇů=gDG%xµm>÷ÜşŰn›yĂ >U)HEY/j“pksŁ$aŞĂUApËR)^3VFŹ­" š¦>%Ĺň@Kľ.Óî"ž˛LP÷U7őô×'ŞňZdŐ‹ÁpćĚÝ|J‹nJ-E[ô(I¤’©ş5 âMłҦ$|üřń•+Wšň2ľ˛Úw¸^v…­[·Íś9Ëť«ě˝“&9ĚT Şť('Ë´X ĹyŻľĆÄÖ( ýK·řD=«öů˘ź¸µ':Í{}>Ö’>tęÍ*­Ý@{”«ë/E{ͧâN~ Nť8°!Ę[µ™é©(ă zîÜą˛•ňÇŤËTĹąĺÉ'źÜłçť©S§Źí,_mŮ ęĘŔ´V€‰lJÓ^zćµŇȖž*”Ď˝‚W ":"•Ř%‘ˇ®bJŁn‹’XŘo¸tĐžţľB1ŻđzćUł‹&eß§f)T)ČgĐŞ·ęBtË-·$čŇ’´8ËżýöżÍ}o‰~NAÖÁĄ€xe G[ĄO1×'ŻÜŕÎ?ĹŤmÍKźµ* 4ĺ|đÁćÍ›ź}öYçÝGűđŘcŹ-[¶ěąçž{ýő×ß}÷ÝŻľúŞěIˇÔÓŽ-śaln;ÍqĐSŇGűÇĽ}űvú׬YóÚkŻíÚµë?˙ů%şůZŇře(K˝¤#”ür Š:WÖĹ‹ %XÉB0ýďĽóÎ#GŽXš…^ÚIôëüsÉ@gôřá‡4?ôĐCî\ţ?üđżjh&bńĽôůä“Ůłgľ gŤĐ F÷ÜsŹÓs7o~µIčéUáOB©i@˘|÷nK§˘.«*{{L7 Ě)–@¤݉{ńäčŃŁF!{ŐUW)\‹@Ü…X¸3÷ĹZĺćIS|Ň.e5đEČ”®™LĘĚË(Ńo- kq?®±9ěرĂ%iőęŐ†¦$^đ Oq "hp¤źý'OžÚ°áĹŢŢ©×_/ÇTůŁÚ„}đYRCEÔŐŁW0Tr$nJ2-č!n§bń-7÷3ýµX :Śşîe•nŞâżěśVĺ… W óśÍt˘dáÂ…ćÝÁó73Ú$OVi—ô—,YÂS˛4X”ŐćXoŹF•ÔŤÂ0:c=uęT×çQăJú¦‘«K …ďż˙ţüůóEßÂ૸gîĘB^«?”礵@0Ë`*0¤WŢ M.1Ö“˛Ž„>ą(‚í(SéG@)5ŞȦż‰©„/ľřbîÜąNę "îôdzŐh{\ąrĺM(ó:e*ľâĆÄ5›C}R„OłCý”§4„JP28łŢíĚ©ÔŢqĘMůcÇŽÉlĎ<óLNíîç\«eťh›ß.qE0yň”ŠçKşx(ÜĆË0€€ŰożÝľĎJĐ“W…Źx†€÷6ßT@3OâUĘ~cE ¸ôâ‹/–e®”:ô·ŘM´,yˇt~łË…x™+J-PkjęľŇ/jbçržżÇ—ÎJő~$O˛S@RújŕűСCu`ŞĂľ˛Ś"J|‘Q5:8ţvőüd‰©=AŔ*ŐÄáUx2lFRq Gi´Ç>›p}¬Ö3Ł"@g„€~›p;,ά/{—ŇčN>nˇ&H‰”şčłÜbĎ/‚[ÖMˇSń‰at"Ui8ŻÚ‹µ© 饆S2[iĐü vÂS# ô °ë6@ă9- ™ű˘ŹŻ9őś˙á§•ËW9¨ĺ¨`Cs€smąáúQ“'NÚą}ÇŮÓgÎ˙đăĎçşđóeV÷[W€2A`¸@ňüĎ~Úą{‡ śÔuŁťC´…Śź0öĆńc3~ÂÚçÖť>{†@dÍ©żöšěďtQ9`ń2Ýp‰N(‘vÝKIED%‚­ĐR CúôCÓőÂ…§ź~6ÖUÓ‹§rEśµ˙Íž}—«¬¸CH˝X!*=ĘŁGż¸˙ţË‘?ó5Ă„ŰŔĽyó{>;rtîśy#‡_'č.“ůŮÄYbĚ ŁçĎ»{˙‡űýź~<Á(5ąü—¨Mo~Ĺ=wî‡ÇrÄëŘ2bÖŇęŢ·oź(č,FTϸ­¨C40Ş5h:÷# v­:°×«wĽL˛bĹŞŻľúşŤ®Ż©nďŢî¸c¶pŃCśÂ¸ ’™$=۶ľ!ôWGćDßj¸iÜř5«Vź8ţµ‰/ô?~˙Ăŕţ•" L˙/ľ8vűíw €Ű†`}0ýe3lj+żH‹)ăŞÔ:~UiŞ „KÉ«ž…8kÖť;wîÖůŃ—â*ßŕôéł›7żšý6±R§MćáŽŢu×cÚô];vVq2‚‚ű>;QÍ*Î_L@%7(dIE|Ďžwb1ý! ¨Ę Ćr'Ú»wŻE¶Aő"«,¨#Óú\ڦs;5ĺŐ:@Ŕ}÷=đÉ'źęÜhi(Q~óÍ·._IžÄiËH +K—>!N=B?üÚJÉÇ"Č&v‚<´čł#ź şä#îID—%`ٲeý@šGvíÚŃ· W‰•HĽŠ’çž[çä@J(«0Ô•őë_°T yZŞäéyđÁ“ýĹ="­§±š÷––4źÚ÷eÖ._ľňĚ™ďř×ő‰5/ŞWă›Ý˙úףb•ĺkúĎň¨oÚ´Ą"`Ř5ĂĺAżyŇsJ4l~e“í·P*C'@Yt÷ŕD6“zٲfJÎ -U*,‡U«VÉ?­±&• ”Ć!bpŘÉ áăľC@#0ôůôÓŁ÷Ţ{źü)ô´‘ĄÄÜǧ”vŠ€áĂG#=âˇ{Ť‹OąÜ‘ĺ@TIůJs†3‹LźH§ÇIÜýžIFÉÄW¦’Ф *+.Ż| ŇŇN@Ƶ›oî}óÍí K«H;ŕŕÁCÎKbEĽ/P•*ľhś>ýV QĐ#I…©ŕŮń.?ë©\j(ýßQŔőPÂ5VBŻ[™"î_v`7»22ч’Ä â¨4M‡>H{?Śn\Q¨iÓfĽóλ.ÚŠT+´yöíűhćĚYTO^jł™;bŕ±GzííťjŁËJ!0uęÔüąĎ€h'@ôĐz ę+”­çwďŢ™>,o))Q®]ű|ąŐSů<.ü;{ dÁęOHŮÜżvěŘQűű» i)d^ĆÚÄÎéÖČÔHKPŢřxĆŚŰr‚ČÔQR+ÎÆŤ3g®[‚n=ZsËČx*‹/>räHěĐJ€çŠ@„KřúëŻďągaNz–XŃJš>}úÎť;ă˙€ çWˇô# °.”S§NwKçVD°>üp?Â$®Lťoş+m 8vě¸n>IÉS¦Übwţá‡&ÇµŁťë8Vh' ůçW­R8qâ„‹"·‹…ú«ëś‚¶oßž!®J׬y&†ĂÝc* `×®=ú6Ń"Ř m|°ďÖ[˙†ËhP˛?ĂŠ čé)q´4ôv; Ůo€V iĆŇ«Lp‡H@1HŮJýBOĘNđÍ7ßĚť{7·–ţž —“_}őŐtţÍG}h %^y z¶Ć§ëCít…ýűÜy籊ÍQÇD· >|Ämą'TÇ7Ě<őÔrXňŤú‹ˇ˝üGDŤdĺeÁÍîÝúÚ¸šĺžÝ;o3ÖS_ł«?ąÍťĂĄOůüÚu9őfVž:uĘ ôÇ<¦Ń~`H«®Áůő-0hA3t jó+4=j4M šž­Ę=­)¨DąöŐT>ţřđüů ň;ŠGˇÉ¤D/Ţ}÷ýjŽK´cŘ1kűöťňůĆŞŃ´ŕ‰qC$`ěhwŞ‹PA€˛ ”„”çÎť[˛diĆb}=DU±cŐ·ąqŹ>ú¨}˘~…ÄÚmNKĐtjCcěĎVŻ~ZÔ’¬ă đyZ7á‹Ő_„ňÉ)óÁ9ĺł™8űĂ„ U|IÝz2F¸˙ţťŤ"ßŘ[#-A;Q:D<)UqB€ĽÖ©ú)Ôeĺý÷ßď _jÄ64ßj¤;c7ÇŹźx≧$Şb|AĽ°ČÜrNź>[ŕŃĂă0žĹŐş ×Ú~Á˙€âIDoĽńĺF1ś!ň×ęq«? čííÝ´iÓ€ÓŞˇűĐ4ŐhúŐhš¤ç% 0GpŮDCTť={N<ëČTHš ĽĐrőŐ׺ 9ň™SP;ţüío;xđ`~ŐŞý‚J_r JDŘ§Ś‰! ›pDZŐwíÚĄ ­$( ů±""˙ĐW_}5cĆŚh‹'±Ć?úč#=ŮśźE!‘M]ĹkH*Ť|T7D^AźR–żĹ¶ęxP˙! XsÓ¦MŰł§:*á`8&ą*ć_G;7×W ©˘SŔ)äµPŤäeÉ’%N~„cG3BŤZg đüءěG@Ŕzfś={–U#GŽÔÓ‚žáŚë¸ě«WŻţěłĎšaúŚo­^Cz”#Ě@ČČź=¤Ź˛ťřU”öŹ?ţřŢ{ďuf‹%&âŻrřđáÚ„+Lž<ٱşĚ}¦ÔúD]PRP! AˇäWPlҢl%@” ‡IÄsý3ëEÜZć…­XÝT9sććÍ›ó× Ö·˘6ˇAţXÜ]6™Z“Ň,ŽÁ Čý… Sˇ˙ů矏ýNBJnp7=´[ ,Č˙r˝H˘« ™¬[·Ž[Ă^á°˙”©Ôáúé­·lĹ&ŕeDĄBÚIĂ˝fĹŠU˙ůχůgâ&’s„Č÷Mî gÎ|çňąsçNˇżąţżŢ|óMT%îJű_K©ă_ ˇ‡=‹‘"Ş`a4ÁÉÜW§-îWľăÄ|„ľŘÔŽ+•‚ôWH”Ú/^ůÔéĹ™ä‘G–Ür‹Ícě5×\Ăëä“‚~PL…ˇĆ”ě‡÷Ţ{/݉ËÖ/ÍهA˝G˛Ńťů$…8Nfô¸,$Ü1"© )ČĎ,‹{ĽňĐeŽ YĘ3$4}°ăĺ4–¸‡3zUĎ?Q*6´"n¤îłgĎ;sçŢŤ#®“X¤‘ĹAć>Ĺ w=”*#ËŁŹŤ>lŘ0ţ;_µd°2`!ď}›wux T:@á@ăéÓ§_xá[qţ Hµ¸íłN%a‘©5 )(żđ•9ĹŐÚŰ*˛RPuLŚÚ2ťć‘)€¦ÁňŹôUů/(BÄńă'ž}öą©S§ł„4„Sö¤žE'däę .¸`čyóć9ź”As5d(:%Q×h—µÜžp¦› é ‘ş)3Ňë-Z$Ěřĺź©–JË€Č/”<©ŁÇ¶ŠM˝?ţřă6zâŚţ)ą—Ä î)ud¨s’ŰNb…­AÓ÷ß˙xöě9ëŕ»ďľw¸|晵wŢy§¸PÂsÖ•MőŹ+©PžąŚ™µpá—_~9˙?Hnů»˝ ®YłFô‘DCbÄ5µxQüJĺ˛ĐM4 *âŁîކ†_ţłý†BŔáĂGp°aĂ‹–Â+ŻlölŢüŞĽôj ÷ ‰+ł¤˘źćĎ?˙śŰ[¶lŃmëÖ­7nÜ´i“ŠÜc÷ďß?¸?®QJş=©Ô˙ćů#GŽ8M:I;k P8@INܢ–„;{öěGyDpąťżďÄZĆT÷íŰÇ*¶1’o)™ÍH•ük€HAmÚĺQz"8g  DŮcnu©äó ¨˙†}“” jb}Öfőąď'ĺZqĄS‹ŻĘĽćk܆ŇYٵ‚T˙ÖŮX đhaoÝĄrĆ,FĆ»ďľűĆoŕرUĽd yćСCÖeŽüzFD=B‚ŔĽŞÄ0µŠ°_™%¤ý˛HϢ‡ZĆ]ĺ—%™oé4ęx®;<B^ă ń îYĄWő(OIłžĄ‘é¬*í R‡Ł2©ßúTâOę =^ô‰W#¦E˝ŐÚ4‚4ä5"i×’Ć´ÄŻŇ8čYă&ôi¤Şů7bí¨@óą ,ýľV×h}Môl†©Ů éŃ‚Kµ˙~Ds+š-ö7j4ćЦëĹÓó« hDŰĐ]MżK#Ýšaj¤ep4ÂżŤşKŁéׇ¦µFcî hşÖhTÔ¨NAż ŤŽ!Ł]*7/#ť šÖMSšĎWŤŢ‹Ń|«ŃnÓihhdúđ« řťh†m#&Żíh>˙J'˙{h¬iAóáW˘ţßĐE?\±Ô|îâW˘K@‡ŃMAá N¬LShŢűĐ% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@GqáÂ˙˘k™3¶L IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/microsoftonline.com.png000066400000000000000000000202341361462701300321440ustar00rootroot00000000000000‰PNG  IHDR€€L\öśsRGB®ÎégAMA±Ź üa pHYs  ŇÝ~üAtEXtCommentCREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 °EX“tEXtSoftwarePaint.NET v3.5.100ôrˇľIDATx^íÜ‹»VÓöđýŻžăŇ…TJm]8‰RRŽ[§ă\ş#*DEBW:”R"$I!ú}Öú®=˝íw·Űčś÷ůń~źőĚg®ąćsŚńťsĚ9ß.=şč(şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐa\a~®ŃĽt1\yšZCC7u˙]ş Ⲹ<uV˙ŤqěpY\†€D?hš† "?ýôSóŇĹ%pIt,HKóą ů ĺ•ČůóçÓ8tDüĎK ‹ŕŹ5TŇŇ|nCżyŐ™`¤†Žhűó`°$ß}÷]ęçÎťS PáOaK%ĚEö‡~Pž:uJ»Ę™3g´čźvĐóűďż/Ż*\’áčÇR™Ľ…‰Ô•4”Ň'4¨DU”ٶ•‰Tţ<¸Ě& gĎžMĹĚU ë€hý$Ž‚ ™éZň5Ťô;věŔ‡:qâD­e5Ěź mÂeb ÍéÓ§Ź?.v¦đ€ÁoľůF‡ä–" ę¦9VTöďß˙đĂß~űí7ß|óôéÓď»ďľ-[¶|ńĹéIIŘúó`° *·nÝ*Rwß}÷ś9sîşn»í¶ŮłgżôŇKeĹ`B@q“WlܸńĆoĽúꫯşęŞńăÇŹ;öŻýë#(ß»woDDęŹţ4Ţ×HNřňË/xŕ!»îşë† vý Xşt©ţI)QB°ÂkŻ˝ÖŰŰ+ú'NĽé¦›FŤ5yňd|¨hyě±ÇŽ=Úπʠ?:." ń»ZL˙·ŢzkÚ´i×^{mw)ÜpĂ xňÉ'%"‚"^«¬ŇW¶Ů… Šľ‰/îT ˝účŃŁÉâ@FÚ´i“žÍŘ5˘áŹŤÁŃ\±b…\!^7nÜ8Q€ĺË—űí·TeőXa–+Ä”P5fĚ˝íPٰať¦¸•Yhô”©Ę[őř¬’îŰ·OŢ5}!SxĆŹź0aÂ$Ąy\7›ŃăÇŚąqٲ'OžŠJ·`ÔĄř©S§FOaB “&MB‰ĄđÔSOá;fü9ŕ Ľ űŔy·0Űf”ŮZOÜ ýŃG†Ź8Z±bŐ·ßžĘTh;|ř° Ŕ"ůČT82e ťŃléPľjŐ*;vmŐ/¨W*ţ¸€€â˙gź}¶hŃ"ń2[ła V{ôó ŔłrĺęÓ§Ď&h}K«şEýő× ,>|řŚ32÷MůŠĚ 4ÜdëŁu Ţhů˘! řÉgÉǫԱcLJËLĎl›ő:¨â&â…<Úĺ˘U«Ö  ¬H4•۶m3߯ąćšľT6Î:Pq 5Ä?˙ůO«$ýűˇŇňÇE˙M¸Lş“'OÚQ]¤ĚYĄzŤ*Đ"ž‰źč«č’pę”»Uż¬€čĨ$#ˇ ·é?räH{/h±Îţýď§[?4*ÚĐ|ţ˙COcn›Á=Ą©őłX·ˇů÷ˇim%@ĐS/‘r§•÷“©A ˛ŕž{N›6#ë ¨ @ –/_ŮoÎu1EŮp‡r¸2ĺŤ>účŁ'NÚ ­f ŽĘ˙oŕcAÓTă—=ŕÇúgduÓđóĎ?wű5ým’¦ż¸ă@ş0í—,YzÇł…Ű“Ą îĄÉ@'…ŃśiXÉźJµ¶ ´ýf$íh>·ˇů=gDG%xµm>÷ÜşŰn›yĂ >U)HEY/j“pksŁ$aŞĂUApËR)^3VFŹ­" š¦>%Ĺň@Kľ.Óî"ž˛LP÷U7őô×'ŞňZdŐ‹ÁpćĚÝ|J‹nJ-E[ô(I¤’©ş5 âMłҦ$|üřń•+Wšň2ľ˛Úw¸^v…­[·Íś9Ëť«ě˝“&9ĚT Şť('Ë´X ĹyŻľĆÄÖ( ýK·řD=«öů˘ź¸µ':Í{}>Ö’>tęÍ*­Ý@{”«ë/E{ͧâN~ Nť8°!Ę[µ™é©(ă zîÜą˛•ňÇŤËTĹąĺÉ'źÜłçť©S§Źí,_mŮ ęĘŔ´V€‰lJÓ^zćµŇȖž*”Ď˝‚W ":"•Ř%‘ˇ®bJŁn‹’XŘo¸tĐžţľB1ŻđzćUł‹&eß§f)T)ČgĐŞ·ęBtË-·$čŇ’´8ËżýöżÍ}o‰~NAÖÁĄ€xe G[ĄO1×'ŻÜŕÎ?ĹŤmÍKźµ* 4ĺ|đÁćÍ›ź}öYçÝGűđŘcŹ-[¶ěąçž{ýő×ß}÷ÝŻľúŞěIˇÔÓŽ-śaln;ÍqĐSŇGűÇĽ}űvú׬YóÚkŻíÚµë?˙ů%şůZŇře(K˝¤#”ür Š:WÖĹ‹ %XÉB0ýďĽóÎ#GŽXš…^ÚIôëüsÉ@gôřá‡4?ôĐCî\ţ?üđżjh&bńĽôůä“Ůłgľ gŤĐ F÷ÜsŹÓs7o~µIčéUáOB©i@˘|÷nK§˘.«*{{L7 Ě)–@¤݉{ńäčŃŁF!{ŐUW)\‹@Ü…X¸3÷ĹZĺćIS|Ň.e5đEČ”®™LĘĚË(Ńo- kq?®±9ěرĂ%iőęŐ†¦$^đ Oq "hp¤źý'OžÚ°áĹŢŢ©×_/ÇTůŁÚ„}đYRCEÔŐŁW0Tr$nJ2-č!n§bń-7÷3ýµX :Śşîe•nŞâżěśVĺ… W óśÍt˘dáÂ…ćÝÁó73Ú$OVi—ô—,YÂS˛4X”ŐćXoŹF•ÔŤÂ0:c=uęT×çQăJú¦‘«K …ďż˙ţüůóEßÂ૸gîĘB^«?”礵@0Ë`*0¤WŢ M.1Ö“˛Ž„>ą(‚í(SéG@)5ŞȦż‰©„/ľřbîÜąNę "îôdzŐh{\ąrĺM(ó:e*ľâĆÄ5›C}R„OłCý”§4„JP28łŢíĚ©ÔŢqĘMůcÇŽÉlĎ<óLNíîç\«eťh›ß.qE0yň”ŠçKşx(ÜĆË0€€ŰożÝľĎJĐ“W…Źx†€÷6ßT@3OâUĘ~cE ¸ôâ‹/–e®”:ô·ŘM´,yˇt~łË…x™+J-PkjęľŇ/jbçržżÇ—ÎJő~$O˛S@RújŕűСCu`ŞĂľ˛Ś"J|‘Q5:8ţvőüd‰©=AŔ*ŐÄáUx2lFRq Gi´Ç>›p}¬Ö3Ł"@g„€~›p;,ά/{—ŇčN>nˇ&H‰”şčłÜbĎ/‚[ÖMˇSń‰at"Ui8ŻÚ‹µ© 饆S2[iĐü vÂS# ô °ë6@ă9- ™ű˘ŹŻ9őś˙á§•ËW9¨ĺ¨`Cs€smąáúQ“'NÚą}ÇŮÓgÎ˙đăĎçşđóeV÷[W€2A`¸@ňüĎ~Úą{‡ śÔuŁťC´…Śź0öĆńc3~ÂÚçÖť>{†@dÍ©żöšěďtQ9`ń2Ýp‰N(‘vÝKIED%‚­ĐR CúôCÓőÂ…§ź~6ÖUÓ‹§rEśµ˙Íž}—«¬¸CH˝X!*=ĘŁGż¸˙ţË‘?ó5Ă„ŰŔĽyó{>;rtîśy#‡_'č.“ůŮÄYbĚ ŁçĎ»{˙‡űýź~<Á(5ąü—¨Mo~Ĺ=wî‡ÇrÄëŘ2bÖŇęŢ·oź(č,FTϸ­¨C40Ş5h:÷# v­:°×«wĽL˛bĹŞŻľúşŤ®Ż©nďŢî¸c¶pŃCśÂ¸ ’™$=۶ľ!ôWGćDßj¸iÜř5«Vź8ţµ‰/ô?~˙Ăŕţ•" L˙/ľ8vűíw €Ű†`}0ýe3lj+żH‹)ăŞÔ:~UiŞ „KÉ«ž…8kÖť;wîÖůŃ—â*ßŕôéł›7żšý6±R§MćáŽŢu×cÚô];vVq2‚‚ű>;QÍ*Î_L@%7(dIE|Ďžwb1ý! ¨Ę Ćr'Ú»wŻE¶Aő"«,¨#Óú\ڦs;5ĺŐ:@Ŕ}÷=đÉ'źęÜhi(Q~óÍ·._IžÄiËH +K—>!N=B?üÚJÉÇ"Č&v‚<´čł#ź şä#îID—%`ٲeý@šGvíÚŃ· W‰•HĽŠ’çž[çä@J(«0Ô•őë_°T yZŞäéyđÁ“ýĹ="­§±š÷––4źÚ÷eÖ._ľňĚ™ďř×ő‰5/ŞWă›Ý˙úףb•ĺkúĎň¨oÚ´Ą"`Ř5ĂĺAżyŇsJ4l~e“í·P*C'@Yt÷ŕD6“zٲfJÎ -U*,‡U«VÉ?­±&• ”Ć!bpŘÉ áăľC@#0ôůôÓŁ÷Ţ{źü)ô´‘ĄÄÜǧ”vŠ€áĂG#=âˇ{Ť‹OąÜ‘ĺ@TIůJs†3‹LźH§ÇIÜýžIFÉÄW¦’Ф *+.Ż| ŇŇN@Ƶ›oî}óÍí K«H;ŕŕÁCÎKbEĽ/P•*ľhś>ýV QĐ#I…©ŕŮń.?ë©\j(ýßQŔőPÂ5VBŻ[™"î_v`7»22ч’Ä â¨4M‡>H{?Śn\Q¨iÓfĽóλ.ÚŠT+´yöíűhćĚYTO^jł™;bŕ±GzííťjŁËJ!0uęÔüąĎ€h'@ôĐz ę+”­çwďŢ™>,o))Q®]ű|ąŐSů<.ü;{ dÁęOHŮÜżvěŘQűű» i)d^ĆÚÄÎéÖČÔHKPŢřxĆŚŰr‚ČÔQR+ÎÆŤ3g®[‚n=ZsËČx*‹/>räHěĐJ€çŠ@„KřúëŻďągaNz–XŃJš>}úÎť;ă˙€ çWˇô# °.”S§NwKçVD°>üp?Â$®Lťoş+m 8vě¸n>IÉS¦Übwţá‡&ÇµŁťë8Vh' ůçW­R8qâ„‹"·‹…ú«ëś‚¶oßž!®J׬y&†ĂÝc* `×®=ú6Ń"Ř m|°ďÖ[˙†ËhP˛?ĂŠ čé)q´4ôv; Ůo€V iĆŇ«Lp‡H@1HŮJýBOĘNđÍ7ßĚť{7·–ţž —“_}őŐtţÍG}h %^y z¶Ć§ëCít…ýűÜy籊ÍQÇD· >|Ämą'TÇ7Ě<őÔrXňŤú‹ˇ˝üGDŤdĺeÁÍîÝúÚ¸šĺžÝ;o3ÖS_ł«?ąÍťĂĄOůüÚu9őfVž:uĘ ôÇ<¦Ń~`H«®Áůő-0hA3t jó+4=j4M šž­Ę=­)¨DąöŐT>ţřđüů ň;ŠGˇÉ¤D/Ţ}÷ýjŽK´cŘ1kűöťňůĆŞŃ´ŕ‰qC$`ěhwŞ‹PA€˛ ”„”çÎť[˛diĆb}=DU±cŐ·ąqŹ>ú¨}˘~…ÄÚmNKĐtjCcěĎVŻ~ZÔ’¬ă đyZ7á‹Ő_„ňÉ)óÁ9ĺł™8űĂ„ U|IÝz2F¸˙ţťŤ"ßŘ[#-A;Q:D<)UqB€ĽÖ©ú)Ôeĺý÷ßď _jÄ64ßj¤;c7ÇŹźx≧$Şb|AĽ°ČÜrNź>[ŕŃĂă0žĹŐş ×Ú~Á˙€âIDoĽńĺF1ś!ň×ęq«? čííÝ´iÓ€ÓŞˇűĐ4ŐhúŐhš¤ç% 0GpŮDCTť={N<ëČTHš ĽĐrőŐ׺ 9ň™SP;ţüío;xđ`~ŐŞý‚J_r JDŘ§Ś‰! ›pDZŐwíÚĄ ­$( ů±""˙ĐW_}5cĆŚh‹'±Ć?úč#=ŮśźE!‘M]ĹkH*Ť|T7D^AźR–żĹ¶ęxP˙! XsÓ¦MŰł§:*á`8&ą*ć_G;7×W ©˘SŔ)äµPŤäeÉ’%N~„cG3BŤZg đüءěG@Ŕzfś={–U#GŽÔÓ‚žáŚë¸ě«WŻţěłĎšaúŚo­^Cz”#Ě@ČČź=¤Ź˛ťřU”öŹ?ţřŢ{ďuf‹%&âŻrřđáÚ„+Lž<ٱşĚ}¦ÔúD]PRP! AˇäWPlҢl%@” ‡IÄsý3ëEÜZć…­XÝT9sććÍ›ó× Ö·˘6ˇAţXÜ]6™Z“Ň,ŽÁ Čý… Sˇ˙ů矏ýNBJnp7=´[ ,Č˙r˝H˘« ™¬[·Ž[Ă^á°˙”©Ôáúé­·lĹ&ŕeDĄBÚIĂ˝fĹŠU˙ůχůgâ&’s„Č÷Mî gÎ|çňąsçNˇżąţżŢ|óMT%îJű_K©ă_ ˇ‡=‹‘"Ş`a4ÁÉÜW§-îWľăÄ|„ľŘÔŽ+•‚ôWH”Ú/^ůÔéĹ™ä‘G–Ür‹Ícě5×\Ăëä“‚~PL…ˇĆ”ě‡÷Ţ{/݉ËÖ/ÍهA˝G˛Ńťů$…8Nfô¸,$Ü1"© )ČĎ,‹{ĽňĐeŽ YĘ3$4}°ăĺ4–¸‡3zUĎ?Q*6´"n¤îłgĎ;sçŢŤ#®“X¤‘ĹAć>Ĺ w=”*#ËŁŹŤ>lŘ0ţ;_µd°2`!ď}›wux T:@á@ăéÓ§_xá[qţ Hµ¸íłN%a‘©5 )(żđ•9ĹŐÚŰ*˛RPuLŚÚ2ťć‘)€¦ÁňŹôUů/(BÄńă'ž}öą©S§ł„4„Sö¤žE'däę .¸`čyóć9ź”As5d(:%Q×h—µÜžp¦› é ‘ş)3Ňë-Z$Ěřĺź©–JË€Č/”<©ŁÇ¶ŠM˝?ţřă6zâŚţ)ą—Ä î)ud¨s’ŰNb…­AÓ÷ß˙xöě9ëŕ»ďľw¸|晵wŢy§¸PÂsÖ•MőŹ+©PžąŚ™µpá—_~9˙?Hnů»˝ ®YłFô‘DCbÄ5µxQüJĺ˛ĐM4 *âŁîކ†_ţłý†BŔáĂGp°aĂ‹–Â+ŻlölŢüŞĽôj ÷ ‰+ł¤˘źćĎ?˙śŰ[¶lŃmëÖ­7nÜ´i“ŠÜc÷ďß?¸?®QJş=©Ô˙ćů#GŽ8M:I;k P8@INܢ–„;{öěGyDpąťżďÄZĆT÷íŰÇ*¶1’o)™ÍH•ük€HAmÚĺQz"8g  DŮcnu©äó ¨˙†}“” jb}Öfőąď'ĺZqĄS‹ŻĘĽćk܆ŇYٵ‚T˙ÖŮX đhaoÝĄrĆ,FĆ»ďľűĆoŕرUĽd yćСCÖeŽüzFD=B‚ŔĽŞÄ0µŠ°_™%¤ý˛HϢ‡ZĆ]ĺ—%™oé4ęx®;<B^ă ń îYĄWő(OIłžĄ‘é¬*í R‡Ł2©ßúTâOę =^ô‰W#¦E˝ŐÚ4‚4ä5"i×’Ć´ÄŻŇ8čYă&ôi¤Şů7bí¨@óą ,ýľV×h}Môl†©Ů éŃ‚Kµ˙~Ds+š-ö7j4ćЦëĹÓó« hDŰĐ]MżK#Ýšaj¤ep4ÂżŤşKŁéׇ¦µFcî hşÖhTÔ¨NAż ŤŽ!Ł]*7/#ť šÖMSšĎWŤŢ‹Ń|«ŃnÓihhdúđ« řťh†m#&Żíh>˙J'˙{h¬iAóáW˘ţßĐE?\±Ô|îâW˘K@‡ŃMAá N¬LShŢűĐ% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@‡Ń% ĂčĐat č0şt]:Ś.F—€ŁK@GqáÂ˙˘k™3¶L IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/myspace.com.png000066400000000000000000000166011361462701300303760ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢ pHYs  šś OiCCPPhotoshop ICC profilexÚťSgTSé=÷ŢôBK€”KoR RB‹€‘&*! J!ˇŮQÁEEČ ŽŽ€ŚQ, Š Řä!˘ŽŁŠĘűá{ŁkÖĽ÷ćÍţµ×>ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹF¬IDATxÚä›yW}Ç?ďu÷Ü3{ź’Ą•äŐµ*YBŮČ28`Ůŕ 6UĆnŞR„¸Ę&I…*EUţ!&Tĺ„TˇL„]ˇlB0×Ú1‡-˛±…Ëş¬cí˝ł»sôń^ţčž™žcµ˛#—6•WőŞ»gş{Ţď÷ľżďďxo„Öš˙ĎMÔ} ÉDŚŰß˙i°Z^)›Ěő‘Xf§e}==˝–§Ň„”LNLčąůů1ĺ9żńňăOuµČQ×ÎňâSsćĚ”RUϵ/ŃZc€O[-Ű>ŰŢŐý děZ!†¸B-ëMut’h(OvĆ oúűLľpż!ő©Zá"Ŕ2ŕÖ;ďÝŐ´îßttt«)=şZ"4§-1“xT"„Xäé«ÔB€,Řů˘Çä¬ÍÔ¬CÎXöřŻ>÷ˇżüť±ń™ĹŤXÜ´ďľwtmüŔ÷ ¶×ÔŮl˛ve’TÜDJж‡m+\Ąaąđ‡)%S‹J¤(­)ÚŠsŁ9ÎŹć1#qrŁţxđÁĎß??7SŻ€)xÇ{˙pSŰćOýzaaˇµŻ7N˙Ş4"PđLÖad"ĎĚśíx¨eFR€iJŇ “®¶8- )†Çó=ťĹЦ™?˙“ţꑿřŢLv®˘Ó4xç-·E:®»o0[íYÝeĂę  ±]Í©ósŚŚçńH ±|ŕ2ŤF)_޶L„ő}R  Ťĺ9r:K<™pÎţëÎÁ=pÖq5F˙zÖ÷÷±fëűďšöVßŰ’ ¬kBMˇ¨xéřŁ„ôµ\ůµeÖ"ÁÜĚç\Ʀ ¤“&±A:a˛sĚş‰L¦5WŻţhôâF:ťdű¶f1}ă×m/Ň·qmŠtŇÄő4/˝2ÍÔlÓe®ůżŇ…ÇULÎio‰‰HbQ‘‰’kŰâÓßť›ť3»»;‰¦{ÖĎ:É7'ăĐś˛PJóęđăSy,S˘Őňv}‹ň+8?3ËuZH'L:š,†&ś¶Öću7uv¶ď7ÓÉÂj°‘ěM™X† Wp9?<Ź@Ł®’đJiжW¶éĽŁ–a×DŽc“9¦fât¶ĆiNYś»hăZ™íÝÝ]űÍT*…Ft*ĄIÄM09S`>ď`u…č^)đeR"ĺâ÷ć .éd„ßÔɦµÍ¤…˘Ç‰łYž?6ÁřTDĚD\¦\W3:‘§Ł5†e ´V8®×™Éd„ŹÇŃZÇ@Ź´ÖLĎPZˇ´ř_şg_ů˘K2nŃÝ \d>狚R Ń@iČ\n~K/{_?«{Ruďś)°˙ŃÓ<ňŘ«X–Ä˝dh®™™+`;±¨Ä”ŕy*‹ĹLłĄµUć=OzJă)Ťçir­4J,ťH( ®«@€iH¤H°]…”‚»ŢµŽ[wŻ §=ŔčdžÁCüÇĎÎP°="¦DiX(¸|ä=ý|úÎ ‹ţf{sŚ?ş{3«z’|ý;‡‰DX Mˇŕa;¦!D*iE,ĂÔJˇ „V­5Z+\Wˇ•f)ä‹‘¤·#Ňš‘ńJkbÇÓ†ŕKźy7\×Yő\_oŠOݱm[ůâß>Źă*ŠŽÇÍođáöŢ›W32žăž$7/­­ń”ňóĎkǦ|şňJi”ö‰O)U‰ůĚ|ľŕň¦v>}ç&úW7ˇ5>1Ĺ?|ď'Ďfń”ćžo©>Üvtđ©;6đ×ß>D&á“wlxM&öűďéçń§/0>UŔ4ĺ% ”oŽBREě˛äß•R>”öí_-ŢóE—kűšřË{w±Ąż•hÄ 5ŘąĄŻÜ·‹ć¦(m-QnŰŞ%…xמkhk‰±q]sC›żTKĆMŢş­›|Ń˝äxKÝWD0Á(„źűħ´‡ÖţMhś7F€í¸ÜqËâ±zču´ĆŮ»{%‡ON‘JXK ‘™¬ęMŃ·"ýşvýš&?ř)'fş!´ĺ{´V~ô(JŃ­öý®cIKŤ»ŘöšK xuoŠXÔĽl!,Ó “´^—1 $(@ˇQ,ŤzX>_˘TńaˇU`LăŰö.,:¨™9›óç}%_†'žČ±fĺëCŔBÁÁő4Ęφ*Đ•śĄÄZé2 *â€ŇJ+4>[6ěJů$‰ć‘ÇO7ă*~zŕ<§‡˛:1इOMsâÂ,'/d_—ŽśšöǤK( ¸zકŇhTĹĚË‘˘ضM>źG„ď;KŃZű×bcQ_ć+ßú 3sĹňË.NĺůÂß?Ç‘SÓHCr˙że!ď.:řBŃăk˙~¤ŕĹ“śš{MÂgžx~„%¤PűG@ ]ćŤE!$BJlۦČkězËNqqŇ}ëSĎŚŢŇŐ'•pn8KÁV¦Â©Ť^.†ŕ×/ŽňŘłCś<źeđ™ Ü˙Ŕ!ž=Sä¶ëW\¶ţîˇ#üň7#DŁf0a”' B „”~ŕş´7LMNńÓź?OŚÉ#k{ŐĚR%Řs\˛Ů,GMŽýöe¦łÍí­¤›2$’ "Ń(Ň€Ŕń<\Oq÷»×sŰîkčnK 5ě˝a%Źüâ,Ď‹$â&ĎçCţ;6µł~U'Îgyţř$ y—DĚÄÓ‹šüüŮaţf˙îýŕŔ’Â?4x†ď—g>;Çěô,žS`eK? ):6"(nˇz8RJ¤”xZ“›_ WČĂđ(FÄ"žHH&I&Xń_ýÜŰŮ÷öľŞA­»&ĂŰvôň/˙yśŻď?‚ah­éLůńę|É„ ťŚÍ9]EÄ”ľiĹLţů‡Ż04‘ă3wldmoşA.Pä[˙u‚ý?=E$byż‹]´Éç äXĎ‘ĎçqŠ6x(E4f! Éa‚p—Ĺ ¤¦é—…ÄSšůůćçs0_äĎîŰ['|¸}rß^>;ËcĎ ó…Źmăöݎ9©łßG\ŕ>ÎdÖ&·@kRÉ(?~f„G&رˇŤMkšHÇMćs6GOOńäˇQÎŹĚb …mŰ EŠv×vĐžW]¨5 ż†§ÂđeÔőj€(IÔ•JçA-Lđ ee+÷||÷’ýěťůříײymkĂď3I‹»Ţą†¶tđŃ/=ơWÎcĹL<ĄČĺl y‡ç^€¦¤EĚ’,äŠLĎä _C@̢\±%ˇä"ĺ:Ş„.˧à ˘Rô“˛ňBRŠë2ĐßEOçŇ>{uOć˛luwŠo~ţFŢúŃď2öę<Á[¶Żŕ®Ű6qÓŽ•¬ěʙ؎ÇĹÉOćÁźăgOťOAÔôťź ˇk‹cŞ2"4ÉU+Cĺ/e™> 4E®xőg}__ü=|ĺOňŐ?}Ľm#RÖGPmÍ 6Żkçż·•ź=y†?ůÚă:2É(H?„÷gV•|a¨HB@ U#ý %$”Ń ŇĹ•oźŘ7ŔÓ~”˝{SCákŰŢÝkřĹ·?Ěľ[7CÎ Ći„ŽFeË2ĐdĘʇ„/ˇ „0Ţ€–NFXŐőÚÂáćt”˙joŰ˝ nE°p—  Ş KK«Ő7ČšYM$ˤŢ&ßúň»hiKů<¸„*ĄşdˇŮ{šýđ‹—Y[»˘‰{îŢEŻF‹@™óĘ&@µĐ’ĆDzpąµŹď Ý–¬¬ŠT!ąFđĐ$V  @Ôząl°ş'ĂŽÍÝŕč걊X‡€PĂ”˛Fř{.Ƕe]»źűÖ’_XJ5q€ V«\…¨ ü|aą¶ö¦XEřR¨´#”QPu°ě…„x„§&¸ĺžG|ßQ6ż»EŹ÷˙Î:îąsËŐÜ)QŽ˙A‚T e5•Q …CŚOM &AC29g3řä«ő ’ú×´\Ĺť"5ČŐA™HPo)›ŐP ÖůÎŔ’f}˘pH4b]]”L@•ň€@ĺ1Ş*"—ĺ*˛(ążh×z…Fn1l&WsëHÎŞBt%ß/'~!¨¶ç†3,k„•5‘Uő6’«‡€Rb'C»Yd Tyş8@T§ré,qY„Ęa÷­¨0 ÖdÔŢľ`P;ăU¨!ś ô,­ľ^=/ .ņyÎG‡YťĹ˘'ŮČEÖĄi02Säů“ÓhÝ*»Ë”Ňtd˘¬éJĽ$((Ż|UP VE«f˙˛z $ :0ÄC†AKČ»|do˙v϶+ ‚2 *PĄ1čĐo7 „™˘>&h$H­¨ňµáď©AÁň óExśĺ±«ę1Ô Ó¬Ôj„ Űş Aä®PÖ¦Ôˇr› ŢohÄ•«EČ ĘđŻO€ÂîşÚ Tť‹Ął©Zź+ĺâ^FĎŠ7Č ţ5üE8ߡ&łŁ¨ťýËŕ) A.®@iĽ1 ¨«liźËńż¨Šd>”Ë2jĚ‚%ĽCř×Gr‘ő †ŞÇiš¦aT’8Q»<|"„ 9­7ńµő6Ѩ¦PkňŤ3F]C*!3™™·ÁöĘü#Ą? 0•-‚žö˛Fř×á"kÝĄ¬.®+\\‘uc¨Llo[CJ<h­•”Óő”Ś™Ţ &łOŃŐ§ł-ÁŘTÁ_† ŮLŐ2Zű6*©5˘t¸ ŽÂSaßôv¦†—%]]ďÎ5DbkzŇ(­ź)€†¸éNc㓢˝;u!÷˛#ůĚBŢ!•б­żťź Ö/gĆ©Ď!][7řÁáYžýňˇ`VŞv5…·­TŽZUŇ\ltRţą!4sEHF*鯠``]3MÉEÇăÜxLMo2w2_°µY´]•ŽŞáľćüŃc#Ńëό̱µ?ĆŠŽ$×ő·óâ+S`°H$.S9Ť=ĂśŁ™·« ZQ@hq3,¬®Ţ++Á_$A]P€«XŮťbK_3BÎŹ-03ëĐ’(Žő$ódž/L+™Ëĺ<ŤÚÚ9óß" ‡NL2=W!¸îÚ6¶nh÷ĚSa®¬vť\‚,şÂ†ÓďŃ GBÇH°D1- –é_G ßŘăjVő¤ŮłĄÓlŹOOlm˙eTşçWąFKK ]Ý˝´Ć]™÷¬ CÓÉޱlŽkşŇD#&=m ÚšâĚ\rE/`ČšpąäTjĐAŁÂ„¬ÉĚdőýáĹÝ’­ë’”Ž„˘Á áiR1mëšŮym3Ó@+ĹSGĆłéJg/ŢÜuöźlÇ{éč±c ćČČĂĂĂ kúVťÜÝ{ńűĹřĘ “™®ÁCÜ´}-MqÖô¤čéH2:]`hŞŔlŢĂV ęÖŢťŐ+LÂh1Šz¨‚ĽAżtí2üÍZaˇIE%Ý™+[Ł$َ5Ůů"Ď˝<Á™ y’q§°·űÔQSş83źEd2Z[[ąeďŢT*Ů‘wÄű=Űw÷ą™ćN#&XŰĘş•M4§ŁX–‰\‰Ň ëV\EăĘrٰZ†cötčďxĄť%„˙¤TŤ@ůT…Ćq<ň'‡ć8zn†üś"[Čýnב‡»c űme<ýřăŹMž8qŃÔÔ„mŰlٲ…]×_ßnI˝Ëqő;źďąő…Éî žcI‘0élŽŇ’‰‘Y4Ą˘čÚ\ Qü/e}…ąapÔ@eUiŁ_5j!ĐäňŮ›ůĽĂŘL‘⼠£?yńÂM­'›¬âŹ=yęĺ—Ź *˲ńx€|>ĎÖ­[ĺž={Ú )¶›ÂŰu1źŘy4ŰąůôBsϬOř[‹˛©Z5ęˇ_Ú“c„>7jî-ßoTÂb]böZ–÷Bź‡żôť(Ĺó—„,݉LMlN _ź:¨‘O#­GŹ~â‰'ĽŇ†°şXtÇŽâ†nhúMˇ¶Hˇű žąrÖ‰uä••ÔYń‹k ,Ô$[Ťî­Štuč:lş>nđÍAG„[Čů‰¤,§\ĚĂB—Ź?>988¨<ĎŁ4ń ˙=>00ŔöíŰ#©TŞUJąB z¤Đ-ť ąd Ż/3¨Óő§ŤĘh—Ę˙Ë'ş´[TiDAi1Ł…ő<5äyŢÄÁó/˝ôžç!Ą$ő7nţĎO‘` iúÄIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/news.myspace.com.png000066400000000000000000000166011361462701300313510ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢ pHYs  šś OiCCPPhotoshop ICC profilexÚťSgTSé=÷ŢôBK€”KoR RB‹€‘&*! J!ˇŮQÁEEČ ŽŽ€ŚQ, Š Řä!˘ŽŁŠĘűá{ŁkÖĽ÷ćÍţµ×>ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹF¬IDATxÚä›yW}Ç?ďu÷Ü3{ź’Ą•äŐµ*YBŮČ28`Ůŕ 6UĆnŞR„¸Ę&I…*EUţ!&Tĺ„TˇL„]ˇlB0×Ú1‡-˛±…Ëş¬cí˝ł»sôń^ţčž™žcµ˛#—6•WőŞ»gş{Ţď÷ľżďďxo„Öš˙ĎMÔ} ÉDŚŰß˙i°Z^)›Ěő‘Xf§e}==˝–§Ň„”LNLčąůů1ĺ9żńňăOuµČQ×ÎňâSsćĚ”RUϵ/ŃZc€O[-Ű>ŰŢŐý děZ!†¸B-ëMut’h(OvĆ oúűLľpż!ő©Zá"Ŕ2ŕÖ;ďÝŐ´îßttt«)=şZ"4§-1“xT"„Xäé«ÔB€,Řů˘Çä¬ÍÔ¬CÎXöřŻ>÷ˇżüť±ń™ĹŤXÜ´ďľwtmüŔ÷ ¶×ÔŮl˛ve’TÜDJж‡m+\Ąaąđ‡)%S‹J¤(­)ÚŠsŁ9ÎŹć1#qrŁţxđÁĎß??7SŻ€)xÇ{˙pSŰćOýzaaˇµŻ7N˙Ş4"PđLÖad"ĎĚśíx¨eFR€iJŇ “®¶8- )†Çó=ťĹЦ™?˙“ţꑿřŢLv®˘Ó4xç-·E:®»o0[íYÝeĂę  ±]Í©ósŚŚçńH ±|ŕ2ŤF)_޶L„ő}R  Ťĺ9r:K<™pÎţëÎÁ=pÖq5F˙zÖ÷÷±fëűďšöVßŰ’ ¬kBMˇ¨xéřŁ„ôµ\ůµeÖ"ÁÜĚç\Ʀ ¤“&±A:a˛sĚş‰L¦5WŻţhôâF:ťdű¶f1}ă×m/Ň·qmŠtŇÄő4/˝2ÍÔlÓe®ůżŇ…ÇULÎio‰‰HbQ‘‰’kŰâÓßť›ť3»»;‰¦{ÖĎ:É7'ăĐś˛PJóęđăSy,S˘Őňv}‹ň+8?3ËuZH'L:š,†&ś¶Öću7uv¶ď7ÓÉÂj°‘ěM™X† Wp9?<Ź@Ł®’đJiжW¶éĽŁ–a×DŽc“9¦fât¶ĆiNYś»hăZ™íÝÝ]űÍT*…Ft*ĄIÄM09S`>ď`u…č^)đeR"ĺâ÷ć .éd„ßÔɦµÍ¤…˘Ç‰łYž?6ÁřTDĚD\¦\W3:‘§Ł5†e ´V8®×™Éd„ŹÇŃZÇ@Ź´ÖLĎPZˇ´ř_şg_ů˘K2nŃÝ \d>狚R Ń@iČ\n~K/{_?«{Ruďś)°˙ŃÓ<ňŘ«X–Ä˝dh®™™+`;±¨Ä”ŕy*‹ĹLłĄµUć=OzJă)Ťçir­4J,ťH( ®«@€iH¤H°]…”‚»ŢµŽ[wŻ §=ŔčdžÁCüÇĎÎP°="¦DiX(¸|ä=ý|úÎ ‹ţf{sŚ?ş{3«z’|ý;‡‰DX Mˇŕa;¦!D*iE,ĂÔJˇ „V­5Z+\Wˇ•f)ä‹‘¤·#Ňš‘ńJkbÇÓ†ŕKźy7\×Yő\_oŠOݱm[ůâß>Źă*ŠŽÇÍođáöŢ›W32žăž$7/­­ń”ňóĎkǦ|şňJi”ö‰O)U‰ůĚ|ľŕň¦v>}ç&úW7ˇ5>1Ĺ?|ď'Ďfń”ćžo©>Üvtđ©;6đ×ß>D&á“wlxM&öűďéçń§/0>UŔ4ĺ% ”oŽBREě˛äß•R>”öí_-ŢóE—kűšřË{w±Ąż•hÄ 5ŘąĄŻÜ·‹ć¦(m-QnŰŞ%…xמkhk‰±q]sC›żTKĆMŢş­›|Ń˝äxKÝWD0Á(„źűħ´‡ÖţMhś7F€í¸ÜqËâ±zču´ĆŮ»{%‡ON‘JXK ‘™¬ęMŃ·"ýşvýš&?ř)'fş!´ĺ{´V~ô(JŃ­öý®cIKŤ»ŘöšK xuoŠXÔĽl!,Ó “´^—1 $(@ˇQ,ŤzX>_˘TńaˇU`LăŰö.,:¨™9›óç}%_†'žČ±fĺëCŔBÁÁő4Ęφ*Đ•śĄÄZé2 *â€ŇJ+4>[6ěJů$‰ć‘ÇO7ă*~zŕ<§‡˛:1इOMsâÂ,'/d_—ŽśšöǤK( ¸zકŇhTĹĚË‘˘ضM>źG„ď;KŃZű×bcQ_ć+ßú 3sĹňË.NĺůÂß?Ç‘SÓHCr˙że!ď.:řBŃăk˙~¤ŕĹ“śš{MÂgžx~„%¤PűG@ ]ćŤE!$BJlۦČkězËNqqŇ}ëSĎŚŢŇŐ'•pn8KÁV¦Â©Ť^.†ŕ×/ŽňŘłCś<źeđ™ Ü˙Ŕ!ž=Sä¶ëW\¶ţîˇ#üň7#DŁf0a”' B „”~ŕş´7LMNńÓź?OŚÉ#k{ŐĚR%Řs\˛Ů,GMŽýöe¦łÍí­¤›2$’ "Ń(Ň€Ŕń<\Oq÷»×sŰîkčnK 5ě˝a%Źüâ,Ď‹$â&ĎçCţ;6µł~U'Îgyţř$ y—DĚÄÓ‹šüüŮaţf˙îýŕŔ’Â?4x†ď—g>;Çěô,žS`eK? ):6"(nˇz8RJ¤”xZ“›_ WČĂđ(FÄ"žHH&I&Xń_ýÜŰŮ÷öľŞA­»&ĂŰvôň/˙yśŻď?‚ah­éLůńę|É„ ťŚÍ9]EÄ”ľiĹLţů‡Ż04‘ă3wldmoşA.Pä[˙u‚ý?=E$byż‹]´Éç äXĎ‘ĎçqŠ6x(E4f! Éa‚p—Ĺ ¤¦é—…ÄSšůůćçs0_äĎîŰ['|¸}rß^>;ËcĎ ó…Źmăöݎ9©łßG\ŕ>ÎdÖ&·@kRÉ(?~f„G&رˇŤMkšHÇMćs6GOOńäˇQÎŹĚb …mŰ EŠv×vĐžW]¨5 ż†§ÂđeÔőj€(IÔ•JçA-Lđ ee+÷||÷’ýěťůříײymkĂď3I‹»Ţą†¶tđŃ/=ơWÎcĹL<ĄČĺl y‡ç^€¦¤EĚ’,äŠLĎä _C@̢\±%ˇä"ĺ:Ş„.˧à ˘Rô“˛ňBRŠë2ĐßEOçŇ>{uOć˛luwŠo~ţFŢúŃď2öę<Á[¶Żŕ®Ű6qÓŽ•¬ěʙ؎ÇĹÉOćÁźăgOťOAÔôťź ˇk‹cŞ2"4ÉU+Cĺ/e™> 4E®xőg}__ü=|ĺOňŐ?}Ľm#RÖGPmÍ 6Żkçż·•ź=y†?ůÚă:2É(H?„÷gV•|a¨HB@ U#ý %$”Ń ŇĹ•oźŘ7ŔÓ~”˝{SCákŰŢÝkřĹ·?Ěľ[7CÎ Ći„ŽFeË2ĐdĘʇ„/ˇ „0Ţ€–NFXŐőÚÂáćt”˙joŰ˝ nE°p—  Ş KK«Ő7ČšYM$ˤŢ&ßúň»hiKů<¸„*ĄşdˇŮ{šýđ‹—Y[»˘‰{îŢEŻF‹@™óĘ&@µĐ’ĆDzpąµŹď Ý–¬¬ŠT!ąFđĐ$V  @Ôząl°ş'ĂŽÍÝŕč걊X‡€PĂ”˛Fř{.Ƕe]»źűÖ’_XJ5q€ V«\…¨ ü|aą¶ö¦XEřR¨´#”QPu°ě…„x„§&¸ĺžG|ßQ6ż»EŹ÷˙Î:îąsËŐÜ)QŽ˙A‚T e5•Q …CŚOM &AC29g3řä«ő ’ú×´\Ĺť"5ČŐA™HPo)›ŐP ÖůÎŔ’f}˘pH4b]]”L@•ň€@ĺ1Ş*"—ĺ*˛(ążh×z…Fn1l&WsëHÎŞBt%ß/'~!¨¶ç†3,k„•5‘Uő6’«‡€Rb'C»Yd Tyş8@T§ré,qY„Ęa÷­¨0 ÖdÔŢľ`P;ăU¨!ś ô,­ľ^=/ .ņyÎG‡YťĹ˘'ŮČEÖĄi02Säů“ÓhÝ*»Ë”Ňtd˘¬éJĽ$((Ż|UP VE«f˙˛z $ :0ÄC†AKČ»|do˙v϶+ ‚2 *PĄ1čĐo7 „™˘>&h$H­¨ňµáď©AÁň óExśĺ±«ę1Ô Ó¬Ôj„ Űş Aä®PÖ¦Ôˇr› ŢohÄ•«EČ ĘđŻO€ÂîşÚ Tť‹Ął©Zź+ĺâ^FĎŠ7Č ţ5üE8ߡ&łŁ¨ťýËŕ) A.®@iĽ1 ¨«liźËńż¨Šd>”Ë2jĚ‚%ĽCř×Gr‘ő †ŞÇiš¦aT’8Q»<|"„ 9­7ńµő6Ѩ¦PkňŤ3F]C*!3™™·ÁöĘü#Ą? 0•-‚žö˛Fř×á"kÝĄ¬.®+\\‘uc¨Llo[CJ<h­•”Óő”Ś™Ţ &łOŃŐ§ł-ÁŘTÁ_† ŮLŐ2Zű6*©5˘t¸ ŽÂSaßôv¦†—%]]ďÎ5DbkzŇ(­ź)€†¸éNc㓢˝;u!÷˛#ůĚBŢ!•б­żťź Ö/gĆ©Ď!][7řÁáYžýňˇ`VŞv5…·­TŽZUŇ\ltRţą!4sEHF*鯠``]3MÉEÇăÜxLMo2w2_°µY´]•ŽŞáľćüŃc#Ńëό̱µ?ĆŠŽ$×ő·óâ+S`°H$.S9Ť=ĂśŁ™·« ZQ@hq3,¬®Ţ++Á_$A]P€«XŮťbK_3BÎŹ-03ëĐ’(Žő$ódž/L+™Ëĺ<ŤÚÚ9óß" ‡NL2=W!¸îÚ6¶nh÷ĚSa®¬vť\‚,şÂ†ÓďŃ GBÇH°D1- –é_G ßŘăjVő¤ŮłĄÓlŹOOlm˙eTşçWąFKK ]Ý˝´Ć]™÷¬ CÓÉޱlŽkşŇD#&=m ÚšâĚ\rE/`ČšpąäTjĐAŁÂ„¬ÉĚdőýáĹÝ’­ë’”Ž„˘Á áiR1mëšŮym3Ó@+ĹSGĆłéJg/ŢÜuöźlÇ{éč±c ćČČĂĂĂ kúVťÜÝ{ńűĹřĘ “™®ÁCÜ´}-MqÖô¤čéH2:]`hŞŔlŢĂV ęÖŢťŐ+LÂh1Šz¨‚ĽAżtí2üÍZaˇIE%Ý™+[Ł$َ5Ůů"Ď˝<Á™ y’q§°·űÔQSş83źEd2Z[[ąeďŢT*Ů‘wÄű=Űw÷ą™ćN#&XŰĘş•M4§ŁX–‰\‰Ň ëV\EăĘrٰZ†cötčďxĄť%„˙¤TŤ@ůT…Ćq<ň'‡ć8zn†üś"[Čýnב‡»c űme<ýřăŹMž8qŃÔÔ„mŰlٲ…]×_ßnI˝Ëqő;źďąő…Éî žcI‘0élŽŇ’‰‘Y4Ą˘čÚ\ Qü/e}…ąapÔ@eUiŁ_5j!ĐäňŮ›ůĽĂŘL‘⼠£?yńÂM­'›¬âŹ=yęĺ—Ź *˲ńx€|>ĎÖ­[ĺž={Ú )¶›ÂŰu1źŘy4ŰąůôBsϬOř[‹˛©Z5ęˇ_Ú“c„>7jî-ßoTÂb]böZ–÷Bź‡żôť(Ĺó—„,݉LMlN _ź:¨‘O#­GŹ~â‰'ĽŇ†°şXtÇŽâ†nhúMˇ¶Hˇű žąrÖ‰uä••ÔYń‹k ,Ô$[Ťî­Štuč:lş>nđÍAG„[Čů‰¤,§\ĚĂB—Ź?>988¨<ĎŁ4ń ˙=>00ŔöíŰ#©TŞUJąB z¤Đ-ť ąd Ż/3¨Óő§ŤĘh—Ę˙Ë'ş´[TiDAi1Ł…ő<5äyŢÄÁó/˝ôžç!Ą$ő7nţĎO‘` iúÄIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/news.onlive.com.png000066400000000000000000000116101361462701300311770ustar00rootroot00000000000000‰PNG  IHDR``ŐF‡ tEXtSoftwareAdobe ImageReadyqÉe<PLTEFÖjqI*§WŮ|7ŻkÄbýŰ·˙ĺ˛ů˙˙V0µd&ô6ĄrKéqyA˙ôâŹjMrrrú̧x8˙řâđŘĹôôôó}$ôţ˙51.SQOŮŮ×Ěş«ł[é„9”””˙ýőe:™X#Ól äŠFýÇ›˙ţűĽĽ˝ŮGëĆ©úúúĘx:˙ńÜţ¨bü˙˙šRĄa)KŹ2˙őŐ˙ժdžWk4¬] Ö¤}áŕßq=ĘĘĘý˝‰ţ#ć¤vâ}4Q*ťa2Űt$˙úőţ˘Y¨©Ş˙úěí{%Ňľ¶ţ—DA ěěë˙üň¶€U”G §j9íśaů{˙ůč¶–}řšW˙ţúÉĄ‡Ër-a[V‡‡‡d,ńsÚgě—VüîäĘ™rňzµX ˙÷đě|*˙őč˙ôÉŮ‘ZĚm*üäÓŃ~@»`Ęj%˙îÔ˙ĆŽŕló.[<"ě§kâsÓŠSţëŰÚu+ćşš˙úńÜoüüüĺ{+«SţăËţůů˙îË{U7˙÷Ý˙ěľÝ‚?Â^˙ăŔ˙ţ÷Ć’k‚Jú‡0˙üď¤Bµm8ţ–{dě¶ţu ůĎ´ěâÚôşŹÄ«–˙zţüúŐs.Ád!˙üřú7ţ‹/ň÷ýăŻ÷­rţ¶}äx"żi*ϬŚGC@ňjËŤ^âѸöŚC˙’8îͲt+Ö‹bÔp"ě/˙°lŽ[4˙ŐťřvţýüĹh"Ř­“˙Áé‘LÜz0µ¬Ąş˘Ź·w@íĂśôáÔßżĄěYőőíř€$”„u˙űÖ׳—ɲźěôúĂ’Zččçţý˙ňwďďń˙ýçĐbüűů›NÍg÷ű˙U#ál!Óx1÷÷÷ëw ˙ߢčk€Lţ‡&Úfú˙úhŹP űýţ˙űüÂp2ţ˙˙˙˙ýţţţ˙ţý˙ţ˙ýţ˙áw)ţ˙ţ÷xćĺä¸p&ŃźwˇSű÷őľNžź ‚_BŔžĘN###-űs"ÍÎĎĐŃÓŃĆ˝°°°í­÷ŢĘ˙˙˙rZŠIDATxÚ´™ \SWöÇCÂ" ‰lH ‚`˘© h!€Dꞏ° ˛(E-{„(ú·¶H¤‹H­…‚hřW¦Z[¦ăLë2@Ő¶iÍKęí¦ZŰĚ}aM€ţç>b>/É;ß{ď9÷Ľß=Ai¦šĂ÷‰ŇĚĎ`:°>Ą’ÉÔy5ÍW…”\@˛ŕ` EBčđôß@ÜĎ@QOy ÜöQ(ą‰‰ąą·nI)PµüµSü«…$ßÂß_¶iŰe777Ź”˝«ýJ| ‚ŕŕj=sNýaÁB‚٧÷Źz¤wo–ćyôčŃđĂ›˙Ř.¬ÎżËTę#ć€n.ąp9'(ž÷࿀=~oddäšQcŃL®îIĄ2Ý€čgHŠýŢŰçQęlQYőb—⬬ÄâĽ¦ŚşşŁ‘-hëĎ>—ÆČ“Í6}Čk¶¨lŹŞŞ)0NKçĺąv¶ÖÔáX-O EBHőZe_ň}Qżf5‡´óxĽqö•Ćžă‡H«¨hąľ]ÁŻȵÝđŹÓç­ĺEńÚăâěŰCÄAmĆĆAAM®®ť¦¦éd Çé(2É eđ|Ěź®NsNúőôi«ĽÚZݶ=¤  Ŕ¸š\;;M[kČŽotöó…^”Ax^’ąŇÓíüůM_¬XáéááůĐÓŁ´Űů|Ą}܇qZBBM y Ł#BQÁ¦6x‰ˇů$»ţznĂĺ˛#G nŘ]˛ŕâ§kŤÝňöôF=ž¤§§“9ŽĐŔ *öşH(QĎ@)ß$9˛Ľ1¶+Űd˙»ććďŢ Nnxďśg@s|Ü™ Ľ< –ăí˘5*Z°Ř·B }΀]żüĎňĺŤD6ŐäÔśÉTŞúdÉĹľ%»7‰ďŤLÉdăM eŮk˛ł %zZ€ą9S=™­¦xÇw±Ů]Tl´ŚˇŮš°š^,ŁĽµŘĹł»»{Kjj*ą™Â@ÄšŠ <žKĄšąđLťrMZjÉŤŤŤeS©ŮźAůWCt eű[—KAAJmMŻ!č`Ť¬˝ąę: $8NíŠ%ƲńÔ˘ýr•ŢcE"‘î:~Ĺó”ëí˛˛tP‘Š T(žËĄvýr+™>=@§>© &T,›MdłńŘcS‡ĂĺVą˙CÓN#ٞV BˇP±äBÓ:CžEwQą€ŔĺbŻS¦K=ŤŠ.8ô4’ĹÁá8`Ť@"…††‚ŻwY ¶OĐY HňyKţńx<őPâ ű„ž›i¶7P÷Ń1`ٱ‹…đ,i*x™`ąČř‰ˇxt‘—lćRxW¶řX “Pćí`Iź(łd˘…ŮX.•Ť7×<÷2¤-äŇC‡Yä„#c|ý¶´Ú0€B˛ĆRą\"¸#´‚k" 6ô¸`ŇK-Q´@”Ź‚HôiŚĺ˛±Ö™Ř @¸4řçâT~łH6!”ÓČa±ŮVšO¨Â…jQí*j H `‘epüŁP(z©šđŻ5}ÜwӽȍŻŕVńěŘXęĘr’!´ ËŮGˇ|||kĘ“őc2E ´śYQ˚؊ 06;ÖÄÖ×@řKŘ4řP­EK&> Ŕ3Ý@ç Že?G•Ťec#ON€ÇóÍEGĆďí­°ôšy8 6˘Gě®@˙’)Đwa×h—¸÷¦)Ŕł–®# GlŞf” gc[¸Dvă´”‹†‹©kB}PČři4ĹáLÁt€ęiä™ŕZQ,h¤Ýß=µTŚĎY˛‘«ččđ¦yc0‡“ű~śŁx˙Qh‹Ćâł±]śöőž l‚÷A4(dĚŽä>ĺ*ŠďŐ–®l,÷ V¦†á‰Ö>@‰Đh9ťłR4gx Š®ggSOń˘Ő°jz€šP´Ć30€ˇ±XśôtÎ{˘ľąźp Á‹ntkŹúR ÓuăűSľÝâłÄ™)çä|`śoa‰G˛xŹĂŞaůôhş…d ‡3mĺ,©ćsJ{»{Ä=y®ž~'Ó?/já$$É8®¦ł“Ľ„đÍ|ćrË#˘xq« XÉät®®µÓ•l;?Sm™Đ^r˝Ť6¶DrLËLëęęZ]]Óm ęy-‘čJ˙%^ŐŤ'zi OÔŇ瑜„2- õ)} a~AŢż9ŞęńŤŻő6Ú€`É1-»Ý™‘šęš—W3?%sui/ęFVŘ›3D–‘¸NHEâÖŐ„yí«űJíŰyń•_VëŐ˘ńs»L`3ş}Űhq|1€ wźĎË I˛H˛”Ď 8XgtŰČ55µ©)Ośú;A=×R lSšC*ł`˝ÎM ˛emąm´ç§Nť ‹·řĎ lŘÖűNUTm€sÁ2H3@-(gußŢ999âŢSđhNĂgš/Účů໪{;;|Jź˘M•˘âđCŁ{~”“ÓÖŰ[RśĎśč†(•}°Öúô¶_0©dŮŤÍÎöń!nű¦>“'‰ëÄăub-  úSŠż1ź ź˙Âň˝qíÍýÎííYĆ{} ‰_Yů•î<+«înäV(|4I¶ÓµOifśđO돏OJʲŞâY¤Ů ŕâ” ±•U[[[@||›™©PëůWK×Lî§eµ[ť±ČęŤâőď+¤”ďŇ%GÓúűŤŤ âăĹĄKHcA—@=¬/XľúvĂ?=ŚsÎô†„Ř?®şŃľĺ¸Äđů*\‘VP`¦ôř˘O]ýź…ľWď˙Ó3­´M|&$¤7îA\|©<Ë1VpmEpběďK1ś‰$ł\SŘH\Đ\PĐ{#®*ľí÷äŮÎÉ”Ěđ1€˝ńV_ˇ>hsä•´&Ł3Iy®Aýâqqö9~Đ4ť©«·˙ńĐ"ÉŠÇ‹‹Ş4NŰ)ťéěQ\ľú!¨XMyAyq÷\ÚrÄ!â^c‚f6쵡?©ňŇĄŞ¨$·}K¦Č÷ź8L;  ŞçÝ»6fNž8é;7?ú¬pe–b\ůřŻ˝×Âyk1-Öu.:`ɢ±8rMş©iMkkkEFFę–Ôsű•†ŞË/ěé­íÍJĘjN)ź,— E 7[Ł>4ŇÁ´¦¦µłsË–ŚšÔn?™Ćŕ Ć=) Ö:;'…ÄWE5żß ĄĐaQ’Ą‡ÎZV°Ci őÉBô2Ťš‡kZÝ>h &‚w~»ľÉ˘2ľŞŞ™e˝"“{ëOÇŠ˛ąkh ź#úXDÁ–•Ą§ăęŇS/”Ŕso©)•˘’÷›jŰŰۛ۟›śýĺŘs4=z:T ćíŤÁpuŞIOhĹŃ„óë:Jw^Ľ°§˝6ľy}÷r,0 ĚŃ\- "Uˇxw KN8ŘšŔYa;SÓa&€’v\ńp«ŚzL$‚0›ËFč#GhÄĽYŽ ‡Sî0IćŰ•K$łß=šBTEcCQ±±x.w¬€ŹOh‡‰ŔD®,ŃçÝů‡>sfň‰­ĆgÎ\®[ţĂDÄ´.ŇÇ@ 4X+Z ĺB!ýőšăJ†ŔwÁ…ŹkݶĄE4‰]l`´„P”Uyr'ĺő»ď˛d)ó@ĘýźměâjŰ„Ŕ´.ŤÎF»F’Ę5Ż€¤"R±ďżRÎť‹ÄÇŽ÷ČkŃF3e6Íd@’ĘÁÁ‹@đ:Ôđ×Í&`3dSµI‹~ţ—·?˘@đě˘Ě €>D"Á+Ó÷ى††ĄKĘôHćŕÝ@©M$sóI=U5ťA %XAssnŞâť©ů?jf=«×ţ4@ó˙ «=żźKÇš=zăBÍÜÜäÜŘ) ®ľ3éÓľľoär5b“g|­Ń¨4“6±\ÓĂ/ŕŻ'_ÓŁŃ„iěôLÉGO˙~xó˘Ń!řěí÷÷>]yŇLKp8=ŕî´ü˙†“ËčőşzwMľ&,Ě˝ŢqČńYćć"w]€’ŕWę±Őß˙“Ó§÷k‹Ł˙ľŤwěظŃÄd7B0Ż˙םÇŰ2>Ş}§Ţ\3ělřC66N|Ç'7ÝüZ |tâ“/V–_8}]ŰrOŮJ"•7<]±CĚťď<04ĎřaHźËeŘ˝şóźuyÍŹW7ßpÓôČ'`ÉWď…/(ţŢÁÁáËŹîďF6ŞóZ¨Aň®îej-ŕDZ}ˇŇ€<ŃFb8YyyôđŞFţ+€±{ÂĐÜ|ÁwŇ @·Ěţ~ü+éĎ`*ß“Îů# 㼞 E@¶ą5» !čqáŻŇ˘˘‡‘™„ G#Ôú!•6´ ŤËĐ ;ť,ú¨Ír‘6甲 Îď‚×µŇę»L:ýNĎZ‹`Ńőů§b¸ ? öp ¸Šáö¬rt˛‰q±‰‰ycĂ_§;ąŕDxů¨p’ínCµKďŔ`5ĽŢT}f˝Łů¤ś 20GGŔstdô¨Ŕ<†€9"ŽĂŻŚť(>ďľ8*C¸ý Ľ¬Ż¤0Ťł~˝D ř۸şĚ×Ä Żi·=ăżŇĽâŻc04 ĆŤřüë± Áx1·—.QŇjŻËk´3 3`D;š›ßťŚÄřr˛‹ZBŔčqŇôôŘ1´Ž‘Ż3ÍĎ·öţď‚[0rŘ·]ᇤ‹Ű2¤ťŚÔÔM›™ůľű»L&ďů=`‰ľ˝Ó†˙jŘ ¬JľŠ¶…ű:wýRˇĽőíŢ+Ws%’/݆ŻÖžŐݶŤ.oŞŤůŰżę]^ľří·/‘˘ŕ26Ő*ľ#˙ #ĚÁîßi]c• ż>LŁŇ«E?˝ąëż?)ݰ­ô‹%#?U=ÝÁdJĄŔ?}ëVdi(‹‡ůZٵ‹~9vg4߉ÁŤýşah>ߦgĚ˙@ţS˘—ß…µË>ý6sDFŮÚŽ..ŃîJĎËuĎţüçgë4vrŐK—›cw>‰yˇ˙ÁÓÎÝĹĹ}ŃxuŠ3˘ç??$ L <3)ľĹ# :اęč Ň=¤\[QUÓ>`H& [XŰ'VÉ'—jŐkë˘˙€ý[€ +žľř=®éIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/onlive.com.png000066400000000000000000000116101361462701300302240ustar00rootroot00000000000000‰PNG  IHDR``ŐF‡ tEXtSoftwareAdobe ImageReadyqÉe<PLTEFÖjqI*§WŮ|7ŻkÄbýŰ·˙ĺ˛ů˙˙V0µd&ô6ĄrKéqyA˙ôâŹjMrrrú̧x8˙řâđŘĹôôôó}$ôţ˙51.SQOŮŮ×Ěş«ł[é„9”””˙ýőe:™X#Ól äŠFýÇ›˙ţűĽĽ˝ŮGëĆ©úúúĘx:˙ńÜţ¨bü˙˙šRĄa)KŹ2˙őŐ˙ժdžWk4¬] Ö¤}áŕßq=ĘĘĘý˝‰ţ#ć¤vâ}4Q*ťa2Űt$˙úőţ˘Y¨©Ş˙úěí{%Ňľ¶ţ—DA ěěë˙üň¶€U”G §j9íśaů{˙ůč¶–}řšW˙ţúÉĄ‡Ër-a[V‡‡‡d,ńsÚgě—VüîäĘ™rňzµX ˙÷đě|*˙őč˙ôÉŮ‘ZĚm*üäÓŃ~@»`Ęj%˙îÔ˙ĆŽŕló.[<"ě§kâsÓŠSţëŰÚu+ćşš˙úńÜoüüüĺ{+«SţăËţůů˙îË{U7˙÷Ý˙ěľÝ‚?Â^˙ăŔ˙ţ÷Ć’k‚Jú‡0˙üď¤Bµm8ţ–{dě¶ţu ůĎ´ěâÚôşŹÄ«–˙zţüúŐs.Ád!˙üřú7ţ‹/ň÷ýăŻ÷­rţ¶}äx"żi*ϬŚGC@ňjËŤ^âѸöŚC˙’8îͲt+Ö‹bÔp"ě/˙°lŽ[4˙ŐťřvţýüĹh"Ř­“˙Áé‘LÜz0µ¬Ąş˘Ź·w@íĂśôáÔßżĄěYőőíř€$”„u˙űÖ׳—ɲźěôúĂ’Zččçţý˙ňwďďń˙ýçĐbüűů›NÍg÷ű˙U#ál!Óx1÷÷÷ëw ˙ߢčk€Lţ‡&Úfú˙úhŹP űýţ˙űüÂp2ţ˙˙˙˙ýţţţ˙ţý˙ţ˙ýţ˙áw)ţ˙ţ÷xćĺä¸p&ŃźwˇSű÷őľNžź ‚_BŔžĘN###-űs"ÍÎĎĐŃÓŃĆ˝°°°í­÷ŢĘ˙˙˙rZŠIDATxÚ´™ \SWöÇCÂ" ‰lH ‚`˘© h!€Dꞏ° ˛(E-{„(ú·¶H¤‹H­…‚hřW¦Z[¦ăLë2@Ő¶iÍKęí¦ZŰĚ}aM€ţç>b>/É;ß{ď9÷Ľß=Ai¦šĂ÷‰ŇĚĎ`:°>Ą’ÉÔy5ÍW…”\@˛ŕ` EBčđôß@ÜĎ@QOy ÜöQ(ą‰‰ąą·nI)PµüµSü«…$ßÂß_¶iŰe777Ź”˝«ýJ| ‚ŕŕj=sNýaÁB‚٧÷Źz¤wo–ćyôčŃđĂ›˙Ř.¬ÎżËTę#ć€n.ąp9'(ž÷࿀=~oddäšQcŃL®îIĄ2Ý€čgHŠýŢŰçQęlQYőb—⬬ÄâĽ¦ŚşşŁ‘-hëĎ>—ÆČ“Í6}Čk¶¨lŹŞŞ)0NKçĺąv¶ÖÔáX-O EBHőZe_ň}Qżf5‡´óxĽqö•Ćžă‡H«¨hąľ]ÁŻȵÝđŹÓç­ĺEńÚăâěŰCÄAmĆĆAAM®®ť¦¦éd Çé(2É eđ|Ěź®NsNúőôi«ĽÚZݶ=¤  Ŕ¸š\;;M[kČŽotöó…^”Ax^’ąŇÓíüůM_¬XáéááůĐÓŁ´Űů|Ą}܇qZBBM y Ł#BQÁ¦6x‰ˇů$»ţznĂĺ˛#G nŘ]˛ŕâ§kŤÝňöôF=ž¤§§“9ŽĐŔ *öşH(QĎ@)ß$9˛Ľ1¶+Űd˙»ććďŢ Nnxďśg@s|Ü™ Ľ< –ăí˘5*Z°Ř·B }΀]żüĎňĺŤD6ŐäÔśÉTŞúdÉĹľ%»7‰ďŤLÉdăM eŮk˛ł %zZ€ą9S=™­¦xÇw±Ů]Tl´ŚˇŮš°š^,ŁĽµŘĹł»»{Kjj*ą™Â@ÄšŠ <žKĄšąđLťrMZjÉŤŤŤeS©ŮźAůWCt eű[—KAAJmMŻ!č`Ť¬˝ąę: $8NíŠ%ƲńÔ˘ýr•ŢcE"‘î:~Ĺó”ëí˛˛tP‘Š T(žËĄvýr+™>=@§>© &T,›MdłńŘcS‡ĂĺVą˙CÓN#ٞV BˇP±äBÓ:CžEwQą€ŔĺbŻS¦K=ŤŠ.8ô4’ĹÁá8`Ť@"…††‚ŻwY ¶OĐY HňyKţńx<őPâ ű„ž›i¶7P÷Ń1`ٱ‹…đ,i*x™`ąČř‰ˇxt‘—lćRxW¶řX “Pćí`Iź(łd˘…ŮX.•Ť7×<÷2¤-äŇC‡Yä„#c|ý¶´Ú0€B˛ĆRą\"¸#´‚k" 6ô¸`ŇK-Q´@”Ź‚HôiŚĺ˛±Ö™Ř @¸4řçâT~łH6!”ÓČa±ŮVšO¨Â…jQí*j H `‘epüŁP(z©šđŻ5}ÜwӽȍŻŕVńěŘXęĘr’!´ ËŮGˇ|||kĘ“őc2E ´śYQ˚؊ 06;ÖÄÖ×@řKŘ4řP­EK&> Ŕ3Ý@ç Že?G•Ťec#ON€ÇóÍEGĆďí­°ôšy8 6˘Gě®@˙’)Đwa×h—¸÷¦)Ŕł–®# GlŞf” gc[¸Dvă´”‹†‹©kB}PČři4ĹáLÁt€ęiä™ŕZQ,h¤Ýß=µTŚĎY˛‘«ččđ¦yc0‡“ű~śŁx˙Qh‹Ćâł±]śöőž l‚÷A4(dĚŽä>ĺ*ŠďŐ–®l,÷ V¦†á‰Ö>@‰Đh9ťłR4gx Š®ggSOń˘Ő°jz€šP´Ć30€ˇ±XśôtÎ{˘ľąźp Á‹ntkŹúR ÓuăűSľÝâłÄ™)çä|`śoa‰G˛xŹĂŞaůôhş…d ‡3mĺ,©ćsJ{»{Ä=y®ž~'Ó?/já$$É8®¦ł“Ľ„đÍ|ćrË#˘xq« XÉät®®µÓ•l;?Sm™Đ^r˝Ť6¶DrLËLëęęZ]]Óm ęy-‘čJ˙%^ŐŤ'zi OÔŇ瑜„2- õ)} a~AŢż9ŞęńŤŻő6Ú€`É1-»Ý™‘šęš—W3?%sui/ęFVŘ›3D–‘¸NHEâÖŐ„yí«űJíŰyń•_VëŐ˘ńs»L`3ş}Űhq|1€ wźĎË I˛H˛”Ď 8XgtŰČ55µ©)Ośú;A=×R lSšC*ł`˝ÎM ˛emąm´ç§Nť ‹·řĎ lŘÖűNUTm€sÁ2H3@-(gußŢ999âŢSđhNĂgš/Účů໪{;;|Jź˘M•˘âđCŁ{~”“ÓÖŰ[RśĎśč†(•}°Öúô¶_0©dŮŤÍÎöń!nű¦>“'‰ëÄăub-  úSŠż1ź ź˙Âň˝qíÍýÎííYĆ{} ‰_Yů•î<+«înäV(|4I¶ÓµOifśđO돏OJʲŞâY¤Ů ŕâ” ±•U[[[@||›™©PëůWK×Lî§eµ[ť±ČęŤâőď+¤”ďŇ%GÓúűŤŤ âăĹĄKHcA—@=¬/XľúvĂ?=ŚsÎô†„Ř?®şŃľĺ¸Äđů*\‘VP`¦ôř˘O]ýź…ľWď˙Ó3­´M|&$¤7îA\|©<Ë1VpmEpběďK1ś‰$ł\SŘH\Đ\PĐ{#®*ľí÷äŮÎÉ”Ěđ1€˝ńV_ˇ>hsä•´&Ł3Iy®Aýâqqö9~Đ4ť©«·˙ńĐ"ÉŠÇ‹‹Ş4NŰ)ťéěQ\ľú!¨XMyAyq÷\ÚrÄ!â^c‚f6쵡?©ňŇĄŞ¨$·}K¦Č÷ź8L;  ŞçÝ»6fNž8é;7?ú¬pe–b\ůřŻ˝×Âyk1-Öu.:`ɢ±8rMş©iMkkkEFFę–Ôsű•†ŞË/ěé­íÍJĘjN)ź,— E 7[Ł>4ŇÁ´¦¦µłsË–ŚšÔn?™Ćŕ Ć=) Ö:;'…ÄWE5żß ĄĐaQ’Ą‡ÎZV°Ci őÉBô2Ťš‡kZÝ>h &‚w~»ľÉ˘2ľŞŞ™e˝"“{ëOÇŠ˛ąkh ź#úXDÁ–•Ą§ăęŇS/”Ŕso©)•˘’÷›jŰŰۛ۟›śýĺŘs4=z:T ćíŤÁpuŞIOhĹŃ„óë:Jw^Ľ°§˝6ľy}÷r,0 ĚŃ\- "Uˇxw KN8ŘšŔYa;SÓa&€’v\ńp«ŚzL$‚0›ËFč#GhÄĽYŽ ‡Sî0IćŰ•K$łß=šBTEcCQ±±x.w¬€ŹOh‡‰ŔD®,ŃçÝů‡>sfň‰­ĆgÎ\®[ţĂDÄ´.ŇÇ@ 4X+Z ĺB!ýőšăJ†ŔwÁ…ŹkݶĄE4‰]l`´„P”Uyr'ĺő»ď˛d)ó@ĘýźměâjŰ„Ŕ´.ŤÎF»F’Ę5Ż€¤"R±ďżRÎť‹ÄÇŽ÷ČkŃF3e6Íd@’ĘÁÁ‹@đ:Ôđ×Í&`3dSµI‹~ţ—·?˘@đě˘Ě €>D"Á+Ó÷ى††ĄKĘôHćŕÝ@©M$sóI=U5ťA %XAssnŞâť©ů?jf=«×ţ4@ó˙ «=żźKÇš=zăBÍÜÜäÜŘ) ®ľ3éÓľľoär5b“g|­Ń¨4“6±\ÓĂ/ŕŻ'_ÓŁŃ„iěôLÉGO˙~xó˘Ń!řěí÷÷>]yŇLKp8=ŕî´ü˙†“ËčőşzwMľ&,Ě˝ŢqČńYćć"w]€’ŕWę±Őß˙“Ó§÷k‹Ł˙ľŤwěظŃÄd7B0Ż˙םÇŰ2>Ş}§Ţ\3ělřC66N|Ç'7ÝüZ |tâ“/V–_8}]ŰrOŮJ"•7<]±CĚťď<04ĎřaHźËeŘ˝şóźuyÍŹW7ßpÓôČ'`ÉWď…/(ţŢÁÁáËŹîďF6ŞóZ¨Aň®îej-ŕDZ}ˇŇ€<ŃFb8YyyôđŞFţ+€±{ÂĐÜ|ÁwŇ @·Ěţ~ü+éĎ`*ß“Îů# 㼞 E@¶ą5» !čqáŻŇ˘˘‡‘™„ G#Ôú!•6´ ŤËĐ ;ť,ú¨Ír‘6甲 Îď‚×µŇę»L:ýNĎZ‹`Ńőů§b¸ ? öp ¸Šáö¬rt˛‰q±‰‰ycĂ_§;ąŕDxů¨p’ínCµKďŔ`5ĽŢT}f˝Łů¤ś 20GGŔstdô¨Ŕ<†€9"ŽĂŻŚť(>ďľ8*C¸ý Ľ¬Ż¤0Ťł~˝D ř۸şĚ×Ä Żi·=ăżŇĽâŻc04 ĆŤřüë± Áx1·—.QŇjŻËk´3 3`D;š›ßťŚÄřr˛‹ZBŔčqŇôôŘ1´Ž‘Ż3ÍĎ·öţď‚[0rŘ·]ᇤ‹Ű2¤ťŚÔÔM›™ůľű»L&ďů=`‰ľ˝Ó†˙jŘ ¬JľŠ¶…ű:wýRˇĽőíŢ+Ws%’/݆ŻÖžŐݶŤ.oŞŤůŰżę]^ľří·/‘˘ŕ26Ő*ľ#˙ #ĚÁîßi]c• ż>LŁŇ«E?˝ąëż?)ݰ­ô‹%#?U=ÝÁdJĄŔ?}ëVdi(‹‡ůZٵ‹~9vg4߉ÁŤýşah>ߦgĚ˙@ţS˘—ß…µË>ý6sDFŮÚŽ..ŃîJĎËuĎţüçgë4vrŐK—›cw>‰yˇ˙ÁÓÎÝĹĹ}ŃxuŠ3˘ç??$ L <3)ľĹ# :اęč Ň=¤\[QUÓ>`H& [XŰ'VÉ'—jŐkë˘˙€ý[€ +žľř=®éIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/paypal.com.png000066400000000000000000000107011361462701300302160ustar00rootroot00000000000000‰PNG  IHDRPPseúsRGB®ÎégAMA±Ź üa pHYsĂĂÇo¨dtEXtSoftwarePaint.NET v3.5.100ôrˇ0IDATx^íY TTWšfz&jP‰%ŤŤ &âł´“™¤ťnm5*(U€¨3“ś¤3™¤“LĆlÓ¶qÚŽ @UPěP˛Ť!ăŠ!‚˘˝Ř‹ĄŘ…‚ÚŢ{őŢťď…Nź“8§sŽç8§R˙ąőŢ»÷ż˙÷ď÷•ű™‘°«“°«“°«“°«“°«“°«“°«“°«“°«“°«“°«ÓĎ0Ď…s€1$ĆƬ"“p…‹[—"fákđÔÁÎůP™mŚß_OX)ĎŰ™$08Ř%É*3…`ĎlŘBć/ĐÓ;SjYX!Úd{Nŕy‡Áń)ËÉ’čľN´V%é– ·!:‡óť«ĺ!`Cčŕ§‘,‘sG\áźŕă(cm@ŕyČěśüC’DĖщPÉOIr"–Ź=uACO·‰°6°;/ţ’ŔŽ #t'Ŕ+dádµqÂŹĚ˙żiL,hĘ$¨˛űđŚo˛qoićljĽ$‚›<ť9°f˘o @0&Xy%hËh‚s<ćÍŚˇÝL”đ‰ď·‡Äŕ-v”wpđ™Űöů©Ä9˙ń"Ćd"I9÷9ěËKÜ–·F|YîĚóĺőpŮ€Ň`0ľŹá!{nÉ€ť$Kŕt*y@/(ČÁ[Žq.‰†Čó˛łýĹĘż’Ć‚–%?†Vy0P’ű¶čDÄüvśý`G„ F™0ÂřQ¬9Ša§µť_ř[čëËV‚żňđX(ĚÂŃ*o¤ÎY@&G1ľ±ŰáŔěp@˛ŰJű dq -ńěXc7eé9Én—xç.đ/R·hg–Á±e? ČI2jhMĽÉ CŚő2ffĚ$˛QqL##’¸ ‚FVD)Đ^n·íÉ*ü$íŇ&^x7ţ Ć{ęł$]ÜźW¦9ÝbĽI,lĺŕz·Bşř‰$ŔŚd¦ďs*ŞűđJëÇ%˝{ űŁ®tě=ßřiˇ!îZ߉[7MXŕ$ŁABË\5š#ÎTpľsw‰9·H®¦˙Lyű…ëzCß(1!ˉy hÉ8ÂXŇ…†9»')3&*Ň˝BłĽ·çŕs–\NÝ™÷űÝń-F”f'oPl(»ÎO$$ZDZŻkLkÔ§¨‹$ÖúĹ6úiŰćišj;©jy¨xß9CÝ©řŽ„şă TÉ®]}q~ä÷ Ňú2.µ_ëcÇŻ"Rż8ů&`Áîf{Ä€Ů8&îŠ*đŢ~rRh¶opĘÔµžŻĐNŃŤŰ”9>8{rXŽWHň;Ž1›Ŕ83˘©N1€µVrB&]‚™Mŕ¬&3Ą”EÄ€µ˙ YhŠđě&™MřäëęEšş…ýÂÔľg.O¨ôSťž—iđŽę_ŞîĐT|TÜÎÄQ°·2+Ǭ3;Ą•_lć@F11±p^>ĹÍÔ¶>{ei|sEcóď¶ íÝ}¦ŮA°Ż¤%¶SŞŔ5Ź'v§MT»_‘>SýnBQNqoô©¶­:;{[ÂA1ă¶ť ŘcäY'ă/{Ď”~üťčŻ˙#ň˘ęDyqÇ đ3WEž®×ś+×]ěÂI´[Hb–vΨűş!ĺËĘü„ć«_µ.JhXŘ4WUQŇ™ßÄr›·«Z©i\ß8W]µ9·˘˛0C·[ÚóÉ©ć?|׳ż´#îűú¡~8vttŤlsN÷lmŰmĺ Mc÷™2l`ĺĆüO=băě”ËĺÚß:l_˛ółń[ó&‡¤ű®Ű]Ým…ˇĘCl宨źM:÷TF/°ťqßx)4ľŰŽúg?°%Ă70Ń;𳀗bţXh¶P¶XýV´gHÚ”­–ďJ5ŤÂ4c'Ęűf…g>?căź"rKJMl•¶v^lÍií+´úV8%ľÂĘţ1ňü3™ĆG’ /¤Wt3öĆ ĂŻÔĺţQúąq˝łŐ‹4ËcĘVEw肱™In0łgăjfĆ·,KŞZŁ3PΓă ňR8>´&QY˘ )—ăĐɱ3]3÷y†ä=¨Ô=ąă Ź +”ő°!‘pňŮ›2ŢNm´˛ßĽ“çů›,ßŔÓ•YÓ¶«|B)Č=7§řĹ|SÚ1ĚŘć=ąža'ďŰvÄW‘lp…Q0Ú¶ďŘßl92!ěČĘ·rZGXá0[[ý¸¦^›ÝBÎiGchż~“˙UbéÔ¨&DcHú5ŘpéńŢGâĘ47žOi~FĄ_ÝęŰ»@=˛ę@ń‘š~RĄÁSýşuY\ůçI‰›ĐRV#Â7Ę´˛ÁŃ…ŢÁü«S7ś¸-oâƬ—"Ż`V6ô‹ŻĹú%ß·ésĎŕŘ˝W:cO’N÷MŁľ“őŘ¤Š– řĆ'ü°Wř)źSĺ–"…ěÉ)™ˇĚűEčlkj˝ }ç×ĚÝ´÷[?ź–ˇ>Ó‚MăŻt-‰+˙ejőăÉmŻg ĘY™‰˝ůeíŠLĂMď’čę‚7‘l^hýŞÎTÓ'̬l”}\lôS—ÎČhő‹©‰+jÂvűľm Đ6.Ôv=sU۰ źÎq‹D„ݢTCéçĄ}_N J–5=ěčóoőfTáď"N¬}çđ” QSCr˝CŹŻ|%˝¤ĂbaönóëzĎ]Ö˝ŇüĎçآöXźń°"« ´×‰'J}×Ex†ćűnŽ«jě´˛µż×ĚŘp`’B·ěuµ ťozďxĺJMĹQ%óâÖëô‘ô»Ď4lJŻ_W5W]űxF÷ÎäďG,L°Y‘©äű…âö‘#­ć·.6/Múv^Ú5mKúoĎŻđOn]ßľZuą”ÂúÉŮhŔ´đkCo,;;ăŤ6öüËI>[ŇƇg=°5ŮkcôŁ;’¦)â'oŃŔcŽ]˛]UR>ŚBpąŞ÷őČ‚•»4s^Ü?}}Ě[óŢéžć¦[–PÝjö“Ź„i&+Rf)´'‹Ťńgۦ+Ô3•şYŰłö坆ÚűĚÖŕěÚĺÚęÇb®ĎOîx6ľlEtŮÓÚ˛Gµ-Ťix.áň¦Ôď.µYGŻŠě˝ ]›RJV©Š–«./Žý~YBÝ’¸Z˙¨ jK:F{E¶&­tNb“źŞ-$Ą¬‘ë¬CcG(´îč;¨3…G)‰9PJmu˝˙ Č)Až;u“”±>ŰîÖLئ›¸#ç±×ż›VR;@)ńBEËs˙?EyÄ#čsźŮ<·öQdŤ K˘^ýoÉT0Dľ¸Ëá©POQhÚ’đijéSŻgM =ćą1wŮ›Ç:Đó\ Ďâ*ýÔ5~IMs´ÝĎŞ«fĆ÷ű'ęçĹç˙ńۦëŐŻkť˝OĄ\šź¨źť źťÔ°U»ţeME'kę1·vűzÍÎ,ňčG´öýcăCó˝vćř‡FHÎŻ7vUŇí»5rŠ2uFXĆkŽS*Śtł€PŐäÍ)‡%OMrx’ň‹×Ç|… Ŕ÷1Ń|˛š-Ž®_¦™۵9ݬµ_¨z†*2Ž'č…(ʲ«‹7,JęyîŔŮ/ŞŤe}–ŁťlU⍹I†)=/źĽjçY\ťé…¸‹ńmSłzŁŠšé$w˘ó0őܶA‹Eü8­xjĘ[™öPHÚGŞł$r Ů=ŕő(׆ż ýŢ;?˙Ű@őĆŹOôË]‡ę ˝ďöŚű•ŮS™Í’qőŰwó}™>ĘdďĐ”)ˇ:€Wě=ŰM©T‡÷žo^ .óKi<®öĎĹí4Ôo4&4ťÄ—síô\táÉĆĹ‘UoŃŁIŰü:ë?E_Z[鯪úěR%Ô{Űž‰-Z§ź•¬?ŤěçÎĎĂ"áĐ ĘjűŮ‹{ Ľ”éH*“SsNÝ€vIt!»ĽǙꎞ'”Ń^ŰrÇ+3üvĺý÷ńĆ÷uĹłU“Bu”GP–ŽŐP=@·OŰú_G¦)RĽ”™ă‚Ó|Â2ćFśľĂńDÝÚpěÚ¬Ôrź¤ň‡ŠOŐC·‚ÄŁÓĺm"ťˇaĚ,łł§UßÍH2ÎMnAWżżÂ´÷;ĂĆô« ŁJüÓšć&V4 »gk˛ëjŞ–h[Rjš Pęć~ś<¨ ¤–Ą_š’5Q™ă­ČŞh0b?^Äs+vÖo&@Đç^M81<Ó+0uNjfxÔô൏"c^Xr9ő™đĆ>´ć¦M Nžś‰:ç˝Eőď‡NŘś cÍ[śZ<'őĆ´ÔëO%”7ö‘Ö­ô2ŹÉ#ŃŕN+c;˛ËĽćźnžżżrulĺ‹Úú'#*T-OjQŇômVVeaKôłbë´ AGš!!ťĄď@¨Ă襣…Wź¸ţäK‘˙vöŠ]IĎ˙.mÄB!î  +5č`Ar f5˛őćÎ Ú3oSĆwuźťmů‡ÝOîŚXµKóĘľăĂSbö(Z}˛úˇpݸ-©(Ń˙[‡dŠđƉAb5ő\`ćŐ@]ĹşśŇWóŞű(±’I©‚ Ń`;ş yR?úŃ—uK®?ŁąüŇéÎŹ+¤Đ‚Îu9 ë˛+ŹÖ+i Í®[“ü}pf)ʵw¶0s ]Á)ěđĂuż×Lą‘VIv°ťŽ€2`zÉ&š óĎĘ ýÍťlÄF'Ď ×.BBb;zAÓ€Ä^;xzrÎ'$ÝgÝţ}ŮĄp%ĘNř ŠŞ…uHtví6,9aĚéૠŘQŢ»-¬¦×Ü4h~0°ł>+Ŕaü¸Ń!G'v‡˛–?Ŕäf?JtÔDÇ!a&öÁn‚`Ą3 äFď…C˝’p*žČĘl˝4KÎ/$ş_frHϸÇfbÂT–ömçŁ!šűB˛f…%Ży#ˇe™¨‡%e’\HůôRçbU5‚r2n2XA^⨠˂QŘŤJjbÓ(R™„şq€žÓ9Ś“oÔ°ý8ˇń =á2'bG‰ -Î90ľÂŕŠ†‡&ŰčЇßli@†1 ­Ń» z &ěě×ďçyeMŘqtÚćCéßP*ÁهT'@˘›ŕÇq&fłB›ČöĚn…§a 5"™ÔíÜQmvVz‰[¤Ř•ÇZśU>ĺËSŰčmy^=0rď÷2®N ×üÝölźµĽ|ŕËz„9płĹJa~Żčn¦§°sí˝ŁŇO…š~čôî´sůĄ-0ťQŕr” Č2÷Šî`Î.Ú,v9×ŃázÔdć&]<Ĺü>(9D^„ÉéřŃÝümÉYQ¨Ë‘ č=N&ô6·č6M’ĺ·{Cw °ü“‡ŚWřNď™yĂI‚ăśď6e”x€#>ęË˝ˇ»ĂřĎÂaŃ"âËXĽR&§)ą2o·#Ł´Üş›. B%ĂiŰigŔÄ S°#!>éU6ŮůŢĐ]ŚĄ—Fôűť:ú‘N.XqŰů{'ˇÇ•=ŰůűĚ=ˇ»lá˙˙äěęäěęäěęäěęäěęäěęäěęäěęäěęäěęäěęô3ĚŘ˙„żND,‘ŞIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/plus.google.com.png000066400000000000000000000056101361462701300311710ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqŢsBIT|d ?IDATxśÝšypŐŐÇ?÷ţîďýŢ{ y$!A\‚V‘ÖVi]Q[k­3ŕŘe¬Z[u\jE+Ô.h¦­ŰčTít:¶uw[uÜFwË"h Ä@ !‘ěŰKŢţűÝţńŕ%y/żĽ¬Óďoî?÷w—sĎ=÷ÜsÎ=`ÇâĹžčôřÍq12ţźˇőĐOy›Íű—ěÜ;N+Ę “˙ŽéóśhZ iȉ&qLá$â±ńplK<úş éü5–ßs˘Çď™hÚĆRI,ĺ͉Zó+©aµňމ¦kÜaúV+.‘B‚žh’ĆRHşDi! ťaő2P5ď(Ě™%X%óńÎ.EX*ŻOQń¨ŐňŇ4?ö"uŐŢÖš%/|: ~Çw—b1d-„ˇ[ş 8ë"ňľzľ9 \3Ä:ۨĽg-‘­ďăWŇńqgđŤ‹;ĂpÁ@ľůFń,ŠV˙ś©§ž=h‡D8„ňů]çM›ŢăżwߎlÇŻ$w‹°ÓnşúĐ 4­,Š.»†ÂóV!äˇk0ޤćĺ§iŘřÁŞť@(“śy (([ĆüUWŕ™pMđápq*˙v? Ď?J®2đ)Cö. H[ďb ŤFů—1ď¶rĽłKS~Öżó*U•#şÚ°¤ Č«4»ć Zöî˘áŐg™}Éĺ,XuEƉÂMřřĆi¬?¸żR€ßLő(€Ŕ$}ÚŢF}›sňËNθ«V~!IŹp˛CkŤŠNARB¤|~¤×—ŃľöĎ)Ĺ[şpR„»†BŻ7辉ŕŘvfçDHf]»ĚÉźv—ôpď=9¶M÷ľÝCś»đJîú+"P0jŻŔcR9ŁÔĐřÖ+®÷µ„ą÷=Žçč˛I{zť!÷ !hyăb]®`1wýĂÎ_5)™pđ¸…!*ŘÉλí>`a(ŠŻ¸‰ż¸mZCO2Ž8sé>J’öB裷©íĹať·Ŕ©g2ký#Č@áčąÂ#,Z÷> ¦4`•Ť§d.^¬ąóJaÍ™ŹV&ţ҅öň| 3űŢǨ_#±Ý;'…gx0STxýř–ž‚ďřexŹ\„oţŃCvÎĆĚUS ˝ţę~wŃŠÍž$%6ÜtĄ^´ň;äž°‘ćăp„ęk‰÷tĐ]łišřŹ(aJé‚´Ź Á‰E©+_CtëĆ„ÍťŞŞ*=cĆŚ?µăĐ^±•¶Ď¶¬¬ Úđ%ˇÚꤙL2¦×gí'4řŽ\Ä’5w’3{®kt"ΗwŻ#üń† aBEs˘˛˛RĘ× î­˘öůÇhŮřF"†)J ™Ľ$Ęěől­‰9šéĄäĘ›uÎ…®‰pbQjoţ1öţęqgÂçÍ]»véââb‚{«Řý—{éŢö ^C`I‰É÷:C€@ ©IzŹ[Óm;ä,;ŤĹ7ý•“ëŠh} űŻżi'FuCˇ˘ą3y î}ćQ¶_wNĹ& <ÉěĎ%ńöFW ‘ůt;Ô—=ęë GĹţó.›Żľ„Î/vşş"=G”ŕ˙ćăn,i@¶ďŘFăŁSz­Dv!,)’ů‚S”ÄŰŃĚŽ_ţ„ĆwßtĹ„ü /ĹÎâV 4céçďÝ1/ĎŹ%Ss‚łEź4(!0´CÓ»o‹'Č/;)c?•;…ŽŹŢ†®ŽqÓ =¤OĘ M+Ë@ŕ’X>¤xŹ; =ąn I7f—,)É3 ‚Ż?OÝ‹Ofd€Q4g5Á°ÝálЧr Iă?"T_›Ţq2­¬dłF#q´í|L›t2ŕjÇřň…ÇŇďjcJ}mKQ‡ Ĺ>I}˛1­„«ż7·D­ýlK86.JÇ@ ]Ř‘đ‚śX”ĐöMŁ®ŚÓ•äšőS҉Ä×č o«ëN¤Oj H‘ «éDbŔî·~ü.˛'8˘dm7'lęşĂ4ô„·8ŃxąşŞş˝óéĹ,k M_Ó _,„”Q`Zµ¤E÷0¤,7 Ł(( ±¤˛t±Z[ĄuS[wúđž‰iŮą˝łłŘţáeßŮ}źó>˙=ç9ç<˙g2ŮlÖľ€qöŚ#Ň ´@ćő?šńî#q9fáLŔ6 +±˝’ůgŻmli ¸wbr‘ż_‚;° Oăě-xf<:q1îĆ`ah„Ą8ĽA$ŽÇ‡XP‚D>ŽĂBĽ‡Ł°NÇř]ř »˙uM.Ă특ř+E“đ>¦W9îJ|awj‚ʰ¤Ôbż&~^ĺhM1©óöfúNŻĽjz ŕUÓkŻš^x2Éęß'’˘ţ%RÇO]˙Tzf5O) ˝ýď!ľěÇćo«¨z,˲:zÂÎŐh1űx–ŰzřôGx1?>ÎĄxÁů§Ńă Ŕ˝Tţ R#ß˙QR§ÍôřŃśdΕ®—\ľ]văvÉŐüŇëćvłôúÝŠŰ|KÜŠŻjî&›ç`”MŁ‚fä=oęU‰ŢLĘg^– ˛QŹąźďě”ĺŇ5×7<×7,ÇÇ܇f{÷ÜŢŔÄ'üójâ›ĐËç@WďÉ• —DX¸d"ş=qńm¬$Ńń zÉO8:şmşmp¶O§,·ÎŮ®˘…äx·Jk°öěb,0őbĄ™đ;ÁŕٍΧ/˙¶ýTt\ćK¶ŤNĘ}qŢđ„śIköé ć;6ź§B"î 4-u…JÉeĄđ”ńÁqSŮÍă·2;¤»uŮáşË+$×=8Ç#8Ç-8Ű«}–S˙]Ku%üóę=Ĺ„ń3nÎĄ<6!‡ůM±ě8ŹΑ‚ć˛63\ßYV©3`Ťşw•Âđžn]ÖÎ/1í U˛›*[-ä-š1E2e×=ÝŃc˘G‡eîÁ;<:f{@h®OŰôĆ×7błČ h;:čŕÝÝĎŁBPwôăżÚ)u«Ýs±&rˇe÷…,lÇđUf|ˇŠDŐ™»{LŮŽň’Ľ‰“™Ľ…’jiÜbiJc»—×¶ŕěĺäűKÇő^!Ű!hQ@†ý}Ő­TRť^~qtäď ˛„ŤČ|Aă–îg[F&˛D‹®Išxס_€ywiPp\Ůb ÖM[­”-JŠFNŐ(™ü5c 3ĄKŃź5¶ěě2ŘŃckç žˇyîťłÝCr=˙épčŢ^0€[;ĂŕńTÁ?Űg9?€łöT‚ šmŐ-‰u%RpĽëŐ\fĄń+Ďľîŕžî;ERRčúĺ+Ó‘!Ę™8ĺčP}jÂŞşM˘]=†;;˝ëÔ"Ö54Ďŕ‹`ßSŹŤáGD€3Č•xśýĎOˇ`ĎcÄÂR’@×D)ć `Jř"νR|AI­%§2\<¸'ÍÁÝźK˘yYG ®ţŐ¸ÂŃDĹ6¶ŤvqŹqrěüťgđ62hŔ@ąčÖÓÎ<&\)>šç…©çPS5¸ YYÓ¨ú“źFŞ’ŞQ­6™‘•^ÄĽl¬ ٬ĽŻO·v¬¬Ó$ÚŮ 9µ[á§Ăr˝ „Ą§ç`[2ö\ôË´6iŤ0ĹH(UŚÔŚzřiô Ź2jżXP•śŕăGhşTK@§çó¬ĆhäÂd®¬3éŚúJÚJZ=(’)ŰA©ĽK+I›ˇŰĄrŽYHšfŕ§M` °ć ĹŢ!;É pý˛]zíh[XˇĹ' _Ëó#óZ V`Š žž@żË†lĐUP%s„HÁqŔ@×c0T›z˝ľŘPrM)ż©”_7–^•Ë®)wjžK÷•çi€ ¶cąµm´´Oô Ůé BmŇě6_^+ÖŻ9—(®źTČxĺšáč }ŢnýćôĘő›*WmĐŻř[ĹňučÖo¬Üś†)ă?N`™RZ&ľ»h$`ÁŤXHŔmŘŞŠJ@k rţýŇ«żi‹+đv9‘„ŚŚĆbSŃiĺŢ~Óť<ĺ×sďc c€SZ–rëE4Ř{ň*@—EëĆ:›ŔöÇJű>bw×hHy~&WR$– äF«.ĄZ’jť™9úȰ€t;¤tÂĺ›L`ÖMڞtx,mW}ýj"€G€ÁňÁ2h˙h|GJ>Ł5Ím:Ng]O\¸ŤőÂĎ–T裿fał3>ip$Vn,µ gfÓţŕžźH§äy›%@)Óß™r~ᎻڦۀŃB¨nx˙fFK…˘ď? Oő–|-ź÷|c¸|UÖjË'Ĺi-ě ·¨ `U-_Íüci‘[‹ńÖýVţvźŠŠŰĺŔŹ7Ö ™üclťC±ě@,Ű3Nş”Äś_Ę »$¬¨ä¬FR4ČL…”Ó3±É¨˝‘ȨCr| C– …›¸~8%ë$ýF4hŇBřŐ ˇń7ä^«”­¨‘/ŚÖZűĂ`¸ä7ŽyzyŤ˛ömIi98CÉ&޶I[Xçiyę€Pˇsó-ŕőŤ§g€o®B—öĆjŕô ´ÄîfÉë¦d9KM¶Ä@Ä2Xq+đËŔ{űzRčÍń®)”2“Ž}i3¤@eď}ÎWVU!‚čëšUÂŁšĚ­ŘÍ‚[öYÁz­”zŻ`! ĚŤP! ΂ ĹŐé¶ yĽ=„°sĽ…^M[4Âjĺď™|x(…3Şi¬)źCى }| #+#÷ő Ělí7ϵLcÁĹ]ٰ´fޤÁpyEE⊲Éqe_&ULK(źžX2-Ń·8ľËŘVv˝ťúwtęâôN­Ŕ©CWW”W@ßwz*k?‹E,óë=qWlťź?Őś„ŰdÎýf 5ľ˛»=–›®~Żl”M¸{$K† LŢ×SÜݨźz“  pB€#(™«žĐZťNü^'` `Ľ‘Źl´€5)*ÚfŻ“ě×1çaĚusĂÜĆXz×j7­ń»_ /Ř uźĽ Flą …cŻ)_Ć´=6·)k|ÚňŽV¸x*Ę@ÇMú(Ł”Ă•Ch|j˛<˘B°‡6{µp.=´QM©DüWR‘ý›ZŰ–0hô“#‚aŃr s qęË"7čłřne˙$>^wžđ=r;duČö,#ŞGĹ'›”Ć‚SĆŠ[$i:WĆ•ňa,`ŔUH Rhł¸ TĄ˘ĄŃăô'O#›_"Ź0\ąY>e®ßśĆÁeˇG ]SŰóËÜŢ­T',ŽuMBuváĆ)®*é7j­H餭ş% ×°b·"ÖŤ\oAT¨S‹žlQáůO“@f Ŕ˙p PS7jĆPT×»°M—’.QhĹou'×iá XY7ÂŤVÚú­µňĆ<ű6 ­2_ŠXHż¬tš·í(©˘ž—”·î•Ôďł”…-5'źAł&ĆÇ`"ęń†Ź‰ ~5©@–—pŁI€TyzD\ôÚúžČ=Ń ëyS|@MS ( ŠŐq»Ďě Ľ—9†8ů˝§‰\Ä"Š%ň¤oč‚…/JŢ{Ö¬?h4h??çđEL ?öt2@ĘrDâivD(ÇM=ţf•ލcP» ß´v%îˇ3hX;X:CXS¨q(¬íVdß¶8¸_ŃäyĘżOSQß!žîµK± á 6}–ě9y űžż~ßoÄ7¨3 ¸G՞а÷Ň;÷J1+,äéd6¤‘űzŔi"!m—é„R ăÖ[üůč{eşÄ•ĺf” ý¨ôí%ŠBúĹâΊC”E)8¦ôĂĎËg,Ş\÷qĎ!ůÖě)îoÜŇm,`–řeN`‹ŕŤë°5(h¤ŕ8™DS¨ËPµµ›3đË|H>ZŤ.OˇJ@1}ňŹčČĽoď č˝ý-´^;Ţz{gPx®ďܓ꒫Ë9ń]iÓÇŚ7\ž´/ý¬B?în‡‹´î±wL?î†Ć÷ĽĹ=zĄÔi>•Â\g¸ň€{Ľ±Ž?|–’mÜ+qö‰VѲR]q‘® XŻ-Ö©MŻĹ›rC18{٬^ě+>âěňh ~óâUŽ9ĚřO‹âçu‹qRŕôĚgrě’Ľý§oIˇ TŇƓ@€$dp˘­Ěú_áúůxä±J2ü*1őČäĂD E궢Ŕ¤î«>TĆÂK®ÍýWż™éò†Ĺgˇď73mmÎIĽ?qé·¨ŮiQ+ (mże‘Ú´÷gúO<%¸©ąŰéˇăT„ËŞIŞűzćßFż:1ý†ĘĘőWŐ^Ě/*(ˇ˘Ţ]Uýßŕ™čŮp+ŕ  ŻŻ7Đ@H†ĺfF‰řĘí8ëUćűÂč9>Bć÷d1 đ_ő’ô‚éżđżç_e·×Â4_0˝˙—ô‚T]üKąě'Ň‹đR4ü?ÓKVˇ—Źęµ Ľjz ŕUÓkŻš^xµd2ýe0‚’o±CIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/reply1.ebay.com.png000066400000000000000000000110151361462701300310620ustar00rootroot00000000000000‰PNG  IHDR@@% ć‰sRGB®ÎégAMA±Ź üa pHYs  ŇÝ~ütEXtSoftwarePaint.NET v3.5.100ôrˇ|IDAThCíYTVGÚžű˘QW,ôŢěÉVš‚=Ć‚Á‚-‰QS0&»¶ŘQlqŐ¨1şgM6*‚t°ĹëŞkܨk…Ź_ą÷űźwćňĺwŁ«żç?Ç÷ĚćŢ™;ó>óöfúNŻĽjz ŕUÓkŻš^x2Éęß'’˘ţ%RÇO]˙Tzf5O) ˝ýď!ľěÇćo«¨z,˲:zÂÎŐh1űx–ŰzřôGx1?>ÎĄxÁů§Ńă Ŕ˝Tţ R#ß˙QR§ÍôřŃśdΕ®—\ľ]văvÉŐüŇëćvłôúÝŠŰ|KÜŠŻjî&›ç`”MŁ‚fä=oęU‰ŢLĘg^– ˛QŹąźďě”ĺŇ5×7<×7,ÇÇ܇f{÷ÜŢŔÄ'üójâ›ĐËç@WďÉ• —DX¸d"ş=qńm¬$Ńń zÉO8:şmşmp¶O§,·ÎŮ®˘…äx·Jk°öěb,0őbĄ™đ;ÁŕٍΧ/˙¶ýTt\ćK¶ŤNĘ}qŢđ„śIköé ć;6ź§B"î 4-u…JÉeĄđ”ńÁqSŮÍă·2;¤»uŮáşË+$×=8Ç#8Ç-8Ű«}–S˙]Ku%üóę=Ĺ„ń3nÎĄ<6!‡ůM±ě8ŹΑ‚ć˛63\ßYV©3`Ťşw•Âđžn]ÖÎ/1í U˛›*[-ä-š1E2e×=ÝŃc˘G‡eîÁ;<:f{@h®OŰôĆ×7błČ h;:čŕÝÝĎŁBPwôăżÚ)u«Ýs±&rˇe÷…,lÇđUf|ˇŠDŐ™»{LŮŽň’Ľ‰“™Ľ…’jiÜbiJc»—×¶ŕěĺäűKÇő^!Ű!hQ@†ý}Ő­TRť^~qtäď ˛„ŤČ|Aă–îg[F&˛D‹®Išxס_€ywiPp\Ůb ÖM[­”-JŠFNŐ(™ü5c 3ĄKŃź5¶ěě2ŘŃckç žˇyîťłÝCr=˙épčŢ^0€[;ĂŕńTÁ?Űg9?€łöT‚ šmŐ-‰u%RpĽëŐ\fĄń+Ďľîŕžî;ERRčúĺ+Ó‘!Ę™8ĺčP}jÂŞşM˘]=†;;˝ëÔ"Ö54Ďŕ‹`ßSŹŤáGD€3Č•xśýĎOˇ`ĎcÄÂR’@×D)ć `Jř"νR|AI­%§2\<¸'ÍÁÝźK˘yYG ®ţŐ¸ÂŃDĹ6¶ŤvqŹqrěüťgđ62hŔ@ąčÖÓÎ<&\)>šç…©çPS5¸ YYÓ¨ú“źFŞ’ŞQ­6™‘•^ÄĽl¬ ٬ĽŻO·v¬¬Ó$ÚŮ 9µ[á§Ăr˝ „Ą§ç`[2ö\ôË´6iŤ0ĹH(UŚÔŚzřiô Ź2jżXP•śŕăGhşTK@§çó¬ĆhäÂd®¬3éŚúJÚJZ=(’)ŰA©ĽK+I›ˇŰĄrŽYHšfŕ§M` °ć ĹŢ!;É pý˛]zíh[XˇĹ' _Ëó#óZ V`Š žž@żË†lĐUP%s„HÁqŔ@×c0T›z˝ľŘPrM)ż©”_7–^•Ë®)wjžK÷•çi€ ¶cąµm´´Oô Ůé BmŇě6_^+ÖŻ9—(®źTČxĺšáč }ŢnýćôĘő›*WmĐŻř[ĹňučÖo¬Üś†)ă?N`™RZ&ľ»h$`ÁŤXHŔmŘŞŠJ@k rţýŇ«żi‹+đv9‘„ŚŚĆbSŃiĺŢ~Óť<ĺ×sďc c€SZ–rëE4Ř{ň*@—EëĆ:›ŔöÇJű>bw×hHy~&WR$– äF«.ĄZ’jť™9úȰ€t;¤tÂĺ›L`ÖMڞtx,mW}ýj"€G€ÁňÁ2h˙h|GJ>Ł5Ím:Ng]O\¸ŤőÂĎ–T裿fał3>ip$Vn,µ gfÓţŕžźH§äy›%@)Óß™r~ᎻڦۀŃB¨nx˙fFK…˘ď? Oő–|-ź÷|c¸|UÖjË'Ĺi-ě ·¨ `U-_Íüci‘[‹ńÖýVţvźŠŠŰĺŔŹ7Ö ™üclťC±ě@,Ű3Nş”Äś_Ę »$¬¨ä¬FR4ČL…”Ó3±É¨˝‘ȨCr| C– …›¸~8%ë$ýF4hŇBřŐ ˇń7ä^«”­¨‘/ŚÖZűĂ`¸ä7ŽyzyŤ˛ömIi98CÉ&޶I[Xçiyę€Pˇsó-ŕőŤ§g€o®B—öĆjŕô ´ÄîfÉë¦d9KM¶Ä@Ä2Xq+đËŔ{űzRčÍń®)”2“Ž}i3¤@eď}ÎWVU!‚čëšUÂŁšĚ­ŘÍ‚[öYÁz­”zŻ`! ĚŤP! ΂ ĹŐé¶ yĽ=„°sĽ…^M[4Âjĺď™|x(…3Şi¬)źCى }| #+#÷ő Ělí7ϵLcÁĹ]ٰ´fޤÁpyEE⊲Éqe_&ULK(źžX2-Ń·8ľËŘVv˝ťúwtęâôN­Ŕ©CWW”W@ßwz*k?‹E,óë=qWlťź?Őś„ŰdÎýf 5ľ˛»=–›®~Żl”M¸{$K† LŢ×SÜݨźz“  pB€#(™«žĐZťNü^'` `Ľ‘Źl´€5)*ÚfŻ“ě×1çaĚusĂÜĆXz×j7­ń»_ /Ř uźĽ Flą …cŻ)_Ć´=6·)k|ÚňŽV¸x*Ę@ÇMú(Ł”Ă•Ch|j˛<˘B°‡6{µp.=´QM©DüWR‘ý›ZŰ–0hô“#‚aŃr s qęË"7čłřne˙$>^wžđ=r;duČö,#ŞGĹ'›”Ć‚SĆŠ[$i:WĆ•ňa,`ŔUH Rhł¸ TĄ˘ĄŃăô'O#›_"Ź0\ąY>e®ßśĆÁeˇG ]SŰóËÜŢ­T',ŽuMBuváĆ)®*é7j­H餭ş% ×°b·"ÖŤ\oAT¨S‹žlQáůO“@f Ŕ˙p PS7jĆPT×»°M—’.QhĹou'×iá XY7ÂŤVÚú­µňĆ<ű6 ­2_ŠXHż¬tš·í(©˘ž—”·î•Ôďł”…-5'źAł&ĆÇ`"ęń†Ź‰ ~5©@–—pŁI€TyzD\ôÚúžČ=Ń ëyS|@MS ( ŠŐq»Ďě Ľ—9†8ů˝§‰\Ä"Š%ň¤oč‚…/JŢ{Ö¬?h4h??çđEL ?öt2@ĘrDâivD(ÇM=ţf•ލcP» ß´v%îˇ3hX;X:CXS¨q(¬íVdß¶8¸_ŃäyĘżOSQß!žîµK± á 6}–ě9y űžż~ßoÄ7¨3 ¸G՞а÷Ň;÷J1+,äéd6¤‘űzŔi"!m—é„R ăÖ[üůč{eşÄ•ĺf” ý¨ôí%ŠBúĹâΊC”E)8¦ôĂĎËg,Ş\÷qĎ!ůÖě)îoÜŇm,`–řeN`‹ŕŤë°5(h¤ŕ8™DS¨ËPµµ›3đË|H>ZŤ.OˇJ@1}ňŹčČĽoď č˝ý-´^;Ţz{gPx®ďܓ꒫Ë9ń]iÓÇŚ7\ž´/ý¬B?în‡‹´î±wL?î†Ć÷ĽĹ=zĄÔi>•Â\g¸ň€{Ľ±Ž?|–’mÜ+qö‰VѲR]q‘® XŻ-Ö©MŻĹ›rC18{٬^ě+>âěňh ~óâUŽ9ĚřO‹âçu‹qRŕôĚgrě’Ľý§oIˇ TŇƓ@€$dp˘­Ěú_áúůxä±J2ü*1őČäĂD E궢Ŕ¤î«>TĆÂK®ÍýWż™éò†Ĺgˇď73mmÎIĽ?qé·¨ŮiQ+ (mże‘Ú´÷gúO<%¸©ąŰéˇăT„ËŞIŞűzćßFż:1ý†ĘĘőWŐ^Ě/*(ˇ˘Ţ]Uýßŕ™čŮp+ŕ  ŻŻ7Đ@H†ĺfF‰řĘí8ëUćűÂč9>Bć÷d1 đ_ő’ô‚éżđżç_e·×Â4_0˝˙—ô‚T]üKąě'Ň‹đR4ü?ÓKVˇ—Źęµ Ľjz ŕUÓkŻš^xµd2ýe0‚’o±CIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/reply2.ebay.com.png000066400000000000000000000110151361462701300310630ustar00rootroot00000000000000‰PNG  IHDR@@% ć‰sRGB®ÎégAMA±Ź üa pHYs  ŇÝ~ütEXtSoftwarePaint.NET v3.5.100ôrˇ|IDAThCíYTVGÚžű˘QW,ôŢěÉVš‚=Ć‚Á‚-‰QS0&»¶ŘQlqŐ¨1şgM6*‚t°ĹëŞkܨk…Ź_ą÷űźwćňĺwŁ«żç?Ç÷ĚćŢ™;ó>óöfúNŻĽjz ŕUÓkŻš^x2Éęß'’˘ţ%RÇO]˙Tzf5O) ˝ýď!ľěÇćo«¨z,˲:zÂÎŐh1űx–ŰzřôGx1?>ÎĄxÁů§Ńă Ŕ˝Tţ R#ß˙QR§ÍôřŃśdΕ®—\ľ]văvÉŐüŇëćvłôúÝŠŰ|KÜŠŻjî&›ç`”MŁ‚fä=oęU‰ŢLĘg^– ˛QŹąźďě”ĺŇ5×7<×7,ÇÇ܇f{÷ÜŢŔÄ'üójâ›ĐËç@WďÉ• —DX¸d"ş=qńm¬$Ńń zÉO8:şmşmp¶O§,·ÎŮ®˘…äx·Jk°öěb,0őbĄ™đ;ÁŕٍΧ/˙¶ýTt\ćK¶ŤNĘ}qŢđ„śIköé ć;6ź§B"î 4-u…JÉeĄđ”ńÁqSŮÍă·2;¤»uŮáşË+$×=8Ç#8Ç-8Ű«}–S˙]Ku%üóę=Ĺ„ń3nÎĄ<6!‡ůM±ě8ŹΑ‚ć˛63\ßYV©3`Ťşw•Âđžn]ÖÎ/1í U˛›*[-ä-š1E2e×=ÝŃc˘G‡eîÁ;<:f{@h®OŰôĆ×7błČ h;:čŕÝÝĎŁBPwôăżÚ)u«Ýs±&rˇe÷…,lÇđUf|ˇŠDŐ™»{LŮŽň’Ľ‰“™Ľ…’jiÜbiJc»—×¶ŕěĺäűKÇő^!Ű!hQ@†ý}Ő­TRť^~qtäď ˛„ŤČ|Aă–îg[F&˛D‹®Išxס_€ywiPp\Ůb ÖM[­”-JŠFNŐ(™ü5c 3ĄKŃź5¶ěě2ŘŃckç žˇyîťłÝCr=˙épčŢ^0€[;ĂŕńTÁ?Űg9?€łöT‚ šmŐ-‰u%RpĽëŐ\fĄń+Ďľîŕžî;ERRčúĺ+Ó‘!Ę™8ĺčP}jÂŞşM˘]=†;;˝ëÔ"Ö54Ďŕ‹`ßSŹŤáGD€3Č•xśýĎOˇ`ĎcÄÂR’@×D)ć `Jř"νR|AI­%§2\<¸'ÍÁÝźK˘yYG ®ţŐ¸ÂŃDĹ6¶ŤvqŹqrěüťgđ62hŔ@ąčÖÓÎ<&\)>šç…©çPS5¸ YYÓ¨ú“źFŞ’ŞQ­6™‘•^ÄĽl¬ ٬ĽŻO·v¬¬Ó$ÚŮ 9µ[á§Ăr˝ „Ą§ç`[2ö\ôË´6iŤ0ĹH(UŚÔŚzřiô Ź2jżXP•śŕăGhşTK@§çó¬ĆhäÂd®¬3éŚúJÚJZ=(’)ŰA©ĽK+I›ˇŰĄrŽYHšfŕ§M` °ć ĹŢ!;É pý˛]zíh[XˇĹ' _Ëó#óZ V`Š žž@żË†lĐUP%s„HÁqŔ@×c0T›z˝ľŘPrM)ż©”_7–^•Ë®)wjžK÷•çi€ ¶cąµm´´Oô Ůé BmŇě6_^+ÖŻ9—(®źTČxĺšáč }ŢnýćôĘő›*WmĐŻř[ĹňučÖo¬Üś†)ă?N`™RZ&ľ»h$`ÁŤXHŔmŘŞŠJ@k rţýŇ«żi‹+đv9‘„ŚŚĆbSŃiĺŢ~Óť<ĺ×sďc c€SZ–rëE4Ř{ň*@—EëĆ:›ŔöÇJű>bw×hHy~&WR$– äF«.ĄZ’jť™9úȰ€t;¤tÂĺ›L`ÖMڞtx,mW}ýj"€G€ÁňÁ2h˙h|GJ>Ł5Ím:Ng]O\¸ŤőÂĎ–T裿fał3>ip$Vn,µ gfÓţŕžźH§äy›%@)Óß™r~ᎻڦۀŃB¨nx˙fFK…˘ď? Oő–|-ź÷|c¸|UÖjË'Ĺi-ě ·¨ `U-_Íüci‘[‹ńÖýVţvźŠŠŰĺŔŹ7Ö ™üclťC±ě@,Ű3Nş”Äś_Ę »$¬¨ä¬FR4ČL…”Ó3±É¨˝‘ȨCr| C– …›¸~8%ë$ýF4hŇBřŐ ˇń7ä^«”­¨‘/ŚÖZűĂ`¸ä7ŽyzyŤ˛ömIi98CÉ&޶I[Xçiyę€Pˇsó-ŕőŤ§g€o®B—öĆjŕô ´ÄîfÉë¦d9KM¶Ä@Ä2Xq+đËŔ{űzRčÍń®)”2“Ž}i3¤@eď}ÎWVU!‚čëšUÂŁšĚ­ŘÍ‚[öYÁz­”zŻ`! ĚŤP! ΂ ĹŐé¶ yĽ=„°sĽ…^M[4Âjĺď™|x(…3Şi¬)źCى }| #+#÷ő Ělí7ϵLcÁĹ]ٰ´fޤÁpyEE⊲Éqe_&ULK(źžX2-Ń·8ľËŘVv˝ťúwtęâôN­Ŕ©CWW”W@ßwz*k?‹E,óë=qWlťź?Őś„ŰdÎýf 5ľ˛»=–›®~Żl”M¸{$K† LŢ×SÜݨźz“  pB€#(™«žĐZťNü^'` `Ľ‘Źl´€5)*ÚfŻ“ě×1çaĚusĂÜĆXz×j7­ń»_ /Ř uźĽ Flą …cŻ)_Ć´=6·)k|ÚňŽV¸x*Ę@ÇMú(Ł”Ă•Ch|j˛<˘B°‡6{µp.=´QM©DüWR‘ý›ZŰ–0hô“#‚aŃr s qęË"7čłřne˙$>^wžđ=r;duČö,#ŞGĹ'›”Ć‚SĆŠ[$i:WĆ•ňa,`ŔUH Rhł¸ TĄ˘ĄŃăô'O#›_"Ź0\ąY>e®ßśĆÁeˇG ]SŰóËÜŢ­T',ŽuMBuváĆ)®*é7j­H餭ş% ×°b·"ÖŤ\oAT¨S‹žlQáůO“@f Ŕ˙p PS7jĆPT×»°M—’.QhĹou'×iá XY7ÂŤVÚú­µňĆ<ű6 ­2_ŠXHż¬tš·í(©˘ž—”·î•Ôďł”…-5'źAł&ĆÇ`"ęń†Ź‰ ~5©@–—pŁI€TyzD\ôÚúžČ=Ń ëyS|@MS ( ŠŐq»Ďě Ľ—9†8ů˝§‰\Ä"Š%ň¤oč‚…/JŢ{Ö¬?h4h??çđEL ?öt2@ĘrDâivD(ÇM=ţf•ލcP» ß´v%îˇ3hX;X:CXS¨q(¬íVdß¶8¸_ŃäyĘżOSQß!žîµK± á 6}–ě9y űžż~ßoÄ7¨3 ¸G՞а÷Ň;÷J1+,äéd6¤‘űzŔi"!m—é„R ăÖ[üůč{eşÄ•ĺf” ý¨ôí%ŠBúĹâΊC”E)8¦ôĂĎËg,Ş\÷qĎ!ůÖě)îoÜŇm,`–řeN`‹ŕŤë°5(h¤ŕ8™DS¨ËPµµ›3đË|H>ZŤ.OˇJ@1}ňŹčČĽoď č˝ý-´^;Ţz{gPx®ďܓ꒫Ë9ń]iÓÇŚ7\ž´/ý¬B?în‡‹´î±wL?î†Ć÷ĽĹ=zĄÔi>•Â\g¸ň€{Ľ±Ž?|–’mÜ+qö‰VѲR]q‘® XŻ-Ö©MŻĹ›rC18{٬^ě+>âěňh ~óâUŽ9ĚřO‹âçu‹qRŕôĚgrě’Ľý§oIˇ TŇƓ@€$dp˘­Ěú_áúůxä±J2ü*1őČäĂD E궢Ŕ¤î«>TĆÂK®ÍýWż™éò†Ĺgˇď73mmÎIĽ?qé·¨ŮiQ+ (mże‘Ú´÷gúO<%¸©ąŰéˇăT„ËŞIŞűzćßFż:1ý†ĘĘőWŐ^Ě/*(ˇ˘Ţ]Uýßŕ™čŮp+ŕ  ŻŻ7Đ@H†ĺfF‰řĘí8ëUćűÂč9>Bć÷d1 đ_ő’ô‚éżđżç_e·×Â4_0˝˙—ô‚T]üKąě'Ň‹đR4ü?ÓKVˇ—Źęµ Ľjz ŕUÓkŻš^xµd2ýe0‚’o±CIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/reply3.ebay.com.png000066400000000000000000000110151361462701300310640ustar00rootroot00000000000000‰PNG  IHDR@@% ć‰sRGB®ÎégAMA±Ź üa pHYs  ŇÝ~ütEXtSoftwarePaint.NET v3.5.100ôrˇ|IDAThCíYTVGÚžű˘QW,ôŢěÉVš‚=Ć‚Á‚-‰QS0&»¶ŘQlqŐ¨1şgM6*‚t°ĹëŞkܨk…Ź_ą÷űźwćňĺwŁ«żç?Ç÷ĚćŢ™;ó>óöfúNŻĽjz ŕUÓkŻš^x2Éęß'’˘ţ%RÇO]˙Tzf5O) ˝ýď!ľěÇćo«¨z,˲:zÂÎŐh1űx–ŰzřôGx1?>ÎĄxÁů§Ńă Ŕ˝Tţ R#ß˙QR§ÍôřŃśdΕ®—\ľ]văvÉŐüŇëćvłôúÝŠŰ|KÜŠŻjî&›ç`”MŁ‚fä=oęU‰ŢLĘg^– ˛QŹąźďě”ĺŇ5×7<×7,ÇÇ܇f{÷ÜŢŔÄ'üójâ›ĐËç@WďÉ• —DX¸d"ş=qńm¬$Ńń zÉO8:şmşmp¶O§,·ÎŮ®˘…äx·Jk°öěb,0őbĄ™đ;ÁŕٍΧ/˙¶ýTt\ćK¶ŤNĘ}qŢđ„śIköé ć;6ź§B"î 4-u…JÉeĄđ”ńÁqSŮÍă·2;¤»uŮáşË+$×=8Ç#8Ç-8Ű«}–S˙]Ku%üóę=Ĺ„ń3nÎĄ<6!‡ůM±ě8ŹΑ‚ć˛63\ßYV©3`Ťşw•Âđžn]ÖÎ/1í U˛›*[-ä-š1E2e×=ÝŃc˘G‡eîÁ;<:f{@h®OŰôĆ×7błČ h;:čŕÝÝĎŁBPwôăżÚ)u«Ýs±&rˇe÷…,lÇđUf|ˇŠDŐ™»{LŮŽň’Ľ‰“™Ľ…’jiÜbiJc»—×¶ŕěĺäűKÇő^!Ű!hQ@†ý}Ő­TRť^~qtäď ˛„ŤČ|Aă–îg[F&˛D‹®Išxס_€ywiPp\Ůb ÖM[­”-JŠFNŐ(™ü5c 3ĄKŃź5¶ěě2ŘŃckç žˇyîťłÝCr=˙épčŢ^0€[;ĂŕńTÁ?Űg9?€łöT‚ šmŐ-‰u%RpĽëŐ\fĄń+Ďľîŕžî;ERRčúĺ+Ó‘!Ę™8ĺčP}jÂŞşM˘]=†;;˝ëÔ"Ö54Ďŕ‹`ßSŹŤáGD€3Č•xśýĎOˇ`ĎcÄÂR’@×D)ć `Jř"νR|AI­%§2\<¸'ÍÁÝźK˘yYG ®ţŐ¸ÂŃDĹ6¶ŤvqŹqrěüťgđ62hŔ@ąčÖÓÎ<&\)>šç…©çPS5¸ YYÓ¨ú“źFŞ’ŞQ­6™‘•^ÄĽl¬ ٬ĽŻO·v¬¬Ó$ÚŮ 9µ[á§Ăr˝ „Ą§ç`[2ö\ôË´6iŤ0ĹH(UŚÔŚzřiô Ź2jżXP•śŕăGhşTK@§çó¬ĆhäÂd®¬3éŚúJÚJZ=(’)ŰA©ĽK+I›ˇŰĄrŽYHšfŕ§M` °ć ĹŢ!;É pý˛]zíh[XˇĹ' _Ëó#óZ V`Š žž@żË†lĐUP%s„HÁqŔ@×c0T›z˝ľŘPrM)ż©”_7–^•Ë®)wjžK÷•çi€ ¶cąµm´´Oô Ůé BmŇě6_^+ÖŻ9—(®źTČxĺšáč }ŢnýćôĘő›*WmĐŻř[ĹňučÖo¬Üś†)ă?N`™RZ&ľ»h$`ÁŤXHŔmŘŞŠJ@k rţýŇ«żi‹+đv9‘„ŚŚĆbSŃiĺŢ~Óť<ĺ×sďc c€SZ–rëE4Ř{ň*@—EëĆ:›ŔöÇJű>bw×hHy~&WR$– äF«.ĄZ’jť™9úȰ€t;¤tÂĺ›L`ÖMڞtx,mW}ýj"€G€ÁňÁ2h˙h|GJ>Ł5Ím:Ng]O\¸ŤőÂĎ–T裿fał3>ip$Vn,µ gfÓţŕžźH§äy›%@)Óß™r~ᎻڦۀŃB¨nx˙fFK…˘ď? Oő–|-ź÷|c¸|UÖjË'Ĺi-ě ·¨ `U-_Íüci‘[‹ńÖýVţvźŠŠŰĺŔŹ7Ö ™üclťC±ě@,Ű3Nş”Äś_Ę »$¬¨ä¬FR4ČL…”Ó3±É¨˝‘ȨCr| C– …›¸~8%ë$ýF4hŇBřŐ ˇń7ä^«”­¨‘/ŚÖZűĂ`¸ä7ŽyzyŤ˛ömIi98CÉ&޶I[Xçiyę€Pˇsó-ŕőŤ§g€o®B—öĆjŕô ´ÄîfÉë¦d9KM¶Ä@Ä2Xq+đËŔ{űzRčÍń®)”2“Ž}i3¤@eď}ÎWVU!‚čëšUÂŁšĚ­ŘÍ‚[öYÁz­”zŻ`! ĚŤP! ΂ ĹŐé¶ yĽ=„°sĽ…^M[4Âjĺď™|x(…3Şi¬)źCى }| #+#÷ő Ělí7ϵLcÁĹ]ٰ´fޤÁpyEE⊲Éqe_&ULK(źžX2-Ń·8ľËŘVv˝ťúwtęâôN­Ŕ©CWW”W@ßwz*k?‹E,óë=qWlťź?Őś„ŰdÎýf 5ľ˛»=–›®~Żl”M¸{$K† LŢ×SÜݨźz“  pB€#(™«žĐZťNü^'` `Ľ‘Źl´€5)*ÚfŻ“ě×1çaĚusĂÜĆXz×j7­ń»_ /Ř uźĽ Flą …cŻ)_Ć´=6·)k|ÚňŽV¸x*Ę@ÇMú(Ł”Ă•Ch|j˛<˘B°‡6{µp.=´QM©DüWR‘ý›ZŰ–0hô“#‚aŃr s qęË"7čłřne˙$>^wžđ=r;duČö,#ŞGĹ'›”Ć‚SĆŠ[$i:WĆ•ňa,`ŔUH Rhł¸ TĄ˘ĄŃăô'O#›_"Ź0\ąY>e®ßśĆÁeˇG ]SŰóËÜŢ­T',ŽuMBuváĆ)®*é7j­H餭ş% ×°b·"ÖŤ\oAT¨S‹žlQáůO“@f Ŕ˙p PS7jĆPT×»°M—’.QhĹou'×iá XY7ÂŤVÚú­µňĆ<ű6 ­2_ŠXHż¬tš·í(©˘ž—”·î•Ôďł”…-5'źAł&ĆÇ`"ęń†Ź‰ ~5©@–—pŁI€TyzD\ôÚúžČ=Ń ëyS|@MS ( ŠŐq»Ďě Ľ—9†8ů˝§‰\Ä"Š%ň¤oč‚…/JŢ{Ö¬?h4h??çđEL ?öt2@ĘrDâivD(ÇM=ţf•ލcP» ß´v%îˇ3hX;X:CXS¨q(¬íVdß¶8¸_ŃäyĘżOSQß!žîµK± á 6}–ě9y űžż~ßoÄ7¨3 ¸G՞а÷Ň;÷J1+,äéd6¤‘űzŔi"!m—é„R ăÖ[üůč{eşÄ•ĺf” ý¨ôí%ŠBúĹâΊC”E)8¦ôĂĎËg,Ş\÷qĎ!ůÖě)îoÜŇm,`–řeN`‹ŕŤë°5(h¤ŕ8™DS¨ËPµµ›3đË|H>ZŤ.OˇJ@1}ňŹčČĽoď č˝ý-´^;Ţz{gPx®ďܓ꒫Ë9ń]iÓÇŚ7\ž´/ý¬B?în‡‹´î±wL?î†Ć÷ĽĹ=zĄÔi>•Â\g¸ň€{Ľ±Ž?|–’mÜ+qö‰VѲR]q‘® XŻ-Ö©MŻĹ›rC18{٬^ě+>âěňh ~óâUŽ9ĚřO‹âçu‹qRŕôĚgrě’Ľý§oIˇ TŇƓ@€$dp˘­Ěú_áúůxä±J2ü*1őČäĂD E궢Ŕ¤î«>TĆÂK®ÍýWż™éò†Ĺgˇď73mmÎIĽ?qé·¨ŮiQ+ (mże‘Ú´÷gúO<%¸©ąŰéˇăT„ËŞIŞűzćßFż:1ý†ĘĘőWŐ^Ě/*(ˇ˘Ţ]Uýßŕ™čŮp+ŕ  ŻŻ7Đ@H†ĺfF‰řĘí8ëUćűÂč9>Bć÷d1 đ_ő’ô‚éżđżç_e·×Â4_0˝˙—ô‚T]üKąě'Ň‹đR4ü?ÓKVˇ—Źęµ Ľjz ŕUÓkŻš^xµd2ýe0‚’o±CIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/skype.com.png000066400000000000000000000065531361462701300300750ustar00rootroot00000000000000‰PNG  IHDR22‘]ćtIMEÝ(a%C‚ IDATxśĄYkŚ]ŐuţÖÚçś{ď<îĚxŢ~€ c0ĎóJCŇ *Đ„¨iÚ¦$i¨ŞTôˇ¦RŇT‰˘ŞRZ)!© UIÔ$UI$THÚ¨‘(!…@, Ą¦`\l`llO<öĽgîÜ;÷ś˝××çÎűÚ˛µíł÷Úß^{­ý­µŽ„Ь4B ‘Óű|¦’ĎČ,@Ťq"0@Dš ?o‹šŽ ¸Řô#•éĆ«/ű±™ůí h<˝19˝§}Ű®Nm+v®\´,—Išx@}ëřd˝¶;«>9uě[oÄŹťŚN§%0ŔJ đŮĄ­őŹlťşŁÔ?[śÍÄ/lf°¸Ř:Ü+zˇnŮŘÁ8iĚL@}ÓŕÖŔb b'Ç'~ń—/O=8•ŘB\5]Ľ@1ćŔŮ",ŤĚľ@‡d\)ťÚvqijď`űű6č }qą°Đ,Ř›ÔÜ*XŚUž:1s×ÁSGgzśfFM©pEZ2"3D~gűđÇŰ>ąc``C‰ToÁťŮ2¬üîžžřđł~ŇťóD3@+µ»RÔĘA("‚ 0ł?ŢžţÁ޶––Î,ČŮ…7`©ęŽNży˙ÂHĄO]f|›NÔdˇ@̬ľ»0őŤë W÷eFĎvˇ €$ *ź=092ӡΛN~›Ť#D‚ş–}éŕ­O»>t8vfP˛ůN Ŕ§ňăă'~8ÝŞQÁĚ@€|3]@ÝŠ®  ÉLf^…3ˇç®Wř•#ŹĆ’ž Yd¤Šř´ň'ęđ˝R«Ť¦I I’ŕâ P‰ÁŐ˘Ś·€°ńó/Ôź|î’_ÉB˘ŕ;“z–ĹνtâŘőűŞU7dç3s¨ŔŚđĐX¶·éĄĺhk‹v%*ŔdjŻÍۡY?\1xuŇÄ$ÄÄJÔß*ܵ{(łŕV;@D`ĎÔ|BOśGU"°”ť%˝k{ńŁv—ŁÖDVź„3uö?©?t˘>Z EÖĄ@Şđď9\ą´řšţ‹Č–vY!±pĎKŹŢ÷Ęĺě,6Ř Đóö-…ż˝ĽmG9@c †…@!N'ćý׎ÔţîHŐr%Ż–­B3\[<ţř­ŰJĄŇ–h@e““—ĂbˇťŰş™ŮÝCĹGövě(»Ô3 „q"ů#@oČÓ`[ZÜ˝{ÚŢŰŃîÁ°Ų́➭öß˙ÚŚ“ŔUřÎcç"`Ć[“ű®,Č<#…‘"q98ç;Mś:‘7Ô˝ýúćâw®kŹšl „‡µ|}4:™N:ŃĄ»Šo'°VË+‰(Â_íjŤi`¤BÂ)¦Sű—c OŤ§Óž‘`sÉ˝§7ą}sˇ%’,Љ$őöá-Ą;¶,<|tA“U@Bbj"ţ§«_Ľ2(I‰@®·ë5śŢJ‹›ŞLôÜÝ“\ŰćžO9Uł>5őüéK!ńŔáůwő&߼®cWG”:#łŔ÷÷'W…Úl÷˝‘úíś/·–Í(€’€ÓÝťČ΢-`Ľ˛+ŠUŤ„ŔůÖpőůŃz\ŤÝ%˘±4ąF€‡ě§'Ď,9¬ Ä]ÝRčh™‚ĺq\łNö4ü—üřđ¬‡PFH#]˘GgłŹ<=ud60çůí×+÷™G$Ćő¡bđĹÇ&2„ "$# ˛Ł˝đžÎ×~8Ű­Ęő$-°âíČŁćŹ^P|čX-]pUäÇ F‰äą±ôúÇĆ··Gc vtÎCrkX9KÄű«łŐl¦Tč!¨!,IzîÜÔŤdŢLÖ«Š „#Ő `ţú83|psń±÷v˙öĹ-—]¬°ÔBjć  €q,“u{ötýč\&şx¸fťś?:Ń?2ér䑍ÎiaP°u=˙€Čţ‰¬’Y)R"¸ążpsaşŽÎ‡ç&Ň}ăéţńěHĹ[jF ’(#Î’Śg˘3Ăâ»FyT#F&6#Ť5ĘŁšŐTAH„W§Ó‡NÔ>uqŰ‚·"dÁҙ螂۳!ůý!TR;4›ý÷döó±úgŇ_ĚeP‡sŇD<}űéŮvl4P˘ES µZ+Ÿ–ÁÁçĚěęŻí)ŃsŞ ć+Ű"ą¶§pmOá3—´ŤVýoTżňňÜx5HtÖč*× }ˇVË}Nuů<IDłĹ$cµpŰOÇţţ•ąj°$ŇŘ©SĚ4'˘"Č‚ĺ} äţlgůÉ[űvm™…łGđůŽ4]ţ˛|wg9)N&S»g˙äőŹžůŇ˙N?~Ş6ľ`‘ÓŘižĺi .RdN>—vĆ?¸©gK{Ä@•¦Âsç_Öf´´e1)@2Є³ #)‰äŕDzp¬ŽH¶´F7ôn(ÜŘW*GNŤžąň "u¶—ăĎď*fßT×[™„A4‰â°„`Ô×5‚¸ŐB+Ĺšk ˘# D±˙ý™ěűŻWÚ‹îŞ ńű‹·ô÷t%ĄXC`~kN$?´ąôĄ¶h¬dý ERčíň`?ŔHD„„ȶÖr$ôkŁÜUËÍ[«7řzXBťKĂ#ţ‰“5—čÎrôďěřضV("ŃWtWtĆŹÍeŞÖl!-×Y(’×zÜąŇ(‚±ő/ž€0ű“Ë:ö`ŕé_í˙Ä%íô¦ É`̉Rcq‰ňŕDú;OŤ=9şó4‘M%…QÖ 'TC:ßúč°Wx χ#[»v—Đ/"]^¦Bz»q xď5]Wvööľ˝·çÓ;Ú- ‘.Ď42ĐHaĆ˙8Yd‰Có·{Ťäe÷đôÄT:îD Śăö÷nđĐZ‡®\¨oě-“ZROoüÚU]WőýBeŻh$ÁË:ăĄó©@ŔÉ44Üm}$`„ł#cť/śŞ‹@Đ Ń­˝Ý]ĄŞ•Őnśçs™©Ŕ‰D*$Űc}poďPWś-. -Đׇ.jűŤ­­FËINEŞ™śNŃ4Üʡ´ä@í ¸h[1pgצôćeµŞ ÂÉžŞÍgAUŚt"޸Ł3~üýw_ZlQA‹•Ł/_łáÁz‹* dѰöŤŐ_ťNĹISuIŢ„hd˘đËe7’Qˇí“[’GF*iÚ.+‚[#ÔÉá‰ú7^™ýÂî uŞÜŇ=đîľŃŞu6KŤ-‘ěěH: ŽFcÎ)TA0ţőKS t*ˇ5"/2xr1–i˘7őmşsăđ÷†ĹE +/’áË&KîSC4ËŚ*đF‚%7вü2çü 0'ůěsăOŽT5Ö¦olŮb–ÉGDH&ĄňźoëîoťŢ)–ó3’2łO?}ú ĎŹMg–D.ršgNőŔ…Ěj™-d–†<ŕDä4‰t´~ďéÓ_}qJ#1;{¶—ď lmU¬)»‘¤hTŻÜčŘľěÔb®&ČFh‘ŮŽîÂ'¶·ß±Ąő’râÜš¬Cŕ‘Ůô‘ăó™9>ťI˘çl…‡ďŢ>~á;ÖÖNIB\:;ú§ýăŃ ťzĂZvUó†Ŕ–wYGrYg˛­-î-şHŕ‰±…p´’˝<ťţßLV©y8Q§çNÖL:Zk?»ąűť}MJşF*dâĚ™»TţíťÚzd"ŔŚl8ëúĎNTeýÇ¦Í C¦ż¶­úŻ×oŚK=M ŕ ĐÝ×s˙FVţ}TTMdmÚI 'iśvU#ąĐů媢H~wST,tůeN\}V :Đß˙ŔĄ»/Cd®ń¬bM!ÖužĂş×u¨ŔĽż­ţ¶Á NČ&—¸¤Š9?5ńÍĂSsLÎÔ1ŐfőŞ_˘9Ađěow?şĆ®Ů:äóŇÝYaˇˇ@PťyćÄÄ˝ĂŮŹĆ%͡ °Čśż,¦Ŕ¶büŔîÂo^Ň’DH9,äľ©Îůtfzňń“łß=ţkJćRůźČş‚qnR*çŇ« @ZŢ÷ŐË˘Ź uŁĄ=Ç„ójk™hVźžžúźÓ•źŚů}Sv¨Şă))Ëţ&' ÂÜ)Wí–g¸*·lŕ‡â›.ęg±MhKÇ{S°V€SŃ…ÚüdĄúĆTĺőިÚŘĚ\=k$-ImęjŹa?ĂĎgu¶n+ąhĹX®,ó·őÎ Űú{{C”( +Tţ`a)5‘ĽĐ e€ĎčSš-e-""ęLÍU^«cŚý]×ő–/p,VŻ^ť˛gϞò,ËÖTĎČČh?pŕŔ‹n·»@7€#;oGG‡oáÂ…ŰÚÚ&X p:ť»ďľ{Ů{ď˝7ęxä—sF–ĺŰ$IÚÉŰÍ9˙ç|çü{śóMŞ%IÚ,˲c< HOOĎçśËfÚ›{ű‰'žŘçv»?pŠN8CDźř,555¸nÝşjĆŘđęJ `8íŚSş®›+÷9đ †ęH/€[cw0Ć0ƦZŹ[I’F趦µEď_¬Ä1ĆčŮgź­zě±Çö!N…ĂáN‡Ă1⸪Ýnżíý÷ß/ZµjŐ]×m¦±XŁÖóÚęd¬Ś•±Ű'öjkŐmŐŹ3x»Ý®˝đ UĄĄĄ‡ś‰D"-Š˘hńěÇ­˛,G¨«¨¨čxeeĺ«>źŻËü•b•Ř .'ńŢřXő[ŰÜ˝béŇĄź>|řĄŇŇŇ#šu]o“$iĚŢaĚË®ë*çü“z{{};wîś±wďŢé'OžLVUUź>}z{AAAs^^Ţą´´´ Š˘DúűűÁ`0ą¶¶6ăťwŢ™|ÖŹ@#(±`Á‚żßßS[[› }ńŢú#Án·‡ŇÓÓ/řýţäääž™3g6-_ľĽnҤIćEéµč眏JýË „`ڱ›ř$Pq1k†®Ł¦úd (ąşş:ëąçž[XSS“m Âü̢(‘ŞŞŞňE‹H$"oذáĘĘĘY±™@DT\\üŻuëÖŐĚ1Ł…1F†C7Ô€.m:‰hs~Éę{Éë01 /·ńť †D '$ăw€$ăyçkŻ˝vĎSO=őťÁÁÁQÇâC=t¸¬¬¬C«ŕěííť8eĘ”g4Mľ`qÎő˛˛˛Ę’’’Ź1t 6íFŤq@† ěclTĹŹ‡1ď`0¬Q€#8Ů @7 ëŮ_KĆ3¸‰k×®6mÚůâââµ}}}ĂA™]€€®ëí˘Ś1§ŰíĄĄĄťollĚ43`ýúő˙())9  ŔýFđş!Qcţżż¦ "FD %QÍß»wďO’’’ę].WËĺjp:ť ?üđo=Żżţ:€Ý»wËííí“˝^ďÇIII III ^Ż÷ÓóçĎŻ ˘!Ä!„ÍČÎDÄ…N"Ę"˘Â'ź|r»Óélp:ť ‡ŁÁétžXąrĺ\óů˘˘"yńâĹĎż58ťÎ†űďż˙M"ş+Ťzt]×ŔŻ ‹–‚ęďííťRPPđtSSÓMŔpaśóŁśóV]׿ND™ÖâWQQń»âââżuuuµ&''ŹkŠ_·4B0"JâśO:tčĐ·–-[¶A×u9¶Á0\ůc(,,ütßľ}żŇ4í”Ăáčoż.űNpÜ qND"˘ÖÂÂÂc۶m{“sF7Xć÷ĽĽĽŔ®]»v0Ć.čş>x˝|˝¦Đu]%˘L"šäČ‘ÇçÍ›·×fłýÇfł5âóů>Ú´iÓˡPč"ĘÓuÝ«iÚ5ÉÖë^I-őŕViĽ@Ŕ[__ďďëë“333»óňňZEépžÎ !:eYľ˘sýjń•%BĆs`čßŰ7a¨_P0´%Łęč:´Q·ąU®ľ˛łÔ8Ç͆Ʌ‹]]€ĆłŹÜÍq\,Č@]h $@ $@ $Ŕ5ÁśÜóř×UIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/ted.com.png000066400000000000000000000023401361462701300275040ustar00rootroot00000000000000‰PNG  IHDR@@ŞiqާIDATxÚí›ßoUÇ?÷ÎlǶŔn µĄ? R“‚"/UőÉÄŕ“/Ćż@ßĺMă“`|©ż‰šh‚Ń$¤€ BŁ´¤¦T°,lwć–®•ťÎZ5ać&ó°;sÎ=÷Ě÷|ż÷Ţ™Q""$´‰Č„ťŕń#"hŢě°!Á -4© ¤„' Ů*¶$˝Hx ¤ó€TRHU é*–@J‚ÖןĂôÔň,2y5=—..Ý×ö]0ű'ęĚ©x†™ fóvdmŘ™pč/>AŹž^–¸ŻĽŽA˙řýŇ}Ő7Âä8öGďÇxŤÔ7"míxű†M[‘•«'A59úíüňŕęÚ \™\2{=ső®|©±spćęŇ8Ţđö Í­w"ŕo7o ŹÂ-D[xOA6—<Đ#'°˛9¤ąóŘŕÂ(e@jW «r˙´2ć ¨ąBĄGËFÇ—`Ķ RY±´‘ĚŞ _M­ŕÜWú1W€Ůë¨ü ˙$üüVW/ćáÍH6‡,D€·eŇŘr|ňč Ł¨±_+;Îć0]ë‘Ők*ĎŐ7ŽÉôďDVfŁq@Ëý¨óŁ‹ž÷ö>‹i_WŞůé)ôé“č3'Q3W+9!?‹:;‚:uŘ ·ĹÝ×ެ4ś óá{hżttáľř*Ţű*íÎýG‡ şřĆŰž Ńá{ěŰŰűĽţť÷}ůÖđaŞ˝ ŢĎĆŃŁ#Ý€ ĺ6Xß;xH µHĚľLójÜ}C‡^]ąŘŐSWĐż_(_o‡FJ„b6çŕKŕ8‘®ť;řV´ ”o±Fę›đź&s䇸™/Űٲ¤ řßké‹cѵüúµ`ô‹Áq0k;ý#ă•íěHX Ă^»Ř3ˇ_ľçRĺDŞ›{sGH¤őh«Á˙ľ™u˝ČĽv‡]›­ĂŠŰAáj|, C9 výÝţ?¨÷?Źi]i,^W/Öȉč1¸.úňö7_–&rw^_ĺ 5µ·mä_R;ŻŻÓŮ ͵+Bď6ů|©ň=5}뻣d†ă·ĺ/Í­xťÝĺ "ńS|ŘźAr Ń–ĂOîôgŤž×+Ĺ{í*ÖńČ|5Śş™÷‘´µcÖo,űĽ{ D «>ý8<»óĐŐsčDéůáç•R–ăŕvoŔÝ´u!–_CËŔ-Ć`L2Sš‹šKĽľm¸;GjjŁî FťĐơÎ˙§y=QÜ{ŻŻ”*Ç˝´ýą;ŚÝÇR·Ő¶ě`n˙sx;K«P‰(bYH¶ÓÖ^‰Ě¦¤şÚź3LC“Ż]ěń×ÔbVeăűŇÓÚ†×ý î¶]¸}Űş†ŠŚÚať»›·#Ő5• hnŬéđ·ËŐáě‰,uĐíěF56S\éóň`aÚŔ۰Sß¶˙PŐĚĚI~00‘>Kź %é IGČNö«Ň) ¦ř&Rp¤*ôo†’=NI0áß ĄźÍĄ3Á4Ř"2‘ŕńOţnă-Ő†ťľIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/resources/images/services/twitter.com.png000066400000000000000000000021201361462701300304260ustar00rootroot00000000000000‰PNG  IHDR22?± pHYs  šś cHRMz%€ů˙€éu0ę`:o’_ĹFÖIDATxÚěÚk”eđßŘZćŐvS´ Tćv5"˛­‘’ÄfAE—OQŐ‡.ßB©>”Q`Zµ¤E÷0¤,7 Ł(( ±¤˛t±Z[ĄuS[wúđž‰iŮą˝łłŘţáeßŮ}źó>˙=ç9ç<˙g2ŮlÖľ€qöŚ#Ň ´@ćő?šńî#q9fáLŔ6 +±˝’ůgŻmli ¸wbr‘ż_‚;° Oăě-xf<:q1îĆ`ah„Ą8ĽA$ŽÇ‡XP‚D>ŽĂBĽ‡Ł°NÇř]ř »˙uM.Ă특ř+E“đ>¦W9îJ|awj‚ʰ¤Ôbż&~^ĺhM1©Ä ʢ8ějRYYyf-qÚčßżż)E`C(sĂ 7ZfČľ}űLI·‚ůf®Â|ÖY»v­­ŃUú[@\ś 1áč_„´ŠK ŔâĹ‹ÓŇ˙ôl d·Î€µś‹öH ôeâ*ßX„,Öă€PG\ZţxŐj+CYĺé E’zD?ÜŁ€ŕ*d1ä(ç~‘¦ť+!'>FűŚá*‰Rř\1t„  \]¨îîBHu§M÷1 &·ÖÁšĹĐßÂ}ŐBzŤ™ätň”›4kŃď'ĆÓçzÜ:Y Ąc‘$Ôť’ 'Śő®aśh}'† “ؤIŇ1a‚DÇ—¦Ö{îY[;2{¶í۰^â'Ov ¨S vjS§Ú¦ÉÁó˛Ü|s§ě "íÜ/‘{ď3đŃ)S$öüsť5SĽ™Óí·őő×$ţć;4€2Ć,š‡ňÁĽ‰G'JrŔŃôbĚiú9—Âů0X@±'ž0 $_zQâ‹Jl‰Z}ĺŇřĺ:iúî[iSOHĚ›+IM ćÂSzkÖd”ŤČ…€qkdŹÍzř!‰>ţXĘ]Ui¬ ĐꏤaÓ7)@Ó¦I"ý0ËE@^\Ľ×_ąî:i."ż-\(G>üPju1?}ă S*[q?×ĎaóŹM-;Í í ´Ť«Č,¤q’±Đ˛%ŇöůgŇúö[’ś9C’92  ·zF7U· nDaÍJÉe'#Y@M+W¦bĘ7™˙čŃřÄâ0‹ß¶ß¤Ć zĺ˘`×"j|`‘ŘĐ’”YőEܱĂú)jŢ÷ߛړ öŚÂ:Žł<ĄëäKî s9”ź3Ç\÷‹IýqĂOÁÁ®yťĹ,ČŮ_ҧ.¬ď\éhi±Ť–´éwµx¦”Z’¶% ćg!VB:Ďúý–IĎ éu…DŇ3.g)şrJ?[DÓ.'“«Â¤b„ áV‘ąóĚŹ-©rg›^;ÂŹikęş Ë–É‰ÇĘIŰôę+ć¶.#¶ ľENęAťzď]ëoÔőĂ:׹q”ص+Ą ŹÄt „qáź¶'÷ł9i"&˘×^›Ňşż´źĐ[řFaö<ÁşŽÂuu–$čĂr‡i×öS čÖ­]˘ ˘–HhăF[Wr@ ‹=•yżţbm;aÝ7íĐ‹&`ă_|‘I­{÷š%Ű%6l0ąźţQ qMŤů€`1ËZO0d÷0UÔ Ĺ+*,ŕ-«ĺz±¤ÚŢÄcú@üÔí@–ż/Ţő×KĂ“OY¬ŞĘę×(´}»Ĺ ±=tČd$K= m‚ź †ÚŐĹFÜ•‚{ąB=uĘöúWáÔţz [ŤRĆ­ěŮĐ]+ Y5§*s#ve ¨`'ý†n˝UÚu2ŠÁ**­ŇRZš*^:.Dߍ®9 ĹŤLduDc„¶5"FZnh|xěR[ú°Ĺz;v›ČA@(›†48ŤŐ´~ ČŘ(HC߾Ғ>9˘c2@´ Ňnśü¸őóŞDÁě`ç ×|ä°x‘°Uć KË~ v-=©ĆŰo3ĄXŘçŇ@¨ĐÇűô‘š.b˙Ůĺ–{ĎÝIg€0Ź,Dúý]O—Ű4Dş5ฬR‹f±ß†•:_-ÍvŰĄÂ×]z™éÓĺ+ ŮĹP´îĘ+Ťův'É{ lP{Ó ůcçN“·TW›2+ć9 o ËHJˇ-[¬ p‹†(‚¬a!¦ű0¦Ë—F˛ţyŕ’‹äŔ}R¬ßČ(T‘š94çë‡kĘžN]uÔ Ľ‡shâ#ÖÇ>ěôś‰â&_Ů®Đ_ŽgČ·“Wiś r€UééˇDőťw¤úµÍ<ĆaAXôgŻ3žučgNůĄ—ü§óĎłCěňĂ â÷^|‘1 ÂÖî}ľě˝đ‚ÓĺÚf3'·ßô8ן™§lcµíćű×qk99mWą(/nźśĐgź-»Î=÷Ś1űoŞO…tÉEy@&ŢrÎ9¶ żAĽµWŻ.s®u»ývęţ.™Q§@ ‚¶ţÓO¤ęĺůR®/5ÇlŔI9ţZ+řW˝{Ě?h|dĎg˝ěőŮŻvÍjóŚÎ¨ ą;™‡‚•áP«e˘BŮţ‚™5źő¨QĹPŃ@zýG€ü ŹşŻf;«{ąIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/000077500000000000000000000000001361462701300223425ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/BadBrowser.html000066400000000000000000000032171361462701300252650ustar00rootroot00000000000000 {{ErrorTitle}}
{{ErrorHeader}}

rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Error.html000066400000000000000000000020711361462701300243210ustar00rootroot00000000000000 {{ErrorTitle}}
{{ErrorHeader}}


{{ErrorDesc}}

rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Index.html000066400000000000000000000025671361462701300243110ustar00rootroot00000000000000 {{BaseContentSecurityPolicy}} {{BaseAppHeadScriptLink}} {{BaseAppFaviconPngLinkTag}} {{BaseAppFaviconTouchLinkTag}}
{{BaseAppBodyScript}} rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Social.html000066400000000000000000000007711361462701300244470ustar00rootroot00000000000000 {{RefreshMeta}} {{Script}} rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Themes/000077500000000000000000000000001361462701300235675ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Themes/template.less000066400000000000000000000216651361462701300263040ustar00rootroot00000000000000 // mixins +++ .thm-linear-gradient-mixin(@start, @end) when (iscolor(@start)) and (iscolor(@end)) { background-color: mix(@start, @end, 60%) !important; background-image: -moz-linear-gradient(top, @start, @end) !important; // FF 3.6+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start), to(@end)) !important; // Safari 4+, Chrome 2+ background-image: -webkit-linear-gradient(top, @start, @end) !important; // Safari 5.1+, Chrome 10+ background-image: -o-linear-gradient(top, @start, @end !important); // Opera 11.10 background-image: linear-gradient(to bottom, @start, @end) !important; // Standard, IE10 background-repeat: repeat-x !important; filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start),argb(@end))) !important; // IE9 and down } .thm-border-radius(@radius) when (ispixel(@radius)) { -webkit-border-radius: @radius !important; -moz-border-radius: @radius !important; border-radius: @radius !important; } .thm-box-shadow(@shadow) { -webkit-box-shadow: @shadow !important; -moz-box-shadow: @shadow !important; box-shadow: @shadow !important; } .thm-body-background-image(@value) when (isstring(@value)) { background-image: url("@{base}@{value}") !important; } .thm-body-background-image(@value) when not (isstring(@value)) { background-image: @value !important; } .thm-rgba-background-color(@simple, @rgba) when (@rgba = false) { background-color: @simple !important; } .thm-rgba-background-color(@simple, @rgba) when not (@rgba = false) { background-color: @simple !important; background-color: @rgba !important; } // --- mixins .thm-body { color: @main-color; background-color: @main-background-color; background-size: @main-background-size; .thm-body-background-image(@main-background-image); } .thm-loading { color: @loading-color !important; text-shadow: @loading-text-shadow !important; .e-spinner .e-bounce { background-color: @loading-color !important; } } .thm-login-desc .desc { color: @loading-color !important; text-shadow: @loading-text-shadow !important; } .thm-login { border: @login-border !important; .thm-rgba-background-color(@login-background-color, @login-rgba-background-color); .thm-linear-gradient-mixin(@login-gradient-start, @login-gradient-end); .thm-border-radius(@login-border-radius); .thm-box-shadow(@login-box-shadow); &.submitting-pane.submitting { &:before{ background: @spinner-background; .thm-border-radius(@login-border-radius); } &:after{ border-top-color: @spinner-color; } } } .thm-login-text { color: @login-color !important; .legend, .e-checkbox-icon, .g-ui-link, .social-button, .language-button { color: @login-color !important; } } .thm-powered, .thm-mobile-switcher { color: @powered-color; a { color: @powered-color; &:hover { color: lighten(@powered-color, 20%); } } } .thm-languages { color: @languages-color; .flag-name { color: @languages-color; border-color: @languages-color; } } .g-ui-menu { color: @dropdown-menu-color !important; background-color: @dropdown-menu-background-color !important; } .g-ui-menu .e-item > .e-link { color: @dropdown-menu-color !important; background-color: @dropdown-menu-background-color !important; > i { color: @dropdown-menu-color !important; } } .g-ui-menu .e-item.selected > .e-link { background-color: @dropdown-menu-selected-background-color !important; } .g-ui-menu .e-item > .e-link:hover, .g-ui-menu .e-item > .e-link:focus { color: @dropdown-menu-hover-color !important; background-color: @dropdown-menu-hover-background-color !important; > i { color: @dropdown-menu-hover-color !important; } } .g-ui-menu .e-item.disabled > .e-link, .g-ui-menu .e-item.disabled > .e-link:hover { color: @dropdown-menu-disabled-color !important; background-color: @dropdown-menu-background-color !important; > i { color: @dropdown-menu-disabled-color !important; } } .thm-message-list-top-toolbar, .thm-message-list-bottom-toolbar { .thm-rgba-background-color(@message-list-toolbar-background-color, @message-list-toolbar-rgba-background-color); .thm-linear-gradient-mixin(@message-list-toolbar-gradient-start, @message-list-toolbar-gradient-end); } .thm-folders .e-link { color: @folders-disabled-color !important; &.selectable { color: @folders-color !important; } &.selectable:hover { color: @folders-hover-color !important; .thm-rgba-background-color(@folders-hover-background-color, @folders-hover-rgba-background-color); } &.selectable.selected { color: @folders-selected-color !important; .thm-rgba-background-color(@folders-selected-background-color, @folders-selected-rgba-background-color); } &.focused { color: @folders-focused-color !important; .thm-rgba-background-color(@folders-focused-background-color, @folders-focused-rgba-background-color); } &.selectable.droppableHover { color: @folders-drop-color !important; .thm-rgba-background-color(@folders-drop-background-color, @folders-drop-rgba-background-color); } } .thm-settings-menu .e-item { .e-link { color: @settings-menu-disabled-color !important; } &.selectable .e-link { color: @settings-menu-color !important; } &.selectable:hover .e-link { .thm-rgba-background-color(@settings-menu-hover-background-color, @settings-menu-hover-rgba-background-color); color: @settings-menu-hover-color !important; } &.selectable.selected .e-link { .thm-rgba-background-color(@settings-menu-selected-background-color, @settings-menu-selected-rgba-background-color); color: @settings-menu-selected-color !important; } } .thm-message-view-background-color { .thm-rgba-background-color(@message-background-color, @message-rgba-background-color); } #rl-app{ display: block; } html.no-css { margin: 0; padding: 0; font-family: Arial, Verdana, Geneva, sans-serif; body { margin: 0; padding: 0; } #rl-loading, #rl-loading-error { position: absolute; font-size: 30px; line-height: 130%; top: 50%; width: 100%; height: 65px; margin: 0; margin-top: -60px; background-color: transparent; text-align: center; color: #333; } .progressjs-container { display: none; } .thm-body { color: #333; background-color: #aaa; background-image: none; } .thm-loading { color: #333 !important; text-shadow: none !important; .e-spinner .e-bounce { display: none !important; } } .thm-login-desc .desc { color: #333 !important; text-shadow: none !important; } } // glass style html.glass { @glass-color: #fff !important; @glass-p-color: #aaa !important; @glass-error-color: #f76260 !important; @glass-m-color: rgba(255, 255, 255, .8) !important; .thm-login { background: none !important; background: rgba(0, 0, 0, .5) !important; box-shadow: none !important; border: none !important; border: 1px solid rgba(255, 255, 255, .2) !important; .controls { .input-append .add-on i { color: @glass-m-color; text-shadow: none !important; outline: none !important; box-shadow: none !important; } input { border: 1px solid none !important; background: none !important; outline: none !important; text-shadow: none !important; box-shadow: none !important; color: @glass-color; border-color: @glass-m-color; &::-webkit-input-placeholder { color: @glass-color; text-shadow: none !important; } &::-moz-placeholder { color: @glass-color; text-shadow: none !important; } &:-moz-placeholder { color: @glass-color; text-shadow: none !important; } &:-ms-input-placeholder { color: @glass-color; text-shadow: none !important; } &:input-placeholder { color: @glass-color; text-shadow: none !important; } &:placeholder { color: @glass-color; text-shadow: none !important; } &:focus, &:hover { border-color: @glass-color; } } .btn { border: 1px solid none !important; background: none !important; outline: none !important; text-shadow: none !important; box-shadow: none !important; color: @glass-color; border-color: @glass-m-color; text-transform: uppercase; font-size: 13px; &:hover, &:active{ border-color: @glass-color; } } &.error { .input-append .add-on i { color: @glass-error-color; } input { color: @glass-error-color; border-color: @glass-error-color; } } } } .thm-login-text { color: @glass-m-color; text-shadow: none !important; .legend, .e-checkbox-icon, .g-ui-link, .social-button, .language-button { color: @glass-m-color; text-shadow: none !important; } } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Themes/values.less000066400000000000000000000040611361462701300257570ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #e3e3e3; @main-background-image: none; // "images/background.png" @main-background-size: inherit; // LOADING @loading-color: #000; // #ddd @loading-text-shadow: none; // 0px 1px 0px rgba(0, 0, 0, 0.5); // LOGIN @login-color: #555; @login-background-color: #eee; @login-rgba-background-color: false; // rgba(0,0,0,0.7) @login-box-shadow: none; // 0px 2px 10px rgba(0,0,0,0.5) @login-border: 1px solid #ccc; @login-border-radius: 7px; @login-gradient-start: none; // #f4f4f4 @login-gradient-end: none; // #dfdfdf @powered-color: #333; @languages-color: #333; @spinner-background: rgba(0,0,0,.3); @spinner-color: #fff; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #444; @dropdown-menu-hover-color: #eee; @dropdown-menu-disabled-color: #999; @dropdown-menu-selected-background-color: #eee; // FOLDERS @folders-color: #333; @folders-disabled-color: #666; @folders-selected-color: #eee; @folders-selected-background-color: #333; @folders-selected-rgba-background-color: false; @folders-focused-color: #eee; @folders-focused-background-color: #333; @folders-focused-rgba-background-color: false; @folders-hover-color: #eee; @folders-hover-background-color: #333; @folders-hover-rgba-background-color: false; @folders-drop-color: #eee; @folders-drop-background-color: #333; @folders-drop-rgba-background-color: false; // SETTINGS @settings-menu-color: #333; @settings-menu-disabled-color: #666; @settings-menu-selected-color: #eee; @settings-menu-selected-background-color: #333; @settings-menu-selected-rgba-background-color: false; @settings-menu-hover-color: #eee; @settings-menu-hover-background-color: #333; @settings-menu-hover-rgba-background-color: false; // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-rgba-background-color: false; @message-list-toolbar-gradient-start: none; // #f4f4f4 @message-list-toolbar-gradient-end: none; // #dfdfdf // MESSAGE @message-background-color: #fff; @message-rgba-background-color: false; rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Views/000077500000000000000000000000001361462701300234375ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Views/Admin/000077500000000000000000000000001361462701300244675ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Views/Admin/AdminLogin.html000066400000000000000000000050631361462701300274020ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Views/User/SettingsThemes.html000066400000000000000000000037601361462701300302170ustar00rootroot00000000000000
  


   
rainloop-webmail-1.14.0/rainloop/v/0.0.0/app/templates/Views/User/SystemDropDown.html000066400000000000000000000107051361462701300302070ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/check.php000066400000000000000000000021771361462701300213610ustar00rootroot00000000000000 function_exists('curl_init'), 'iconv' => function_exists('iconv'), 'json' => function_exists('json_decode'), 'DateTime' => class_exists('DateTime') && class_exists('DateTimeZone'), 'libxml' => function_exists('libxml_use_internal_errors'), 'dom' => class_exists('DOMDocument'), 'Zlib' => function_exists('gzopen') || function_exists('gzopen64'), 'PCRE' => function_exists('preg_replace'), 'SPL' => function_exists('spl_autoload_register') ); if (version_compare(PHP_VERSION, '5.4.0', '<')) { echo '

'; echo '[301] Your PHP version ('.PHP_VERSION.') is lower than the minimal required 5.4.0!'; echo '

'; exit(301); } if (in_array(false, $aRequirements)) { echo '

'; echo '[302] The following PHP extensions are not available in your PHP configuration!'; echo '

'; echo '
    '; foreach ($aRequirements as $sKey => $bValue) { if (!$bValue) { echo '
  • '.$sKey.'
  • '; } } echo '
'; exit(302); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/include.php000066400000000000000000000201401361462701300217150ustar00rootroot00000000000000 'localhost' !== $sClearedSiteName? 'imap.'.$sClearedSiteName : $sClearedSiteName, // 'IMAP_PORT' => '993', // 'SMTP_HOST' => 'localhost' !== $sClearedSiteName? 'smtp.'.$sClearedSiteName : $sClearedSiteName, // 'SMTP_PORT' => '465' // ))); // } // // unset($sConfigTemplate); // } unset($aFiles, $sFile, $sNewFileName, $sNewFile); } } } unset($sSalt, $sData, $sInstalled, $sPrivateDataFolderInternalName); } include APP_VERSION_ROOT_PATH.'app/handle.php'; if (defined('RAINLOOP_EXIT_ON_END') && RAINLOOP_EXIT_ON_END) { exit(0); } } rainloop-webmail-1.14.0/rainloop/v/0.0.0/index.php000066400000000000000000000000001361462701300213720ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/index.php.root000066400000000000000000000006541361462701300223730ustar00rootroot00000000000000F(1NHHPaint.NET v3.5.10˙ŰC    $ &%# #"(-90(*6+"#2D26;=@@@&0FKE>J9?@=˙ŰC  =)#)==================================================˙ŔâĐ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?óČő8›ď«)üęĚsĹ'Ü‘O¶kŠŽDvÇ5ľ§EEa%ÔŃýŮčy«1ę’ľŞßN*yYĽqp{čjQTÓR…ľöĺúа“Ç'Üu?Ť+4o‘–Ě’Š(¤XQEQERRŃ@%P ˘Š(˘Š(¤Ą˘„˘Š(˘Š(˘Š(˘Š(i)h aEPKEQEQE†-”´RŇRĐEP0Ą˘Š3EPKIK@ŠZ(ĹRĐ1)h˘€ (˘€ ZJZ)i)i (˘Šc (˘-%-QFhQE-QE *7ž(żÖH«ő5ZMZÝ3·sźaM&Č•XGâeę+MbCÄh«îyŞ˛^Ď/Ţ•±č8ŞPg<±´ÖÚ›Ň\Eß‘WŰ5R]^áśţB±hŞPG4ńÓ ±~]^wá öäŐ9&’S™›ęi”U$‘Í:łźÄŢ’ŠfbŃIE´™˘€4f’—€(˘Š`Ą¤Ą AEPEbRĐRŃE˘–­Űi“Ü`…ŘżŢn(m-Ć“{*Ĺ˝Ś÷'÷hv˙xđ+fŰH‚ĚŤęz~U|(0+Věoí¶Ú,Qá¦>czt˘±…(¤” ĆRosxĹGa S‚Ó‚Ó‚Ô–4-8 pŕ´†4 P´ŕ)ÁiM8-8 p†4 pZp R¸Äś8-8 @4-8-.)ŔP1¸ĄŰOŰJ ž.)q@ Ĺ.)ŘĄ.)@§b Ĺ.)ŘĄŰ@ Ĺ❊1@Ćâ“üQŠf(Ĺ; âŠ}q@Í&*NôŇ)ŚŠi!Ň)Â*SL"¦R‘L4Ŕ‰…0Š•…Fi‰©†¤aQš¤"2*3RL"ȨĎZ”ÔF¨CU M±n«UóYzł|ŃŻÔŐÁ{Ću˘Ěę(˘şŽBĹ‚o˝zţUŃÖŽ›®Ëukr±žçŻŤ©ß»ŠZ*NŃ))h BRâŠ)€QKHh(˘Š%´””RŃŠ`%Q@„ĹĄ˘€Š( Ł´P!)1KE%´PRRŃ@„˘Š(˘Š(¤Ą˘ E-”QEQEQEQEQEQEQEQEQEQE%-PEPEPEPEPEPEPEPEPEPEPEPEPEPEP+EVçĎ…Q@Q@ĄĚŃýŮ~5:jrŻŢ ߥS˘•‘¤jÎ;3Q5HĎßFNjtĽúH׊̧•G5ąĐ† 2¤ěh®}Y—•$cS%ěéŇB~ĽŇä5Ž1uFÝ”ş¤ď*źŇ§]R3÷‘‡Óš\¬ŮbiľĄÚ*şß@˙ÇŹ¨©–Dşę~†•™Şś^ĚuQHaEPIKE%´”QF(ĹQŠ1@Q@ EPKIK@Q@Q@RĐ0˘Š(h˘ŠQE-”´QE QEPŃE )i1F)´Rb–€ ZJZQE˘’–…Q@Ö‘#űî«ő5 ęÉÖ@~śŃb\ăŮfŠĎ}b!÷ŰëĹW}bS÷WëÍW+1–*’ęlR 2ÄďX/¨\żüµ#ýŢ*vs–bÇÜÓä1–:?eď}oŢ”gĐsU¤Ö"_¸Śß^+ŠjĆXÚŹm 5y›î*ŻëU¤»ž_ż+lâ ˘ŞÉň­R[±IĎZ)(¦f-¤˘€’Š(h˘Š(˘Š(ĄĹĄĹ-% (Ą Š( Š( Š)i JZ(¦EK ´·!o~Ő§oˇž Ă˙ŔWüjŇܨÁËc!T»aA'ĐV…ľŤ<ĽÉ×ß­mAi¸ÄH«ďާŰYJłčo ©NŰM‚ßSsyą«€S€§Xą7ą˛Š[ Ĺ(ŕ´ŕ´Š°ĐľÔŕ)ŔS‚ŇĐ=©@§§Ąp vÚpZp\҆Ĺ<-8-8-+€Đ´ˇiáiBŇĐ´ŕľÔŕ´ŕ´ @)ŔR…§…¤BÓ‚űRJ ÔOĹ(Z.1 Râť¶—€h¸§K¶€ŹjP)ŘĄĹ4 1N KŠ@3bź¶Ť´ÜSH©6Ҧ1IŽjM´„P1Hiř¤ĹGHEHE7¦‘R0¦LDdS©M1…1LaRšaŔ‰…FELj&Ş ŚŠ”ÓTfĄj‰Ş„1Ş"*SQšhDf±u6ÝvG÷@´kźşm÷2ö«j[×~é%-%nsú|˛ż©µj–’›lAţń&®Ö2Ü÷pŃĺĄ%¸ŁŤÄ¤Ą˘€–Š1Š &)1KE%´b€Š1F(Rb–Šm´b E˘˘ŠLQKE%&)qF(”RŃŠmĄŁ”RâŚP!´RâŚPQKŠJ(˘ŚPE¸ ¤Ĺ-Ł´PbŚRŃ@„˘–ŠJ)h ˘–’€ )h ˘ŚRĐQE Š1F(˘ŚQ@bŚPEŁQF(ĹQF(˘ŚQ@Q@Q@Q@bŠ(Łb€ (˘€ (Ą V’Š+s炊( Š( aEPER˘Š(˘Š(˘Š(ë<‰÷dařÔË:˙~˘«QE‹S’Ů——T}äSôâ¤]UŢŤ‡ĐćłhĄĘŤ"˘ęk®ŁęHúŠ]ŔÝ%_Äâ±(ĄČŤ.}Qľ®ŤŃúusÔá,‹ŃŘ~4ą XÎčߢ±îué#TPś?QG#-báŘע˛Ć©/uCO©ďü .VRÄÓ}M*ŐSĽmOś'¨ařRĺeŞôßRÝ-U…ąţ"> Ó…íą˙–Łň4Y•í ú˘Ĺş€˙ËTüéÂxŹIóĄaóGą%ß1ń/çJ}GçAWŠ2=h bŃE Z( aEPŃIFG­-›‡¨ŁĚAŐ—ó .…Ĺ-3Ďu‘?:iş€u•?ďŞÍÔ––«›ëq˙-Wđ¦ťJŘ?@hłµ‚ę‹TU#ŞŔ:?…0ęńŽ‘±Ł•’ëÓ]M+,ëÝ‹ó4Ă«Kü(ëš|¬—ФşšôV)ÔîFQô_\7Y[đâź#!ă!Ń3zşŻŢ`>¦ąćšFűŇ1üi„“O‡Ží kËuë2~5jvëщú âŽDfńłčŤvÖ#v6?SŠ…µ‰ÝŤGÔćłč§ĘŚŢ*«ęZmN忌 ¨^ćgűŇąüj:*¬ŚĄRrÝ…RP@´RQ@…˘’–…RP!h˘’€ ZJZQE ZJZ(Ą˘€ QE-RQ@ IKF()qEQKŠ(ŁTđŮĎpw#×µ&ě4®AJ'dűVĽC;ţ ţ5Ąś6ă÷q€}{ÖnŞ[ĆŚžćUÄŘ%v/«VĄľŹ\É™ߥhN±•I3xŇŠ±…(ÂťŠpŕľŐ™Ą†KŠxSN í@Ć…§N JĆN NŰíN Jŕ0 vÚxZp_jWÜRO })Ę´®BÓ‚ŠpŕľÔ®1 S‚Ó€§cÚ€.)Á}©Ái hࢗđ)ݢś.)q@ ŠP)Űi@¤11KŠ\S±@ Râ—m.(1KŠP)qHâ—ěR@ Ĺí´b€F)ŔQŠn("źŠB(†Š~)1Í3„T¦‘@ăšJy¤Ĺ0"aM"Ą"EFEFEJiŤT"")Ś*CÖšÔŔŠŚÔ¤Tfš Ť…LÝ*&HDFŁaRµFÔÄFŐ ‘©†¨D20Tfěk›'''˝oß¶Ë9r1\ýtRZŐŢ©SŁ]ň*˙xZĄs¤łO.Ň%ôQSP”µÎ}U’BQKILbQKI@(Ą˘ ŠJu4Ó˘Š(QERRŃ@ E-%”¸ŁÄ%%-”RŇPIKEŠZLPEPŠ(˘€b–Š%¸¤ ˘–ŠLQKI@Q@))h Ą˘€RŃŠ&(˘Š(˘ŠJ)h ˘–ŠJ)i(˘–ŠJ)i(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(ĹQ@‚Š( ˘–ŠJZ( Š( Š( Š( g)EVçÎ…Q@˘Š)i( Š( Š)h(˘Š(˘Šp˘ŚQHŠ)(h¤Ą Š( Š( Š(¦ER˘Š(˘Š(Ł$w4Q@ ążĽ:]ďýăůÓh wcÄŽ?Ťż:_:Oď·çL˘€ćcüé?ľßťtźßoΙEĚűŹó¤ţű~t†W?Ćßť6ŚĐĚw˙ŢoΓ{xţt”PbäúšJ( .´”´ÄQE (˘QHŠ( Š( Š( Š( Š1F(˘—b€ŠZ()hĹ”RŇĐh§Q@ E-bŠ( ŚŃŠZJZ( AKIE Z(ĹRÓă‰ĺ8Ť aHQZ0čÓÉ#ÇćkB "Ţ>X?ítüŞHŁEJLŠ &8Ťľ‚ŻÁ˘Jř2°Ač95¶‘ŞŚ*€=§í¬ťWĐÚ4RÜĄ—oÍíęÜŐŔ  ”ŕ)Ák&ŰÜŮE-†íĄ OśĆb”-<-;m+ŚhZpZP´ŕ´ hěS‚Ó‚ŇiÁiűE(ZWĐ´ŕ)áx§¤S‚Ó‚Ó‚Đ1ˇiÁiÁiái `ZpZvÚpZ@4-8-8-;€nÚP)ŔRí cqN K¶ś  Râś4 pR…§b ťŠ\R‌R✊1NÚ)q@ Ĺ.)qJ §ŕQŠf(§bŚPqIŠ~(Ĺ3”úiŔm!üRP"2)¸©M0ĐdS©M1©Ň*CL4ÄDG4Ć)ëQ°¦L*6+TMT„DĂŠa©Ł"©ŚÔMR°¨ŘS¦‘…Fj„fęď¶Ř/÷š±kSYož$ôÖeuS^éÇUŢbUť97ßD=jµhč±î»fţęŐIŮB<Ő"ĽÍĘ)h¬|J(˘€ŠZ)€”QK@ ES(Ą¤ AE-””ęJJ)h BQERb–ŠJ(˘ E-ŔJ(˘€ŠZJ))h BQKŠ1@ EPIKE%´P!(˘Š(˘’€ŠJ(Ą¤˘Q@))h ’–’€ )h ˘Š(˘Š(˘Š((Ą˘€ŠZJ(˘Š(˘ŠZ(˘Q@ EP0˘Š(˘Š(QEQE (˘Š(˘Šĺ(˘ŠÜůŔ˘Š(˘Š(˘Š(˘’ŠZ))h˘Š(QEQEQEQŠ( Qš(˘Š(ćŠ( ŠZJáE´Ģ–Šq(Ł´”RŇPŃIŠ1@ E&)q@bŚPE˘€ (˘˘ŠZ`%¸˘€¸”RŃ@\(˘–\J)h ĄĹPŠ(˘€ (˘€ (˘€ (˘€ (˘€ (Ą ĄÍPIKERRҢŠZJ)h aE(ž~•f-:â^‘=[ŠM¤ 7±V–µaŃ3Ź:L{(«đéÖđôŚęÜÔ:©*2fVňĚw7¸UčtYźV=&¶‚ăâžłu_ChŃKr„:MĽX%KźV«©ET;RJdäŢćŞ)l7ŕ´ŕ)Ái0-8-8%8-+ŚfÓéOÚś”- ;ŕ´ŕ´®1iÁiá)Űh¸ě0-8-8-8%+€ÜRO N Hcӂӂӂҧ…ö§§ cӂӂӂҸ(ZxZ\RˇiŔR✍Ĺ8 \S¶Ň RN” ĐqNś” @4 p¸ĄĹ&)iqKŠCbťŠ1@ ŠZ\Râ€bś â” \R R)qK@ ŧb’€§Q@ "ŚSŤ! âšE>ŠaŇ)ćšFiŚŠi!Ň(")Ś*FĆŔ‰Ş6©H¨ŘUŤŞ&)S t¦•…F© ‘5DÜÔ­QµR&¨Ú¤jaŞB9íU÷^°ţč©Ô×OľęV˙hÔ5ŮdŽ ;ɱ lčIĺRc×C¤&Ű?Ţ$ŇžÇV7«~ĹĘ)h¬OhJ)i %RÓ(Ą˘i)Ô”ŔJ)h BQŠZ((Ą˘€’–ŠJ1KE’–ŠJ)i(Ĺ&)h BQKI@&)h ˘–Š`%%-J)h ¤§RPQKE%%--E-”RŃ@ EPEP ˘Š((Ą˘€Š( Š( Š( Š( ˘–’%-”RŃ@ KEQEQEQE”RŇPE´”RŃ@ E-”RŃ@ E-€Ö‘ž™Y°ű¤˝I]Ď­ §U4ĘŐĹ1˘VűĘ fŃWZŃLЉ¬Ř}Ň W˘¤h$^Ş ŹRQEQE”RŃ@%-QE ŠJZ(¤˘…-%- (¤ Ł4”´ (˘Š)i( ˘’ŠZ)( ˘’ŠZ))h˘Š(˘Š(Ą¤˘€ŠJZ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(Ą¤ AE-QEQEQE –Š(˘Š(˘ŠpF=ŤŠx„÷4ď(´ &ŕ;Ó®иâ«Đ¦P:sW4’ęé–UĘ…Î3YŐ­áńţš˙îQQ7h˛ˇ¬‘µEÂF«ô0 S±\­ÜíHhZpŕ´»i n)ŔSÂÓ¶Ň(`𢜜+Ś`QNśś K¶¤ K¶•Ć0-;m<-(®1ˇivŠxZpZWÄßŢZбö'ţňŃö)=Wó Ez*ÇŘä˙gó¤ű$žßťAEXűžßťc“Űó dT˙c—ýźÎʱÉţĎç@(«b“Ő:>Ĺ'ŞĐz*ȱď-/Ř[űăň eZ*ßŘŰý)EŠ˙|ţTŔ§KWE’xÓ…”~˙ťb… -"ßƜ-âŔ(°´ Zb$*vĐ; ,XŤĎE?•8[Ę€Ö–Ú\P3…¬§°ŤýA‡÷@ҵrWoć]ĘŢ®q[ŃZÜçÄ?vÄ4QŢŠé9 ­7§â“n(Ĺ;b€Š1NĹ bŚS±F(ĚQOĹ&(ŁüRb€Š1NĹ bŚS±F(ŁüQ@ ŧR LTŁ(Ĺ?m QŠ~(Ĺ3bźŠ1@ ĹěQ¶€Š1NÁŁ€bťŠ1@ ŧb—ĚR❊1@ ŧbŚP!¸Łě\P1ĄĹ;b€Š1OÁŁi b—ěQŠn(Ĺ;¸ b—ěQŠn(Ĺ?b€Š1OĹ b—ěQŠn(Ĺ;b€Š1OĹ.(äČžVŤăZś¶’,QH0Č Źj¤j-”´ŔJZ( ˘–Š.QKŠLP ˘Š)€QE”b–ŠJZ( ’–ŠJ)h ĹĄ˘ ˘–ŠJ)i( ´b E.)((ĄĹn(§RPQKI@‚Š( ˘–ŠJJZ1LVŠ\RPRŃ@¬%%-”RŇP!(Ą¤ ˘–ŠJJZ(”RŇPEPQKI@‚Š(¦IKE%-%QE)(˘€ (˘€Š( Š( Š( ŚŃE Ńš( §â“Đ|čÚ)ؤĹ%&)ؤ Ĺ¸ŁÜQŠv( ŃKŠ\Ph§b“”RâŚPb“ěQŠn(Ĺ;b€§âŚP1KŠv)1@ E.)q@ Ĺ.)ŘŁÝ´bťŠ\P1F)řŁÜQŠv)q@ Ĺ.Úv(Ĺ7m.Úv(Ĺ7miŘĄĹŠ1OĹ C1KŠ~(Ĺ7bťŠ\P1KŠv)q@ĆbŚSńíF=¨ĚQŠx¸ö dxĄĹ;¸ö bŚSńíF=¨ÜRbźŠLP1¸ŁěR 1OĹ QŠv(Ĺ3bźŠLPqIŠ~9¤"€Š1NĹ HE?„S2)1OÇ4¤qM"źIŽh¤4ň) 3µO»ÔÖ~+GTű±ýMgR˘şOŹř›M˙\OóÍŠéĽ 3«Í˙\Oó•_šŃřŃÝN J8 óOLhđ´ S€¤16ŇNś!Ťś.)qHbb— RHĹ(¸§@ Š1NĹ(ZCŠP)ŘŁÜRâśµ.(ÜRâś.(¸ĄĹ-( CqN—´ÜRâ–ŚPbŚS±F(1J.)q@ ŠZ(Ĺ )h ˘–ŚPQŠp˘ ĄĹ.)E7´´P!1@ę)ÜQŠuÜQŠu%&(Ĺ-ÜQŠZ(ÜQŠuÂ(Ĺ;Ó@Ĥ"–ő bbšiôÓHdf’śi´Ć4Šiň)„P!ŤQš‘…FE0#"Ł5) b!aQ5N¡aT„@Ýę;µU!5`řšM¶‘§÷ź?•o0®cĹţ“ vOćúŐ˝yŁÎĐf¤Ą˘»O‡5.śŤăŽŁ.¶6h¬ôÖ­«˛ýEYŽňŢOą4gŰpĄfŤăZśľ"|QŠ@Ŕôć—4Ť”´QpŠZ(¸ EP!(ĄŁŔJ)h Š)(˘Š((Ą˘ E-%”´PQKE’–ŠJ)h¦hĄ˘ EPŠJZ1@ IKE0Ó±I@„˘–“RRâŠ%QŠJJZ(”RŇPEP!(Ą˘€E-”RŃ@„˘Š)€”RŃ@ IKF((Ą¤ AEPŠ(˘€ŠZ1@ E-”RŇPńF)آşśŠLS¨ â’źŠLPqE;m âŚS±F(¸ŁěRb€bťŠ1@ ŧbŚPqF)hĹ&(Ĺ.(Ĺ&(Ĺ;b€Š1NĹ âŚS±F(¸ŁěRâ€Чb—Ě\v(Ĺ7bťŠ\PqF)ŘŁÜR❊1@ ŧâŠn(Ĺ;¸ F)ŘĄĹ3bźŠ1@ Ĺ.)ŘĄĹ3bťŠ\PqF)ŘŁ˘ťŠ1@ Ĺ.Úv(Ŷ—m;b€Š1OŰFŃ@ ŧF(¸¤Ĺ;PqF)Ôb€Š1NĹ&(´”ěQŠŚŠ1N"“Â9¤§šLP¤"žE!§âŠfęźv?©¬ęŇŐ~ěSYÔ„ÓřÄâoúâ®dWOŕ?ů M˙\Oó•o›QřŃßJ(§^aé8 P´ R§b”-.) @)ŔRKŠ@&)@ĄĹ8 n)@§b” CŠ\SÂŃŠ4)ĄĹ:” n)qKKŠn(ŰN˘€ RKŠ&(Ĺ:ŚPbŤ´ę1@ĄĹ.(1E-J\QKŠLQŠ\QŠLRŇâŠ%ĄĹ(¦qKŠ\QHĹ.)h "’–Š1F)h Ĺ&)Ô””RŃ@ F)qI@ĢŠ(¦šu! i¤4ęB(Úi§âšE!‘šJq¦1†šiôĂÖµ1ŞVŔŚÔmR‘Q‘LD/PµNâˇaT„BŐ Ő† Ф"» ĺ“ţđÍRĄĄdËŤIÇáv5c×îď¤môâ¬ÇâĎúČX}kŠ\‘7Ž2´~ŃÓG¬ŮżY ˙Ľµf;Č%ű“F~Ť\…>ÍÇ2¨ľ$™Ú‚NhÍqÉ<±ź’G_ˇ«ęבô‘čŔźdÍă™AüQ:śŃ\üzüë÷ăFúqVSÄő¸˙tć—$ŤăŤŁ.¦˝B=bÎOůhT˙´µe. “îL‡ń©iŁhŐ§-¤‰¨ ŃHĐ(˘ŠJ(˘€ Ju%%´S(Ą¤ĹŠZ( EP!(Ą¤ Ł4´”(˘Šb JZ((Ĺ-%%´b€E.(ĹE.(Ĺ%bŚS(ĄĹ&(”Râ’Q@ E-””ęJLŃF( AIKF((Ą¤¦Eb€Š\Q@„˘–“QF( Š( ˘–’€'ǵ&)ؤĹt6&)1NĹÜQŠv(Ĺ Š1N¤Ĺ1‰Š1NĹ âŚRâ—n(Ĺ:’ŤŁěR 1OĹ&(¸ŁüQŠn(Ĺ;m âŚSöŃŠf(Ĺ?m âŚS±KŠn(Ĺ;b€Š1NŠŧb—m3¸§b—ĚRăÚťŠ1@ Ĺ.Úv(Ĺ7m§â“ÜR❊(¸ŁüRb€Š\S±KŠf=©qNĹ âŚS±KŠf(Ĺ?b€Š1NĹ b—ěQŠ7b—b€Źj1íNĹ bŚSȤ+@ ŧbŚPŁS¤Ĺ3§‘HE0Ž)1O¤Ĺ0Ži¸©1Í7Ň)¸§‘M4Ň)¤Sé Ff«÷cúšÍ­=[îGő5›HA]O€Fu™żë‰ţbązę|3¬Í˙\ó•o›QřŃč{S€Łŕ+Ë=@śS±Hbb” P)qRKŠ\S±@ ŠPľÔŕ)Ř â—¸§PqF)ÔPb—b—LQŠ\R‸Ą´€QŠZ(1KŠ( AE-€ QKŠ1@ F)ŘŁ˘–ŚP!)qF)q@ F)h ĄĹ´”RŃ@ KŠ( Š( Š( bŠ(ĹQ@)´ęJCIKE!‰AĄ¤ĹŇ‘I@Ħ‘O¦â‘šiëO"›Ša¦RM"šŤŞb*6Ó#QµLEFµB¬0¨XU!5Dâ§aP¸Ş]«’ńWüĹ˙\˙©®Á…r*˙„_őËúščˇńb> ŠZJí8¤§RPRS©((˘Š(˘Šb¸b’–ŠâQF( w (˘€ŠZ()h˘€ (˘…Q@ KEQE ŚŃš3@ĽQ@IĺŹîJëôb*ĚzµäňÔ·űĂ5SĄdËŤYÇáf¬züăďĆŤúU”ńGýd.żB `ŃSÉxăkG©ÓǬYżü´ŰţđĹXŽć~ä¨ßC\…˝š7Žc5ń$v”W—Ĺ÷%uö V#ŐďţZî˙xTşlŢ9ŚÄŽ˘ŠŔŹÄż7Đâ¬ÇâOúČť~‡5<’6Ž6ŚşšÔ•M5{7˙–»Ţ« q żęĺFú0ĄfŤăVřY%QH°˘ŠJ1EPIKE’–Š`%´b‹ŠÂQF( ˘–’‚’–ŠJ(4”(˘@ E˘%-”RŇP!(Ą4”QE”b–Š`%Q@„˘—PhĄĹ”RŇSQEQERb–ŠJ)h  čĄĹ-t67bťIŠLRbťŠ1@ Ĺ.)ÔPqINĹ âŚS±F(¸ŁěQŠmüQŠf(Ĺ>Š7bťKŠf)qNĹ CqF)ŘŁ n.)qKŠn(Ĺ;b€Š1OĹ.(¸ěR 1OĹ b—üQŠf)p)ŘŁÚ1OĹ.(bźŠ1@ ŧâ—ĚP? q@ ŧâ—)qOĹĚQNĹ.Ú3¸§bŚP!”bźŠ1@ ŧâ“ÜRbźŠLPqIŠ~Ú1@ Ĺ&)ô bŤ˘źŠLP1„sM© !P¤Ĺ:’€Ž))ř⛊ozLSŤ%4Šiň)1@ńHE<Šmfj˙r/©¬ĘÔÖÉÔÖ]! ]WĂďů Ď˙\óĘ×YđóţCS˙×˙ˇ Ę·đٵâ#Đ€§`R❊ňŹTn)ŔRâ” @ ´´ fŔ p Râ(Ĺ.)q@ Ą§KŠ4 Ňí§Q@ —´Pb—´P ĹĄ˘€b–ŠLRŇŃŠŁ´Pb—QHAE.(¦b—RĐQEQKEb–ŠJ)qE%Ą˘€Š\Q@ F)h Ĺ´”QERRŃ@ ëE-¤1´´bŠi¤4ęCABSM:’Ś4ĚSÍ4Đ 4ÓńšiÂ*6©MFšŤŞR*6Ŕ‰ŞjĂ …©ˇ0¨TäqQ0«B+µr+˙„_őĎúšěXW!âŃ˙żë—ő5˝ŚĂđŠZJî8˘–’ AĄ¤¦RS©)J)i(˘Š(˘Š)€RRâŠJ)h ˘Š(˘Š(˘ŚRĐQŠZJ1F(˘†(˘–\J(Ą¦ŚŃEŁ4QŠ3GbŠ1F(˘‰E.h ˘–Š‘.fŹîJëô5f=^ń?ĺ®áţĐÍRĹĄdËŤYÇáfŞx‚aţ˛$o¦EYŹ_„ýřÝ~śÖ.7Ž6˛ęté«YÉ˙-vźöa."“îJŤôjä(ĄěŃĽs݉źZ+‘K™ăű’şý¬&ŻxźňĐ0˙h źfÍŁÁüIť5%a¦ż(˙YˇĹXMz÷ăuúsK‘Łhă(Ë©©ESMVŇOůlűŔа“Ĺ'Ü‘čjlÍŁRŮ’QIE…Q@„ŁQ@))h BRRŃ@ E-%1 E.( ¤Ą˘€Š( BQEQš( ’Š)3EPQEQEJ(˘€ (˘€ (˘Q@±F)آşśŠLS¨Ĺ&(Ĺ-ÜQNĹ ĹĄĹ Ł´b€b—PF)qE&(Ĺ- Ĺ§bŚPqKŠ\QŠLQŠ\R \S±F(¸ĄĹ;b€Š\Râ—ÜQŠv)q@ĆâŚS±KŠn(Ĺ;b Š1NĹ cqF)řŁn(ŰOĹ cvѶźŠ1@ ŧâ“Ý´»iŘŁÜQŠ~)1@ Ĺ.)vŇ 1OŁŔf(Ĺ? âŚS±F(¤ĹIŠLP1ŁěQŠBЧbÓÚCNŤ!¤"źŠNÔŔŚŠ1N"“ n)§bЦăň9¤Ĺ3”óMĹ! =)1N4  ˝gîEő5—ZşČů"úšË¤ ®łáŕε?ýp?ú®Rşß‡ňźţ¸ć+*ßĂf´?ŹEĆ)qE(ĺ°b—¸ŕ( S‚ŇNĹ bťŠP(”¸Ĺ.(Ĺ—­-€LRŇŃ@„Ĺ.)h Ĺ.)hĹ0b––€b–Š1EPE.(Ĺ QŠZ((Ą˘€—Q@ KE.()hĹ.(1F)h AIKF((Ĺ.)h))Ô‡­%Q@Â’ťI@ KEQŠ( ŃŠZJCŠ( bRZJ&) ;„PCM"žÝ)”ŠCH¦šy¦‘@ČÍ1ŞFÂ)Ť…FÂĄ4ĆŔ„ÔL*r*&¦„@¢jť…D¨D+>÷Mµ˝!®"Ŕ`Ei0¨XU¦ÖÄ´žç?7†,Űî4‰řć¨Ëávň®öe®Ą…DµUfş™:0}:]ň>ŠŽ?ŮońŞ’X\Ĺ÷ŕ~®ÝĹBµUŮ“ĂǡĂTŕ‚˝%vrDŽ0ę­őŞRé¶ŻÖ%N*ŐeŘÍĐ}ĚQ[’h°şÎżŽj´š+ą(?QеR,ÍŇ’2ńE\}6á:ßCUŢŢdűѰü*”‘-t"˘”ŠJd…QLŠ( Š( Š( Š( Š( ŚQEQE”´PRŃE%Q@-%RŇQ@´P11EP RS©( ‰Fih 4fŠLPńE&(ĹŁš3@fŚĐFqE  RęxţäŇ(öcVW»N˛˙xU*1JČŇ5g›5cפë"Sô8«ë°7ßG_Ö°hĄČŤŁŤ¬şť2j–’t”¨ĹXIŁ“îH­ô5ČŃҧ٣hć2űQ;+”Kąăű“8™« «Ý'ń†úŠ^Í›Ç0Ý3٤¬Tפë!Sô8« ®@ß}ZžFm]u4©*ŞjvŹŇP?Ţâ¬$±ÉĘ:·Đć•™´glÇQE%Q@%-J(˘€Š( AES(˘ŠQEQE%´”QE(˘Š(˘ŠąINĹŇ|ŘÚ1KŠ1@ Š1NĹ ĹĄĹ.(´bťŠ(¸Łę1@ Ĺ.)ŘŁÜQŠv(Ĺ7bťŠ(¸ĄĹ:ŚPqF)ŘĄĹ3¸§b—ÜQŠv(€ŠZ1KŠLRâŚR \Râ—Ł¸ĄĹ7bťK@ ŧRĐ1¸ĄĹ-.(ÜR❊1@ĆâŚS±KŠn(Á§b—ĚQŠ~(Ĺ7bťŠ1@ ŁěQŠn(Ĺ;m âŚS±F(ŁěQŠ`3bťŠ1@ Ĺ!§b“Â("ź¶“ĚRbźŠJa•!ÓH cŁęJa¤Ĺ8Ň@ #šm<Ži¤PM4ŠyŢô„6Šq¤Ĺek?r/©¬ŞÖÖľä_SYX¤ ®·áĐ˙‰ä˙őŔ˙1\×ü9˙ä˙őŔ˙1YWţ5ˇüDz6)ŔRâ” ňŹX§b€)qHťŠĄ Bb–—P Ł R \R@„ĹěQŠLQŠuÚ\RŃŠJ)ŘŁŁę(Ł´PbŚRŇĐbŚRŃ@ Š)h ĹĄ˘ ŠZ( Š(¤ES˘Š)QEŔ(Ą¤ Š( Š( ’–Š%Q@ E.(Ç m´R˝i)Ô”%%:›@ jeHE0ĐRE4ÓÍ4ŠCE0Ô„S¦"2*6©XqQµ0"5 Ôl) ŚTl*„WaQ0©ŘTL*‘$ *Ő†HEw °Â˘aÖ©Ęě*6; Ť…4K+°¨Tě9¨ŘUČTL:Ôě*6Ő"Y]Ń[ď(?QP=¤-üđ«l8¨ČŞL†“(µ„ÂXT-dGÝp~˘´HëL+T¦ČpFk[H˝úTLĄ 0O­j0¬íH|éô5q•ÝŚĺ•ČčŞů#Ą(vëC2z*Ć—möů]Ší\‚˝]} ÇÜ•OÔbĄÉ'f;TU×Ňn“˘úí'ŹďDăđ¦šb± ¤ÖŚS(ĄĹ”RŃ@ E- ˘—PQKI@Q@%-”´Q@ E-”QERŇPEPEPEPFP;†)1KE%´”QEQEb’–ŠJJu%%($tâŠ1@ÉRîxţěÎ?°š˝Ň°÷K”¬™q«8ě٬šë˙ËHT˙şqS¦·}őuü3XTRäFńĆV]N•5+Wé0ߊťeGű®­ô5ÉĐ ŹĄOł6Ža/´ŽşŠĺŇňxţě®?ť5{¤ęĘßď-.Fk|éť %c¦¸ĂďÂĐÔé­[·ŢW_Ă4ąY´qTźSBŠ®šŤ¬ť&_ÇŠ™dGű®§čiY›)Ć[1ÔQE"‚Š( BQKE%´”Ŕ(˘Š(˘Š(˘Š˝Š1NŁŇ|ĐÚ)ŘŁÚZZ\PqF)ŘŁÜQŠuŁę(¸Łę1@ Ĺ-.)q@ ŧbŚPqKŠ\Râ€b–ŠLRŠZ ĄĹ--7bťŠ\PqF)ŘŁŁěQŠLQŠv)q@ K¶–” nÚ]´ěQŠn)qKŠ\PqF)ŘĄĹ3¸§ŃŠf)iÄQŠ6Šv(ĹŠ\RâŚP11F)qK@ ŧbŠf(Ĺ;b€ŠLS±F(ŁěRb Ĺ!üRb€Šn)ř ŠŹ”úJn)1N¤" "“öÜSŇ8¦ÓȦĐ1IO¦‘Ĺ0ŇbśE!¤!„RS©¦€2őŻąÔÖMkkr/©¬šBşď‡ë“˙×˙ˇ äkŻřo˙!ËŹúŕô!YWţ5ˇüDzV)@ĄťŠňOX@)ih AŠ1K@ AŠ\QJ()qKE (ĄĹ%-Ą  RŃ@b–Š(˘Š(Ą˘€–Š(˘Š(˘Š(QE€(Ą˘€ŠZ((Ą˘€ŠZ1@ KŠ\QLĹĄ˘€Š\Q@ ER˘Š(¤Ą˘ÄŁ´PPii(Ú)H˘€IJhĹ!ˇ) .(4 i¦y¦‘ACi´ęLRĂLaRL4S Hi†¨DDS©H¨Č XTl*vI®ÂŁaS°¨U…B¬0¨SB qQ0©ŘTl:Ő"JĚ*6; ‰…Q,‡5*Ă ‰‡h–@ÂŁe©TdS!°¨ŘTě*&D‘Q‘R‘L"™,ŠÍÔÇĎĐÖˇ›©ýřţ†´†ćSءEVĆLJnĺ˙sú×C¶ą˙ ów/ýsţµŃâąę|F‘ŘŹm§âŚVc x#ľŠßQP>™jýbýŢ*î(Ĺ5&‚ĆS蟸W}A÷%Ső­Í´mŞUąQÎ>•tźŔýÓUŢÚhţôN? ę±I¶©Ubĺ9*+©x#ľŠßQP>›j˙ňȡĹRŞ…Ęs´b¶ßE„ýÇuýj»č’ą*·Ôb©M™—E]}.é?€7ĐŐw·š?żŹr*”“´S(Ĺ-Ú)h ˘Š(˘Š(˘ŚQ@ E-%RŇPEPIKE%´PQE-%´”QEQEQE”QE (˘€ (˘%- J(˘€ JZ( …‘Đ‘ô˘ŚP&KËţěÎ=łĹNš˝Ęőeo¨ŞX˘•‘¤jÎ;6j¦¸ßÇ?CS¦łnßy]~Ł5…E.DmeUÔéţŮúJżŹ:ş¸Ę°oˇ®R”:){3hăĺŐe%sIyqÝ™˙šť5{•ęU‡¸©äfŃÇAîŤę+%5Ă˙-!ÝZ§MfÝľđuúŠ\¬Ú8ŞRę_˘«Ąýłô™Šť]XeXěi©Ć[1h˘Š 4qE-.+¤ů‘´bťI@ÄĄĄĹ”´bŚPF)h ĹĄ˘€bśŁěQŠLQKŠ1@ Š\Râ—ÜRâ—PbŚRŇĐb—Râ€S±@ŁěR€(¸ĄĹ;bŤĹ.)ŘŁn)qKŠ\P1¸ĄĹ.)q@ Ĺ.)qJ(ُ˘†(Ĺ-Łę1@ Ĺ.)h BbŚRŃŠ&(Ĺ;b€ŠLSńF(”bťŠ1@†âŚS© c1E; â“üRb€ŠLS©¦qIŠv( Í!§M ‘HE<ÓH c !ę(3ÔÓiç­6€iZq¤4aéM"śi 2µżőq}MdÖľ¶>Hľ¦˛! +Żřm˙!ŰŹúŕô!\…v ‡üOg˙Żs˙ˇ ĆżđŮ­â#Ó)hĹ垨¸Ł p„ ˘—´”´´b(Ĺ-ĄĆ)h Š)h”¸˘–€b–ŠLRŃEQEbŠZ%´PQŠZ(ŢŠ1F(˘€ QEQŠZ(1KŠ( Š( ˘–’€ (˘€ )i(˘Š(˘ŠZJ(˘‰EP1) -Ú(Ą¤1´†ťŠi bSOJ}7†GHiě)¸ ¤4Ó Hi¬(3Q‘RM"ŤFELF*3LqQ‘S0¨Č¦„B¡"¬0¨U!0¨Tě*&B qQ0«*&ÄWeďQ0« 8¨U˘Jě*6Zť–ŁaĹ4K+°¨u« *&I’ČXTdTĚ*2*‘ …‡ZŚŠŻZŤ…Q$Fł5OżĐÖ©—Şž?ˇ«†ćU63襢·9Íź ŹôÉżëźőŇíö®wÂĂ7“×?ë]6Úć«ńGb"ľÔö©1FÚ̢-ľÔ©6Ѷ€"ŰFÚ“mh=´›jB(Ű@íö¦•ö©qFÚE·Ú›¶¦ŰI¶ťŔ‹m&Ú—mh¸X¬öńżßŤOÔT¦[?ü˛ÇĐâŻmŁm5&+/˘D~䎿^j»č’Źą"źŻ»¶­R¨Ă”çKşOůg»čj»ŰË߉×ę+Ş+I¶©Ubĺ9,bŠę^Ţ)>ôh~˘ }.Ő˙ĺž±"«Úˇrśí´ú$GîHËő櫾‰(ű’)úńT¦‚Ě͢­ľ™tźňĎwĐÔ±ýčŘ}ERiŽ’–Š`%´Pb’ťŠJJ)h ˘Š1@Q@Q@ E-”QEQE”´PQEQEQEQE%-%PŠ(Ł4QEQE J)qE%´PQKE%(b§ }©(ĹN—·ýŮźń9©ÓXą^Ą[ę*Ž(ĄdÍ#Z¤vgŠ)iqV`7´¸Ł”Râ–‰E.(Ĺ%ĄĹbŚRŃŠLRâ—Pb—´PQKKŠ@)hĄĹ&)hĹ.(1F)qJ b–—ŁěQŠLRâ––€§RĐqKŠZ\PqKŠ\Râ€RŇâ€bťŠ1@ ŠLSńIŠn)qNĹ cqF)řⓣěQŠn(Ĺ? â—¸ŁÚ ;b€Š1NĹ C1F)ŘŁÂ)1OĹ! aŁěRb€E4Óé¤sLâ“úm4ŠióHzP 7üSqÍ4Ž)´óM"Ś=i¦žE6€E4ÓÍ4Đ!”SHi“­ýČľ¦˛k_\ű‘}MdRµŘ|5˙őÇý{źýW]ŹĂ_ůÜ׹˙Đ…c_řlÖ‡ńéĄĹĄŻ(ő@ Z( AKE)hĹRŃERŃ@‚Š)q@˘ŚQ@´P ¤Ą˘€ (˘€ (˘€ (ŁQKE%¸Ł”´bŠ(Ą˘€ŠZ((Ą˘€ŠZ((Ĺ.( Ĺ´PQKI@QHŠ( ’–Š%%-Ć%%-€Š)i) )´ęC@ĆšJu%!ˇ†šićšFhÓLjŠi ŚÓT„SM1Ť…NEDš#LaRi  ť…D©……D§aQT"aĹDš ‰…N¢aT‰ aQ0« *&UČTL:Ő† ¤I ™…F¨–BGZŤ…LĂQ°â¨†BG5•Şýřţ†µČ¬­XaăúŇ™TřLěPE-ąÎmřPföoúçýk¨Ĺs>éÓ˙×?ę+ŞŰí\µ~#HěGŠ1OŬĆGF)űhŰEŔŹb¤ŰFÚ.[h+Râ“\öŠMµ.)6Ńqm¤+SF8˘ŕA¶“mM·Ú“m;(+Rí¤+@b“.ÚMľÔ ‹mj]ľÔ›i‡m!Z›m!Z‹©vŇm öÓJÔŰ}©1EÂĹg¶‰ţüh~˘ }.Ů˙ĺžßˇ«ŰhŰT¤Ĺc%ôXĎÜ‘‡×š®ú,ŁîHŤőâ·vŇmŞUrśăé·)˙,óô9¨ď#¨®§m!ZĄU‹”ĺ(®ťí˘“ďD‡ę*»évĎ˙,öý 5Q Ç?F+eôXĎÜ‘‡Ôf«ľŤ0ű®Ťőâ©M Ě΢­>›rźňĚźˇ¨#űČËőWLQEŔJ)h ¤§RPQKE%Q@%-”RŇPEPEPQKI@Q@Q@Q@Q@RPŃIE-%-%-Q@E-D…´b€ 1KŠ(˘–ŚPbŚS¨Ĺ%Ą˘€¸Ą˘€ŚRâ— J1KŠZ@&(ĄĹ¦.(Ĺ.(1KŠZ( †(Ĺ-.(1F)qK@ Š1J)h¸ĄĹ.)h¸ĄĹ--&(ĄĄ Ĺę(1KKE ĄĄĹ ĄĹĄĹ&)1NĹÜRâťE6Šq¤Ĺ—bŚPbŠ\QŠJJu%%&)Ô3”óI@ĆÓM>“ĂM#š~)¦1F)Ô šiéOĹ4Đ !§M4€i¦šy¦šFiµ!ďL¦i§­<Ó i§­8ÓM 2µĎąÔÖEkëźr©¬ŠB»†źň¸˙Żs˙ˇ 㫱ři˙!ŰŹú÷?ú¬k˙ šĐţ"=:–Š+Ę=@˘—PKF)q@„ĄŁ¸ ĄĄĹ.(ĄĹ´˘–Š&(Ą˘€ 1EQŠ( bŠ(˘Š(˘ŠZ%-P ˘Š(˘Š(˘Š(˘Š(˘—µQERRŇPEPA˘ŠJ(˘…Q@Š((˘Š”Q@ IN¤¤0¤4´†€E-%!Ť"›ŇžzÓMi¦ži¦‚ĂM4ň)† ¨ÚĄ¦0â‘L"Ą¦´Ŕ……FELÂŁ"š Ôě*&B!aQ0©ÜTL*„B¢aS0¨ÚTL8©Řrj&U"Y µ1 ¤K aĹFENĂŠŠ¤K!aQ‘SQ°ŞD4BEdęă÷‘ý l0¬Ťc‰"úŇźÄeSá3h˘Šč9Ť˙ŚßO˙\˙¨®ŻĘř@§O˙\˙¨®·ÉWâ4ŽĂ¤Ĺ?b˛(f)1R`Rb ŧŕQŠfÚMµ&(Ĺ=´…jLQŠ.x¤ĹIŠ6Ó¸âšVĄ"ŠŹ›jM´m˘ŕG¶“mI¶“î"=´…jLQŠ."+HRĄĹ&(-´›jm˘“h§p"Ĺ&Ú—“h˘ŕE¶“mK¶­E¶ŚT›i¦[hŰRm¤"€#ŰI¶¤Ú(Ú("´©qHE;) Ô¸˘ŕV{hźďF‡đ¨K¶ŕ+ô5m!_j|ĚV2źEOŕ•‡Ôf«ľŹ0ű®­úVá›jąŘ¬Žuôë”˙–Dý9¨)ď#/ÔWS¶šT‚*•F.S–¤®•ía˝źÂ }.Ůş!_ˇŞö,`ŃŠ×}Ü‘‡Ôf }"a÷YôŞSB±źEY}>ĺ:ÄOĐć hť>ň0úŠw@2ŠZ)€”RŇb€Š\Q@ E-%%´b€ŠZJ(˘Š(˘Š))h ˘–ŠJ(˘€ (˘€=RŃTHQE- )qKŠ%´P0˘Š(ŁRĐ ĹĄŁQŠ\Q@ĂbŠZŁ´˘€¸˘”P11KŠZ(QKE%.)qE \RŃŠLRâ—b KŠ\RâŤĹ.)ŘŁÜR❊(ĄĄĹ ˘—b€ (Ą Ł´¸ ĹĄĹ ˘—b€b––€F)qE4Š1KF(ÚLS¨Ĺ7Ň)ř¤" 4bťŠJ4ŠCN4Ó@ ¤§J`4ÓM8ÓM4ÓOZy¦â€ÚšjB)¤R3M§ž´Ú`0ŠięiíM=h¦šu!¤N»ţ®©¬zŘ×?ŐĂő5ŹHB×cđĎţC·őîô!\uv_ ˙ä=q˙^ç˙BŤáłZÄG§ŃE-yG¨Ł´ S¨˘€ (Ą –’–QE (˘€ (˘€ (˘€ )h¦EPEPEPEPEPE-”´Q@Q@Q@Q@Q@ EPEPIKI@Š( Š( ˘Š(RRŇPHih¤1))i((Ą¤¤1´„S© i¦žE0Đ1¤S ILj4ÓpićšzS¦‘R0¦`DEFÂĄ4ĆÄB¢aS°¨Zš Ť…LEFEP[ĄB§e¨U ‰…NEDš$…F¦aÍFEQ,…FENEDĂH–BÂŁaĹLÂŁ"©ČH¬}d~ň/ˇ­˘9¬}hbHľ†µ§ńÔřLş)h®č<˙ó˙×?ę+®Ĺr^ é÷őËúŠě1\uľ#Hě3§âŤµ‘C1I¶¤ŰF((ĹI¶Ť´ĚQŠv(Ĺ3oµ&*M´m öŇbĄŰI¶€#Ĺ&*M´m ńIŠ­&Ú`G¶“mIŠ6Đ{i6űT„QŠ‹m!.ÚM´îEhŰRmŁm,Rm©JŇb€#Ĺ!Z“m!Z`G´úR©6ĐVm¤+Râ“ßjBµ.Ú6űÓ¸í4›j]´m˘ŕBWÚ“Ő.ÚB´îDR©vŇ ±IŠ”­&ÚŹ©1I¶ŁmI¶“mGŠiZ›m!‡…sÔT¤Rm§p+=¬/÷˘CřTĄŰ·D+ô5mió42_GS÷$#ę*Ň'u‘żVŢÚB*”جsďapťb'éÍ@Ńş}ĺaőÓí¦•ĎZ~Đ\§1EtOk ýč“ň¨Kş)_ˇŞö,bQŠŐ}‚R>Ł5é3/ÝeoÇJhV(bОö7 Ö2~śÔ ڇ ¤}E;€Ú)h¦bŠZJJ)i1@‚Š(¦0˘Š1H˘–ŠôJ)qKŠ˘DُĄ bQKE%Ą˘€ QKE QJ(ĹRâŚP11KŠZ()hĹ- 1K@-´”´RâRĐEP1h˘–€ Z(Ĺ- ZJQE-QKŠJQF)q@ KE.()hĹ.()h˘€ )hĹ%¸˘€b—´ÚLS±E4ŇS¤ĹŠ1N¤ š)ئâi¦źŠn(ÓMĹ?Úi§R`0ŠCŇźM4ĘCN4Ó@ĆCJi zÓ <ő¦S 0ÓÍ0ő C %8Ói“®˙«‡ęk¶5ßőpýMdRWeđĎţC×őîô!\v+˛ře˙!ëŹú÷?ú¬k˙ šĐřŃéôbŠZňŹL)EPŃERŇRŇRŇRĐESQKF)RRŃ@QLŠ( Š( Š( Š(ĹRŃ@Q@Q@Q@Q@Q@Q@Q@%)¤ Š( ’–ŠJ(˘…´PRRŃ@ĢŠ((ŁPRS©) JJq¦Đ1) :’Ť4Â)ćšhĂM"ži¦Ś4ÓO4Ó@ȦR‘Q°¦DSMHÂi ‰…NÝj&ĐH¨ŘTĚ*2:Ő‡ ť…FÔÄ@Ăš‰‡; ‰‡HD *2:Ôě*&H–BÝ*61TmMČTl*b:ÔmT‰d$sXÚŘýä_C[l+[˙YĐÖ´ţ#ż •E-%tś§Gŕżů\×/ę+±Ĺqţ ń0¸˙®_ÔWgŠâ­ńšÇb< 1Rb“‘C1KNĹ.((Ĺ?b€F)řŁ(ĹIŠLPxŁ&(ĹGŠ1OÁŁ)1RmŁmE´Q¶¤Ĺ&=©ZM˘ĄĹ& "Ĺ&*\Rb€#Ĺ&*\R4EIFÓL¶ŃRm4…MG¶›Š—Źj.[i6ÔŰi1NŕE¶“.) ±IŠ—b€!ĹEHVŤ´ÄBEjB´›Md+2–(©ÚÎá:Ä߇5 F_Ľ¤}EUŔôJZ(Ş$(˘–€—b–€´RĐiqKK@Ģ–ŠJZ)q@RŃŠ)q@Ą ˘—b‰KŠ\RĐ )iq@ E-” Râ–€–Š\PKKŠ(ĄŚP(Ą˘ŚPKF(Ĺ´b–€” 1K@ KEQE-%-PEPEĄĹ6ŚRâ—ÚJuĂE;” JCKHh)¦ťHEi¦žE%i)Ô†€zÓM<ő¦ž”Ŕa¤4¦Đ 4ÓŤ! ´ĂOn´Ă@Ćši§ië@ 4†śi¦Śťwý\?SXő±®˙«‡ęk…®Ëá—ü‡®?ëÜ˙čB¸ÚěţČzăţ˝Ďţ„+˙Ăf´?ŹOĄ¤ĄŻ(ôŠ)h˘ŚRŠ(˘ŠBŠ(¦EPŃ@˘Q@QŠ(ĄĹ ˘ťE%´PQE Š1ERâŠJ)h ˘–ŚPQKE%´PRŃEQE¤Ą˘€ŠZJ@QE%¦’…´”RRŃ@ E-%ŠZ() - i¤§RP46’ťHhÓM4úi Â)¤T†E"†šióM4ĂL"¤"Ăšb##ŠŚÔ¤SS&ÔL*r*&¦" ™…FEP0¨ŘTĚ*6D°ëP‘Sžő hL…‡5µ;TL:Ő"Y *&ÔĚ1Q·Z˘Y µ ™Ş&H–D±5Ďő‘} nÄ×ÖEô5Ą?ĆŻÂdŃEŇr'‚ä#q˙\ż¨®ÓĆř ÄĆçţąQ]¦+Ž·Ćk †âŚS¨ĹbPĚR❊\ f)1Rb“ÜRbťKŠf(Ĺ;b ŧⓠn)1OĹ C1Aę(Ú6Óđ)1LCvŇOĹ ńF)řŁ€#Ĺ&*LR(=´bźŠ1Lb­?b€"ŰFÚ“ öŇ©1IŠŹm©1IEÄG¶“&ÚM´ŔŚŠLT…}©6űPei1Rb“Z6ÓȤĹ0#+IŠ—ÜP{i6Ô¸¤Ŕ§qí¦í©qHEEŠMµ.)6Ńp"ŰHVĄ+HE;ÚMµ.)1NŕE¶­HE˘ŕE¶“mHE˘ŕDV“mKŠLS¸I¶Ą Rm ¤ŰR•¦í D{i ÔĄi1L¶Ňm©vŇ@⊓mh,RRmŁmGŠB€őýjLRbťŔč1IKEu™¸ĄĹ%´PEĄ aEĄ Š)hbŠ)q@Ă´Q@¸˘Š¸˘Š\QŠ-QKE¸ĄĹJZ1KŠ@)i@ŁQKŠ(˘ŠZRK@ @Ą˘€ )iq@ E.(Ĺ%-–€ŠZ(˘–ŠLRâŠ(QE JZ( 4”¦’€IJi(ÓE8ŇPqHiÔÓ@„4ÓN4Ó@ĆšJu6€zÓM8ő¦ž”Ŕi¦šq¦š0ÓM<ô¦š0Ó)ć›Ú€i´óM Ĺ4ÓĎJi¤N»ţ®©¬zŘ×~ä?SXô„-v_ żä=q˙^ç˙BĆ×eđËţC×őîô!X×ţ5ˇüDz…Q^Qę EP!hQ@ EP!h˘Š(ُ Ą Q@b–ŠLRâŠ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠZJ(˘Q@ E-%QE (˘€Š( bQERZ %&)i(†’”Ň%6ťHhÚcSÍ5© f)¤SÍ4Đ 4Šy¦š`FÂŁaR°¦LŤFŐ)¦LD,*63 Ť‡Zh[ĄD¦aĹFŐB aQ0©ŘTL8¦‰ aÍFGZ™Ç5 ˇ2 ™ĹD¨–BÝę28©ëQ‘Td,+]˙YĐÖë Ă׿ÖCô5­?Ć·ÂdQŠZ+¤ä:_ČFăţąQ]¶ q^˙ŤÇýrţ˘»|WŚÖ ŧbŚV% ŧbŚPqF)ŘŁĐqIŠyb€Š1OŦ!›i1Rb“ĚRbź¶Ť´ĚRb¤Ĺ!ĚRbźŠ1@ŕŃŠ~)1@ Ĺ!źŠ1@ ŧbŚP1„R`ÓńAÄGŠ)ŰhĹ3“¤Ĺ&(<6šybí4©¤Ű@í¤Á©1FÚFA¤Á©6Óq@ Ĺ&*LRm¦dRRm¤Ű@âŚSöŇb€#"©©¤ĹG¶‚)řŁŔ‹b¤+MŰ@ Ĺ4Š­&)Źm!.) ±HV¤"“©6ҧp#Ĺ4üRm MĹIŠB)€Ěn*LQ¶€#Ĺ!&) Đ{i1Rb“î"2´©1F(,QŠ“ ńIŠ”­4­06¨ĄĹŘf´Q@‚ŠZ(QE-bŠZŁ´P11KŠZ(”´RĐ1)hĄĹ–€)h˘ŠZ(˘–…-%( ˘ŠZ(˘Š´R@Ä—´PE-”¸ĄĹ-%-PEP ˘ŠZQE´”P!i(˘€ (˘…Q@ E.( Ĺ%:›@Ĥ4´”†›N4”ÓM4óM"€Hii šaéRL=)€ĂM4óM cJi§ž”Ó@†a©za šaęićšzĐ1§Ą0ÓĎJi„dkżr©¬zŘ׿ŐĂő5ŹHB×eđÇţC×őîô!\mv_ ä=q˙^ç˙BŤáłZ=FŠ(Ż(ő˘Š Z(¤KŠ)i(˘Š)h˘‚Š( Q@˘Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@QHŠ( ˘Š(QERZ(´QE PhĄ4” CÖŠZ(Ň))ĆĐ1¦Ő!¦šFi 8Šm!Ť4ÓO4ÓLDf¤¦°¦-L"¤"i Ť…LÂŁ#šhD,*&3 Ť…1°ëQ0©›˝DŐHD.*#SµDĂ“T‰d8¨Ú¦qĹD©ČMF¦aÖŁaĹ2Y Â×˙ÖĂô5ľŐâő°ý kKâ0«đôRŃ]G!ÓřţBW?őËúŠíńÍq>˙•Ďýqţ˘»ŚW ŚÚ ŁěQŠČcqKŠv)1@ Š1KŠ\R¸¤Ĺ?’ ŧQ@ "“úJn(§bŚP1F)ÄQ@ ŧbŚP1IŠ“ÜSŁüQŠGŠ1OĹ b“üQŠŚŠB*L1@â“üQŠ.1IŠy`Đ1IŠ~)1Lb“&)1@ Ĺ!ŇźŠ1@cÚŚT›i¤`7„SńIŠŚŠL{T¤"•ö¤ĹIF(,R*B)0i)1íRâ­FGµ7©pi GŠi.)¦D{RbĄĹ7â‚)äRb‘IŠ“„P1MǵIŠ1@â“!ÜS„RRb“=¨"źŠLP1HEIŠLPx¤Ĺ?ŚSši€ĚS Hi†€#"EHiŤLTdTÄTL)‰…DŐ3Tl*„BĂ­BÝ*õ *XTMS°¨u¦&BÝ*&ëS5DĂš¤K"aÖ˘aS7CQ•H–DkÄCô5ľÂ°’ Ĺ!üR@ ¤ ÓńIŠf)1O"“Ä3N4” n)§Jf) 8ŠLSÜRbźŠB(„QŠR(Ĺ0Š1NĹ! ¦Ó¨Ĺ0ŠLSȤĹ0Š0iÔP1IŠ~)1@†bOĹ ńF)űi1@¨Ą W b´Q@–Š(˘Š(RŇRŠZ(˘€ ZJQ@-PŃE QEPŃE-QE´”´RŃK@RĐ ˘ŠZ´”´Z))hRŇRĐE´QEb— ZLQKI@(Ĺ´ŁQ@Q@-PM¦’€ŃA˘Ť¤4ęC@†ŇKI@Ħšu4Đm8Ňw CŇśzÓOJa¦šq¦š`4ô¦ÓŹJi ša§ša¤M0ő§aëL=)¦śzS 25ďąÔÖ=lkßr©¬zB»?†ň¸˙Żs˙ˇ ă+łřa˙!űŹú÷?ú¬k˙ šŃřŃę4QEyG¨-Q@‚Š( ´‚– E”Z(˘€ (˘€KH)h˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š( ´ Š( Š(¦QKIHbQE€(˘Š†–ĐRRŃ@Ĥ4ęi ¤Ą¤ ba©)†ˇ”Úq¦š4ÓM<ÓH ŤŞCL#Š`DÔÓRa¦")ŤR°âŁn´Ŕ……D§aQ0¦"µ;j&j‘$ 8¨sS0¨ŘsT„BGZ‰Şv¨U"XW=â?ő°}ô®Ť«śń'úŘ>‡úV´ľ#ß‹E-%uśGWđ˙ţBw_őÇ˙fŢW đüÄÎëţ¸˙ě»ÚáŻń›Ca:ŇNĹCiqKŠ\Ph§RPHiqF((ĄĹ Ł¸¤ 4§Q@ ŧRPhĹ-¦!¸ŁěRPM%>ŚĐ(ü)ŘŁÜQN¤Ĺ7§RPcÚŚRâŠn) ?”ĘOÂźŠLS´bśE%4ŠLS44Ŕn))ř4 ă4§I@ "Ś{RŃ@ RíN4”m6ži)€ÚCO4Ó@ Ĺ!§b’ "“üB)€Â)? }%2ý)ř¤ cÚ’¤4ÜS§éHiؤĹ7”â &)€ÜQŠu%7§LPi1NŦ!¸¤Ĺ;P1¸¤Ĺ:’(Ł W dQK@Q@‚Š)hRŃE-Q@-P ˘Š(h˘–€Ą¤´)i)hQŠZ(RŃE ZJZ)h˘€ Z( –Š(RŃEŠ)h˘Š(h Q@ EPIKI@-PRŃE%RĐEPJSE ŇRšJcŇŇ”i¤§J6šzÓŤ4ő @i§­)¤=hÓÖšzSŤ4ô i§i¦OJi§”ÓHša§ž´Ă@ 4ĂÖ¤5ëL=)†žzS 25ďąÔÖ=lkßr©¬zB»?†ň¸˙Żs˙ˇ ă+łřa˙!űŹú÷?ú¬k˙ šŃřŃę4QEyg¦-QHŠ( ´‚– IKILBŃE€(˘Š- Ą Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ˘—”QEŔ(˘ŠCIJh¤1(˘ŠC CKHh(Ą¤ aM4ęJCM4ăHh”ÓN¤4 ŚŠi!¦0ÓMHi¦€EFjCL"‘L"Ą5ÄFzTMSŤ© t©›˝FĂŠb!jŤ‡Z™…D©‡jvéQ0Ş%·z‰ŞcQ0¦‰dMÖąĎ˙­čĄt­Öąż˙®čkj_…o”QEvGWđ˙ţBw_őÇ˙fŢ×đűţB—_őÇ˙fßbĽú˙´6RŇV% ZJ1KE%´PQŠZ(1F)i(1E-ÜQŚS©1@ ˘ťŠC@„¤Ą¤¦QKŠ(¸˘–ŹÂ€F)h ‘INĹ%%Ą¤ ˘–’€b–Š`6’śi? mĄŁÚLSŤ!¦H¤ S¨ b‚)ôÓ@ ¦š}&(´†—”Ä%!Ą¤ ¤Ĺ- ¤4¸¤¦qHE8ŇP!¸Ł–@ "“óM¦M%<Ňb€IO#Ú›@ ŧRS¸¤Ĺ8ŠC@ ˘–Šm&)ÔS´”¦’€.RŃEzE´ JZ)h1KE(Ą˘€ (Ą aE´QE-RŃ@RĐE´QE´QJ(Ą˘Š(˘ŠZZJ(h˘–RĐ0Ą¤Ą AEP1h¤Ą –’–€ (˘€ (Ą ˘–’€ (˘€ (Ą 4”¦’€ŇSŤ6€šCJi( %-4÷ bRSHh¦ŇšJi¦ž”ăÖšzP 4Óšši€ÓŇ›N=)¦ 4ĂO5¦Śő© 0ő ž”ĂO=)¦ú÷ú¸~¦±ëg^˙WÔÖ5! ]źĂů\׹˙Đ…q•Ůü1˙őÇý{źýV5˙†Íhühő(íEyG¨-Q@‚Š( ´­-’Š(´QEQE–RĐEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPA˘ŠJ(¤ ˘’ŠcER¤Ą˘€Š)(RRŇR¤Ą¤ aHh Đ1´†ťI@ "šićšh(a¦šy¦ša¦RiĂR‘Q·Zb""Ő!¦`D¢aĹNĂ­DšTmަaQ°ëT"éQ5NĂŠ……Q,„ÔoS5DĂ"©Č[­s~&˙]Đ˙Jéśs\׉ż×Aô?ҶĄńWř‡EWYÄuźä)u˙\öa]őp?ä)u˙\öa]őpb>3hl˘Š+‚ŠZJ1F(˘€ (˘€ (ŁRRŇf€ (¤ ˘ŠN(¤Ą˘€Š(¦JZ(śŇsKE&)1Kš3@i)i)€”RŇJ)h ¤Ĺ-%”´†€Š( BRZJ%%-ťŔJi§Ri¤§RPM%8ŇSÜRS©(¦ŚRśRPM%:’E&)ÔśP!¸¤4â%6ŇŕRJ(¤4Ŕi(¤ <ŃŇŠ)€†“´”¤§RPb’ťHh´RŇSÝR× `%-P0Ą¤Ą AKIE-RĐE´QE- (˘€Š( ˘’–€KE)h˘…-PŃE(˘–…(˘Š-Q@ŢŠ(´RRĐ0˘Š(ii´´´QK@ EPKIK@%)¤ Š( –’Š %)¤ ÓiĆ›H4”ăM4ŔJiďN¦š 4ŇšC@ 4”´†€zŇ”¦ô ciíL4ŔiéM4ăŇšiÓL4ö¦i¦w§šaë@ =)¦śzSMdkßęáúšĆ­ť{ý\?SXÔ„-v ä=q˙^ç˙BĆWgđÇţC×őîô!X×ţ5ˇńŁÔh˘^Qę EP ˘ŠZ­- Ą Š( ˘Š)(˘Š- Ą¦EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPi´¦ŠJ)i(QE€(˘ŠJ(˘‰IKE%%)˘ŤĹ¦’‰IŠu!é@ 4Ň)Ć’ČÍ4ÓÍ4ŠczÓM<Ši ajCL=éÓT†ÔŔ„޵t©›˝DGÄDĂš‰»ÔĚ*":Ő!5BýjvT.*Xu¨š¦nő h–Dýk™ń?úëˇţ•Ó°ćąźq4îźé[Qř‘…oTQEvś'Yđ÷ţB—_őÇ˙fß×đôÄŇëţ¸˙ě»úóń´6 (¤¬J (˘€ (˘€ (˘€ 3ER~´”QřQš3@‚ć–ĐsG4´PsE-6€IKŠB)€QF( ’–’€Âý)h ¤ć—¦QKE6ŠZJJCN¤ ţsN¤4ÓIJM! Í&iqA¦!))qF(´”ăM ¤4ęC@ Hii¦QEÓôŁ´”JLS±I@ 4ÓN¤" ¤"ťI@ ¤4ęLS´†śi(¸Ł´P(ü)Ć’†ŃNĹ%6’śE&() .)1L TQEw…-PŃŠ)h˘ŠZJZ( –Š(Ą¤˘€Š( RŇRĐKE´RRĐŃE´P(Ĺ-Q@8RRĐKIK@Q@ EPKIK@Q@-´QE-%-PE-””¦’€ (˘€ (˘€IJi(4Úu6€M4ęi ¤Ą4Ó@i )¤4 m!Ą¤¦ZôĄ=i¦€ÔĂO4Ó@ =)¦śzSM4Ó 8Ó !¨ĎZÓ zSM8ô¦šdkßęáúšĆ­ť{ý\?SXÔ€Zěľ˙Čzăţ˝Ďţ„+Ť®ËáŹü‡®?ëÜ˙čB±Żü6kCăG©P:Q@é^Ię EP Ą¤Ą ˘Š(´QE (˘€ (˘€ )h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h 4RšJ(˘ŠCE)˘€Š( bPh˘‰EPQE”Rž””†!¤Ą4” m!§M4 i¦šq¦ĐM4ÓŤ! Q‘Ri¦&jV¨Č¦„Fj2*R:ÔmŇš&ďS5DÝęqP¸©źĄDŐHD$TL8©›˝D©ČXW3âźőÖ˙Fţ•Ô7ZĺüSţşßčßҶŁńŁ ß0h˘Ší8ŽÁúµ®“<·ŽQ- …Ď9Ö˙ÂiŁ˙Ďw˙żfĽĘŠĆtc7v5&ŹM˙„ÓF˙žď˙~Í'ü&š?ü÷űŕ×™QSőhťž›˙ ¦Ź˙=ßţř4ÂiŁ˙Ďw˙ľ y•}Zçg¦˙ÂiŁ˙Ďw˙ľ đ™č˙óÝ˙ďŮŻ2˘Ź«@9Ůéżđšh˙óÝ˙ďGü&š?üü?ýű5ćTQőh;=7ţMţ{żýđh˙„ĎG˙žď˙~ÍyŤ}ZÎĎN˙„ĎG˙žď˙|OřLôůî˙÷ÁŻ2˘Ź«@9Ůéżđšh˙óÝ˙ďGü&z?ü÷űŕ×™QGŐ ěôßřLôůî˙÷ěŃ˙ žŹ˙=ßţýšó*(ú´ťž›˙ žŹ˙=ßţř4ÂgŁ˙Ďw˙żfĽĘŠ>­çg¦ÂgŁ˙Ďw˙ľ đ™č˙óÝ˙ď^gEV€słÓ?á2Ń˙ç»˙ß“ţ-ţ{żýđkÍ(ŁęĐvz_ü&Z?ü÷űŕŃ˙ –Ź˙=ßţř5ć”Qőh‡;=+ţţ{żýđh˙„ÇG˙žď˙|óZ(ú´Cťž•˙ ŽŹ˙=ßţř4Âc¤Ďw˙ľ y­}Z!ÎĎI˙„ÇH˙žď˙|OřL4Źůîß÷ÁŻ7˘Ź«@9ŮéđéóÝżďGü&:Gü÷oűŕ×›ŃOęđvz?ü&Gü÷oűŕŃ˙ †‘˙=Űţř5ćôQőh;=ţ #ţ{żýđh˙„ĂH˙žď˙|óŠJ_WsłŃ˙á0Ňç»˙ßřżI˙žĎ˙|óš(úĽCťž‹˙ v“˙=źţř4Â]¤˙Ďw˙ľ yŐţŻçg˘˙Â]¤˙Ďw˙ľ đ—i?óŮżď^uEWs3Đ˙á.Ňżç»˙ßâÝ+ţ{·ýđkĎ)(úĽC™ž‡˙ n•˙=›ţř4źđ–i_óŮżď^{EWs3Đżá,ŇżçłßâÍ+ţ{7ýđkĎ3EWs3Đá,ŇżçłßŹřJôżůěß÷ÁŻ>ÍŁŘD9™čĹz_üöoűŕŇÂUĄ˙Ďf˙ľ p”{‹™ž˙ V—˙=›ţř4źđ•ióŮżď\ŁŘD|Ěď˙á*Ó?çłß“ţť3ţz·ýđk˘Źas3˝>)Ó?çłß“ţŤ/ţ{7ýđk‚˘ź°s3Ľ˙„ŁK˙žÍ˙|Š4Ďůěß÷Á®Š=„C™ťßü%güöoűäŇéźóŮżď\-%Â!ĚÎčř›L˙žÍ˙|OřI´ßůęß÷É®Š=„C™ťÉń.›˙=[ţř4ÂM¦˙Ďf˙ľMpÔQěbĚî?á%ÓOü¶oűäŇÂK¦˙ĎV˙ľ qQěbĚí˙á$Óżç«ß“ţM;ţz·ýđk˘Źcćgn|I§ĎV˙ľM'ü$šwüőoűä×EĆ!ĚÎÔřŹN˙ž­˙|šOřHôďůęß÷É®.Š=ŚC™žŁKIK[-’–€–’Šu™Ą –’–€ (˘€ Z( Š( ´”´QE´˘’–€ (˘€–RĐE´RŇRĐEPŃE´QE´”PŇŠJZZ(˘€ PŃERŇRĐJSI@Q@Q@¤Ą4”SiÔ””ÓŇťM=( 6śi´†ŇšC@ ¤Ą¤¦1¦šzSŹZié@ 4ÓN4Ó@ =)¦śzSM0Ó <Ó !¦´óL=hÓŇšiÇĄ4Đ##^˙WÔÖ5lëßęáúšĆ¤×eđÇţC×őîô!\mv_ ä=q˙^ç˙BŤáłZ=JŇŠJňOPZ(˘-%--Q@…˘Š(QEQE´QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE”´”QEQERb–Šm´” ))i(RRŇPzRRŇCM§RbŤ4†ťM4ÓŇšiǡ¦Đ1¦›O4Ú`0Ši§ši DDqL"Ą=*6ëLŰ˝DĂŠ”Šct¦$Tl:ÔĚ*&iˇ°ÍDĂš™Ş6ëT„WaÖ˘jť‡Z‰…RW1âŻőÖ˙îźé]Kk—ń_úë÷[úVÔ~4a[ŕg?E•Üp…Q@‚Š)(h¤˘€ (˘˘Š3Fh˘€ Ńš3EQEQEQIŠZ)1KŠ(¤Ł4´RQšZ)( ˘’ŠZ)( ¤ÍPE”QEQEQEQŠ(Í”´””b–Š&(Ĺ-¤ĄŁ”Râ“RRâ@ EPEŁ4QFi3@ E&hÍQEŠ( “´”bŠ( Š( Š( G¨ŇŠJZb ZJZZ)3K@.i( Í.i( RÓE--”´RŇQ@ KMĄ ˘Š(iE%´´”˘€ ZJZ(˘ŠZZJ(h˘Š)i)hĄ”´RŃE-Q@ EPEPŃIE-”f€ŇRŇPEPEPIKI@%-%%4ô§i 4Úq¦ĐCJi IKM4ŔCÖšzSŤ4ô ši§a ž”ÓN=)¦€i†¤4Ă@ 4ĂÖži†Ť=)¦śi†:÷ú¸~¦±«g^˙WÔÖ5 »/†?ň¸˙Żs˙ˇ ăk˛řc˙!ëŹú÷?ú¬k˙ šŃřŃęT”P:W’z‚ŃE)i)hh˘Š-Q@‚Š( Š( ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(¤Ą˘€Š( Š)(h¤˘…Q@i)h 4”´P1(4R( ci -!¤i§i c 4ÓÍ4ĐM0ÓȦ‘LÚŁaÍJÝ)†¦0âĄ5 `DŐ ™şÔMM€ŠŤ…LĂŠŤÇ5@@Ă­B§nő h’×-âÁűë÷[úWTĂšĺĽZ?}mţëJŢŹĆŚ+ü çi)ؤĹvś"QE!¦EP ˘Š(˘’ŠZJ( Š( AEPEPEPEPEPEPŃIE-%PEPEPEPIEQEQE Š(ĹQŠ(¤Ą¤ Š( Š( Š( ’–’€ (˘€ (˘€ŠZJL0ih cqF)ÔPhĄ"“QF(Ĺ%¸¤ Š( Š( ’–’€=F—4ÚZb ÚZ:ŠLŇ〠ZAK@ E%áE%--¤Ą ˘’–€ ZJZ)EPĐ))hs@¤˘€KMĄ€Š( –’Šu‚–€ Z( ˘E-”´RŇRĐKIK@Q@Q@Q@Q@Q@Q@%-%”´”†šiĆšh))i(”ÓN¦ši¦šq¦š`!¦ž”ęié@ 4ÓN4Ó@ =)†žzS 4ÓM8ÓM4ÓZy¦´ĂM4ăM4“Ż«‡ęk¶uďőpýMcRk˛řc˙!ëŹú÷?ú®6»/†?ň¸˙Żs˙ˇ ĆżđŮ­ŤĄÚŇŽÔ•äž´QE´”´´QEŠ( AEPEPŃEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEPh ĐQERZ ˘Š(QERRŇPIKHhRZJJ)M%’”ŇRÓIJi(Ň)¦ži† ¦ž´ęC@ #ŠŚŠ”ÓP"#L5#w¦ "aQ‘Ö¦jŚŠb aĹF¦aĹFE4 :ÔL*vj&HEv×+âßőö˙î·ô®µ…r^.ż¶˙użĄmGăFţs´QEwJZJ`&)h˘ IKE%´PQEQEQFh Š( AEPEPEPEPEP0˘Š(˘Š(˘Š)QE”RŇS˘Š(˘Š(˘Š(˘Š( ŃEŠZ(”RŃ@ E-„%%-%QEQE0 JZJ(˘Š(˘Š))i(˘Š(ŁQ@ ¶ŚRŃ@ ŠLS©())ÔP3ÓisMĄÍP‡f–›K@…Ą¦ŇŇ´´ÚZ\ŇŇQ@‡RÓsFhÔRfŠu-6—4´´™˘€Š( ˘’–€Š˘€Š(  ( Í”´˘–R怊JZZ(˘€ ZJ(ii( Ą¤˘€ŠJZ(˘Š(˘ŠJZ)(h¤Ą Š( ˘E”´”†šiĆšh))i(”ÓN4Ó@ 4ÓN4ÓL4ÓŇśi§Ą4ÓM8ÓM0ô¦yéM4ĂM4ăM4ÓL=ićh†šićh'^˙WÔÖ5lëßęáúšĆ¤×eđÇţC×őîô!\mv_ ä=q˙^ç˙BŤáłZ?=KµĄW”zbŃE€)i)hh¤Ą BŃE(Ł4f€ (Í ˘EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE(4”QFh Ńš((˘ŠQE”´PRZ(”QA š(4P0¤Ą¤¤1¦šq¦šm4Ó馌4”ăM4Ŕe4ÓÍ4Đ"3ŢŁ"Ą"E0""Ő)Ôl) *&9iˇ0ëQ0©Řu¨U!0®KĆ÷ößî·ô®Á…r>1žŰýÖţb·ˇńŁ ˙9ŞJZJî8D˘–’ E-%0 JZ(”QE%´”QEQEQE-%´PQKF((Ą¤ Š)qH˘–Š(˘Š(˘Š(˘Š(˘Š))i(˘Š(˘Š(ŁQ@(˘Š(¤˘€ QEQEbŠ(4ŁQ@´PRb–ŠLQŠZ)€˘–’bŠ((Ĺ-¤Ĺ-”RŃ@ E-ŔJ(˘€ JZ(ҨÍs¶Ţ+Ť°.ˇe?ŢNGĺZöÚťĄŢ<™Ń‰ěNĺTÜŃšnis@ą¦ŇĐ©i˘–€–›š\Đć–›K@…˘’–‹KIE! KšJ(ŔŇÓ§f€–›K@ E&ihE-%áE6–€”Rf–€Š( ˘Š(sJ)´˘€Š(Í-™Ą E´QE´”PŃE†Š RŇQ@ EP(4”QE%šÔăMjmŠ !¦šq¦š4ÓM8ÓM0ÓOJq¦ši¦šq¦iéM4ăŇšh­L4ö¦i¦y¦4ô¦yéL4É׿ŐĂő5Ť[:÷ú¸~¦±©µŮü1˙őÇý{źýW]źĂů\׹˙Đ…c_řlÖŹĆŹQ˘Š+Ę=1h˘Š@˘’”PKIK@…˘Š(QEQE˘ŠQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQŠ( ˘Š(˘Š((˘ŠQEQE%Q@ EP1¦ŠR)(RRŇPiň)¦ĆŇ”ăÖŠ2šE<ÓM0E4Šy¦šFE0Ô¦iTmަ5Ŕ„ÓT¬8¦0¦"j6Z™…FĂŠhD +3QŇ-µ&F¸JÖĹj‘Q°ëWÖ¨–“Ńśůđľž?†Oűî|3až’ßuşÂŁe­=¤»‘ěáŘĂ>±¤˙ľŞ6đíí'ýő[l*6Zj¤»“ěăŘĆ>łô“ţú¨Î…f;I˙}VËj&^ W<»‰ÓŹc$čvžŹ˙}S‹j;?ýőZ¬)„Sç—ry#ŘĘ:=¨ţú¦ť"ŰŃ˙:ÓaQ°§Ď.âpŹc8éVŕôoΚt»Füë@Ša\Ďą<‘ěgť2ÜvoÎéеůŐň)…hćbĺ]ŽfFd‘“Ź”‘Mó[Ú¦ÔSeôžç5Zş¨ćz1ţs{Qć·µ2Š`tÓíő(e3îŢŚ>éÇ­˙古ź÷Ődř>]ş„ŃăŹ#ę˙^şýľŐÉVRRÜÚ 4cÂ9cé'ýőGü#–>’ßUł·ÚŤľŐź´—rąWcţŰI?ďŞ?á±ô“ţú­­ľÔ›}©űIwTc˙Â;eé'ýőGü#¶^’ßUł·Ú“oµŇ]Ă•v1˙á±ô“ţúŁţŰI?ďŞ×Ú})vźJ=¤»‡*1˙á±ô“ţúŁţŰ/I?ďŞŘŰíFßj=¤»‡*1żá˛ô“ţúĄ˙„vÇŇOűęµöűQ·Ú—´—pĺF9đí—¤ź÷Ő'ü#Ö^’ßUł·Ú“m?i.áĘŚřG¬˝$˙ľ¨˙„zËŇOűę¶6ŃŠ=¤»‡*1˙á˛ô“ţúŁţë/I?ďŞŘŰFÚ=¤»‡*1˙á˛ô“ţúŁţŰ/I?ďŞŘǵ!Z=¤»‹•˙đŹYzI˙}Q˙ő—¤ź÷Őlm¤ŰG´—qňŁţű/I?ďŞ?áłô“ţú­Ť´›hö’î.TdÂ?eé'ýőGü#ö~’ßUݶ“mňî¨Č˙„~ĎŇOűęŹřGěý$˙ľ«_iôŁoµ>ywTc˙`YúI˙}Q˙ýź¤ź÷Őkíö¤Ú}(ö’î¨ÉţŔłô“ţú¤ţŔłô“ţú­}¦ŤľÔs˸rŁ#űÓŇOűęŹě?I?ďŞÖŰFÚ9ĺÜ9Q‘ýié'ýőGö ź¤ź÷Őkm¤ŰG<»‡*2°m=$˙ľ¨ţÁłôűęµ¶ŇmöŁž]Ă•_ŘVžŹ˙}RaZz?ýőZ»hŰG<»‡*2ż°­=ţú¤ţ´ôűęµvš6Óç—pĺFOöŻŁ˙ßTaZú?ýőZ»}¨ÁôŁž]Ă•_ŘvľŹ˙}RaÚú?ýőZ»}¨Úhç—qrŁ+ű×Ń˙ďŞC˘Zú?ýőZ»}©6űQĎ.áĘŚżěK_G˙ľ©?±-}ţú­]¦“mňî¨Ëţĵôűę“ű×Ń˙ďŞŐŰíIŹj|ňî¨ËţŵôűęŹěK_G˙ľ«OÔmöŁž]Ă•ضľŹ˙}Qý‹kč˙÷ŐiăÚŤ´s˸rŁ3űŰŃ˙ďŞOěk_G˙ľ«P­&Ú9ßpĺGJRQ]†ëmbö×9بţäVĹŻ‹ęţôgúW3EwÖşµťŢS®ăü-Á« ×šŐ»]VňÓŘ(ţr)Ü.wŕŇ×/kâĆPţŇéZöşÝ•ÖNŞÇř_ĺ4Ąš3L žAÍ.hôMÍ.hŮĄÍ74f€E74ą Ą¦ć–€E74ą f—4Ú)ěŇÓh C§f™J :–›šZZZLŇĐšPi( RÓihh¤Í---%´QE-%PŇŇQ@ EPŃE†Š QERŇRĐJZJ))i(4Ö§SZ€A˘@i¦śi¦Ť4ÓN4ÓL4ÓN4Ó@ 4ÓN4Ó@ =)¦śzSh­L4óL4ÓL4ăM4 iéL4óL4É׿ŐĂő5Ť[:÷ú¸~¦±©µŮü1˙őÇý{źýW]źĂů\׹˙Đ…c_řlÖŹĆŹQ˘Š+Ę=1h˘Š@˘’”PKIK@…˘Š(QEQE˘ŠQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE”QEQE%Q@Š( Š( ˘–’€ JZJ†–’€’śi(†šiĆŠCHzRŇP1¦’śi´Ŕi¦šqÚaŇ8© 0Đ"2)„T¦E0!aĹFELĂŠŤ…PH¨ŘTÄSS@@ÂŁaÖ§aQ0ëLD *2*vj„WaÖŁaS°ëQ°¦&@WšŚŽµ9Ôl:Ő@ËQ•ć§"ŁaÍQ-°â˘aV¨ŮiÜDSâ¦#šaUŃ Zi)Ň)“cZŹŁyk7·­Ç›xßű­ŹÎ±k˘Ý9Ş+HLQKEYʇ¦ňu»sś;Oâ+Đ1^em/‘sżÜpß­zŠ€ĘčFk“µLÚ“ĐŹm©6Š6×9©Ú6ÔĄÚ(¸mŁeK¶Ť´Ú6Ô»EC¶—mK´Rí\6Ѷ§Ú(Ř(¸Í JVŤ´\¶6—mhĂI˛¦ŰFÚ.2-´›j]˘Ť´\D[i6Ô»Eh¸lŁeI´Q´Qp")I¶¦Ú(Ú)ÜvŇm©¶Š6Š.;hĹK´Q´Qp!ŰIŠ›m!Z.X¤ĹM¶“m;ÚMµ6ÚB´\±IŠ—˘â#ŰI¶ĄŰFÚ.;hŰR‘I¶‹ZMµ6ÚM´î[i6ÔŰi Š.[i6ÔĄi6QqX‹mj]´›(¸X‹m&Ú—m&Úw íŁmI¶“m=´›j]´m˘ŕE¶“.Ú6Ńp8J(¤Ż@ĺŠJZQE-”´łm¨ÝZcÉťÔzg#ň­{_J¸P«Źď'ň®z–ťĹ®˝cs€&±ţ8ýkE\0H ÷ĽÚ¬[ß\ÚśÁ;¦;ÇĺNŕz-r6ľ+¸Źć5zݶ-|Ecs€d11í Çë@Ôą¨ŃÖE ŚŕÓ¨ŕŇć™K@Í(¦ćŚĐ褹 BŃIšZ@:ŠJ(ěŇÓh Ńšnihŕii´ą Ą¤˘€–“4 ĐKšJ(ŮĄ¦ŇŠZ))hĄ¤˘€—4ÚZZ)( ˘’ŠZ))hĄ¤˘€ J RQEÖ§SZ€IKI@Ä4†”Ňi¦šq¦š`!¦šq¦ši¦šq¦šaéM§”Úa¦šq¦šcSM9©§­0ÓM8ÓMdëßęáúšĆ­ť{ý\?SXÔ€Zěţ˙Čzăţ˝Ďţ„+Ś®ĎáŹü‡®?ëÜ˙čB±Żü6kGăG¨ŃEĺ´QE QIJ(Ą¤Ą BŃE(˘Š(˘ŠQŇŠJ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(¤Ą¤ Š( ˘–’…Q@Q@%-%”´%%- ŃKHhRZJ4ő¤§m ÓM8ŠCLcJi§ši i§šiaĂޤ"{Ó2)„T¤TdS":Ôl*R)„qLD$sQ°ëS°¨u¦"*&Ôě*2*€®Ă­F¬2đj6ÄW#šŤ—Š°ĂšŚ­R%˘»-0Šť–Ł#šb+‘MaS0¨ČŞ$…‡&Ł#ŠśŠŚŻî"Ň*R)„Ub†©ű xéÍsU×Í™ §÷Č‘ŠŢ“Đ檵Š)qZ™ ^›ŁËöŤ"ÖN¤ĆúŽ?Ąyťwţ›ÎŃgÜŻőţµĎ^íÍinmmöŁoµI¶ŤµĆoahĹ<-.Ú@G¶Ťµ&Ú1@íöŁoµI¶—mEŹj6űT»hŰEŔ‹oµj]´m ±Fßj—m&Ú.2=´mö©6Ѷ‹ÚMµ.Ę6Ńqmҵ6Ę6Ńp±ĘMľŐ6Ú6Ó¸Xm}Ş}”›h¸X‡oµ&ßj­h¸X‡mj]´m˘â±ÚMµ.ÚM´\,E¶“mM¶“m0±ÚMµ6ÚM´ŠŇm©¶Ňm ,C¶Ťµ.ÚM´¶Ň©¤ŰLV"ŰíI´Ô»hŰ@X‹m&ÓR•¤ŰEÂÄ[hŰRí¤+EÂÄ[M&Ú—›iÜ,G¶“i©vŇm˘áb-¦­KŠM´Ú6Ô»i6ŃqmŁŐ.(ŰEÂÄ;hǵK¶­0±çt´”µčśˇIE)sIK@Š( Š( BŃIE-”´4SŰ6č&t?ěšÖµńUÔXł^†°č gkkâ[Śf…˝qůÖ¬r¤©ş7WSÝNkÍŞHn%·}ĐČČŢŞqNŕzFh®2×Ĺ`Le˙kůÖÍŻŠ,§Ŕ—t,˝Čüčn—5 7Nˇˇ‘z©ÍKš\ÓłLĄ ć—4Ŕis@˘“4ą Ą¦ć– JZ\ŇÓsK@Ł4€Ńšu-6”P!ÔRQ@˘Qšu™˘€–’ŚĐŃIK@(˘Š(Ł4RPŇQERQ@!Ą4Ó@ IKI@Ä4†–šh 4ÓŤ4Ó 4ÓŤ4ĐM4ÓŤ0ő ž”ÓN=)¦€i¦śi¦€ÔÓÖśÔÓÖ€i¦śi¦€2uďőpýMcVνţ®©¬j@-v ä=q˙^ç˙BĆWgđÇţC×őîô!X×ţ5ŁńŁÔh˘ŠňŹLZ(˘(¤ĄRŇRĐ!h˘ŠQEQE(éEĄQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERRĐh(˘Š))h ˘Š(QERRŃ@ EP1(Ą4”†’–Đ0¤4´m%:Đ1´Ň)ôÓHcM4ÓĎJi¦¦šyÓ@ 4Ň)ćšiŚÓT¦EBE1…LEFÂTdu©ćŁ"°¨Č©ŘTl*„@ÂŁaS‘Q°¦"»j2*vÔdU…†j2ĽÔĚ)Ś9¦&@G śŽµ ˇ29¦0âĄaÍ0Ž)’BE0ŽMLÂWšd‘\ťě~]ä©čĆşň8®o[Źeů=ťA­©=Lk- ěQEĐs®żŔSdŢ@}ŔüÁţ•ČWAŕąü­}S´¨Wú˙JʲĽpv’=mj]´mĎjóŽ˘-´»j@”»h¸mm6ßj6űR¸X„-.Ú—Ômö˘ŕG¶Ťµ.Ú\QqíŁmMŠ6Ńp!ŮFÁSm¤ŰEŔ‡oµjmľÔcÚ‹‡m}ŞlRö˘ŕE·Ú“mKéI´úP[i6Ô»OĄ>”î[hŰRŕúR`úQp")FŃRŕúQéEŔ‡`Łh©JźJMľÔ\¶ŠM˘¦ŰíI¶‹ŃI´TŰ}©6űS¸¬E¶“h©¶Ňmö˘ŕC¶‚˘Ą*i6š.[E&Ú›m!Z.;hŰR‘I´Ó¸m¤ŰSm4ݦ‹ŹmEI´Ňm4\öŠB˘ĄÚi š.[E!J—i¤*iÚM•6ÓHE´m.ÓI´Ńp"Ú)0*]ľÔö§qX‹m&Ú—oµ!Ô\öŇ©0i źJ.šŃEéEPQKE0–ŠJZ)( ˘Š(RŇQ@ E%.hQEQE|SI n‰ŮŐN+V×Ä×ÖřVe˙lsůŠÇĄ gakâ»Ip'W…˝zŠŘ‚î •ÝÉ ˙eł^oNI6Ý2·¨8˘ŕzeĂÚř’ţŰ¤ŻŁŚţ˝kf×ŶŇ`\ĆńQó `tąŞÖ×Ö×c0LŹě5b€šZm ć€iąĄÍ:–š)s@Ł4ÜÓ¨sJ 6–‡fŠm.hę)Ł4ę)3Kš-’—4´ LŇĐh Ń@-%QEQE%”Q@!Ą¦šJJZJšiM! 4†–ši€†iĆô i§a =)¦”ô¦ši¦šy¦kSZsSOZiéM4ăŇšh#^˙WÔÖ5lëßęáúšĆ¤×gđÇţC×őîô!\ev ?ä=q˙^ç˙BŤáłZ?=FŠ(Ż(ôŢŠ(ĄÍ%€ZZJZ-Q@‚Š( Š( RŇ )€´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ E%´RQ@ Hh˘€ (˘Q@ EP0˘Š(˘Š((˘’…Q@ E-%E€ŇĐhÚi§R@ ëHE:šÔŇ)¦źHEL5!¦ôa¦‘O"E0E0ŠÓ 1Í0Š”ŠŚŽ´Ŕ‰…FG51i Ć1 b!"˘#ŠśŽj6ˇ0¨Čć§aQ‘LD,µ ™†E0­Q$sLeâ¦aLaĹ12)„sR°¦‘L’+ Ä1˙¨“ę§üţuľEeëŃďÓ÷¨Ŕ֔ݤŚę+ĹśŐQ]g UÝłk6’çJ źbqT©AÁu“WVˇěűiBÓ,ć6PM×Ě@ß©±^AÚ3mSöŇí˘ŕ0 6ÓöŠ]´€Źm.Ú“m.Á@mĄŰRmŁmG¶Ťµ&Ú6ҸíŁmIFÚw±IŠ›h¤Ř(¸X‹m©v 6Qqb“mM°Rö˘ŕCŠMµ6ÁI´Qp±Ú1Rí›E;©vzM˘‹)1Rě\,CŠ1Rě›,RbĄŘ(()ܱMĹM°Rl\DEi6Ô»E!AEŔ‹©¶ M‚‹ bĄ*)6S¸bŤµ.ĘM´©vQ¶‹‡b¤*)6Ó¸â“!ZB´\ńIŠ—›¶€#Ĺ©6ŠB˘ťÄGŠLT›Eh,QŠ~Ú6ĐxŁ&ÚM˘[E_{Dn™_Ą@önżt†č©&s84W˘śČÉĂ>´Ú˘Š( Š( Š( ˘–Š`QEQEQE.h¤˘€ŠJ(٢’ŠZ(Ł4ŞĹH*H> Ö•Ż5 \8ČŁ´śţ˝k2Šëm|_ ŕ]BŃźď'#ň­›]FŇđ"tcéž*óšPqČ84éŮĄ®×]ż´ŔYŮÔ üŐłiă8[¸ ˙µČü©ÓŠPjŤ®­gyŹ&t,„śĘ®PóJ)™ĄÍ?4ą¦f—4ú) Ňć€KMÍ QIšZ.ii( bćŠJ)ěŃšLŃ@ š)-’Š(˘’ŠJ(˘†i Ł4†€ JZi ŃA 4ÓKHi€ÓM=)ĆšzPM0ÓŤ4ĐM6śi´ÓÖićh¦šzÓŤ4ő ž”ÓN=)¦€25ďőpýMcVĆ˝÷!úšÇ¤×gđÇţC×őîô!\ev_ ä=q˙^ç˙BŤáłZ?=JŠ(Ż(ôŢŠ(˘Š)˘–Q@‡QIEŠJZ(˘Š )€QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE(˘€ (˘ E-% (˘€ (˘€’ťHh(˘Š’”Ń@ IKŠ(ÚJR)(´Râ’‰IKŽ)(Ň) )¤"€E4ő§šiaSH§‘M"‘M"¤4Â(Ć)¦Ld$ST¤SXsLD$Tl*cQ‘T"Ôdu©ćŁaLD,*6Ôě*6Ó)Ś*VĆD°ćŁ"§aQLDL*29©¦LDDqU/âólf\uCŠ»Šk®F=j“± ]%->hü©ž?î±Ęí8D"ŚRŃ@©áţÓá»SÔ ([Ak“řw>ý2ęyŽ]ßýc]~+ĘŞ­6ŽČk3iŁi§â—™C6Ó€§b” f=©vÓńF)ĚQ´Ô›hŰ@ ŰF)űhĹGŠ1Rm¤ŰLc1F)űhŰďHmŁm?m¦x¤ŰRm¤Ű@†m¤ŰRbŚPei6Ô„QŠŹ›jM´b€#Ĺ&*B´›i(ŰO"“´›jM´„P"Ć«Ľ2G÷”ýk_mU)˛‹Ej=´oŐF}EW{î7ŕjÔŃ §EHöňG÷”ăÔTuD…-%- (˘€ (˘€ŠZ)€”´”´QEQERŇQ@ EP!h¤˘‹E%-j×R»ł Ápč=3‘ůUZ(Ł´ń„éu Č=S[Vľ"Óî°Ţ[ác˙­\-z‚°pX{NÍyĄµíÍŁn·ťÓŘá[6ž/ş‹ć$™}GĘiŮćŚÖ5§‰´űśÂÇ´úÖ˛H’¨hŮYOB§"’f—4Ę\Đ!ĆŚÓsFhÔf›š\ШÍ74ą Í¦Ń@ E%RE!4ą¤Í&hÍ„óE&h¤4fĐi„Ň“M&€ÓM)¦š!¦ŇšmÓ <Ó #SSN4ĂÔĐ1)¦śi¦÷ú¸~¦±ëc^űýMcŇk˛řc˙!ëŹú÷?ú®6»?†?ň¸˙Żs˙ˇ ĆżđŮ­ŤˇEW”zbŇŇQ@ EPŃIK@…˘Š)(˘Š(˘ŠJZAŇ–Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@´”QEQEQEQEQEQEQE€(˘ŠJ)i(QERRŃ@ EP1(˘Š))i(¤Ą¤ b)M%!§R@Ć‘M§ő¦‘@Ć‘HiÔ”aŇ)ćĐdSH§žôŇ)aĂRM"€""šEHÂi ”ô4ĆŔ„Ži„qRšŚÓ c ”ŠaŐ Ť…Nj7ĐsL"¦"Ł=)„ŠaÔÄTdUČâF*R8¦LF‰bͤruńů×6+±ÖˇótąřĺFářW]TťârVVP)h­LI¬ć6÷°L˝c‘X~5íń謧†áb˝źĂ×kĐ,¦ęL@¨â¸±kDÍč=Ń| \S±@Ät‰Š]´ěQŠWÝ´¸§b€) m.)ŘĄĹa¸ŁěR‶“&)1@ ĹiřŁĚQŠ~)1EŔf(Ĺ;b‹€ĚRm©1íIŠfÚMµ&(Ĺ0"ŰHEHE&(¸†b“&Ą&(¸ "“üQŠw2´„T„ L Źm!&!m§ŕR`SĚRbźF0Šn*L L .x¤"¤ R`S=´©ÜP!¤Ĺ?Ś Ź„T„R`Ső]ôő<Łěj”Ń (©¤´•:®G¨¨OE]ČjÁEP ˘Š(˘Š(˘Š)€QEQE´RRĐ ˘Š(QE´RQ@ KIGJZ– ©í[tĽgý“І–€7­<[yč“/©áż:Ú´ńU…ĆŚĐ1ţřăó®Š.§ĹhÍ74 ÓsFi3FiąŁ4””´†ŚŇf€ )( 4”Rf€ BhÍ4š`šiM4Đ56”ÓM!éM4¦šMÓ Ą4Ă@ŔÓOZSM&i¦”šCH ťwîCő5Ž+_]űýMd B»/†_ň¸˙Żs˙ˇ ăv żä?q˙^ç˙BŤoáłZ?=F–’–ĽłÓ (Ą Ą˘ŠZ(˘ EQaQ@Q@ ( t˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ŠJ(˘Š(Ą¤˘€ ZJ(h¤˘€Š)(Ą¤˘€ŠJ(h˘Š(˘Š(˘Š %-! Š( ŠJZJ)h ˘–Đ0¤Ą¤ ’–ŚPQE†%´”Rb–’i)qHh””ěRR¤sIŠ}0ĐM4Óé¦ĆRN"ŠaÂ:Ô„sL"†a!ÓÖ€""ÂĄ"E0""ŁaSÍFE1°¦ÍJĂÂ) *2*b:Ôl*„BEFĂŠ™‡5ÄDE0ŠŠ‰‡&™$l8¦RM"Š÷ů°H‡Ł)Ąpd$ â˝÷®Q‹ÉÔ'NÁÍtQ{Ł›¶ejZJZč9‚˝Oáíǝ᥋<Ă+/ŕyţµĺµŢü2ąůŻ­‰ţě€~•ωW¦kEÚG}Š\RâŚWv Š\RâŠ@&)qKŠP(¸ĄĹ;b€Š\S±F(¸¤ĹIŠLP1F ?b€IŠ~)1@ ŧbŚP¤ĹIŠLSŁüRb€E&)äRb Ĺ&*LRb€E&)äRb ŰIŠ}&(¸¦‘O¤ĹE&*LSqLbŚSńHE3§âŠŚŠCO"Š`2“üRb Łâ) LSńHE0ŠCOĹ&(”§‘IŠbŠLSńF(¤"źŠLPqM"źŠB(‡Ĺ!Z—®Ŕ"ĹT¤"XŹ›jM´b€"Ĺ©1IŠŹm&*LRböŇm©vŇb€"Ĺ&*R)6Đ#ŰI¶ĄĹ&)ÜV#Ĺ&*LRbXfÚMµ&)1@XŹÂ’}ĺ¬b“î+$ÓĐňŚWëÍV’Ędí¸zŠ×ŰI¶©Mŕ™‚A`Ń[oČ0ęÔUi4čŰîż­Zš!Ó} Ú*Ě–§@{UvR§ >ői¦CM”P!h˘Š)1KE%´S˘Š(ÍQ@Q@ĄÍ%-QEfŚŃ@Q@>)d…FěŚ;©Ĺ2”Pŧ‰ďíđ$q2ŽÎ9üëjÓĹÖ’áná>żxŤq´PĄ[Ţ[Ý.č&Iű&¦Ż0WhŘ21R;Z–ľ#Ô-p ľjŽŇsúÓ¸\îóFkťµń}ĽQ4GŐ~a[Ú…µŕÍĽčţŔóůSg4„Ňf“4ęJJ(¤'š3M'šZLŃšJÓMóHM!4ŇiI¦Đ”ÚRx¤ CIć™N'šmÓOSJi¦ Hh4†ZçÜ‹ękVĆą÷!úšÇ¤Ä-v żä=q˙^ç˙BĆWgđËţC×őîô!XÖţ5ŁüDzŤ”µĺž S¦ŇŠ-QL˘’–…˘Š(QEQEŁĄ”PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPŇQE-%PA˘ŠJ(˘€ (˘€ ZJ(i(˘€ (¤ aEPQE†QE%Q@ĤĄ¤ ›N¤4 Ji§R@ ¤Ĺ8ŇP1„RN4†€E4ÓÍ4ĐdSH©¦‘LDl8¦RMj`Dj2*b)„S3 ŚŽi„Šc ”ŠaÄBEFĂŠ™‡ZŚô¦")„T¬)„U„ŠkT¤S¦I×#â(Ľ˝P·i7ôţ•ֹؑżĂ˙ňýVµ¤ýăĘń9ęZJZë8ÂşŹ‡·>OŠ2xž6OÄ ˙Jć+GĂ÷?c×ěfÎĚąúüę*.h4T¤™í´b—¸ŻďŢ— R†\Râ—ŁěRŕĐqF)ŘĄ WŠ1OĹ&( ŤĹ&)Ř4b€¸ÜRbźŠ0i€Ě{RbźŠ1@\f)1O"ŚPŠ1NĹ%¸ÜSqRb“Âă1IŹj~ &(„RbžE&(¸¤Ĺ8Š0h ‘â‚=©Ř¤Ĺ1\n)ö§â“ĆcÚ“üRb€IŠ}%0¸ÚiüR@†bšiř4 b“ň)¸¦ŠJ}!ĂHiř¤" ¤4ý´ WE; .4ŠJv !Âăi ? .q{i6Ô¤Ĺt”G¶“.)6Đx¤ĹHV“ŔfÚMµ&) öŇb¤Ĺ&(ńIŠŠLS†b“mIŠLP#ŰHVĄĹ!öŇm©1AŔ‹m&*\Rm V#Ĺ!Z“b‹…ńIŠ“§qXŹbźŠ1@XŹm5˘W`÷©qF(¸¬Q“N‰ľîTűUY4ůSîáǵk‘F=ŞÔÚ!Á3źdd8e űŠJßhŐĆ=ę´št/Ę‚§Ú©T]HtßC&Šą&›*ýÂ~UUâxÎJýjÓL‡†ŃEÉ (˘€ (Ą ˘–’´”´RRĐEP!(Ą¤ bŃIE-˘Š(˘Š •9ę)´´ ҵ×ďípŢb˙vNkb×ĹŃ>Ô%÷ä~UĘŇçˇŰjv—`y7ÇűąÁüŞÎkĚÁ ‚«ÖşÝő¦s–Qü/ó wÎ÷4†ą»o©ŔşíFĄk[jÖwxň®qţŕţ´Ć]¤&“4†€ži¤ĐO4Ňh'Ą&i %Ą4š âšM­4š ćšMÓM)4ÓÖi )¦š@eër©¬ŠÖ×>ä?SY4…®Ďá—ü‡®?ëÜ˙čB¸Á]źĂ/ůÜ׹˙Đ…c_řlÖŹĆŹP´‚–ĽłÓ QIJ)€QE-QE! ES´RRҢŠJp˘RĐš(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ RRĐh(˘Š(˘Š(˘ŠCEP0˘Š((˘Š”´”€))i(QE%†–Šm´” i”ăHhĚRu4ĐM4ÓÍ4Ц‘Šy¦µ0E0ŠÓ ##ša)Â) Ť‡53 ŚŠb!"ŁaSĹ0Š`BEFELĂ“QĹPśfŁ"¦aLaL’)¤T†iaŹâHĽÍ)›Ľlôţµ˛{Ő=J/;Nť1Ő \¤™W‹GŠZ)k¸ó•Ł«/U9”´ď|ÂëO¶ťND‘+őgŕ‹źµxRČç-1źŔś~­úńfądŃčEÝ&Ł´b¤aŠ\b” 1@®&)iqK@„ĹĄĄĹ6’ťŠ1@ ŧb’€Š1N¤¦!¸ŁěQŠabťŠLPhĹ; ŇbźŠLS†’žE&(””üRb€IN"“n)1NĹ&)€ÚJv)1@ "“üR@ 4§Rb†šLS¤"€¸ĂHE:Š`6“ěRPqIN"“ÓIŠv(" ¦ÓńIŠ6Šv)(§ŠJq¦i1N¤ G!¶“&)¸®Q¤ĹIŠM´(ŰRm¤Ĺ0#Ĺ&Ú— Dei6Ô¤ĹGŠBµ!›i(Ĺ?mh=´m©6Ňm DxŁüQ¶€±Z6Ô›i1L,GŠ6ԤűZMµ&(ĹDVŤµ!m ¶Ňm©vҦ#ŰIŠ­h¸¬DVŤµ&ÚLQqXfÚi@Ă ő.)1Náb”ş|2t]§ýš©&—"äĆÁ‡ˇŕÖĆ&*”Ú!Á3ž’"űčE2ş2 đ@"«É§Á'đm>«ĹZ©Ü‡K±‰KWĺŇ\s†‡U$·–ő@ő«RLÍŢ:))i’QEQEQE0ŠZJ3EP ˘Š3@ Fi:Ń@Š( AA˘Đ0˘ŚŃ@&h¤  ¶Úµĺ§ú©Űo÷[‘úÖµ·ŠČŔş?í!ţ•ÎQ@\îmő›+˘sÇř[Vó‘ĹyÝY·Ôn­ÔÎŕw9•;ŽçtM&kš·ńD‹sqýä85«o­YÜđ˛„cŮř§p/”Ú72E%ő¦ć”ži´SIć”ÓOSHAHh¤4—­ýČ~¦˛k[[ű‘}MdŇb»/†_ň¸˙Żs˙ˇ ă+˛ře˙!ëŹú÷?ú¬k ›Qţ"=J–›K^Yé‹@¤Ąh´´”S´QE Q@˘…˘Š(˘Š(´‚–€ (˘€ (˘€ (˘€ (˘€ (˘Q@Q@Q@Q@Q@Q@Q@Q@Qš(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š`”´R´RŇP0˘Š(¤Ą¤ Š( b(˘€KIHbJR(Ĺ%%-€HzŇŇ´ i¤§SMÓM:’ 4Ň)Ćšh†šiäSMj2*SQ·z`FE0ŠÓsLDFEJĂŠŚÓ&Ôl8©ŤDEP¦7z•…0ŚÓ!"EJĂŠaÉdG©¦2îRCĹJÂE1yqŠćXĎUb?Zehk±y:ÄăłĂńź]ńwW<é+6‚–’–ŹMřasżIş·'ý\ˇ€ö#˙­]˝yŹÂűťšŐŐąn‘8îŁwĺ\Ez-ĚBh$ŹűĘEyŮbc]TŤ…ŞaEVç8WşřjëíľÓćÎIA>¤ ÔW…W®ü6şóü0#'&Y~™çú×&-^ ›QzŘ룴bĽă (¤Ąb—QLAEPŠJZJJ)hĹ1\J\QE&))hĹ6’śi1@ ˘–ŚPi :Đi :‚)e!§LPi ; ŇS±IL¤4´†€i §RS´„ŇšLPi §SqLCM%<Šm4šJv) 6Ó±I@ 4™§LS¦’śE&(Ú .(¦i)Ć“””¦Šç±F)ř¤Ĺht ŧŇb Ĺ&)ř¤Ĺ0Š1NĹ ¤+RbŚP{i©1AbźŠM´ĚRb¤Ĺ&(¸¦‘RbŚS„WTEG$1Ę‘CqVŞ>¦n’črôVÜş¦n’črÔVüÚ|ňSiő^*ŚşCőNŘŐ©¦fé´fŃSKk4?ë#`={T5w"Ö JZJ”´P04”´”4=MKQCÔÔÔ ě~˙Čvăţ˝Ďţ„+Ź®ÇáŻü‡n?ëÜ˙čB±­đ3j?ÄG§ ZAEy‡¤8RÓGZZ--6ť@‚–’– ( Qš`-Q@Q@Ą¤˘ E%´RRĐEŁ4´”QšZ)( ˘’–€ ))hĄÍ%´RQ@ E%´RfŚĐŃIš3@ E%´QE%-”´RQH¤ÍPŇQEQEQE0ŠJ3@ E%´RRĐE%-QEQEQE!¤Ą4”€)i(¦0˘ŠJ@-Q@ EP0¤4´†‰E.)(¤ďJhĹ “´JJ)(Ňb”šBhÓM4ăM4Ŕi¦š}4Đ 4Šq¤Ĺ1ša©¦LŰ­1‡#´ĂLŤ4ÓŘS "aĹFEJÝ*3LDdu¦‘»Ôf¨LaŞzś>~›q9(qőëWóL8 ŠkGrZş<ÖŠ’â/&ćH˙¸Ĺj:ô4Z(˘Őŕ[ݵřFĚ““1źŔ×C\/«Ż3GĽ¶'¦ >Ś?ű]Őy5•¦Ń×x ˘ŠZČaŠ(˘Q@%P ¤Ą˘€QEB))M%0 CE JCJi( )i¤Ą4”R %”´”SM- ¤4´”i¤4ăM ¦ÓŤ6hĄ¤4ÓHii 0’–’€ŇRšJ%!4¦“ŔLŇPh ˘Š((˘ŠJCKIL šLS±ITt‰ŠJu ŃŠ\Q@„ĹĄ¤ Ĺ%:Ši§QŠn)1NĹ ŃNĹŔn)1OŔ¤Ĺ§bŚPqIŠ~&(¸ŁěQŠn(Ĺ;PqF)ř¤Ĺ3¸§bŚP1KŠvÚ1HmŁm?b€¶“mIŠ0)Ú1OĹhĚRb¤Ĺ&ÚaZMµ&)1@â“.ÚL ŚŠMµ!Z1@¤ŰRâ­0#"“&ÚM´ ÄdSvÔ¸¤"í¦í©qMĹFVšVĄ"­±ÚB*RĽSHĹ;ZiZ”ŠB´\D[i¤T¸¤#Ú•Í4­JE!ÄEŠi©JÓJĐ+bšVĄ+M+LV"Ĺ4­JE4Šb±^ W–Ć ľň}Gp­4¨¦ť‰jćDşAňź>ÍTĄ´šżǨäWDE!t«Uš9Š+ –Î ~üc>ŁTĄŇGXźÍV¦tÚ3(©ĺ˛ž/Ľ„ŹQÍAVťČµ‰`ęjj†¦¦¤×ađ×ţC·őîô!\uv? ä;q˙\ţ„+*ßĂf´~4zpĄÍ%ćáE Ą BŇÓiÔÄ-”´QKH( ˘Š(Ł4Q@ Fi)hQEQEQEQEQERŇQ@ E%-´”PŃIE-”PŃIE-”PŃIE-¤˘€4f’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(h¤˘€IKA¤QE ))Ô””RŇS˘Š)QIE“Qš!˘ŠJ@†–ĐRRŇbĆšJq¦Đ1¦ŇšJJCŇ”Ňa¤4ăM4Ä0Óži­@‘L5!¦`FÂŁ"ĄjŤ©Ť‡Ô§ĄFôĐČëQ‘Ra¦"3ÖzšŠaiá5řĽťbqŮoĚVuox¶·°ËýôÇäúő]đwŠ<úŠŇaKIKVAŰü-»ňµ»›rxšî˙\ש׉ř"ëěž.°$ád,˙Ŕ†ëŠöĂ^v)Zw:i?t)i)k°Ą¤Ą AIŢŠ(i PEP ¤˘ŠCIJi)€RZLP1 %)¤ @i -&)€†›N4”†›N4Ú))h¦SM8ŇPi )¤4JJSŠJi¦Ó¦‘L4ÚZJCIJi1LBR\R@ IKI@i)Ć’ 4†śi¦€Š1E%Q@ IJi)—IKEQŇ&(Ą¤ĹĄ˘€ŠZLPQŠZ(Ú)y˘‰INĹ CqF)ؤĹ%ĄŁ”RâŚP11F)ؤĹ7bťŠ1@ ŁěQŠn(Ĺ;b€F)ŘŁ JLS±KŠ7b—¸ bŚSńF(ĚQŠqb€Š\RíŁÜR§âŚP1I¶¤ŰI¶€#Ĺiűi1@ ŰI¶¤Ĺ&)ŚŹmT¤Ű@ŠŇm©6ĐV€!"Š—m!Z`EŠiZ”­&(-¦Š—„S Ň*b)¸ ¦â¦"W­1M+R‘M"öÓH©1HEb")¤”Šib!"ŽjR)¤P+M"¤+M"ȤĹ<ŠLSÂ)§â“ŹmE-¬Rýôú÷«â“Ó 76ilABpÝŤAWő1…O©Ş´]ŃĎ5fŘü5˙íÇýp?ú®:»†żň¸˙®˙Bľ]Ťš)i˘–ĽÓŇ)iJ(´´ÚZ:–š)E(¤f…˘ŚŃ@Š( ´‚–‚Š( Š( Š( Š( Š( Š( Š( Š( ˘’ŠZ)( ˘“4f€’ŚŃ@Q@-%´RQ@ Fi( ˘’–€ ))h˘Š3@Q@Q@Q@-%´RQ@ E%´Rf—4QE ŇÓOZ)i( bćŚŇQ@ IERRŇb€ (˘Ä˘Š(”QE”´”€) -%0i1N4ÓABM4ăHh”†”Óh†šiM!¦ 4ÓÍ0ĐZa©¦LÍFŐ) b#"Łj”ÔmÖš¨ŰĄJÝę3LC 0÷§‘L=鉜÷‹!ÝcťŃńů×)]ν›ŁÎ%Fďʸjě˘ýÓŠş÷‚ŚQElbOe;ZßŰÎżz)Çŕs_A#‰#W_şŔ_;×»xbëíž°›ěSYŐĄŞýŘţ¦łkxlsÔř‚»†ßň¸˙®˙BÇWcđßţC—őŔ˙čB˘·ŔĘŁńŁÓ- ˘ĽÓŃKIERŇ ZZZm-ŠÄ´”PŃIK@ KM´´RQšZ(˘Q@ E%´RQ@-% ˘’ŠZLŃE˘Š(Í-%´RQ@ E%´RfŠZ(˘€ (˘€ (˘€ (˘€ (˘€ (Ł4QERŇQ@-%´RQ@ E%´”Q@ IERŇQ@ IEQIK@Š)(h¤Ą ŠJZJJu6€ (¤¤1M%’Ši(¤ ŇRž´”a§ië@Ä ŃE4ňi”óM4Ň)¦śi¦ =)ŤO¦ša¦yëM=)€Ć¨Ú¤jcS¦5<ÓSw¨Č© 1©ŚŽi„u© F{ÓÄ~mĽ‘žŽĄOâ+ÎYJ±SÔôŁ^ŞEäjw㣒+¦ÝŘ…˘eZ(˘şQĘëß .ü˙ ‰ć ™?óS^C^‰đ¦ëjOP˛úW>%^™Ą=$z=Q^i¸QE%-  RĐ@˘– IKšJ`”E%Š)€”„ŇŇPRRŇP ¦šq¤¦i :Đh˘Š) -! Đii 0IN¦ĐJSI@ IKIL¦šu%6’śi(ÓIN¤¦Rq¦Đi)M”†–Š6’ťHi€”†ťM4””´`fâŚQE3 J)hĹĄ˘€RŃ@ IKřRPEPRŃE”´PQKF(ĄŁPHiÔ”QE-%.(Ł4€1F)h ĹĄŁŁ´PŠZ LRâ–ŠJ1KKŠn(Ĺ;𢀊1NĹ&(¸Ĺ§bŚP1¸ŁěQ@ "ŚS¨ F)ř¤Ĺ7›iŘŁÚLT„Rb€#"šEJVšE0#"G51Ň=©ҵ)Ň(Ň*\SHëLŠÓHćĄ4ÜP"2)Ś*\RíLHÍ4Š­FE1‘M"¤"šE1•âEJi¤P"")¤qRÓH¦"~ťq÷â®ŇLÎjńhóęZJ+¸óĹĄF(á—ŞśŠJ(ô›p.ôËYÔäIľ~˘¬šçĽ uöŻYrŃŚţăôĹtĽ‰«IŁĄ;  RQšCE%Z))h¤4´”ŔJJ( ŠBhÍ’‚i(´„ŃHi€”QI@h ŇPi)i)€RQA¤J(¦h4JJJZCLAšBh¤4†E%%%)¤ 4QE1 M4ăI@ MĄ4”Ŕ)(˘€ JZC@i(¤ ŇRŇS>’—b¨čŚŇâ“ÂŚQE%´”€(˘Š(ĹPŠ(˘€ (Ĺ aEPE-b’–Š@QF(ĄŁP0Ł4QŠZ8¤Ą ¤4˘–€RŃ@€(Ą Ĺ-s@-RĹ%-”RŇĐhĄĹ ˘ťŠLP1¸ĄĹ-%%ĄĹÜRbťE0IO"Ša¤"źŠiÂ)¤T„SH Ȧ‘R4Ň)Ň*B)1LD$SMJE4ŠŠaTÄS¦"")¤TŚ)§Š`DGŇ*R8¦5#"›ŠÓHâ¨C 0ŽjB)¤s@†m?„PV·÷"úšČďZúçú¸ľ¦˛tÓřNZźµ×|8˙ÝÇýp?ú®Fşď‡?ň¸˙®˙B5ľ:_=*–š)kÎ=ÔR Z(ĄÍ Ą Í¤˘‡KšhĄ¤!h¤˘€ŠJZZ)-QFhĄ¤˘€ŠJ3@ IE´RQ@ E%´RQ@ Fh˘€ ŇŇQ@ E%´RQ@ E&hÍ.hÍ&h Ł4”PKIE-”PŃIE-”ą 4f“4f€š3MÍěŃIE-”PKIE-¤˘€4RQ@ E%´Rf—4 (Í%-i(˘…-%QEfŠ( aA˘Ň”P1i(˘€E%!…J›Ji ¤zRKšC@ M=)OZCŇ€HzŇšm1i¦śi¦ 4ĂN4Ö¦M0ÓŤ4Ó3L4öéLjb#5t©MFÔŔŚÓ =©††”ÇPŔĐŚSÍ5©ó{Ě7RĆzŁ‘úÔuŁŻĹĺk3ú1 ?ţ9¬ęLód¬ÚŠJZb=?ámÖý*îŘźőr†ę?úŐÜšňß…×^^ąsnOA¸}TŹń5ę5ćâŞ3˘Ý (¤ÍbXę)˘–Ł4ÜŇÓsIš)( J(˘ŠJ(¤¦!i(&’€Š) ’ŠJ(˘ŠJCKHi€SM-! ¤Ą¤4†’–›LAHii())M4ĐM&h¤¦QKI@€Óii šii ¦QE”†–’€ŇŇJ)i)BŠ)*ŤÂŠ( ’–ŚPQŠ( Ą˘€´Q@))qEŠu% QŠ)i€”¸˘Š@QE´”¸ aAĄ¤ Ž”RŇ)hĄĹ˘Š1@-b€ ´QF(Ĺ .)h)1NĹ% ”QEb––Ť˘–”@„Ĺ&9§âšERĐh¸¤Ĺ?”Ň´ÜSé(¸¤Ĺ?„S2)¦¤4Ň(†šG!Ň(")©¦`FE4ŠÓH¦"2)„T¦EFE0Š‘©„S¦°©â›LDDsM"Ą#ša¦f“ň)¤SĂŇ›OĹ!Đ#\˙WÔÖ@­Ť{ý\?SXâşiü'-OZëľ˙Čnúŕô!\…ußżä7q˙\ţ„)Vřé|hôšZniŐćťâŇŇRĐJ 6”S´´ÚZQKH)hQEf—4”P˘š)i´RQ@ E&h ˘“4SąŁ4”P1sKMĄ¤ŃIE-”PŃIK@fŚĐE&h Í¤˘€E6–€ŠJ(Ą¤Ł4´RfŚĐŃIš(h¤˘€’Š(h¤˘€’ŚŃšZ3IE;4RQ@ E%´f’Š3KšJ(Ą¤˘€ŠJ3@ E&hÍ-%†€E6ŚĐ1hͦгIšJ(ěŃšnhÍŃIš3@ÇQMÍ ŚŇRR¤ŇfI@¤4´†…%)éM ÓOJu! LÓŤ6€ô¦šZBi€ÓL4óL=(ÓL4óL4ŔaéL4ö¦50#nő©zŤ©€Ć¨Č§µ0÷¦!„qMjqéL4Är^,‹mä2ăď.?*Á®łĹî°ŠQŐ$ÇŕG˙Zą:ě¤ďpVV›’ŚŃZnř*ëěž,±|ŕ3Ďü^Ôkçű)Í­äŽ<ąż#^ý‰#W†ŠáĹ/y3ZoAh˘Šä5 ZJZbŠAE)¤ĄÍ%”Q@!4J”´”Ŕ)(˘€ŇRŇPIEŔ)(4R¤ ŇS %)¤ ¤4¦’„˘ŠJ %šh4”RS¤4¦’ IKHh¤˘@ HiM%0Š)(4Úu! ¤Ą4†€ J) 0(ŇRŇU›…Q@QŠ))h ˘–ŠJ)i(h˘Š@QE”´PŠ)i) (Ą˘QHQE´QE.(Ł4P0Ą˘Š@dŃŠ\P0ŁQ@Ą¤Ą¤ŃE ZJZ(1KŠ(QE LRŠ( –’–€ B)h ¤§RPSqN"’€Šu%7Ň)ř¦‘š`3ÜT„SHâ€i¤SȦâ‘M"¤"EE0ŠÓ¦dSćĄ4ĂÖ¦jCM"‘M=)ćš@ C1M"ži§­1 Ĺ4Š}!¦#^˙WÔÖ0­ťý\?SXŐÓOá9j|A]wĂŻů Ď˙\óČ×]đëţCs˙×üĹMoŽ—ĆŹHĄÚZóŽńÔ´ÚZZQMÍ(4Ä--74ą  )-ŠJ(ii´f€E 4f€ŠLŃš-˘Š)i( ˘’ŚĐŃIš(h¤˘€4त fŠJJCš)´´ÄQE´™Ł4´f’Š\ŃšJ3@Çf“4™˘ E% ˘“4f€Š3Išu¤Í&hŮŁ4Ú(sE%´RfŚĐŇÓsFhÔf›š\ĐŃšJ(sE% Í¤Íą˘’ŠZ)(Í-“4(˘’€“4´™ aš3E (˘ŚĐEŁ4QERQE%RR´”Q@jmĄ%šM-4Đ””¦›šJCJi­Lši§a ši§CLDmŇŁ&¤nEFE0j3ŇžiŤÍ17ZaďRQµ0i‡­<ÓM2LÍv/;H¸ŔÜ?\5z-ÄbX$ŹűĘEyÓ ¬Aę+¦ŃŁ–şŐ0˘Š+ ç ÷? Ý}łĂZ|ŮÉ0Ş“îňŻ ŻZřouçřgĘ'&YĎő®\RĽniMęu”R+€ŘZ(˘Q@Qš”fŠ)(&’ŠJJ)i(4ÓKI@RS4”J3Iš( 4„ŇÓM”´”Ä%HM!¤4¦’€’–’€ŇRŇbE%Pi(4ÚSIL’–’€ (¤ 4QI@!Ą¤¦ J(«7 (˘€ (˘€ (˘€–Š(˘Š(˘Š(˘ŚŃHŠ( Š)h˘ŠZJZ( ’–ŠC 3E —4”´Kš:ŃŠ-QH˘Š(˘Š1@ )i)hQE€)h˘…RĐQŠZ(1E- JZ(4RQE%Ą"“”„SŤ%0Ň}&(”Ú’E0i <ŠiĘa©1M"ČćjB9¦ŚÓHć¤"E0#=)†¤"ÔÄFsšiéRaÄ0ÓHćžFi¤SĂM4â) 01ĽAţ®©¬ZÚńú¸>¦±k¦źÂrUř‚şß‡ň¸˙®ůŠä«­řw˙!©˙ë˙Đ…*ß _=”RJ yÇ -.i)hĄ” -Q@RvĄ AšZJ(hÍ% ŃIK@…Ł4”PćŠJ3@ E&is@ E%ąŁ4”P¨¦Ńšu%&hÍ-fŚĐFhÍą˘’ŠZ)(Í-”PŃIE-™ĄÍRfŚĐćŚŇQ@ EPEPEPEPEPEPE™ QIš3@ Fi( Í”PŃIE.h˘’€Hi(ÍŚŇQ@ šJ( Í.i( bŃIE-™Ł4´´Ú3H&š3M cłM˘ŠRQH4”R);QHh†šiÔÓÖ€ŇŇS¦šzSŤ4šbi„Óššh‡Ą0ÓÍ1©i†ž{Ó 1 nµw§µF{Ó‡Ą5©ĆšiŚ×ŞEäęw Ř9#ńć»ó޸ßEĺ꛱à?Ň·˘ő±Ď]{·2)i(®¤r ^đ˛ëj¤ő "ŹĚć+Ď«©řyuöF„ń4mţҲ®ŻT4‘ë””JóÔ J(٤Í”Ä-%PŇQE%RPE”Hii %QL˘HMŃHh¤&ŠJ3IKILBPh¤&€ CE! ›Ji(¤˘@ IKM¦ ¤4´””QIL’Š ”Q@!˘ĐIKI@M)B’ťEY°Ú)qEŠ( Š( Š( Š( Š1EQEQE ŠJ(h¤˘€ŠJ(ÔRRĐKIE.(˘Š—4QH˘’”P1E-6”RĄ˘Š)i( Ą¦Ół@)i3@ bŃE€))h ˘”Đ(QEh¤ĄĹb’–’€Hii %!´m4Š}4Š`0Ó HE4Š3ÓO4Ň)a¨ŘT¦Ý(3L"¤"›LDL8¦R‘Lj`DzÓOJő¦bM5!Ó@ši§CLF/ŐĂţń¬:Üńú¸>¦°ëŞźÂrUř…®łáßü†§˙®ůŠäë¬řy˙!©˙ëţb•o…/ŤŤJ)ą§^qč KšJ(–š:RĐ!ii´´u‚—4(˘“4´Qš3@ )i˘€Š( ŠJZ(˘Š(¤˘€ŚŇfŠ\ŃIK@Q@ š3IE-”f€ŠJ(h¤˘€ŚŇQ@ š\Óh f’’ŠZ))h˘“4f€—4ÜŃ@ÍÜŇ怊LŃšZ)ąŁ4ę3MÍ.hsFiąĄ Í”™ QMÍ fŚÓsFhŮŁ4”Pć–›FhÔSsFh٢›E.h¤˘‹š3IE&h˘ŚĐ0Ą¤Í´RQš\ŃšJ(i(Í% (¤¤ŇfŠJSŇ“4Bh””´™ 4†–šh'Ši Đi€ÓM4¦šh 0ÓŤ4Đ 0ÓÍ1©€ÓQµ<Ó 1 jő©Z˘nôÄ4ô¦N4ĂLCMs^-‹ĺ¶z•?ĚZéOzĆń,^f’ÍŚ”`ŐĄ7i#:ŞńgEWj8B´t ݱëÖ3çf\źbpťgRŚÔRjęĂ>„¤Şú}×ŰtëkŹůëżć*Ĺy'HRÓsE;4” (´”Q@Ł4Úu%¤ šLŃE†Š((˘“4ŔZm-6€ŃI@M%)¤¦E„Đ!) .i´QE†’–ĐHh¤Í0ŇPMJ †€ m-%0 (¤ ŇRŇPHii((Ą¤¦QEFŠ(«6 1E¤Ĺ-€J)h¦QKI@Š( Š( Š( Š( Š( Š( Š(¤ŇŇ Z(Í´RŇQ@ĹŁ4Q@ KIE cRĐEP0˘Š)RŃI@ )i)s@Ţ’ŠZ(Ą¤QKĹ”QE SŇŠLĐALĐ0 ŃE%!Ą¤4””´”m!Ą4†‘HiäSM0ő¦ő¦`0Ša!ĆëLÍ0Ô†hša©¦T!†šzÓÍ0ő¦¦šyéM#Ĺńú¸>¦°«wÄ_ęŕúźéXUŐKá9*üA]gĂĎů O˙\óÉ×Yđ÷ţC3˙×üĹ*ß _=ś 2”óŽńôRfŚĐ….iŁĄ-0–›K@‡ 3H:Q@…Í”PŃIFiáKM´ąŁ4”Pć—4Ú(٢“4PŇRQ@ E%´Qš3@.i3E.hÍ%ąŁ4”PŃIE-”PŃIš3@ E&hÍ-¤ÍąŁ4”PŃE%:’’ŠZ)( ˘“4f€E74´´RQ@ E%´RQ@ E&h ˘Š(˘’ŠZ))h˘Š(Ą¤˘€ ŃIEŠJ(4R(-¦Ń@ÇfŠm--¤˘€ŇQš3E”†.i3Em-”†Iš¤&ŠJCHii¦¦SI@ 4ÓN4Ă@„=*6§ši¦fzSÍ0š`FzÓ˝Hj6ÄFi¦śi††žőOR‹ÎÓçOT8úŐłŢĂ#Ö‚jçśRÔ—y2ÇýĆ"Ł®ôyÁES`{'îľÓáKCśÁŚţ·Íp˙ .·éw–ÄóˇÇч˙c]ĹyuU¦ŃÓ„ďKIE@ĹŠJ(´f’Š(Ł4”˘MĄ ’Š(¤ ŇfRPIJi( ¤ ŃL˘ŠC@‚ŃI@%-”†–ĐQE%ÓJi)JJZJ)´´”Ŕ %-%!˘Š(˘’Š(˘’€ CKI@ ESŤQVl”´PQEQERRŃ@ E-”QERńE ŠZ((Ą˘€ŠZ((§Q@ ĄĄŁ 3E˘€Š( ˘’–€ \ŇP(ąĄ›J)´´”PŃE Z ( Z@´”´ Z%ęm-%´Ą˙Ě˙őŔ˙1\­u_˙ä3?ýp?ĚR«đ0ĄńŁŃ(¦J yçxę)(  Zm C¨¤ÍŕisMĄ˘â–›š3@˘›š\Ш¦Kš-™Ł4 \ŃIE-™Ł4´ą¤˘€4f›E:Šnihh¤˘€IIš3@ E%´´ÜŃš\ŃšJ(sE%ą˘’ŠZ)( Ą¦Ńšu™Ł4´Rf’€š3MĄ Ł4”PŃMÍ€uÚ3LQMÍ.hh¤˘€4RQ@ E&hÍ ŠLŃLÍ”PŃIFhÔSsKH¤˘Š(¤Í ˘“4f€ŠLŃš\RQš(QHh Ł4”f‹ŚZJ3I@ i3E††Ž”@ IKI@%ĐCAéM¦i´´†€ÓM)¤4Ä4Óśi†€iŤŇžiŤŇ 4ĂO5SŤŇiĆšiŚÓOJyďQž”Äax¦-ÖQÉýÇţuĘ×m­Ĺćé3Žę»ż*âkŞ‹÷N:ËŢ (˘¶2&łŰŢA2ýčäWÍ{Ôr cYî° ?đ öĎ \ýłĂ–2ç$ÄúŽ?Ąrb–‰šÓ5sIFi3\fšZJ3@ E&h ŠJ(sIA4™¦!i(¤ bŃIE¤4Q@ IKILŠ)(f’I@!˘ĐE%´”RPšBiM6„4”¦’€ (¤ šZJ`%RPIJi())i(˘ŠJ`QE”´”JŠZ)›Ť˘—PQEÄQEQEQEQEQEQEQEQE Z( aEPEPKMĄ ˘Š(hĹ–€ 1E”´RĐQE- QE€ZZJ-™Ą aE´QEP(˘ÂŠ( tĄ¤ ¤4fŠ@Ą6”ô¦Ó4ÓN¤4 JJZJbi¦ťMjJi§Ra¦Í<Ó 0zSSé­LÍ1‡óM4ŚŠióL4Ŕe4ŠySM1>%˙WűÇúV oř›ý\ďéXŐKá9*üA]WĂ˙ů O˙\OóĘ×Sŕů O˙\OóUřRřŃčb”R Q^qŢ.hÍP!sE%---6–…´Ą´RRĐEPEP ˘’Š\Ňć’Š\ŃIE-¤Ą Š(¤KIš3L˘“4f€ŠLŇć¤Í´RR〠(˘‹E% BŃIš(h¤Ł4´RQšZ)3Fhh¤Í%-f’€4ą¦Ńš`:Šm--ÜŃšvi3Iš3HÍ.i´PłFią˘€š3M˘Í&i)sH—4™˘€4RQLŁ4ÚZ@.hÍ&hÍ (Í&hii3E-¤Ł4ą¤˘“4ą˘ŇfŽŁ4™¤ RfŠ(Fi(¤h¤'Š3@¤Í””¦›@¤Ą4ÓL4ŇiM4Đ1 %)¦ÓÓM4ăL4†Łjy¦”Ŕa¦žôây¦icTf¤n•SĂŢzSÍ0ÓĐKz2óćR¬Tő膸]N/'R¸NÁÉŹ5ŃAîŽjëfU˘’–şqkŐ>]yŢň‰ć ™ýMy]wź n±-ő±=BČ?•aWpÜô,Đ)3Išó͇QIE-¤Ł4ą¤˘’€ (˘…¤˘’†h˘’€ (˘%’h¤Ł4CE! ’ŠJ(˘’QH¤˘ŠbŇŇPfŚĐi)€RRŇPIJi((˘’€IKI@%-%0 (˘€ J NŠZJŁ`¤§RPQE”RŃ@%PEPEPEPEPE´”´Q@Q@Q@ Š1EQE- (˘….i( ĄÚZZ( PŃFi)´”Rć€KIš(´´”f€–’Š-RPŇQE E (Ł4f€ )( ŇŇPRRšC@i -Ŕm4Ó© 2Ó©¦€i†¤4ĂLi§CLDmÔÓ =©† 4Úq¦š0ÓM<ô¦`ax›ý\ďé\ýt&˙Woţńţ•Ď×]/„ä«ńu_˙ä1?ýq?ĚW-]O€üN'˙®'ůŠU~ľ4z(¦ć—5çĂ©iąĄÍ-€Ňć KMÍ.hę)(ÍŠ3Fh˘Š(hÍ%ą˘’ŠZ))s@-74PŃIFhÔRfŚĐŇQš3@ii3Fhi(Ł4RŇQ@ E&is@isIšJ\ŃIFhÔf›E;4SsFhÔf“4f€ŠnhÍ:’ŚŇf€ŠLŃ@ Fi( Í¤˘€ŚÓihsE% ˘“4PćŚŇQ@ š3IE;4””f€4f’Š\ŃšJ3@ š)(Í-.iąŁ4´´Ú(´ą¦ćŠvh¦ćŚĐłIIE-™˘ Fi3Fhą¤Í&ih˘ŇP1sIIšZ(¤Í 4™¤¤ &šM-4ĐšiĄ¤4ŔJi§f›@ 4ĂO4Ă@ 4ĂŇžj6¦!§­0ÓÍ0ÓŤŇŁ5#t¨Ú†a§šaéLCąEłTߎ$@§ô®¸×;⨾X%ô%MkIÚFU•âs”QEuś‚×Mŕ Żłř˘$'‰‘“ńĆĄs5Cąűąe>pe'éžj&݇íÔRfŠňÎݨÍ4Z3IE¦ŃIERRĐEP ¤˘Š)(¤Í0 (¤Í†ŠC@˘’€š(¤ ¤Ł4f%’%-%ÚZJ) ”Ŕ(˘ŚĐQE%QHh¤Ą¤ 4PMQIE”´PCEU‰EPIKE%%)˘€ŠZJb (˘€ (˘€ (˘€ (˘ÂŠ( Š( AEP0Ą¤Ą Š)h˘’ŠZZm--Q@-%´QE-Q@ IERć’Š@) QERÓihÔRQšQKH˘Š(Ą¤˘…”PŇQI@ šiĄ¤4””´””†–Ó¦›N4Ó@ 4ĂÖ¤4ĆëLC)¦śi¦€j3Ra¦fÓŤ4ÓĂMjqéM4Đ^&˙Uoţńţ•ĎWAâoőV˙ďé\ýuŇřNJżµÔxţC˙×üĹrŐÔřţC˙×üĹ*ż _=ŠJ3^yÜ8RÓAĄÍ8QH( C©i´´ěŃIš(ę)ąŁ4ęLŇfŚĐ…‚ŚĐ¨¤Í ˘“4™ ˘ŚŃš(Ł4f€ )( ˘ŠJ\ŃIE--6ŚĐ¨Í&hÍ;4™¦ć—4´´ÜŇf€IMÍ.hhÍ&i3@˘“4f€ŚŇQšZ)3E.h¤Ł4´f“4PćŚŇRPłFi´PłIšJ)€ěŃMŁ4€vhÍ%%.hÍ”ąĄÍ6ŠvhÍ%ą˘“4f€ŠLŇf€E74f€FiąŁ4ąĄÍ6ŚĐ¨¦ćŠ;4ą¦RĐćŚŇQ@hÍ%´RQšCŠLŃ@ šLóE%˘ŠBhh¤Í¤˘’€ Ňu˘ĐRR曚b iĄ4Ó@i¤Ó©­@ 4ÂićzS†šiÍL4ŔaéLjy¦7Zbi‡Ą8ÓJbÖGâó4§nń°oéýkZŞęyÖ÷d5Qvh™«Ł„˘Š+¸áR«`è9”Pąi×ëM¶ś‰"VüĹY¬Üý§Â¶™?4{Ł?8ý1[ůŻ*JŇhč[-&h©QEŔZJ( Š( Š) 4™¤˘€ (¤&’Š) S %-%%Q@%”QE!4RRć’h ŇPi(˘€ J( AIKILŇŇR¤˘Š`%Q@ EPEPJ)i*Ž€4”´PQERb–ŠJ1KI@ E-% (˘€ (˘…Q@QLAERQEQE-QEQE˘’–€ (˘€Š( ˘Š(ÍQ@ F( P-PIKIHbŇÓihh¤Ą 4ą¤˘Ĺ˘ŠBhh¤&Š(Ł4” ))i(ͤ˘€ i§i¦RRx¤ ¦ž”ą¤í@ ¤4¤ÓI¦!¤qM"”ô¦ši¨Ú¤4ĆéLÍ!§a¦!†ÓŤ4ÓÄ˙ęŕ˙x˙Jçëˇń?ú«÷Źô®zşé|'%_+¨đü…ç˙®'ůŠĺë¨đü…ç˙®'ůŠU~ţ4z”WžwSE:€QH( C©i´´ę)¦!h¤˘€ŠJ(A§S)s@˘›Fh´´ÜŃ@˘›Fh٢›š(ÔShÍ:Šnh QIš3@Ţ“4f€ŠJ(´RQ@ E%%:Šm Qšmę)ą˘€–›FhhÍ%ę)ąŁ4ąĄÍ6ŠuÜŃ@ š)(Í:Šnis@ IEQE&hh¤ÍąŁ4”Pć–›š3@˘“4”ęLŇQ@¤Í%ę)´P“Fi)(ěŃšm.iąĄÍ6Š\ŃFh ŠCE’’–€4f’Š š) !‹šLŃI@ IERfHh¤4RS4ÚRi3Ĺ!¤&”Óh ¤4¦šh¦iĆši€Ć¦y¦biŤOjcS†Ł4óM4Ä0ÓdzyÓzb8ü«™c=UČýj:ż®EĺjóqĂa‡â?ƨ Lá’ł° ZJZlGŁ|5ąß§]Ű“Ěrę?úŐÚWš|7ąňő©ŕ'‰aĎâ˙^—^uuiłx|!Fh¤¬JE 4´QIE0’ŠJ\ŇQFhQIE JZJ3IA˘¤˘@ A˘ĐšLĐi(˘Š(( ŇS¤˘Š)(˘ E)¦ĐE˘€Š( ’ILŚŃA”QE%´””RŃ@hĄ¤Ş:’”ŇPQKI@Q@&)h Ą˘€QEQE”Q@RĐQKEQEQEQK@ EPEPŃE´QEŠ( Š( Ą”f€E&h íIKÚ’ EP0˘Š( …-%´RQ@ŔŃA4R˘Š(¤Ą¤4RRŇP1) -!ëL¦šZC@„4ÚSIÚM4Ňši =)†”šJ`4ÓĄ<ÓĄi¦śE0Ó¦šiĆšiâŹőV˙ďé\őt>'˙Uoţńţ•ĎWU/„ä«ńu˙Ľ˙őÄ˙1\˝tţ˙Ľ˙őÄ˙1E_…?ŤE%督…-6–€4´”´RI@¦!٢’Š\ŃIE.hÍ%´´Ú3@ š\Óh fŚÓhÍ;4f›Eš3MŁ4ěŃšměŃšm-.isM¤ fŚŇfŠvi3M˘€š]ÔĚŃ@ͦćŠvhÍ6ŚĐłFi´f€š3MÍěŃšnhÍ.hÍ%ěŇf“4PłIšJ3@ͦŃ@Í&h˘€ Ňć’Š\ŃšLŃ@ E% Z)(ÍŠLŃšZ)3E4ą¦ŇĐ!sFi)3@ͦćŚĐłFiąŁ4ěŇf“4f‹E&hÍ:ŠLŃ@ E%¦’Š(ͦŇćŢ’ŚĐŃHM aE&M€ŚÓh¤“IE&i€JSM͆ŚŇ@i -!¦M4ÓŤ%0ÓM<ő¦š`FÔĂRŚ÷ CiíL4ŔŚÓM<÷¦bzÓzy¦ôÄrţ(‹mÔ2cď.áXuÔxž=Ö1Č(řü®^şé;Ä㪭!h¤Ą­6Ľ#sö_Ů>pöÄcú×°W…ZĚmîáuŤĂ~F˝Ę7F®:0¸±+TÍiě>ŠJ+ĐZZnis@¤ÍPEf”R“4Q@‚ŠJ)€JZC@!˘’€ LĐh ˘Š(¤Ł4P(¤4Ŕ))i(¤Ą¤ AIKIš(¤ÍŔ(˘Š@!˘ŠJ`”´”QEQE”RŇPjJZJŁ CE-%”´”QEQEQEQŠ)(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘’–€ (Ą Ą¤ĄQE´”Q@ E”´Q@ ˘’–€EPž”‚–’€ŠJ)ęJ( aKIFhh¤˘˘ŠZLŃšJ(i(Ł4QIE Ň)() P!§­4ô§m0Ó 8ÓM0i )¤4ÓL4ăÖšzSĂM4¦›š`!¦q4Ňh Ä˙ę­˙Ţ?ŇąÚč|OţŞßýăý+ž®ş_ ÉWâşo˙Č^úâ®`WOŕOů Í˙\OóŞü )üHďč¦ć”ŕ;G \Óih٢›Kšu›š\Đ!ů¤¤ÍZ(˘…fŠ(˘Š(˘ŚĐEPFi( BćŠJ(hÍ%´RQš-¤˘ E%ą˘’ŠZ3IE-”PŃIFhsE% Z)( AEPŃIE´”PŃIE.isM˘€Fi)(ěŃIš(hÍ%ąŁ4”PćŠJ(i3EfŚŇQ@ Fi( CłE74´ Z)( Ł4”PćŚŇRPłE6—4ąĄÍ6ŚĐłFią˘€š3MŁ4´RfŚŇhÍ% ZJ( 4f’@ šLŇQ@ĹÍ!˘’€ )(ÍÚSM¦HiM64ŇiM6{ÓM8ž´Ębi†ži†€Ý*3O=)†“ÖM<÷¦bŠa§Ó 1úĚ^n•:÷wĺÍqußĎ› ˇţ%"¸XÔWMŁG5eŞbRŇQ[‹^ÍởµřrÂ\äů*§ę8?ĘĽf˝?áőĎťáăra”Żŕy®lJ÷n]7©ÔŃšLŃ\FÂćŚŃI@¤˘Š(˘Š`f’ŠŠ( AE&hÍ-!˘’€ŇRšJ3IEQFi(4”)€RRŇPM§RJ)( AE%Ŕ(˘Š@”´† EP0¤Ą¤ Š( Š( ˘–’h˘ŠfáIKI@%-”QEQEQI@ F)(ÍQEQEQE0 (˘Q@Q@-%´”Q@-%QE-QEQE0ŠJ)´QE-(¤Ł4¦’ERŃ@Š( ˘ŠZVQE%h¤Í-%Q@%-%”( ¤Í)¤ bfŃM4Ä­! ŇCM4¤ÓI šCJi¤Ó¦ićia¦šsSi€ĂM4ăM4…âőV˙ďé\őt'˙Uoţńţ•ĎW]/„ä«ń ]7?ä/7ýq?ĚW1]??ä/7ýq?ĚQWŕb§ń#ľ˘’ŠóÎá–š)hÔRQ@˘’Š(4´ŃKLBć—4Ú(Ôf›š3@ͦŇŃ`ŚŇRQ`Fi( Í”PŃIš(h¤Ł4X˘’ŠZ)´´´RfŠZ3M˘€IšJ(sFi( Í¤˘€ŚŇQ@ š3IE.hÍ%ąŁ4”PŃIš(sFi( Ł4™Ł4ą˘’ŚĐŃšLŃ@¤Í&h ĄÍ74f€E&i(°˘›E:Šm QMÍę3M˘€š3IEsIš( Í”PŃIš(h¤ ĐŃšm-!ޤ4”Q`4f’Š,ćŚŇQ@ĹÍ”f‹(Îi)´SM \Ňf’Š(Í”Ŕ3IKM Ň !4ť©¦—4†i¦–šx CO4Ăšy¦`4ÓZq¦ž´ŚŽ´ĂRőéTi¦śx¦žôa®#S‹ÉÔ®¶ňGăÍví\ź˘Ů©nţú[QzÖZ\ʢŠ+¤ć»ź†·8–úŘžŞ˛ôŕ˙1\-tžąň×§[\ĎHŐŹÔŠ±^[:B–’–€RŇQ@ š))h))M%0 (4”QHh BŇQI@ IE%0IKI@Š( ’I@Q@„¤Ą¤ ’–’%PQKI@Q@ŃI@Q@i3EQEQEV’–’™ŇQI@ E%Z)3Fh¤4दE”ą˘’Š-”PŃIE-”PEPEf€ (ÍQEQE Š( Š(ÍQš(˘ŚŃšZ)3E--74PłE%´ą¦ŇĐ1sE&hÍ ŚŇf’€š(˘…-%ą˘IHaE&hÍ0 J3Iž(4”´™¦M4šZm¤&M B曚 ¦“@Ĺ4ÓA4Ňi 0Ň“M&€ÓJq4Âx¦!)‡­8ši¦M! ÓMařźýUżűÇúW=]‰˙Ő[˙ĽĄsŐŐOá8ęüB×MŕOů Í˙\OóĚćş_˙Č^oú⢯Ŕ—Ǝú”Sh®Ľx˘Q@‡QMŁ4ę)´ą CłFiąĄ¦©)( ˘“4f€ŠLŃšZ)3E-”PŇfŚŃ@ IFi3@ Fi3Fhh¤Í Ł4™¤ÍŚŇfŚĐćŠLŇf€š3MÍę3MÍę3Iš3@ E&hÍ-™Ł4´f“4f€4RfŚĐćŠLŃš\Ň曑FhŮŁ4ÜŠ3@ͦîŁu;4f›š\ĐćŠLŃš--74f€šLŇfŚĐłE74ą ˘“4f€4f›š3@ͦćŚĐłIšLŃš\ŃšLŇ〠3FhÍ.h¦ćŚĐ¨¤Í&h٢›š3@Í.i™Ą Qšm€vhÍ6Š.hÍ%áHM&h4 (˘“4´”f“4´™˘’€y¤íE!4R)3LÓisHMÓM)¦“@ 4ÓJÔÚ`!¦y¦a¦N4ĂLCI¦šq¦bŐ[řĽëÓąCŠ´i§éM «śűü›‰#ţëL®Ó€ZJZJőźÜýŁĂŮ91ĺŕkz¸ż†÷;ôűËryŽ@ăčG˙c]ťyŐ¦ŃŃP´RfŠĚˇÔSiiZJ( ¤˘ŠJ(¤ ŠJ(˘’Š`Š)(˘–’€E”RQšLĐŇQI@…Í&i( &ŚŃA¦QEQE”RŃ@ E¤ ¤˘Š)(˘€ (Ą aE%  ÔQIš˘Š3@„˘–’ E-”RQ@ E%QE(˘Š(˘“4´RQLŁ4”Pš3EąŁ4”Pš\ŇQ@ šLŃE´”Pć’Š(hÍ%ąŁ4”Pć’Š(i3E´RfŠ@-”PŠ\ŇRP1sKMĄÍ-™˘€šLŇQ@Ţ“4PŇQšC@ŇR3Hh¤&%†¦Đi  M)¦š`šh&šBi ˘ši€„óL&”ÓI¦! ¤ šBh âM" ů™WęjśÚĄ”_~ć<ú“úSI˛[HÎń7ú»÷Źô®~µu­JŢůb[v-°’I¬ś×U5hśµrĐZéĽ ˙!yżë‰ţbąŠéĽ ˙!yżë‰ţb•_…/ŤîhÍ%ŔwŽÍ.iąŁ4u™Ł4´´™Ł4´RfŚĐ!sFi3E;4f›š3Lͤ̀\ŃšJ(ŮŁ4ÜŃš\ŃšLŃš\ŃšnhÍ8šLŇfŚÓsFi3FhsE74f€E6ŚĐćŚŇfŚĐŃšLŃšZ)3FhÔ™¤Í Í¦ć—4ąŁ4ÜŇć€4ą¦ć“4ę)3Išvh¤Í&hěŇ晚3@Çf–›š3@˘›š3@˘›E:ŚÓhÍ:–›š3HfŚŠnh fŚÓhÍ0š3IE 4RfŚĐŃIšLШ¦ćŚĐ¨¦ć—4ą˘’ŠZ3IE.h¤˘ Fi))ěŃšJZ.hÍ%ą˘’ŚĐŃIš3@ FiąŁ4 vi)3Išu&i3EŇE!¦ć›E&h&ŚŇLĐ!i¦‚i  šaĄ&šh4ÂiM4Ó 4Ňši4Ä4÷¦N4Ă@ 'ši§a¦! 4žiI¦ž´ÄrÜ~V©/ŁaŞ…lřš<\Ă ţ%#ň?ýzĆ®¸;ĹsV“ŠJZ˘N·áÝĎ—­Mx–#Ǹ?ţşôŠň \ý—ĶMś}‡ńâ˝z¸± Ó5§°RŇQX KM˘ KII@ IERRŇ)3E%0ŠJ(Ł4RPEP ˘“4)(¤ Š)(˘’Š) Pš3IE’ŠJ\ŃšJ(˘Š)€RRŇRRĐE¤ Š(  ô”QLę J( Š( Ą˘Š6Š( Š( Š( Š( ’Š)€QE€)(˘ EUQEQHŠ( Š( Š( Š( Š( Š( Š( Ą˘Š(˘ŠQEE˝©(˘‹IEw˘Š(¤ďE ŃE0 mP!)(˘i¦Š)ÚiéEŔi¤4QLn”ĂEi¦”QLšćő»™Ł”ŞM"Ź@ÄQE\w"{ě’;±ŢěßSša˘Šę[lzw§ŃE1 ]/żä/7ýq?ĚQEgWáf”ľ4w” (®¸ZZ(¤QEŔZZ(¤ES)h˘€ J(¤KEQERQEQE”Q@…˘Š(˘Š((˘Š(˘Š=(˘Š`%-PER(˘Š`-%PEPEPŃERQE ( ˘Š(˘Š)˘Š( ˘Š(h˘Š(˘ŠZNôQ@ĹQE”Q@j(˘€ (˘€QE´QE‡ĄPQE´QE--PQE‡­-PIEQE CKE†Š(¦RQE7˝¨˘i(˘€ŇQE%4ŃE0i¦Š(¦h˘†i˘Ša¦úŃE1 4ÓEÄaxźýDďçh˘ş©ü'%_‰…(˘ŠĐ̵¦’5;BśźúŻk˘ŠăÄîŤiě-Q\ơ@˘Š”Q@ IERQE”QLŠ( ’Š((˘Š†Š((˘Š %PJ( Š( µ%PQEŔ(4Q@Š( BRQEQEQE2bD.AÁךë—÷fáÔÝNTžaĹV´·¶?˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/A/images/preview.png000066400000000000000000000127011361462701300246660ustar00rootroot00000000000000‰PNG  IHDRddG9(ED#C !C."G0%C4)C<,I1%L5*I9*S$&U$)["&[$+Q4$P6+U8%R9*Y:&[;)T=0l).n(0b=+a?0t(/s(1H@.LD1]@.RJ5WN9]A1XM6ZN:[Q6]S;_Xta=h]@tYBmbAviD}pI†,6‡-8Š*6Ť+8Š06‹08”,;š.=›0>˘2>¨3>¶:>ž0@Ł2BŞ3C®8B˛6Dł5Hµ8D¸8DM2O8„P6T:…Y=ŠQ6ŠT:‹Z<‘V:’[=™^?śc>Š\A“]@_C„jE†vK‰|Q”aD‘eI›cD›eHťiJ”yL›}QˇeE˘fH¤iFŁlK¨kFŞmJ¦pM¬qM«tR˛tMµyN˛uQłyU´|Y¸wS»{Sş}YÁVŔXŽ€S—Xž^šŚaž`§Vˇ‘^°Ź[˝€T˝[¶”]¦Źg§d¸›cŻ i·Ąl˝Şp‚VĂ„[Ĺ\É…\ËŠ\Ď]ĐŤ]Ń‘^É‹bĹ™cŇŚaÔ“cÔ•i×cŐlÚ•cÚ–jŰšeŰ›kÝśpČĄfÍŻ|Ň«lݡkŐ®pرnÚ¶vŕ™făśjážră˘mé˘ní©oäŁrć¦yĺ©rëĄré¦xëŞtí¬yä¶uŕ¶xăąuă»{ë°wíłzé˝zň«tó­yř­wř®xô°wô˛|ň¸}ůł|ü¸ěÁ~đĂ~×˝őł€ôĽ‚ůµü»„üľÜÂ…çȇěŃŽíÔ‘đĹńĘ…đΉţŔ…ýÄŚţČŽýČ‘ňŇŚňÔ’ć1(tRNS˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙S÷% pHYsĂĂÇo¨dtEXtSoftwarePaint.NET v3.5.100ôrˇIDAThCŤ™ tÔĺ™Ć'$›3cu ÝęnË)h]m•*»[š•](´¸¬],%´ŇB‚!7ܢ`l€c€%†ąV‚ŚÍ‚QąŚ! B˘ A“ÉeB$śłĎóľß.\Â>˙™frŽßŹç}Ţ÷›o˘íÝť»ÚąóÝŠŠŰßZ˙z^îŠ?§-˙ü:ŽřŮłgÇ'Î QBB¬YqĐ,hf¸f„éY‘M{öěŢBy}UŢŠ¬¬—^|ţWvÇ7I¤,„ţá@aÉ0 ņő÷C{(bŢU+p˛(mţó#ö€ †"jV‚ĺgf8fF8Ć&jŢ €˛~ժז˙9mţźp8N2ôn$Žâ,37·cŰż˙°H9{wﮨ¨€•UąËłŇćż8Ôn˙]bb˛EQĚś0G ‘ć‚™1óŮĹV­ Şš Ý; y}U´—^ĽÝᕚ<;99Y”Ú ˘Ł„9„jg@*@jEőµ‡×ŇÍŢťeĹň—_ú‡Ý‘”Š5“StmŁ9avšĺÇPŤ¸±®­Ż;R¸ľ®¬`v˘`ŰׯĎ{ ÉÇ©©©0Ą¤¤„:RPŹ‚®é[=UÇ}(éKôąË_N{Ňî¸?5Y)@“n(<¦Cά¸™3ń°4C!PŁRjP0Ö Y/ʱ?ü\r˛±Bˇlô‘@d7q3ă‚flŤMŤMőM¤4‚RSó!(ďU”ż…IÉJępüĺJMž+qb–‘@†S ’śh<ŃŘř).b>’‚!úíŰʢEÎřÔąsç¦ňä @`´Ń`Ĺ`lM§›Nźţôt=PLú‹ˇĽär8t}ÚÁ Ú™+€VáĐŘÂar´`@I8¶ÓFđ}ôQ RŮýž@^ťç°ß1wîs‚RĚ‹dŁÁR ¤ŔM‚`âĐĎ0M¤Ô2•]ęd’ËéřÖ}˙..É,źšš’š’B.mÚII i„'.Ű9.ůÔ / Łßţ—Uą9˙âr¸ěv ¤ă÷=ň{I‡JaFX_nü‰iĺĽĚ‘ýĺňů|çÎťóB§›ĽŤÍ(XmŤÔ 3˙C— ˇŘ!ÇwďdFQX¦ëĐII!cŞ n7„ÄĹŮÎťóťi?sÎ{†śćć±ÂţZżęµ{Ŕpry»}Ă>H_9ľwß#3ăĄX5Ą`~,3XźĎřx`”G'T»WÜ4ÓJ͇{wV”Ż_ť{Ź ˇ°^Ô Ç Č­ďŕęßžť“D3fTS±Ça·ćţčłk ¨Ř9ďŮłg›?ƬÔě{$ §+ZV 0Üäe4Q3ŕJ1Ď%a3M7J‰ŹŹ0zQ+žőzĐŠĂn*"O˛âAý!>űORŇěÄ$~XÂś8Ą„AÎťőžmü^X/q9Ń`×cB¤őłßöÝű˙őŮxĹ4›9ńq¤Ř|—/vú|]>_çąó­­´HÍŢ˝ď•˙eÝřo‰—3ş_Ě »cUÓŰľTBO8łă犭·«Ë×…[§Żłłknn–čučłţk쿍`úµb$}!čęŹq‰đ?ńń6_)´âóutt¶¶|Ć>†•wŢYż:/'ká‚y“ÇŤ~§ËTĄ h ôĹ RŔY„ôv}ŐŰKŚtvvx[-+»Ţ)çÖ˛(mŢ”Iă~>bÄĂoŹŚBétµ[Š-8pPDÄŔŰţéźm˝>Aŕ‰X@iý”@vď*_żVŇ`eŇ“#Güč;l¶!GŹv÷·Ó·Yďz ®hz`óő2‘^<K; ¨×Ǩ­l_§'Ły“Ć?9ňˇÝiłÝőKj˘˘śöw?${ Q Ůz{{Q/‚´b­­ h°Ľ\I…{Ř_>#€&Nóč°»áč­E™˘ Ě6ţě3î`ěâwŢ@*˙›µpţź&Ź7ňˇ;#mwÇZzć™i5úŃaßâĽ#AP'¤­ŕĽšłVžź<îÉ‘C#"‚ŘŘiÓ¦=3 ľšřłQ@ŃФ˘Ă @$…°Á=SÁ6 +Z°ˇ‘†-™ž1}±B¦ë°‚őő“üN ±ĽbBśôvuJ¨•u8ĺe¦ dř€Ă222¦OĎČX2ťR DSĚŠ  €bW±c»dÓyĎ›aź]•’Ę cexTİ%PĆ D×’LL&L=ćqtPŕ„9AňĆ ëĹ˝ř= ä:…ü7 vű˝ĘĺR:!ŃPŁGŹFTwąm˝–&ĎŁPÄ ëefeň¤Ł˘~R°1¨W@ĹZ,ĺLĐ‚F‡9Ńč9ő-bĄz—î-ą‹2iĺA»ýŃŐF˝”$*hÉÄĎŃČ$ÄŠP::J !5=,ý…)“C )IM)(ÁH;#[ď׸,]fôÖĆÜM+«se3ž2Âýčłx„łqIĆĆŽ!AS§Â )Çx±˘‡Bňr^Í\HtÔ¨âBUÁ&\aROGVçÁ‘ík”€z1Fo ä‚ół;GFaaqń¦ÂM›B@ ‡•`„c»˘”€î.LĄąĄ Vm¦>'+3}ŢcNű(,®ÚřYŠP€cüŘ®(%P2•ÎŽĎ?CôÜ[vU"ú|@Ľ'OĄ-ÁQ!-Á”Äö„ :ˇ•.X9ŰJMÍ>XáÔ3úźşśO”pią…i3®°âI@Ć Ö ŐŇč±·ŔŠô×~Řg.ë$¤¬¤´¤´´¬¸Ě¬oIŁ é‡@>K D1F,NGR/•7’>Öĺ|Ľ¬„ řŔĎkLnBD"ů%ÁHŠ8E§žV60úĚ…cť®1eeĄ%ŰJ˨’˛R‘YźB[Ŕ’U76A(AHčv,]ĚP´żdT˛2Ç!Y>TĄĽnŕçM 7!Š@X/Ěă>ě’ÖäĺdgŽ'á"ُ´8$ŁB)şa4ˇE§ţsZ©„VňWćdŽw»Ż€Á›T-´°'JÁŤ ťÖÖŇŇÔp¬¦z_%¬pk!d[Yٶ˛Ęňfžb%Ď_‹ µf lW @Ą)fĹô—UŻ_8ÝĘdńm`á~w@ b»ˇ×L:˛lV#âÄőZŰľ:‘čů ˛˛üŤ5y+qN•Ő?E8ň®l[i)ŽÉ„¶ZÁ–77›řĺÂÚfT8ó°˘ô—î÷+ł'ąáä]زAÁ’m#Çj4ě›®‡(F(Ęy•F@öÁ Cd ˙ńŰč„fŚS\Lڍ°x3÷ŚŮęU˝Ü*růňe:i=‹/wµŐ Ąhu~öSn÷㺆Š® ŢńßÎ1¤8đ:ډ E8µxĎbčkQŻĘŠ"4ńÓîśń…HnrçýÄrÖ·GóPgŽu‘|Fňµ` E Ëĺő66ÖŐňĎlĺkVŻ„•ÓÍĺŇ_đ÷Qň> 1zЎ™|€(…V.óhÔŇÂPö#”·VçMqÇ@ř/eIYT—Ǣ6ŠĹ„ś…ýkÓ…‚±^-pR#5ůSÜ.~!q»ń˝+Y˙j©đ « I×áăWW%v«^:ő˛ßRý>ŹF‘/=î(1c¤0•,Ź„"ď"€`$Ó +8Kz˝MŤ €°‰×Lav¤oGŃb¬(ĽĹ9ŁbŘňŠ÷Hgdd¤BTcĽČ¨p˙bôěŻň5/€Ś8±Çrŕ?śíÉúŇhř_‰2ăŘŰÉ.6ýUS˝‡Ł’îv»\1ĸQ¶(w ‰%8]r—¶?N{´Ľ”K2!FëŐ%ÉŁÁŘ_ ě®ÜQ”Îż‚đëĽůę†/¦Ľńé˛;ř· ţ ŽqF;ŁíŃ“·č`ą˝„bFĄz_UEůÚüśěWăT9~ŕý´H:2ůq@ŇsŚ Î- R-Ý]¤ÁÚ‘J=ö–żÁ vüµËÉż©“uBĆ-Ë%őÂÍŻVÚŰ‘JÝńöÂčq»=WNP,J(ĆJ˙ŔL`ó™]RBa寽×=ÄýWC€,DŹżű˙W.ˇőŇŃĹrµ7'ýµý•˙ď¨×’@µzŚ• zb¬ôW.N‰ ¤PřTY®–¦ă(ű«ˇüÉŹ1‹ş{„J[·řĺq­Đri{ˇ`€´ź6őŇP^“oF ¶—b¨¶¶˙ĹĆxtő< 9IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/A/styles.less000066400000000000000000000032211361462701300234420ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #48525C; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #fff; @loading-text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); // LOGIN @login-color: #eee; @login-background-color: #141213; @login-rgba-background-color: rgba(0,0,0,0.8); @login-box-shadow: none; @login-border: none; @login-border-radius: 7px; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #48525C; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #fff; @folders-disabled-color: #aaa; @folders-selected-color: #fff; @folders-selected-background-color: #2b333d; @folders-selected-rgba-background-color: rgba(0,0,0,0.5); @folders-focused-color: #fff; @folders-focused-background-color: #2b333d; @folders-focused-rgba-background-color: rgba(0,0,0,0.7); @folders-hover-color: #fff; @folders-hover-background-color: #2b333d; @folders-hover-rgba-background-color: rgba(0,0,0,0.5); @folders-drop-color: #fff; @folders-drop-background-color: #2b333d; @folders-drop-rgba-background-color: rgba(0,0,0,0.5); // SETTINGS @settings-menu-color: #fff; @settings-menu-disabled-color: #aaa; @settings-menu-selected-color: #fff; @settings-menu-selected-background-color: #2b333d; @settings-menu-selected-rgba-background-color: rgba(0,0,0,0.5); @settings-menu-hover-color: #fff; @settings-menu-hover-background-color: #2b333d; @settings-menu-hover-rgba-background-color: rgba(0,0,0,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Blurred/000077500000000000000000000000001361462701300224505ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Blurred/images/000077500000000000000000000000001361462701300237155ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Blurred/images/background.jpg000066400000000000000000001345331361462701300265470ustar00rootroot00000000000000˙Ř˙áExifII*˙ěDuckyP˙áhttp://ns.adobe.com/xap/1.0/ ˙â XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptđbkptrXYZgXYZ,bXYZ@dmndTpdmddÄvuedL†viewÔ$lumiřmeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQĚXYZ XYZ o˘8őXYZ b™·…ÚXYZ $ „¶ĎdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤ţ_.ĎíĚ \žXYZ L VPWçmeasŹsig CRT curv #(-27;@EJOTY^chmrw|†‹•šź¤©®˛·ĽÁĆËĐŐŰŕĺëđöű %+28>ELRY`gnu|‹’šˇ©±ąÁÉŃŮáéňú &/8AKT]gqz„Ž˘¬¶ÁËŐŕëő !-8COZfr~Š–˘®şÇÓŕěů -;HUcq~Śš¨¶ÄÓáđţ +:IXgw†–¦µĹŐĺö'7HYj{ŚťŻŔŃăő+=Oat†™¬żŇĺř 2FZn‚–ŞľŇçű  % : O d y Ź ¤ ş Ď ĺ ű  ' = T j ® Ĺ Ü ó " 9 Q i € ° Č á ů  * C \ u Ž § Ŕ Ů ó & @ Z t Ž © Ă Ţ ř.Id›¶Ňî %A^z–łĎě &Ca~›ą×ő1OmŚŞÉč&Ed„ŁĂă#Cc¤Ĺĺ'Ij‹­Îđ4Vx›˝ŕ&IlʞÖúAe‰®Ň÷@eŠŻŐú Ek‘·Ý*QwžĹě;cОÚ*R{ŁĚőGp™Ăě@j”ľé>i”żę  A l Ä đ!!H!u!ˇ!Î!ű"'"U"‚"Ż"Ý# #8#f#”#Â#đ$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&č''I'z'«'Ü( (?(q(˘(Ô))8)k)ť)Đ**5*h*›*Ď++6+i+ť+Ń,,9,n,˘,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/ţ050l0¤0Ű11J1‚1ş1ň2*2c2›2Ô3 3F33¸3ń4+4e4ž4Ř55M5‡5Â5ý676r6®6é7$7`7ś7×88P8Ś8Č99B99Ľ9ů:6:t:˛:ď;-;k;Ş;č<' >`> >ŕ?!?a?˘?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CŔDDGDŠDÎEEUEšEŢF"FgF«FđG5G{GŔHHKH‘H×IIcI©IđJ7J}JÄK KSKšKâL*LrLşMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QćR1R|RÇSS_SŞSöTBTŹTŰU(UuUÂVV\V©V÷WDW’WŕX/X}XËYYiY¸ZZVZ¦Ző[E[•[ĺ\5\†\Ö]']x]É^^l^˝__a_ł``W`Ş`üaOa˘aőbIbśbđcCc—cëd@d”dée=e’eçf=f’fčg=g“géh?h–hěiCišińjHjźj÷kOk§k˙lWlŻmm`mąnnknÄooxoŃp+p†pŕq:q•qđrKr¦ss]s¸ttptĚu(u…uáv>v›vřwVwłxxnxĚy*y‰yçzFzĄ{{c{Â|!||á}A}ˇ~~b~Â#„ĺ€G€¨ kÍ‚0‚’‚ôWş„„€„ă…G…«††r†×‡;‡źiΉ3‰™‰ţŠdŠĘ‹0‹–‹üŚcŚĘŤ1ŤŤ˙ŽfŽÎŹ6ŹžnÖ‘?‘¨’’z’ă“M“¶” ”Š”ô•_•É–4–ź— —u—ŕL¸™$™™üšhšŐ›B›Żśś‰ś÷ťdťŇž@ž®źź‹źú i ŘˇGˇ¶˘&˘–ŁŁvŁć¤V¤ÇĄ8Ą©¦¦‹¦ý§n§ŕ¨R¨Ä©7©©ŞŞŹ««u«é¬\¬Đ­D­¸®-®ˇŻŻ‹°°u°ę±`±Ö˛K˛Âł8ł®´%´śµµŠ¶¶y¶đ·h·ŕ¸Y¸ŃąJąÂş;şµ».»§Ľ!Ľ›˝˝Źľ ľ„ľ˙żzżőŔpŔěÁgÁăÂ_ÂŰĂXĂÔÄQÄÎĹKĹČĆFĆĂÇAÇżČ=ČĽÉ:ÉąĘ8Ę·Ë6˶Ě5̵Í5͵Î6ζĎ7ϸĐ9ĐşŃ<ŃľŇ?ŇÁÓDÓĆÔIÔËŐNŐŃÖUÖŘ×\×ŕŘdŘčŮlŮńÚvÚűŰ€ÜÜŠÝÝ–Ţޢß)߯ŕ6ŕ˝áDáĚâSâŰăcăëäsäüĺ„ć ć–çç©č2čĽéFéĐę[ęĺëpëűě†ííśî(î´ď@ďĚđXđĺńrń˙ňŚóó§ô4ôÂőPőŢömöű÷Šřř¨ů8ůÇúWúçűwüüý)ýşţKţÜ˙m˙˙˙î&AdobedŔ JŕKuąY˙Ű„      ˙€˙ÄŁ0` @Pp °ŔĐĐĐ 01a@!qAP`pQ‘€ °ˇ±áń˙Ú üCő;šĘkQmµiÔkQ&Śę-«0¬š´Ő«Q#Xuj5¤‹Z&šÓ 4hÉFŚ4dÎ-:…TC•rç!5śç!L†jĐ Đ! B (ĐŚBjÔ V-@€‰Ą@…jŃ‘™‘™´26‚‡QCYµfŐ«Vˇ!…j_·1’†łjŐ›Q¬ZLę#¨©­Z3jÉ«V­F‰jŐ‡Q’&XÓZcL-h‘“F 5i4DΡ",+Šä9CçFs“&Ť´ hPĄ€Â-hZ €Zµj«¬BA(Š(­ZŠddm Í ˇLŵŐ«V ÚE Í?¸ŃcEłjÔ[V­ZIi4dÖŁYµfŃ«VŁZ±iÔKI–´ĆśÓi"i¨Ń†¦’M&Mi)PBąW*ĺl‡!ä9É“F@„ R´ P…aK…,Đ PŤZµbÓVB€­ Vc Ĺ›C#h,S1¬ÚµŐ¨VÂłKĂî2`®bÚŚj-«V“XMi5¤¶­YµÔkVśZµ4E­1§4ĆśÓ‹K ¦ŁML -M$LęaQa\«•r®UČ@ĺ\ç!4 …ˇJ–-Z°BĐ#µj!«Vˇ: (‘Z5(ĚČČÚŠ-¨¶¬ÚµjŐ›PśÂŁŕ÷–4[)‚Ú‹jŐ«QťFtš5¨Ö˘Úµi5«Q-X´‘icNiÍ9§4ćžXššŚ=4µ0š3¨HĄE…DE˛®QĘąW*ä r„  –„*-, PZPBŚըƭBq H¬AŚ,Q´3,P¶¬ÚµjĚkV¬Â˛ęçůţóYK4[VcYµj5¤Ń˘:Šę5«IŁZŤjĂ«’,,j†śŐ PÓ‹Ë‹SCSSS“Q“:… ZVXDW)ĺ\¦˛®UĘąTD*)`˛ÂÂÂÂŇÂŇ€ˇdÔkAŁY jŐ¨ˇ: ŐÁfBĹŠf-«VmZµŐ›Va9ąľwżIbş™ŤfĚSQ­FłÔGIŁZK3«Q-Dub2EŤ8ąŞ©ŞeĄ§'¦†&¦‡¦ŁL:´ę´¬´°ŽQĘ9G(ĺu•Er° …ˇ K B5ըƢ†Ťh-«VŤ:…Ô+VcE ,PŃLÚujŐ«6­E´ćŃ«Źç}YKfÔ[1cµj+¨‘“Fu3¨ÉŁXŚęʼn4ć¨j†ŞjQ ˝95454555ÄdPˇ"–’&“r‰7)¬Ł•E˛¨`@………„„D…„………¬A5jĐhˇ­ŚČkV­Z…i ¶˘Ĺ5- ¶¬ÚujŐ§6ŁYµdŐĂó~‰’Ĺu3,[!¬ŮŚŇkIŁ:MjŇh‰¬Z°’"EÍ9Ş sŞš¨Đi4&§†¦†MF ŐHˇ+K H“DIąž„rŽQ,,XXDK) e!!ah !Y - ±E ĚkV¬ÚµjŐ«&˘Ů dÔ[V­"µŐ«QmYµdŕůźHÖSE™µfÍŃLÚŤ4gQ“&Hš2h–-$°‘a|éƆŞjŁQ¨Đžžžš 0hÖŁ@´ę´´•4š"MĘ""˘Â Ą…E…˛‘;(‰fp–V´Ń«QCF ,`±‚ĆŚfÓ¨ÖałjŃ›VMZłiŐ«N­EµÍ«Vo;ć}%ڞe,`±b™‹h-¨ÉŁ:Ś‘i5Ą„Ö#8ál¬..jąhjĂA­P©OM Ć 1«A­Z±  Y)t‰6DHDVXTZX°¨–gfvQ'e!l«Ô ŃmŠ(iŃCLĆ35›V¬Â´f VmZujÓ«6“ZłŐ›W›ňţ‘SE‹,P±l… f4hÖSDL™2h‰˘&°’"r‘sO–†¨5ËQ­PiT†¦¦CE2hŃ«F­B± ”¬Ť:FVJXVZ¨´!Q,¤#™Ůť™ąK)‹5hĚhÁcE ,ĐYÓ!˘ĹŤjĚ+@ Â Ő¨N­%µiÔkVmZµdó~_Ó,hŃbĹ‹,S1BÚ‹2hÉ’:M$d‘G)4Ů\Óĺ ÔŐsVjT*SÓ±¦C˛Č @lZ„ ZTZHFJUZY˛(RĐE…„Dł73ł73˛–QĘBŔMZ5,hÁcŠ5fhfd,h±¬Â„ !hP­"˛ęŇkVťYŤj“Wťňţ™­E‹ĚP±BĹ 4[Q“&Ś™4d‰˘XXHś­•Í>tůjj™jUŐ ”đěhˇlT­ @ˇ ‰H‹+K"D¤PĄ ‰ rŽebngbnRʢŔZŤd2`Ѣ†Š5223433fÔXV…ˇK KB„ę«NŁ:µŐ¨Pm^wËúyŤ5ą:Š(X±˘ĆŠš2dŃ“FIi$D‹ecM•óŞgTËCUËR©T©T§§˘Ĺ QQaQ`"¢ŮDVHZ$ÓŤaÖ„Š!bnfâvfân'fnVĘ ˇŤj2cQ˘ÍŠ22=6†G¦bĹ j !iIaiehN­:´ęÓ«V­Bµ óľgÓ0[VB™ (u4ĘXŃV“FLš2h–’DXNtů[:¦uLę™ŐrÔjU*•j„ôěh±@ÁYTDDW) Šĺ˘,# YĂ­cG:6±¬:E-*#”ł7s7q7ĺ,¬ «IŁZŤj0iŁC#3čtdvj,SVˇ KI J+BE Ó«N­:…iOźňţŽmŠd)¦FbĚĹŚł4™i*hÉŁDMab9Ó çOŤS:¦u\ęąjVËR­P©T§¦˘Ĺ‚]ĺ4"MĘ9DG)¬Í„ăDŃ4Mśčš6°‰¨‰73q'q7pŽ Ĺ¨Ž­Fµ(`Ł##Ł#čtftj,cPĄ…¤¤¤ĄĄ•ZDęŇ'ˇ:… óţgŃŐ“9É“!L… 3ejkL­FZZM4k ¦ĘEó¦Î©ťS®u\µËQ®j•jĄAĄ=:š)"čDMezĚܢOY›™ë3Dr¬´' 4s¶6s¶4McZD##™ą›‰<ĺ¬MÄÜ#…E´ęè–­ZŠ.J6‡rČú™Ť!)) ))%edV:EaVˇ>Ěúg9ČL›Y)ŁQW–V—´ŇŇŇĚdÓVL$[+gOťS:¦u\5Ë\µ•JĄB¬Đ^žYšłm Šĺ4OYDžł'3Ög˘ne¬˘"- Ć‰ŁťľvŮŰ&‰­+Ks=fN%®sq-s›…r¶U1 #«¬:µhČSYmdŁk.ĺ‘ő—gGG˘Ć5 XJťNgK++ Ei¤ "µy˙7č!3‘¬‡9ÎL™ 3ye{O/i奥¨ÉŁL&[+ gTĘřŐsŞe®ZĺˇT¨Uf‚óIzj- ĐšĘhžł'3Öe˘Ng¬Í€ë[:cmŤą¶ÎŰ;&´ŠDšIĵ‰kyĎX›Í‡"„ĂÎZµh ¬ťg9g'YmeÜľ˛ččěđĚcPĄ„©Ôću1JYYY¤ uÁó˝áĘąŔríd9É‘›SË+Ú{Nj’öš^ZZڵbcM•ňľuLęi–\Ô …I Đi4—f˘ŰFEĐŽSYšOYž‰k2s=I˘˛Îił¶Îß=;lěšÂ˛‰72Ödâ:ç-bzç7 ä9„Ö8pęÔ(Fsś‡;X:ÉÖËkˇÜş:=20)i*u:•Lg)+*"@é‡HBx>w¸k ĺu¬‡ČÖrdĐĘÔÖžŐ%ÍŇ^Ő-4Ľµ4°µ0°¶tů_:|´ËL´frĄ99RhjAĄŞKÓˡm 9Ęh›™hžł$ž‰¤ŃYg4ŮŰçoťľ:1łťiYH’KXޱ×9ë ¬#‘ ÂĂŤbÓ«@€ä9ĆÖ6±µ¬6°Î_YtthhfŐˇi U9•Ng3ĄhH:@á‹çű—XW ¬ auŕ9ÎMEšZ\Ő-PŐ-RÓÚ Ľ´´Ľ°´¶W4ů_+çOš™\śśžśš\h.j–Ş45Z˘˝2˛¨šĚŇz&“Ń4š## Míó·Îß|ěš–Q$‘sb:ĵÎzÂ9W"έL$Ń$p‡!Ęë\ĆńµĎkXmaś»—FF…-%NĄR™Ôćb˛˛ŁŤ ÇOĎö eu…y®°şŔÖUĆr&¦V´ć©j¦éj†žiiĺĄĹĺ…Í>V4ů_+ćqbrrjbiqsNj“SU5Z¤Ń¨Ś‡FrşĘh›M&ČĘ‹8q¦Îź;|íó¶ÎÎw…%"I1Öc¬KX–°ŽUČŤF‰¦ť4’%¨9WX]s]s]óć5®gXmaś˛5–m„%$ΤR™ÔĄ%dµ‡5§ś<XÖX]a\.°5…Öä&ŁM-j†¨j–čj¶śŐ-R\ÓË‹Ú|¬iň¸¶WĘÄÄôÄÔÂŇÂćśŐ¶Ş5šÍYŃѵś›YTDT›"#+%+ Eł¶Îź;|íłłťcIIRH¤\ÇX–ł-a˘Äh‹l®i……¨Ŕ€áu„ß4ß5ß%ß5×=ľg\ˆÖZÉC-%%J§R™ ęr˛˘¦´&´áÖ°ęŕđz†˛şŔÖ\ŐÂëXW#Y[9µ4´ą§5CU·CTµCTµCOj‚ćśÓ‹esM™…‰‰‰©¤“ZasNj†Ş5šŤšµMĺ´ČШ”¨Ś˛´d’hçLiń¶ÎśŢΰ¨Î¤ŇHąŽł'2Öfĺ ˘$X\Ő3§#X]a7Ę{ć›ä›ä»ä7Ďk™ÖÉq  …Ą¤©”ŞS*śČR’TĐ$Öś&Ö:x<‘¬ `8]ŕk áu¬+•r#&–´ć¨j–¨n†«j†¨n–¨ió§´ů\Ó ebabjj"ŇÂeÍ9ިÔk6ŞĄ4QËk'FÖBVZZ'P:IŁ•Ť6vŮÓgDĐ4¤“(“IĚtIĚtMĘ" ˘$\ÓçTÎŞ4ËBh(.ůĎ|çľRéÉ7ÉwČo–×=¬ÎsˇYi u*•HeR©Ę JČ:ÖhÚÂgWźáô;XŔp5®k¬.°®ČEŤFLą§4ö¨n†Şn†«n†¨n†śÓçNi…˛°µ14’i"ŇĆś\Ő Pk5«ERš)¬¶˛ÚÎÖBVN$táƉ¦ĘĆŽtƶu…e u&ŠI#¬É%˘h”µĄ…óŞgUέ–ŁRrg!Âoś÷Ę]9K§$ß$éČo–×3®yÉsś¬-$N§1©Ş32•$ ¬Ö±Ł$Ń“hŃź7Ă×&Ö3‘¬msÂëÖÂ9W! 2M1§µCt5Cu7Cu7Ct5LíÍ9¦&“L-$XÓM3§MJµT®Š9¦ňÚËk;Y4*âÖ°±˘$I˘8I˘$ŃΓ@TR’¤ŇęŠI#˘i:ZŇMS:¦ulęůo–Ą@g!Âoś÷Î]9O§ôäť9mňÚ終ă9ÎV’'S¨ŚŞ5‘JĄ(I*hN4dš6šL™3ĺřwśťg9:ĆÖąía^k¬+…r®U ÂÖÓˇşˇşť)ťÔÝ Ó;ˇ¦4ćXXZZ´°™aaqq¤ĐŞÔJঞúËď ¬ígh ¨ 4Ć›:asDŃ8Ń$Ń VT¦Ó©4R-މ4éd ¦u\ęůŐňß-łVČÖ|ĺÓ”÷Ę]x§NKľ[|öąťs.sĺi*U*‰FaQ(ÔŞe9A kDŃ–´ĆŚ´–ńü+9:Éru¬sÚć.ą®°®ĘÂP`:I¦6ćÜÝ ×=*t¦wSĄ ľvćśÓ šja2ÔDË–SŐ*®i˘šĂë/Ľdë;F­:XÓgTÎśÓçLhš#„Ž8p‰QZťM¤Ńh¤Z)&•,Lj™Őł«g]z2Ř« ck ľiľRéÉ:rNś‡N[|Žąť`ą.D#%HŁP”*‰N§( Đ´MLi­5¦–Ł>‹ Ť¬ł†ÖYću®{\ĆąŤsGĺaDN´M1¶ĎJ¦zPé\ôˇŇ™Ý ą·ÎžÓ š4ŇHɢFI4°˝R©ćš)¬>˛űÁÖN˛S6’iÍ>uLť>tĂŤjÇN –RQ§Qi$Z ’ΖqŁťS:®uŃť_:čÍlŐ˛ÎvąŤsźNiÓ’tä˝9mň;ćÚću†sś„Z™FcP* ‰Jf+ Đ4m1¶´öÓ+QŻÇĹ‘ś»—ÖĂë™×6×-®k®k¬+„I˘RR´ “lmóŃΔĎZgĄs҇GÎčmÍą¦––ŁXLi5‰©…©áŇéMaő–Ţ[X: "Ö›:ˇşçUÎéť>tÂGN!8E ˛Ś•&“E˘‘i4e%dlę™Ős«çWËŃ–ÁC.çkß5ß5éÉwČtäwÍ·Í·Íś6ł "ÔĆ5ç(O9s”*%)©ˇk&ŰÚ{m/-EľoÇćw.ćŽhâšćúćúćűäuĎk’ë ânQ%S””4¦ńĽmłŃÎŻž”ĎZ=)ž”6ćÜÓK‰“FµjŃÖ¦¦&g‡J#ë/¬6˛ÚÉĐPł ZˇşgUÎíťPŐ3¦$EÔ%DRŞTÖm$‹E˘Ň©JJ4Ć©ť×:¶[çWÍP­–rÚć5ĚoéËožéÉ·É·‡×7ÖYÎr)ju€ŔyËśąÇž˘2ʉ¶6ÖÜŰÚyif-ňţ? ĄŐÍ\W\ë®Uß7×ß#®c\×XG3IT¦s#HmN;'SžŹžŻžŽu¦z>zPčćśŰË4kVM°jÔÔa©éŃŃő–ĐúË9: 5§®uSuΫťPÓ -"€‰˛˛•6“I¤Ńi4ŞR’¦±¦4ůŐsŞçVf°RÁÖąíó;ĺ·É·Í÷Í÷ÍőÍő—s“BTć#ç.qćr€Ŕb34¦¬mŽŹmÍ=·–VBß)ăůÔJął‹8¶ąŰ|­®Ußo“ëŽß0á5™¤Ş3R7#s:)Đg¦ĎRu|ô|ő|ôsŁçĄ ˝¶“&´hPZŤ;5::>˛Ú 6†¦—µCU5cuÎŞiň¸±jÂ(P++)Si4šM&’ʧ+*k&ź:ˇŞĺ®Z•j†]ËĽŰX;ćŰäŰćűäűçMs¦đîA˛ u€óŹ6^açq†XŚÍ! l›7G6öÜÓ+±bź)ăů´sg6q}sč×;ëŹFřß|kľ4ß&×-Ľ+™¤j jât‰Ňyč§Qž»=z¶ząŐóŃΔ6ĆžÓIť´DjѨÓSSłSŁhtmš^ŐMRŐs«ˇŞ ¬Z ˛´‹:›IdÓi4ĺ%-Ɖ¦4ůhj™jT E;‡Ö\ß\ß|©ľtß:ëť5Šk ¬ Ą*Ŕyňó.^qćΠ1Cjl›&ŘŰŰkO,ĹŹ•ńüşĄś]ÇFąôë—NřôďŹONß o‹ď™×0ćiçµÎośéÎt†zG=fuLőëłÔť_==čçG´ćšLčÍ Y#F-šZšť™ť 6¦BŚÎŻ/j¦ŞjKT"F°i„JĘŇĚęk6›Ig))+"ĐiŤ6W …HŁšX¦°úç]s¦ą×|ë®uß:ëť5–r\J™@`<ĂÍťrĺćÎą‡ź:‰© Í© l›klmä«1ŐśüÇŹćYÍśtkźNąuk—^řőď‡WO?Nřttă]ňmsQŁ<ÖůŤňť9ł×›=yβĎYçŞg¨:śőlőcŁťŰ›kL&MdĐ @Ś 4ŇôÔĘČĚČtmLÍ4µIˇŞZ ˝0%«-8€¬¬˘ĄMgSYĘ:YY´“DI¦ĘĺBzĄšĹUĹ\[\ë®v×;oťuŠëť5‡r\JŤDyňó.uË——:ć5ĎťsŚł©SJo[&šŮ–RÇFOśńüË8»ŽŤsę×.˝ńěßŢž~ÍđëéçééĆűĺMsÎQˇkž×&zrťyĽ™íÍž°ĎhçŞgŞç®:śőcŁťčćÓÚ4kVhŔhÓKK3K1ĐPč: vu{O44ňôh‘ŚZ±bĂ„JĘĘR,ĺ-"¬­ˇ"Ök '' ElŐÍśŮĹŢvÖ/®v×;kťµŠk äą8•s—>^S\ąy3®\ë—:ćΠj#HiM XŢ´d©mŁ9đĽ:Îo®}/>­ńěßÝđîéçîéçíéçëߍň®ů”VŤ®S|‡N<öăĎn<öĺĎ^löÚyę™ę3Ôť=\čćŢŰšya4k@Ť1h4I¤ÓKÉfbŰAŃ´m—§W´ŇňÔhĆ#±Ă„N•d´’¶–VĐ´- Ö°áŇH““ŶlćönăˇĹÜtkťő‹ëť\SXwČIÄKśąG”×&^<ë“;ĺÎą˛ó†u™¤•5­ ĘgjÉ´xŢ/źg=çÓ®]zăŰľÝ<ýý<ýý<ÝÝ<ý˝8ôďŤő†r«\§NLőâ:đçż{qç·6{sç´łŐ3ŐN§=ęÇJgt¶ćśÓSI‚Z4hĹ ŃŁ--EY6­ hÚÎѵY^YZŚ5VG6’Xt–VŇÚ–Ö´-i´ÄdĹ,Ú-g˘ÇEž—z}ĹÜ[X«ÍÜç*ćQć®Qăθó®3\y×.uÉťsĺçšÎRTC­Asd<żŠÎ:5ϧ\ş÷Ç·~~ţž~ţžC§›Đéçîß˝ňľ°úČŰć:qťxłŰ‡=řłŰ‹=ůsŰź=cžÉžŞtŮęÇG:S;ˇşĄ§¦#Z `Ő¨‘Ł-FY˛”Ú†¬ŤFŮęei*Ôk6 Z1ÄÂHŽ:Đ4- Bе­kBÖ4$-X+fÖo6zltŮęsŇăˇÇC‹¸Ł‡qś¬E9Ă–yxł®,ë‹:äÎą rĺç †R’”%d6`›GťâňWXčyôë—^řöďĎßÓĎčtóz<ţ‡O?N›ĺѬQĘß9ÓŹ=¸łŰ‡=řsߏ=ąsŰ›=Łž¨u\ôÇVĎJ(n¦éťVÓ‹“Q‚F4ŨѓEuY¶…Đ7‘±t ›Ac¨ÉSYµA"F‘6‹XÖ·­kZ޵„ZŚ fˇk=z¬őYęłŐg®ĎKŽ‹qW.ăYDŚsW%qđšŕθł®,ë×.^a€ÄĄ3¤”ĄaA‚ \?5ś]çÓ®]{ăŮż?O?O?ŁÓÍčtó÷ďŹfůtëM3şsť93Ű‹=řłß‹=¸łß—=ąóÖ'TĎE:śôcĄ3şť*nąŐF“Bjb0cQ¬Zµf3›6m hBď#`Đ5mE‹e5V 54I‰‰­2MxŃ·­ZеŤ RCŮ­ž‹=zěőŮë3×g®Ď]ž›7q[.çYšB9kޏ‚ן—€×uĹťqšĺËĚ<ĺŤN§IJĘ‚ \>>qwźFąuoŹfřwtó÷ôóú<ýűó÷ôăŮ®]ZÍPÚCp:ňç·{ńç·{ńç·1ן=dužzˇĎG:PÝs»®ua¬ĐšśŚ1«V ÚCf µ @Đ»`ÖFáŁ6ÔWV]B„ A&¦&&–´M5˘lÚ6Ť­hZ%d-e¬˝›Yč3Óg¬Ďdví3׆zltYµ–r"iĎ\•Ă^|ůćĽáóŤpg\&¸ňň.X *5"Fś+-+ ĂâĺW6×;ë—V¸őôăŮż?wO?O?~řwoŹfůôą˛5Ą:DëϞܙíËžü™íĘvćĎX%ž¨l Ń󺛩»çV5a¨ŇśžŚj4(0 Á—@m h`Đ»ˇ jÚłfÓPˇB1Đ@ÓÓ ËkLi­5ŁkZ6„‰QZˇˇ¬ĐͬtYę3Ůg´;Lö‡ižĂ=Vz¶^ʤ«š¸Ű‚|áógÍ5çóÇ:â\딹Ć•N‘•áńfŽk®wyôoŹVřöo‡oO?nřwo‡nůuďźK›3ZIç¬NÜŮíÍžÜŮíĚu†zDé#˘›ÇBmÍÔŐł»š±« Š•JhjjŐ«R deEĐ5. hÁ¨h¶¬Ů˛†Ň(P%Z0 ÔÔâňÂöžXÓZ6‹­"D­)-,`k4łk&zěöî3ÜĆ{rvYę6 ®Zâo>|ë^`ů–ĽŃóó®\CÉ—”yĆ”N’‘‚-fŕńTsW×;ëŹNřőoŹ^řvo‡nřöo—Vąôhµ=˘tC¬łÚ9í őç;@é ô•Ń )ĽmŤąŞš±»ŤÍXkUŞSĂQŁY…FM‰ˇt. hÚá« Ő´ćͧ0‘@–…`ŁCSS‹ËÚysL¦Ńť!V–’”„k43{6zĚö™î3Üć{sžĐę3p¬J…r× ůÓćĎ™k̵揜k:âAĺËÎ0©ŞP”´¨(7ŁąŁŠëťµËŁ|zuÇ«|z·ÇŻ|z÷ϧ\úŇö詞˛Ďicž˛7+¤Ť-µ4m1§µSV5q¸ÚjUŞ3ÓSQmA‘'˘zĘhM ¬ŤC@ѵmYłm9´ćŇ$ˇJB±h i©‰©ĺć‚ňŇňTČQK)I KËC™˝Ž›=f{L÷ď3Ţg·'až ąšF)Ô+ŽxWÎź6×™>aŻ8ל<¸˛ňćqF¦R„d…ĄAYą>wˇÜľ±GťuĘÚĺŃľ]ăÓ®=[ĺÓ®}ĎBV«mŽč3ŮNłĎIť't™¤´’-cTšš´ŘŐćĂjŁRťššł MIë2Ög±5•Đş6Ť«6Ő›)lşui(Ą@j4ÄÔäôňňňňŇŐ—2Ň2RRBĆ‚f–mg¤Ď]žÓ¦{Ě÷í3Ř&l%\óÇ\6Ľůómy¶ĽŃóMyć¸Mqeĺ5Ę0Ë ‘J§IËB ‡Ěö3–Ö(ó¦ą×\­ľW׍rčß>ŤcˇĹšËCOtlő'AžŞtS˘ZKK+"Š´ŇjjÓi°ÚjŐŞ3ĂÓ©¬‚—DśĎy–ł-ćzĘč]Fm¨¶RĄ´éŐ¤H! Ĺ‘¦&¦§ŞKËÓ)Ł*ĘËS„d„ł ™xµž‹=F;,÷í3Úc´ĎQž5…©5rO ® ó­yÖĽáóŤpá5ÇťrŹ6uŤDgS„¤ˇ µ'ËúË8}swť5Ęşçmr¶ą_|îâú,–šŰsŁťęsСiee[1¦š5&Óa´ŮkUjSłÓ±‚Á'¬ÇY–ó-e7”ÖF«!\ĹŠšË¤Č- A QĹ‹ #LL-OO4§—“M9…+N’&“……˛aěÖÍěőë±Řg˛ĎaŽł=&of†L!Ją«’x§†×Ż>מ<¸MqäÎąMse€ĆdS™ŇÂPĄ­YŹČú…ÁÖćÚćď:kťuÎşçmsł›k6kMmĐéCŁťčMëBĐ Á‚jŁVk6›5f­JŁRť‹‰-f[ĵ™ď3ŢSY3mKĘhČť:€áXH±azyzyzyj3¨J2Dâq4H[:ËY¬ZĎMž›fzěőé±Ńf¦^Č×<ňŹńĎ ®\&¸MqăÎąMseç5”ȧ3¤ĄˇB…ŻÇúĺÎ×2ážm®o®ty×\čâÚÍR­i­şŰˇŇ‡G:5˛kVP2 Tj-jËY­U¨Ô§Gg†lĘhžł=b[̵”ŢW@Đ4,XŃ]Fui¨ @ě¤p±bqzzyyzi#¤RJD˘i(K*äYk4ŠŮ˝ž›=6z,t™˝‹X{-dDŞÍ\ŁÇkŚxíqă5ÇťrĺÎą†˘1Ôĺ )igPŁ=?ěçX/2áµÍžo¬;ŠksT«Vkn¶ęt­·:9¦´WFm¬ä:©UZµf­JŁQ™ SYMfzĚ·”ŢSYŤ¨±B¦łŐ¨  @ lŘHáajryzq¤´°´ăKI3)¤¬Ę&ĺl‹%Ë٬ZͬôY˝›X­šXk”‰Tkśyç”yg×!®C\†ąs®aćΠ2™ Ą r´´˛+ žĎŤöłŚă8Úć\3͵‡pîhć‰V«ŞÚ±şŰ­şÓËNb›YČt2:QŞÔZŐŤHttdh)µ‹¬¦˛šĘo)¬®ň5m™ 5Ö­8…¢páÂE‰©…éćIasDÖi e(’JĚÜĄ€çCY¤V+fÖjć¶^Ă86u‘e"u*‰ByÇšyŤrŹ)®\ë”×8óçPL†s:IZQZ‡WwĆűyÎpyÁp\6°ÎËąŁQ«5µku·[t·KO/%Šg#k,Ť˘ŤFŁR¨ÔG§rČČ\—9˛şĘë+ˇw•ÖFŤ ęd*ĚXŃm:µÔheÄD“S“Ë•&†śÓc[:SJ3©bN'e­śĺˇâ–iJYg d¸Öu•˛•8”ČŁ<ăÎ<ĆąŤs1®|Ľć˘1©Śćt’˛„$N=˙í9ŔqśgĂ8.]ËąvŁVję¶«n¶«n–©/,Ŭ˛6†Jhv˘=QťËC9(\íg9‘¬®Í¬ŤY:ަfff˘şŤj„P TĐĘ:‰51=Ph.j†ÜŃÎÎv¦—,ęA2s+(álä6Z) dą.u€äY[+ I S”FąÇź/1®aç5ħ3©ĘJŇ•kWĆűAŔsśĆpl—,ĺŃŇŤYŁŞÚ««ZĄşÚ¤şł22 ¬˛>†GJhztdg,Śç9.sśähÎÖvŤ ë-©´33;2šeŐ§P-BASC(4˘-DŚ1<Đi4Ψmó¶Îöv3Ą52J#bnfál‡& <243“Ŕr¶C‘ ’fRĎ8óĺç5Ě<ă€ĘĄ3$””••"t÷|°‡Ćr,g%ÉrÖY¨ÔjM]VŐ]VŐ-U^]YC#h}e‘ő–GFGFBĺś—9ÎsśäÚÎŃśťYmˇő;;2ł4™ĘHPśK @\č šR+¦†'š †éťľvŮčs˝Ť!¤)¬ĆĚś%”pY0ČĐPĆsś‹*äY @…Ą$™¦yÍs8óĺç”fu9ť ¤¬¨­¬"{>GÖÎC‘`9ÎCdŁ9dzvŁUi5uWTšşĄŞ+Óędtm ¬ľ†rÚË#9d.K’ç9Îsśçh(u–ĐČúE4;;:˛™2dN! –@\čQQQ(Ł N4š 3şçožŹŤśôŮŇçS„¬ĆĚśÎÂąW:ÎC †3śšČr®D :j´µ1ŔyÇśy‡ź,*”Ě’g+(+ E¬]?+ę‡!β‡:Ér`ąvtzŁQ¨µuE­Ş--Q]¨Î͡ѵ—Ö[C9:Ë!rÎKśäąÖsť¬ä(\¶‡ĐîiˇôQ©©Ů٤ε¤H –AĄĘ )ĄĘ˘˘Pž¨45StÎ鎏ťśôŘŘË2•™Y“™XG*ŕFrPÁs“Y ś¬g"5ťZjJAŔ`<ăÍ—śyĘťJRgJi%Ed›üż¦Ys‘g90\´3:;Q¨ÔZ-f‹GTš-ŮŃő;—ĐÚËk,‡Y.YÎr\ç%Îsś—9 3—ĐéMfš*”ŃFve*gH´JŠ4˘¦—:SK•EDP- =9RhjąÝsşgŁăŁg{;ŇŚĘA'2±'˛®Îłą)“YÎBk!4k:Ś Ô´!óŹ8óĺć( 3*”Ě’ŇJŠHś5ůżHYr 9΂†Ë#SٵÚ‹U˘Ńh´ZMÚŚúC9} ¬—'Y.N˛\ç%Îłś—9 –FGŃG5ŃG5ŃT}NĚĆt‹BŇĘŠšY\éEM.tąŇçJ* …hÔĐŐA¤ĐŐsşçtÎéžŤŽ‡;ŇŚĘq+1ł7p–ç9ÎJg:3śšČŚäĆZ5,ˇHd<ćąósŹ8óŚ %)” ÎRTRTDéoťôg"3ť –CŽÎŽÔj5ŠëE˘ŇhÔWJjtmeő–Đ\ťd¸.v˛\ç:ÉsŁ9(éG4Jë5ŃT¦Š#±l˘EĄ•4’¦”PŇçKť&tąŇçJiD­Dž¨4šš®wStÎ鎏ťśďgk–c(•™Y“‰8Gŕ8ÎsťÉLçFs¬č) Ć­KJ2 ź/8óĺç(LFE9” ¤ ¬¨‹Z‡Ý FMÉ‚Ťť¨ĎŞŤE˘Ń]i4j3µ4:6‡rÚÉÖK“¬—9Îr\ç% “ ĺ‘҉Mf®m˘®i˘ÚŤ¶’RŇŠCH+ť¦t™ŇçIť.t-MMOTšMMTÝsŞçĄ3·ĎCťěěgS)”lÉĚlI掸s’äˇs¬”Ös“ Ő©IfcŽ^q†^qç( FC9¤ ¬¤%<>ÜšĐPĂ#C#łŁµÚšhδZMÚŤFt}Ť¬ł“¬ťdą.v˛\ç%É‚…ËC#ą¦Šą«›h®łD}™E*­©ĘICHi3¤Î“:Lí1ĄÎ—:\ë“M-TŞM&¦Şn¦«ž”Îß;ŮÚšL˛‰DlIÄlMćŽŔqśä.K’†És¬”6Lf0$LĆC°|°eDd2™ŠZAYYRŞ>?fŚš hf6L;4:;:>Ş3µÚŠëEŁQťťC9m äë%ÎÖKśäą.M’…ËĄ5šĄ\×Y®łD¦‚™‚¬¤¤ÎÔĺ &t†§ť&6ŇgkŤ.tąÖ--O4ŞM-Xjn¦©ťÓ=;9éł±ť ČĄf6bâO9<ćá\Îr`ąg&ÉBäŮ(`Ć­KH3 F9a—śb0ËÎf(i%eHH¬ĽŢOV‚šŠ0Ča‘é’ÍF}NÔWj+µÚ”íFtmeĐë,äë%ÉÖKśäą(l˛k.ŽĺôUÍušą®Šk.…łEIIśĚŇ Í&u<í1¤ĆÓLis±—2EŐć•I­ŞÚ©Şš¦wLôlíł±ťŚé H%ł+ś\Iç7óC’äŮ(ÎK–˛\”k% j*c#RË °ĺ€Ç,FC1ť¤•‘BEâózLf0aÁ†F‡Fg‡ÔěíF}N´Wgš3µáô2;“ˇśťdą.N˛\—&ÉF˛ČČîhćš(ćşÍ5šht)2*JLćvgť&u<ęxÚciŤ¦41±ťcFX]^i4šş¨ÔŐ ĐŰçmťśďgkť ĚĄł+yÉÄîhá\‡ –rQ¬ł–r\´0hRŇŚĆFĄ–°ËŽY †f’PVDЧ7źćîPÓ!˘†™¨ÎÎĎ©ŐŮŐÚŚňěéFdw,Śĺµ’ĺ´%Ér\˛-Ë#9tw4Öh”Öi¬ÓC!LÁ•RRg)3çIťO:ž6ÚsÚckťlďe6]Ő&“E¬ŇŐ PŐ ¶vŮŢÎötąŇB”JÄlĘç'yÍĘŘs“dŁ96YË9h(ѨP”ŚĆ9b1ÎŁ–,˛ JŠČťAŚčó8v,ĐhŁQ†C ÍÎĎ©ŮŮŐŮŐŮŮŐáŮŃŃŃ‘ś¶˛ÎN˛Qś—,äŁY.YËhw.ćšY¦˛čÚ f Şł9II¦u<ęyŇsÜń´ĆÓ\og[:kMić“E¤ŇŐ&–śÓçLlç{;ŮŇšABJ̬ĘÄśNç7*ŕYt,Ťeś˛;–†CF…IË,†9b1Ë!–Y Ĺ%DN­9Ťfňxô4ÔQ¨ŁQ††F¦GgggfgWÔęôęěđěččČîYYg'Ydg%Ë9(ÖK–†rČÎ[Cą}¬ľ‡rt3f ¬˛’’‚3IťOž7>zLm1±ŤŚčš&ž^ÓÍ“EĄ§4ĆÉŁťěč\éE q0ť™X“‰ŘG)`9śč.ZË#Ă##V¬BPPd2Ë–XچYfS•ś9´ć4[Ć㦢ÍEŚjdjfdvvvu}N¬Ď.ĚĎÎŽŽŚĺѵ–rÚË#9.YɲÎL3–FrČÚËh}e‘´2Y UJQICSĘ™Ôń©ăiĎsĆ—\ogXÓiy{TZ+Í%­8“DŢαˇťJH( ł;3ł;r¶VĘąÖtdk%šŤ ¤†¤2e‘Hešc1BYQ§QSE x|ôÔĐY¨ÓA˘†ť™ťť[S«ł3Ë3łĂłŁŁ9t}e‘µ—rČÚɲČÎZÉF˛\˛,Ť¬˛6†Đt)”0a+I*(i2Ď:ž4Üůé1´Ć†63¬i…­<şŇ]^^^I¦5ŤcXĐ42¨­) $NĚ죔˛–RČr YĐPĂC#SSQ­**(3چY¦S”ĹiDNˇ&Mf5ŕ󚙍h4`łQF§fgÔěěĘěęÔĚěđěČčî_Cąd}e´3—rČÎM–˛Q¬—,…ÉFĐ\¶‚‡Ac«0 ÂVTVS*gI–xÔń´Ć§Ť.6¸ĐΉ˘-/.Ż.Ż.¬&Ń4DĆ€@A-)$%”„ł;+e,«•4hh,ÔÔÔGJ”Ćc2™L’T–qiĘhŃV‚Ţ9ĂQŁF‹4ĚČĚěĚěěęĚęĚôĚôčččúËŁ9}¬˛;–rČÎZÉrĐ\›%ÉB‡AC ¦Ô[6ÂV”TPŇeLjygŤ&6ŇcC:ÖĘM4Ľ»<ş˛´´‘6‰ 8ÖhH KKJ e,˘%”˛¶Vh`“Q–¬&@¨¨ Ě§HS)’ŇĄ"M5f,kŔĆM5,kSFŁE™™źSłł+Ó+łSł3ĂŁčw.ʬş>˛ÚË9dk,äĂY.L% ’‡ALÇFlٲ겢˘™W,ó¤Ć§…1´Â™Ňç[:Ůt°ş´»<ł<›FI­8ÖkH"-HK) el¤%•…€B52i‡I VP¦HIS$Ą% B´éj2Y¨±oj,hŃ­Zł3fvfvvufyfzfvtttt}eŃő—Ö]Ë#ąg&ɲl”6JČSh-¦lą„Š˘˘™S*cSĆ“*cIŤ&tąFu„‹KSKł«S:i"maÖ°éư‰$(RŇÂŮHK)e! ¤-( k ’$p餂”€”€´´¤+N­-&™Ť5˙Ú˙šDDDDűĚDDDDDDDűŚDDDDDDDDDDO·DDDDDDDDDDDűtDDDDDDDDDDO·ÄDDOÂ""""'ţ‘?˝čűQ>ôb'É?Z"'Т""""|‘á‰ő‰řDDDDOÎ""""""'Őâ"""""""""""""‘>­ęŃë>Ż?ȉőh‰ůDDDDDDDDDDú´DDDOĆ"""'Á÷˘Z"""|1>X‰ű‘ú±?_ţÄDDDDDDDDý¨‰ô=řqŚř""""""#Zßš"~QčđăĎŠ"""""7ÖüqňźŢÖüĆ3ăŤĆăq­oÁ?ňňźÜ߇Ć|q¸Ün7ßÎ"""'ăĺĺĺĺĺĺčĆ|qŤĆăq¸ÜoĂńŹ////////(‰ôLů""""#q¸Ün7ź§ňňňňňňňŢ^^QéѸÜn7ŤĆăGŚĆc1ňňňňňňŢ[Ëyo/(źMÜn7ŤĆăqżˇŚc1Ěf3—————–ňŢ[Ëyo-ÄDOĄÄDDDDFăq¸Ün7ßĐĆ1ŚĆc1Î^^^^[Ëyo-強‰ô¨ŤĆăq¸ÜkZßźĆ1Ěf3^^^[Ëyo-ĺ¸Ün7>h‰üźc1Ěf"""#q¸Ün7Ťk[ócĆ9rçŚĆcËËËyo-ĺ¸Ün7‰ńÄDDDDDDDDOÝź3ŚĆc1ĚDDDn7ŤĆăZÖµż.1ŚrĺË—,Ćb"7ŤÇXëŤĆăsâ‰ű‘?ç­kZßĎşëZÖţ1üĎ»kZßÂ""'Ţ5ż„DDDűôDD˙€Ä˙ćČ˙Ú?#Ă˙Ú?#Ă˙Ú?#Ă˙Ú?!üŚücĆ1ŚcĆ1ŚcĆ1Ś˙µŚü¬ü,cĆ1ŚcáĆ1ŚcĆqśgüĽ˙…ž<đcĆ1Ścř1ŚcĆ3đ/źÎsŚc×<ůůĆx3™$HĆ~8Ć1śçLđ^/ác8Ć1Śc?8ĎĹÎřĆ3¬‰$H‘źŽ1Śc:gŠńĆ1ŚcĆ3¦xóňńž bD‰$H“đŔ Áx1ŚcΙÚó|¸ÎqŚcĆ1ŚcÎ1Śńgäc:ăΑ"D‰$g€1ťŔĄ)K,cÎqť/yľlçĆ1ŚcĆ1Śç:ăĆ3ó1ť1Śg$H‘"D‰1ŚcĆ1ŚcĆ1bĹ‹,X±śc9Î/5|ůĆqŚcĆ1ŚcĆČΙ×ĉ$H‘"D‰Ć1Śg\cĹ‹,X±bĆqśgj«ř9Ć1ŚcĆ1ŚcŰ?ăç\bD‰$H‘"F1ŚóUUUUgÎsšŞĽßŔÎ1ŚcĆ1Śg‡Ć3ţ6q"D‰$H‘"F~UUUç8Î3‹UUWđsŚcĆ1ŚcĆ3ÉŚc?ŕâD‰$H‘"DŚüŞ«×8Ć1śUUUëž|cĆ1ŚcĆÂĎ>$H‘"D‰$HĆ1ŚđkxÖŞŻ|cĆ,X±bŞŻÎsž>bŞŻh•*•áˇhśĽÂ•ÉW„!"D‰Ć1Śc?6"uĆ1žťˇJP„ŚXŹňÖĄ)jŐ«VµĽj%JĄxKę'"·R•W‰ĐDDFqŚgU*""'–'‘‚N*–Ą­kZ”µ©JZµjÖµ­o*UxBř'A­)jŐ^±:‰ÚŞŞ·Ťă"tťęńĽjU-jR”Ą©+x_8Ѝ(-ZµjÖµ­oĄJ— ĐéKV­^‘ ťŞŞ­ZÖµ­üXž «Vµ­JĄ­]Ŕ¦qßŔ”_ˇAJR— ky•*TđP„ěĺ«Vö‰ÉĄJ•*u޵jŐ­kZÖ·ń"'}ZµjÖµ©|aCá8oŕ_J×ŕĄ)KŕRĄJ„ęŚc:ăZÖµ­DJ‰RĄJ•*T­kZµjŐ«Vµ­kZÖµ­kZÖµľŤkZµjŐ«ZÖ§ôÎuüJ‚řĄ)|kRĄJ„!Ć1ŚéÖµ­jT©RĄJ•*T©Rµ­jŐ«V­ZÖ·ŤkZÖń­kZÖµĽoÖĄD©[εjŐ«Vµ­BxAôł‘|ŕµŕĄ)Ká­jT¨B„cÂr5­kZÔ©RĄJ•*T©R§ňRŐ«V­kZÖőŢwŤo:Öµ­J•*T©ZÖń«V­ZµkZÔđAť"ůŔ}JRŐ­kZÖó­kZ•B„!N kZÖµ©RĄJ•*T¨NŔR”µkZßń˝ő­kZ•*T©yÖ­ZµjŐ­kPťBŚéľB—őĄ«V­ZÖµ­oÖµ­j„!B„ŕÖµ­kRĄJ•*T! Ř R–µ­üMkZ•©RĄJÖ·›UV­ZÖµ*T!Âu=k|R©JRŐ«V­ZÖµ­kZÖµ­kP„!B„'µ­kRĄJ•*ž@Öţ>µ©RĄJ•/ZŞŞ­kZ•*ž V·R”Ą)KVŞŐVóĽkZÖµ­kRĄB„!BpkZÖµ*T©Rˇ<€­ońµ©RĄJ•+[ÍUUUăZ•*TńôĄ-R•ŘUU{ëZÖµ­kRĄJ•B„5­kZÖĄJ•*_ Öµż‹­kZ•*T©RńĽŐUU^7ŤJÖř€Ő«WŔŞŞŞöÖµ­kZÖĄJ•*T©RĄJ•*Vµ­kZÔ­oŚÖµĽDOÂÖµ­J•*T©SĄUUUé­kZÖµ­kZÖŞŻ€UUUí­kZÖµ­jT©RĄJ•*T©RĄkZÖµ­kZŢŕkZÖ˘"'ŹZÖµ­kZÖµ*T©RĄo5UUW¦µ­kZÖµ­kyŞ˝ŔŞŞ«ŕÖµ­kZÔ©RĄJ•*T©RĄJ•+ZÖµ­kZÖµ­kZÖ˘""'ZÖµ­kZÖµ­jT©RĄJŢ•UUzkZÖµ­k[ÚŞřUUUí­ăZÖő•*T©RĄJ•*TăxÖµ­kZÖµ­ć""'}kZÖµ­kZÖµ­J•*T©RŁyŞŞŞĽkZÖµ­k|5|*ŞŞöÖńľ•*T©R˘'}kZÖµ˝"""'}kZÖµ­kZÖµ­J•*T©RĄéUUUxÖµ­kZŢ7ÁWŔŞŞŻmç{ÄDDDDDDDOÂťµ­kZÖµĽ5­kZÔ©RĄJ•*7šŞŞŞµ­kZÖµ­o‚Ż€UU_řb"""""""~ DDDNÖ­ZµkV­kZÖµ­kRĄJ•*T©[ŇŞŞ­ZÖµ­kZÖ·ÁU{UUWľřg?""""t޵jŐ«V­Zµ­kZÖµ*T©RĄJ•+ZÖ­ZµjŐ«ZÖµ­kZÖµĽo:µW¸UU{oŽ"""""""'ŕDDDDN•V­ZµjŐ«V­kZÖµ*TDDJ•+ZÖ­ZµjŐ«Vµ­kZÖµ­kZÖµjŐ˝UUWđg1?"""'Ţ-ZµjŐ«V­ZµkZÖµ©QĄJÖµ«V­ZµjŐ­kZÖµ­kZÖµ­ZµjŐtUU """""""'ŕDDDJ•­kV­ZµjŐ«V­Zµ­kxÔDDD©RĄkZŐ«V­ZµjÖµ­kZÖµ­kZÖ­Zµj”®UWľy˘""""""~DJ•+ZÖµjŐŞµj­ZµkZŢ‘*T©ZÖµ«V­ZµjŐ­kZÖµ­kZÖµ­ZµjŐ)KUU"""""""~ DJ•+ZÖµ«V­ZŞ«UjÖńĽĘ‰RĄJ•­oAKV­ZµjŐ­kZÖµ­kZÖµ«V­ZµjŐŞŞż‹•? %J•­kZÖµjŐUU«UĽo2˘T©RĄJÖ·¨ZµjŐ«V­ZÖµ­kZÖµ­kZµjŐ«V­ZŞżŤ9‰řşÖµ­kZŐ«UVŞ­VńĽĘ•*T©Rµ­ě ZµjŐŞŞÖµ­kZÖđÖđŢ­ZµjŐ«UWń˘""u‰řšÖµ­kZÖ­Z޵UyŢeJ•*T©ZÖµĽ5­kV­UUé­kZÖ·“ZÖ­ZµjŐŞ«ů´DDN'ŕëZÖµ­kZŐ«V­Z«Îó©RĄJ•­kZÖµ­k[Ĺ^/]kZÖµ­kZŐ«V­ZµWÉ<±¤DDDDâq<úÖµ­kZÖ­ZµjŐ^wťJ•*Vµ­kZÖµ­oŠĽ^ÚÖµ­kZÖ­ZµjŐŞż“ĽDDDN'źzkZÖµĽZµUU{kRĄJÖµ­kZÖń˝Ż‹×ZÖµ­kZµjŐ«WÁ?""vśDDDâ~]UUUí¨ŤkZÖńĽďŽńW¶µ­kZÖ­ZŞľ Ű˙Ú?!˙úáÖ·˙€5­kx‰˙»Ö·‰˙ľ‰˙ľźűŘźűč‰˙˝‰˙ľ‰˙«Ć3ÍśÄDD˙ŐgźĆ1"""î1ŚcÄDD˙Ť?ěăřŘĆ1Śgţ$DD˙«ŚcĆ3ń1Śc:DD˙‰?ęăĆ1Śgâc˙.""'ýLcĆ1Śc˙~"""ŇĆ1ŚcĆ1ŚgýŘźôńŚcĆ1Śc˙r"""'ýLcĆ1ŚcĎű‘ţÎqŚcĆÜźň˘~qź‰źň˘""'ü¨źů‰˙*"ĆĎůq?ň9Ć3ţTDDNÚÖţv1Śc?ăgüč‰Îµ­k[ůxĆ1ŚcĎü”DNu­kZÖţN1ŚcĆ1ŚgţNs­kZÖ·ńqŚcĆ1ŚcĆ1Ś˙Ëë[Ćţ&1ŚăĆ1ŚcĆ1Śg˙3Ć1ź÷qŚcĆ1ŚcĆ1ŚcĎů¸Ć1ź÷1ŚcĆ1#Ć1ŚcĆqźúÜcĆ1"F1ŚcĆ1Śç?ő¸Ć1ŚbF1Śg8ÎsŚ˙×ăĆ1Ś˙Ţg8Ćü¶uř Ş˙đUU˙ßŐU_ýýUU˙ßŐU_ýýUU˙ßŐU_ýýUU˙ßŐU˙ŕ ŞżüUđ˙Ú?!˙âĽüă?őąÎ~3ścĎýN~&1Śc˙ľĆ1Śg˙Ä'xÖ·˙€u­křZÖ˙đ˙đµ˙િűĽcĹŠ«äĆę"'8Ć1ŚX±bŻlcĆ1Śgţ–"'Ć1‹,X±cĆ1ŚcĆ1Śgţ’"$cĆ1bĹ‹,cĆ1ŚcĆ1ŚgţoĆ1ŚâDDŚcĆ,X±bĹŚcĆ1ŚcĆ1‹Âżö1ŚcĆ$DH‘śc±bĹ‹Ć1ŚcĆ1Śc,X±>ŞŻý|cĆ1""'Lc,X±ŚcĆ1ŚcĆ,X±bĹ‹ůŐUWţĆ1Ścľ,X±ŚcĆ1ŚcĆ,X±bĹ‹6ŞŞŻý؉᱌cĆ1ŚcĆ1bĹ‹,X«ůµUUWţěO1ŚcĆ1ŚcĹ‹,X±bŞţmUU_µż÷ńŚcĆ1Śc,X±UUWójŞŞŻZÖĄjáóŠŞŞŞŞżťUUU{kZÖĄJ•?/Zßů5UUUU:ŞŞŞöÖµ©RĄJź‘­ç[˙ŞŞŞŞŞţ>wŞŞŞ«×ZÖĄJ•*TDOÄÖµ­kZßřőUUUUWń1ŚcεUUWťkZÖĄJ•*TDDóëZÖµ­k[Îţńż…UUUUUĆ1ŚgZŞŞ«Vµ­kZÖĄJ•*TDDňkZÖµ­kxŢšßÁŞŞŞŞ«řq#Ć1ŚéUUUjŐ­kZÖµ*T©R˘""xµ­kZÖµľ(źż…UUUUWđâDŚcÚŞŞ­ZµkZÖµ­J•*""""xu­kZÖµľ9ŕßËŞŞŞŞ«řQµ­k?ZÖµ­kZÖµ­kZÖµ­kZŢwń*ެB,YĐB„‰$HĎÇÖµ­kZßÍÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖµľjŞ«,X±c9!H‘"DŚü}kZÖµ­kZŢ7ňu­kZÖµ­kZÖµ­kZÖµ­kZÖµ­kZßUU‹,X±Śb‘"D‰ĎĆÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖµľ ŞŞ±bĹŚc‘"D‰1ŚüMkZÖµ­kZÖµ­kZÖµ­kZÖř5­kZÖµ­kZÖµ­kZÖµ˝ęŞŞ¬X±Śc$H‘"OÄÖµ­kZÖµ­kZÖµ­kZÖµ­kxßřzÖµ­kZÖµ­kZß UUUV1ŚbD‰'âkZÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖµ­oâßŔÖµ­kZßUUUUéśDDOĂÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖµ­kZÖţ-_ĎŞŞŞŞ˝â"~µ­kZÖµ­kZÖµ­kZÖµ­kZÖµĽkZÖµ­ü[˙ŞŞŞŻ‚"'ŕëZÖµ­kZÖµ­k[η¦ń˝ő­kZÖ·ţµUU_OŔÖµ­kZÖµ­kZÖ·ń5­kZŢbÓŞŞż›­kZÖµ­kZÖµĽoů1ţ­_ÎÖµ­kZÖµ­kZÖ·ň˘"'ţOZÖµ­k[ŰyßĘźů]ü ü¨‰ŕżűx‰ŢŞ˙í˘"'zŞżűXťŞŞŻţŇ""'jŞ«˙µťŞŞŞ˙čçĎ;UUU˙ŇÄóDDNŐUUôq͵UU_ý$DóÄDďUUôqĎ;ŐU˙ŇÄOĘŞżúX‰˙3?ň“ţ~1źůI˙;?ň“˙ÚW˙Ú .,?ű:·\±®ű{ĘXŢ0:ĘCLž»LĎ‚d5D÷zťŞĽ 0zFŽ%AA+Ú~Ú—ş«żĘ^p7ÚíądďŇqäąZy—Ä]ôŢRźËñ¨ăŘęĂ×Ň02‡ü`Űtnc €<@¬ [fůšĐŘ GĐ‹˘dö’řIŐ:ÚŮ—+‹VŰâ¨-ţwôä†Äž¦§uü“}ŕʞ¨đÎş`hśź¦É CĄ8‡<*'°#mÁć®Cĺ•€N ůxeŽň[ë¨ |ź’ŚąŠKü=+°+ĚĎ˙Ňckw#(xáD BLZů-r.ŁI˝-źzš4BC!\CňX”K.ߨ&¤O_Šť,â­˛ń(Ď©ÖĎ•$źŕ[Ožéá´—¶YĐâ0Zł˘ĽŢ¤Kę l L Ýšľoص…ľAÚ‰f¶˘Đő+‰,żć˛Ë™ fo(6¬÷㿉÷_/¤čúK QKË [ćĘ4±Á+mą6"EiŐ?÷Öç¸í B!ݏŤ©^Y©a—c| Óńc3Űđ˛}˛p —´.oĽV•Ź*)Ĺ´%rŞňZü ‚š‡??Ťs?¦­ˇx_†Bś–‡ăLĎ”•[$ß­#^ ţ@ŤS 0Ŕvd/“Ío˘Ýą®m.(Éň0{SäjQ1ĺŻi›Á]ĺdŕl3ą<ÄÜĐú늸;ŮüFä€Ó°(Y)í~fNVĐ8Ł t1:®UüŮ˝>ĐFr1 ‹ô©"q2ŠńĂ‹¤±Ö÷ĆČý›^om&žłR yĺÎ=Ś–řšő&ő đab\wȆÔŔ`ęĽhźXßç˙^XĐ H,şŤűéBąo†Üî .řLLę–C`N5a缲 ´UD†•<ĂѶĂ-ëöߦEVć‚BN]ľ!ĎŁ‡5ď޵CÇčâ’ĄĚ»č´Đ~…KP©jÔ!6¤!¦›n·[ţ¸˝E›Âçç>ĆŇŢ[;<‰ôĹ®(äätô©ä¦|kř Vµ4 Ý?š`Q¨sé†Ý$u=K-FGtjĐ—×a0/ČÁ˙ÉŽËÍ€6Ű€'©÷ŃvĹ€…F×KB'y‰ţÝŻ›m”zi]RdŘŢś¸Ő!Şť gĆ''$^­ÄĽ[ř'áĐv0É“˛W…Ór:ÍýLݎRŘĘuAí'o@x_U„jˇřT_`É ^jŻŞ‹)':=d®Pµv"ç W%ä![Á•”Ő!â•M( ż™ŔîoŮcLjÍ™ěăň(Ü«@śŐ˘&Ć-–Ůwfđ”ĹH5ŰGd ÖIĺL†ë0|˝@×p9\ĎM„§‹Ń(Óń3¬«‚J0€Ża¦ö:¨ś5tAblćżáa9 ˇsRŽ<>c¸5Ź»7rižBş¤Hyń }t«jl­ĚjťÉłü)ŕ+§qrżahŠ>`’ť'ob4”€Ý"[žµoÓ$Űmá<šĄj;ŔŽŰáźP] Í@ÄxÖĄ= nVűădśămSmüŔp-uç,\âĂ`ůóë˘îÄŤ•ćësźŠü9Ě[I2H_{óč…6gU¸ŻDlîňwÖˇá–Ęť/ź›ńýáĆ~ĺFăË}ułĽˇěŕçf3ĐŞă—ŕQOŤ[ŐiŞCvĐp0ŐÝ:|.Ť€Ĺ23€Ó‰ľŔŕ­Ř”\Ë˙3čf~ç_0çVľv?ůs&÷uŔ”»x¤¬ň0Ł ł÷ńň©Y×äúŃćąŃ¤n źPi«&FyĚ6"¬•ˇI:pIšĄ‡#÷âs>ůŠň’ŠÍRöť¨=A*ÂŰş¬=VŤ˛ÄN8ĹÇŃ»Ť»ŽEö )Ľ˙łP™ˇś…f3¦/Cç%GÝ2FĄF·ođđ€mŽ#Z®Aúne0ŘŽ’S·¬’đ°Šš7Zĺ§HĆ**V×3¤%xkĂ_–¨p6ÝÎżŤĚuÚ®c2`&G“ő*x˙Tq…p7&ŐHJŘAö-łn9A!¶qÓŹŻŠűS>Âô‘Çe ~Łŕ Hoő‹˙aŢ™§$?%ňĎ™©” “ř4áŇőŢ;ĺ7§Đ·{ÉÝë®ů۰jé´ 7˙că´Áż6jK<1Ť'Ŕ¸„#·÷9úśüĐrE‰~ť— ˘ź”ě˘ $Çű2L(O2úúSu·|R9Ŕ‘Â'ˤđ¦TÝŕ4Đ˙ŞkŔM+ôą‡Ář/Ó΄ŁęnI‹Gä¤×÷Ý\Ś·śű-o ˛NJ”/Ň©&} n…‡ËäôPET…ôgÁunĺ–çŮ޶Ő‡ŔŻż:훾Ҝ¬z ŠŮD×ye't5vľ—™cuŇZ„ ő !‹A?ű#‚ŇdXV‹K+|·j©t뀗$ü\Ľ…´í*–-T¨q‘€—šĐ"*m.»˝Ý揀źČîúĺî|/D2(`D`¦%Ś]eH•n28ŔŤŁ˘–PÇ x',±ĂpP˘>÷şŤôí Ś„Ž6ZS!oU% ÉbşOýŐ¨^™Âڞy§ĄFĎE ô¤ť&©÷ŕH'Şx¦Yk‚ťÖ.ż;{…·»Ř9M®TľÓĺ¸Ň"Ł´ŹR†řďĚ€őŘňVŔاňô‘Lס‚-Ë]ćÖÍ‚r;hâ ㋚6ő[Ź;—˘qš?ŚMĆĽuI¨iîĐd]Ą]řńĎѰ˙ŐÁ/Ţ@ó‚Y¬yő˘ĎdŐó%Ńą®‡ ű€gžw¤ĎgÜŇĹűĽĹęuz \ĄŁXö˙1(.E{3Ž™3Oż~Wë©i®¶ÚťwžtÜš ôyĽ‹#+;4›ěu]»Ç˘őÖ#şšI„Š7ú’ł#˘Á2§~$ľ‡‚j€WÓϢđnŇłH*Î$šĐĺHşąr´Fíyë18|?/óJŔÖÓ=[v#đVA~0p ˙*3!MBLËNž’B»pÝOŐŻŞ®y¦-&)]ŽcŚłŮ[Ia…łůu#3âŤäOşă[¤FĺľÎű•–\śđ Wź^: ń9pt®„,8«¦SűYG? Ä#s‹¸YÂ;$L‰3…Ú!Äv€˛Ăňq;ťD¬‡§ľ+’P?D?áË5réČĹÜđ¸"]ŇsŻW–ôNć/ó@űqČáNwű0].x¬j¤¨6ţ0SI>aÜëxí¦!+V˝„Ź‹9šľJ"ĺŘ3•¶!Ů,|†ĽĎőß´şÖI™Ŕł‘GD\%kĄPëk‘"[ĚE˝JŮő…aŇŹvnLÚ`× I§«4óëĆĽ7[űÜâwŚ#-\ĽuN$›rÎt¬–ţóç!ÚÜŠł§ö śŔ‚ácůőýx± 'éŚú|y7ëŻÇˇ­áÓÇEŞÍ©žŁ)Ęł˘ĐH»tÍ8cîLy›z%«;˙"eBň>OĚv>jE †˛fҦ…{öngY…›‚ř™úţŤf$]DĽw9XQ«Ř?HDý!%[] üSB4ÉCďQ&Í–hÇ(rúVI°®±?ĽăýyVĽ–Ś 2!%”·ĺCs…<©ŤÁš’V)5 îô0ŐľŤQîĽ?čzyżÜŹäzŔ:2x Á[‹\ĐŔÄ®\7)kĘD ,Ç 3ŞFŠýŻ–Ţ'\Ow”ĎŁ#gBő`Ćt°MŔ ţÍ.-{áEľÔ&ߨűţSר¬rCžú8XN/#…-S×t pĽrÔ 8Eü¸'á^5j> Ĺz‡>ę@%ń–?© Ś;NFÖz%Üh¨źťGhV#gtlrŘLEťa‹ÚÄĹp|UtĄEČvB`NÍđné {MóT„ß‹MŹ®ˇńÂ4ň©`2w<* şćU^›‰çD©–ŮHfĺ:Űj}9§řç`f¶Q´„ ĆýÄî0X”Ц ú*îŽpç,ţI×Dp5ĐAł”éG®JÚCë˝-4Á†Łv÷my8Ţ"릮gîzeî%öHqRžAĄĄ¤ÝpąwMîCaä)—”AµöŔR{Q(\čzT „ťŃEń,”ň}ŢNo<ř)ńWEIĺ(nůq»ëŮpSiNaĆĽkU©´Ç–îŮ÷¶ ¸Ý'±‡V‚Q+v#Slş°ÇŮcđČ—ëŐ˝Ójo/GC=c“™"7l˛ćŞ˘ťŇoká¸b’!‚ýŢđß<;Nž»Ř™}ń‡Řľ!{‡ń6©BďîŠ Ť?ľÉg ˛v-Hí«|˙É@wŔeŹ«žĄ]s_J¨Ë&ŮÄéÂX'c!9×;_||źé]Ö=Ť}D Ě`Č­‹Fîa¤9řZs<™šP#Óinq©ŘÎŐű˝řs< ’,ßăh&[,ÄCjĚbBé–¦Ĺ-´éŻ*_‡}$WÔ­DłžÝUežďF˙̰=ÚVˇß¦n"Ďä hÍ+ŕVťˇD˛ CCްĽt€i¦C–‰‹9g AÖ)âŘUŞBĂČýĺçćid ńwPÜ,ĺXžűËmßž®Ş˘2©ýcA‚!AÜ»žćśňÇRéśW0Ť} Ş™ŰÜ•ó”uŢ-ĺëŁ>ĚDMއŃBßń)ä Ę_w 8t`F+#źy@N’l×9$8”n:ÉĚԚη;.5r:3Vő[V´h Ž­ŠŠŠBnµŘmuŁš)łďńĄŻŔXŹĆgdÎ߉ÚxđzÜŞČÍ2®Z(^5·Ź9ĹAĂźp©§ÍĺFÉÖtÁĚţł2Ą,d 9!B-ţI°ŁBýŢżĄŔż\WRHžŽoUđ•5pUţElʞ-I<5/ł?%¦C/xó{Z“Ç=nŃWڇíÖÇŹ3yuÎ=Ęë/'ýniśM;CĽj«×YĐIĽŮ®jőęéěΚ+yßů’N ±mŐUřm×R>g ç*3hî%â\ş°w<ő(™€GăŚt›ôó¨4cî˙Ú?çČÉ˙Ó'˙LŚŚddc<ÎĆ1#Ć1"D‰$BuřF|§Ëů/çŤoʵ°ż Ô‘ŚcĆ,âĆ,ćÎoĂc5‹,X±‹ĆT‰$H‘"N1ŚŚŚá¦1•ŚgI:c8Ć1śg9xc#>1Śc1Śc‘"„#ńĆ1Śa>8—áJÖÚµ˝aś3†,X±bĹ‹,âÎo|cĹŚX±bĹ‹˛˛±"D‰‘"F1Śc+9Ć1ŚśÉÓĘĘĆ1ŚH„ŚcĆ1ŚáŚcÄB’ź(Ď”cBá9”Ą)Kđż*ÖöĆ,X±bĹ‹*ůYX±Ś)K)ś„‰$BJĆqŚg8Î1Śq'LHĆ1ŚdcÎ1Śc: cĆ1 tâŚaB„'?ůV´ż*_…ř_…ř_…ů_•çcXĆ)‹,U‹Â𪿾˛tĆ1c)Láü!BD‰1ŚcČČĆ3†0“zbF3Śc8ĆtĆpČĆ1Śęĉ84ę+B„!>PźăŤůV·ĺZŇ”ż ÖµĽ1ŠX±bĹ‹*đĽ*¬g9¬ăĆ1‹ńÂüp˝„!"HÎĆ2˛±Śc8c"NŚcĆqڬcĆ1ŚäĆ1ŚbD'€¬!O„!NEř_…)[đř/•ż+ň­)KĹ,X±bÄ*đ«ß‘ś0É˙Ó#/Ç ńÔ'„!'AŚăĆ22pĆN'IéŚćFN3ŚDăÉ#Î bDđUŚ!BŚžJR—|:ŠŇ”Ą‹Ą‹!b8UáWÚóŚHÄŚc8c8źÇbBśĘÓĆw+ó´ôÎdëŚcĆ1ŚBĆt“ÄjĆ1ŚcÖ5­k|5T XĄ,XĄX±*ݵ^“8‘#Î×Aürç¨OŽÎ1ŚŚecĆ_ţ™YYYó¤ë'8ĆNŃ"D$c8cΓĆ@1„!BF1ś)J_–)b–,X±bôU_jĽç2$bDŚC:ăÂü5Ă9ĆpĆ1ścĆ^Ňs#Ćg8ĉ"N‘"F3†F1"Ä ¨!BD‰Ďí˙á‘‹,B„!RĹ)bĹ,X„! Ľ/3ŚH‘‰1"MH„ž?ĎPĆFOţĆ1ť¸dcÖ'ëśIÎ3¦1"D‰"$H‘Śc!'Ś*€!"F$zé­o«Ř…‹±K±‚„!X±xĆ$bDŚbDŚH„ś?Ź/áü0ÎLăĘĆ1ŚgÎá"NdbF1'22$âsT‰8Î1‰'ŚP‘"FvÖµ«V­R•ÉV,XĄŠR”±B…‹3†q&±#$bD‰$O„'ÇsďĘđYĂĆV1Śd˙éźĆsśH“™8“śỈ’$g2$D‰8‘"Dę őv ! ČÎşŢŐ)JRŐU‹)JR—¨„,SZc˙ł$bD‰$H„!:žµĄ)Lc+É•Śc>1ŚâN’q8“śH“9‘"’$ă+8‘"D'ţ¬gđţáK,éjŐ«V­öµj˙ĽăĄ)KáXĽäĉĉ$H„Báĺüń­kZR—8ecĆ3ŚcĆ$âMâN""DI©q‰!‰‘"D‰ž@ú±śĎŇ”Ą‹1UTĄ)jűç¬äĄi|4( ^Ŕb„ŚH‘B„'WÖµ­ix3†3“Ć1c“™8źľ'ďśH‘"F$IĂĉ“Ě˙ęÂĂřáJŢkJRĹťUcĐk[ŕŻ!đV—ç“áü'@„!"B3§Ň•­kKČĆpĆ1cłôĆs'hź¤D‘ ! Śá"D'˙ęĆĂř_…/„BĹŚg śżçŤđUuřđß•éűo§ţ8ÎB B3ŹůR—Ö´Ą3†1ŚbĆ1Śc9őŇ5"D‰‚F¸Bđ?ÝBĆq _އ@ĄäBá˙·µTĄ,XÍc±‹ĎŰÎ/Mj%á/ Â$H‘ „! á UJP„#Ň‘95Ľ‡E~|_.B—řF1„'&ř~üUĽŹă ţ_ËůźÇĆ0ť@ś»ŕŞK,c1c1bĹcťFĄá/P„‰$B„'pBĂürŽă„$áüŻĘó‡€ý Áü!BţxŢňŞřđZ^á˙—ňţ_Ëůăüt1Śě!áKܱcĆ,c1JX«Ľg‰xKÔ!"D‰„!;G¤rWĄ)JWA#8Vüôäůqüx~+ňŻňź|_˙/‹âż+đţQŹĹńáźSĺńář§Ăř^ÂżçÓ Č„ůB|'Ę|§Â|?—ňż+ňřľ _ž?„g:–!Ň”ĄX±ŚcΔż _…)Kđż đω>$OB$H‘""""x˙žá'é‹"Ĺ)JÖ”Ľ?Ę3ç‡ŕ„ŕ˝|¸ţ}(ĄůeÎań|Sá>_Ęüľ/ŕř+_ĺü!>“[Ŕ„Ą)J±c?lcĂ9)JRµ­k[Ě‘'Äč+¸„‰$H‘""p˙“üă,X±KŐźĎO„řBqÖřĄU ă’ťK_Á>Âü>“ŕř>+Çüńţy)zĐĄ)JíbĆ1Śáž5­i~­çBDu î!"N$IúD‘xÇČśŐ‹ŮźÇ đ„#8ë|Wëö—Âóĺ~ÍóářŻĎĺüżžj_j©B,g áO‡ňţ{ŹJRŇ”Ľ¨H“Č?"8H‘"F!"pöě;Z”•ĽVô’'Â|'^F3ťKâU,bGŁÁ‹ŘP^źüż•ů_ ?Ş ^IhĎ2—ĺZß•/F„ń>!!"D$B"=ą)KZŐÁ xSVµ"ť>qOޱgpŞ„Ą ‘ G`Ťë|ĄäĎ—ňţWçĘ”ŻAKÉŚcđźD!Ćp+ňż+ňż/еĽ¸BŽŘ„BD‰$IÄHś)JW`Zµ*p„$Bu1‹! JP”óXÄ%ôŹHJ,|:C_ă„#üńŻÇČĐŻĺĆ|§Ę|! ÁF1„—đż Sŕř/Ç˙•ů_žXÎ!(B„$H‘"DH“8‰TĄzîť TŞä„$NáŚc8«ă9Ş'ě(¨BĽpźN;强Ţ|ůBá đ‡˘¨B|§Ëř+ňż đöţźĹđ_•ůáĚ!GÄ!H‘"D™Ćq¨ÔŞőÜ# ÁJ®˝ ĆsU|geb;BÔ—Š±bđĆ„âż/‡!ěýv_oa8'ÂÂv Á>_ËÓŇüľ/ŕř>/Šü/ËřBsBńH‘"DŚśc8ÔJ—ö®Ŕ!BU+ö·ůé'9ĹU_ý „§’–¤­âĹś#9„řOž7ç—řň'ÉěęűxçĘtˇNŕ}ň|ßĹ>ÂüŻËâůľo›ŕřŻÂüż„'H„!"D‰ĆV3¤¸•*Uzŕ¤!*T©u*źăŹůć˙ť*ŞŻ€üˇbĉžkZ’Ąă8Bu OŽ7›űß?sÜö~şžŢ8Çâřň±ť1ůôăćů>o‚|ż•ř|'Éđ|ß'Íđ_žŚäŽBD‰Ć1Śřâ"' ÂT©Q*t?ç®Nuy«ÜyJĄ?„řBz{W‘"š|9YóĆüđüü T{yŰÇČ>Bôđ Câř>/“âź đřľo‹ŕöţźÉóŕż<±ś‚8! áŚc>,řĆ1‰$B$IűHžŘťůç˙%KŇŞŞňJRžC༉Ŕ„'´#°ˇóĺgĎÖéî{žçąěčíćBH„‰8Ät‡Öő=§©ó|4ř‹ćřľ/wéó|Éń^ÎĐ|!ă Ąřč!B„$BDB_ăŹůáIZŢoUBQĐ Ţ|g0„!Gpëůľ<3ĺüŻĎÍń{żOsÜ÷=Ý·ŠbDIµ©O%éz_§ôř7˙Ĺü/ĂćřľOgéíý=ź§żôř>o‚đĆuBţ|?ńŚcĆ0„! Ź]%%JÖµoUbŘ­éóĺŔ„%=«Ż[ćů>O‚|?…ů|_7ÇŹÜö=ź§˝ďýuȱśĘ•*ÂR‡©čzŢ·©ëý=?§Żôů'Ęü>OäöţžßÓŰú{_'ǬpťF3§˙ đ„!F3çŚ!"ĐD©Z޵V!AkKĐ?„c< Ż‹âřq|źř đů>/›Ţö=ŹcÚ÷˝Ý…˙üq­KŘpźHôô=OCŇô=oGéń|Ăä÷ţžĎÓÝú{˙Owéěý=˙®[âĽqť`±ťAüńţx˙(Ć1Ś!ür˙/ĺH‘“ŤkZ޶,R•­izńË௡ń|^ŹÓŕřľoŠ|ż—Ĺň|˙ÓŰú{^Ç·‡Ú÷=ś…V·Âkţé‘éęz—«ôůđ˙ŕö=Ďgéíý=˙§·őŇÇÚŞBp˙<—ňţĂřF|§Ę|Łă‡ńĎüż„řBLHśĄăZŢ%鋥kKĐ?ŽÇĺŢč~ż×Éń|_7Ĺ>Uřľowéěý=ż§ąî{Ţ×±î{źiáV·…č˙óËţĺţSé>ž§©óOžCŘ÷=ŹcÜ÷=ü˝ăŚíT!>Qţ_Ăřáü?„'Â|§Ę|§\VôčH‘"uŢ%KÄdc8R·¬?Žř ňśßĐř=O_éęý=_§Żôůľ/“ŕź ňřľ/›Ůú{˙OsÜ÷˝ďcŘ÷! ä«V­č-^—é^—é^—é~—é~•éŹÓŃ$YúGąě{÷µď{xďí^ľŠ|§Ę|pţÇ'đţáü§Ę|ô­oH”’¤cÖ'3Čp/Ç,g7ô=_§­éý=Gééý>oŕř'Âü>O‹Űú{żOoéěý=ŹkŘ÷=‰öźhOIjŐ­^ Rާ©čzž·­ëz^—čB”żoö˙Höźhö÷rW‚vŻß'dž|§Ëůáü?—ňţ_ĎxëZÖđá ÁŚëÚ""D‰<'ĄoĎ<ćľ·©čz^§ŁôôţžźÓäů> đż›ßú{?Ooéď{żO{Üö~“íÓí(ë•jÖ­ý5kz§ˇëz^§©ëzoO+y_±~×íţŃ?iö„/č?×Ö‚ĺĺüżźe)JRőđÎĹśg‘"H„#;ZŢ ÔOézž§ŻôőţžŻÓŃúz˙O‹âź/ŕö~ž÷±ď{^ÇąŃí>ßë­˙·úRßÚŐ«Zµň^—­čz^żŰŃűz?o«Óű~źoOo§ąí{íţřJpž!KëNZÖ”±‹,X±g'× dc*݉?HźâD‰!NJR™ÂrŹSŇő˝oGéęý=oOéó|_”ö=ŻsŘźhö˙Oö˙OöŻkR–µ{RŐ­ZŐs^Ž?CÔô˝·§öő~ßGŃôO«ěú˝Ü~ĺňÂĆ! đAÎ}iK,U^*«?űcĆ1ł‹1ť'$"Dź!9,X±c„ˇ ôő!úz^—­ëzű(§Ú=żÓý+Ú˝«Úý«ŰÜö=Ďgr€Ą7…pząSŇő2ĎŰŐűzżoGíéýľ©ôżO«íĘ{8/’˙¬B„!)B„ťG%żµ­kZĽçĹśX˝Ţ"uá"DŚbŞŞö_áţ_áţéŹÓ¤zO®KV“Ü÷=Ż{Ţ÷˝Żííý˝ďkßÝxiJ^ UÚŰôţŢŹŰÓűz?oWíő}Óíý/ŰéÇöç­KÄO7řá$Uś?× R–©ŞjÖ«yĽUâô‰í“Ń?ÄN8ŞŞRŐ58^§ˇűž‡©ęz„ľ98żO»Ţ÷ţŢ˙ŰŰűGö÷˝˙·±î{ç±îčß•­oß<˝ĎSÖű=·Ůö}wŃ>źÚý>˝D)kQ\ôŻJZÖŻJJ‰UxWµ«ĄčÖµ­kVµkVµ©ZÔ¨Ą+ô¤©Q/µJ~Ž Á·Ąëz^‡ˇčý˝oKčű'Űęú=ź·»ö÷~ŢĎŰŰű{ogíîý˝ďkßű{osŮÚ€Ą)xĺKÜ8}_·ŮëýľŹŁěú'Ú}żĄű^„-ZÔ©Vµ)}¨ JÖ­RúĐRöZÖµkZµ«ZÔ­J•*U)IRĄkZľÜÎBđÇëÉz·Ąčý˝_·Żöő~ßWŐý>Ź«ę÷~ŢĎŰßű{ogííý˝˙·±îý˝ź·µďĺţÝĄ/"T©Ô=ę}_GŃő}ßwŐőO¤űć­)KÁ Wřj€!8/qP_!^ ^ kZ•*TŞR”Ą'/`~řÇéÁęý˝?·©ęý˝·«öôţßgÝ>ßÓčú˝ź·»ööţŢßŰÝű{˙owííý˝ż·»öö~Ţ˙ß+÷ëKÁý?¦µ Ř-ýřľĎłîúľŹ˘0ţ¸Ö”ţźŇyAUj±Źö˝ďÁy oAy‘¨jś z8!+x^ŔńÎeéz˙oGíéý˝·§öű=?·Ń>×íő}_włö÷ţŢßŰŮű{ogííý˝ß·łööţß~Ź}źN Rô oN…>Ď»îűľĎłěűr°„çÓúá< «őHN+őÜü/"ÖµĽ5Ľ-äµoP„îN ^ॼsŤő}^ŻŰ×űzżo»čű§Óű_·Őíý˝ß·»ööţßgżö÷~Ţ˙ŰÝű{żooí÷{ą/·Ak[ÓőĽ!Δ>ď»îűľďżM!ď›úá ăú„!>řŢĐ—RĄkZÖ·†đµjÖµĽ„'ŃĐ ZĄî*‹Ă:É>ŹŁîËý}Séý/Óčű>Żłîú˝ż··öö~ŢßŰŰű{<2úµ­éűĐBśO§Ý÷ăűńýúa מ~‡Ó‚1ţř×ëŃŢ K©Z—¦ó«ZÖµoíĽ'ŕNAčŕ„ŕŐĽľ”^ Ň÷Ýö}ßGŐ>ßÓú_·Ńö}ßWŃďýľĎíě{÷żĂ´J_Ď, ęťOśßßµűR—‹RĄJŤă÷ÓU«V­Zµ­jťŔ*V­RÖµ©y©GęźIöţźÚýŻÚý>Ź«îűpýž÷˝ďďQUÁJRŐĽ7ëúđŚňÔ*¨!Ćž*ŚgßďŤk[Ă´ŇU%JÖµ­V­ZµjŐ«ZÖˇ;€G ZĄ­~Öµ-á:…'Ň}ż§őÂýŻÚ—éő}zŘ{—í~×íJZÔĄ{RŐ«ZÖřF3ÉWŞ‚1ŚaNÁVé˙|ľýÂĄJŹ×MkV­ZµjŐ«Đ'@áČJ†­RÖµűR–đ•8Śä_µoÚý«~•ĽĘÔĄń˙oô˙\mJá^ŐíjÖµĽ—¨! ć*˙걄!BpgÚ0„ŕţ¸˙|ź×©\"TŢ5«Zµ«V­ZµjŐäBw%jŐ)k÷ĆÔµ­Bť>µ­o)J_·úĺ˙~)Ĺ{Z«[Ťđ€BĚ˙U!B„#Ćw®‚%JŐjÖ­ZĄ)JR”żOë„'pPCV©Kă~×ÂŐ­Bť_J]«{·ţűýr_őŐVńo ŘOŔB„! ŕ˙„!Jô®ˇµ­kTĄ)JR•­čťÁA Zµ]=đµk|/őĂ[Z·ŹőŐß?úîÇú_őWßÉ˝CRĄJŻ˙U)^@€)*ˇOĄWbDKĆ­ý)JR•­kZÖôůŕˇQQ ZĄŻŤ©KWŔýpÖ·[Ć­Wúí?ö˙]™ţźéŐ_}KxkZ•*TŞR”Ą+¸R”•*T©Rř@%J•]^8DÖµoµŞR•­kZÖµĽřĎ *‚V­R–µ©KWÂŢÖµ±jŐs§űć˙]™ţźéUz-o nµ*%R”Ą)JR”Ą)^”¤ľ’ĄJÖµ­kZÖĄJť^y'6­öĄ)JÖµ­iZŢ|g‚U!«TĄ­kW/Öµ+V­RÔ˙Oö˙|×v?ŇŞŻŢÖµ©R§ń½pĄ)JWĄ)JW¤©RĄJ•­kZ•*Tľ“Âyµoµľű7šÖµ­çĆ3 ¨źIV­RÖµó˝vý˙čßţšß«V©kR•íţźď‡űľOô˙J«Ć7†µ©R˘' ţp˙)JR”ŻJJ•*T­kZÖ·ö•?Ďň*Ő+Ä*ÖµĽřĎ  śľU˝>3¬'°ÖŻÖĄ)JîÇúUgFµ©QúGřáţ8z+× R•éJôĄ)*T©RĄkZÖ˙ĽDOó¨ž6Ą%jŐ+ƵĽÚR–µô‚r/„UCz|cÂ˙úN ˝R”Ą-}bŻľlăZÔ˝'´O\"v)JR”Ą%J•+ZÖĄDâ{D˙9+Ť­JJÇ | ĽN)kZúA8+|2ŞŠŢ|cĆ„ŕţ”˝…E)KZŐĂý*űâÎej^g8ŽJő”Ą)JR”•*T©RĄkR˘zDOńJR–ľBpRů@Ľ‰PĄ)k_XĎľőMű^|cĆ0„äŇöDZKZ•ÂŻľ1ŚMKƢzOIţ'´Ké])JR”Ą)*T©RĄJ•§´OńúDŞRş9˝W!]@)x5*U)KWXÎ:ßŻŞ—źĆ1Śc ÁKĐ»¨­\-UâĆ1źó/é*%D©Q/ R˝)JR”Ą)JKő*T©RĄK˙öJ—…+ śú^  R¸+ĄĽ%KÁJW`3ťKâÔĽřĆ1ŚűF3Ž·ˇ˙wZ«Z”µWśŚb^'¤¨‰QJWĄ)ITĄ)JW%J•*T©Q*""%ô•*ş>“źZRň R•ČR–đ•/wĆs)|Ezý/×GĆ1ŚcýńľőU©KUWŚbFq*"""T¨•JR”Ą%JĄ)JRT©RĄJ•úDDOIQ*T©P„'>´Ąä® W/˙č·„©|F3¤R—µ@Ą)J^DcöźhFqVřKŐTĄ*ńx‰?űc8—‰R©JR”•*TŞW˙˘”Ą%J•*T¨‰Q˘T©RĄJ„'÷”Ą/ ĄpR”µo Kŕ1ť:µ­o Ą+…«jŐäF1Śa9u˝+űąŞR–­^bN$bq="qĄJ•/ú•JR”•*T©TĄ)JJ¤©RĄDOh‰R˘T©Rˇ ÔĄ){ RŐĽ5*vźi÷Űő­)KUŞU*Ő«jô öŚc9ő˝ęJZµoI8‘Śá8‰ÄâT¸•*U)JRT©Uţ)JR”Ą%á/‰ţ""%kRĄJ—¸Ą){ RŐĽ5*uBť˙R”µKÉxUZµ·’Śg>·˝)KW¤ćN3ô‰˙ßťKÄ©RĄR”¤©RĄJ•JR”®IxD¨ž“‰RĄkRż¦µ˝)J[ČR”Ą-ZÖĄBtBwŞjŐ_őx^…Z«_ÓúBť>öµjŐĽ[Ę"'q8ť#RęTŞR”¤©RĄőRđ•]/‰é‰RĄn%kZÖµżZµjŐ«TĄ)JRŐ­jT)HB„¦đÖđÖµ«xŞ«ÂňU«ZŢťA[Č)JZ·VńĽN8˙Ú?˙“­í­kZÖµĽďŢu8ť/ćă8θ‘"D‰ř3ţ6ó­kZÖµ­kZÔ¨•*T©RŁyßËĆ1ŚcĆ1‰$H‘""xó¬üŤókZÖµ­kZÖµ­kZÔ­kZÖĄoççĆ1Śc$H‘"DĆxłţôŞÖµ­kZÖµ­kZÖµ©RĄJ•*VµĽk|SÍŚgĆ1ŚcĆ$H‘"D‰<ąŇyóđuo«Vµ­kZÖµ­kZÖµ©RĄJ•*T­kzoź|8Ć1ŚcĆ1‰$H‘"Osžž·ÁU±bĹśc8Ć1ŚbD‰$H‘"D‰ĹîUZÖĄJ•*T©RĄJ‰á‘$H‘'ZŞ«Î1Śc‘"D! $c,YÁJRňŁĆ3ź[ŕ«AX±bĆ1ŚcĆ1‰$H‘"D‰1‹ŕUZÔ©RĄJ•*T©R˘""x1"D‰$DéUUW¶1‰$H‘DNlX±b”ĄäB„'>·ÁJŞ…‹1ŚcĆ1ŚbD‰$H‘"DŚUîUkZ•*T! RĄJ•¶$H‘"D‰ĄUZµkZ޸Ć$H‘"""t«,Xł „!NE/PDĄ(B,XĆ1ŚcĆ1"D‰$H‘"DŚU𪵭J•Bp!IRĄDDDNqŚH‘"DDéjŐ«V­ZÖń$H•˝*ŞĹŚc$H‘"F1K„Ą)J…‹1ŚcĆ1ŚbD‰$H‘"DŚU_ µkRˇBtJRT¨‰ÄNq‰8Ő«V­ZĄŕÖĄJ•ĄJÖµ­ozČ‘"D‰Ĺ‹·Ž3¤ ZÖµ­jR’Ąk[ĹU«ZÖń˝¬XĆ3•­kZÔ­JÖµ­kx•+ZµoŚŞ˝""""$Dč"TâŐ­ýŞ–©~ŰÇ:­kZÖµ©JD˝jŞřqŚcĚDD©ZÖµ­kRĄkZÖĄDDDDDFµ«Vř@!UzÄDDDDN©*V­ZŐR–żíăťZÖżÄDéUW¶1ŚcĆt‰ZÖµ­kZÔ­kRĄDDDDDN5«V­_Şô‰RĄJ—’Ö­áKZĽ$!8µů?ÄDëUŚcĆ1Śc,^‘­kZÖµ­kRĄJ•*TDDDDçZµjŐ«| W¤DDDDDD©RňjŢ\-JZúĹ^ Tµů§á:Ö1ŚcĆ1ŚbĹŠ˝u+ZÖµ­kZÖĄJ•*T¨‰ÓZµjŐ«V«¸W¤DDDDD©RĄę‚Őqµ)kZ–µ­N­!)JSÔ"'lăĆ1Śg5UW¶µ­kVµ­kZ•*T©RĄDDDçZµjŐ«V­ZĄu «Ň""""s­k[ÉM_#zĽD%B”Ą)BÂ"vÎ1ŚgzŞ«ŰZÖµ­Vµ­jT©RĄJ•*T©Rµ­jŐ«V©JZµjŐ+…U^‘:kZÖµ­jřĘ…ŚIŕ R”ˇG‰řUUW´­ďkZÔ©RĄJ•*T©RĄJÖµjŐ-R”Ą)KV­ZµjŻHť5­kZÖµzBR”s‚xÄUB9"'›ZµjŐ«V݇|Ô©RĄJ•*T©R§@Ą)JR”Ą)JZµjŐ­é˝5­kZÖ¬G BÚ¬ńßWŞ„tÉ­kZµ«V­k{o{Ö%J•IRĄJ„ę R”Ą)JR”Ą)KZÖµ¨•˘T©[Ƶ­kZÖµb”ُÖxĺoÁB8DDăZÖöÖµ­[Éo kZßď*T©Rˇ;JR”Ą)JÖ”Ą/#ZÔ©RĄJ•*T­kZÖµ­kZ±J| >§Śř‘ĄkZÖµĽëZµj—‚ň5­kZÖôŢ·´D©RĄJ—¸Ą)JR”­iZÖő%J„©RĄJ•­kZÖµ­kV! Ox=ĽÄ*ô!"DDD©ZÖµ­kZÖµjŐ)KŘ JÔ­kZÖµĽŢńĄJÖ÷”Ą)JR”­k[ŰB„!BVµ­kZÖµ«„'˝VŢ)áęBD‰*T­kZÖµ­kV­R”Ąîpo kZÖµ­ox‰Rµ­o`R”Ą)JR”Ąk[ÓˇB„!N­kZÖµb„÷Ş[Ç<ý! ĚJ•*Vµ­kZÖµ«TĄ)Kä ČśŤkZÖó­jT­kZÖ·’”Ą)JR”Ą)KÔ„!B„'`5­kZ±BSÖ‚—ŽwŻ„'uÔ©Rµ­kZÖµŞR”Ą)| Čś‰Á9Öµ­kZÖµ­kZŐ«TĄ)jŐ«V­ZĄ)z‚„!B„'`5­kV!BĐ Čťč#ÎşÔ©ZÖµ­oAJR”Ą/ąČťxkZÖµ­JÖµ­ZµjŐ«V­ZµjŐ«V­Zµ­ä„!B„!NFµ­kZ±!BĄäN H‘ŚâŻ:Öµ­kZŢJR”Ą)J_(§2Č•©ZŢjŐ«V­ZµjŐŞĽ-ZµjÖµ©RĄJ•*T!Bt kZÖ·¸„,XÎ!B'5UxÖµ­kZŢKÁJÖ´Ą)|€8ˇByT©R·šŞµjŐ«VŞŞňUUé©RĄJ•*T©RĄJÖµ­kZÖř@!bĆ1"D#’'5UyÖµ­o R”ĄkZŇ”ľ`'! Á î!*T©RóUVŞŐ«UUW…UUëĄJ•*Vµ­kZÖ·ÄV,c$ę9ŞŞĽkZÖµJR”­kZR”˝€Öňk[ĂP•*T­KÜBĄJ•9ŞŞŞŞŞŞŞ±bĹ‹v•*Vµ­kZ—ĄŞWPŞ«ĚDä•*VµUUZÖµĽ)JR”Ą)JR”˝ZÖµ­kZ•*T©RĄk{•*¸DćŞŞŞŞŞŞŞĹ‹,cŇ"""#ZÖµ­DDâŐ)JáUUy•*T­kUUU­kV©JR”Ą)JR— o á­kZÖĄJ•+xÖµ­jT©T®ŠŞŞŞĽUUUX±bĹŚc9‰Ţ""qjŐŞRŞŞő•*T©ZÖ­Z«V­ZŐ«TĄ)JR”Ą){€Ô­kR·ť5­kRĄWP‰ĹUUU^*ŞŞŞŞĆ3¬â""'hśZµjŐ«UUzÄ©RĄJ•­jŐ«V­ZµjŐŞR”Ą)JRŐ«ZŢŢ•*VĄoð"qUbĹXŞŞŞŞŞŞ«Ţ"'´â""qjŐ«VŞŞŻh•*T©ZÖµjŐ«V­ZµjŐŞZµjŐ«V­ZµkZÖđ•*T­kQŰ"qV,X…ŠŞŞŞŞŞŞ˝â"xb"'6­ZµjŞŞ÷•*T©ZÖµjŐ«V­ZµjŐ«V­ZµjŐ«V­ZÖµ­J•*T©RĄDDDńDěŚbĹB*ŞŞŞŞŞŻh‰á‰ÄâŐ«UjŞŞř%J•*Vµ«V­ZµjŐ«V­ZµjŐ«V­ZµjŐ­kZ•*T©RĄJ•*TDO NŔĆ,X„! ŞŞŞŞŞ«ŕ‰áśN-ZµUUU|*T­kZµjŐ«V­ZµjŐ«V­ZµjŐ«V­Zµ­jT©RĄJ•*T©R˘'|H‘";F1bÄ!BŞŞŞŞŞŻxśN‘‹VŞŐ^*řĺJÖµ«V­ZµjŐ«V­ZµUUVŞŐ«V­kZ•*T©RĄJ•*T©R˘vĉ!‘ÂDŚX±B±UUUUU{ÄDé9śNmUŞŞ«Ĺâ÷Öµ­ZµjŐ«UUUUUV­ZŞŞµjÖĄJ•*T©RĄJ•*T©Q;bD‰#¨H‘‹!GUUUUUUë´H‘ťwŠŞ«W‹äŢ5ŞŞŞŞŞŞŞŞŞŞŞŞ­é*T©RĄJ•IT•*"tĆ$H‘":„F,X„!áUUUUU{DDDDDH‰#Îw›Ćó ŞŞŞŞŞŞŞŞŞŞŞŻYRĄJ•*T©R©IQ™$H“°"s{UUUUUWśg$H‘"DN3®«yŢ+Wđ*ŞŞŞŞŞŞŞ­ZŞŞ«Ö"%J•*U)Já"'P‰ÍîUUUUUgLH‘"D‰1"D‰'ĆsĽo{ř5UUUUUUUUUUU{ÄDDN‚""""""'P•+Z«ŘUUUV,XĆ1‰ĉ$H‘"D‰Î1ť­Z˝/žŞŞŞŞŞŞŞŞŞŞŞŞöť…)*VµjŐtUUUUbĹŚc‘ŚH‘"D‰1""$ă8ĆqĽjŞŻáŐUUUUUUUUUUUđDDDč"""""""T©RĄJ•­ZµoAUUUUV,cĉ$H‘"F1‰"N$ăŢŻ[çŞŞŞŞŞŞŞŞŞŞŞ«ÓÎ3‘"'A*T©RĄJ•­jŐ«UUUUUUXĆ1ś$H‘"F1ŚcÄśIÓ:ßĆŞŞŞŞŞŞŞŞŞŞŞ«Ć1Śg2$H‘' •*T©RĄJ•*Vµ«V­UUUUUXĆ1ŚgBDŚcĆ1:NąůUUUUUUUUUUUWŚcĆ1‰$H‘"p‰Ćµ*T©RĄJ•*Vµ­ZŞŞŞŞ«Ć1Śc$á"DŚcĆ18‰×?*ŞŞŞŞŞŞŞŞŞŞŞłśgĆ1"D‰$BDDDDçZ•*T©RĄJ•+ZÖńUUUUWścĆ1‰Ć1Śď?ŕUUUUUUUUUUV+Ć1Śc$H‘"D‰ÓZ•*%J•*T©ZÖóUUUUWŚăĉ$cĆ3´OřŠŞŞŞŞŞŞŞŞĽÖ1ŚcĆ1"D‰$H‰ŰZ‰Q*TJŤkyŞŞ«ĹéśH‘"D‰8Ć3Á;Eă˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Blurred/images/preview.png000066400000000000000000000143771361462701300261200ustar00rootroot00000000000000‰PNG  IHDRddGLAELR V$@#D"K+B+D+K!R3A3E3I8A;D;J" U$#Z*!S*%\+(^2 N< M3"S2&[3(^<#R:'\:)^#+d$-j('`,*b)-l&/p&0n+6w2,c1/h;,b40f51j<0f;3k86yDECIIFKJSJXJG GC"LJ"KB$SC'XD([K$SI&XH(VL)ZS K[!LR$QS'XT(US*[[#P[)VZ,\]1_D-dF3kH8uU/a]/`S1eR4lV8m[1cZ6k[8nV:vc#Mj$Mn)Oc#Pd)Tc,[k$Qk*Sj-Zd0^l0\q&Ns(N{*Os&Rw'Zt*Rv)[z&Tz&Y{+Rz*[s1\|1U|2[~8^`.`c2bd7ic9mk3do6hk:kc’f<…`?};‚HCŠFF—FS›YE‡VG—VTšHG¦HM´GZŁIPąWK§VMłYT¦LbŞVdŞWi˛[r·gHhH—kPŚjU•zHuI—rQŚuY—hLĄcN°hR©l]°sK¤wS¨w]±laź{aťff¨gg´fuşye¨yh¶wu¸izÁxyĂ€ľmÄx†É~ŽĐ„,U3Y“7Z-e9g†7v’ŰőY\şđ)Ę3v,î!/OO//0ť…éÜéw:–6?f×0Ý‘^˝z ńüłd]řÄđđ±Ěá ÂYG5ňîéő ʨ&ťQ@‡Ńž.]xëäęŃ˝{×ç_đâíý ϫhJ×guÇNc_áĂĂG†ŤD„Á˘yööp­™§ňśtÁŐő9˝ş{wőăŤÓő…gIqąĆjČرá#ĆŽ˘˘şxz>CEş jvĽ n]žëö\7ôčŐ˝—7çďÓ‡·$,ĂUëŠ&ăĆŤ×Čđ°°đ°‘aaŁÚ‡»¶)ť:uĆčäÖÉŤ˙Řą›››[77Ü n‡w_ooź>púh lŃó:Ž“*#ƆC1jÔ¨‘”XĆŁwow÷îť;sjn]đŤÜ»¸uŃŤľŢ}űôíăŃg0 ažç 2q ~tĆ……‡‡M Ł JŘđá#<˝<= 5zô¨Ńt†ŹáŐűEvéćîĘÍ˝›H÷ÎîXĂřa7÷žÝş÷ěŮ·/__ßÁ~;8ş‰ăˇŽkŤÉŁQÂDyÉĂŁç‹=Ý{ôtGÜz¸÷诼ý«˝gĎî}»c©úöőńńő÷÷ő÷őőó@TţoÂ( ćĚy›7Ťé Č/ŻŢř\óěí%ŘË˝_~ůeUd®ˇAţÁÁţÁAd|ýĄŚ·nÚĚW‘‰ŻNxmÂkÓ§Oź7gŢŰZD!BEĹë%őщŚá­w?/˙Ň·żoĐĽÁC‡•5ě§›6mćÄiŻN{ #bFÄ<ďĽóŽ2¤ŚZ±ă‚ď<ĄcĆx ď7Ćklż~^˘řöďď; (h(ü§`0Cý_ b<7ş×gĚś1ŤymúŚéóćÍ[cɒŋә;wt„:e#Ća0áxbĂĆŕÓTBĄßŔ(Ňż˙$((@ç•WĐĹÇÇG÷:03yóç-\¸pٲeK—.gň\t™†'7í6)|ÔČIxX„ăO ˙đ‡ @Ě-H^AŘ  Áýaţň—ó™…‹–­^¶fŮĘ•K—._űö‚ąsçâ,Śš˘€ ŁÂ´‡™4z˙ŔĂÇ>—4(h Î"ĆĐ`ô< ¦űđĂßűpţ|0ţ»ď.Z˝zőfĺĘ3d/3K1eÔ”Q¸"¦ŕk=ĚÔđ 8šă 4dČ aC‡…ü)„„0C‡RńéŻ[ż~=śő¬oý"k׬]sćě™3Ë,Ź]ě*ă &çS1gNDĤ©S§đQűóř!Æ „b¨.A\Ż>ş ë7Âaâé˙şzíÚµg:Ü™Ř,ăbćÎĺü<<‚8ó¦GLť:uâ«‘ŽŚÖ® `¸őX°űë6č7č×oذ~‘ţ]ýj=ŤĘr”Q Ţć,XđöŰ‹—,y{ ”wćĽă8}ęT{ŽK¶rĺĘŘŘXĄĽżß._Š#Á’r ×,Z˝hŃ{dFÔěč(Z•ah2ČÖ­›aô5z\55gkÎŐT_¨®®¦˘VmĹŠᅬ+vAěňŘĺ$–B—żfÝšŐP^˙đő7ßxsöěŮŃ Q Ń*ÜźaC¨Ajőµ*1shR}®Z[±ł«Î¬\K!vĹ  ÎśSăěŮukÖ­ĂńüŰßŢ#&zvBtTB´tÁÁôÝV¸Ă¨¬ąpAš Z—µgVˇ ¬†›Ćwqn˛ČG˝5{Ëě- łpEóÍcBĄżÎ°ŐPłµF_ËČĺ©úő×ÇŹŮĺŰ‚ŘP…Ë…4·K¬Â—DłElÍÍ-Ť-@Ú ~ÚríZË-Dżj…U¤I÷Dš¸BǬŠŘń­Íiu:µ0µ‚¸ÂźŢjĹăáÚÍň@ŞČ¦¨ă=důµĐ˛U`ą*h´81 «­2\HŁׯ㼠 ĄĺßżýöčŃ÷ď߻Ѧޗ֤}~;†-śX31H0W[›[ąpxGřY[Kkë­ëxČď¶×ř7ňŰăź=řńţ=µ'ü+ľgĺ\ĺŤ+†ČO[4Ó5KĺŕČńç­řóăέ;wůî—ÇŹ]Š<~đŕÇ{jOŽILܢsV´–5—ÉÄ®XŃEš8ąZΖkŇ‚Tii©ŔOť§ZŻąsçîżěÄcĚOGŽÉC€$DëĘ ^2Ŕ`Ĺ0¶Ä®Ă­ÎÖĂ\1ň~2g™łĽĽƩӧO˙Őĺ믿úâË/Oś@‘Ď@ජQŽ˝ ćG¬v{‰Ď 2ŘUCNĽ¤¬Ľěř©ňÓdNíĘW0N|qěÄg4ňňr`„Ş&bŕ•!Ś‚¸nN@Xý NÔ` Váo9t9~ü8ŤÓ_ťţęë/żţRrâġc‡>ű,/'/a'ŤW¤e 0°b”ě6‡eđŢŃGP"˙În/p8PEśż#_ţ]ľ"xiŽŠÉd7ᡠlO–Ůȡ‚5f?Ç0űě„Ń®IxE·ŹŚ|"ůšc*0Ú …xxüKšÍšóLy9Ę`~%HI L D? Möq˝°1d e*4±ZŕóŇaĺrµ÷Č–‘cÄC—ł?G#\-´"X.ů_ )T šhnű qF¦ňg‡Ín-qiĆÜěÜl8yF(¦cN^vN¶LŻ’˘5a\Č>M0·ÜHîG1S!d~žUpąŇŤEF1rŤYPĐó李-”„J2÷„FGcÉ8ż+4đ(pOJśf‹ GîŢ\c”lcV^ ´‘“łc‡ĚżCµ@@q5‘"O űńŠĺ›řČŕ±´sG¸^EhB"7‹/J9Ů0˛łwäěÂŐDN4áéREXĺ©ě߇ž»ŮQU``G”‘•,+'‹Żť;˛w ;ů’p°¶\»>ݵo—JŮ›źżGľ‘ČC{ ţź™Ü´Ü4cVVVnfWL šdk„tQŠ,›ůtß®vŔžTÍá)3 ŮĚă ¦(7monî^E ‹ÔŔ+%'…M"B¤$‡¸6›¤ć§ćç§bę=ůŰńĘNÍÎç`“ŃdĆŠŮH3ĚEŘ“ÜÜ4Ě/®”쾲Á Ůy"Tvĺ§î˛‡ĚöÔ=ů;h÷ăĂ-ä1[‹@¤íMĎMŰť•Ć*LŠ0٨˛S•IŮ™¬­V 4áéB‘Ô}©l’Š©{öäďŮÎÁ&Ůůř@6šŚvł“˙3i6[2ĚéX-lJÖîÝ"‘•‚.¬±CîZ‘”P9]@Pc×.|ű¸¶3Ú÷` ˛ĄI*bIĎH/JOKKŰ˝›Šb0¸`ś_Śdq5ń#’ „ć€ReÇ~c6˙Ü0RŔHǦĄďB&+:kw’RŔěŔ´XŞBh;OD5ůd×'4¶§JWdÁ°r{Ń„b±3Ó‘"1vGďŢťť•$M(ĐʨthňÉ'b<ĄH!-üŔµC)˛f3P%ť«…Ä“ġ„J{|«"Ň$•Ę65ýöíI’=IÂ`CöěŐšX2U*h ":):ew ~źU8ń P†«ÉÇȶÔm۶JJÚD7†Ů»×(JŠX2,06Ą§Ĺ¤ĹC%4K–”‡Ó§¸š¸…| %uŰÇ0¶©HBŃÄů32¬™Z‘h&F(~74%2ü€×Â"Cü´&,‚$ą=l¤1Ś9ĂŠýH×–+=†[ &”$:2˙N^®SE¤ ‘ŹńÇmÜţŠĆ´Fö@lJź3+::Š &)”ŠLü$R„†źŽ‰Eđß`ěŢł»˝ ‘tmµbŇÓgĄQ ŤR“šŞM®¨ńóóóűjyŃi`ŚIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Blurred/styles.less000066400000000000000000000034311361462701300246640ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #563c55; @main-background-image: "images/background.jpg"; @main-background-size: cover; // LOADING @loading-color: #ddd; @loading-text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); // LOGIN @login-color: #eee; @login-background-color: #2b333d; @login-rgba-background-color: rgba(0,0,0,0.5); @login-box-shadow: 0px 2px 10px rgba(0,0,0,0.5); @login-border: none; @login-border-radius: 7px; @powered-color: #ddd; @languages-color: #ddd; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #48525C; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #fff; @folders-disabled-color: #aaa; @folders-selected-color: #fff; @folders-selected-background-color: #2b333d; @folders-selected-rgba-background-color: rgba(255,255,255,0.3); @folders-focused-color: #fff; @folders-focused-background-color: #2b333d; @folders-focused-rgba-background-color: rgba(255,255,255,0.3); @folders-hover-color: #fff; @folders-hover-background-color: #2b333d; @folders-hover-rgba-background-color: rgba(255,255,255,0.3); @folders-drop-color: #fff; @folders-drop-background-color: #2b333d; @folders-drop-rgba-background-color: rgba(255,255,255,0.3); // SETTINGS @settings-menu-color: #fff; @settings-menu-disabled-color: #aaa; @settings-menu-selected-color: #fff; @settings-menu-selected-background-color: #2b333d; @settings-menu-selected-rgba-background-color: rgba(255,255,255,0.3); @settings-menu-hover-color: #fff; @settings-menu-hover-background-color: #2b333d; @settings-menu-hover-rgba-background-color: rgba(255,255,255,0.3); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Clear/000077500000000000000000000000001361462701300220775ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Clear/images/000077500000000000000000000000001361462701300233445ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Clear/images/preview.png000066400000000000000000000017011361462701300255320ustar00rootroot00000000000000‰PNG  IHDRddG #í-sPLTE˙˙˙UÂÓ~#IDATxÚěÁĂ ůS_áUŹ 0't‹´—ÚIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Clear/styles.less000066400000000000000000000001021361462701300243030ustar00rootroot00000000000000 @spinner-background: rgba(255,255,255,.4); @spinner-color: #666; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/DarkShine/000077500000000000000000000000001361462701300227215ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/DarkShine/images/000077500000000000000000000000001361462701300241665ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/DarkShine/images/background.jpg000066400000000000000000002170521361462701300270160ustar00rootroot00000000000000˙Ř˙ŕJFIFdd˙átExifMM*@ € $,(142F;‚‡iZ02@¤1 ň¤2ţ¤4¤5 &2CanonCanon EOS 60DddPaint.NET v3.5.112013:10:17 00:38:21‚š€‚ť"'@0230¤’ ¸’Ŕ’ Č’Đ’’ ’ Ř’‘81 @  €˘ŕ˘č˘¤¤¤¤# 2012:12:25 21:05:502012:12:25 21:05:50˙µ uB@˙† 0O‰4ĽS0580461916K28-75mm0000000000\d(HH˙â XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptđbkptrXYZgXYZ,bXYZ@dmndTpdmddÄvuedL†viewÔ$lumiřmeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQĚXYZ XYZ o˘8őXYZ b™·…ÚXYZ $ „¶ĎdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤ţ_.ĎíĚ \žXYZ L VPWçmeasŹsig CRT curv #(-27;@EJOTY^chmrw|†‹•šź¤©®˛·ĽÁĆËĐŐŰŕĺëđöű %+28>ELRY`gnu|‹’šˇ©±ąÁÉŃŮáéňú &/8AKT]gqz„Ž˘¬¶ÁËŐŕëő !-8COZfr~Š–˘®şÇÓŕěů -;HUcq~Śš¨¶ÄÓáđţ +:IXgw†–¦µĹŐĺö'7HYj{ŚťŻŔŃăő+=Oat†™¬żŇĺř 2FZn‚–ŞľŇçű  % : O d y Ź ¤ ş Ď ĺ ű  ' = T j ® Ĺ Ü ó " 9 Q i € ° Č á ů  * C \ u Ž § Ŕ Ů ó & @ Z t Ž © Ă Ţ ř.Id›¶Ňî %A^z–łĎě &Ca~›ą×ő1OmŚŞÉč&Ed„ŁĂă#Cc¤Ĺĺ'Ij‹­Îđ4Vx›˝ŕ&IlʞÖúAe‰®Ň÷@eŠŻŐú Ek‘·Ý*QwžĹě;cОÚ*R{ŁĚőGp™Ăě@j”ľé>i”żę  A l Ä đ!!H!u!ˇ!Î!ű"'"U"‚"Ż"Ý# #8#f#”#Â#đ$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&č''I'z'«'Ü( (?(q(˘(Ô))8)k)ť)Đ**5*h*›*Ď++6+i+ť+Ń,,9,n,˘,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/ţ050l0¤0Ű11J1‚1ş1ň2*2c2›2Ô3 3F33¸3ń4+4e4ž4Ř55M5‡5Â5ý676r6®6é7$7`7ś7×88P8Ś8Č99B99Ľ9ů:6:t:˛:ď;-;k;Ş;č<' >`> >ŕ?!?a?˘?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CŔDDGDŠDÎEEUEšEŢF"FgF«FđG5G{GŔHHKH‘H×IIcI©IđJ7J}JÄK KSKšKâL*LrLşMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QćR1R|RÇSS_SŞSöTBTŹTŰU(UuUÂVV\V©V÷WDW’WŕX/X}XËYYiY¸ZZVZ¦Ző[E[•[ĺ\5\†\Ö]']x]É^^l^˝__a_ł``W`Ş`üaOa˘aőbIbśbđcCc—cëd@d”dée=e’eçf=f’fčg=g“géh?h–hěiCišińjHjźj÷kOk§k˙lWlŻmm`mąnnknÄooxoŃp+p†pŕq:q•qđrKr¦ss]s¸ttptĚu(u…uáv>v›vřwVwłxxnxĚy*y‰yçzFzĄ{{c{Â|!||á}A}ˇ~~b~Â#„ĺ€G€¨ kÍ‚0‚’‚ôWş„„€„ă…G…«††r†×‡;‡źiΉ3‰™‰ţŠdŠĘ‹0‹–‹üŚcŚĘŤ1ŤŤ˙ŽfŽÎŹ6ŹžnÖ‘?‘¨’’z’ă“M“¶” ”Š”ô•_•É–4–ź— —u—ŕL¸™$™™üšhšŐ›B›Żśś‰ś÷ťdťŇž@ž®źź‹źú i ŘˇGˇ¶˘&˘–ŁŁvŁć¤V¤ÇĄ8Ą©¦¦‹¦ý§n§ŕ¨R¨Ä©7©©ŞŞŹ««u«é¬\¬Đ­D­¸®-®ˇŻŻ‹°°u°ę±`±Ö˛K˛Âł8ł®´%´śµµŠ¶¶y¶đ·h·ŕ¸Y¸ŃąJąÂş;şµ».»§Ľ!Ľ›˝˝Źľ ľ„ľ˙żzżőŔpŔěÁgÁăÂ_ÂŰĂXĂÔÄQÄÎĹKĹČĆFĆĂÇAÇżČ=ČĽÉ:ÉąĘ8Ę·Ë6˶Ě5̵Í5͵Î6ζĎ7ϸĐ9ĐşŃ<ŃľŇ?ŇÁÓDÓĆÔIÔËŐNŐŃÖUÖŘ×\×ŕŘdŘčŮlŮńÚvÚűŰ€ÜÜŠÝÝ–Ţޢß)߯ŕ6ŕ˝áDáĚâSâŰăcăëäsäüĺ„ć ć–çç©č2čĽéFéĐę[ęĺëpëűě†ííśî(î´ď@ďĚđXđĺńrń˙ňŚóó§ô4ôÂőPőŢömöű÷Šřř¨ů8ůÇúWúçűwüüý)ýşţKţÜ˙m˙˙˙ŰC   '!%"."%()+,+ /3/*2'*+*˙ŰC  ***************************************************˙Ŕ5Đ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?đJ(˘¤č  @--%-RŇ ZZQH)ERŇ Z-(¤Ą¤1E8SiÔ8S©´´ŠJ)( u(¤Ą†˘’”P1E-%- )E Ą c…R9Ęľ]/—VĽş<şžPć*ytÓ[1ÓLu.#ć*”¦”«E)Ą*+ŞR“eY)HRˇ˘ąŠŰ(ŮV6Rl©°ů6űRl©öRl©°îC¶“mO˛“e+äiĄjÁZiZ‘Ü€­0­X+M+H«•ĘÓJŐ‚´Â´ŠL®VšV¬¦ «•ĘÓJÔĺiĄir´Âµ9ZiZ ąZi1ZiZr)¤TÄS ¤ČH¦SL"‘h€Ša9ĘD$TdTäTl((„ŠŚŠśŠŚŠe‘L"¦"EPČH¦‘R‘M"ČH¦‘R‘M"¨dDSH©H¦LdDRRM"¨ddSH©¤"M"ĄĹ4ŠŚŠi)Ň)Ň*R)¤PDSH©¦‘LDDS©H¦LDfjCL4Ä0Ó <ÓM1 4ÓN4ÓT!¦šiĆÓÓHiÔÓTH”†–’™#h4¦’™,m!Ą4†¨–%4Ó©¦™ JCKIL‘(˘Šb (˘‚Š( BQKE0ŠZJb (˘¨AESQEŔ(˘ŠˇQT ˘Š))i(Şh¤Í¦ ˘ŠJ!¤4¦ĐKM4ęi †!¦ÓŤ4ĐKŇŇ Hii ‰M4ęi¦Ki¦śi¦™ i¦šq¦šcM!Ą4†™#M)’˘’ŠZQIE0Š(¦EPA˘’€ŇPh BQEÄ%%-%QEŇSI@„¤Ą4” 4ŇŇP! 4ŇšCL4ÓJi i¦”Ňb JZJCIKI@…˘’–€ ZJZ`”´S´RŇPIKE%Q@ E-%%´PRŃE´”´˘”RS©€ Z(´QE%´†hĄ¤ ĐiM%%Š Š(¤i(˘€ (¤ Š(¦IA˘€ŠZJ))h F ˘EsťŠ(˘Ž´‚–¤`)E Ą:”RRŠ’áJ)´áRËC…8SE8T˛ĐńNŃO Ő"Óžµ Ő-JµÔ«P͢J‚§AP ©ĐVLÚ$Č* …XŚVLŮ «1­C«QŠÉłTMŐ¨ÖˇŤjÜKPĆMUČ’ˇ‰jôIRKd‘GWbŽŁ‰*ô1Ő# 1ńGWbŠ›uv(ëTŽyH#Š­$T±ÇV’:ŐDć”Ň*™b©R:™c­L\táXÓĽş®R9Šľ]&Ę·ĺÓJT¸‡1TÇL)VĘS T8–¤U)L)VĘS Vn%)JSJU’”Ň•›‰jEr”Ý•dĄ4ĄC‰\Ä)6Tĺ)6Ô´>b ”›j}´ŇµČ Ň©ĘÓJÔŘ«¦«iĄjlUĘĺi…jÁZiZE&W+L+V Ó Ň)2ąZiZś­0­"Ó +L+V Ó Ň)2´Âµ9ZaZ L€ŠaZŠaŠL€Ša9ŠD$TdTě*2(-2*2*r*2)–H¨Č©Č¨Č ˘)„TÄSŞ(„Ši)Ň*†BE4Š”ŠiĆDE0Š”ŠiC""šEJE4Šc""ŠŠiŔŚŠi)Ň)ŚŠi)Ň)Ň*R)„PDS©H¦LDDS Hi†€#4ĂRŚŐa¦y¦bi¦ži¦¨CM6śi´É’–’¨Ci)Ô”Éi)Ć›TH†’”ŇS%Ť4†”Ňd1´ZCL‘ %-%1QLAESQEŔ(˘Šb JZ)J(˘‚Š(ŞQEŔ(˘ŠˇQLAEU(˘ŠbŠ( Bm-%i¦śi¦‚D4”¦’‚FŇSHh$m!Ą¤4ČbSM:ši’Ćši§i †4ÓM8ÓM2šJSIA"JSILAES˘ŠAK@ ( QLŠ(¦i)M!¦!(4Ph”QHhRPh¦E† IJi E%ŇRši AMĄ4†„4ÚZJ%%-%1h Ń@ IKI@‚”RRĐESh˘Š`%´PhĄĹ”QE%´””RŇPEPŠ(PÓ©´´Ŕu’”PŃEQE”†–ĐJu%!¤Ą4””( BQERQEQE’–’%-”QEj (W9¸´QE!Ž´‚–ŔRŠAJ):”R QH¤-8SiÂĄ–‡ p¦Šp©eˇâž)‚ž*޵"ÔkOZ†j‰V¦Z…je¬Ů´I’§J*ÂVLŢ$éVc^:µdÍ‘b1VŁ^1Vâ“4E…\‰jĽB®ÄµË1-^…*´+WáZ ¤Ë§Jż tŞđĄhB•¤QÍ&M }*ôQÔPĄ]‰+xŁ–r$Ž:˛‘ŇF•eş#–Rc©U)ę•(JŮDĹČ%.Ę%;m>R9Šĺ)Ą*ÎÚiJ—óŠS U˘”•›‰jER”•hĄ0ĄfâZ‘XĄ0ĄY)M)Y8–¤V)HV¬¦”¨q+ݶ­X+M)PâW1ÚiZś­4­fâUČ ÓJŐ‚´Ňµ-rąZiZś­4­CE\€­0­NVšV¦Ĺ&W+L+V Ó ÔŘ´Ęĺi…jÁZaZ’Ó+•¦«j2µ%&@VV§+Q‘H´Č¦S‘Q°¤ZdS©Č¨ŘR-2*2*v D$TdTäTdPZ!"Ł"¦"E2‘ Â*b)„S(„Ši)Ň*Š!"šEJE4Ў‘M"Ą"šE1‘M"Ą"šE1‘M"Ą"šE0#"šEHE4Šc""šEJE0Š`FE0ŠÓ¦dTfĄ5S¨Ú¤jŤ©ŚÓ HŐ¦fšićia¦šy¦šˇ 4†śi¦™#M!§RUi¤4ęJdŤ4†–Ő!¦Ó©¦™ CM§J˘XÓIJi)’%¦’™"QKI@QT ˘Š1@‚Š\QŠbŠZ*€J)i))1KE1 E-BŠ(¦ ˘Š)€QEB (˘„˘Š($i¤Ą4”!¦šq¦š ŇRÓi’Ä4†”Ň ci -!¦KšiÔÓA i¦šq¤4Čc 4ÓŤ4Ó!Ť4”¦’‚D4”¦’QLAKIKLP(¦EPi -%1 A˘L¤4´†‚D4Ph ’Š(”ÓKIL@i)M4Đ! !Ą¤ Bi§SiCM4ăM4 %)¤¦!))i((˘Š)i)h˘ŠZb (˘Q@Š( BQŠZ(´RšJJ)M%%(E”´´˘RĐŠZJZ`-”f€Š)(¤4´†€ CKHh))i(4”´”J)M%%´”QEQEŔJ)hĹ%bŠÓRR×9¸˘Š†8QH)i QJ)(¤PáJ)(©) NÚp¤Z)š) ´u'ťKś|…ă-4ËTŚŢô†ozŽrą †Za–Ş©†j—"” fZa–Ş™©†jÍČĄŃ–eަjŚËPäZlËQ™j©šf¨lµŃ–Ł2Őc-Fe¬Ű-D´e¨ĚµXËL2Ô2ÔK&ZŤĄŞĆZa–ˇ–˘X2Ó •\ËQ™jlZ‰`ÉL2Us-0ÉSbÔIĚ”Ă%@d¦)X¤‰Ě”Ă%@d¦)r•bÁ’d¨ ”Ă%.R¬X2SL•\ÉM2Rĺ‹JBő\ÉM2QĘ; ŇŞćJMôr…‹é7Ő2“ĚŁ” é»ę2“ĚŁ”dĺé Ôé ÓĺbôŇő zBôů@”˝!z‡}!zv)jiz˝!zv!jijŚ˝4µU€µ4µ0µ4µ;ňÔŇÔŇÔŇÔě‹SKSKSKUXL&µ0µRDÜÔliI¨Ř։،j&4ć5ŃŘÖ4ÂiI¦Z"&’‚i*Ä-ÜŃšu¤Í bćIš(R3IšbŇ %2X†šiM4Ő"D4†”ҲD¤ ŇS$CE™¦!i3Iš3LBŇRQšâćŚŇf“4ĹqsIšJ)Šâć’šLĐMĹÍ%„ÓĂ4™˘’™7“4f“4Äf’’™7 (Í%1\ ¤˘’™!šLŃE1%”É’ŠJ.i(˘!4IL@i¦”ÓM2†šiM!Ş!Ť¤4´ÓL†”QT ˘Š(´ ÓE-J) ŇĐ1Ô´Ú\Ň´´”P;‹IEŠ3Išb CE!¦  ŃHiCIKIL‘ 6śi¦™"SM8ÓM11)¦ťM4ÉÓiĆ›LBQEÄRf–(¤ĄRŠJ) Z(Í %S4”QL¤4´Ú) b›KI@¤Ą4”Ä”´”RZCLAES (˘Š( %SĄ¤˘€Š(¤ Ą¤˘%`%Q@éi(¬ŤEĄ¤ RŠJZC–RŠCRŇRŇęZhĄ†8RŠm-!ŽĄ¤Ą%˘š)EICĹ(¦ŇRR)i˘”E!ŕÓ…2”’Ó$ś F)ŔÔ˛Ó$ž D <†h™(4đjiŕÔ4j™:š‘Z«R¨hŐ2ʵJ­UUŞEjÍŁDËŠő:ITUęUzÍŁDÍ’¬$µš˛TË%dŃW5j°“{ÖJKS¤µ ×IýęÂOďXé5N“{ÔX ”źŢ§KŹzĆIýętźŢ¬m%Ç˝N—ő“ÔëqďLžSi.=ęe¸÷¬U¸÷©VăŢťÉĺ6–ăŢĄ[ŹzĆ[Źz•n=éóČl­Ç˝<\{Ö:Ü{Ô‚ăŢ«žC`\{Ó…Ç˝d Źzx¸÷§Ě.CX\{ÓĽúĘá?˝ÁČiůţôľ˝fyţôľ˝.aň>˝!šłü˙zO?Ţ—0ů ćji›Ţ¨™ýé¦z›•Č^3S ŐHĎďL3TÜĄéšfŞfozaš¦ĺ( ÔĂ5S3{Ó Ő%(— ŢôĂ5S3SLÔ‹Q-™i†Z¨e¦jJQ-i†ZŞe¦iX®RŃ–eŞĆZa–‹bÉ–šdŞĆZa–•‡bÉ’dŞćJa’—)V,)¦J®d¦(ĺ‹&Ja’«™)¦J9GbÁ’ÉUĚ”Ó%Ł,) •_̤ó(ĺÁ’ÉUĚ”›čĺÇ™IćU2“ĚŁ” eę·™G™G(‰ËҨ<ĘO2ŽP'/H^«ďŁ}>P'ßM/PoŁ}>P&ßH^ ßIľŽP&/IľˇßFú|ˇr]ô…Şôo§Ę$-HZ˘ÝHZť‚ä…© Te©ĄŞ¬+Ź-M-L-M-T‘7ZZšZZ­"[ŤFM©…ŞŇ!°&MÓI­&ŕM&i ¤ÍU…qŮŁ4ÜŃšăłFiąŁ4‡qÔf›š3E…qsIšLŃšvšLŇf¨›¤4M&™ M6–’¨BCE%Q!IE%2BŚŇRSąŁ4”f\(Í&i)Šâć“4Rf\ZLŇfŠdÜ3E&i3LW4™¤˘®RIL‘I¤˘Šb J))3IA˘ E”É 3IEP‚Š3I@4f’Šb CFi))¦”Ói’ŔÓM)¦šd04ÚSITH†Š É )3ILC©i´´´´”P1ŮĄ¦ŃšCKMÍ.hąŁ4™Ł4QFi)\ŇQIš`”fŠbŃE! BCE!¦HiĄ¦šdi )¤4Ä4ŇRšJd‰A˘Ó QE-Q@…˘’ŚŇhŁ4f’Š) -%0ŇZJ%%-%0’”ŇP(˘‚’”ŇP ¤4´”Ŕ(˘Š`!˘EQE6ŠZJ`QE-Q@‚’Š(RRŇPE”Ŕ·KMĄ¬MĄ¤Ą bĐ)- –’”R´˘›KHc©i)jF:”SE-!Ž´ÚPi:”RRÔ”8Zm(5# :™NŠ 8S)A¤Zd€ŇLś IiŹž F 8†Zd€Ó¨Á§RѢd ÓÁ¨A§PѢdÁŞ@Ő\xj†Ť,«TŠŐT5HˇŁE"Ň˝J˛U0ő zÍĵ"ęÉS,•A^¤Y*KLĐYješł–J•e¨qÍ%š¦Y«-e©VZŽQš«?˝JłűÖRÍR¬Ő6¬łűÔ«?˝d¬Ő"ĎJÁc]n=ęE¸÷¬…žĄYč ëqďR ŹzČYéâz”×ôńqY"zxźŢ€ĺ5…Ç˝<\{ÖHźŢž'÷ 9MAqNóýë,OďNóč)ĄçŃçÖwźGźH|¦‡źďHf¬˙;Ţ“Î÷¤>Rů›Ţf÷ŞFjišůK¦ji›Ţ©©¦j ĺ.˝é¦j¦f¦iX|ĄĂ50ÍU ´Ó-*Ĺł-0ËUL´Ó-+ĹŁ-4ËU ´Ó-‹FZi–Ş™i¦J9GbŃ–šeަJC%>Q– ”Ó%W2SL”r`ÉM2Te4ÉG(ËJi’«™)7Óĺs%!’ ßMßG( ”†JŻľ“} XßIľ ßIľŽP'ßIľ ßIľź(‹e&ú}&ú9@śÉIľ ßIľŽQď¤ßPo¤ßG(®XßIľ ßIľź(\ź}&ú‡}&ú9Ermô›ęô›čĺÉ÷Ňo¨wŇo§Ę&ßIş˘ßIľź(®KşšZ˘ÝIşź(®JZšZŁ-M-MDWZšZZšZ­"ZZšZšMZD68µ4šiji5V&ăłFi™Ł5V ŽÍ¦ćŚŃ`¸üŃšfhÍ+ăóFi™Ł4XWšLÓsFiŘWM74™¤Í; âŇf“4™¦+ŠM4ŃšLÓ&ŕi(Í!ŞĂ4”RL›…&h˘®”Rf\ZLŇQLW ŃIE2nf“4”ĹqsIFi(ĹÍ&hÍ%2BŠLŃLAšLŃE1!Ł4”Ä-%”)(˘‚’ŠJb4”QLAIš)($))i¦€Ň))’!¤Ą4•Di(4S$JCKILBQEÄ-”SęZm c¨Í&hÍ E% Z)(¦ćŚŇQ@h¤ÍÄRQš)(Í%1%PH†šii)CM§m1i)M!¦H”†–Ó˘Š(Qš( ˘’ŠZ)( ¤˘“4´”Rf€ŇQI@RS4”Ph”QE0IJi(RRŇS˘ŠCLŠ( Š)((˘Š`´Q@‚’Š(QE%QA ˘Š)jŠJZÄĐZZm-:–›KHbŠZJZ@-- ˘Ç Zm-!Ž´ŃKHc…-6ťHˇiŔÓ;4†:–›šZ’‡J)´ą©điA¦ŇH¤<Pi€ÓłRZcÁ§QN¤¤É§QJ M‹L”p54ŕjZ4L”pjp5-™0jpj„pj†‹R' O UĂSĂT´h¤XRŞˇ©áŞKR-©J¨žˇÄĄ"ŕ’¤Y*zx’ĄÄ»—„µ"ËT”ń%G)W4Z‘f¬ń%Pą>úBőúMôůErmô›ęô›čĺ “o¤ßPďŁu>Q\›}&ú‡u&ę9BäĹé7Ô[é7QĘ+“o¤ßPîŁu>Q\—u&ú‹u&ę9Ermô›ę-Ô›čĺÉwŃľˇÝFú9ErmÔ›ęÔ›¨ĺÉ·ŃľˇÝIľŽQsn¤ÝQn¤ÝO”\Ä»é7T{©7Sĺ'µ!jŹu4µ>Qs¦–¦¦–ޱ-Ź-M&ZµU¸âi3MÝIšvÇfŚÓ3FiŘWš3L͢øüŃšfhÍ ŹÍ¦f“4XW$Í&i™Ł4X.;4f›šLÓ°®;4™¤Í&h°®.i3Iš3LW4Ú)3LW’“4”ɸą¤Í™¦+‹IšLŃLW )(͸RQšJb¸ą¤˘“4ɸ´™¤Í3E™¦+†h¤ÍĹpͤÍ)(Ł5@”RP!i(¤¦ ˘ŠJb (¤4QIL@i´´”ÄĐi)’!¤4´†™"RZCLBRRšJd…QLAESQE´f’Š.hÍ%ěŃšm Í™Ł4ŔZ3II@ šJ(Í1”f€ iĄÍ%1%†‚D4†”ŇS†ŃA¦!))i)€QE)(˘€ (¤ Í”SŁ4”f Iš)(˘Š)€R)(¤Ą4”(˘Š`!˘”ŇP ¤Ą¤¦Hii)€QERZJJ(Ą¦E”(˘@„˘Š(¤˘Š`QEYĄ¤˘±4–Q@Ą¦ŠZ@--%-–›J)áKMĄ¤1ii-!Š :™J) }-6–ŧSh©(x4´Ęp4†;4ą¦ŇŇ(x4 Ó§f¤«ŹĄ -II’J 0Pi™ 4ŕj0iA©±I’N˘ťš›™ 4ŕj iŔÔŘ´ÉA§¨A§JĹ)§¨CR†©±jDá©áę¸jpj‹¤XOUSTص"ČzxzŞś§”Ą"Řzp’އ§©ĺ-2Ř’ž$ŞaéáęyKL¶$§‰*zxzžRÓ. )âZ¤$§‰)r–™tKNŐ!%Pąc̤ó*ľúMôr…ÉĚ”…ę ô›čĺ “—¤/Po¤ÝO”.Oľ›ľˇÝIşŽQ\›}&ú‹}&ú|ˇrmô›ęô›éŘW&ßIľ˘ßIş‹ÉwQľˇÝFę|˘ą.úMŐę7S°\—u&ę‹u©ňŠä»©7T[¨ÝG(®IşŤŐę7Sĺ ’nŁuEşŤÔrŠä›©7T{©7Qa\—u&ęŹu&ę|˘ą&ęMŐę7QĘ+’n¤ÝQî¤ÝG)7%ÝIşŁÝIşŽQ\“uŞ=Ô›¨ĺÉwRn¨÷Rn˘Âć$ÝIşŁÝFę|¤óÝIş™ş“u; yjMÔĚŇn§by‡¤Í74™§bn;4™¦ć“4ě+ŹÍ¦fŚŃa\vhÍ34f‹Çć—5hÍ ’f“4ĚŃš,.aůŁ4ĚŃšv ŹÍ&iąŁ4X.;4f™š3E…q٤Í&i3NÁqÔ™¤Í%Çf“4™¤Í1\Z3IšJqhÍ&i)Šâć’ŚŇSĹÍ&i( W )3FiŠáš3IE1\3E% W )3E1¤Ł4ĹpÍ”SŁ4”P ˘’Šb (˘ E”Ä”QLBQE! @i( Ó$JiĄ4†¨AHii($CIJi)(˘Šb (˘4RQ@ Fi(¦ŃIFh˘ŚŇf E% Í%¤ÍŚŇQ@”S¤4fŠ”CLBJSI@„ ŃA¦!))i 0 CKHhQE”QE0 J % (Ł4RQEQILŠ) QE1Q@¤Ą4”))i)€RRŇS˘Š())i(Ą¤Ą¦ ¤˘Š”´”Ph¤4QEŔ(˘ŠłEV&‚ŃIK@ KMĄ ´”´€ZZm-E%- –›KHc©i´´†--%†>–™š\ŇęZnijF8p4ĘPi>”fii ~iŔÓĄ¤«ŹÍ.i€ŇJĹ&H (5iŔÔŘ´Çć”fisJĹ\“4 ÔyĄÍ+™ 4ŕj,Ó©±I’N˘Í(4¬Rd ÓT Ó©±i’†§¨A§©±i“§¨§©±I“†§¨SR±i“†§Şá©ÁŞlh™`=8=W N SbÓ,§‡ŞÁ©Á©XŃ2Čzpz¬ś—)i–wÓŐ`ô»éX«–wŇďŞÁéwŇĺ*ĺŹ2—ĚŞű¨ßE‡rĆúMőú7Ó°\ź}&ú}č°\›}&ú‡u¨°\›}&ú‡u©ŘW%ßIľ˘ÝIş‹ ä»é7T{©7Q`ć%ÝIş˘ÝIşť…ĚKşŤŐęMÔX\Ä»¨ÝQn¤ÝNÁĚKşŤŐęMÔě.b]Ôn¨·Qşť…ĚIşŤŐę7Q`ć$ÝFęŹu©Ř\Ă÷QşŁÍ˘Âć$ÝIş™šLÓ°sn¤Í3u&ę,.bMÔ›©™Łu; vhÍ34™˘Âć$Í&i™¤Í0üŃş™šLÓ°ą‡î¤ÝL͢¸üŇf™š3E‰¸íÔf™šLŃa\~ę7S7Rf‹qů¤Í34fť…q٤Í74™˘ÄÜvi3Mͧa\vhÍ34f‹ ăłFi™Ł4XWšLÓsFiŘ.;4f™š3E…qůŁ4ĚŃš,šLÓsIš,š3L͢¸üŃšfhÍ ŹÍ¦fŚŃ`¸üŇf›š3NÁqŮŁ4ÜŃšqsFiąŁ4Ţ›š)Šâć“4Rf\\ŃIšLÓĹÍ&h¤¦+‹š)3IšqsIFi)ŠâŃšLŇPŃIE1\\Ňf’Š`QE ))3@…¤ÍS˘’Šb J( @i´´”Ä”¦’„¤Ą¤¦HRPh¦!)(˘QLAIJi)(˘Š`”Q@‚ŚŇQ@h˘“4ŔZ3IE˘Š)(¤Í´”Q@%˘„¤Ą4†€E A˘LBPh˘€Š(¦!(˘ŠCE’%P ¤Ą4”QEŔJ(˘€ J QEÄQEIA˘€ JZJ`”´”Ŕ(˘Š(˘’€ S$J( ĐQERRšJ(˘Š`QEXĄ¤˘˛4”RQHĄ”P¨¤Ą¤ŃH)hii( c©i´´€ZZm.i u-6–ĹÍ-6—4†;4 ÓhÍ!ŹĄÍ74ą©ěŇć™KšCš\ÓsKHˇŮĄÍ4\Ň*ă§f™š\ŇÇć—4ŔisJĹ\~isQćťš›qůĄÍGš\ұW$—4ĚŇ敊¸điŔÔyĄ•ŠLPj<Ó©±I’J F 8V-2@iŔÔ@Ó©±i’N QN•Ť% N PN¦Ĺ¦L”5D (jV4L585B”5+¤L”5Cş—u+ĚMş—uCş—u16ę7T;¨ÝE‡ĚMşŤŐę7Q`ć%ÝFę‹u¨°sî¤ÝQî¤ÝNÂć%ÝIşŁÝFę,Ä›©7T{¨ÝE…Ě?uŞ=Ôn˘Â溍Őę7S°ą‡îŁuGş“u1&ę7T{¨Í;0ýÔn¨÷Qš,.bMÔn¨÷Qšv1&i7S3IšvbMÔfŁÍ§asͦfŚŃasͨóFh°sͦf“4ě.bLŇf™š3E~i3MÍ&iŘ\ĂóIšfhÍ0ěŃšni3E…Ě;4f›šLŃa\vhÍ34f‹ ăłIšnhÍ;q٤Í74™˘Â¸ěŇf“4™˘Â¸ěŇf›š3E‰¸ěŇf›šLÓ°®;4f›š3E…q٤Í74f‹ ăłFią¤ÍÇć“4ÜŇf‹ÇćŚÓ3Fh°®?4™¦ć“4ěš3L͢ÁrLŃšfhÍ ŹÍ¦fŚŇ°\~hÍ34f‹ÇćŚÓ3Fh°\vhÍ74f\vhÍ74fť‚âćŠm âŃšJ3@\\ŇRfŚÓŠ3Išqi)3Fi€´RRf€4RQLBŇQIš`.i3E(˘“4´”RS´”RSRQEQILAIE% (¤¦ 4”´†„˘Š)(˘Š J(¦IKILAIJi(˘ŠJ`QE )3E0 (˘€ (¤Í“4QLŃšJ)(˘%)¤¦EP!(˘ŠCE)¤¦! ((˘Š`%%)¤ @i)M%”´”Ŕ(˘ŠJ(˘€ (˘‚Š( 4QE JZJ`”´”Ŕ(˘Š))h ˘Š)’%Š %Š %QLŠ( Š(  QEdX˘ŠJZQE%- ŠJZ--%€ZZJ(ii( c¨¤Í€visMĄ¤1isMĄÍ!ŽŁ4”Rę\Óii u-74´†;4ą¦ćŠCšZ`4ą¤PđisLÍ.iăóKšfiiăóE34ą¤UÇć—4ĚŇćî?4ą¦KšE\~iŔÔ`ÓłJĹ&?4 ÓĄ¦Ĺ¦H .i™Ą•ŠLPi€Ňć•‹LPj0iŔÔŘ´ÇNÍGš\ұi’N˘Í8V-H“4ą¨óKšV+“4»Ş,Ňć‹ĚKşŤŐę3E‡ĚKşŤŐę7QaónŁuGš3E“uŞ=Ôf‹1&i7TyŁ4X\Ä›©7S3Fęvaű©3LÝFh°ą‡ćŤŐhÍ0ýÔfŁÍ˘Âćš3LÍ&iŘ\ĂóFi™¤Í1&hÍGš3NÁĚ?4f™š3E…Ě?4f™š3NÁĚ?4fŁÍ˘Âćš3Lͧ`ćš3L͢Âćš3LͧasÍ&iąŁ4X9‡fŚÓ3FiŘ\ĂóIšni3E~i3M͢ÂćšLÓsFh°®;4™¦ćŚÓ°®;4™¦ćŚŃa\\Ńšni3E…qŮŁ4ÜŇf‹qÔ™¤Í%Çf“4™¤Í; ăłIšLŇf‹ ăłFią¤Í ŽŁ4ÜŇf‹ ăłFią¤ÍÇfŚÓsIš,+ŹÍ&iąŁ4X.;4ą¦fŚŃ`¸üŃšfhÍ ŹÍ¦f—4¬š3L͢ÁqůŁ4ĚŃš,š3LÍ.h°\vhÍ74f€¸ěŇf“4f‹Ţ›š3@®:ŚÓh¦4RRf€¸ęLŇfŠâŃII@\Z3Iš)Z))(h¤ÍŔ(¤˘ šJ))€ą¤˘Šb 3IEIE%QE1!˘’‚’–’RSą¤˘Šb (¤¦E”(˘’€ (˘‚’Š(˘ŠJ`-%P ˘ŠJ`fŠLĐIE(˘’Q@‚Š)(˘Š(4”)CEŠ)(˘i)M%IKI@%-€Š(¦QE(˘Š`QE%Q@‚’–’!Ą¤4Ŕ(˘Š(˘ŠJJZJb P!))i)€QEQEQE±EVFKIE--%´P(¤ŇÓih´´”Rh˘ŠZ)3K@ E%-!‹šZm.i u™˘Çf–›š) visMĄÍ šZm.i visM˘‚‡ć–™š\ŇěŇ曚ZCšZfiiXcłJ 74ąĄb‡S¦KHwšPi€Ó©X«ŽÍ;4ŔiAĄbÓ .i´ Ň±IŹ—4ĘPjlZcóNÍ34 Ň±IŹÍ.j<Ňć•‹ą&isQć—4Xw$ͦf—4¬W0üŇćŁÍ.h°ů‡ć—5isE‡Ě?4f™š3E‡Ě?4f™š3E~hÍ34f‹ ~i3MÍ&h°sͦfŚÓ°sÍ&ią¤Í0üŃšfi3E…Ě?4f™š3E…Ě;4f™š3NÂćš3MÍ&h°ą‡ćŚÓ3FiŘ9‡ćŚÓ3Fh°ą‡fŚÓsFh°sͦćŚÓ°ą‡fŚÓ3Fh°sͦfŚÓ°sͦć“4X\ĂóFi™Ł4ěĂóIšnhÍ0ěŃšfhÍ;0ěŃšnhÍ0ěŇf›š3E…q٤Í74f‹Çf“4™¤§a\vi3IšLŃa\vi3IšLŃa\vi3IšLŃa\vi3IšLŃa\\ŃIšLŃa\u&i)3E‚âćŚŇf“4XW4f›š3E…qsFiąŁ4ě+ŽÍ&iąŁ4X.;4f›š3E…qŮĄÍ34f•‚ăóFi™Ł4Xwš3M͢ÁqůŁ4ĚŃšV ŹÍ¦f—4X.;4f›š3E‚ăłFiąŁ4X.;4f›š3E‚ăłFiąŁ4X.;4f›š3@\vhÍ74P4RfŚĐ4f›š( ŽÍ%%Ţ’ŚÓĹͤÍ%-¤˘¤ÍQE&hfŠJ)3E†€ ŃIE1RSQEÄ”Q@”SQE%QILAš(˘€ J(¦ ˘’Š(˘’€’ŚŇSi(˘”S˘Š(QE%QEQI@‚Š(¦(˘€Š(¦RRŇP  ŃA  ŃA ˘Š)€”QE (˘Ph”QE0ŃA˘%-%QE†–’€Š(¦ ¤Ą¤ AIKILŠ( Š( Š( EŠ(˘˛4 (˘€QIJ(Ą¤˘ EPŇÓis@ĹŁ4QH˘’ŚĐć–’Š\ŇÓisHbŇŇQHcłE%.i ZZm.hÔRQšCš\Óii u¤ĄÍ!‹KMĄÍšZm-+ p4´ĘZV(x4´ÚQ@ÇJ 6”’điA¦S…+‡N¦f”V.ăÁĄÍ34´¬UÇć—4ĚŇ敊¸üŃšnhÍ+ăóKšfisE‡qŮĄÍ34ą˘Ă¸üŃšfisE‡qŮĄÍ34f‹ăóFi™Ł4X.?4f™š3E‚ăóFi™Ł4X.;4f›š3E‚ăłFi™Ł4XWšLÓsFh°\vhÍ34fť…qŮŁ4ÜŇf‹ ăłFią¤ÍÇć“4ÜŃšvÇfŚÓ3Fh°\~hÍ34f‹ ăóFi™Ł4ěšLÓsFh°\~i3MŁ4ě+ŽÍ¦ćŚŃ`¸ěŃšfhÍ;Çć“4ÜŃš,+ŽÍ¦ć“4X.?4f™FiŘWš3M͢Áq٤Í74fť…qŮŁ4ÜŃš,4f›š(°®;4™¤¤ÍÇf“4™¤Í ŽÍ&i3EĹÍ&i(Í; âćŚÓsFh°\\Ňf’Š,+‹šJLŇf‹ ăłIšJLŃa\Z)3Iš,4f“4™˘Â¸ěŃšnhÍ ŽÍ¦ćŚŃ`¸ěŃšnhÍ+ÇfŚÓhÍ ŹÍ¦ćŚŇ°\vhÍ74f‹ÇfŚÓsFh°\visL͢ÁqôS3FiX.?4f™š3E‚ăóFiąŁ4X.;4f›š3E‡qŮŁ4ÜŃš,š3MÍ .;4f›š3@\vhÍ74Pš3M˘€4f’Š`Ł4Rf€’Š(QIE”Qšb 3IE0 (Í%1 šJ( AIEŔ(˘’€ (¤¦ ˘ŠJ(¤Ł4Ä-%”´”f’€4”Q@‚ŚŇQLŠ(¦E%\ŇQEQFhRfŠ)€QE%QEQI@RS¤Ą¤ AA˘’€ J(˘ EP ˘Š)€RZJQE0Š(¦IKI@Q@i)M%QE1%-%IJi)€QEQE(˘Šž–’ŠČ±h˘ŠQE-”´Rć’ŠZ))sHŁ4”P¨¤Ł4†-˘ŠZ)(Í;4RQšCKšm-–š)i u”RÔą¦ŇĐ1ŔŇÓii ZZJ)ęZm- N¦ŃHcéi˘–•ŠKM˘Ž–›N©*㥦ŇHˇÔą¦Ňć‘Wš\Ó)h°î;4ą¦ćŚŇ±Wš\ÓsFh°\visM͢øěŃšnhÍ+ăóFiąŁ4X.;4f›š3NÁqŮŁ4ÜŃš,šLŇfŚŃ`¸ąŁ4ÜŃš,š3M͢¸ěŇf›š3E‚ăłFią¤ÍÇfŚÓhÍ; âćŚÓsFh°®;4™¦ćŚÓ°®;4f›šJ,šLÓih°®;4f›E;ÇfŚÓh˘ÁqŮŁ4ÜŃE‚ăłFi´™§`¸ěŃšnhÍÇf“4™¤Í;ÇfŠnhÍÇQšnhÍ0¸ěŃšni( ŽÍ¦ćŚŃa\vhÍ74f‹ĹͤÍ&iŠă©)3Fh ‹š3MÍ âćŚŇfŚŃ`¸ą¤¤Í WŚÓsE ‹šLŇfŚŃa\ZLŃIš,+‹IšBh˘ÁpÍ”f‹(Í%§`4f›š3E„;4™¦ćŚŇ°Í¦ćŚŃ`š3MÍ.h° š3Iš3JÁqsFi3Fh°\\Ň曚LŃ`¸üŃšfhÍ ŹÍ¦f—4¬š3M͢ÁqůŁ4ĚŃš,š3LÍ.h°î;4f›š3JÁqŮŁ4ÜŃš,š3M͢ÁqŮŁ4ÜŇć‹ÇfŚÓsFh°î;4™¤ÍĹŁ4”P4RfŚĐ Ł4”PE¤¦ć’Š)(Ł4™ ¤˘Šb (¤ Š)(¤Ł4SRfI@QL’Š(QE%.i(˘f’4QEQIšZLŃE1RPE”´RQš`QšJZ)3ERQ@‚ŚŃI@Q@%-%0 ( Đ!(˘Š`QE”¦’QL˘Š)€†Š QE””QLŠ( AIKI@€ŇRšJ`QEQEQE'˘Š+"–’ŠZ(˘…Q@-%´Qš(hÍ%€Z(˘€ŚŇQ@ÇQIE –’ŠZZJ(ę))i´´ÚZ--%-!‹KM§P1ii(¤1iE%-!‹KIJ(˘–RҢťMĄ¤PęQMĄ¤1Ô´ÜŇć‘BKMĄÍ!Üviią˘Üvii´fî;4ą¦ćŚĐ;Ž˘›šZ,;ŽÍ¦ćŚĐš)ąŁ4ÇfŚÓsFh ŽÍ¦ćŚĐš3MÍ ..h¦ćŚĐ+Ž˘›š( ŽÍ&i)3@®;4™¤Í¦Šnh W4f›FiŠâćŚŇf“4XWE74fť‚㨦ćŚĐE74f‹ÇQMͦE74f‹ ă©)3Fh°\Z3M˘ť‚ăłFi´f\\ŃšLŇf€¸ěŃšnh¦+ŽÍ¦Ń@\\ŃšLŃšâćŚÓsFh ŽÍ&i3FiŠâŃšnhÍqÔf›E¸ąŁ4”P ŃšLŃšbŠLŇf‹´f’Š,š)(ÍQšJ(°¤˘i3E ŠJ(° šLŃEfŚŃšLҰĹͤÍXͤ¤ÍěŇf“4f‹ąŁ4Ú\ŇsFiąŁ4XfŚÓsKš\Ň曚3@‡fŚÓsFhěŃšnisJŔ.isMÍ fŚÓsFh°\vhÍ74f•‚ăłFiąĄÍÇfŚÓsFh ŽÍ¦ć–€¸ěŃšm‚ăłIšJ(hÍ%Ŕ\ŇfŠ(˘“4S˘Š(QE&hi(˘€ JZCLŠ( BJZJ))M%0 (¤¦Ef%PE™¦ŇfŠ3LAE&h 4QI@ IE%-”P ˘’Š`.h¤Í%-¤˘€4”Q@QLŠ)(˘Š(¤4´”(˘Š`QE!˘E (˘ EŠ`!˘E”´””QE0 (˘%-%IJi)€QEQEQEžŠ(¬Ë (˘-%´RfŚÓ´Rf—4€(˘Š\ŃIE-Q@ š)(¤1hŁ4Pć–›K@ KMĄ Ą¤Ą¤1iE4RĐŇŇRŠCRŇRĐ1E-%-!‹@¤´†8QH)h´˘RŇ´´‚–‘BŇÓihę)(Í!ŽÍ-6ŚŇę\ÓsKš.isM˘•‡qôSsFh ŽŁ4ÜŇćÜ\ŃšLŃšâć—4ÜŃšăłIIš3@\Z3Iš3@\\ŃšLŇf\vhÍ74f‹Ĺͤ͠.-ÜŃšqhÍ74f®;4™¤Í&h ‹š3IšLÓÇfŚÓsFh ‹š3Iš3LWŠnis@\\ŃšLŃš\ŃšLŃšvhÍ74f®.hÍ%&h ŽÍ¦ćŚĐ4f’Šb¸ą¤Í™ ..hÍ&hÍqsE&hÍ1 E&i3@˘›FhÔ™¤Í Í¤¤ CłIšJ3Lͤ͠˘’’€ŚŇQLBć’ŚŇf€ŚŇQšB 3IE0 )3EQIš-&h˘€ )3E-%%€Z)(˘Ŕf“4f‹´””PŃšJ3@…ͤͤćŚÓhÍ;4f›š3@ͦćŠvhÍ74f‹ěŃšnhÍ?4f™Kš@;4f›š3@Í.i™ĄÍ!ŽÍ¦ćŚĐóFiąŁ4¬łKšnhÍ;4f›š\Ń`4f“4PŃIšLÓÔSsFhsE&hÍ-”PŃIE˘’Š(¤˘€ (˘‚’ŠJ( ŇS˘ŠJZJ))ZLŃERQLŠ( ŠLŃ@4RQLŠ)(i(˘€ (˘RPŃIEQEQEQEIEŔ(˘Š(˘Š!˘EQE0ŃA˘h Ń@!Ą¤4”QE0 (˘%-% JZ((ĄĹ&(˘Š(˘Š)5QYŚ(˘Š-”f€Š( Š( aFh˘€ŠJ\ҢŠ(h¤ĄÍ´”R´RRĐŇÓihii)h´´”˘€QH)i Zu6ť@ĹĄ¤ Rii)i QKM˘‹KIJ) ZZm-E&ii ZZm¤1Ô´ÚZ-¤Ł4 vhÍ&h¤š3M˘ÜuÜŃš㨤͢Áqh¤Í˘Áqh¤Í˘Áqh¤Í&h ŽŁ4ÜŃE‚ăłIšJ(°®.hÍ&i3@\\ŃIšLĐ+ŽÍ&i(¦4™¤Í W4RfŚĐŠnhÍ1˘›š3@\uÜŃš`:ŠnhÍE74f€E74f€IIš)€ąŁ4””vi3IFhsE&i(hÍ%Ä.hÍ% Í¤Í¦ŃIš3@™˘€ŠJ(hÍ&hÍ4f›Fi€´RfŚĐćŚÓsFhsE%\ŇfŠ(˘“4PŇfŠ(RPi(sE%Ŕ3E%¤š3IE.i(Ł4QIš(sIE¤ ˘’Š3Fh¤Í-&h¤Í.h¤˘ Fi( Í¤˘€4ą¦Ńšvh¦ćŚŇŮŁ4ÜŇĐ1٢›š\ŇisMĄÍ-.i´ą¤ŇÓihsFi3EE6–€ŠLŃš-™˘€ŠJ3H˘“4f€ŠLŃš %-% (˘€ŇRŇPi)i(4”¦’h ŃL4Ph¦ ¤4´†€ (˘€ J))€QEQE%QEQILŠ( Š( Š( AEPEPEJ(˘Q@Q@€ŇRö¤ Š( 4Ph¦(4S¤4´Ú(˘Š`QE JZJQEQE (˘€ (˘€$Í-%% ER˘Š(Qš( ˘’–€ (˘€ (˘…-%´QE ZJ(´´”PŇŇRĐJ(Ą  R QHbŇŇRĐ1E- Ą¤ŇŠJQ@Ĺ Q@¤1E-%-ŠJZ@-”´†-.i´´ ZZm-!‹Fi)hhÍ% \Ňć›FhÔf›š3@\vh¦ćŚĐš3Iš3@\\ŃšLŃšqsFi3FhĹͦćŚĐš3MÍ ..hÍ%%q٤Í&h͸ąŁ4ÜŃšâćŚŇRP+ŽÍ&i(¦4f“4f š3Iš3@ š3Iš3Lͤͤ͠˘ š3IE.hÍ%Ŕ\ŃšLŃš(Ł4”´f’ŚÓsIšJ(ąŁ4™¤Í;4””ShÍ%ąŁ4”P!sIš)3@ š3Iš3@ š)3Fhh¤˘ E6Š`.hÍ% Í”PŇQšLĐćŚŇfŠ.i3E%.h¤Í¦Fi( Š(Í 3IEQE )3E (¤ ¤ÍPIA¤ Aš3E% ŠLŃ@ IIE-™Ł4´´Ú(Ôf’ŚŇsKMÍ-.iiąĄ Ł4™Ą¤ŃšJ3@Í”PłFiąĄÍ —4Ú(ŮŁ4Ú(ÔSsKšZ)(¤ŃIKš(˘Š(˘’€ŠJ)€ą¤˘@%PIKIL’–’€ JZCLŠ( ˘Š(RRŇS(Ą˘‰EP!(ĄĹ% JZ)J)qI@Š( AEPEPEPIKILŠ( Š( AEPi(4PEP(4S )€””´”QEŔ(˘Š”´”(˘Š(˘ŠQEQEIETŚ)i( bŃE€(˘ŠQE-”f E&is@QHaKIK@Q@ ( Q@ )i uQHĄ¤Ą Ą¤Ą†(Ą¤˘Š)i-!‹EP1h¤´€ZZm-Š( Í”R°ĹĄ¤ÍąŁ4”RŮŁ4Ú(ěŃšměŃM˘€E% ˘“4f E&hÍ-”™¤š3MͦšLŇfŚĐ!sFi3I@ E% Í¦ćŠ.h¤Ł4ąŁ4ÜŃš\ŃIEŚŇQLf’’ŠZ)( fŚÓhÍ;4f›š3LfŚÓsE;4””PŃšJ(ͤͦ!h¤˘€ Ńš)3@ E&hÍ-”S´RRf€IIš3@ š3Iš3@…Í””ěŇf’ŚÓsFi3FhsE&h ¤˘’ E%´f’Š\ŇQFh˘ŚŇShÍ%QEQIš(sIEQE% ŃE%-%”´”RPE”€(¤˘€ (Í%-”PŃIE-.i3E! KMĄÍ4´ÚZ--6–€ŚŇQš@.ii´´ąŁ4”Pć—4ÜŃšuÜŇŇ٢›š\ĐŇć›KšZ)(¤ŃFhÍQEQE)(˘Š)€”RšJ))i1@%-ŔJ)i1@ E-””ęJJ)i)€RRŃ@ E-%¤Ą˘€ŠZJ`¤Ą˘€ŠZ((˘Š(˘Š) -”QE0 (˘RPEPEPQEŔCEŠ`”´””RŇS˘Š(RRŃ@„˘Š(˘Š(˘Š(˘Š(ôfŠ)´RRĐ1h¤˘ E%-!…QLŠ( Š( bŃE ZAK@-%-QKHQE--’”PŠZAKHbŇŠJQ@ŔS…6ś) QKH)i Z))hĄ¤Ą aEPŃIFię)( bŃIE-™Ą Š( Š( Š( Š)(hŁ4”´RfŚĐŃIš3@ E&hÍ-¦ćŚĐłIšJ(ą¤Í™ ˘“4PŃIE Ńš))€ą˘“4f€ŠLŃšZ)3FhhÍ&hÍ.hÍ&hÍ.hÍ&hÍ04f“4PćŠLŃšZ)3E“4”SsE%´””f š3IšJvi3IE04f’Š\ŃšJ(ą˘’ŚĐEŁ4Ŕ(¤˘€ŠJ(hÍ%ąŁ4”PćŚŇQ@Q@fŚÓ˘“4P!hÍ%QEQFi3@ Iš(¤E™ ¤˘Š) PIE IKI@%-%QI@ šLŃE.hÍ%€Z))s@ š)( ĄÍ&h ĄÍ6—4ą˘“4PŃIE:Šm€uÚZ\ŃIš3HQšm.hÔf›šZvh¦ć–ÍÜŇĐŃIš(h¤Ą Š( Š( ’–ŠJ(˘&)h bQKIŠ`Ą˘€ŠZLPIŠ\Q@ E-&((ĄĹŔJJu&((Ĺ.)((ĄŁ”QEbŠ)€”RŃ@ EPi)i)(˘Š))i(˘Š(˘Š(¤˘Š`”´†Q@ EP ¤Ą˘„˘Š((Ą˘€Š( Š( Š( ŃIE E Z(˘†ii(¤ŃIšZ`QEQEŠ( P( P( –E Š( ˘Š)˘–RŠ-(¤Ą†´‚–Ç Zm-(Ą¤Ą¤0˘Š(h¤Ą Š( aEPEPEPFh˘€ Ńš( 4fŠ(˘Š(˘Š(˘Š(˘“4PŃIEŁ4Q@‚Š)3@ E&h ŚŃE˘’ŚÓ´RfŠZJ)(h¤Ł4ąŁ4™˘€ŚÓh fŚÓihsFi´´ŔZ)3Fh´RfŚĐŃIšJ\ŃšJ)€ą¤˘ŚĐE¤ BŃšJ(sFi( Í%S˘Š3@™˘ E%´f’Š.i3EfŠ( Š( Š( Š3Fh˘“4f€ŠJ(hÍ%fŠ( Š)3@ Iš( Š)(i3EQIE”Qš@”Q@%PIEQE% ŠJ(h¤Ł4´ą¤˘€ŠJ(ŮŁ4ÜŇć€4RfŠZ)( ˘’Š@-”PŇć›Kš.ii´RŮĄ¦ćŚĐłFi3FiěŃšJ(Ôf›šZZ3IFh٢’Š@-”PŃIš\ĐEPFi( Í¤˘€4”Q@QLŠ( ĹĄ¤ÍQE%Ą˘€’ťIŠ`&(Ą˘€F)h ŃKF((˘Š`”´”QE”RŃŠJ(˘€ŠZ)€”QE JZJ`†–Ó˘Š((˘ŠQE0ŠZJ(˘Š(ĹPŠ1EbŚQE-”´RŇQHbŇŇP(h˘Š (´QE–’–…ŠZ(˘ŠQEPŠ(PŠZAKH–Q@ )i)i´ ( bŇŇRҢ”Sii u”´ Z))iQEfŚŃEQEQEQEQEQEQEQEfŠ(ÍQ@Q@RPš(˘€ )(Í0“4RP!sIFi(hÍ%ą¤˘Š(˘ŚĐE%´f’Šb4f’Š\ŃšJ(sFi(¦!sE%´RQ@ Fi( Í%PEPEP ˘’Š`-¤˘€ (˘€ (¤Í0ŠJ(hÍ%fŚŃEQEQEQIšZ)3Fhh¤Í ˘’–€ )( ˘’Š(˘Š`RQ@ E&h¤E”ŔZJ(¤IERRŇPIKI@%-%QIHŠ( Š(ÍRfŚĐŃIš3@ Fi3FiąĄÍ&h Í”P!h¤˘€ŠJ(hÍ% fŚÓsFh٢’Š@-.i´ą ĄÍ6—4ę3MĄÍ! KMÍěŇÓsE E% Í-%´RQšZ)3Fhh¤Í ˘ŚŃ@Q@Q@Q@”PEPEPEPEP11E-%0ŠZ(´b—PhĄŁ”b—””RŃL˘–’€ŠZJb JZ() -ŔJ(˘ E-%0 (˘€ŠZ((Ą˘€E- ˘—b€ŠZZJ1KE6–’Š`-Q@ E%-ŠJZ@ (Ć-QH–’–-%- ZJZ@QE(˘E--6”PŃE€ZZJ(E-%-!Š(¤Ą ˘’–ĹĄ¦ŇćĹĄ¤˘€4fŠ(fŚŃEŁ4Q@hÍPŃIFh´QEQE!…Q@Q@QLAE”´RfŠ(˘’€“4RPŇQI@ IEQE AE¤ Í&h˘€ (˘€ (Í%0ŚŇQ@QLAEPFh˘€4RQL˘’ŠZ3IE.i(˘Q@Qš`RfŚĐŃIE˘Š(˘ŠLĐŃIE.i3EfŚŃE0 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ )( ˘’Š(˘Š(˘Š(¤Ł4´™˘’€’Š(˘ŠJ(˘Š)(˘€ JZJB JZ((˘ŠJ(˘…Q@Rf…˘“4P1h¤˘ E%ŔZ)3Fhh˘Š@-%PŃIEŠJ3@ š\ÓsKHĄÍ6—4´´ÚZZ))sHBćŠJ)ěŃIš(ÔRQš\ŃIšZZ)( ˘’Š@-”f€ŠLŃšZ)3E-”PŃIFhh¤Í´RQL˘’Š(˘ŠŁ4Q@Q@!Ą¤ ˘Š( ŃE%Q@QL˘–’€ŠZJ`!˘–’%-ŔJ(˘€RŃL˘ŚQ@Q@Q@Q@Q@Q@ ˘E0 ZJQ@-P1h¤´P( PŃE )E%´´”PŇŇQ@ ERRŇRŠ)i( Ą¤Ą ˘RĐŃIKHbŃH)i´RRŇsE%-4RQHc¨Í6—4ąŁ4™˘€ŚŇQ@ E%ę)3FhhÍPKIE-”PFh˘€ ŃEQIFhi(Í%.i(˘€ ŇQEQILBć’Š(˘Š)QFi3L˘’Š\ŇQE (¤Í-¤˘ IE)i(¦ŃIE-”PŃIE04™˘Š3Fh˘€ (Ł4QIš3@ E%´™˘Š3ES˘Š(˘Š(˘Š)QE”´™Ł4´RfŚĐŃIš3@‚Š( Š(¦0˘Š(˘ŠJZ)(Í-%”ą˘’Š(˘ŚĐE%ą¤˘Š(˘’ šJ( aE”(˘Š)(4PEPQE€(˘Š)(˘€ (˘€ J( Š)(ÔRQšZ)3K@‚ŠJ(h¤˘€ŚŇfŠ.ii( Í-74´€\ŇÓsK@ Kšm.i´RQš@;4RfŠu¦Ň怊J)ę3Iš3@ š3Iš3@…˘’ŠuÚZZ)( ˘’ŠZ))(Ô””PŃIE-”P1ÔSis@ E&ih˘Š(˘Š((Ą¤4”QE”´J(˘€Š(¦i(4Pi)i)€QERb–Š`%´”QEÄ%Ą˘‰Š)h ˘–ŠJ)h ˘–Š`˘Š*€)i( QH)iRŇQLbŃE€Z))h˘Š( ZJZ)i)hĄ¤Ą Š( bŃE€)E%--”´´QE –’ŠCŠ( ˘’—4€)i( bŃIKš(˘Š@´”P1sE%´RR〠\ŇfŠ\ŃšJ(sFi( Í¤˘€4RQ@fŚĐFi( Š( ’Š)(˘“4´f’ŠQEQIšZ)3E04™˘“4´RQ@4QEQE0ŠJ(h¤˘ E%´RQ@ šLŃEQI@ E%´RQ@ E%QEQEŔ(˘Š(˘Š(˘Š(¤˘€ŠLŃš-™Ł4´RfŚĐŃIE-%%ąŁ4”PŇQEQš3@RSsE%QEQFi(sIEQE ’Š(˘Š)QE€Š( Š( 4Ph ’–’€ (˘€ JZJ@”QLŠ( Š( –’Š-”P ˘ŚŃš(Ł4f€ŚŇfŠZZm.iąĄ¦ŇĐć–›KH˘’Švh¤˘ Kšm fŠLŃ@ Kšm¤!ŮŁ4™Ł4´RQ@ KIš(sFi( ˘’ŠZ)( ˘’ŠZ)( Š( Í¤˘€–›KHͤ͠Ł4™Ł4ą˘“4f€ (Í%-’Š(˘Š`!˘Š(RRĐh(˘ŠbŠZJQE%´”QEÄQEQE0 (˘€ (˘€ (˘€EU (˘ŠQKH)h˘Š(h¤´ (˘ŠZ)- (˘‹EPŃIK@ E%´´”P1h˘Š@--6–€RŇRĐKIKH–’–€ (˘Ă4´”PŃE€)sIEŠJ(hŁ4R˘Š(˘Š(QEąŁ4”PćŚŇQ@ IEQEQE%1Q@¤˘‚Š( ŠJ(ÍRf€ŠJ(fŠ( Š( ’Š)€RŇQ@ E%¦ŃIšZ(˘Š(˘Š(˘Š)(˘€ (˘Q@%-QE%-™˘€ )( Í¤˘€ŠJ(˘Š(˘ŚŃšQš3@fŚÓ˘ŚŃš@Qš3LŠ)(hÍ%QEQEQEQIE.i(˘€ (˘€ (˘€ J( Š( Š( AIJi(˘Š(˘Š)†Š( 4Ph aEPRRŇPEPEPEP ˘Š(RRšJ(˘Š(¤˘€Š3E.h¤˘€—4™˘€–›KšB4´ÜŇĐŃIE 4f“4f€4´ÜŃšu¤˘€4´ÜŇŇh¤Ł4ěŃIE-.i´ą¤ćŚŇQ@ E%QE(Ł4™ ˘“4f‹KšLŃ@ E%´RQ@ E%´RQ@ E%´RQ@ IEQE Ńš)€QEQE”RŇb€ (˘€ŠZLS˘Š(˘Š(˘Š(˘Š)€QEĘ(˘¨aESii´ę@QE´”PŃE )i(´QE(˘RŇQE´RRĐŃIK@ E%- ZJ(Ô JZ@-’– @˘ŠZ))iQE (ÍPŃIKš(˘ŠC (˘€ \ŇQ@ E%´RQ@ Fh¤¤1h¤˘€ŠJ(´”QLŠ)(sIEÄQI@Q@%-% (¤ ˘’Š`fŠ(˘’ŚĐŃIš3L˘“4f€Š( Š( –’Š(˘ŠZJ(¦E”QEQšJ(ąŁ4”PćŠJ(QE(Ł4”Ŕ\ŃšJ(i(˘€ (˘€ (Í Š3Fh˘Š(˘Š(˘Š(˘Š(˘Š(˘’ŠZ3IE (˘…Q@‚Š( aE%\ŇQEQEQEQEŠ( aEP ˘Š((˘ŠE EPEPRRšJQE (˘Q@‚Š( ˘Š(¤Ą4”Ŕ(˘Š(˘Š\ŃIEŠJ\ŇhÍ%´RQ@˘“4f€4f’Š@.hÍ%ę3IFhsKMĄ Ł4™Ą¤ŃIFh٢’Š@-”f€ŠLŃšZ)3K@‚Š( Š( Š( Š(¤š\ŇQ@ šLŃEQFi€QIš(h¤˘€ŠJ(h¤˘‹Fi( Í¤˘hÍPEPEPEP0¤Ĺ-˘–Š`&(Ĺ-% QE-%´PtQEhEPJ))E Š( Š( RŇRĐ@˘Š-QHRŇ Z(˘Š˘’ŠZ(˘€–’Š-Q@ KIE –’–€KIK@-%- (˘Q@Š( –’ŠZ(˘ÂŠ( Š( Š( Š(¤EPES˘ŚŇPESQE%QEQEŠZJ`%´”QE%˘’Š`QEQEQE--6–€Š( Š(¦EPIKI@RP ˘Š(˘Š(QEQFi(i(˘Qš`RQ@ šJ( Š( Š( Š( Š( –’ŠZ)( ¤˘Š(˘Š(˘ŚĐ ˘Š(˘Š(˘Š((˘Š(˘ŠQE (˘Q@ŠC@QLŠ(¤E†…!Ą¤4QEQE!¤IEŔ(˘Š@QE (˘€ ( ĐQEJSILŠ( Š( AE™ ˘“4ą Š( Í¤˘€ŠJ(hŁ4Rh¤˘€ŠJZ)i3Fh´´ÚZ@-¤Íę)( Ą¦ć– E%´RRŇĄ¤˘ ER˘Š(˘Š(˘Š(¤ÍPEPE”ŔZJ( Š( ŠJ(h¤Í ˘’–€ (˘€ŠJ3@ ER˘Š(˘Š(˘Š(QERRŃ@Ģ–ŠŽŠ(­(˘Š)i( QH)h˘Š( Q@ ˘Š(h˘Š@(˘Š(QE (˘ŠZ)-(˘’–€QIKHaKIKL QE E´ (¤ŃE€(˘ŠQEQE(˘RĐERQEQE€(˘’€ŚŇQLŠ( Š(¦ ˘Š((˘Š(˘Š(˘Š!˘E0ŃA˘i)i(˘ŠJ)i( ˘’–€ (˘€ (˘ )i)iQEŔ(˘ŠJ(˘„˘Š)€QE (˘Š)(˘Q@RP1i(˘‚Š( ŠLŇĐEPEPEP ˘Š(˘Š(˘Š(˘Š(¤ÍPEPFh˘€ŠJ3@…¤˘Š(˘ŠQE (˘€ (˘€ (˘€ JZJ`QEQE CKI@!Ą¤4QESiM% (˘Q@QHŠ3I@ šJ( Š( ŇRšJ`QE%´”QE(˘Š(˘Š(ÍPŃIK@Q@.i( Í”PŃIKšBŚŇQ@ E%.hhÍ&h¤ŇÓihsKMÍ--”PŇŇQšZZJ)´QE!Q@!Ą¤ Š( aE”Ŕ(˘Š(˘’Q@”PŃM˘€E%´fŠ(h¤Ą –’Š@-QHŠ( Š( Š( aEPE%-#˘Š+P (˘€ (˘€RŃE (˘€ (˘€Š( RŃE-QHaEP0˘Š(Ą˘Š)h˘€ Z( aEPŇŃE´QH˘Š(h˘Š (˘…Q@Q@Ą˘ŠQE (˘Q@¤˘Š`QEQEQE1Š((˘Š(˘Š(˘Š!˘Š)€†Š(¦h˘ŠJ(˘€ (˘Q@ŢŠ)€QERŠ( ˘Š(¤˘Š)(˘Q@Q@ÂE”QE1QH`i(˘€ (˘%P ˘Š(Ą˘Š)(˘ EP ˘Š(˘Š(˘Š( ŃE%Q@Q@QLŠ( Š( Š( Š( Š( Š( Š( ’Š(˘Š(˘Š)RQE†Š(¤˘ŠJ(˘€ (˘€ (˘€ J( Š(¤EPEPi(˘Q@ EP ˘Š(˘Š(˘Š)€QEQE´QE (˘€ (˘€ (˘‚—4Q@Q@Q@ EPKE´QE Š( RŃE QE(˘Š@”Q@Š( ’Š)€QEŔCEPIERQE1Q@-PKE€(˘Š-QH˘Š)QEQEQEQE CES˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/DarkShine/images/preview.png000066400000000000000000000123121361462701300263540ustar00rootroot00000000000000‰PNG  IHDRddG˘> §6˛=§7'Ł43Ł59Ł:3¤:<©61¨78¬93«:;˛<&˛=5†4C‹5D‹8L“6A–9E“9J›6B›9Dś;J”Rˇ6AŁ:CŁ=KŞK¤>TŞ?P°>C›@ĄB§F¸F´Q«E$­@7®Q$ąG'ąF7¸X(˝V2˝`.ľc3ź@Wž@X§@N«@C¬AL¤@SŁC[¬BS¬D[łCDłCKµHD¶HLşEC¸FK˝KC˝KK˛ET˛FZµHS´H\ąFRĽKS»L[§Fa«Fa­HcµG`łJcµLişMcşMj˝PcĽPl˝QrŔNÄTÁM$ŔM9ÇW%ĹW9Ěb(Éf8Ët=Ňi+Ńj:Ős-Řx4ŔMBŔMTŔN[ĹV@ÂP[ÂRcĂTkĹXmČXnÂTsĂVyĆXsĆXzČYuČZ{Íd@ÍxCŃiA×xCĆY€Č[Ü‚-Ý„7ŕ‹:ă”;éˇ>ĎMŰ„G׊UŰ‘\ÝfÜ kŕŠFŕŤPä—Eä™TâťeáźpéĄJę¨Ví±Ní´WđĽ[é¨eä¨xí´gí¶uđ»gđ˝uńŔ^ňĂióÇwőĐ~殂鵇뼓ńżěÁ™óɇóĘ”öÓöÖ—îÇŁńËĄńϰ÷٧őضůá©ůä¸öÝÂúčČúëÖüňÚűîáýőčýúöĺJŔtRNS˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙S÷% pHYsaa¨?§itEXtSourceCanon EOS 60Dř§ş´tIMEÝ &nbęĹtEXtAuthor©®ĚH tEXtCopyright¬Ě: tEXtCreationTime2012:12:25 21:05:50ÔG˘tEXtSoftwarePaint.NET v3.5.11GóB7™IDAThC•— |ÎőÇ•1c(§ś4şÇ:딊™Ł *vQÍɬrŠ:Űśt,ÚĄ^'˛M1Cś¤ąďň0›d…ąlr©Ń‘DŘAś”î„.çu>źď÷÷ű˙˙Ź=ëuÎ÷Á0~oďĎçűűďŃä‚ .¸P¦yłć2­Zµţýe—]~ő57Üpónů㣏?ţÔÓź2ĺóćÍ{łhńâĹëÖ­«Ţ˛eË{-[Ş×­[»xń‚7_Ď{ůé1ŁFő»ëO˝1Q:‘‘„LHófˇÍZ´H«Ö—]Öáňk®'äŢG{â©§§L™ňşËXĽęŤÁŘř^uµ0Ě#ďŻicFĹ÷»«!śHŽ@.$%äÂć1"bŇáę«ĹäŃG”×çÍźO(kBP(˛vŃ‚7ßČËűëŃŁúő»«7)Ń˝ŁŁăĆua3LóĐP„ŇúB®ďzóÍ·ÜűŘcOŚyúĺ)yy„,P†&śęęęµk/˘Č3icžß·OźŢ}˘ÁŕXÁ4 !Ł\Bm\€Üps”Äő SćÍ ‹YŹł-D ćĎĚËMK#ġôŽŽEă’ ĽZŇ䢺Đ$*ęŢ~Łh’——7{ţü"BDd­alÜČ_,XP4{fî3iŁź× ŠD»q…4 iÁ¬řCËV­/B\]®»ţú®Q÷J\c^qRµ¸ Ç®_Ż”ęőřŢEEógÎĚ›ö—'ăăă`ҧOLŚÉ+ş‰mD:DhK0Z_r M®3&óŇËąy3gĎ.**‚I† `lŘ@Ć‚˘"0ždĐ ř„#1Q˛jÂ@şŔ¤kר{’ÄJ)ÂذaĂzT-*BX…I$!”>1цҳ‰"0Ú» Dş\w]ר¨ŢýŚIîĚ™4)Z¨”*¶Śő`,,š ¦Č 0(„µÓ$4´U˖ᨤ=!Iü¨ŃcŇ&çćJ^E ×Q…ó9ďŕ§ «°pěŘÔÔˇ0I0`Ŕ}@1‘y !bÓęĐĺZÄ…ë@^ĘÍÍť=köěąs.\¸f 9浪jMDČHd(âb`1 ă€â0°ż—´oߥ˵7vŤŚŚş§o|üčÔ´±“aR†±y÷Ý řqÍÂąs 'ŹMOOJČ „÷Ńĺ>Uq;a\˘Hx¸@®˝ö¦›"#{ňçŃ LF`łfÍŠbÖĽS…¬đ‘Ś©SÁHJJBÂ@$XŠ8 š´oʼnŽîŰ7.ţˇÔÔ±c'OžZ8kÖś9`Ľ…ĚeĽöăŇ“ IBČŔ÷qHQ“~W‘– „‡·˝@şu‹ŚŽdĐčÔÔI“AĘPŢV sŔČ—žžś<”*€$$< PzŨ‰4Ą0Z 㪫nĽń¦nŃŃw÷ŤôPRjzú¤©S_}u†2V­ZőÖŰ:o˝5gÎô©SÇŤKć :„& ±•Š5Q0L‹&Ś nÝzFÇÜ7())uŇ$P¦ľ:Ł”U YĆt(ĺ‘G@fŕVŸŤhím/ş¸}G1$& %%ĄOš”ź˙Ę ppĆôéůůăR”ń‚1”^˝!Â#HŰ‹/…ČUťÁčŮ3&6.áÁ¤¤d0ňó ‚3§ ţdú´üiăR”’<Rbďżź5A(ż#B ŹXDx•«1•Ą•ĹxUgó2ĘĘđáľ!C|ľ$Ż;îP˝VäRÇä¶ŰzőĂ'"‚Ň,żzu)^ĹĄĹÁ0BŽń‚ )bÂÚC[† µÓĂ2膒“SŔăK)Ą•ŕĹr”âKńÁąyÝ0­óD®ČíńM0”be”–:c#5˛”ź´‚A+4iÚ­“02Ú2TÄ rrx(ç`(—L2F¦ŚôQ…_¬Ďš4<~ĂĂĂ$,ą "=z€áËSQ!ąF— FŽŁ˘• ‰`#·C$q„ě쨫Ű)ß Ađ©«Ý ~+/_±bEI™ŔĹ2”âpŰE°ĂŹÍ@ěÄ|ÄůřŁŹuöěQ–†RĘËśÄ<.BI«ÝĄŇň<=ŔÁ0S»ť&ęR&*Ž‹KQqDĆkV›±—óń^sĽ×f›P#”’eK–-ˇ 9b¸ZČx’ă_ľąnç®˝{ĚţCű1.¦®n[ݶmĂ lŮa¨ŚÇ""ň¬dµióÎťî=T__¸ţđáúzCáXÎŚ¸Ô‘˛’í[fĆű".^®Ż0˛"Łľţĉ/O`ŽĆü‹ăŤn»ş¬$c)Ć%#q°cÂJ´‘ńăłł__śüóŐ—'ľ$ćčáŁGŹÉĹŁ‰â¸čh1®‰\Dаu˙ćÍÂřâëď9ÂůęËŻŽb@2Bł{÷6…¸˘2Ž {ŹčÜI `,ă“ĎOśüţűS§Oź>uę”á`Ž“¤µS?2&`\)&Éńc±>¬„łř.C!ŃQŠ$¦•tˇŚ”Hő ‘N@é¦ĹFŔřŚłçÎýtîÜ9ĹśúÖŁĂ5Ę~ˇlWăâ`–’bMČĺzvüóŮ/.˙/ľ;}úÜOPĚ·ß ć80ĚL ěeűöíŔ¬¬XˇĆP2YK“çQ»9 Â/żÎĺ8„†EsUÔeĺy‘-Ĺ1á]´& ůç€ŕ›3ŕ¸Čp›-Ĺ@PLbd1™đü B…üúëĎsĆ`T”€ěÓVł’‘Y—Ą%KĎ7á]Ä+•ś%ă?˙QŚ Íb41 Ś&;ĐĘvQŚÄ,Ä5ąUß äÄIűđ2ÇŰńş4ă2”€NéÔýNÉkyíÎO>®˘‰aÉ<÷Ş€‚§ŰJYI€ âş]!PůDňjLĹŘ7€3{lj h%I÷;ůnEój¤CA`gÎüRq(TńÖŔ¤;›ĎŔ;‰:ć…ýÂ×Ɔ”`* lźBdĂHY“[ĘüµR˝|ql40{Y¨¸)Ĺ1Á]-ĄÄäĄ*ŤA¬ «P Xă2…xMşß‰RžC)u»$/ľ—h¬¨č‚}s<ŠCńt"ßăa”R†%ŢëÉËśm‡ ‘ę9Ł".N^މĆ%&‰„¸ĄÍ‹ÍËî·XîJ•&·˘y#šP$ÉÁű?Ą žîM<Ís˝Őź°Ĺ›ĂÝń°šp‰qTäAIJC˛yľp $x%ž¸ĚE‰[Ęž6°`&Čëoă±Ărĺ9ŚÍáîx ?ş&ĉtoźa&&.Bôéő?™Ř+LM›—ÇÄ^yPćzů—ó6l­‰sŐ”űUELöěŠkb f˝°Ăb˘ďUÍÁž1*&.ł^41i´řż  ěD/Ę “F–‹yx™‹˘&|j b"Ąx;Ĺk‚¸řX VI`'ÁLöěŰ0q;‘/(1&čäź,>(ÄíÄ]Żc†âš`‚™0/]áě˛vîŐ·ŞżiB5ásXű "Ł&Í{MĐ ő€“˝c(AL>%ć}Ka^[ľjŮć»[“ž8yŠ&ć`wáš8; 0@q[·b®ĽšňCPb<ťňo19xĐPxJ1ë%۵ë˙6ůĚ–ňľc˛*^“6f˝ŘĽí`w±ˇ‰”ât⥠.Ë D)ş^xÓݨ‰}Ďí5ů†q}Ć´¤xĂkâ–"&zŮÉo ˙îAdobedŔ˙Ű„    ˙ŔČú˙Än!1AQaq"2𑡱ÁBŃ3ńbáR#r˙Ú ?ńífÖAî€@ Ŕ=«×AXšZŰÚФĆŕFB¬• ¦;ő°•K~Xýđ‚=”ńn†Ę•±âEgh 0c `k€i°ŚÖŞŚć€{ŕT.4·¨‹v•4Ó€§şQËĺn$Ŕ©ˇÖE- o„t"^4Ŕ:Z'ĄécO”¨é ¦ ÷[nĆž*ă7¤9ŻÂĐ0dn¤|ŕ8+’ĆÍł9‚Ťë]ŕDŠXí"ŠŔ77ă0€üă©Ôč%F®"¦Őë(ŘĎ"Quš 1¦5ŕ5ĄX¨_°OĐ´ĄL •8Íť`;Ř•>Ąß¨Ž´‘GßS€ ^@Ž:íÍ…J|+IQ¸Ď7ätQ–#©żńéŤPwëJ†Ô@^ JŰP`;qÉîhr ’ş ¬Š €Bđ¬¨ĐkˇkĺQ´˘*(t,B Ť«rúŹŹÚq€S¤€ą@({@L7¶Ä@ŹĆ@oö…A¤(EÄ]jM:JŤ§ŚkSŘtŻU&˝ÍkÔ7ÉAÔ€ŕř@č€@Žk°X E8ęŢš“óŘ˙Z€ ëĺĘ´ď2 CËU:@I@5đ€Bo:®Eő.˘PĂ*Mxů(·&R=DÔŔĚ‚ľaůiqd Ö;@¬ ezůVý` äRݨ JßiBź $‹€h:ĘŤ ^ˇ®(Mz@źs Çcr ¬)ŞEư†9ŠVPźY@˘cäć‹*ä eśýÇŻĘyr ŮŽ„@‚6mAëDH"ň)Ő^ÄheFţŞÜGP`hĆçŕ/nĹŤĹ:HŁíů@+aÇĺĆĚ=FÂPŞ9°ŹŘ@čA¤ e (EDPŁŇăÝsČ7[Ŕź„Š˘x ŤI•™ŤxŤ L F˛ 9Ş+čE ˘/NGżŢH˘ÚŞň`´×XE26Ăk FăÄäŰč 9ƇheýgŞŔrI@ß’ďÚ塅>ň)ń¨$łh˛ˇąäk ´ ¶U5u2Ś/cMFđi|  @ŞQěk*3ă’‡¸xw ą#Ú‚äV<@ @™ĆăUŞiĹ·KŘŔ¦DçFXś›Ř@¦C¦1ď챫Ôü¤Ľ(¬ůť)ęhkPeDß_ŹÖLóÖ/ˇü>Đ1˙­:Ŕ—o”Ц"$ë*Ů1ŐJŔdłÚ°GÉ éĽ ď"ʬAö€řš†‡CiQ®…OÓĽ ł Ŕ+5”R»Ŕ1§ät&ň|‡ÉeŔ8ć[†ĺÚlqb:ŔU4ô5?Ő´€ĹÜęĘ<.`L°…˝u'Sk"•K›ką•ĆÁ‚ď´ ŁĘ™ě 5j@5VĽĘ·¨ßOŹ(‹mĽ9o,ß±żÖš… ů4 Ěnl KÇY+±ď  ĚÚXřĘ„.Írk4ÖEě`€B Ŕ!NąH_̲ˇ«îGm`o,CrÝ #ą{h˝ ]ŇŔž™­¸¸łź"˛ | ‘€ČüڍurîM)@xŔaËő7®¶€]”Ý`®„úŹoŹü@pˇEWĚĂNX »zô‰©$ęN˛(ůŔ>đ¬v…hýđĽ(Żx„ŘŔ<`2'*’hŁyP˙­ŇŢnđ52ň=µ`9Č€k^Â.§+[¤“Ęýo"Ť©ÔTŔȤ©@ aZŁq'Pt•e‘nm·AU$’oY 2©mMje RžtjÓXyĐdčĐ'}ô‘NËŢ´QĽ¨bŘVÔŻxźJ©€ŽĄ,}Ň?ćTiň€@ űB BŹ`W\"›Ę€ńf_Ö(w€ÎéČ« Óx ËÝTűxŔWv}té ]¤x&€^B&1W»t• c w€źĄşŘÝv·m!KĽ€éĐĄ¬)żSŤ(eF¨ §†µ¤ úĂĄM€€qÄŘÚZ˛*™X­tĘ„TgÓAJŘČŞű1}K*${ČŁ´ř@5ń€o¸ď•Ů4÷ô• sy@ĎYB¶H 1Ż/Ěé*6Éćką6É]ëô€Ľ»śŠ˘d5ű´¨Žiď% ˘ůq,Iˇ2†eTů«këqڵ ŁoBâ-Ë»–=´hŔ÷ĽňןŽňˇ±:…ˇ´ĘÁˇ°€Ř¬ŽvűŔ”Š<`X €B Ç@~°Ś6>03nĐA )xC äŔwĽ˘ľ¬´ŮGÎň5kß驌(©»@z9q…ó(¶đ7^‡}`M–ŚD­©PusĆ.Şkµ`!bI'Y ŔŘE\Ş˝cIBn§Jř@eÄÄޱ“MĚŞ= S«o ‡­m´ l -A¸Öľ˛( „Ň@Ş˘¨ĹXč%@rťľP”őřŔŇ'fůˇ‡ixé€ř˝bTQ?±Ćö-ץ tŔ .OC@Ž=GűŔ2úĚľź9^XżÄ . '4íĽ¨ŢX×đú@ÚămVťÇü@Ú”Ż$ëĽËĘĚ PŔ\DŢТ“B˝kC–Ŕ·âҦ6F#‰6€µ‘DâPZ˝/*bÇÇo EÄŞ*×;×HqăaQOT*ÔŢĺ¸W›‘Yě`:&Ş=ň˘Şąňmě`&Eˇ·đ€Řň‚cCÖ ¨ü„äÉĎĘ4€ŘÖ—ŘWâ`HžDť$ŇÜh*Ć••VŐ"@ř”T±ŃeěÄ÷Ú ±ř@S^Đ{Đ鸀ŔPśgCqPÓpdUśŤ¸ŤÚTc‡7$0í¤úȢx âŃúŇT*Sö‡ř´ f­H ‚Ľ­Ą/ÍęÖ5ż«ßo‰*ČŞcJŐ›Ň5• ÍŢŘĹoá”hß8pŢL–#~đ1±uî? úĎ„ésa󀙾E˛ `N˘˛)–ś…t¬!Ó‰vç®Ő”eą0_M Oęń7řŔĚWzź€@çpSí¨CëĆw0%’ÎĐ*Ş tZP@ÖP"Ő4#¨ĎˇĄl,$Q÷Ŕ;Ŕ|MĹ»he@ęTŰQ§„ .e"Ťcň§*(ňß° š§S¤ ĚE  i"¬ÖÂ)ľ˛ sèµu"Ôj- ¦ZW6&ĆPŘX żµĚ¨RĚu5‘X €kągę%AQN(5·s őj %–Ý tT@ĆuAR`@UÚ»›| ëSE ƬNÄȦW ˝ ÚT)vcRt‘Yô€{^ď„m Ą†ţ0ˇQšę+ŢA!xĺŘĘ€â¨ňkżř€ TÔ€:ëEK%ŰsW:ČŁÚ°*<ř¨=BTh¦D lëFŢì j9š ŕăO-9ëU—šZš(Ą. €@ (rW‰Ě%CąW]Ä8ČŇżâŚdí_@bËŚ]ţ%SZÖň+  0 ű@ąL}neDťąŠ4R#6Óq´Š¨|{j=ň˘>ůi€BŁTiĽ˘…qä¸4nÖߓچƄ(ą: “r$Aé@ýxض§Hń‘Fđ3ĺŢŔ gq~PŠ1Üęeű_¬ 9ęÖřB”}dďÖő€kĽ"ÄŮ2l,҉2ń=¶éI ±§Äě XX;í ÷J!"Ź”X@t… ëŻhę( ¨VbÚ™•ŇxĐA˝ ư§Ę<çˇŢT%¤SŞ‚ĽŹ[ŰĘŚVŔ[§P c,FŰH2˙Ě(öř@!„(ö„GăPn§YQ@ţ··ýMŕGćö˙¨´ ľNVŠ4i{ŕ÷€^㬠„Ŕ  ¤(0·€u€w€x|ŕ8u#‹ŠˇÜJ˙!z“ÚţÎV6]©´ ęa_Ľ&¦˝d íXVű/¤V˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Default/images/background.png000066400000000000000000001104521361462701300265320ustar00rootroot00000000000000‰PNG  IHDRúČN±ŚŻk÷g|\’_ˇÖ¦—]ýŢâň*.‰o—üj~oŻ˙Ö+ÇMřvaE?šţÜîĽ_’^Lú[ţÄń‚ëőń~ę\]ý2nv]!¸…ľňő¶BüžŕŞŇzÓwÚä6t¬O^NiEá§ô>ŕďi­ĎW·Výa¬ăř•ěŽË‹Çu_—(Ż™Ošn®]–ܲë˙7Ú$ĽĘ«ľXţłŃŹđc¶µĄď,×€ÇŢőČśßGţ÷bŰöë}ęă9żlý•ľŕőˇÇń™kĹŻ—1›?^…ĽíÁčĘŞéú÷ĹóÓ{ÂŹĄů Â3–ĺhwŕş6ţCY&x7Ü=˝KĽël)ë#đe€O·ŃeTř®—2đŃŐ÷ô—ăsýÎŕ ZoúŰXâőKí×s©ń†ó3Zwőő˘ťĂÉXťú3~ďôgřđÇ6ąVýůěń×G¦P§O_ŚŻU˙ ·ž<Öó ×j0ľy°á/™ÂŰ×;Š—mۦ›ężŽâW2®ÁďRx×gÉYd·Kźş‡ŚJ1˛"đ¤%¬ęšŕ Ş?{­9ż‡z*ťŔüŚp¦uąÍ×˝ťoqWó=ÄC©›ôă3źŁ5/5˝r»3ş?=„Íw¦;¬±˙y-ń¶×tc{xF×ߎŻÓÚSöZ÷N%é|°µÄ‰vľ†~CÜYţŤ]Ą¦ţ&ĽR8RvÚÁ˛l{˙޶ôĺ÷öWń KŽa‹Ĺ ×®'/ve˝âv_wĄÓ}Ôpx\—„ĎđżÂfĐuż?ž»ś 9^X“Ů51’wć÷l|¦ÓvŐđ9ď˝y§KÓ Żë+ ™ßíćwµz8ź‡ Ý%~gě@ÝßuZ;ÓlzZ7ÄĆK¸ťöôNúsD˘ëďű[ĄÇxÔ—đÔý;>ϱIä‰čÎUŞ—ęűjç[ŹĚ˛Ę*Ż”!ŮÝÔ-î «QâÁGXŠ—–ŕ"ĹÖ÷}…„Ęľ9Eq|î<Ę‘ŔŘ3ĺ«É´\9G 6öś(ŔČíčçşKé(ĽV·®Zţ‚şÂŽú‘„ŽËű¬ť’N„ő-Żđ„{ľ”Tŕ¬+ôőÇńxĆGvŤ){÷\ e@8Z‘Ú.a^Ăś­{_.U–$bm*6nF~zóöCÝ·ë˙ötŇĘ—;t˙źŹ,ÎMßo$9ńŢę!|˝ěúˇyýţ‰¨7vŰôČ üK˘z@]Ő‰$or•úČ‘˙ĄŞŃNŔ%#Ň÷?ir˝ÂIÎ<1=7­r~_źţ~ýŕhJ÷WIĄŁÍÂ'¶“|“µŢи¬ß{ŰÂý˝˘ĐAÇÝŘşzü}N˙=/ń™PŢeA%¦¶|Lńy‹LŮJ”»‚ÝOä<^ů”ĂĚT䮸śż&tÁř=¬©'‘s¨Ë‘ĎČ}¸‚zŐĘ8ÔKÇőńž#lz¨ŽĄ,?2˛—Ă3Ľł?—‘s"’ęęŐŰĄźT$±ĂÂm”@sĆö­9*K]1|gS"žšúţ-ř«Dü¬Ć4;ôet|Ţ×+®ŔđxţąV<›Jő8\ç]?e/ŁŃŇůĘ*dÝ÷ţé×Ç4?gG8iőó9R)2‹N o\HPu‹ę[€äj'ź?Ç«žQ1kç^J‹w—ŠĹŠťźĘ_,€±hb×ζ™FŠT¦:n¤ÔšŮ ˝ěż>˛‹ŻPµÍřäYS“?Ľyń.Âő…tWóc?|Ţş‘ęĺíDŤřÖçI eVŤŢpŕ*°űĆŔÚť{W~Żwëůłg8ŚtQ~®e­§˙uíűő˙őÍŻďű9>]¶őuă´dáŰ:w©ľ›Ĺk»·5şVü[2uDýßőžź÷k™×ŘŐ¶+ßą>Ó:-r|} yš‚®ZĎÖ*­ą´?CÇÍšłđE+†úĹvň^ďă ˙8˘ Ň =%ř‰Đňj!­ň/hç?Jl°Ś‹Á‚ˇSťź5ÖşnýŹŃ×˝ß>źO9ßw©ć1.ěĐęčzéăZěŻ`d+ţú+?~gOľrłťťjJJ­rµAŐꬺô^Ç>îÜ~Ň!ăäĎŇgŻ[•;•ú&~ŠŤ_żű¸6ěĚë~m’uŕěćČTü±Ö„ĂZĄCĽÉ(ú¬P×Ú©ŇOÝ{ÝOëďőuďĄ źF„žé™/5ôXQ©ë˛ŕ»ÝbüÖÇ„&Cę2YW‘>QďçéOÝ "6+Đ'â €y2xµÍe(7Ö4ĚŹ“čµf ŰěZ¦3V>N%öĆńúç˙H–86Ŕëç?e{÷“–ëݺ׸ţ‘4yääď׫Ď[w}ÓM׺Ͷ*F ŞŢg OŮ!Íel+Ç|1÷ăď˛=Ěe4 hB‰6t%¶ŽÂ±Ţ­ČëĎŻ {í•]¶űřpžËŘ÷ŞĎ?ęňłăth zîřęe˙ůóWóB˝}ÚĽ×-qíĂëľ#ăš;ÍO? óń(_ç2•ňCtúZě°¤ucş](‘ůaÝÎeĺ3Řoë\&ě(š†5_vťł×kžĎëž|´‹Đ©yŞß\Ű8ÄŢďw“Ć×µdÇÍÇwńŔ‡…•ŮĽ'qŚ(Đţ^'ýëççzĐĹÂІú ÝBF/żAÚ€JŤÝÓ’µÓIŰ•®vß´źĹÇ\÷lg%zťaÄčS†îç×v[“Y‹@ĎĺŽĐ…P§ŐĚuëS‡äZťW8ńůŃHőp”Ýu…ŤĎxÁë5ő Ć)ëŐŽě±ĎyóÄWF§Ľ™#nĄ‚{bzŰő~Î!N›mb+©˝3’űµĎd’ât‰ą(wčf–"‹gQ‘PÂ-]KMéâö4X|/M;Ń€ŇUˇM‹Ýű0š[ó~ë 7ąĽßłzrĹ)ĆŘPź·ĺ=Nűőx<°nĄ­zîiŹ Î)d–Ұ:ŤRw%ŐµglŠáOr`üyOĺZŹÍW?‚ć\©řÔóşŘ'Ý ąéŰUŕ•×=ŻłµCV˦.YűuČR‚±k9um -^ő;ŹDç<řž Frç¸h %wižŔ·čô«Ç)uĺ®ö‘i$‡ţµŕŢ.u¤M |iîĎ?ă«m»& ś5͡žw™ôs­0• +^Rë>ë¦wžrqyźý u9XüÖU-·Ę\±m<ÄuđrŦÇuĚľ_W¸˛í$ÁN–JyJ˘—Ą-·"¬rźXˇ°ć˘×®q˝yÇP›!˰y—Ű»+î¨Ó¸îŢë*:q$Ęäů÷¶Ű¨§K@Ń´đĘBÂ(ačz˙+Í´ -Pt'~Ç“ĹNPĚ®ŃâEaš†pÚ&ë:/Ô<ĄŃĽ,tťőřŕÇĘŁÄN{,š)ÚdΓ`lřN86DÖëoF˙qXMěaCĂ^÷〠míť#(Ě™ťç¦3^DKóŮŚŮvOΉ´‰@·ÎMŻfŻš‡µ)‡!LÁéE—vĂđ˘·äzćëżĹAlĄ/®Ç&’Ukj/ÜľÂÖĽ$tü‰ž®vÇ<¤¶r‡čqňşÉ5á.i„ŇÂE|D˙É4!L|(źăq}x vC´Ăp”vŹ÷ ¶™*ú‘ĘmiOräoŻe÷^׺ôÚ«7|>)ôĘmyČ>ë[ÇF©VCUd5Ń1±żžş¬żÍúľ~Ż«¤:ăçA·—8ZJ3Ń A/śî]řͲµîA·ń&ŃÓŚú …Z˝u©¬ŇĐ7ÍGS]xĐ@5úďż4Ł;­Z; ġ]d侮˟(KÇ-oţx©SË.ŮÎ>4ĂJP­Č9ČÄčâŽ)DwŮ €A:ýk¬cđś°[¬„Jp_nŇŃi^6č™(%öSîČčX]Ë×óë·Ö7ű>ŇH0ę[vČu;FňM…OÍô,ľ>âů÷ŁĹ.!jžĹ]+^züýăůş5bŹ˘ú%„€[G©x~YVdŤľł”rŰQţ­ÓđźSM·‰,8<|h´.µrÜŞÚϱ€żĂF©{XĽž‹Ž?őhę’mâ ×eüw›Ęj=ŔÍ=©Ü˛ĽŁÍY¦{pâwźJpq©Ą{{8$Ž€˘üŠŃ4ĎÇĹiZĎé·¬x™(íZĽĄľÔh7ymRôXíµii‡ăˇéÝő_\ÔÚˇ)óŁd˙,†ökh@âbńşŹ×fĐ­†ËSlx»ű4z›q zîßÂÔPěÄš^Ă5Ow|IßŕL0UBך×ͧoxOłŃIX&«/ ­Ţ—µ¸®B«#ąböÍîŃý´ CëGŞ·™zůőOŞŹ#gg–V”ŇU•ęh“ż=´ˇ[»«·OëS¬ÝĎZŞ.©i’.ä  NÝ#âW:O‹Ď±âň‰ íÉPúé ¸–b‡Ç…[lV%Ů,RŃXő›Ď$ púŁť#…Oè 443uo€Ţ—X[tnŤďĆąŢj}vŔŢl’sw"úl_’Ąş@Ţk|pľ ě8Ń+#ęax˝÷!ą»ř/ qu ܆źp ĘŤ÷µđĘjÜčsXŕŁ(Ŕß[Ç…F8ľ@x\šą<#—-·QźnŚĆ=Ą)şÄłÝ»lë±Xc¸Ň˛©P \¨’e}>ă"ČöŹáÎ#ß^Î|&˝^ĎÍ{4‹ôŽ)áŚ]Żşp)V´Y‰Ţ-,ůŽ^qú`¨ţ[Ę^ďŔţĐ • §†É Ů_Ř67CqĘsŞ,W»á=ÖÓűěă:Ş ¬ ßÓwÔżĹx•@¶Čě1ŕ Ťh8LGŞ’Ď˘ rJb~4ŇčÇzĚßĐäËńĐ6ĺ‹uAä úű‡`şőÔFĂ~$ť6j]ËÓŞcQ}Š…ˇ‰¬ö—€ÍVń{68“{šY˘Hd‹›ĹĘARż+áóđ¤šg;swYîqÓëwA=L»Ç8ŹÉPx%y`I,ɉ)üÉúąÎő@óHłČńŤfů˘w!R«EQĄ)‰ ŘtDQś»c\Ŕˇ*ŕlŞçv…I+MÓRĚFíŞ.¸®ĂZCÔâř%Jő»ß7Í‘x’eĄ6úĘÍsb}Ć Í˛z+ÚBç~ÂL܉ęeiÂ4zYę¸OĚ™6ĽO_—`Ć-2ĂştîáXK­¶ň zôëmt´vŰzäu¦Éj[ĂÔ;fY˙őśńĺzŘJ$ çxi ÄôAç†$›ÚgÜŔö!\CaÎP™@}˘znŤsÖL'9ä®H·Áů”ZĐr!´«±R“k™}ůž€ö»żTĺř÷1 8Cßp°inŁ}ŁŔ"“ܦÇűśÚ”„ëî•Ŕ?+ /t]xRË“lđ¶!Îń€']`ÝůŐ˝Ó—ˇé52÷=j˙H'žŢ:Ą÷ŢľąÚ¨ËÓ¨@Şđľ>Ň$1%ľ"“ŘzÁj"žăś9Ć5@Kď1ßX¦×oň9áöJo ťüŚ•żí¨^Ę\‡PÝż÷%ń‡%LŧЗy€ÇϤ’ĺS°0@Ć1^‹, ‡ů)Ň˱_I inňc]ÇJ¸ÁČ}Ú„/ńŮDŠzĘ:Ĺůţ=lÜwv‘¦ GýiGLľőŞJí׿s6w»|ýĎűÝg*ol†T5e]>Ŕc¸Ç@m«BC«tCě™Âp(átL†v൚ž 4ÇçmČ{9ÉG#AZŚŇŮ ¨ç`ă×!Uo!ŚÜiÔŞIí/+6dĹƤîă&älr ť,‡łćGŻ/Ťâg ¦B'Ěá–ŮdĄ‚cňbŚać+řĹöř—,9µÉ a{úĘöűlÎśBű˘{˙eě¨÷őĺ{ŁMĄ+^«‚úŕ=TB륆1c†ĆŮĽ]BÜđp×őŔN§¸’š÷ 'W4ÎJÔ…ä'b=_ź.ťÎHbn{˙‰Hµ$hSă-c˛]÷óýóŚU% ĐUiݵŽlţs\iqß]x̲kç|Ď?l¬ŞGÎK˛6F:i Z\âđű4U& íţ ď^©ó•%b\.Ť¶ˇ ŞÔ©[Tk٤í¤AČk”Ďm–|F¬9tŮyĘ;@¶`ý8«rěăYŽÎ+AX”˙oJ !°xŐÁ0ÍK¨QX]ýćçşž§R`ýčR;/ČOޱ:q*NvĄëôydÂ-3L ł2ڧé ö±řf‘Ż r";:ES(ÄđÝ…Ú‡Ż¬5 Ä´1Š&˛R5ż$˝Sť­óé÷…řzĂűçź˙ŁmhnńA7ÁD+ü`k6MŕŽńŽ0ÁxµZlÚťfaógEä&Š$K§t 0@ô ĄŇK˝ŇO†ÇŔ‘0Ą¶É€“UÁ ‹ÄÖĐL±ä¬węß@Őxđo!cD PcĐjĘ.Ś߇ŹÔq_)g*{6ŢŁ×$ŻřpX¤Ś™e[HŁĎ"4Iŕ2úŠ%”‹ 5rďň$J„Ö—ÜŚS…çSčęM/L m( “ €÷9ś6Ää8Í—LŹÚLď“éKCLx:á™p¨@αÖ%–q× Aęôő‰âJšŇɬ‘¤mĘcqŤîp} /ËAzęí»ć÷б#ŚmçÖÖIŠ đWËn, mo9+Q;»ě<ˇ+FŇë!Ły6\făÉďŞ9oR!T€ ‹ZSÇŔqp}Ż, ±Çęď¦A±¶iˇAČ~\Ť@%¬`8 UqđVVŇD®A”’Ă0•É&Úߨ€ÜhXâ ş˘t!bš«ĎĎç|—ŕD˛¸4ÓjßOů8ľ˙ň†Vë6ĚLŇyJé©-i jK„ô€®Si$©\J¦†.#aʢ¬AčÚŰ"Ü5űBŞU"‚®í45ĄşČŇŞż]Ć÷ń„Ľ+Lw§:ÚĐudY޵ŃË "Wr×öRľ%˛o0tGrřĄ7|ű'×Aqü <Ľ1ý‚c“ICR^Ün·owgĂ…Ŕ6“«µROhőźň_¬µ›zíÜtWԺðF!Oąö×*ÇÎż¶ąt~Ţ"éńÔŔÇ Ý…%çئůÎőąŹ?yŇ ]7v^Ř‹‹ÄĄHŞRÔOą Ó‚!×—ŽXK~LŽxfž–f&şűuy Ýîńş3–&Ž~“x÷ĄŻH©Ö‡řŃsŞ^+ÜáSžęS¬¤ě Đ•ÁB÷Sd60,ěžHh”;á/ôař[ÝŮEKÉ+çű=ĆáţŻNýµ $ŠŠ™AkXdJSÔ_é áąű»IfRŰŇÉÁ×qQ†Ź®ňNhŐ°*F–8DĐ"4‰ăÚk  “śpCĹoÔőW.ŻQosňžŽ´´Ó Am#軏ű‚mÄč.¸ŻHŃŇoÖô Ţâšq%¦ľűŹ‘%×’IőĄŢj#-íFá°UTAR×®(ëmEÇż@©±n´P;T«"k˙ć}ű×pŢă IăžyۇµqĘŞHŻ ĹKđ‹€Y‰@čđP [ťşŰ@śą %ÇěçťĂśy[Ś?—]RčÖH­W‘٨jM[}+R'Vĺ=Űáš ťĽT8¨P^Ş3 ”Âh0ęŘáÓpoÎĆN2Ń Î»"­“.Ď: ű„ 7¨cJ„šqţ?ЧÓRµ3nG‰+?“d uEµáč ĂîäîŃöęŢä*ŃKĹń2Áh–f‚ęP!uňÜ?ĄF+Âé&ŇËÜ^>k2đą|Dƒ͆epçŹĐ(Z )§R]ťńN(¦!˙JZ€¤śEF Uă}k ĆV{z˙Q°I˙vKĺ9e?÷ÔŕĐR­ňRLc‡˝$yu×~g¤»fB»´ _×ň ë °RZ&Ţś©39đ›w$9g/ZŤ¤¦’ę5žoÉO’~ą—J…ÚDż«l<»ooc°ń –ŃőGűľI_犓2ť ’_›Źő×<ľ8fU©Xë4©îs™Âń¦““t†!ΚҤQĽŽü0ĸĄĎóq]ń,¬‡äUš@l(Sy šóö_ŇĹ˙äWHĚ™Ő×_;¨w,ŇhŁ oC÷ůŹî9ýfçLZ‰‚Ü™)‹ň2ăŇ8ŇŔw®Lž1SOĹzIČ3ZÄš˝ag^uĚüɬd Aú,Űląc9¨^ő·Iďč: @óZź[}c313(ohŔÎ&VeWú)N&ŁuÉ‹X' ~5•ŞšĺQTĐ­¶Z¶«ě#wÚ<´©}’zeťn´kŞ·kŘŠ#K‚.Ę/řy‡ódJü‚=D¨y©…CňawUéglUC"5ţ#”N•gm†Ţçâ1®2¨KŃId ˛ ©F ń7ăXŮŤ ę-»rÄ.ďë]‡]Ű•‚«Ř•ŹťŠŹ˘1ÚdÂ÷p0”áÔâMҲ»Ůޱ_fube{­Ą,Řé™FC‡šś™Ég3˙–ńWŠ5>o±e Üt€ ÷`Ô{e˙:ď¶ĹŇ`ŞŹöËśNŔQŞŃrž¤¬±?&JXxăĚ|‰śŽxż C,Í9Žú ł|ňźÓ<Ţś'jD‰Ý(vžäGŠűń~‹^Â\k*]˘ůmęE˘/ĽĘ\ą)pm–tpFh**­x‘†·ńçČř¤K3ľŠĂ6·¨1}˝!ŐŻ%™) Rš=Çëłíů‹ĘMŮ*ʬ«”‡C*ĐLč¤le‘›éâ&NŁUęměÄ;Ś2¬Ć„äVĎyâ>ĹͧJVWvli14.R›Ŕö´ĚVi6Qkj¦Çšg “Ä)nç8«J6|§Ĺřľĺçżćv«ŢićńMJĄ Ĺ~/¬Í aÖ+N ; Şźßječ3ícíŁüč{ŻKJłŁP“łtŤŇŠü?f蝦][_BŚIQ¤ašžoe+ěśâžGÚÉ…–&0ě¤bšVę !ŹŢFSôY@Ú+S¤MČ‘ý±Ěr”ńhĄ›DżSľ“Ščâęöčłš—o8fIOź={5ꦛ[šo•ńó¨/ýSë:U›ĆÄ ißPBă€$źíľ\ăŕŚćj˛ő •Á—í(ĺm.ĘÇWP¤›ÁU+ľ•řÍ#ő QżtřŰq/3 hÉŐ\¨cÖßró˛·}';v,Ů«Ň`%n$Í úfú7…±`w†Ş˘¦ĆNs‘.-UŘ86G]:Ś›źĄO“qL3rŻ×˙T(ĺlŰ[ ZW®†[’Őám{ KeźĹ2ÁčŘ0DVĎËgE8ĐçźN§çŽăLĹłżîKܧóËö:q´9c˘ LçŘ`šéWĘ=cg9śT+µ;ş{ŤŇűačHK¦#>¸ `cŻÝ/°łB&CťÔddŮâôľHżJtu°Éä|©BwasNM—çŰWEŘŇŃdA][UşiďšÝ;`MQF×]ÔsUżěÇ•©ůßřÍC»fJ]S—ýńP҉Lčb:-M­Ő0%lT†3xz˘ŐIímŞ$Sxi˘˛îŮ“í°–Đçő")îýŚŇžÉ~;¦/$ 0’Í}}[4ř­~%lŇ}yNVţ˙ŰčśÜľĄöp'[#a,S6ćőę4˙P!+˝Wč[úĄĐîĎA‰…do3 5wŘŹZŐ—‰ă⤏ÖĺhP0˘áź‘ćVÄÄťô\ů\§&0 F݆\s…ŮQlîK#Ě;ćls,ôJ“8Ýś>#¬Ô%R0î&.éęŘ`Ż»˛ç¦ŕzsȬâÝKĚpvşÝA¦°7PPŠz´éRf?K۵/ ňłŢ.¨QĹ3}tŠL|Ú ,qb5Ú‡\Ş˘Oµę.‡ţ¦ ±\<…n)r%T‡¦ďťĐ?wCÓ>ÝÖ…ë©ĂŰşĆZc7é¦€ŚŻ-…Ľu‡ľ!W2i´‡îsö‰Oş:”LëZWĎ#>{•5µ@°=LOFVüu/ĹAéá[ń=c°DŁJm{{l;Žś˘ułą._ÓŤ,o˝GyŔ¤bĚ„÷şńh^Á€^$«eřKŤ! [©ž+¦.ÔońL5’‹ÍŠJć*VŁË® ‘Văé‰Üş§·xaČc0B¸%«ŢĄµ8SŃ—‘U'ä°±tüÚ>çomč).N4vLő~ź`ä--WňxěŚËeçK r/FŠoÝł›ąIС)ÉÉęo6őě™s ÓËóĎ_´‰š§gťś|üۉ-Ĺ–k|SŘöJx¨VdďX`)LŕT‘A§ÚĹí4 7ĄÎë7D¦)-°Čú 9 w÷‚NA…Ďc#@6Q`u´şČü®ť ·ÂËšAážó°ŁÂŘp|żSŢBznuMm I¬@ô¦DCž¶/•B2€:Ą…şuť˘­ ‘žĐěńWya‚h©_á!¦HFŞđ§v]Ý]¦Z1ĐÎćÖVňqŇ ĄĹ0@u{4ţs_ç ŕůľ=t ăëˇő;iH˝óB!Ú›Ź2TĂ'Ôô0iÓQ‰SWG¦7ňŐ)ŘM]WłfëNs9lwR´!Iľ |UH:†j¸…\üÎľ)‘ŻŠüŚsýB>3ŤÍ©&Tî+Č\ß_*ž[VŇăf‡°ÎµśŽ€ď.#†•dČ n^"–™ x¬AHq ~ôy¨N(‘wcč<Ă41…¶tr2Wćx‹ŰbĐŔin@°’¶Xáp¬Ń7ŐĘsď^őTk_Kv©‘ÄA©QĚŚ›ŢV&Ojż‡}RpöË3dÂŰdÉŠlÂ}Zp"`pJ%R­§;Xk4Ô^1ě Ŕwí$[ݱîßŠÄ ‰ţtŠ… Ť •*Ω;)cz4ůíŚ ®Ü"[c´@ěü°nć¨.d&F®’oĺŔÖ˝ÁŠaŚhŞ”ţpŃÚšö$ŮGÝ…Ź)€OJÖßđB‚Ň;ńDĚŁfß´$éÇ9Ýü n.Płľí8\łßî|kť<8jLůţLĹęś1óRŁź$¤ŢŽsߨ+`iĆć]K~´gä‘$âÇ•µůmť žBCľf?͆=AGôFT<Ď𽠦Ó¨Î× çG´¸ÂŐAžMgß”¤˘ěŐQZE^źŇřępoPĂňú$ŤŮ6"Őťśző4ÎsşjŔť/ĘB<…5˝EbJťžyňŮň Ď˝»dZ‰ţŔş©ŰwrÖWlµ(ćů\€§ âvIW0hDň_°ůce®(Ů•§¬‘9 ±‘NĂ˙ 6ţ/V•i?ŕ( =€Ć6tţ“폍ž»ś5e üąîX[ ’—$nĘ'çN–O «UÉ~˙Şccz eS$fŁB–đu1CAtśď)Š+âÄ[Ë÷mYôGą šŕĄ6MHI$ľ2ŞüŠ÷dŚW ÂüÁ±¦˙Ëü7ňSkŘŐöFWžú" ¸‹±'€.,>0â ´jˇo5x~0“ę§ęĄń¬±8Ń&O˛bA|şîO¢ą6©–@đąĆĐ|r«™}äňkÇÚMm"Ë[ĐŇcÔÝJ0lRëm“i lč˝ŃŢ2ë¬O@/뀑™aŇ«(S,îmą™n3żć E0ąşâ8˝mPÚ=„5]ěůˢKn\ő iKłXtů†‰;Á •}ŹEź2Ă[® WđW4Ń/ąŢCĎΚ¶zřvÚlĐ ¸Uo)×:Ó¬ěS6 ·ŇTuć—(AéťBÁź f Ĺ,fĘí¦¸ ‹ÄŽMŐKŤnÖÚqâq“ŚκQ™Ĺ ÇJËJx[Ź6莍aÜD¸bLnHßHD{kýÖA¨˙N?żÉF0Ę´“˛\P‚(ćJ>ôN,cůŔ¨¸äj7ˇ„Ćť.Eŕ&–Rŕ5#"§N/°‡7Đąţy[:e űzmS „ÁHb&ř\’řŚ‘śßĺ¬0L„×@¤ŹÓâ¶4Ş\ÄoţHâ҇\źIAšĐQţOo“o}~jV7łŞ)z˛â>ČxŠek«çôâľ.dY l<:%KěL–ë`˘ŻrßĆ‘ßÔţW^Ą¦e:ř¬µţŁ—Ł8Ô%_‹úĎś§m|2Ż=č©*z—ö[Ń…D˝› ”Čů*Š4|Zď¤ A6Q|­“Ă*µwfó‡7C7’^°QŹTeLď36ˉ&G1˛<ž‰h%Ś<›*Ro!(c<ÖţCŹWęP]‘†… 7çnŚÂ¨ÚŠaËÁ\’­ÍĎ&˘»§Îł^ŘÉQí1ÜŰîzR¦RýqGťc]îß\WÂp©ëĂÚ óśŻŠĄąž+TŮء1=ńÇc÷JtvSf»ŮeHč˛(–,ĆŮÚ*·¨äD8m+ç÷Ď?š3ÉYc˘~˘č÷š‰ ŐaLxĂ`5ÔťS9čÜć°‰d<‡>íÜ6$ş]iĐtuŤ z2ĐŢC§2ËńE‰ç4HŻ$ěÚ¶©ŮIląópŤ®šÔ×$ţŘăĘÁh]ÄîÎN^E¸ź5uRôaě4´ę: !Ň;kß}Ĺ–ŇŔd2ŞlQnťër·+lR n>ăR’|v‡ŐŹí˘UŽá¦Öä¦ë‡xq·¨].ZÚ6%{ś)¨ ŁŞ|ÍPJ‰AĄł& ź§r1cW`! đS˘@_ň?š\-Ú?i»űŔMćs|ÚüZi+_'# ů%W&ój©ýüíĺżş3,ô]´‚o˝ĐpńćS\ô!©7c?§SŽ×Ď?»°H}uđÔâvŕpbll2]i¶ gĚřć±± CQőn`8†3łrë'nuśI1O÷ůž9%VÉű;ůłő…$ˇP8ë ·Făł—™núrIşŕ"§Ý6I3sÝ™,µđ*ÍÜÉe—ßąl»S*1B4jË4şžÂ)Ö—Łś[|’n+ďRĆ$®ą%vďáýÇ•˘qĆöëuZOb żŘ*š3śĽX`Ô+ütŐüŹPg÷[Nú »‹Ť&ÍvüŃ ž„¤E›~&¦g ÇM Ł‹ŐlnŰ»‰m\UţÂ5®Ŕ»wŞJËŻ:Asä9ŢpDźŁ~eÎ<«$á,ŢŔšL[˛Š·!%Eč,Á=űwŠęKä;%ff‘ú‰őFúe=‰Î b‡żĎ‹Ź:Jôś‚aĎȸ“ČŠ‚`p–¤ńÄR·óŽşă绣m9;šźCĂô¦MQĆó¨ÓLć.YŔ ba??Šwg¨ĹaSůž¦xCĎŢeĂ Áz§Háí:ÎfłHÍĹE1e> ®ŻÂ^\Äz‡%Ł1ě±ňQr"ř˛±+z±zj'[ÖjŢC›±ł­7\±^kD ĎXëleŞ™:#ăY Vřż;ü;ŹŹgäŐŕć?š\ơÇý$šÜUę«›ń}µMőĺ/J'%]6ąs<‚Ý|ćy9Haîf–Éď† §@Łęmę$ÇăΧ/Ú,©‰q2•ÂKđ|RF×8T6YWĽů—ř“˛¶˝Ojľ)±P…ÂÉ2óaęŘHëćJd®"ĄŠ–\ĺnLŐ$"ęÉĽ'ő©…x¤G»öŚ"—8=îŰM'„ĹIDýS*k—âBP˝Ůę'†ż5§Ł‚B:G)1ö}Đ1Ő%xjüm‚ÔAo-F@ xŁ"·#šb2̨ČÖ¸~es˛Ď ×a‹S.»'v@[“Ôp±“ ¶6żHu'˙ý:b ę{>žO•Ü9`ô ;™y9*a"ÔŇfC·íp¦)tS Ů soMvř®®zĄ6 gÇ4†ěÎç(©ÉBz –xÖ):¬„$†HŕŞö5z±´FP§—&żš›šĚsf]rţŚR=Ő¸ĄŚX›Eg Î(? Ú{jĹ}pĂçC@ýź~7 I˝Â!ůđ©*ŮŁŤÔ4ş´ »ĎN¸:µôú„ëö4öFŤęÄëţIąňěu:˙źLí©áŰÝÓĎ«÷.ú{5ŤUä2´Éˇ7óű>nžpĹź:·.`é8ĹĽĆi=ʉô¬ŮyŚŠ/ɢ6§k¶mSĂë,é–pg@Çam;ŐyGŤÔĚ3UĘÇŹ+‡>¤”˘sŤCY˙"jsâ}t•·•čqµ •–Üť×ëçůçŻ8ĄĽěî/,©mxT’{î.qÓ˘Ę,ćt™ m#X(ŻĽyD@·Ł—ŇЩ.N„®g«––şúˇ¤~ýşVĽf/Ca]ňŐnŞoć˘ÁGť±q"ęő裴P=a°ŔLVÉti$Ŕţ~cţE-ŻŮĄHřĆ„:(€Ćtź]ˇWś îSĹĺá슙…Şj]ˇšÝZ4Ěč+@ ĆEÜÍuc(p?®Z{ř+řt@c|â)rÍź•żŁż4_RŮ­1ęâĎVŁJujöG¨šĚŰîů&…x……Ü«íćşąóšëŁÉĂ‚IĆ Ęomá’§gĆŹ\CŘ:šOšËśč^ŕ¨ä–>‘?(ÂVPćĐWŘ9MđD±ŢUě„ŘÎROŐp7Ć’7Úž-z§ Vý7§ăTŻÇŽěŰĹí`)ľ3l$¶€™T»„0´‘yóüí,qÁ¤˝0tňOYŻ×áuݵ·¬őB †ĹNX €ÇĐWN‚ţ^/~żß€vměAµIţáhŤ†[>Ľ4żl‹ëQ3vm•ň”`૜"©Ămn=-^ۆÚC¨;C7kภłp x2ʧYŹ>’+§ VŐŻÖťĺŞb¸ź ĐhőQ«/%DëčţCžÔŞ˝# ë´&M?Ă•î&ç%·äT˝2"Ծݛr*6Ä[ĄIÓIđé°jťISĽÇŻë`FfařĎxDńf:A‹ÉË„VwťňWŽ;ŞŐd˘ îĄ(_a+R<Ů6.n¦ˇˇČŚ2Ű€¬ŤR­‚:Dt<ířQHżrď¨Ćd]f/Gl‰Ů¤őşEtŃŠFś|đXac4qžá°šÉDóóŠjMTjF鏌Ŕě:©§îLµS”EĚ• }­łČ( €)T×}Đ[ 8@őńđ,'Öń h“2ÚĽ~)¸_cjť€=şT®‡őüű?,N]&ÍźyăĘâ‹S÷tžëŞ$`kťş|–ןQ7T‘ŚŞ(‚´¦$%3]„B ŞŽ°‰ űekf«âiŤ)É7¤pőf+ĂŻď¤)8â}öÇávĂ:K¬vĹKŁ·UĐRĚĽ  ]FSJdźYřSł ŕ “Ôg0K^Ú55˙éĽwŞŮe§ŞäŽŇV~äŚŇşvŞç‰»ˇg Rw×MąműNÁ^qË«TŔčőóĎëçGI‰c}Ţť·.ˇńPCĐnŚ%ŘÚIX©ň‹Q’·ÔĘ{tÜ?QË•553j9Ź5Ľ”¸~:·J2rÉ& &‘€üzŚŽ*đZO>fçĚűăT´´Ň>ćď9ńĘţ7EBÔP":ęşÝ Ma0áŰŕťč*}߉˙¦Í–iĐ—+¤IÍQż3Q†„7’-Ń͙닅.±€ňJĄ˝¤ŕ Ô䎵͙ö4ZÔ}Pswi:çî>ŇFř,Ź?žD°Â OŞ2ŻuţsÓVn=(Ń ”ńĺ Ëkä vŮɶ<óyÔgíčsń5™ŔÄÖvV—­$ ĂŤćJ=Ütîwh·.űhD׉8Ě-zösvc-,Ţ”…ÄüI<¬vĚ á—=€G°Ą¨·<Đ­Š9ň*Ę€&ç5 ř0üKzŚ‘v¶T] §,f†ă6Ž«xRĽř5…”Oďî_Đľľ߇F*ŁY©Óśi‘rJc~7ÝFoé~¤6#hĐ~R+éFP?,ľćŔ/©q.é8î6©Ö±xřßúř"zÚ5ŇŔy…in6ŐĹä§At¬¤( čÓ{Śňż­ődúŢRš9ő¬.ť’Ü\'‘†@˘ÉĽl§ă3ť%vé¤o{fŚŹ¶4DÜ·™WŃÖF/RŔŘ‚D“lŘRŁÉOÎmJŚÄd&ÖƆ>‘´I­2g±ú‰ş¶nŇź1™¸m4,śxšµűqˇ]]ďÔ5$WIž•Ţ:ęÖJ׊%«´Ő,łH•GĂ>JĄ*Ť/ :~QT‚ç©©š?M˝hQuňŇ«*ďÄčBśMLZUj ŰEÜ.ńÄM`s mÜŞŔXFŞ.7T*±p™p+'ðĆ9~¤%oQÂvc¦8«| ˙‹¨wSg†˙–Ż9(´řCęqNś •Ň!^™®ĺJq§sŐ´9h|SőŠ ˝Ě'Ebéâ‰QÇA;s}k‚ |ž’ëV۰YpGF®@ —ŢçÄĽŠý×Ëťđ?©[tH/>!.ĐXćA¦ßŐćc‡ ôMzUĐÍe¶d‹sÇ85.çÇÉ<Ár'›ÝF{ŽjÜĆŔHŰrfĽžľ ‹đ^R ěěŘ k°î˙ˇ-sł+:i6űkľĆt‘–üGy#Ć$’=Ľ~˘U“žâĐ”mŕL OřuÔ°ëś)˘Y´ŇĂS©0ł ŇWj>čTi‘icë$«ÇĄ,ÖëĄ,ToŐP‚@.ߍÝdáO¦…{r‰Riy„ h»§îZ°ĄŽŰůé«ëŰDËźâ¸ÜŁŐWŮäXH\Č$ 5wgoÄ4Sŕ-‚ÔĺOąň…Ŕ đšM=ęüŞĆ[‹x÷5T3=ÍŰ Äě ż<«Ŕe¦ >Osh‹JčŠ`»¦7Ĺ’‚şRđŤâ&Ď$k¶ÔF˘B ‚ÜZ’ÖďŇ)ç¬ůůŮÇĺogü†(Z¨Żô»Ě,®§OaÁ9R3 ËşŁOŔ­áá„Iâ¸5Ę„đ0ľ$k ĘšÚŤ đ-qÓѧĺפĄO›“IňT©§i<Żë ;[Z•L±çŁ5PËC[C©12‰6}Ţ•í>ľA«ą w#Eqž;ÖŠüWÄQŁ!WNö ¨&u˙#ˇ©§/ĺźµ(ÔôôěĂX'&Ä7iĆüčůČTą8ĽGĆ´ ‰ź»·š'˘&hŻS ÁÚ}šú.‰~őb©Aę]||ŕÎô÷K‹·|×Ĺä©  Pőr+/A“Ýŕ™ă‹‹éÁßg\”^ľL– ÚĎZ¸čî™8G ž‘ÚGhžšE}^×»qź ÚňŇqúŘr`9…ŁbjżCzŢ®űoi'-‘›'ĹşB€ŰeH˛Mń8XlʇFb 3F ú5¨U n/3[v´ćĽĽşNč<ŁU`hŃ,‘đáů ö™ŹW6‚€Îć-č[ßĐŰĐ~R˘ZţUbÎö4şş-›ű'~ČA@sÍ?˙§ ‰żŞBPÉX ]ydë–hŤÎÝ„|Ń`k.ú%bľËÝ•N‚¬\sw{*} Ä>˝\RŻÚYîŇ÷ßŔt‡iŠ0ŐĽř~˘ŚN‰ňĺ¶IH!°Jo11ô¤5„ÜN ŕTl&l1%ŚÉ?'Ŕ$NAŞ rW^ľËľkˇ‹ŕs4©`|'Ł™ăJ˛”éKS¨F¨N‡Ł?ž;„f2 tX9¤4– upałO‹ĂAu8Ç´™ieŚ÷1MńE™Ŕ2Äň„Ťa‘TŐ)ŔĄŁ}(äCĎh7*<‰—Pcwk\Omł-gĂÓÇf 4k/¸.LčP-lŹ}ŕ‘(9Ô©pt'zř*=Â,;á45`1žţŽ4&ŽK‹¨,n®SŇ}ylţ ;üíÜťB˛•$é‘aČ#—•ŮTťgĽcá÷í„S»'¸vÂôüŔ·˛,š*ĺn­wďş@5WYHĽÖ“ťU%Ř]ŤsaÖľ,ˇu,˛E“¦~WYňŻAĘ4' íS t±Ąg˙W V¬%ÝąŕAäĂIýÄĎ2>,fźpĄYNw€ ÝŞý×ٶö†đţI đÓäČŢÖ§,üÖ=[ci*$ v2ö¦¸KŰŠ«náň*\•˝ęÇx)çÍ’~jš!NiÁŘ$ `U-Ň€X‚d»lő$‹,ę•/ý™ řTHĚxý˛6Ρëż:»îOĺx«d˝žŹ&Ę—fEşÎë#Â]•˘ËÍőF¬…[äw&×ÝĎÓ[ż“ ü'á7Ąąë !ŔŻM™á±N<úŻ5+5|?…ŐCŁELř¦DÉ3ňŘfŰĂu\Z ´óŕŕŤkÖ kT«a8~~»˙ÉO‰á«ßšŐ™A@P}úśşżkD9Ăń¶ůžÁ ‘K’7w­._ŃéLpŻ˘!¤ŞäŚŹh3¤q’Ât…XýR¸ ľ~~Žuö/i|Äër:{É”Rb÷*đ“fâ×ň}…T ‹Ş¶( %ŕAJgf“¸„ąŹó帩_]Ö·żů~ ˇč¶ŕŽ4ÓąSý`—ÄÎhµŇM˛őg÷ůmă +ÜŇÔĄßĘE3—•ĎIě±Eh-)ËrÍş§Äcâ7„E1$¦„ÖD.‡Ú&ţ–+ßůÁ*mUUhłçßü´¸éÍdE\—>ńnJ‹Rž*YŻ"°=”ľŮD9łşüs¸$Á§Š ,\“Ô9Iŕ{(,¬j÷mŐÎŽ@śăę™Ŕ–Uׯ×ë€D9ÄO2;ŁkiŇŔüZ(Ďż˙ăě±.´5ő$T%…Sĺ!h r¨˘v6_Sđ>É»Ü}:ó§Ü·đĄC÷&żj€ &\ă Lú†´ď° 7÷â &_ч‡˝9vŔęŰ čľź®Đr•ŞG–¬IsBDž<·t¦,Ä<´ĺĹ\󥤛>k#3JÝ\ůďEpĐöôăŕnymáNŕid"ůŐ8ÓŽíŇ@Ŕ•gI|Ô;©ÝPe\)qg»„$–t’ú_q 9?XŁ*ßÜťÍ(f'“r Ĺ"kÎČęĘüó8/÷(~tčµRŻ;ćšÖ1DŻ– )íŹt:©Ź#Óa¬śł˛B +m$ža+*#1#Ş>¨4O„K˙ŢQ vgśľr×uÇëYŻĄ’Ö—kwyy;'^ý\aʧî™Ýá˙Öńą:ęŹ!mlúůęH¸ům:T× D=j‡FŇH ÷+ú <›€šŹů<Ęzž¤-ŃăD°/ĚťB„â¤Ü›0$ś óűf5‘f¨4şĚ–Ů´5…$pşBŽK®/ôČňJ`kýŞéÁ+ťŁőľ‘šžrĚĄäbj"íKSµÍ5J‘p§2€÷ЬĐĎEŁF’ Ňzşj{€©ĎŮ&ú (Řsş ¤FŔš3€·j7‹řĹ=”-’-™»¬ő.šoÔťü°P‡«7ŢôěŻ( ĆF5wkŮŹăG“.éx›vRźŁĄů@` .6Ż&ĄB×C*ŃŢĘ|jl.âŕJRĚJůÂŘ#{&ŐgůtÉ^‘bd;5«c_oôTë]wK˝C˙ĘU|áňŤ§Ň_.M~€µäo!€ÚTtň5#ĐxĺöĂ´_%F˛u{¨7u»Oř€ĺmPe® ¦ľ$%“&Ř?TÄP“ůÇŹjr.©M·ľZ?«Ł™¨H€‡ą;ˇŮ§Ş‘<$éá5¨ %«Ş[żuö"o4›í¸—ŕ»-!YÁÓc Ž­çV ¬ZčŁÁ“C5#E9¤x6uzů^E€ŠŐ†©{=ÎÂěŠâ‡Źś.‚gQ^Í"µ‚ť®;ŢÎ2í\‘ÍXˇŁÚ;G×aę¸X);3J;k$ Ó˘YŤa\Ďfóţď_DŠË…óx¨x6Čü@XăUNÖC°­ @ö4N‰T=T‰l[»3¬Á°¤\˙ňúăQQ=TĘ•ôĺ˝GX5JÉťŐ:’Ű´v‡Š o5Ŕxשڠ64ăş>ćť=ßoăkT}N=*„íX„pĽ™Ói`đ“Ôl(łNpď¶N4E dÎ,‡‘o=Ďąś¦6óâđ1"‹ţ­$-{”@¬b®Ćś…ýžË‘06Ó6B5jt˛ćáLC»Âř[S—ł®ÇĄ™KG‘ţBjŇł©Â&É.ëuƱ9Ť·85gŁ‘ęNÎ]RÖod€©‚ĘťcŘ/*›_=:€˘Ż4Üy$WQYä¬ ™9:Dd®Ä›IUé¸u%˝U; Ő…xmTŐvÂtA@¤Rf`Ô§žHCg.žäň‘~sg„Ő+¦%8@"_dŢĂŤçíěL[xłž¬®ő4UźkÍI¬"b^¬+Źëţůĺ–!3Źr3n•dŹŹĐ)šÚ)Í”Bű1§%‘q[HĹ.0]`vµÁ4v°@IÄbLi0ť6čŔ¤3y¶e¸!f…ĺ™°b“+ÇZ®ŢT(ŻO»ŕ‡ ş5ĹEšg(oŽ'±‰”ˇZ®~ôo'‹róĹ´˛q˙†ô¸…űm`yÚL±3éαźrÔ„@0ćHHn´6>ůů ;í-?n.ţ,ń•!KČ5Ŕ0bŽ\­ ”*şěŰ/hdţ)Ů*›ôąup1w‚Ş5UlwEsiNŚ!&"1šO™+Î3r);ń{¨Č Śą¤AJž%/LB¦ŕ|ĄFľőÝoő;őlzýüY¦ďĹ'ŘŻ há’“öČg ¤Ą‘4š­¦ěe…űKmżÚv2Ń ję˘D«°u8W¨‹ś¬ Z‡ä”]ťjŤ|q`¸—:[‘ôzçNO…‘€ž>Ţ*nO‰-÷‘–ßć©ůűý†¶Ź¦ˇ‘˙yý´mw9¤CŚř:ČYŢĂŢő™š¦8łâä[ÄnŻçG|ť˝,!Fšć˝,^]őLöŽîČ^ ë^¸ąÍ‚˛rÄnpçe V2Gnć lđZt"# "ćä=”5•ô·>‚j=XgÓŕłG©×çěÄôőä™ĺĆn¬·pÖµ©<Ř7§vENŽúédźl·Üń6ôxc‚žR—Ô…„Ü1‡7˝עÜČČËá ˛ŚxłŻsŐxc0ŐͲŰy ýCĄ”´jŻŠesñ1vÇÄç,ú »˙ČÎó#kÉšx(czf‰ýƲś<V­z“bMÓżE % ˝ťŘçč4¨jɢ‡l)ˇ”0Źžć}RŘxçJ7ćDµ°DÂ~Y e›‹ľ|ăB„!3ř,ěÁ«ŇmżŕTëwJh9Źe~4i¦ě„ŁŞÇ'©‘„úu1jťł$yL‰ĆŮ…h ‘Ęă_׸PĚÂ7XˇLLľ9ôäŠß dČĽDn÷GŤá9ĺŐVŁÁT‘ ŃÓܡóĚ Ś*§ěcÓŽCĂ€%çNCˇÉA’Faäç+Š ®#©_ŇfăF»18Łšvj©Ť¨ÍL°E0řMßSőą™}SîČäPt<üľ´Ű3ë;¤ţ˛ VŞ9dýă Gfó|Ůy«ů`DĚůřÓh#˘Ł2×Ή`ěT˝!÷ćQ+šł+˘A*Č~ĹěTŇuÇ]m™şvî0ëĽ9㬊ESهt«× ZČî]aîeńĐÉĚIÂčÓ8:Ĺj(—Űýfâe˙śTI#[A®µ'Ý{6†á›÷§­¬UZsRÂ-ĘĎr¸¤ý÷+Âé$łéD˘pçŞ0Ă_sóV:ݤEô6ËPń»ˇ1ż˘R'r}3ý.°D­Ď@MWÍ´mlj'7‡;‡4y™Ó4łçńv'Z+¸hÜő5d.·NY;,÷7ügÜ´'aÇÓ#ă„djÍ"%W©©ÇNšdń~iŘŕ`0Ô°O«­´®ĂÉ]ÍřXĽ-#b¦&ĂĽąwaשBš”Řn7FýęKZ¸­–ť3Č’ ÚĚX¨…Ő+µŔRŹ,‘Şřa'A% iShG=0;žR¶Zcއ” v¤Ç|ńü:lK¨%ţ•rhďë¤ĹÔď`3šŁ+¶”‰Ž›´‡7"Ü˙™BŇQ™1†řFěFQ˘3^¨\!.b&v˛Â‰ŕ28 Ŕ/Ři.Ű*éŤ5oFďěe±ĂX˙«U]„+ą ˘˘Bř„L;±];%Ä\kţÇţŚ?łaŮÖ'„™űÁó ˘(…ž WĚl]˘o=ßú‘L°ÍČü)!o®ŠęěÄě9Lä`Ď|Ú’+ť‹óËť·Ź•”¦©®júqs˛¨PÖľćŰĆ'Ë„’č9%`Ilž{©¦C‘•J-”J Ľd›ëĄĚ'ŘÔ1’ďÎ˛Ž‰5í¶áśž’&A±™@ÝbŻÓě#¤K$żö;âH§Hŕâ¤Tłz$Ĺb?y“_™r† É'©ŕßŘ5Aw}?V÷,’s[Ç]>V磋÷ęđpÓŽ˝DYŽ©Ű]YĐnr3ĂÓÜš¤c“¨*XĐĂlĂs6ˇhf·ä¤€Ň)XňŚ9»Ë»±ŠúW‚M‘8~ M2w'“†řy "ť0dAŰAć¬4:c™¶"Ćç>D˛{´j)”Ň…¤*JŁžw„L®TpÎŰľÄňşžÎZŞÄĐ)> †J,~¸—2µ•Ż/2ˇwVŔ=gĐDxĆ‹Ln!ĹPŔ›u†?Ŕ‰ş*?˙Ô6:ôuݡ˛ôďR«›ÓQ+˛˝Č3˙7AÝ&~ęćç-Áä:fđuaŮ7ň/qE…ş((m,đ ľŘšÖříř{Ą/ÎŽh…Ľűě„qK*y9‹n'l´Ě¦J(-î©´vçoÁÇbá<ϧ^>âęČÁFg(żłr¶|J&S}řŹ=Ŕ^H˝ô7Áţ©w†ď6"MŢf‰«ÁöW+˝ż-bمж`Ô?ÄÇ Ş¬ óŰődQ—YG'ݵ=30r‚޶Úk ÖŁz‹§óyý`آŤ"BsĄtc­AŕxqŞŰnŐÂ*sBŮş—Š7ËěcĐIÇZZ˘ kÉdÔW©icśňÚ˛ÖyÔn›’Óń€ăŮ›ë2o‰p]Ţ(Ĺľő±H ¬ŮĽˇvg µó-›ó`r€¨ä ]Źuv]”ĂĽ‰SX,µ‰1Ś%d"+|Tč=‡ł¬ŚŠĚáUžĘµÔ˛ŠŮ:(gOŃ6CĄA٧zÓe×?ˇâű!Ű%"[‘ě 8ěŁĆ¨×’ŐˇšK…ýbăDEj‹Â€‡‘®č*Ů· ^ńrężě+¶ěä…뇲PśZ ĺ6ÎPƮýcKÔ\Ąułp1špD]„–Äçß˙ŐďísµĽA»«7ŐҸŤqB݉ă^ý—Ů\MVŽýZ?1]‰BeŃëJ eÖĐĘ;™ßň €í'е›łiÓF4›şś¨¨ĎBĘÉ& LÉĄě4łkŽ\G=§Iyşó0T$aY˝Ţ·ć2đ ˇCϦ43,šcÔ¤Dw/˝Ţbŕ1ĂV6őĐj4äk›öGÖ˙aĐ*WV‘ ®*ÉF6ň–(Ľ&zÔsÔ×ă’­*q_ŠśLç#ĺm€‰÷éU÷5Ń{Jűń„×ßéPD†jL| ąłOo0%ËŃá+”"©áĂixډ Ĺh´ŐjjiŻÔŠÁßŐ–ΞůŔä.~ FůsMţşÍ59|/TĆîX¦­ĂŔ9Ş7F_>!…;€[EV ­vEĚRŇ1&UŐé†RÝdÄáË^éžO±ËÄ2ó#1€e  ŁŮ'¸@ę+'ľj©j;á¨ÂŹĹ®)„9ú’ăöIž®OÚ໢nńšě[-U„PwÄ©?¶g9Ý8$-‘\ XÁ­RŹ~ </ڱŇ”ŻÔĽ»Ň F‚Kj 4ŕĆY´FRZ°ÜđwźęŠs&´ŤSiDÖ+Âbŕ˝ţüőůˇZbě)ÝŁb~ýśľ8şgöýÓ`éÖĹęJĄEkµď)5[Ő|ÂsJ0=ĘfŁ÷pZbi‰Ćeéłő;2kÔĂ湢űTŹÖwE[íNĆ1üUH‚ďĎ¢(2ĆŰ;d^Fšu¤š9Ä1Enu¸ŐIŻOýi/Ég/–ń}_8čŕşC÷ţMĆXp1g÷eXŰČę°”¨Xˆ ż˛«Ö2]);źő\ő†şçBbÓ'H»â†‡6ŘOŘRş°î1xŁö_7Eöľ %”/Aĺě/Ůč6±«ţ-ĐútC»- Óó}':iWwDC‰’*1ďś÷ťŚBąLđůX™®ÇҤ<˝~5ę»!·sSŮçä4Q#_ŚűĆüŹ»(JAé ńožą†Á żxľťB>w‘őÖ_‡É“Đ‚ą¦pëŔbö9yY [JrÄŁâ±FśUĄµŢŁ·¨µČŐtîŘ|Š&ŕąźéz& ć;‹/ŢĽjRľŃą12 čEś&¸Ý‰rčŘÎńsě"°Ą^šđđ˘ .çQ¨Ĺ÷ôię95}â¨leŇjÔF4ŘŇ4µFŮúÉjŔ‰ű3Ö#”Xkâ¶VżŔ‰73ů†’+wP‚µę FBn”Ű_–4]?ţăwP”%#şăŘU_Čš÷ˇÜgŐď;­ô$ĹŠ<8¸µS™Ě#M]A» J"(‚!Ąr|‘=ęĄMŘČilŚŔpUhzĂ”0VŠĺM« 4j®Ç» K!”âs†¬$N]ůěXž,E}.Ů›«=$ ža,\»XÂŻDxçűőÚ¤0U},Í“—˘>ťd]‹ŕʉA§äuĆÎ;ňůś1ĹdŁSřĂ댵Jl$S„Ű“|vbc5ˇ˘žűŁ•~ňôľF€Ý4<¤Z“›Źy–äP0d·…őGą"<-yü¸Ś+íŢ *2»IÍ#×5@yTčëw"¬S$é(`ÎhµłEĂmÁâ\:źz‹ćŤJUÜ4[3Ő©D^ŽP~Ő»˝ßFAžĎćŠ|’ařC 9:Ň{ >DĄa8>é$ł‰¶tš}˛0Gnu±ÔKG9˙J™QÎą‡ÎLżŠéçĘ6$üĆŤäÓ/®$ő¸ľăŁű0¸ŇI•ƢąŃîQ°ÇY•´­?xo±Łçëö·’ŤiÎL¨Yé­§lÍ‹B6aK"Nýćɦ;™ĂĆR‹Rô5s}¦đSćAźRĎĄßĎiţH°Ą`ń'Í™ô;­ćÉ—§ůI‹Ö¸ý%ť™Ř°ă†›[Ď„á“E÷ëëçí$Ę2ţ٬‚čNM@ĘÄžX7Ś2on¤Q|jA˛üł}aň§řzżµ˛-kÝFĺÍ䢄úyd§+y«ăc3E]â#Óß7 ąh6˙qżîórc”ëiM˙€á† ôA݆§\9ŕ4mšš ©ś›Şú$yaUŕ¨ă>:s‰ŤÁĺ)-žľ’r*ŕ:.Ż· r8 ňäÁ*‡¬¬ź!ě‘)r OË0±™˝‘™+ذ¦‘€u.Ů‘ 5QE śN­ßoŇ'ę{I~äüťŘĄSŹó˝ôb1|ôŢ“8~XÓŐđ ß흆ÝÇfÓä;H‘ńrAĺ5ß/•pyţů«¶-˛€wüěHgĺ5l(żůZK¤.«tĂä®VăŻ<»Ř¦=A4KÔmÜ"ř/Q?őś9„ĆÁĂ“‡Ö*đ÷´îM¬XEž"#§|8i˙Âġ;Ž3&­4µE|dé#ćPś×Ô(\vŻTFĘ“TeĂ€ŮgôvVC,Ŕ”ę'ˇś)śë+Í !3raŇZ÷ÎÍÇŔá ÂPü;ieWsVo»ŔD[Uľô|SYjľlĆÖ‰CTÉŰuˇŹ Ć(¨Đşąřúă¤~1$ßŃąJ\ÉvȆŞ< ď˘9°Ľđą$§GÄŁtŁ»žDÇéäÔ„<ĂŃı ©ś §, %XîŽ µ3Ę4ćîÝWp'BMgĄË¸6őtvH†ňÄ!ĺl0ŃGOŔ5mż6“RjQ!1ĆP×*«K€…Źč'^őśĽ 'LdĆýҢ¸áClĹW­3Q nîÓťÚ8™çO­ˇ Ť0Ë»Úę3pgĺ‘ÎYÜn)qO«»V’‰ S»Ý¦ ÉĆóíçn¦?đa{žŻ…űdsÇÎÓ\XÝ’öłŕv°‰˝™,s+ßÉl@›ąc‹%BlÚ—hVőĄ›Ë«Ľ¸ÄMĆcŃ<ąFVřÚ"Ĺ uŇB팱Ću}ĺűőì~sĚ4:ŘtZĄňŔ"§18"ůŇ Čr†ÄI,é őŹř+Yµŕ@H¦ćČWy©Ô ŚŢ3„ňOŃc‡ ‡™·p}ĺ3{‘!®ÖrźéXˇÖç¤ŔĚéB$tV>é„/Éň€*™ ©M vňä)8ÇT3§Ęâ—&çĐ{BMąô-ÜĄ˝ŻŚkâZ>řÖzRdŮ·2üo[T .`–Wz%N8ššË—Ôył—-ŹVŐĐŃ·|6=Ł l*·M6]ˇ¸Wć±C”3C ŕ]ĹĹ»]+ęŁUňőşě¸@µyK÷LŚŚĄ© ć»”–QÂ3ÝI1&9Ŕ˙b®]@‘P_ĄDqm\z!Ńá<Ě ĹĘ$1°ĺ©y9ťĚ=đÉôI[qŽ™BźdYë=ߦţí79z ôŮ,„ř;WTf1S´~3Pâ~c‹‹÷o¶xŤŹÜ—(ćoú ÜŕP‚˝ő ”Ŕę)ŦšôÔMg`kʤnNwUyĐ»ý4rF˙#gĂ'5ľä&;ś}¤Čoî|ŁĽ.®Ő|õ%{•Ŕe!®öJ cZĄQgÇ,`d¶R«·Ç ^:‘>+" ÂčVx|:‘'™¸Ü2kZY“páÝďH˛Sń1)Ű4ßîKÁÁÂ/)ö#]ă.ňZrłš bĺxń„3ˡ”—Č‘ľűkXH˘ŇőIu-Ť/ę5_§qě‚Ö9“fgłąŢžâCF%ť„A˝îp„EÝ<=ŕçh)tW1@UŚęóů§łę%%f%šdY}e ó”Ň ŮSžíAÓ äyyźř𓇗5Şd˛bJŤ2¨Ź)wl™^˘”¤/ÝęŢžî<\ĘśW–Ă®ŃשDÔńEµOŻ>íËë݉P§˛xL§o[˙vAbŃÍpĽ’š×*&ţ0Ńęš×% ¨ăµZ€\«üĂN€]1Ă'P"¨ţ<e—~ćWăüď©Iú9sŔkŻI€vŻQg†­żlVÍ Ś¤ ůüÔ‡m™Őá˝vŤŚ„ôů„E˝ ÔPř‘"ţČ:Ř«†ŔŁ=MÉ‹Ŕ_¦2!pQSßB5eP§*'üyŹ ‰wź]­[ź0d”k;ÖÍĂŃŮ˝ż;űkNé”ס T‰fśSáÍď7z_Ď’ Yţ,¤iĎô¶•ďĚ…źČ~ňÜiÂ\)˝1·äxZ\_şĹß ¶uýč9‚2Řf}fsÇ`>oŻ÷ő´–}ýüó~ż€đrĎń¬ÓM]VńŰ[7‹ÎÍW>Šó9tç ‘Ő ţUŁŤ='3Čf!®ÄýřÓqż»Kââ4gäć•ůvŹŁÉëěÝćIńöüűż•m E]ł3ô, €L¤nąuO –P1Y´^‹X«H÷Ź.bĘţ[¬ÉÉdů ˘˛¤ŔߦíŕFýik4ŽĘk0GËŰNvf÷Ńż·+Ć»śNͤ¸Áp°Ť8x¦śŰšż€|F*Ş;đnďÔ´É\‚6AîĆ!\ř$|”, ź)“?ŔśB©–:bźV#;ě„~Đ;şßĺýÍćäpZ·ŇVJŰ’˛Zó‚Fď4mm “”Ż Yş•i•ÚVö®i縀–|mĺĽ;â—iöZ<‘ůăÄ1Ó1ť2™ÂvVQéuzÂHô( 8'©őňťoâ‘•ś­tË:‰ý×4&ý[2‰?0˘~"n/Ą!p]hpÍSHrúŚ–ęF‚”“ąÜČsui0ÜC3„8p¨°ĚÁTCćX€¶6d}gB?ާx?hęĂë ‰ieŞS•MôÎ]Ôä˙l"3«Ł…BQłčš>Í}Ř|2j>[T–čĹZ˘GZ?ĹÇ·řq ágmn< f*ĺ<éäUś'óSG›ś [5-e—S“gŘě©.ĺAŤĹ·€¤Ńż€(Űh3ąV?XżqʦßH :Č<-N±=6éJôбţŮĺ%v"CÖ(5ŞłŞá„ńx°4¤cÔöď-#ô(‚zöČĺM>âw9¬·Mq´Ś†ľ¤4űݵłm%yđЏ˛Çw!xöTcçFGc/ŇŻi˛ŕ>Ô]y×÷Ľ6±jßýrîkĆ,R©6¨¶ÖÜdEµŠEĚřŢ!eÔE]6űřÄný ·ţC ͦˇ+ĆăűZ/d:R˘„|:g1Ţędš0uZî0pÉO}Žö«ČÝŢąHŮvÝ›ńćG@MöŞ8ĐăW._B€ŕJßjHÝĄ@yĘęáĺÁ6?Í †^·ô|Ú8Âw{b˘˛Ż3hČ'{róˇ"Uúľ+ß§wŕ¨tŽ\9RB{DŇg«G:¬ ů= Á˙Čk„‰ž®ąŽŐ)/¨i^űMضÜĺëß^Ăľ®ęöjěŘâ[dѢ5fSňť9˙QgTÓ}nöÍ(ĐMŮqMł9÷QŁmAżť·ť+çgj }0ҢR¶%,ÉF_Śű…ü:••P|U<~ZďŞéĚL% â›dzꪶŔînű#?şÓIJĎçTˇŽÉĄç.çÔđř¤f3ý-^I’.iŮ›NäşŘNqUŇOÜął&Â}ŠňűZĎľ1Ă!쳚ބő1öUOcYÜ‘Ň&hP`űx’±Lq´&Řj]ľí·r"'¦ą´MôĆJ:^Ůx§/öś€uV ‰ăޛ܉•IWJľŚíD ĂĎŮ3\Qn&zĎÖîÔ ŮŃŘˇŽŁ Ię§ĂšB,p,őŐră¶öÎ:ĄŞZͤ’Ôt'‘1¬»í=ÇÔß(1¤qěuHHýĄ˙X­YSD ž‰¤±ď Ž@6ŔoXůDęBů›e}Lč•^ŤÂ´LO\ű\5ŠZGŞ+ť˙D J5ę 2á‡#Q©Éévcď^ŤŁOupÝPfŕéů«i{^7U?ĎŚńě—1&űĘsKîŞI3LĤłĄ%˝2ídk€˙řĽ ‘ë4đ9»ŃL^G‹8lAŻpNC⌉Í2'鄇§ˇŇ+Yw›G0@ŘgŚ7aóË€é6ÎWB56~ťÔř‚¶OđôÂgíř >kpÍ#6—k´`!jRLJ•Ń=čěą# ÓWMą[çŁEPÓÄľĄß7˛GhŁSµv2DôZű€č?®8ĐuyĂĚ~|(ťg˘Śňp#ÉŔ Í3ť™•ÇČZ‘Ýgk”vČljUĚ9Ţ?˙´;^ťŠĂµ}ß©‡ťŁŃbîEę1*CŹěů8]Ł‚âŇůPĘŘý¤µ®\=ŮŹ\Ĺ?Z˝×Řř/ą;ôEZ´măĂ?ˇ"~î˝:­şă+Aug(eKl;)´ĆÂÉăˇoÝÍçůPĺ„.e>K=[čĂÁłYËžß/&řZNŇ-R-‡”ác9Yî $k;=źU¨·ę¨ Iď` CĹŇ şëbÖ$ÇÇŽ•ä°›9˝ ZĄ7Ó%˝F,”ďŮtŁ'Ă*|ĄŚbWőŞQd§vÝłp-}}&%$S.`!™*:_Ć…Gř"Ľ&鼶aÎ:«’-Kwą~ď¸węĄ(ŤLÉÓ.ŤÄ®BŽn χ—<şHxZÓ!8(rjËçCpX‘¶ţ!ÓCCŤn3GyŤV‚č7ąf^QËL•Ô'şFU»­_ń;Ęz°oFA˘˝ZÖÍězB.rˇy.KÝaó nJpUźL…{Zs<ç÷S=:Őů0´Ľśp4ľ~­ßήA§řó·Ç\NLZ¶V:mś‚š„§j“ďGEąWŚŞ{ňx>źz=Ł1JŘÄp2‹Úß0ÜEš·'żiřH%ŰŘEšr Đç`­Ţú]y7WĽ›kÚ{@ *8.Ä)΢ä(;9µJ‰pŠ~—±˘@)]LV3ľÖęőŔdţr˝˙‰¦§ ˙`•Z·čp©W.é%ˇ»Şłčd@4ć$݇ ”ËÂűĽ›ŤTgÚĽ¨ ýľĂč4±ň*!xKť=4t?‹tËŻO ŹUÔ˙>ÚőÖ0¤ Ă!űşQRšŚ#©?7ËßĆW8°,)î_xíĄéRRLMZε ·—ą;&˙K›UčOďóÎIđlđ-8‚Ü)#ł;ażHźzçżm P«ŘE٬I…·ăě6ś ŰM)Ý ·žĽH“as´f_ëßZ+ú]8Ŕ(­-*föţÖčěp‘sŠq“˛ŤóenňLÍi8G­{•pŚH˘ýŚ#ĐdäÔîŕÚĐVŕ”Ěh¦îě «s±v™0‰*őpě×ď)) ŁÇľżĺ(Łö˙ĐŢăz›ČО>*XW?k‡©mú‡DŽ•BŮ$D&Žl˝›3v^Wú,®OX.ű% ‰5Ěŕ}t ]Ĺx ż-)ô2ńýóĎąP'ÍŰŇŔĚokc2 &]DYj-µ:°bkŹsÖ@ –Żď2ŕ(^¸÷,Ař–źťČť&ěŃO“ˇÜ6Ňř`RĆ®AĎ>2QT´ő í$’ş “Ku$ˇ˝®úJżtÎďs8QYŞ^ z§i<ÇžlüCî%€ŠŠĹŁBőľ @˛tv[ŮO/Lî}ĹÂ4“ťZö‰ŤĽµ~ŤĐq´ĚŔžŤ\o§ÇjŁJřŇF±±{ZUcó:O«łGµ´5„YËɬ]öÇFV¬č=kłl5ŃŢ\ˇI§ö’_ŻźaK?L>ÝŐ°`" Ő$[ĽĎ­—lë°Đ*k]˘=2N--`˙âřřM§Ä’ŔÚ `ąż«ăPę\ )«őŃţ J"kŻŠF¤×şĽjٱťçęó׳łäôÜ•·âć]-a‘Đ]Gö’ůÍźÔ `>B––U¤ş1‹ůŽ)ŢPô­ ¬ű‹ű26?SĚČ٨ŠlypGŘ>Ş΄uCĚőOôt‘ńđKŃŽKŇ(řŤmŔ4—§¨‡¨‡žR*Y*}VK`[‚´%.Äи“śjG´@MR]AiKX?F2BEQ_/RJş?â:îĘf%v=FL…č?óŻ™ ·ÍĐÁŮĐ3P"v*«̇(ćÚ6µŻ+áČ}e©kKpë¶Ů{$÷ ŁjHo}%4"O¶Ä;©‡–9‹ĘOciÎ|&m–31¬yrăÎîÍ&¨Ů,Ý”Ôx!›ćîŰĚeŤ[ĚäÔhíx$ĺ üąH«µP•g)‹^BŽĐ„;YŞ3_V ڇ´äôD–ŚhcŃhx;هGf•Ą‡>4ş« 盵ą(…?… ň‡ĺÉ>" F,Ý/†NéM˘EEľđŚÂŹł\řô kV»»!抵޵öůčmź¦ňIpů!S µŘÝ9–X{„ .S–ň™@Ĝʔ¨G¸gůšţU˛ş#Đ3Ç\s%‰c„ ü† îkJ&´ű]Őh‡Îu `ÔčźŇWÉÚşYeŰěń“ěV™u†N7ł~©L‚Á-ťŞ8’4Xl•<îůő Đ?ˇů!ŻÂ¸o.jů"Ů'4 ×ý\˝Mś|_í°šĽň…ŘŽŹźÎΓ؉¨ľ“€ZQR,qDxĂ\0Ŕüe(I6˘ÍOpk$uŐČt? íÂZ.~bG[Űh‰×X˘ťŽÂ·*âńLâČÁ2íT*ůÉ<†Żm’±ÇWlŃĘKqEÉ ťQź™Â{GEeďé¦NA=z Źţd@b2şř˙áśÖŢRÖâWe‘Ĺý‚éy"Ü äőínC@t6Y?P'’–€.Ł©Ó] cĐçąĂžÜń¤30ci¬WŘě\IšÔ1!%aT&Ĺ ň/HŠb+&Î¤Ž“$šÜîű~;ôŐŮľý¸Ç§rÇćzÍź?7rŢbŞ‚™G2Ypú‘Z<Ři›Rs’}-Îf›đîŮ„IV’ňăaKÝË´(K©ÓQPľĚ×4f®%ÜJRę[›r,Ü Řé/SůJ m'%Ż)0ł,N˙ł÷”|‚!6ăŮU¸kŇě¨ÄÉŘţF –QË–)  ·QBr“ÄÓ`‚˙–{>ď÷§ş%"ٱż!Ô«›x)ŽFŢUD©śĐµľĹ‹üĄW­•°"cg)ůÜž°dŰęÓ 2oC&9h2/˝ů•łMmµŞńrČźrę+ źóÂů/ÄEĚ`b]·|ĎýepeŐ|¶®Ż‘ň žŔ1[•űŞ»ĺ¸‰!SĆú0 ‚^KťÉDEŠĽ]Č]›—› Ăž3—Ł”cÉăO;sđţŢ‹čÔěO^eĚhgC)¬uµ±~˝~®~tp ňGвňÖţeĹŔ­tlp<{‡%nŮ#˛X…‚ˇ1Ż2Ň«čnö rPťĚťOgöf5¸ĄĘ‡bdT+*a'˙{g&CV…ĂN"ú¦ëU2ć°€%VśúźkôµÎŤDyą˛M c vFŤŐ…>L đéřjłb‘Ęúďvhzýč­Ŕ"ćˇu¸yţ‡čŢńÝ ěEŠ")w¬3=đ¶·Uxj˛Ľäč3z‹Cű*6ňŇĹě_¬TşKFů©8®ł3ÇŠ-ŇKtÄS8p•é%)ęÄÍCSĆÇkoJGě_Ŕ»ZŁď!Č´€·»Cuĺ=Ö%ĚOńal\¬;¨‹ń÷t-Ń”5pę¤i ”Qř¸ůóisđ{xFql§žhř;§óŁÇçM%î8Ášd…ĎĂ‹÷ć[.›năA’%;źD>Ý[·ľţLÁd$˘MO¬GÁT ĘD˝Ůą×YĂH3u@Ü„łňO»3†âR|Ăř_ŹŚńú lT¬b™`N­Ţ“˙@›˝ÝÉ›č¸×şÔÝxBŰ„Î&ëšń-ŮUŘ`˙PBĆLÂMűß7ćJý.ľ`Ňá~‘–+C酨ٙ™˛ž•`ź×Ďă*ŤĆ€o4×?N7·­źŔ¶Çă(,Fčü¬93˝™¸‹ ^ŇIT‰Ň7Z'-qz}›6g¤Jw':°ă«š´k€m‚ąň™„ööŃéđ ‡ íŇÔ<ăĆ6čgU\:‡ŔËG"»Ŕ…ďÔĐ!SŞBÓVĂ÷ĹSD‚N‡ěî& ä1©˛ Ríőzë˝°çź1eúűżçóY «|d@9•żä6{q"3|KZ~ůaq7«ă"LA«:ÔhĚÄ•8Ń\@ \˝űăQŻ!ŻÜµř¬Ýâ膑¬¦± 3Űg_LhnŹçG͙ݻ+n*ý č1 Z<Č·­ű7g·TęD±¨VX°Ĺf«;kqÍ>Äť#0aĽćáІŕ߼V?f%qŻBš<5¦Ég‚·t'˙Ź)4+ć?-:‘h>OŕL¬ĘmóiÚ|¶Ą\;®ť”:ÝľŃ÷4EɧYËm¬ËĎrY¬5z$R&j˘2˘T‹Ą‰&…FéŘůÜ|MN€ëčÝTÎsÇ Ë€ľŐ \—©ÁÜŚuqlŁúěě$|J.lÚÇ môôj#)ěˇřV›@&e“vĺ2ŚŽ°đě‚‚ńŇx^˝Śť¬‘vicÝ;%Ʀ¦\őeą“ ™óŁĹm¸E ËÔVçźÖ:[vuÎ%îR/SG(ˇ"ŠĄĐ§ô»Y%o(·ę]QÎ=â±[°ľ{řBöăEg»ó¬ĚLb˘^gżÔˇţąqćB(ńcź_‰˛ĎdźJÖ%üQˇbCwl Z»±qG*ŻY Ňtx®"ŁX3ĐKŔśŐÚŐ˘e kýÁň‚…äô;0dîW8´Irż„deîs#Ó6Ô;M‹p}‚7‡\d‚…¸RîÚgÂU«:éĐwîăM¦{µĆ{(5ÇíQ˘ĽTöđŔ9ĹŢ$ĹW%Śb]aĘ3"UE˝ÎŕGĐż´ ÝíĚý9úŤnĚZ óˇ}ş‡!k*aí˛Uŕą, ˘ÝguEŮFçqTwŻľ˛Í=Îĺ,6Ëĺ(¨HÄ`7Őšě1sҰŻ˙«GB¨A6Ldá+*gŰwyđé|Ä$üÉůnđFô­Źő¶ÍK)»ľă `ă˝'8\5âV"ŃBs†ä@…ćć/äV°·‘ˇ"±9‰ŞÇč:.r&ušŕľz,ëo8á°R„ČŠŚź9¤V cií~U#_’+ëžµ'SA@ݧ 'ąP0K„]ť$=R|:ąşç˘_¨iÁÉdAevú¤©Fđ`÷¸[ Şc§¶;zźg¶íĎ暬 [ižŚëB'1L‰Ř¦W¸Źxq”^Čr¸Bž|~ÄäĎB3AŮĐ‹ONz“šÚ^Ńă;éÉ@×jZS9¦ŻÖĘ2{} żTć\ŁŚatb–UVY´ĚíŔź´MYç°Ş4Ź'y·÷ű%ş=/póˇáđúůç<‚Ű˝’ó*}^©EXĹŢőČŞ†ËâDţůS ×Őq ŇsřĐZ”ß"Ě G1f+¸cjĹóyOsF§±iŠöx>;ÁSi[gęéX.m~é˘ghR )5CŽ˘S¤\vńwTđÁľĎ,6T˝o8 çśyÇĂXb #ǰvXŹ6ŚÂçç"ó}žË&rb"ŮzňFŞŃ!‘é”ü’¬g%ż»Ř!×=· čYhVnşz¤Ű«ŤüŕÉËžăsŔ(h˝HŘ gŞ eĐň‹aˇ¦·:9+Ň&™''řŤ¶ż"]-»3ĺ΂őaŐese  MkÍ©Ai&u­"®›BJ®ęÖ”D őńxpŕ7î3…şY™é&¤ľu%­Â^·:»Ů=ĐV&¸_~dš}ş·-¨Đ×7z¨Ěn˛9.•9ľöźżcbř•łOv“Ťi——Ú~ްmV~ö,LÇâ<ÄüDx& ÎeÜź’űß&ëŠň“pŕ'Qeź+é ýš˛O‚{ŐkúNI`íTÄÉ1Ä%ü†„Ă€äJ':‹o‘çýíóPvߎš˘„é\§®ČĐk`}>/ßç)‰taU-­NY%[ač_™:AËTWµľ§U*8Új• ¸ęYß`!ˇç!*lćK¨ú´č¬6‹AçUXúp6’oćyŮŰ5•ÓeaR¤bŤ[I”k©†`H)X¬ů `L2ęqMĐCÓ"˘JvsĎS¶‘\ż˘ýݵ;v»ß(DńJä}”Κ }^o)‰çÓÔŚ(ĆČČD€Ö$@sŐwž ~×Ó›†ÁÜ_Ęž\Čéýî™sŤ~‹|Ä|32SîýÍGY[w†ä p“DĂQK Ýó0ą÷FČa†s@ůr†‚ą'ŮŃë/O}TJ§›¶đóřBж€ąĄ´Çš´'ŮY¶Đ·ş|‘đ]űna@J7Väu1źhD†đüüÖšJůŹGS‡JŁ•l”[~ýščĐŻOmÚ_~»ĘżîĂK»sǰ°ř ąmuű Ú™•8żĚ©Ż¤ČŔ >H‰sŮOÂN‚)šě3’Cçţ¦łVrlŚáó ü´uH&Ţcá~®…BíiŃ•3»ŠŇEg-E·.ÁxKZ o}Ů@xB©Ŕ5źizŐĂłÜJ‰µ=hÝŹ’ň6ÁxĘ)ąoď÷YÉçš5Ď’ ź0iÂź;fÉK|űô$µ­ŞËh§śÇëu&>»ęn4T0ť{ٰńěD¶úőď‰NL‡8±¤š (GM)ÜyŮ(Ęë+¦Ť×pgĚ=,XSvuWFŮ:ą…Ě·Ţő@O|G©?ĆfÜťŁ¨Lë­›OąÓ‰6Rů—hňÝ‚đtÄĆpČŚâö€m˘da 2Ó,çł©3žľŐĢĘa±›UíTc˘ăĚŔşS kŮů¶ălZ‘í}Ú-“A/KeÇ–Ňťzýűýó€ť Ô/÷Řî(NÇc‰Ľ^Żçź?ĺ‹öywÄqI.‹—…Šsß<26As†ű¬ŘÍ:ô­~Ů‚A°WľńPk˝Ĺ<ɸ÷Ăk¶ĺ}¬ÁôËfC4x"a?źdőZ 74+Môş#˝ŘŃ—ëň˛óL’Ä"ď_߲ÔB°8ŠIÓĚ#’@Âç­L4ĚI†lč„đ‘˛"Ďfů$ö[GY‚¶rgĘbt3nî\€YŔđ8BMyź p21DüÖúĆÔÜ}%ť2.F˙şé•«śU¸ĹhŔĂüDKOŮUŤí’¤Ctć!ÁťN®L˙?_çşÝČŤa˛mkňţ/›Ś-5WM…`{söÇfŽÇ‘şy u)ŢóôţÂMËçuËęMQţę„ÍY»;Geä@]ľ–HˇNŞ\q:źgÉâ˘ě¨âőËe¤ák´DÚ ü=0y˝ţ ň™ůź%RżRFst…u/˛@a°Żî8V¤ş™©;aF‘-»@LPUŠeÎĆfĽ|C–npŚeŘ]HJ:2r^jĹ ÂgfŚś—ćżüa ÷]ű€íŮr‘fL}|‘yľ˙ű÷ýçď]ľLá<÷´7ăiÖr ™­(Ů”(Ô˝ki°Ţ űXy}ˇă°j}śl!`ž&GŮźŹ?Gľ,eÍĐŞÂĄÄă+‘´ü'oú%;–ReŤ)2Q>´ąĽýhw?ĂÎhź™Śî˛ L őőxTŃó:wĺŠ {”˘qGĆP¶!±üýĹu¤ňjFnFwţ¸«ń¤7’ÉébgŮP-hçźó ꀌ/¶O>,hÁ"ŁÄc–­O› W…Ç ZlIĎI_ ;SxĄWŇ»ń}ď·‡F‰ůĚ„m@ńHaé|\Á€Źťđm@^^T‡«Ęެş/•JúD vč$Ë “ĎŹ±Ő…’ý"´%„ßQ–ş…ČťX6Oud«űŔîQ=؉ĄĆwŘ3Ť (šî<eôČLA:1š/ĽJÁeěd… r´p‡´ĐŞŇgÔý®>CĆ{Ţťe®‡ň>SżA\Ěr‹©ř~QöJ‚DpŮî”cgF¦Šžś` ő~™Ř ć$fęűšÉă–ËĄđ…_ôšÓRb™§E^žRŇĐÝJúb"n cȡF⛿é(Ľ4¤9źĹţŐ‚˝S;¤^,¦c\uýĹ`ŢŻ»…5_ąl¬Ĺ!cŰÍťP‚Öř„ů®×zx˝âšBŐoń“.á>oîiđŰ»Ś†`®¬)I&˛ÁX¬üi94Cv†3¬úOnMۮà c-¦ÝĆ(Á=±ČIš‘őnÎďż˙%›Â9úýú˛L‘Źéđa­Ëăń0saúT˙ź1Mž÷G§‹4Óä‹©‚ĺUM›u›őGĄĽaq8@(j9čś,şp:`ôĽ–öׯ”c'*Dč&ů7¦ă©gňTGcÉŽ§¦ľb~+ĺpy¸`2ćc zz‘YÄ?×Ĺň-yNOćfëuÁ8ĆŢÉňę÷“űžzę‹#nŁŰr¬méOĂŠźÁáĽŐË 3ë;â1ę®/IR§Ç¶tHBIŽŤCáőJč­;Á‡?J~źă1ĎuwóQgţÂá·=ďĎť +"çeŞ×Űç;{I•ú(‚WGuä}—?Cj˘;µKůȧ]xżśpä`ř¨š‘că3á–Ó`x”ŚéĂą s -†aΰۯ¦Ŕ; żRkü’Ótŕ{w8)Ą9GľnÔVףusŐ¸Ł‰q`rd?ŁŚ‹8«W¦}»5@pe§ŘżZšaŁwťđS.őśçŽîďĂZ^& űĂ•koąŁeŠO•·\ŹS±éµaî¶\‚,3O¤ŕݤIî|!6$ŠMć‘‘’”L4W\Áěgm\RäUQByvR¤zÄńďď5WŔI%pÄ×‰ŁŻ;t>ô˘ĆO“ę­‘áäIśK“fl瞡4MËŻ÷2µŐë€ýSÜžwĄűxü§jDцśń(É2} ÍJˇMn›ë2ŮüÉÄ*'9ë¤L|lŘ0 p őp,ű$ Ćśw<;6l“„-ňŕ/(cjšIňĂ->˝5Ömś§ńĄşű<ž÷’^Í'm˝ÖĽqţ@jYĐ>Ҩ#kóÎk ‡|y0´lőżK°b°u°dŞăeWZ±¸?0ź Á˙şdÎöŞĘă”: ŐúP"†˛;07\ŻŮ˛Ź8ÇCB$(î&úNŁm–‘EÁ@ŠU™žj}$Xö2ŢAh ˝âđH$÷!sv;•$?xwGbĚGsě wńlŮ.7-‹Č€}ŰXßu–„,ä|2@? x¦Ť–: ú2“;ż­ľmR4sS’Űî—xµ±ěaĘäÍ|‚é.>RéyÔ_2Ei)RüUcdˇ»íůç4`*ý^¶> ż*¸ŰČŤą$Z 7Ýä«d(¶Š¸1‰cIŮĂ8V É$§Â:‘>ĎţrY&uvüH»&¦ői ýÁ$˘g¤E%ťGţÖ…;4r~LjńA‡Ľ­rĘT˙‡tO‹,L8’˘XČ÷†Ŕ&ĐrŽJ®ć3‘BďO,ţµ…¤µÝPűÎ(˝š…nçMű——b°gUr1ŞÇđvjî!6'¦ž;ĄŚŰĆd ÓŢćŹímËť\AŃsbĂ,ĹO˛ŠôŚf¨Ő»!?˝ßţŮ©oZâĂ9÷*ŇÖŢËßÜÄôŹČ1Ó(Dű×K$ö8ĘAž>Óv–,4b—ĺŻďiëIŘëF ¤ŹĽzgq źévň*ĺ—{őQP­ `ŁöÍ=˝¬lbë"ć´Ĺ×˝ě¸R_§ô›˘<~ŔÄR8ˇŇ%s»XQd·žůPLđË–âůý×VÂóů˛‡–wxű%5ť89A€a Ŕ^Nź= Ě-ډő‚ µ¨–ć.ŤóW<}lůˇ‹­OĎ!¬ÓŔm‰ ™K 1µ\¸4(s«ŰS-ń­‚ĘĽ9!ÁSă}P_L‚†Ä‘D\@™§>Š7©ÚĘQˇ\Ů `Mý¦ß!y*Iă缚cš„} ; fAÚíç SA‡ çe>é·AŐ Řyź¸Ţ÷›|ŃWő˛W Š‘4fâÜűĚ™úýu µµ;D6…‡…Cv1樯Ăď<ĹĂcŘQ=˙=Ń`±´!źr?¶ˇkŹ[—ţ#/Żdţč}O±»čY‡ő›Š‡[1[Ć…ęľ“ďI/ČLšo* đŻî ŔŽP(“ĘúçÓĚ6]G&č+ťÝUÂf iîĎçxWĽźł»;AďĎĺđ!Ó<´ ËÇ…i%4 ˘ż¬´'“'á1®Y‹¶LaoIóź ©öé?ü0SÜĂ]ÇČDźËočńUnd›2jú RĎ“N)ĘąŃ;ŃŮĆÚ¸§Âeé,iDÇÍxR“— |`ś] z6$n­x/MV×@’yUŤ,t‘Lt;<Ůô€ĺü€©Ă@FÍOAr}6kŰ”čmňňDâTNĆ|ĚŹ1ýó†MFóS›fXOăŢ˝Wü4›„Jř,Ě{ŕúmďv.Čîý żůľC!ŮËh“čtŕaˇµÔî[X6ɧĚRě'^?ß Î!v‹Mwµ/t'ʧČŮsy6Hé™ĹQ”ZˇťA_Ň‘¶L0®ĚYÜ2+‚Ă”ąµô óóć)¨í …’2ű(•]MRT2úsOÚâĂ‘ž ›¦† 5·é»aÁÍηe'' Ż3źÓ-ĂHÎi|?Ăő6ß˙2üĺŐѦżŇşć—2×-Ž "’n̸ŔčÂŘŘS ´*ÚťáLrÓ;>+Źy61ďď&)>0˝»J!zÓőD–ňŤŁ†úˇ _gE±clZdÔKÜdá’Z(&]‚™=k&˛9EâË9´©›Ě˙ĹCN"ő‹K`ĽŢN¦–o޺Ͱ@]‹#VnmËnľO)^Ů`Ö‘Ľ^ĂśzƉ]ýŰpŽÄ•vÁqň˛U®ÓŞ`×QľĹB„ÁŃčT-mˇ^7uë;ĎbW<§>ŠÓO’*i99yłÇnK"IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Default/images/preview.png000066400000000000000000000132541361462701300260760ustar00rootroot00000000000000‰PNG  IHDRddG 6ůäPLTEHR\GQ[MWbGPZHQ[FPZLWbIS]LVaFOYJT_KU`IS^HR]JT^KU_GR\KVaLV`MWaGQ\JU`IR\LVbFQ[HR[IT^JU_HQ\HS]GQZIR]MXcJS^KV`MWcGOYGP[IS\LWaJS]NXcLU`IT_JT`HPZNWcMVaKUaIS_GR[KWbKT_KT`FP[FOZKU^EOYHS^FPYHR^HS\LXcIR^JT]MXbENXHQZNXbHRZLWcJU^FOXGR]LUaIQ\–X0IDATxÚtZ‡‚㸎$ER”H%Ƕ;çÉły÷ĺxůţ˙U d÷Üťw¶[mK$‘ Ŕ¦’W]Ő5~Żlkr]5ŃçŚńÖ·Îʵ5F~Ů`Ťçµ—ëVď‘WŞřpcLS]™Ř`Á~VW·>×»ˇ2z>¨«ő޶ť\úX<Ö•ed1ůŤżdé ‹byYgĽmě~ĂçG3lÖräcźdťN”őěţm%×Őůkg s•°0Ör^ÎN‰ĽńňRČŰž áâ0îlW­ÍőNÜgÂp_5ťŤ7oRdɲÉ;lbqVY•gćĺü–ü‚ąśl+Ňůy·íîWŃŚ˛Ě`5ąhú0<5r#ÖŻ±KÍM¬I:55WŐEä§¶4:ţů`§˘=K•Ę.ńďâ2bÓúăűÓ»ękľ cµ›IřOŚtëd“ RŤ±íTÖýŘŔ7!EŮŐ–Ç·âžĚ˛Îwëć¶ }S%Kg(;Č«ov}OG˛ľXŮ…@©¸EQwęŃÁY1ě˛OÖF}ݧügŰÝW˝ÜRת/z—…őŞęËűŕtÓŠůéĽ8|“ŔżĺŻ ¶‘?ą Ţx 9űő=»üml>dÜş"{%YÁ(&•c;«ˇ×B„„9ZŠ#·N•„MáÄm“űýë0ćüy°˙ażŞ;˙G{ráşĘ˝±±†IĽleđŔĎ^Î*‡źŁ˙M­{É-¦¸»ťÂ?=ŘŰ?í6Üš›\5ź¶&L¦˝‚Ţ{qĽ:Љé´ÜöŢúłč¤żÉ¶žíŕ3čX1H}źăŤ\]ÇËćĂ&Áëě˛I5Š’ĚĄ\ć ‡Ăáń M9ěj!ž¶Öč°VEuęä8—ŹŹMu˙SĘcóôT­˙vűÓl(E“pÚ¸’뮥üAaÄC)ô.٧µáľɉżµEÄI¤“ ëíĽi˛qĹą}W«5˘á}WđMş/ϧ~ĄćęEŠÖďőm§8`ŤöixÜĄXBü¦„N¬ţ8Ć!ń»év …—ťŹ]ÚŐ_3€ŔŔ˝ěl4ľcˇă"z‰*l$"Tâ%BGÖꇵş|N]ěé-<Ăžy†źaR gĚŮ÷"G,.Ü™zŠQĺ”޶­ÍLµŤ`K캇ŘE¬8YŐŇ·µÁzÓ é‡ŻĹ„_dăgCçRYíńtÝŕé)öXĽÚ‰˘›ú˘i×éO/8ą›µŐĄučLA 8ń >¨ÔŽ„ĹÚŽo:y˘ż‚őźÎ2w“†» M9 ô72ŹO}Ů"Đy„»jL ś{$a ŰË˙Ş—ŐďËf©|ô|€q`ćäBˇ6Ĺf“ÍĄB±»ź3¸$× žWĚx™u‹wëuNé&Ąác3‹ó€?AżÓÁ3°°Ş`opŹ6¨,’L L”„䑊DUÖď荏‚¨ŻG·×rc4x꫾Ől:ĂŹ\Ń Ăi´ú%`ˇ5ZĐÄGYbŽ<ň/ÝdîşAŕ%wşěĹżşGBí÷övöh>*gŤ‹@÷ăG-ŘiPŰ“^éžÁ‹^­‚Ďj°×˛~RşŚC·Kid~¦`[‚îŐ7Ô:’i!@PgŐ9IÁfÂvSÔ-Ŕń$Ĺ´-€7®Ó+#7n˛®hĂá–E‚ÇšÂĚ čŮźuĹ ţî3Ňh ó‰Ź:ݵ˛s§»ŇP‰lb鲦Џ iOöĄă‘™$łşúEl /í>ß™’eśŔ´?ʰk'»<4<ÇL.eQQB­µĹźŐ/¤ö8ĄCa]đÚ- űѸä íLdbzu`Bî\' RĄK`ą›ş¤Fë5Ř’tí˛eP˘/‡»Ť4Ś5Ä˙Sn$fÖuţ+4Aş"ş\Aa}°¸Ĺkđˇxś#wT\·aca‘Z0ĽOJ1y O±ăĹLtČUż]6±xX’pVäĚZ´ĚUäŹŞÄ îry„ő›ŁŮMD»›ÝBŐńóÝ/˝Ł§¤D7É˝9iĂh¦=ćÍ%ôµł×ýďýŘôšnř)Ľ¨®Ď ¨´{:ŢI0âłKÔ…eč$˘Í Č;söbđkăzŃűŞżű´:đZ¨űRŔí(JLýgöÖhČĎI¨§[’›Ţ$ÁQ§íż^ŃúiŹ·\NĘŇúŁG~9ĽŽFOť®Í‰ß€Iű˘!‘OĂ‘Vo°@’(™ GfžáĽ\Kľfă•oÔE)Ź×ZúHÖÖ"Ďňü_(§DšŁűö?e“uG¤6lX Ŕú\¤„L%eęĺp7Ő#LhśóĎŢ·J˘gŰČ˙0ăŢ_®«űŃ Ş|ݨu]źuP ŇýÇ:{`TP6Ůä@X™ šhŞť”Ň3 ©Ç ĂüýEuź¬8¨¸|ZV.Ö(˘äW9Çl"şP$3U 8´µěTx¦2ŚP(ˇl’Ą~–ĐŰEdńđśÎ,QźÜ«ú®Ł˛AMŘ1i(Ď9ç¬`Mô”E¬˝­SŮíx˛úą Ą67ÉĆ AŇ>O˛‰,9le7ŮrvÍËŚ-př@Ž`‘ú´Ôä˙$ú× 2‹ŮÝHÁUŤB$lpŘ:¦ T`+e˘)Ĺo@™ű"ÄE]š‹ë7\/?:‡6ČŘ˙mŁ•'N í T< W–aý‚0pá&bŻż$ŰEOĂźąŐ™c)¤¸€Š÷đţSÄϵÉťUed9ÉŔ’zÜ0\Tő˙Ą°µ°©ŕbö’SŞK,J†ÂDĎ1±m5]°ž‰8ń˙@ĆqglJî­ŮKBě9óĄ¶ŕ¸*’Drank(ŘŘR}qc•Í{ľÓÄ>Ó˙r‰żúŤ#ĽăÓâćÔ°¶Ää €‹Xh=ez2˙–l3˘2Wߪ r%"QĚ[‰)T;ëGždć˝ďŔ"s.2}ĂôÝeĺÁń®÷K±T}ʞÇ:2ÝĆäfTÓÍЧ 4Ť“"ÖóR™.Öwlś4w1łźcš7ꪵ·Č×Ř[‰’¦s§ä*™?®ŕÔŚB?—"ÄzöS/ĄN»Měf¦‘RƱy‡Âfôd@EŇuom pĽ9Ř+©c;wŘ[Ě„VźŘÝŁ‰Z¸—×p'z­«Mó%9ňź‡Íůą#±2Żź÷^î«çb Xyd.í5­(Ńc'ÖˇSäÂťđžfŐlš†ĹA¶[ŇŁa0,đ‚’ŤĎ8×řQĐÝ‘\VĚŘmóW6KÉLe»/ŕaÎn÷CóžŞî×řYŘśf*ŢšRÎéŇěYú9Ŕ`@îÄ쯞Řtťýř• ŕíLůÖúw»‹0ꇯ'_¤ăđŮ´·Ę3dÝ^m{ö»áŘŻÄ!2růÔ ­ń©Î<ţ˝Ę[I1…Ľ" ËŹëN˶&KrµłV9›K)Rş#ÜŃ™Łv>Ń1şĆýďJ1ľŹ<2VVN,/ÎáJgČk!6˝ü•­‡Uz­‰ě‘UJU_îrb/ŕËĚťÄ/B„mdýŇ—2ˇTé¸&ĺË‚ň­SŽďů“^čéÜĺA¨ÜdŞěęĹ 1öęAEÄ>¦«P¶Ýymą—Š<+3Ě"SDĂłôŤ6w“pä>iť-ww)^ǸŤ1v]' Ť/űQk% *Ç`gAĹ“;IŞhřĐŘŢiËĆw™žÉŞ4& ňcËOut1Š ńsÎyLüŃ›cÎ\o\h˝ň÷R)0%ĂXžóA \ĺRżIfLK‘~CĆ«ŐÄu“?Á4t+?·íÜv5WŠĽ+í†K5rŔÖ *ű#ÓlzÄňôŃ ó¬Ú_eW©ŕ\iŁůµ$khąŽěşdŁ!B%—î`5Ü#Ť·öÖ_°ň'ގd0©®ľă1'çć>‰é™đ$;Čşş®ggc//ʬŘݸŕ=ťĎjoŕihÝ”ö“Óô¨Ń˙ĎVáµ´én-ł×öĎ\%°ÁÉYđHŐ—hMF»ĽÖţ ’<8{ͱ”ăŕAb/Ľ+z–5&€ěL™­,6vžY-xXŞŢ3#žZ÷ MDä "»Rx»ŢMî€Ú拳ĄAËĽę6¤ ÷dU ĹA­­2­[BčÄŤž.í­ű\W+Ń>0@§d=¶%,Zmč{7ݢr‡‘ťÂˇŘĂš·DYćE í´Ă&’+ÄÎ [ďŢ«™ă˛‰QË+{"Ýđt(ŇDWZúÚ¶Ĺŕ s?S@ł¨71Ltčyý#ËŃ+8–Ý–Ú‰úh/úěTŠ[”ëméŮŮe“Ět5±áU*9€'ÉÇľc[é¸tĽVP [&˙MĂ’ŰÍĂfvĽeáR@,úĹ8g{mćiŻP +_kPJ‰fąŚ8iˇüĘ‘vÎ,»°>ëXB{–Ą0-ÝsĐvMaÂčÚńžŢŘlî 9&.Ž,Ő («á1żż´ţí2€ž C™Î¸R$"'i×–dśEŰȽ斚5Sץ¬;e'.ŮVŔ&”µ~jËnh˛Ŕ3Áš^Î µ~Ą°+ň;lęĄ9—$ l˘ů¦#ëŮ€ÖnŔ°ĄŽÍúďËŕ\T·^}·ĹqŃÓúŽ>íâł¶‹sł7p\™oč0Rnůq±<á§Ůzqw;±ÁO»‡H|¢u2Úý“ÝaüÉuÄŽ´Šłť3{ŕHŃĂŚCAngcnÜłˇ+ĘÜLdkĄaŰYăśHsQeýĚźô+ š9…|3NÓ$aŠă`wLé]ë땦őŕOâČGuL€{΀O_Ö@Žšgdsă±üÇwś_+Ž[­”mئ<'ÜT:Y6`ůk– ´ ]ÔĎłĐV+8FĐV˝Ő˘Gő+ 4}ݞ0źľ~W8Jjj´Ě°Ň8ZvŇĺĚňEçf7°íł¶$‘Ú框 ´öýLë䵪ţ…ŠzŚ[v@Ę,v˙ oî44Ȥ8ś‘P. ˙îAdobedŔ˙Ű„       ˙Ŕ˙Ä\!1AQ"aB2q˙Ú ?ôsL ˝]Z°%« [jč O°Ú°«€b07Vz°«Ő<€G@Ö«jŐĆŞ}X‰Ŕ2Óz°čO°L §@`I0ťi$űG@¬ &·NlźTŐIJÚčÉŕęŔ:°5T#oW5Ő€´űk« OW@ž¬jčI5€€’K<€5úµĎ kúµÇ fąňň HUúÖ@Öšç&°Ŕ´_/ : 0ÖyŮ%ľ€’ý™0 ©&ż@’úk Z łČÝnľV@’Âß\ňRČËô 3ÜůY =qČşţ€˝sČ_ -g&€’KMţ€7ú¶ýOôgž@nyŰoĐú.@ÝĂČýż ZľrsČŹ<€öĂČŹĺäWŽ@ĂyäżĐ+ž@[úä ?Đ+ž@Ë Iţ«ž@›ýOë ž@“ýO<˝ž9Ýü¬vÂČď<€\ňłă Wô ţ€Ü,‹7@5Űôç ^yoôíúźč  €€u|€˙@,€Ą€32×ů0 käN@qśëŔr8ąs°1@ĹŔť€ J)@ÖÜoŔ"ß PĽ0(źů i¬j˛ý.@v`HpŇ€ p— )l•™ŮdŇů`a €µ@ kE.Ş0-ęŞ dęµČúZuČz %Ş]rőź@O\€-@ČŮn—P.Ş -Ö@ĚČČ  €Ű_( @55Y™Ő*Đ\%Č J>HrvYK ąH @6—Č€H_ gČ×)†§ ^Ç­ţ€RÍv+@s@Zţ€ť ČŰ€ ř@S n@Ď5·€Ó_ b¶€5äňuYO€’\üŔÔ u]hÚP(zĐśP5p¬ÖśP5¬Ä`ZN¬X7Čp @vPŞ[@I 5Up €P ®@é´Ţu@Xhq@ÖĐ h€5q@ÖÖ9@5” >´ő]@~`Ž@ý_ô^@6Y\ňŇĽ€Ŕ3˙ j.Ľ™ú—č«ôI@śŹ :NŻ :@9ą@Ö=)yÇn@1ě =)ě,{Çn@ĽcŘRÓxĽę˛¤YŢP P—č_ ô E×3˙ j$Ż /ž@5YŰ˙@—ýńČ`ä+XÔZíϰ2łÔ ä&¨v­-Ě`:^ Z6M°$Ý@/ý.@+  ×@_ Ký€6ëM•@Ţíoz€f -í*Đ5°L k=@Čϰh ´Zí@LríW *Đ2ůV€;@Ö@ŔŹ« )j€Č×/ E†˘›N¦ µg°´ :ÓI€Ç@ť Yěí` 02“ tÝn°€Ľ -ą)ddĐŹŞ o eZí\§h¸V€ćW¬V[Č n€>@Ňl P4›Ś Đ4€eň´´ ĂÓ† `4r€łÜ 4 Úč *Đ,Đ,÷|° €Ţŕđ€Ľ -í+5¸`f¦Ü@f¶Ř\€¶čy[0 Ŕ®Ě@$ś`:  “ I:Ö@gŕŹĐZü°2ő`)?@:ęý†łŔŐ;ŔW´Xŕ h±Ŕk 1ú™Xź|Lđ3Ŕ_€I~Ěđ3Ŕűŕeŕ ?@ d î±ŔÝc€.®,lťŕ ĄžŢÚż@ ?@ Vžż( Çč OŔ˛Ó Z§@v@ 8€  Ŕ€vä rů@sňü@µ/5§ O†Ż:đ7Č`K”>€X+:mŔÜ.ü•ČŘ `5ŕ y \>@µä 0€Yöź`:ÚíV:1yëČČÖhv­-v0-,Z§ćÓ k JĐöŽ€f:¨h t =€ Y):M“€g{• {@Ę´ nÔ ä çŻ b:ň¨´ Zµ öź`Y€W@Ë\€>@|p@Ň˙ e€¤Ż3äU Nu@@— kú\đůŕ %Ď/ž 2ůňö߀/e ko 4˙Č^8\€ľ@Řřđ®(`i>@ËyO M€Đ3@Ňx40Xo kVčn0-xŐ†ň@®@sŘ  U•×ĎP3€őÖ—(ŃŞÚŚ V ˝@ĎÍůŞ 5uěš MŞP@IŞÚ 7^ŔfŞŔľ@ľhۨÍ@$Ô@[µ@Ę” mÔkç¨p Tş>´u iő? _ )ë[Ŕ`*€S@ Şš U¶*u@3pšÖdň§ O†¬ę´€cX¨€µ”€śP €v” €1X1@Ţđ í:.ü€.@vm\Ş ¨ ¦Pj&¨ h .Ŕ)ŕ ě” $J%)¨€j|µŐ5@ž¸`Zëň´Ô 4Ô ®@gĐ× \uęµČ × Sč®@ş€$÷Ô íŻČ× u˛˛z€@5>@ĚKP &˛’ - (€"Ő(˛Ç {ÄäO`^@RW {ǰ1°7ŽĽ§ J{Ő)ČŠ­eÄ`ZĄ9ZĎ`c1{Ĺä c· P&•ä ĄyI^@’W'(;rqy‹ŘŢÓŘŮ)Č"ÚP3[%9sŘS5ŽĽ˝Ľ{ǰ•äKČ žŔ19‹Ř«mÖ(ň¬ eő *P4ć@ÄÔ |ő8]h ę~hťhĚ`ZĄÖ©Śľ ¨ |ö]hë@źP%Ô u O­ůěqX ę€7˛@gd Ě@ő 4 > ­Ŕůęf mLź(ë@ÖŇ€|8ŻXµ€ €ş­9 :ÚíČ_ČŚPn@ËN­mŽ0-lZ&iG@Ô}€t §@ŁŚ '@št>Ŕf:“T îÚŔ(âÚĐ2“ kk€@#_ČYV€íhhÚ€*č¶ą9‹Ř YČ H ĹyI^@ 8-/`ky) (©g eʤ 1FŞůZ@1€Ŕ”€” NP”R9@±ŘʸŔŢť—ČQo(” l–2ĺi¬uä ¤˝¬)@ZWŻ i¤2°' NN*ôVpš5^SW€(ËkĐÇ^ĘhJ«YŔr€é( Qjţ@Ö `đĄÇ`%(”Ŕ%T NP,vr€®0÷€ggňT@ĘĄ[5Ś9@@kx)Ż@k PŐŕ«ŔmUŚUčIŔÖ*č´ ć€ëh´ d  f°@uą-şµ´ ¸Ŕµ° hŘt ¶]UöMĐ&ݬ °$ÝmĐűščl P7»`gk« k@Ęn­®¬  d dZµ  kj¨ :Ř·X Č˛—Ö€©@>@Ó™P5óÔ ŕu +¨ů :u ?1jÔZ´0ú€b 5óŘu O­}@—P%Ö>´ç°Ĺ`+¨ŢÍťš€_1oÖ€|Đ4ú€>´k稺µ0~@\  ­[Jňŕ˝`ĎUč €=9xM^1č€Ĺ^€Ţ:đjś)čV§f޵” jÔŕ k=ŚŐč€5ŽÜ)@›W€&Őŕ 5xM^ś 8íŔĹŕŻ@{O@gf§X i@ÍT lÔŕĎ@UNÖ:đ*ôńč€[W€/.zÄŕ Ż@:ĽpłP €“@ Şž@®@^Ŕf«ňh Ř VŢ@ty{ak·ČÓ`0Ř`.Ůż@Kl€=˛Ř °Ű /l_ Ůěß`3¶ß Kl -Ţ@ČĚ ě@Őů4 -€.@›Čj€¶€Ş¨V k@˘I4¨JDĐ ĹĚŔ H YČś>ł¨ŇŚPb vÖP vp @,vÚP,vĹ`XĹ{Ŕ3´ę¸@[ňąÚ` ¤0˘€b 6@M*’ - €ş€Ą€µ€ _ iu/­]hęP |ő8KP`r­ M(ŔµJëÔ üĐ/(ŞS^Ŕ *Ň QD’ M*5ěb¬ ä ć­ş€l”IDşT ©@ÖĐ­@0ľz—Ô@K¨ë@ZźP3ňň–°đĽ—Č ä ňŔÂ_Č@:ů-ä hňpŔµ kV č kĐ j »''ČyO K&ňW`Ő` Ż@›5ÎĎä ánňSČŰŔ_Č`m.@ź 4ü®j€€{ Đm¦¨ŮPđ*ôŻČ¨0Čo kV¨QjÔZ´6ŐU'vMPŐm&€“Tµ@±ŘĽTST›4vjUÍP2ž@Öí`° €Őů5ziŕl¨j€&€Óh˛ěT€I¤ą-d ,4ĚI` Ŕ€u@e¬­S M8ŔµŕTČ ™Ď`$˛šÖ@’ČhYĎ` (–@ŢČn’qlť)d l€€i¬ @Md ,¦¸-@€3ŕyÔ °ČäÇ d /ňX `:ů>@uyđŔ´ŕP1ä rż Ď ž@\ňůäú/  o` řđ€6yň¶đŘOü5ăČ ä­€€9€Yôź@:ÚíV:1]yëŔČÖhŘv­-v0-,Z·ćŰ k JĐö®€f:¨h t =€ Y)şM›€g{• {@Ę´ nŘÔ ä çŻbşň¨´ Zµ ôź@Y€>@PŰ%Čä ĎČđ@uÔ ľ@Öś>ĽëŔß i.P úňç€˙“üóŔôů`H ®@é·p¸@[ňW k`-€×€1ä€erů×4Ŕ|\P$Ü`:° › IşŢ@očŻŘ[|°2ö`)ż`:ěý†óČŐ»Čg@´xä hńČo 5űąYż|\ňsČ Iţ€ÜňsČűäĺä ż` ä îńČÝă.Î,lÝä §ž@ŢŰ?` ż` fžß( ×ě _ĐňŰ Z·@v` ¸€¨ Ŕp Ŕu@e¬€¤čä $ŔÄI8ŔĚIh_ kK@Ľ0-8`:†W( =Ŕł@ť *­ÍĎp'Ë€ îż ÂŢĐ2ą[4`iÄ`i•Č N€%5˛Ś ŕ`´\€«@ËäZíYjľ¬ €¦«o k^@Ľ0-Śmş›`*ÔžŔJĐ*čl 6]vg°µ€&ŔĘnÓv»Âđ€¶ä §`jľ¨ Ľ•h ´rť ŕZů@JÖµV€;@sč ¬ő9Mj] kK@ł—¨‰‡@ÓL 'P ˙`Kč@1ĐČ˙` :Ŕ’`eP7ş`[Ţ  {@Ę´ lŰČĎP2łčZíÖ€»P\€ćxŕ˙Ŕ%˙uägĎ «Ŕ ?řŞëŔż€)ţj˙1@t” Čđ¤ę𤛔 cĐ—€vŕ€±xsĐž€qxÇ vŕËŔ=•(7€Ϋ E€-ĺĹŮţ7řŐ]x?ř¨jđůŕWąđ ŔüŔÔ u]hÚP(ZĐśP5p¬ÖśP5¬Ä`ZN¬X7Čp @vP*Z@I 5p €P ®@é´Ţu@Xhq@ÖĐ h€5q@ÖÖ9@5” >´ő]@~`ŕ°$ŔW gg4ąŰŔĹiüš€uň|­y¸`ZpŔuŕ y`*Đ/č0 Đh´4°č Ú€<˝¸ß„p€¶ä ů[x`T 7ň(l^@_ gW4ůl 0Ŕj7Ŕ|€¦łTäghOĺ†ŔSŐ€\­@»(Ŕ´k¨¬ 7° Ű Wč lŰ eě€–Č vČŘ ý=˛¶O of»]@»(€·y7 ;0&Ŕmü 1@ŐŐääV¨ ` đź )¨ř`HPČôłČ x7 m3@ľ@1@täiŔĽ—(€K;` P)Řň ” mŔüb ůĹŰŔ i˙1r›ŔŻ ?Đä`€W-~5řµüKđežfxŰ_Ŕř&@ÜĂŔüź€Z®p3Ŕ‹<őĂŔ‹ĺŕUŽĂYŕŻŔ)žZúŕ /Ŕ)žË_€I~©žšüKë€ ž’üK<˝–8Ý|¬uÂŔë<Lđ˛ăSđ ~Ě,‰7?5×đg€ Vxkđëř—ŕ _€Mŕ°$Ŕ“Ď ţ­łŔŰ~­±Ŕ nüĽŠ“Őţ75¦Ůŕ Ľ0-ËŔŚ 7žv`Iäż $˙®@Í jä żŔ$ţ€Č¬<đ÷`ż•€$đ€·Ű<”ňłül Đ7~VĹOlp®ß€/lđźŕ yŕ °$ŔSŔl ˝ť[0%ł [lč o°Ű0ł€b°7_V{0łŐĽ€W@ÖŻjŮĆ«}XŤŔ2Ű{0čo°l ·@`I°Ým&űW@Ě 6·nlßTŮÄłÚščÍŕěŔ;05_T+og5Ů€¶űkł Og@žĚlčM˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Linen/images/background.png000066400000000000000000000363551361462701300262240ustar00rootroot00000000000000‰PNG  IHDR·aĆţ pHYs  šś OiCCPPhotoshop ICC profilexÚťSgTSé=÷ŢôBK€”KoR RB‹€‘&*! J!ˇŮQÁEEČ ŽŽ€ŚQ, Š Řä!˘ŽŁŠĘűá{ŁkÖĽ÷ćÍţµ×>ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹFPLTEćććçççčččéééęęęëëëěěěíííîîî  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚„„„………†††‡‡‡‰‰‰ŠŠŠ‹‹‹ŚŚŚŤŤŤŽŽŽŹŹŹ‘‘‘’’’“““”””•••–––———™™™ššš›››śśśťťťžžžźźź   ˇˇˇ˘˘˘ŁŁŁ¤¤¤ĄĄĄ¦¦¦§§§¨¨¨©©©ŞŞŞ«««¬¬¬­­­®®®ŻŻŻ°°°±±±˛˛˛łłł´´´µµµ¶¶¶···¸¸¸ąąąşşş»»»ĽĽĽ˝˝˝ľľľżżżŔŔŔÁÁÁÂÂÂĂĂĂÄÄÄĹĹĹĆĆĆÇÇÇČČČÉÉÉĘĘĘËËËĚĚĚÍÍÍÎÎÎĎĎĎĐĐĐŃŃŃŇŇŇÓÓÓÔÔÔŐŐŐÖÖÖ×××ŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÝÝÝŢŢŢßßßŕŕŕáááâââăăăäääĺĺĺćććçççčččéééęęęëëëěěěíííîîîďďďđđđńńńňňňóóóôôôőőőööö÷÷÷řřřůůůúúúűűűüüüýýýţţţ˙˙˙ŇKiX/ IDATxÚě]Ův#I®+KJŮ˙˙Ĺ÷ĂŔ%2ĺr—˘úŇçĚtŮRn‰Á=Çq˙ßĎív»Ýď·›˙vż?ʇýýń¸Ýî÷ă8Žűývűř¸ßďwű·ýÜďŹÇóiGůüśŹÇăq»ůQ÷űýţ|úń÷űóůxÜnŹÇó‰3â~î÷Űíń8;Óý~ż?Ça˙ňwá.ěď°+‡Ý?źÓţu¸şÝŤ­‡Ýáý~ż|đ3đ“Ů˙žO_#?Ł…őňc}=ů 8çq<żͱCđ;ÜłÇÂRŕw{Ř\Ća0@ô¦ŹĂţf7ŤŰŹ€Ř˙. üˇc@puÜ Řě®±Č|t]É˙mg ~5«n×<ŽdW@ř«ôx$ŹÇqř—ݱßýä~Űöš‚e±÷ÂdůMŰCذɲ3D‘M§ÄŽîM–źŰîDM–â.Ü5?‹š-3´ľ¶B~]]_O¬0¶†dW@žĎĎĎă8Žçó8ě€ăx>źĎçó8žĎĎO»a{ý8>???źĎÇĂţbŻ9tv&?‡źçń°‡¶ńż~>źÇńůy÷űqŘ9źĎĎO»—ÇĂŔńłŮk¶L|öµń»»‚˝ŰďË~÷'˛»·»ÁÚ‚ú1v¸˛ťÍŢéËěW¶űŮ_žO?/?Żîó9€ěH6Yţ˛Ż6qÝäyS·ÍÎ7¬h>*“ĺđ°É‚Ńsăä×íLľŞ_1›,¸™l˛Ü1U“7uu{ůzľ&ľůçMťŻË[€®w»‡ o$†|Q?ĚŻ||Ŕüř°ßŘqäó||¸Űkďł˙‡Űűë—ş˝ö¸Ęp&ă]řĐO÷vLq_v'ěöúÝřłŕŽőYüN;ß·ßUĽ "®w© o„·s7CqłńŻšmFţ>{ĐÇç§mmĽĹÂYĆŤŘĆéI űÍŽ·ŤŐŹqóäĆĚnŮ·nMüýîx"„ߏ`ŘŻiW?Oŕ¸ĂÁO§ĎâkőxŘńţtľžţo_]ż+vž4°×ż?ąßČżm§ľ$ϧťá: ěôrĘä* ʇ;­v÷ľÍ˙< ~¬ÝÉň÷‚ C?‘4[fýA0…őóz(öőĺWó‡C‡PŇŽŚaźťŃˇË÷i! Â<›ţ!ňPíë aŞÝ!E›źˇ?«®®^ q×ö·d7@ps9ąčŔ s|==ČA˘Ž¨4ĽôŤ%!˙sr±*Pá.ÖŽÉE” 8ŤŢ¨üĂbFŃĂTw84¤ÓŠm9VC‡ä˘Ď\´WÝá$žż1¦č*·& Ať› Ççń-տҼ©Űî_z6YľńÂtYrŃďËŤ—×ř®ř–\dS‡M–Ý˝mŇŘÔŮ$ă#éχgÁ¦Ž»ĘnoL‹âď«;€ěHź:©i˝.ąč_L-Ü#Qč)–XÂő/˝¨Ö$K® TXĘ5ÉÁ7kM.j דńąüŁčÉ’*ąČwŃź/沷ÂEE°đőăË®Óď5Éá'á€ě p+~ŠäЧßńQ…9ÓŐ.˝¬d @^3Y+HĹ$[äčö2 g‰©“čöňŔ퍩|@@ƉnŻÝ-“*·W‰„Á5 čG÷ä_¤2YpÇüböĄ#Ë'gPL‡3MM)uxh§f@ÔťőżV€Ôˇâe(ţ U€xrŃî-Ţ3»|.Ąq`@«4§®÷r@Ţź żA% H4h5 0w™ä ›:’WÝ^-„˘ŚŚW^s{ŮdUTRâ3Ö€ŕÄ€p™Łä{Ȳ) ěV* WC$ŻĐ€˘Űk‹ţ: ™äđ* öÚĘííh@ś\Ľ˘8ĆÄ×dW@4M§iw$}›D©d0OĎU%\N¨h II-árˇô¬„‹ŹČş„Ë›:—pýžę.Úr ×)šŢÔ5Ň2—“ZăzKM}٤‹˙=@8ýŢÓ€üŁÁdks şô»˝ŹÉÖľ = ¨Kż˙< ě  Ýôń„\xâv„9‘äŕ…oG¨ Tx”«$ţPĽBrp@rĘź€’° G’ß ő÷î 0€ě H$›)ÉÝ^4±iSŔşé©ni; ™tÁ©“HaČ Žšä ­­±Ą-†ÚҶN.ň=Dnp‹nݦNŘÄ ű˘4K ř=lb˘ oÚ1u’›>㦎ä" T€tno,óÔÉE8Ć•ŰŰâI"¤9uS?kúäÔ Sň<ĽŐM] â´‡ ’©ý H¤rE·w•\¬©“‹ö_nY·EŻ…VmŃÜ@¨sęäś\Ěn/Ó×€üł‡ [Ňĺü ć‹Űr`Bi? T•”Ór~'|UvŠ«ŔPéŢžBÄBÁÔj 7¨r`‰®·ĺĐ~Ŕk„ľ‡ o¤*PU›:;{@âÍv ;´yĂR'ąa'¦Nřqę†ýH­R'ʧN¸a‡i9 MV “WĎ7őEĹpy# –°ĐŢŰtü´”x˘›OĐćăŻqăO¤hskʧNĽaçëËšf˘qňÔ‰źézĂŽ“ť9u¤ăřúÂŐ5ą¨Íh~&m´ÉO­MNHĚ@ZĂR3ÜŢdwkď@vىĎää"¤g\|Ć/ú ‹ĽTÉĹÜŽÓď0>]r±oGč’‹Ü&ô{ÝŽ“‹ĹÉĎÍâ3ĽJš\ěĹgě/Čn€řĆŁ›z&ĘĹäblŘ9ŰÔµ@…–6o‹öĹA;?‘:á`Wń·E« ź Tő¦v4ą‰rş©;ČßÁ:ýÎ_ý\Äâxâ‚S'FąQy¦Š(Ç‹wĎ'¦yiůŠQ¤đ~żÝ4Šcşô»Ý!7}Zˇ‘l­äQ éwŠČßn´!FaÚ‚?:§±W휪Xňů©GkĘž4ěLS˘ý854¸ŠĄç€ÔDą~÷U°˘Wý8î÷d7@Ř5C*OĹ*3É´•,‚ÉMŃ™ä`[,ä™<04RCP)pDâšU`ΊŔĐS'ânî‹$\QE0A«ŞI‘nÁŇ ‡ ۲’Ö¨J¸9‰¶n؉Ş«›zGr`*u_ Í "9|oSWc T9éÚ—pż©u2€ĽXĽQ˛u.Pĺôű•.š*˛uť~‡3ČBĘnȔڪÔM§,¤¬-J%­ČÖŤ9+áVé÷\ R˛µáýAŠ H™(çŻD÷8’Ô˘Ű ŮŠ(çćŁs{90ÔOŰ‹ăëVnŻ_ł'ĘŮ=ęp€JHYZĄs0I(¦NŘdIĹpŮĄ® ířőMťĺł+’OU[tť:Yĺp0Wrő¦ۢuŮŐdá9żł©ŁLˇCýQˇ/$ ą\ÉĹ×ď“4ýľŤ5 q‹ÍÉEn訤ľś QŚă{$‡,Ëî:¨ qŇMíöââHj( |ůG@j˘\M¶†ńÄÂf“U}Şăđˇ«ĂŽ(‡´Şš,0dŠJNŠn/IČ΀@´˛r{ë®67ŞLl.P˝H•~ŻL‹ĎTn/'=łÉęÓďWÉ ;ęŘÖ›z]ÂE1ę!Č–€Ôbü,ąj˛úÔIRŽ&kM%ŐÍ™Üú>MżëqçTR5Y*¤~%urf˛*LuHý©„‚~×dAÖIj˛n·ÇĂÇűF“ĺ}Őde’C-j_“dżC6Yv7hg“IńY^7Y•(Ö˛# ]KRaşÍÇ(ŹÍËrbUú°Ŕíő¶˛\ ŠDą(dő#Q.¨Ľťn/K$Ôéw%ý°˛ŠĎD)Ou{‘JŚ ;Čž€hâ·v "K”řS˘-mgRăŮí…<“¶´őÄΊäp»ůbÇ`ŇK¸gRăęöމŚÜ®'(7ěčŤäe ›˘M%(¶{#?ŚŇŢţ/HkäáÄ ApZ]ĺ(8e˘Ň*°äÉq4éŁa§ş?ţ/Ž‹çŚŇ0]*˘T^…(Ŕ÷ççarIŰA5€l6"}«¶´±H0Kk`Łö·ąqK[ă_KŤ÷Ş×6őë*nic÷-mÜľĆwŹU`i möĐ–6n}kµßmQ‘#ȆŐD9ś`-ń·r{}ĂÍn/'Đ«ŐőM˝*P1µv{{PN4e‰?mˇírJ¶xČŽ€T›:ĚxT]%ĎÄ—‚Éň-.Ę3a°…š,ű:G36YqSĎd‡,3–7őHÓůúŠbü0YXž‰›˘™ČP™,&9đ¦®ăĹ/yYČf€¨Űű* *NÓoęţŰói‹7uĐżMâęySW±ÝÔí$Óý챩W#Ź2 EďďňŰqČňG9Ž(9©n/ľěę´U]˘ÉRiŤŢíŐ.Q29âä(~X/’E0ó@—ž(·—MV5Đ…W0†ŃíŐu@vD“\};‚^H.ƆË<ňšÝ^Đ€<WKŤ×dk8Č×CŔ×Mź‘äî–ťTµň¸Š(¤śi@±řěˇĹ˛ üEÖMťCn“fa&[c[Śĺ¬¸©+ ř *†Ă0äoýş]×*R/)AZCĂH‹ŐM]ź‘MV·FÜ↖¶<: p{ ymS‡‹ çNÓďęöƤa›WĄßUŠĚŻöőĹBd1Í(X ú8\ĚśźĎŻ’ÓďőŘ<$!ŁŰËéw±-â_ň˛Ą’fRL™”›ö;ĺ4 ĽĄTRHĚ Đ«›* őR0*» 3%,á.‘ÔÉTRż_Łal^¤Őâ HGe誗ÜŢä퀨űĺ_CűúiR č˘Ô8&%ţx{*iÝŽŔnď«$v{ëv„žJʫğ–ôÜŐ@M0¤÷˙Ź—5€lČŮZĄ"ůz%`öZ;‚»Ç:cJóĘd冝ÎdńÝxş;ű;í˝€LË7ýű}ŮNť%Ęy€ĄR㱍żWŃ•pyl^׎đşÉŞŰޱy} —emâ3F©q”f™(‡ˇł]ędŮPâČ#OMóčĂ:0äTł†HrŔɡXơ`żćˇ`«Ŕ$@Ŕ€ŔPđ8÷Y`č4  –S')R@¶¤Ł’rŕߢcó"•”˘#9D@bę* «•ĺšäĐĄNp…<¬$¨şî˛3  vRăľEę8»5QŽÓď‘(WĄßmŮu Ü‹UŠÓď«•L2©q–©©Óďh•¨Ňďµ´>”U`¨CÓ9ť:€ěCęä÷¬6“XŇi@ţuć–P‰l¨ť’bs—}2É® Ź4¶›,ĄqŮ ]bRç;€pęd1Ąmy; Lr¨Ć¨Téw†ëÔI›‡60MťśtůąŔ°袩“ŘŔZŤÍ«S'®ŇďŐzÖɲ š"ľf˛xt Ë’ih/[IŤ»{M–j“Ą”ěJâŹÝŢHrŔ@7.çf\~Ҥ ż“%ý®,8$Čn€tĹvmGŕG$/xĽ}Lťŕ!ŃĂMź«v„U`‡_÷€p€÷j`ČáC ç猣Á±6:ĆľkG¸Č:@Ţ /ÁąL,'xlţ^·#Tn/škVCÁ˘L,Ëuň‡@ÉÖë¦O¸˝pÚŁŰ۵#D‡ŻÚj™X…rŮŠl L-ŮjMż©s‰©–Öđ˛)“‚ě–"ˇcëXÖI ˇą|ŠA}ZÂĺsÚŹ¶µš<“SiŤ, ŐoęYĐÁr.á.ŘďČa'°¤"9pňŹ ÝŘ<%Ęĺ±yhaގ˙ć-–’«‹K§0C 0§‘äŔ€TDąްa •äPt{MaZ×y`MVy¤B{çMź&Ć_mę,ëĹ›:7)×Mźp0xSg©¶jSďÄř㦮â‚qäQ6Y×COK »rf˛â¦Î ¦äžś:©©¤ç4 ű˝§e™X-P]•‰Ĺr^ˇE*iź:ÁĘDŰłMýâ2€üU€Ä”a4Y]rŃ“„ç€t%\6Y±„‹$hU½š¬*ą¨&Kß9€ü—Y%»Ô ż'¦ ąµŇ[ÚbRĄ/á:Q.’Ú@xóß””“=.áWĘÉEżNL.ň¦"~—߉żvżßnż~}|x0«wlŁöđLxĹ^~g¤j°d•‹|Të~ż »ÂÁ}->Ă ±4—§Npˇ.uâá]źa˘śS ňP0?"§Nâč0 ä4u‹Ëš:ńw"u‡‚ő’i0ÜţNNGůż2­.Ëh@¶DÝ^ŚŃ­-’ěRmę‘äŰŔ|sćßĐŇ? Ť¸»ÖŇćPxNnióö!{/~‹©Sćë7u¬śvgx¨Ë"@ŢH4Yh±ŞÇwG·—‰¤gn/·.ôBĘÚŽŔ$%g‰N·pkD¤i nďJ8@ÜQŽÉÖyĹ*’ –{Čňf@t{äŃ««Ŕ_¸<^żčĹËZ ŞFŻňcf˛őŐMĆ«Z­»MÝwŹ^­†çÁ’ÜDŔĺc%ŰřUó¦ď/nę.ńIŕ,ĎÄÔ:&ĘuÉ+˘2*’ý–tVŮšäoDe€×€°‹«ŹÍÎ2Ź8ŤÇI•Ďł8ľ[ĺŐW č<ľ;ĂRăî¤ă7+¬lM”Óˇ´k@´ˇbŮlęŕöÂ%ÖŹ^Ő¤R k·*núüüŚĄ¦:Éâ3ě8Öâ31uÂÇ0ŮÚ%;Ď TúŚš`ĘMźÚž€!° ŰAJĽ¬d @°čljě7My°hp–ÖČ€Ŕ髺`y+@˘Ű۲J.v€ŕ«şđ_sóP”ÖPz-ś|¤ń5‘ú˛ Uú=!NÄ”<ü‘‰rJr*Ůk4 %ÝśĽ*Ď„ă*şßh€3j@HdĚFQnY2"ŁJ:€¬!ĺQ¶@V€Ś˙LG@®LG.3ag©'ěĚP°™Ň6€\źŇťÇ,9“>˙/0ÉgZô’§EëĎ ¸ă€űd3@ÔµŤ$zz’·ö+mѧߝňÓď‘:‡”ĐĂżÔSŃ€XÓďܰÓďä*Éס&90$ŢG‡ o$ż!¨Ü@ia˘š(ç%(¦9Pľ şx÷{ĉrőŹÝą‚§X¨ /¶éÇÍi@‘ ×AW O±*Pů»‰/ůŰÝ4 ÝŢ™¬L”S“U7}˛p@źAjŃŢŁ›:üD#É›:ĺş©ł‡‡n«¦ĎÚdÁŮ©M–ż$ÚĽęČŽ€pω®ĄMŰ”ţŇĄNÜéEęÄN TUę„K¸5 ¨ţÉ©“XÂŐÔI.PáN<čő`¶Oť ĄMK¸UK[lkó#Ýą˛©3™9nę0Nş©3©ąÚÔ×n/({\3fľ©GçQ…”dGئŽć‚łMÝŹË›ş–Äp÷üˇŠ›:ŻßŹxYȤ~[i2AíH”» Čy`ČM90¬ÜŢď†1ěu·w HEŘóđňpőş »ĺQ:˛u$Ę1 …*5ąčéşřN7=±-:žťK´L"䬒‹ßжŞą¦s[´©4$żŰ.ąwjÓg׎WýźlďňźDEz*©˘TŇ5 *‹0ĆRц=.ST;@˘pRSI•:€üwA9…íEN dLĄż­rţĐ•€Ůí†ß”(ÇÉs{kĚ:©D0‘\„D TŘĆÝĺÔ ’5=Q®’Ö`áwpTŔE¸¸˝ČF€ś™,ĄŮpę„[Ú8MĐĄNlŤ–6¤N`˛řXű/ }ż*Ďä&+ždk7–:‰-mFÓ8Kťp'/9uŇ·#Ľ°‡ H‹?ŰÔŁÉŞ6uN öJź\Ä:‚Y%cĂNSńN.ĆE…ÁY'Ź€đńqSĎ&ëę¦.š‹Č6€@ CSuś©.Tr‹ţžËEľd•LlŢÔ9Č›:¶Ćę‹éL{ uRµ# 13ĘÄB8)–ÄbÚQĎr¶š:‰+ QŽdO@®¤ß=I‡Q Ą2ÉÁÉhš†ěÚ˘3!ÉÁ;ݤߙ¬P·ECHąj‹Ö”ˇ}X"É÷¤2X%1®¤ßýŃŕĺ,0dÖoę âwÉE§Ô uÂňLpŃŽ˙ű*#•Ô?Ţ>ä!hź\ěR'Ľ©ăCwú3 »„2ÉA90Ś˘+YŇČe%ă ‹˘U3J»Ääb”gZµ´ykš&s` XĂ(¤ÎÍG=É7}†:4¬[ď‡  ş«&‹7]M.fIáčWn/K[F“ĺ…¦Úd¸ÇÄ´Ędya«2Y] —MNĺŁ5ą¨ŽěU“Ů † ;›żľžvZ Ş„2•´/áµČ%\ĽŁ*áVTŇ•p€‹=#0ŚĄłďÂĂĚ@Ó–H}Ů ĺŁqëĘíęE?OlŘ13ńz`蔳†đď†ä"0ä+@d!dŐŽŔ˘nQ:§Şż;Ą6ěÔTŇ ¶®¸¨ Ź6Rľ/1©ńْܰáüČk@âquäĆq7<2•Ď©“ľa® R'xϲ7 ±lϰnT˘$*C0CB„‹@Üťşô4 LúÉŔPeő®Ń€x K|Fn‹v˘\–«őâÜ‹xGö—äoDO—IŐP°*u‚±y––â3Jr°ĹáÁ{řolŘa)X6ćG,áę™?>üš™ä%ţ:ÉăĘę22ŻI$9dń™dW@ô«ĂĄWD9–Ö`ł˘_óšJę2±X^4hrr1ž-śŻ™,–Ö$N.:Í͢,0ĄTŇäćˇ`,¤‘C’ľÔ:@ŢHb¬M–¦ßQ~ęL––T˘?Ńd (š,_Îd­$ÓÔd±ü”ßenú„Éb©H”có×eŢúô»Šú_ÝéŠíŕÖMźµ´Ź<ęS'ëŔďëů´qaß -řăç[†}ę¤yt.­ˇ©“zŚŔ)ëdy ś¤Đä"oęöŐăAyL-óí ţś~×ÁJ+!eĐČ­•|´NŔ KđxÜď±ŐŤĘ!ĺL”Ógt@8×G±zš3§N¨b8€lHE¶ćÔ‰.$»˝ţ`ş]U´ŕöúÍ€¨€xv{ݍâýuŞÚí…(ą˘NÜF‰?űńý9°]ędÁ~@ŢČk›şnI6fáor‹4ě›§BÍŐřn8Źu`čW¬Ćw«ĐńŮŘĽ~81Źšy6kČţ€p›uáKáfa˘čR,”ŞÔřy ×CNѱŰ[Ik¬Óďń8~—ąłµÔx'­‘Ëy™(rLnk•T×9iŘą˝ŘÔáöâ)ýîąő•SеL,Ż2ËT {rîöjúÝ˙ʼngl |®L%e aŞ8ýÎ…Đ,ń§i÷śŢŽŻwnÚrúť%¤µé36@ VWˇÚÔĎ©¤/Ĺ!Č„G°ëčUN.˘„‹/{˝ę¤4-gÖŇZµí´˝Ę´c|ťä`WfĘB5zŐ®ĐŃ€´Ą-ŇŽśL¨ŁW#QÎźîE¤]^Ö˛ \¬Tń0ÝŚČéT©»v{!%Ý^n?öŇXU şş©{Šeôý*•Ű‹;ěÜŢ SNu•t0›7ţůý‰_ű(rÔŃ€tŔ=(7™dWTŇŰÍÖ9Ń&ËFíáQŚ ¤K…őŁ@-·%CŔĚüýš>˛Ďî*SI#ń(>‹¸ďh@QX*›Űd?@Ödë8ľ›©jľŃ±ÉbJ3KkčVßQI??«qk™ŘX|ľ&ëWń°®˘’f™2đ»g6ŇP(^Wă÷ľÍ~@ţ8 L%ŐŃŮß7YŻ·#¨ÉŠĂW\üŹ[ţ×TR<¤ ůu]`˛ľŰŽđ=“ĄÓ†Ű;€Ľ8‚]E0+ĐĘd)i@zÓ•Éňávą!ŁP5ě覞QÜŢÜŽMHvęÂ_3YňzŁX=€ě3,& T\‚ŞĄ5z@złnSçV!Ýś™JS'L%­ TÜ6Qmękł JZËUUJ‡®6ÜŢd;@<5¶–‰ĺÁ>lĚTҨN܉ńżZ ŠQlŕŞLl,PUbüÝpb•šĘ%™ŃËÄ"Ń3€ě R‰||ásÓ§Ňttl}6YU€yÍdU$ĄRsű·Ů)»"9Ľf˛Ş÷UÓgp_5}*]\Ó‹˙DęČ–€pŔÝŢ WR' h ;© ’צá/ {V€¬S'~oÝČŁUędH׎€ČŽ€p±ÔćÚí…‹[Ú@úQ“ő*  cŞs{ë&şÚíŐU'pN0ŐD9ˇj˘ś7ÄňđŹŔË@6¤ ±™ń&ż óňśIŤ3 :Ŕ±2Yş©ç¦}%9TTRr.5ž?«Ŕ+†c«ŔpŮ*˘dk¸˝ý¦ÎňM<6/;ˇ9ąŘrÝíŐ†Ël˛ÎÝŢ*ą¨Â:zwĐmęěö*ŮşŚÔmaÇLÝ^ul}sş&`–Iř»Šń{rĽ+Pą,M&9tnoEr¨K¸~MĽ›g÷ŘËݬĚ@‡ÓUv{‹zȲ JçÔI—~Ď›zÁ¬‰ť\î“‹ýP0%ĘńÖÇžrŰ„ĺVCÁÎ’‹Ľ©gňjo˛ŘDuRă ÚďČ6€d“Ĺ ŤŻmę™Ú˘%\HŰŰůa˛Îş¨€Y¤fDŞ6^/+ťta“…M]ebAź¸Hż©s:WWwŮ”LrŠ[ÚP^áÖ7n_‹Răy ‹ËÁjKŰ×—›,m‹F‚GDł(Ěx7Űp[´™,€#8YÉ]*©qmăÄ ‡ÝÚŇ TEŐ˛ L`w67ěd'é80ědŤĎMVO%5:§jü«®&ËŤŽUďśJÚ›¬Jş9†ţ¬ (7ěäUOÜŢd@t(·«) Ľ©3Q®Jťôcó^ŮÔ9ÄÓŔwŰ%ą5!‡“ßŮÔăŘĽ.u’ńsię$7ě¤)mȶ€¬J¸±uË“«ô»&`\"ĆŰʸĄ-’A!…V‘*“U'3Ś }0ź'ąřÇUté÷čö* +‰żdg@ŕJć‘GťŰ«Ň €ńP0âc·×]Es-Yž©'Ęů@=wIu|wüč;@”ÓqvJ”cy&ż7RÖgÜ,îŢž®’gĘnoy}Ů {ĐGtq‡¸ŘF”Öŕ0RÇć1…`ÄĹ- ­ˇ"H˘´V† HLm@ZĂCń@ń5JŁuO i ^/‹ˇ`"±»µ÷ »R5ěđWĚ“‹±Q˙u’RI‘~:¦ß‘š6‡X…tĚpiĚéwȆőś~÷M])N‘JúÉÁW2&uíN:¨7ÂŰ9;`™ö…ě‰7I+˘śŽÍă",»˝yt@ŢÔłdr,Â!•“ĄĆ+˘\&9ś 'í'¨ô#…RyŞ ›Â¤+“CĄ®0gUÂŐ¦ë(Ď„eł6d‘PBES˛†±u €złh<§]Pgy&V:/á"`ć5ŞĂl˛ěČd?@4ńÖmę7& —]{@¸-şK.®¨¤ßKťD*iť\ŚŇk@bú«R˛ŢÔe@6¤źÉDą\ôwE‰żŞ@ĺg´F&Ęe@:’'Ż3I-żŁ"9ô€d˘śP›W5ě€&ËdÓ~Wç)‹Ď ;ÝŢś˘Ë$ Ö.± %’tl^7ĐE…óű䢺ś9u’“‹míşÔcó"Éy5Đ&?&5-z)@6¤zN#Pą˝XŚN8 ¨rú˝¨S'žč\† ý¬S'•Ô8Ňď]* ÄŔP×(¦(Őt-µßmńeř7ŮÚ“ś\ěÜ^•‰ŤÂ*Űą˝ś\„8TM¶ţi@”l=€ě§ß«ńÝěöjZa™;†QH™‰rYZ5KŤ;DÜS§N4ýA?ÚP·Nť¸ŰkŻ­ĄĆń ů ÝíuáY•໨E0=.ę!Čf€t’öZ ŇbĐ:ąx®á˙H@şůU@ęŔ°dť\Ô˘™¨ş1Č΀čěŞa§„/ÝÂË‘…”c[4‚/nnŰ^%QĚŤ©oEĐZµEǤ ĐžÂÄRR5ěčđńd7@ŇË dýîůľý®â]`Eż•Ë@޶ľ(Z¤UŃŕ*ýžGŻö$•gňŕ3¶# ”Ě-mxUCCm ŕä"‡yLňB2Ë3]ˇ©rź~×đ’Ą×x˝í9€ěä%;ńHkxiźŃvNN:ŐY彡…‹>‚"/YH9§č˘r UHB2üDS˝AĄAA÷Ö}QŇ3üD,­Ń‰ĎŘ™ÝÉ&Kňř+¦ŁYĐŕ¶jú¬MV”řs2§6}®Ű˘×ŞU[tnúĚ&K[ÚpĚYÓ§Ňouu9i““‹í2€lÓ—YÄń: ¨#9ŔU¬K¸ęöVé÷HS« ˇUńY©zUú]ÝŢžJjnďyÓç9 †• ú˛ 10ä°…I *«o‹ bD T0Y(ęřńj˛j@˛Éú uĘ8(—ˇ-ÚCßěöBv#bÇxđgŇŻđi¤>€Ľ˙G=ť¨˝‹ąpIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Linen/images/preview.png000066400000000000000000000061061361462701300255550ustar00rootroot00000000000000‰PNG  IHDRddG eçŐŠPLTEéééëëëęęęčččěěěíííçççîîîćććl ¸ô“IDATxÚÄZëšă¸ $»÷ýźxÉÎĚě~çdűG'±—TqqHôo öJ"˛>É f¦qéËú#’I¸JŻ_× =˝ţćşč¦)Cć´Ëý–´®âˇ·ň/Ůu{bŃ›‹]hź w¸í6·}\·`}Ď„Ą%5!?°î'몵 Yo†đ/đŚ}č&|'2Ĺ@°“© v6w2Żu“Éz«u~ňĽÖYGřş®ą®ŃŁľ.ŐËěJ!˝XČ>]“×]×ős}k-Něěz3çµü2×°Wqźu›On}ă7sq™k}ËÍĺ±setŤ.őęp/Đ}ăĺ¶›ůMőÔmŽ_‡ő”;ţŻpĽĂ-uiëj*ŃířÖÍPĽ ÍNzíEC›/Ń%č1ö¸đ@P[-‹VsŞąČΚ tct‚Đ?ŃHşě[—<@ôV*Çë˙č/Bp|ţ‘řÖEżbŽ˙ŃŻŻť€"—AÉĆvžÔRĹčbç'ĺß uňZă4Ć«!ś'ťńş7— :u…ĺ_·{tY[Wîćµ6ó©ąl˝Wî„ܱşăÉ7@Ž&IírĄlďäˇÂĽři¤8;Zî˘ę<©ťxtMěDŕ °uJ"¸¤¬Ő‹Ov»PŔVŢ@ T˝‚ȡ]a.ţh.qžP€Ľ:Ţxň*Tůů€VOśě3äÂ>™µ`6QžlÚ©í2…vŮŠ›@6!ţw ăˇÂ¶f’Taě$Ďo@mdFŕ†@˙53vĆÓ«@FyŕźÝ'^@řŃ—jĹC…Ä3ş„,„Ů×ΫVÄ͵…pU+i.ç ꮲű„ź Ô@Ü''O6ÎŐÍáI{Ź®®Â–~ő\*lŽźü±<ăŚoůĉ­ZľĄß˙+H“•îsm a®#ÇĎČńÂňásHć¬ďěźwŚ–éőŶ©E‹W™Ó;x˘9ţçç<áaXĺ¨ ‹'^@N'‘óD¬Ş”Ť'•}aƱĹÁ\rD—g]Ž’č4W0Ţ -‰ČÍ>‘ôIa€%ňJOZbů„łZ‘§Ô;ňÄľ*čOôXědP8ăéĚŚé'Ču@0~¸OP˘DďÚĹ®]YŐŁX)íŇúĐËTuĽFW8^żÁ(űľrV]»¨Ő]GާßřäHqBFŇjŚ— ÝíIk#ŁT$µa4A§H}4A#ŹCęŐNŕř‰ BY”!üŃ\ÖŤ®]ĂÍ•%ŃÂGúĚýÉoµ+Čx‚Đ™O"pGúD ÄÓo€`¬`ŐMtŢ’–ć{ Ţ 4ÇoÚĺćB$H—•Ď Ťń˛l=ŁĹŰBÂł-źĽ€l>‘čń{÷k¤e\·Ő]sF˘3Ţ@$“Ö©ÂĽ©pܧOd÷ Š»–Oşą&Ě%Í\5ďšľŞV¤íD+謅Ą™ëë ü{7,T¸·Ř5˛Ť6DÜ'éxŢoî±ÎÁĄ>»ßÜIw‡ăąDt™©$@đ$k$Pż¤~`<Č{§µ%­Ě'a.DW4.’9;©jĄĚ öęŚĎfÁ˙Ů\5LőÎćBú 2ư “Ńű$Üó‡9óI dd¤d¤ž6Ľ[>ń’ńF‘9¦©_ÁxPăĄwżH‘ăGTőÎřq䓞~ářgŇ‚~f>yÜźÓŻĹĺNbřÜ@Â"ÂI5ö­î˘í°`ĎŚ®l±ŤńôŚ.îťÖĚčŠćě]ŐÇ—Ôżä0~‰a!Ľk—ČÎxv´ń`8>Čř2[Sę1¬{‚ńu@ţ DŞ1µď•@švĹ”L,ęNľBő03-Qd„®ź!\‰OL-„ßşß{Чť¸~FaťŁş˝?iís߉qű™OfFâl"ş¸…0[účŐ ˙QtEźý‰`„ëŐ |˛eĆîj=űxk•©ÉŠT-ô0W>¤iĹÝ4ť1ˇ+ăĎgZ˛i—Ú…€GÁ˝ R…kX€yźŐ·‘í«ăŰN˛űUw= ‰aŻa.<úŠ ÷@žć*ź n:C-ö®Ât¨đź€$ÚC˙Γ‹ßAR»Nžě!ĚŃb˘äČ–˘‚,YůáRzTó·|ňa‘_‚ř%,„âN"‘•vŤÂźć]űŁ i…Dď~ăŮďÜÍuö'­¸C- nŃĄKăYŹ›<…:OäÝ\„gBoĹ]hW7×|3—ĺ_řä Â3j’ŞU…D7=ÍŐgőżŽ.ŮŇÓ 5Ë>ďÚż=ÚŘŰąĚńYÜEÄxH Ą;…Ô%÷¶ź{¬şýO‹Ő8®żöXçîűݎѦáä?~#ýµ‡pÖbYAZígBř~ŮV©=„ńŔ+žÎŮCď~­ "<ó ȱŹl]»ÚŁrbĽĆ45xâ ą9´KšO<Żżř„^› ČŚRCµ/€pů„ů]Ňf+\>±ź^Q«ęCVdŞY’9ő™~)µk9|‚ţÄÓi?oq,xvž¨[âÁ™äOŻ0,ঽ$Ů8 0ŕhAÜM©ăIIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Linen/styles.less000066400000000000000000000031301361462701300243260ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #eee; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #000; // LOGIN @login-color: #eee; @login-background-color: #757575; @login-rgba-background-color: rgba(0,0,0,0.5); @login-box-shadow: none; @login-border: none; @login-border-radius: 7px; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #757575; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #333; @folders-disabled-color: #999; @folders-selected-color: #eee; @folders-selected-background-color: #757575; @folders-selected-rgba-background-color: rgba(0,0,0,0.5); @folders-focused-color: #eee; @folders-focused-background-color: #757575; @folders-focused-rgba-background-color: rgba(0,0,0,0.7); @folders-hover-color: #eee; @folders-hover-background-color: #757575; @folders-hover-rgba-background-color: rgba(0,0,0,0.5); @folders-drop-color: #eee; @folders-drop-background-color: #757575; @folders-drop-rgba-background-color: rgba(0,0,0,0.5); // SETTINGS @settings-menu-color: #333; @settings-menu-disabled-color: #999; @settings-menu-selected-color: #eee; @settings-menu-selected-background-color: #757575; @settings-menu-selected-rgba-background-color: rgba(0,0,0,0.5); @settings-menu-hover-color: #eee; @settings-menu-hover-background-color: #757575; @settings-menu-hover-rgba-background-color: rgba(0,0,0,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Love/000077500000000000000000000000001361462701300217565ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Love/images/000077500000000000000000000000001361462701300232235ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Love/images/background.jpg000066400000000000000000002446751361462701300260660ustar00rootroot00000000000000˙Ř˙áExifII*˙ěDucky2˙î!AdobedŔ —*š1I»˙Ű„         #"""#''''''''''     !! !!''''''''''˙€"˙Ä˝ 0@1!AP`€p" 2B!P`p 0@€1a qAQ‘±°ŔĐ !1A0Qaq@‘ˇ±PÁđŃáń`˙Ú ü…?IT-[0łDÉ­gsĄRÍ KhLg¦·ž‹4ÜŃ4TĽ®j¸š)A˘ĄEŠĄ¦Ş*ŠeŞŞifź\XRhÍÓŤ$5rÇŁ1ĹlŞŠ˘ětŐ&ˇ™M[Zf‰‹y—´Ó¨ŃTT„Á0Lg–ĽĚą©‹žůłTÍJMk§—ZĘKB„ĆtQł;®wxóÝă…ŮNíV4Ö’!4Á!U`j2h!é.vŤŃ°ăËŃĂ9͢g6 gaŤĎY§R˛śFĽGR†„ɸćtç%Ě2uk]!¤¨3"CQYJ ‘A™ :Ĺ€ĚfD†7TÔ͵!JĚ•2ëYÓsJÔ¦ ZWĘ3ĄaY˘šjÎđ™jâdŞ*Vijhj)A˘ĄFޤ–ŞŞ–ç$ĹĽíwC nNOBĚHÎywŁĎtÄ—KĄ´Ö‹EQ­KuE0LtßÓŁSUKTT„ÁťůÎYlň$1šĽÉ’4ĘTM.©XAŤ(RUFşđÖťi˘c3‘UPÁ0TH FőĘ^‘¦Á¨<ţž`ŃŚ‚Y u”ɢçZć/NT†„Šj*€ŐfqĐNJk€·VtC@1™¨3"Y„“U5T”yĄÉB#&MTm–ęHe©&eŞśöÖŞnMJh„bÖt¦¨Ş-RĚ©Ďyąf¨©YĄ©Ş¨™*Š•ŞŞU”ts˘ŞÚPX1ĐN}yő–¦čh™\óěIĘkĚ7)=›Öšçt­Ĺş ¤&–DęňęéL¤ĐLŁ>?W–LÚ¦3ŤňfŞâ¨™P¤ŞxµŢ7)04±¬ČMíćôj×MŰÄÖR ŚĚA0TH łn}$SňŰÎ3®i“&ł°ÁĽĄ5erŤRĂXU5‹“OMNUk$’iĆÚ†€c2YśôťĽ3 –±M9‹ Ë:°˘7sĄÄN·)=,şÔ,É5,Ń2U.őĎŁi-MĄ˘łE˘[B©bĘ–*Š´µKSU0,UKTN3sĘ5š“ľ±˝nf†Š™F†ÖšćŐF˘ŤDŃĎ=y\ÉÔš›©Rj«jc·$©B`h© ¨ë®téKDÁ1ÇÍéóç%aŚ•yÔ„ÁHTTť9z¸ŰĎvĺÍÓ-dŃ23nk,é54öŕÝúě:¸ĎNnuHL!0 D0HH ×)zá׌–sgśşPŢfŚ­„Ń“BeµÎË.Yl©§ ‘ÖĹkygy¸*°ŢXjj@c2Y`é–r"C&MőäçTÉT„łÔ“Ń4Ş+5$Ń6šÍş—4Öěé¦N†b´óŽ·(ěsĐÚŇâd%*–¤©&ŠĄšŞł1ĚŠšŞ^ťxz5ŞĄ¦*A«uÓ—fĚu%ćŁ#e5RÜ{rąÖ媥¦ ‡¬·ž]ą2LČÔUUHJąµĹ×”˝ž{m©xpôqÄĺ„qŞ˛¨ŞJ˘4Kh릳©Ľk;Îô4ŃĎ®,ĺťsĽm$j›&®©­ÓŹ~LfwsŽ—8éRB !TCĐH„ÁP¬óůŕÍ4Tm&&\É&-sąÖBÔ™d×JŢŞ—nläf gdhh¨†Ě–€Ćäçk,Ă&8ú<ě•LCXU h®úu•‘–¤™ Únią!f35ť:fv±¦gĎ×'U52I/Ns5’s2™¸Űëż:ľ›Ź]U«iĄĎ$ĚŞ’šÚ’¤=:Ým›FŠkj‹§5{#:“‰Ű›9s¤±˛–V¨¤[©Ňj™®|ô^d©•˘¨Ş*ŠĄŞ*MďŠÖ|ýyĺĆÔ㙂`&#z-¶–łŐż?Lď ĶjâçÓ,çyŘR¤‡m×.ĽY ŽŞTŃ2Č €¨Ş i‚BN­yŽÜ±rĂ"‰<úňsçĽW ›ĚÁŮuA«3!ť3C™Ľt š TĐ Ddçtćüĺ%çU!*†ĺŢřm®Ń§J˘Đ–Í6¶ZsL±$iQ«vgMtxi{cKyŐŠjZĄš#X—,äg s™š’ŃőçôoNuÍyŐŚÓ[4T•+k*ú)Ţ†Š˘”-JôäµÖş“–{âçťLę–Ş wEZ›ł®V9ŐKTS¨&†ĚjĘ0jËéÍŠ¤Ş*B骴–”Ń߇Y ďçťs…™Éˇ Śj’¦R:ŮŇM\ňĐćHÍQ­LŮ%C2Lf`¨† ‚I.śú4ńí7ĺ:óĆ ŽxéÍŚĹć4šďÍÖú\ŁyŠB«ˇY `¨ T„(©@T‡>„žsc–m+––ĂL]1/w†›ísč×FťLËĹRŇ´UT…hJÝnt2ł(É$®7‘Ĺš\1qT“Jë5z9oÖĚ™Z˘Ş[yéoZµjK[ŰyVlh3¸ćî˘Ön«Äőr9Z5tW@ŢóŚ˘S5!(L UF$ÖI!lĘÁ1cd§Lé\í^Ažnă6‚4&3©;ňÎÝ8gŃĆ34™ś¤ĺDE˝şŰa®qngťĽˇZ5jo2ŇT0D†B€Ş Ż=K©›8wÎtĆ&dHrĎ1ěoG.»Îň`ŞŔĐfBMĂR†€ŞB@4P2$1Ëó'9$ QaK+'f®Ćݬo 4•DŠŇ[6GFEYBšĆŃĄŁT<ú&窡łXTĚŃ#Nł«¬Ő˘Ů©*Th{óë­HŐ×=f難ľ]lŞT™n{ÍĎOGó´+^+EóÚVłn\SÎöË<äf¦‰ il™f¦Â`Š˘¨Ş-ć]áW#3 BłµČ¨ąşFtŤcźi|ŮôSÂpçčĂź\®ůۤŐÔçAšRF*m©.śú¶ÔÝ$4ĐĘé–rŐĚÔ=3»»Źb^ł‰4‹:ś÷u«ť5ĎZޡQ¨Ą%—w8Đ`ëŻ<ž˝ů:]ú,nęhşňÚő©±„+@:2t:4eXŁVÍ-4¤ŐËź+“–s© e*$©%3j3n0°T •- `»sí6ËyŞŕhŤŃŚtÂfÖ“•× ç`hRSz)hhÎpĹS $*’Í *’ˇ€d* 4F°ň źIÎJ—"îĆŠE**4AU„L™$¨i3! Žąôo6‰A© c‘Ó›i pŹ<ĺĂ›Ł°˘ÝMM,Ń“¦$Ş©ˇŞŰ·.“KSuU2Ł%ŽśĐE‰¶«MĚŰsčGĐGöÂsi›F®ŞäťK=śi×n5+TµUśł5I4˝;y–ý·ÚŰčą nĎb™Ľď: ŚÚÂtŤ5T˘ Ň§.ŮO6{aĂ\Ô„Á2ŐEHL,‘«0ŽĄÎ©nnY$g}ů®ťn¸·‰“;ÍѤ΄$\ă®&tńٸčŐ¬ĺ­r‡2dBB¨ QT¨Ě‰ ÔD&@cź.ś&3ŰŽäÜ•U`h-b—dÝH¤*‹: ¨G.FÎS]9ít4Ţd ěB„ lB2™ćÓžsĽłsëÎÎÚ¦ÚŞejI©fŚZ,J›măRô©Ň¤j[Bô3RŹLé©4ŐΙĺFÁ)ĘeÓť]c˔ԏn]oR)zÜöŰ— ‹5 Ń&”ďĹ^Íi˝gŁ{č.Â&uiI”ÇA9őă¦:¦ťFŠ˘¨¬‰“xsçžÜîsK$Á1R¤Á0LUE0L(µČG;xŽĎ®ý|ÝÝu–lËɇ–§>މĐ4$j¬ç˘ľgĄ9ćÔą*B`¨$!­.NňůîśŇ©!“6€BJ$ Ăç“9IÎŞNŻ.ş¤•T 7†] tHU 8‘É\ÄI” ¦ę›ÝSpQ›Y@Đ„&8őóąč©Î(3˘ÎÍ]Ô“K2˛1US+Îé”)˛jW|ÖşRÜš,ŘF–mV›«:á-Vs4łB:k–öîë˝ žG¸ŔÓeS6ńĄqÓ R•DĘŐ-Lk·ťÓ׾}/NÔ»šXZ dă3•ĽËŐâŻSś»É3R'·+‘©*Bj&*–¨Ş*Š˘eZŚc·6s3$Ą¶t dŠIŐ®:vče—F•ɨá”q†B@ĚÁRĹŰ—fó#WÓ<îÇ=ř˛TŔh ¤$ŁťÎCç2TÁ!k4vł˝ÜČ•Hɧ;hIć–nł<ÝŤsĎl3ÎFJ¬ Y5$ŐÓšşŞh4‰–·.™śsuR\Sj»QY¦Z˘jÖĄšq‰š§§-Ítm 2¦‡TÚÂóĹg3*4M¦´¬éÉK–ĄÚĽ÷†bY‹K–“yÖV¤–¦˘J×ZçÖénštôFťˇ‰•),o“9ĄĚhŞZ`d&*– GŻ6J¬Ş*Š-FVW, Eh\›“+(h“%YTU7Ă´Ýhjß8ďśer3™!TÁ Lf`©.Üz¶ČŘhB¤ąuäśäsŞ@Ôg–ą@4Éϧ6A™*BBëÉ:ÉŞHÉťçK®Ť;sƆq¤Hc&˛Ď1Á‚« ŽMf˘@ÝÍUÍ+—(ĺĘyúňí1 5ž=řŢm–禱»¦ĄQY¨ŞµD©Y’¨Ą^W\Ů–“@Ë2[4ÔËW>\m±m P«ËzlbkNlŰÎŔš3¨çS +Ľť«™Űšĺ¨Ş†ZĎMş Ą:Úliwׇfő#ŁQPŃʨ¦*AĄ¦Š˘¤%QĎ=Šăväě3i1m9˝ç§R€Ü# Ô ›yBsŹVĽ;tőXŰXçN=]-Fš$B`¨†@Đ€ĐăNą “/4s†LČCĚç–ĆJź^w9ŢB¦I›ăÚŇK ‰ŃÍĚëgB!!séÉśŐy†Ě‰ [Şl4!P]%ćě—5ÇN óљϵȚqW”•mŰŽŤÔËTI«j•¤š*Vif€Úrw–fÚɦę‡Ćw3-Rµ+RL¬:\^Ź6¤30‘ĎYŐŔ¤ľŢµ‹Bcz—*lĎIm˛š˛ŞŠ÷xöu§šĽéΙ*AĄ¦*Š˘¦*–*Š˘¨Ş*‹l™ Ň™d*•łJQĄĹˇ×(ć$µQ®Ţ}Ýt“X¨;<ş´M(0ŞBc3nk§ÜŽëË*˘¨†@6“¬—$ÁQŐή‰%†LČTŽgLbH$BBÖC¶Ľúł°jĚyý^xÉśĚď|ö˛-HŮy¤Í¬§-®ąŁXçAĂe"fD„J'Iť$Ô0T‡Lm°F‘‘D†uÉ ĹćšÓϤĽ)q©µŢvŐKR#Q&–©Z…Ąj©ij•ŤDڶó/g–ďMŁ-ťrI©ŞeăÇ×ĺÎDfjAŞÖłÝ­3«9Dc,• S(°2 JtÂwąô›šZ˘¤ZަZ˘¨© Wˇ±×ŹřĚăo2c|írë5É0JA1 íËłW>\yvü×|fó*$‹xíc%Ě0IÖtÝPsꌒŮĐ…Q !0„0uä';­cÎhĚčËb6âi č’4(’jéťĚç<ć5ŚćgvvL¶RË|Äîréki0ę·-,4™© yÓ`ĘT€‰YĂ Śc:Ë…Ľ´eĂW”ŠďBÜŠ¨•J´˛5# DŇÉĄ¨¦•´%Lµ%MµF÷Ék¦0›Ąi–@ĆUĎ–{â9Ó l×hÖťgK”QIZW-YRµ%L PŇÍł=5čť1­ÎĽqéâÎé9)TÉTµE1LµDŚłÇź‡Ż•âoŹkƵVV2©‡jňz'´Ľjeëť´T¸çß Ěf öč×–őÍxńď#ç÷ôážB\CXIéĎŁa˘R¤ĎO%ĺ&A $J ‘!€d yŁLV8émN6bi2j€ÜazZůzń¸ÎwÎsČŚU!ĽnZrĄ TŹ^z.{¦Ě»°Ň$°Č„$! f¤„Lc§6má4#p‰‹ShŐM¨ŤDšZĄi'Rć’9ćNďť_EŤÚÓlŃ5,Ő­DĐb¦]â^Ď7×–°“)Rg—păß—Şk$Ő¬ésˇJ’ÖkwŽ´×9¬©ŠŞŞY×EĎJš˝>oCŁ3¤-ŁQqď†xŐyŇKRaqc¶wą§bP¤çŽĽĆzńĽ»YÖą.ş·ťSuKP<şňgšiĎŁMĂÇ;Żeáo T„Á!ž>Śłç‘Ę®†:˝Ý|פkÎvÄĎ3Cky—3@1™¨í®OYygŻçžłź¶ĂVią%(d5”¤ÍşsĎ7®xÚ™ĹĐ1˝2óC%ťFRMĽµ[Ői9ŤŮÔŃ!…APĘU&yőÂb«™Ý…Ą4Öµ3XşbĂX™Ý€éĽé˝kiE§źNhsëçśäs&–ďĂ®ŻTuŞ™dI«j…Ă”©Iš$KyÓN{ r·¤ÍĽ(Ę4ąi*ŐĄ+®ś{5fąÝ$äôLm–ij‹·-5ŢkÚ¦*–ç®L\TĐÔT„ˇĂ· «·Ůéşť$­&ĺßšsÇLŢxďçöŢz˘ôI*‚ąuçsË©¶ ”*;nťěéŽ8ôW>k¸śnŇp˝âǸgĎŻ@Ľ7¬*›$N|˝8cÉËÓç`@×IxÝÖ¸ďSA˘ ĺa–` çÖąçĽt W&‰3žĽěŃ®dk2s-ąç{›ÁĐ—›ˇ –Ö|çl9ó‘‚ 5#ѵA¨ äŽ4T€„%BHT„äo’B: íŁ 5·†-ç˘Ě7¦Ťk—)ŻF1e®upÓ%R»ĆíďVµ4­5Tł%I•WHĺu şcĐŃ­ÎŇ­răéĂźy`d)˛©ZVŢ6˝*›©&–hŞ&VŞ»tóú'Z˛Ţ±‚⩊ĄbFU*Ž|şbhéšk»3±5UKšÚyńםĺźg›Ór“mQTŰ9& Ś´zjťËA›@TXTCˇA›BD2pó{|î~q¦A“«ÇĽę .MrĎyź=Óť€Ó$5FzfÄÎc®pÉľ}1ĄD™ÇA• «)"")’Y ôĚśóľwlôÖsU€2:Ćĺ$XD €D†Lóë”çUČiŤŇč")+ϦÖ©©4­"±$ <ö‹K#mĽí{S­H“VÔ“CR´­IRM,2ëľ6éRÔŇç;Ă6w3ÂŢ/6Bif‹C/Z[šY˘™¶˛y‰Ó§“S~‹˝łĹ7’*ešW§*˝7¶i”㎼łşiw×ĎÖď®QŃ(Ťd8z|îzôrí¬TĐZ3®ť&ąosXóőćç›S9™ ŁĐçnٵ.d* 5¨&°¨&32dÔ™Ş/7§ÍyňĺߌŔ`“}<ńě9ęvĐŃ™¨4'>}ńqČŢY‰°5Ć9®1ÇfXŢřuŢµŠ´ÖńtH4!k!RYŢ ë“$w¸¤Đ5”„!€D7š63EI™Jł˘B¤ dá F”TŃHĺ«U4ë)&Ź=Ó\÷‰‰«7®rőł¦žĽ»Ýi«¦›j‰’¤‘YĄš‹CmQ&׫NŞ*Ś·>B«›—nlá¦fC{Üß>—VçK¦.‘‡Ró旝̜撥sÇŃÎ^}9Ó]î}™j¨©ZbĄw×ĎŇÍrösoŮ›óŢ…8ěÜSZÍ›5çëÍĎŻ^}µ‚é¶łąlhąÜ™*sŞJŞŞ‚c]Ľţ‡J¦Ň5ŤfÂtąVt°šA¦|ť8¸C9rçčĚĽ ć]tá٧x&űŮ0H‡>Šp;çYáÇŐçĎđôg†¦şg,Ńť—ůĺŽ÷·-EPL„Á×’ľ’]sj3QuÍ™*BDŞK§1{Üú7ž<î|Ęp$Hd1¸ăžôą·ŐÓĎ×l×;·6ó&‚˛ĆňyŽÎyné©ß:moÉĂŃäľ]ɱ1hڵ!Q†ł˘ăčĹśşVąŮĐ€‰T€„$CP"9±±†LÔ¬ĄRAi\¬–».žg·7gDn\Ý›Ô9«d¬ŢN±Ď­+U­DÉ"H¬ŇµEˇ¶©m "wyôvjUĄł qŇ9y1˦:˛ë–;ďËŢkŃŻ2ߦáşŢ„ŤfĽąGš¤ŞY˘¤ĺžĽ¦ŞĄéľUŇ2 EJťůötíŻ?G~®4ÓŽ…gV“‹¦\[“ŹłËŘö™ĹôgĹŰ”ŕíe) Ž\ý9c;á˝qé2fĐGNľ~íµ7g\Čך@`†B Ţp‡r†d¨$Hdçńć§OeËS®‚˛&‰ł Yë¸uťçN÷~®Yăžťq›ëĎŃuÚ®ťL, µśěN=¸t™éKdŔk4r§;§=&źWžă&«Ď3Q %®[SY‘X˛ç’`âŞB@4I fD8öó¬&U@ťW®šw3¨2+65ŤW,oTÇü\ѤpŐ™ĘF„çŽÜzq묽3µ$Pd!¨4+±&ę€D*@ÖHFJ gÎqę9ôŐ3¬Ůçđčeš»sÓ]¬îtÎŤZ,¦w–uľ:^®4Ňć]<ÄŢI–’FÚ’hjU‘*Ŕ‡TÓ.•+®śv×X›ÓČ:Üt˝li Ë<ý±ęąőšń;Ĺóô×5z<ćşÄé’f¤Ş·®±Öç‹7DšZ’¨‘µŞ3ž˛ń;ÇľZ梱F»ňëz<ş’ó« öçčvÓ«¦ą))#DÇ}y¸ôëćZô\r˝0 ęç–zôă«Ëľü˝QšŠc6€Ş]ąłÖăŮ«8ćË„ĽÉŞYޤ*€ÖJ¤ >=yÁT«‡Şt$u&Łž™@I.¸é^luá1˝gF1Đ<úrĺ0YĐ™Ą l8ôÇG>Öł«H„„!ÖΧBŞł¬É–tI™$<ŰĆ`#NqčĆ9çEĺ<7'móéz=9齦›‘‹:Í™E–Ş©UFYޤU¨naŐäť®]%3˝Qąť*m cśľścs«THŇĺ]śË=zóú3čk-qçnůíËSK,¦:' ż6pŤÎ˝F§<őäĹJM+QSlş—˛TXç='Lígi¬ă·SĎ®ś«Z5rŽťüý]´8jr¬tŁ/}0â&"śęŐg««#C$Çk'B@šŠÉ˘8ť9ą•„ŮĚ:\ÔŮI fJŞ̉Tqç×”°‰Vĺף‡yŘ45eD$€k:«¬ů8wáśoXÚ¸ŢLňď†yU1 Y42OEák3>‚· ¤ D$@BşrÜÓ#PÉ‘ÍHpßć2΋3$‡=c\ú\zë—ÓÄz¦Ľ·Ł›<¦s+łJ™ę k|[zÂŃ$\şÉä´<úéZÁ#6tóÖd¨ 2!PB ©$ŞŚÔ€"U văµč9t‡,˘±ß“zňK(Éž[ćÄcçHĆ×[ä]w¸jşré g*ł)Şsłˇ! é•KxŰZFoI«zrŢ-Ş‘EdU’Ö¨Q•ŞŰYčą·‹]gˇŮZĄQ$F•Ş\sôf^SDŠ˝üý[éS˘ÔŇ™­r';YŐ•PÔ­V®rk™íߏ]N•6˘˛+"­DŇçR­V(Ëß§—nžŽ/%‘bjŞTĺŘNN˛ĹťGŃÎtç3CE*šÎׯY¸,ĺťŮÚť7ŃĽTĐ4žlz¸7ÎI¬pőeχ|Ée¬Ç[–ÚŐS\Îüő缡 ©3!T€ĆjHyŁČ×N=T©aÎłHTfD„©$î °"!–“9ŐgXa/;7=Ů΄śóŰ›8ť Ň‚Čtćxí®bLç:ĘdF#YJŞë–ť fq±·t´ë-ÍQ"˛hşj†‘ŞV«nÜú¶ăs|ş»ąQÔŞ]T5*‰"4­Ď¤Ľ.ř—›R÷×έžk¬ŤćÔ¶†*V¬Öń‰•şňôJĎEĎ«ŁU˛3S%PÔŞ5"LËUSR´ŰTł%ŐěéÇËďó'ťë‡,҆:ËŔô“|¸ş:ă˛ôĺŰÎäLćvăéoÔEôdÖd¨K:ŁÍŹWůÍ5›Eˇ$$OKIş>Og“\Š ©Y!©3"BuÁ›,ĆdCyĹ7BHT€Y4dM™R¨@C]8é­ÔRÖdÎE>ůLaFa¤Z—ź>Ĺśd`©a*‡k‰‹Í–tHMZŢ55–ŁD´ŁN˛ÝQ©(ŇÚ ¦©•Dj•MŰ­SłQżG>şÖ1Ű7<ée¨jUETJĄQ,î^=u7çzf †ĄQŠąŽf榚Ą}»TŤ—~şíSmSJ$‰T«U4«QUj‰"˛moF—Z¦¬t¬ňÝ19™Üs·–JŠžô7ż?§“ź:×ŁŹĄ×ĄŁ]s HŮ„©8ńőňo„’•XI!]¦©ĄŽŇó<ľź5ä 皢!ČŘË=.M›„Ž|·‡:*zĆÚŞPdÍrŤsÉRJ I5Ó…g Î¬!M-+XÇ\'Mqď7ćň{|YĹŽącśéśîZË<µŤs*d©ˇ! «HÔ¸ĎRÎ7z^VĂNzΕË+jmŤ KČȤ­J˘Ş%ŰtjmŃŢÝk:µŞąy2ÔËJČ’"ŠÔ¬Šµ„‘PŇĽŽňđ»KćϢŹ;Ú8»ÉV¬ëĽęÉF»kźIŐ©Ą˘EdFŞQ•¨‘¶EZ•őpő:T6ŐMHy˝>9‹$äÔL­\ôČ»±Ńyç´‡«Ź[´‹lę—ťĽÄRE$Tc‡¤_%דPô ¤čR]šócŹáÄŞä.ůłĚKĚ© µŽÓ~\öĺo)š5ĽéŞĄ„¨5”Ş ĽZě%•u)3B‰9çˇsŚőeńąg5ÍMŘś‚`4\ćD*@D¨*$¦ŤP&«Ç«ŻVpo:´UjjĄE#(Ȥ4¬’¨Š+Őe{]]ÓYĐŐW>™1Ućˇ.ś˘Š®DŰĘ:ÜĄďqNĎ-ÝidFş]:ß)Цä•yťUňçŰÎNhŢr$ŤşíĂĽÚ‹mDŇÉŞ­ipôÜ×÷[ŕzňŢ®vr©žýřőv©ZKçÜ\ůŇç4łi`A˘Ů.Ë+®Ţ}Żj®É ĚYęŮĆŢrĚŇbŰ\ŽúkĆú¸NśÍfjďjódÎř1ČGKhóšsU…t—č^‡NlĐoT™ĺß,ůóß›ž­ Dsĺ¬ć’ $–tHT€Ču×.şŹn][\´†u“.vÎXÍëă9vç1Šśá$°¨¨¤$„Đ…5cył"9ÂQÓźI¤Y×3›‡<×-k u×®ş5MćĐIBŠÓ •VÚď­×]†—H•‘¶çSšë«~}tÉLą6ŮČî§ µ­bÇYMď’˝ž}}{η.śí‘fEdF¦ąg·9ş'=un¸ö:Íe¦š†ĄµťUëňvoµS«˘Ňĺ´óú°Ĺ׏e’kYÖ,237ź·ť‰U)f†Ą´hł¬†łł®ĽŢ‡DĄ$śęë „’ŐRÂóŰ2 "^ĽŻ:ĚÄ%–u’Ş9c·<Ö®5´vZh0Ęg:™uââĺĂ<őĎYŢΛoÎzŕvćÎ*d© »pë]g6íäLFđrg}xö čšłˇ<ü˝~y<őN0’XTB!B!n§7E˘t·Îuäĺ rvÎç\ëεçôyőŚĄ|úą±˝rW×rŰÓŞĄĄ2ŞŽµYÜ®śęştáŢta»Ň0çX6Ő¶uÍ–Ť"éséÍ&™‘Ąlë’\ZΉéÍ—ŐŰĎčľ“žđ“HÔ˛#SO.°Ě˛6˝řz&î]•ó[Ă›QhjÖUőŮÔË![IyőÂÎáiĂÍšą1śôęĎťVůgĐŻ’őpg(łF©Ţ;MrÎłd„Z°zžť! ×N=,Đ…R•,$YĐuç™ÁW…ťfHK,ë%TúIćęî亣:\ň:\şˇŤá <ţžLrĎa8µŽ†˛'k–›Đ‘ž}kź5ד‘S Ľhőr9ë=s;Ćd„fíĆ_SÇsł9.}9YćǧŹxĚ (™JCJÖm×GN]" ĺ­Â—!f4đďÎăÎ ňZÎĄ“kÖ§˘sGG;hÖµ7—TĐ­ą·F{đΧąóö˝v‰¬k'Hm3mZiWÉš™śę­ \:ňF«™D‘—Ż«ÇévÖ:sşšFĄ‘ÓEK¨IwŰťgJyý<“ťNkťT‰×ż“Ó:ę—FR·:Dqe:Ľto¶i—YÓL-(†8ú†|şÖéÔ›âSť–5Ť ťâOVxmשˣJLőŞÚ ©a"äÇźYś ™ł¬¤%–u’Ş ôpěŮ‹ŚČë9óíĹĚß8éĆÄŰ™lÉĐćXU*¸H*C¬ó[Ă" q¬ë™URB$!ośz_/gMńëÄ„s1¬',w&|÷y9të7Šă+Š’éËŞKe çXµŠĚŽftšşyôăg´óńzi9öŇĚ×C*ľŽ}§Y0×Sśť^*ö±ĽęW §§Ż“ľ·ŇZĹZÖtŞK¤Zk&)bF”cž†Şc`Ő.˝ní÷ç˘őŞ$IÔ妡¤·žíj§Eβp©ĘÖuR%Ľ2úuĺëz÷±©µËjâô\ęétž^Ď'9˝g¤Ą+$şpš…dɬňîĚ"đ!Ęh ĘY×5şyw;úuĆ_nü}+ŃsÝ•QYÖK‡O3“ŤRYBË:ÉFcU„:yűÜÂ7HQF˛rš3bMaÎó&XH« Ô™čÍ,9J© “}{Ě‚Łek5™©hÍARLé¨y S&ĺq® …bX둡Ş()łI°­ß ň¸uŤ°ąmjVVť-፸ֵZ ŃFśŐŐăŃ˝9ZOF¸{5®o^tďźES-t ©Ľ«xfFÇ$aj©Ó•e!ëËW^ÔěSB$›W,µJ·UşátŐĚNĎť;çźŰÇn{Ö5tÔ(ĘŐVµÖtçÓs¦mĎŃĆąöÜ.‡Çۇ,ďFĺ´Ő4¤şr— ¬¨‰G|ŘJH¤sEĂ·™jşńŁÝŻ?gŁQ5ۧ—«D¸±Ż:c4ŕ(éžő9Ôç0¸ú5=98ťřtłĄ°XŚóÖ3\˘%¬Ó;šçt“ HYÖRŞB¤8wáq‘ĘŤU®@–$$C©|ú)ËxJ¦AŢ)¬á3l¤•k:‘©qU’kNuIFPĘ^FńˇJÝF­(ŤtçMuŤMČÚ¤o6–©W)Ô4é…SŃŰśôű0ëOW†ÓM(ÍiËkϧ43‚ň©Fj©R5¬+j—żNçbŃuT–É©mµ§žWeY$jx#śŠ=9+č¸ő»ŇSZďž®ŞMČZ¬<údćég8ëłĎzcŽěšm[ťX7śŇ.Q„ŞŚ'ŇŠ<:ňn"Y6ť(ť7×Î]z®=]=áŐĎtĽ ľy$Đ%QIU$QwáßXÇ.śďY“Ľ.ĐqëĎ:9uĺ›%r–u™7ľ]j\Ô…HYD„J©?nś#FÍă\Á.J’ D˛‰ož×9DŞ@¤Ď=rËĄ`’BYk= ĄŁ(oÓ9ëĹ3šśśë6ĆÁµ•[YY#{ç©˝˘ŰTLŞĺ¶’·¬łb)ę×—´ďęéäÖĂmδ]FÓťÓ&g\3”l‘Y˘M,Ó+¬j×ŐćěéŃjdŤJ(!*çI"µ® 䢒1"«”ďż7±Ű˛aččqĂ]žL×Kś˝nxł×Ż6ÎÚăÚçQYsę'žÖf(¤¬#Ä1ĺčĂ<¨f‰9sÖ'JˇéË»Q U ‘Ű^mťGťĺĎ ť‚$P0RS߇{ŽXsxT'Nś;N”íľYďĂ=yńďÂaŞä,¤Í×—FµCEHP d$• Ëš^1HRvç×Ç1*˛ Š#&w”Čĺ“5' čĘ×64$Ô%ŽĆRrĄRńÓMůý<«ÍVx$®7ťjuK×®‚RF5ľs}¬3[˛®¬Ő»žëzŐ:ŮÔ±°=^_VŹL­ęKmĺV•ąőS…¬ąëťćć„U˘ĄTÓVń•ôçžÚŢů+čąôu¨'0Üł/lđćťůâcŁÍN»óę˝.†’KżźNľ›Ďąęéˇmr­˘–ăľwŞť+Őż/{Ďu\㏧Í3TĘĺVHb„ çÔN|łăÇŁĎ5oŻ=·B‰Uřuáp 5`Ů‘ŤE%Ű—}c&†rl1ŰÝ^|=>lčó÷ÄĎ:/8“"LÝqѨE*.aăľ,B9‚ł´ę&¦gî3ÄŢ(J„M`4&DHDŹ>uśä4â]ąé6ÔÖDB© Ż.Úk:5|UcĎ"FůÚÔŤFúqď­r:s…’]T¬#ŁŁWCٍ“vĹf—>Ż7jě-«Ť[o*´ŞçKrę'*śš–˛jfš—U4ňëĘĺďçë/D[×nçH¸ÝÜůă9댬5 Uk,Ş5k2ú5çďf«zđôNÚ…×[ĎGGY[rqerąúŢ}aÖôëŹ]r|ţŹ,Ä“-DÄjĚşł H”UóúxÍpçß$ăj’™ ¨ŠŁ§śîaĚZ±eDPÉ&»óé¬$"B'NľoCgźŃÎtáVn9wÍÇxÍ)˝Spĺ!D(‚«››ĹG8¤.śúŮŞ,×LiĽă¨rÎó3ÄďÂňd­isťĺRĐśqÓžr !iQ#ˇ‚kˇ•j {ě%ž*łÂJ]ăy·-2Ô=¸vşéË­«ÁsQŞ–MénwijĘÚ˘¬iMdłŰ ÚZŁXѤZ‘VŁ–^WŽŚ¬© J¦‰t-XÝ\×3‡–Ý{kŽxÄ1I» îÂjĘ«ÜTÔ®°Ż~Pożž›ôtá«×˝çZďžq¨Q„éčňuuď ĄQŻG›ľ˛ůúrpRe„bV!¨Ş*"ˇˇĂ=ąM”,’9ÖH¨¨MsŢPMYśvă-BMHUÚĺ’ŕ¨*f ·=67;đçéär6Ë'<őË-@"BH !ŚââÎ’‚,#ÓŹ[ťe®zI:$V¬PăUś&r7¬µX—=«ŤóŽ&óx珣ϙX¤Ů‰6ó ١ ˘5Óź[®—;WˇňUž2jZͬŘ—n=®şU«sëKÂéÎEµ)Ű]6–z¨Öw–Őµ”ąôäžíů}ZÓMŐë2é˛e1Žśďa•˘×FÖpŚ1¤n”VÖe×r]skA9E’…‘¶J5 ˝ł·A†ôU.t¬"ĺU%íŰČ·ëĽý]7ŰŹJÎJůdFĘ0ŚCÄ1Ů fž{f^t-¬Ň˛ Üç=:Ż-ď®|ţŻ;8©Ęëaş¸HDŞ@¤„.ţ}5Ú§N|}$ľSŻ8 ’©¨›/.uL!R×$˛Ś=ąuÔŠ:ŮÓ¤ VSE·ž¬śzň‚«š$ëĎ|ćůĺ/ŹnsĽXREĐJĹZ¨Ń*ąŇ°®1ËxšR5Ľ3IąsPÔ0ÔŚ­TÖ”ëjt‘»a‰ËlÁ¨ma…ĘŞJÂoŐâíoJŻ)!‰uÂU%gšÖIR–‰ŁVk!I†nś÷žťî=.đtÍgźJOĐpĆÚçW,±ÜâłŇĆ•(„B¤(Bٶ¸vuhjË'.}čóŚIĆé990â§0Fj ¤)ś#Śď¦7ˇR]9m­Ŕ޲IPŢ4<şć9. []9. q±Ľ' ±`:5ĘďW-č-óWU)Pžts„©Z‹BąšËą×[–jFŐF[Ż-µÖ§EEM©59ęşsšôÜ6×WšÓŚŚôyÇNsfia…dAĄQ—Nt´#IÇÄÔŠÚĘ=0Mw ·Ěëť§;˘¸Ö´¦†é…Xe\ŞŚI[9ÂuxÉŢáµęĺm…^Ü=:Şĺa*Š˘Hb.O9şĄ˘*ĄĄ29F$\¶k.ĺhÇiĚžŚĽúe\yý^W3•—¦$®¸6zzyöt)a (•AĽ¨ĆťˇĘUAg“;äPĚă=#‰Ö8çĐ'Ľyůúą3ç»LyîúŚuŐu“RăDĂe4ÎőĎKĽ’ë:Ä1€ĺ¬Ţ4IgYO;˝ç9RŘK ’“n4ŐR…'ťâŞ$U…]g­˝Öµ šmeĄQ;8ŰŞŠ©+5¸a‘s«j•DŞ9˘Ě˘´4­CRÚĘ:#V°ÚĺeÖ6Ľąöă5U Vę{pč×J¦Ú•„aVRUÓČ^Ď róQ+ÍJÖßNť5[ďË­Ę•Ś%QT˛Cćă)ŰŰ‚˝­ÎąŃ*TE'>>ŞăÉ­âňßn]ÚâtÇ>†®–Xłą¬ć•ńűŽ>Šjf¨Ş¶á¬1¨“{ă/LÝgNŁ“XŠi‰:öňú]jb 3ĐK6qëŠMą•Îą¦Ć@ąóvâó9ÄEU‘PŹn,Đ×5REß.Ť5)RITID%R7'=ŮMYZŞĘ9»'7¦Z8őćÎdŃKBÍ” ÉĎEqśőÄ©’‹!$Ş ¨%¬ş—2GXfüQąĂ=7«ą«¦ŁP’+"­U"Ş$ڞ#U˛"˘¬*Ő 6Ő+ËxfFĹ‘†FŮwžŤwŘÎë–Üyý<ć1×—FvCZÖf¸ńę^\dÍ’Ą%×^]fôĺmIZ†4k­§~6˛Ě’#,ĺ·PdžŠjĹRB T‰P‘RHe¶iGC)'"®3ťňg¤jPfr!™Îůł±+9Ů'3©sĘÝ&•sÖ‰J‚ :%7ĂcyŐ.ŞVD’U*Ô2ÉZë(Ő*Łl‘¨FĄQYÖUF0é2ę3m^wHĹŇ9ëmcZ¦”—żNťRZ9vărk4Îě¶ëšÉ‡«^n>ţž¬Ć{qí:54ąŇÉJőĺŢďpşĽşËĆÖ\ä‘…d­ŃQÇVÜ÷ßuK¶×ĎzVĽ·§)ĂŹŁĚĺUsTUEŰŽ—¸SnXçžą]uóíľÚĘßC*}ńšŢb\áXλĺx¸.5ŁS]µÇľ§ź>žRů âs¨J¤ăŹG'<Ż<]tś:販 ¤şămU(T•AA„R$PB$Qe”‹Ż.ŞŐ7śë)ČKÎĺד'^3=Ś3Ig7;Î)6%EYĺ! €©:7ťM‚ËY‘«Ya¨jµFZŠl©Ň©¦R¦ĄQ$FRU#P­RꡄaVˇEXIzńZôÜtß@—Šú™ň^ź2tET—PŰÇÍďŕĎ™)ž›Ńs¦¤—PšďĂĽęŐz0Žu/¶ÄŚ0­Mş×^ĹĐ­jV!¨<Ţž,ůóčâŕDĂ Ń ”ďe˝yË)SCľr÷x­ĺăŰ=µŤa«Űâ÷:I;y¸ú|Ź7[:GŃçôXŐsĎÉîŕĎ›>‚g…Ú9ëc<ůöçqŠâ’(„I:+SQT‘DBU"T$ T‘ABUŔëcCÓžŽ‚N†t'..=99Ő2©!MFŠ»*!© ¤!*B¤Óť:TFš9k-ĂUŞQކ%^blăMm¤eam‘…‘V\ęÚˇsĄ’VD‘U!©Tě§JuI1łĎK›gJčZ\óuygw7Í)ŃHÔ+$˝;ůűέMµZĂ +gUr; ňôsőÖ´5T1˛Ś%Ç·3ťN|3Ű‹”“-^ĽŢmU1P3ݬmť,ą^=ynuy¬sőyň{ďŢąÓŽŁM^Ž>›25Éž’ymeЉ,<.*â’ ¨%Ř(ŐA%P T„RHB$!—źżž3`łŰŻ©×eiËńąo–IËflÂ;U«eŢt°Ť %”D¨H Ş¬¤•Io—F¦¦›žŚĄqŞVÝ…:*©I]e^®VÚĄQ$jITFRU!IuQ$şł“­Ä_Cćeô\5]ž{5 ŻG®©-0©gvYÖă‡?NYóąśŘQ†žŘÓĄÇ˝5çRjHÔ*ú<ýÝ4ĺť•ޤ—QJ×J×RÖ…ʬ%MŘŽ–4ĽŽś|ýů1Χ-®± ˇĎeÚ.Îi(–úóĎx…9ôË%Ľ‰©sť‰×ŻšçŇ‚1ËŃç3Žw•CśRTés­KPµ&MćB¶;GBŞ8÷ĚĎž‡8D¨H@©" ‚ˇ1ǧ<ЦJ§6ßg>Z·źźtĺĚID(=l–‘«,THUdTB!AT$"râë§Úڬ:ËJBŚ­U# 6ôÖ4ޡVXmj(˘H« µBçďĄÔPÔH«RşÂ˝şyw^Îśş^»˛Şgš=üţ„´WzrËËŹ~n\®¸`s«:˘ë$<ş«çşsÍ’]wóő›ëSŞĺUʬTĆ×]ňë:©*•Ś&ůfe‰ťYŤ9W©ĎM»đc“NU ąX¤ŞGŃËł¬CNIč»áčÄëŔ‰Ł6™q¬›­Đďrpôbóă¬}NaľZ™á9s‰ z9ďCQEP'eµĄRsŇ$UTDTpÎůŢ5LĉPEIN|»đĚ„’ Š˛éËF*ÇLłĚF"NâîÚ†Š‚˘ÉUaT–P„!©"C‰YĆ»ůű[RT¤ş¨a—PŐP˘ŻN]Óť5&ĄÍf«$ŤB5*Ç&śÖcT(« µJ˘U*’ëżźUčqŞRĽ–˝7.ŽŽ±[Ěʨ͡6•ÓRÉĘŻż9q¬Ňúž{ťÚ–IuF7¨Őa˘]YČń¦*¬b5e˘¨yo;…™äYŘĆ×Ćh#ŻLnőŠV5Rt¦9pőřĄçŰ—Y"Z6÷BŤf¨áĎŃçqŞfĆ:ĚĺE¨"’¨ŠMvăÖtŞX˘!*¨ł†iĆ" ¤* Š.ňžy1"k7F^në®W\ÉÄ\űs¸Ç\ö¸µWqF¤!$¨H Ş¬¤•HÉĚĎLî„lŞmQ$ar«UHŽń¦¶šo{©ÖE\i®[v‚ÓXĎlłÍ1fBĚ\‘»’uyGk–­é R*ŮÉŁ+:(ë×ÍßW{ä×{—V×,˝KL(ÂU •T©©dŤBĽńß2çŻÓ®˘ť5÷ÎôŘ)1Z9ë 0Ł«jĄŐ‘d弸LUquĺŃ­çDÖM)Ó[Óż-uZĆéh âšâÎ<şV{=­Z1cD!źŃçĽÂŇ’(¨"’¨ŠH}n‹Ö'H„Ş""ŞË—O;%UQ‘AU‘VM±'nxŘkDčŚŔŽwĚĚĺk9čÍçş,Š"Љ ¨‡)QUP”ŐMyĎ7ż.›Ö,µ$•(«Q¨ĄŐU$:Ę˝u†tôBë$ŞFˇµFWŹĽĚĘ’5.ˇ‰%zsmęYhr˘¤=yjŢőhë ÷ł©Ń¨’5 °•F¬ŞĄL+$j©jşóĎ{±Ň¬j—VQr–7W §&‘b)ŕćs‘gdµĆę1ϰµb|šęrŽÝ<Äľ×ĹŃżNyBC,Eľ}¦ú č樢«ÍßÎçPć”QITE$DU%AÓ§ťk´-ÔILrG(†j „Š! +yĆeT—Lmş‹t ĽjĎ ë-ë‘$(’籞}xÚçÜ5n]«Ď=c•Ľłš™ "ŞÉT–Xt“ˇAćŐąÍGUĺÓ0ĚŐS ę4PĘąŃUKťK´nűoŹYŐęF-Ş0ĆŹ-óśň‹*ÂZĘ­Dа•B‹RFś«ß\÷łQľś{6Ą4ÔHŠJÂU •Z©…j…Ęvßîşr¶Â˛C %*ć5•<÷nWHĆMrĚĺ6€uuŢa\Şf¤˘#¦řukD+$znÝŞ¨¨9ň‡ ¤*’ «)˘"ł©Ŕ;ÜŃy”ôtňěôÜ6ßH”çľ Ĺ9DHPTH^}ňĚsťL˘/D])Ö) śŃIË='7ŃçíwˇÎ­BEHcˇ\máĚ©ˇ-gŁ@“PĺÍΨ5aAĘËQ%ZIZ…)uU[ĆĺÝWo^תáNťžč|ęú·§!sĺĎ|ć*‘„jVˇEkTĄTÔI.ˇVŻN~Ťkžş6Žł4¤)+PÄja*…Ę­TµEŰŠľ«vÔJąFĄ’†˘JS/+‹ž§!ä ę$ŢaW2iΔ 7‘Z)(©‰-â^ő7TQ ďż.›ôöŰĎ|ĚNQITQ%QaägµĹÍéb4e٦ř6wßVđLĹI ŁMó†xç·<Ěôç˛zĂ:•Ňł’ŞB*Ťá$¨ ¦mbŻAŤîÄ%TUŤIĘÖĘ’ٱl˘R¤ńĺËËÓ§{ŮŐÚ•j©dŐVUŃ$Ś.t·L7[Ć3›˘¤×n›ëSŁMd®uľmkžń% Ě’© J¤˝:ré:0´ĺlćuĂ9E™čéÓżź˝ŰF›4Kš™R•¨’5 °•D‘¨m’W}ĽÝÝ6ć›Ô4Äş˛Ś+Yćťybsbe„¸ôäČÓ2*BP—N}™Ó T’KT•EŮĆ›b*Š!(µôůś­S5RTq‡hbˇ*©$šâŻK*ë·źUŘ«"’(łsMó&*’ ¨JŁ3ÖkĚzCë©×<»yĚŐŚ”Yť,uÖ¸g·69çLÎ7¦ťcM4TTEU!Ç·& j‰7R©<%<Ň(öâµŮms©fF—(Ô(K¬VlŚ0¬Ťtą­°ŁR°Ś&eޤVEXMôĺÖtŞjÖeÔ5ĚŘÇMetߣĎŢésşéťáĽBĺT«”RV˘HÔF˘V˘H\ŞŐN±/ŞçŇvŞV*ŐŚ'^|ć™b„ŁrĂjŐ™5eW|ú.řőś ±#¤…°Öřői)jŠ"‰*Љ*«)žI5'*/:‚ŞJ‚©(‹X޶4×mqíĄBYy%”b©" ©!§=®„]ď—YłÍéófĂ™š*„’é˦¤%…IDqĄŁÎs;ą‡[óŢ%9в/Cšl)|T<ĘHąŃŰ\ş^Žł«¤¨’©ĄQ Ćtë.MBÔ¬6© JÔŞEťĺ¬jU…wÓŹiąŇJ„5¬«Ó··ZíĎĄŢąoŠ0°ÂU+¬%PąE%a*‰#VU×?KľŻ,MuĆ+š¦d…Ěj%j*ŽyÖbM0•EŰŹfšąôŽ7iž6ňŹmiםŐ_9čâ€L%E@”•E%%QqëçRŚśąNq\UIPR$Q•¬GNü:]ôXbę’ Š"’ ŠIĘ˝(jíÇkľńťđ#9Ş é[Č"BRH P…ABtÎ`˘) ’*<˘8°’#ۇF»®Š1T1»M8šÄXš…TI!Ed©ITU„śŞ˘dŢaŞĄRâ^÷=ÎŞJ”6[7e^žŽ>ťovyµ¬‹F˘5 T¬#Ä­C<ů'˛ĺѦ˘¨b5eVŞ’•¨Ş*† çד4L±•ŮÇ´1Ş×Bm‰^ěެ͹hb*‹:ÂqŞń˘’¨ „¤Ş*Ł<:đ•*K:Ęs©Š"ˇ`ˇ¨ŢůmżG=rÖj™¨J‚)*‚)$Ž”5 wuçÇÓĘNdç'eŐäkHTYB©’‚),ˇ ˇj(¨’óBăNšĂ×g=lş5 ŁjĚ®±.řkŚ›łLíçKÓ\ĺësmégR°« ¬# Ł *ÂbÖYj©%WmsÖ٬ęĘěČk]:NžgŻ=gÓ×;×CRµ©qŽă€Öµ˝ňčÓ“’A9ÔI%U‘D:Ä»†Ú˘ĘE¬†łIy}<&qFsgRgQUI–°¨"U’ˇ‹Ó;bî© ŤëťI#I+¬Íb‡6ŞR­a:hgJĄçËŇIĺÖ±9´ ş›Í˝/=čY!IT…+T…%j$—PŚ2ë×äď˝ú9ĽÚ’¸RV†$­ÔhµµÓ™¬"2sĎ|˛tĘÓ ±+Ăщx±#˧4!c[çÚčŠiDm·\úb;ç,鬹5ťe ÉŃ^ąu49DâÄ%˘¸b’¨Ş* ‡~U•¬íuu1UQTQ%,Ő1TQmM4Ü2†&†hĘlôso†=o>®u©t6Ö ‡<ö&xťyÜ…3T‘DUTQtĺŁd5T…Q†6sYĆ*¬ DB)(iˑγ$UĹ» śóqÖäIŢâŻ}euaF.KÖ7ik$¤)[ÚŐŞ(hçŇgťÚšâőĄΰE窆Ed©IT…%F'*ę#·LkZŐ–”…%aVH×~{ť®łŤa–¤a•¨’ŤUç¸ăĎŐçNuNoN]ZŢn÷¦;gNŚMT'=9™lBĺ6ëV»Ĺ].j6&†#éĘ剔˘¨Ş*‹Ź\KÎ,˦6ŐZ›Í¶ŢwA1BQ$8LÔçDU1­Ó˘¦i!lɠɬÜúŻ?Lö¸ôµÍŰ­H©ŞŤe•Ľ^Q QUE$RmĆÚŠ–ˇ"Ł<}““ 9Z*)ʸؙ43‘LĂ';yLŽYök+Đk1ŞĆpŬ.}Ţ{˝:8Űy7Q$MtăŇôÓ–Y)M«jÝ Aş<Ůď9pzfLĚPĘÂIR’®Qr« k;şď­»ty‡W’tyivĺ^úË;0®yőäĘ•Ś$ÜůËŰ<“¦BKžů3«5Îúręß^ś÷{ą9fnĂśőxőÖśěşĺęózŁ^~ĽZÎąiËw:]ă±Yß^mYŢ*b“ťÓ ‘";^wUxÝr`FxçŻ(×S¬ëU:Q EŤLńşsĽÎzĂťB%EQo=˘j*!ÍUBY”&3ŰźkugUDµa4R6AĺŇąă$ćUQD"E%Q9#¬MEUQHc śNą™ĺh@Ôk…Ó›5ÓĚŢDd¶ 4'}ev«#ČBbI5×”×~ś·zíË4®®˛¬ÖĄgTHޱĄŐť+TÓą’gP•Jg¤r;QĆěťć …^Ü;jď9¬aEʬ%PÄ®ł/«~^ÎÝłO.śŃĺ…nFd’É…uťeXlÎą°¦÷•Ó}xk[ÖssjÁ'GŽ«ÓžOMÝ9YťůóÚôł¦’ĄłĄ8]9ŢuH÷óµčŠĆ!„5ÓMň:‹ÎÖY jN8í¶qoďE"QT•Ď|ŮŕUáUux˛ő±¦¤ (ĹζćhÖ4Źn]5DĂ="VČŚŐ1ÓpVQ$QT‘PP;ć›*ęŞ,ŇAÉ5‚Î';\[ › -gx×gI éŚô*f笠%ÄRE'˘gŽů%YsRFr›íçízu٧u)¦ˇ…cY7ۇvó˧;ťLă˛Ë $jIZ©r«AE†qŇN}‰5 U,”)VˇZ˘I^Ľv×^ś—^Řeć‹6^1SÂhr¨óL¤ćë-ŘMęĹe˨Î\ŮËł¶ş#—A)9Nşç5Ţă¶÷Ż.g^lGNŢ^ő¸ŞëË»LM°†L$ĺµ}fĽ×nYiО– Žc—$‹Š„J* ë”˝NaĽ’]ąöšÎad¶ËZ±ĽłŽś«Ž·6k®% ĆŢ)ŞŠH©*Ş"* µfmËŤÔ¶P±ľžqEľ{jˇjÔA[™ĹƵ†W4¬$#8ŠâˇšŃgNÜđáÎ)Ť9UHjś¶ľžśtôv±·I! Ńť4&Ťkžćš­a9ÚË 5%„’VŞ\Şg¦S)#PĂTąF˘IXEĘ­EQ˝ńÓ}şqÓ˘o™žIĹjTBĺ¬1¨ŐŽĚµ¬ ’&¬ÖęĚť:ňÜęăY*˘Ë–tňęU+ľrö9i¬ŮśőgE¬Ç˘5×—WJĄŞ*Š!Bˇ(ĺŹ@yîśň(‘*Ľůé8r·›¤˘’Ş*PÓM.55R'yÎőYÁNB%®zW—3‘ITDEPiVˇj„ŞLqŢ&bł«-ăMMM8ŞśˇĎycQä·ËUcŃ…óŰËŽfL›Őj‰×‰‚”š®ěéd‡x轵Ť^Îł.Ü-h7 ę4¤äé ÚĚj«lo›-HÂI„’VˇŠÓ=9˛ÂŚ+%\Öę¨bŤYU¨şsšôňçgd0Ä5iaäV[ÍÖUIĘŞĂGMóŰŁgwAR\÷É•ĚÇ]pšďpŽÇ(ŘtI&٧_7m^˝|ýîŘšbŠ˘©*Š!J*#<űGź®yîrC:“ť±1jLڤ˩j–‚3ľząŐvłŇşŽulë“%NqU%†ę3ž<î…·G7`TµU T‘dĺšĎ8¤¨-b^…MQVł×ŤYs0¸“y3["5ľ;·ECxôcń0ĂcD«”Ô*őĺŮ­¦o^—"Nďť_GO7v÷mF±¬ß&ζ®–*Ţr ™ťT¬5%„ŞV†1S,#µ 1%K”ÔJ´Ĺ¬ŮŚZÎgG”ßWiˇ] ăy¨ŽhaKĄ›Hˇ(Ş5×”×F&ú`µ3’b†ŞŞŠ·JSLJÄ’nŢ˝|Ý5}şQ BQU”T Ä\u‹Îˇ›:Śg¨q;‘Äď”ĺt#ťĽŔ"&"cŁĎso^=ő­:±UET'D¦âŠ„Ş*(ŠŞ¨J¤Š}8H9ÔDYMkť]:rîčđëç ‹…1-˘uµ—LŃdÁĺrĽýsťÍf¤ĐŠŮŃk*ôŢ2ßB’¨\Şôç©®˝|믦çŇîĂ›•$jUĘ) E¬ËŞ–J”ŁVQ¨kmrϧ™ÎÖX“VŽ©sk)%MPĹZ„’]Y•”! ueó˝9Ë­sٶr)2EUJ]-ZrÖR†(Ťh…ďČëÉłŻ>Ĺq:c"˘¨z ŐRÖ÷\új©+j“}|ý&úDŰTQ H„1U@Ä9yIšŻ*!)(„(Ş* Î‰9.0n‡Ż=·r†*,J"’*N·PU%EUTA%RDsŇ“‘ÖO9čĘqĎ\łÍëĄĺ˝Ę^nüşcIrëĘ®a xŇú vÁÓ›>TžwYZĐŇÂSLZ&­ăb’µ ˘mƧFÄu×ôŐv¤5+ąF˘Iu ÉST.t˝tJ1ťŚç¦cU-ťG:Ú©R…ËL$’éĆš´CYS 3›Q—¦¦¸˝Zĺ´łVCžk1bDĄBŽúĺÓU*Ă)x˝zGv›ç¶©Ş*ŠŁ¦řmľ‘4”Q PÄUI@Şó˘e˘Š˘Ş(¤¨Žf˛Ĺ–łEAQe@”•&Ş›ŞH‚¨ŠŞŠJ¤* ˘)"’˘1ĽĄQ€…Ë®ᬎzĚ#QD]9ökĄ±IXcÍUóÉĄŇ3tIŞZÍišl¦˘‰#Q+¬ökHş0’V®Q©XEĘ5K¨J«]aŽĐş°Áť‰‘®dq.Ľ”•Ş$†H\¶°šrµbbF˘ëËKĐ©˛Ńať‡ s*!(D‰#}yu¶ŞŞŤtĘŰÄ1 CÄ1 GMđÓ}ašŞ(†!(˘..(J*Ф˘Z˘ŠJ(ŞJ ąôĂ%”Q%U›–ˇPŠ*Ş")*’ ¨*„J*$©3!PP"Rçß ó‚˛š‰5éĆݬŁQaó1x:ĆŐΰ0ŢnůôťĚÚ’0ŞĺU!¨“Kľ‚čĂtĂ %U«”jVrŚ$’ęĘ5.÷Ç«jM)ĽˇS65Í$®UR]YasZşš\DĂQTZĘu‰Ňh8ŃŚµI$­Ä1:ňétÁZŢv¬JÄ1 CÄ1 BQT=9 z.]&Ř„‹‹5WE”TH”T EU”EĐDśíóbˇš˘¨¨Š6(4”TUTP"QP‰ATD%RTEA!Z͉7aČ%¬č„=äóy9ç§>éÔČí ©š˙Ú˙ĘţLźţCU˙6/üää‹˙6.?ÍKŹójU˙/üÜ˙śř.?äP˙ťc˙?×ţŻů #ţl˙Äaţp?äő˙›źţ üŕÇ[˙ʵţb`?ţŹüŤćÇ˙á˙ŕ˙˙ÚĆPţqcÇ8éW<ˇÇYGđo˙cd0<`xŕËaĚŞËöA­_(Lć<’Pë„e\1‹nśüČ3ëőycßäDmV>¦XsÖ—Ąč+ ҵfĆéŹđ˝"IaÖÄFOĚ Ţ ŕr~0ĹJ–Ż·*ŕE·ĹlkV­[ʰü«ăz^ŚuëÄzaóőîç CŻ+ĘyU+€*գ̵eZŘ8—ë9ážUçľ)85Ä2€=p¸íŮG(vX@†¶"­\/ŽB"G¸”Ŕ Gň©RĄSňW’Ö­ľŞzGçś#ĽµŔ zŕÜ6ěćvXDŚĎrB"E»"§JźPä` ¶˛¬ŻEz+Ń^—¤™Ć:Â!L`0űqm»ŰîP#ä!!Óâ(ŹŞĐ#Č=ĚŞĎjŐÄtq…·lD@Äă׉ —ë ĆŘäţ±čHuü=™™Ňą´ŰJ•*@đ-}/±Ĺ¶0mÎM{Ä K`Ć]ˇÉ8ij$C¨řá̇4Ś&Cę W!ĹŘ*z( ţŠôX5ĚćŰ ď*, .ă_ {` x6­[ž°ŇňÁKlšą7!Î#Ě\ U_Á9™ÍQ©™‚ŰdTh*ť5Ş`óÚĽňގP^Bň¨D±aÚ"ŐC¨–'řB}‘rGڶWĄ­–<­»Čɬ@ĂP/úÂ:ŐLŐçĽU„ĆĐGę#m}+ĘňĽŞqĚ"&*ţ)@ÍŰŚ›e l‚FŐ5*†ëv©©RňĽŻ+ʬwŔеń©ĆĄy-kUR¤E!ü"&+ä#!Ţ〴;_UKʦ˙\mńTiVyeRň¨* š–şZ˘`ÚŠ*ą˘D"`ëĺťp Ć "X„Zńţa 5«qÜ~˘‡Ä-¶Ů©_<GëčÇUţÁMů0çzÉD5 1W•B•aĄĺyU'jăn 0ZµjŐ­¸`CŕWŔúý8 Ť+_U8Ů{¨ę…Ňů Ä_;ń]/Nu@VZU–‚¬Db¸ ĚDJw–—Ŕ­Zµí{^¦0L•áÚ•«ţĂK¦ĄL|T©}a9ż‡â¸ZĽőd3;DY¶˛ö®W;@ c¬.cÔ©}¶«?×řľ*T«„>–1¦%«ňꦬ˙w+ţQ,Qp9‡ŐSSŘÄd d ö`âÚ¶¨ŰęjT©T ž­bi|ň¶ţČPb`XpĆ#‚—”FžÖ»«Vˇł°ýÓđĘ—ŘlG,ŔŐí©R4cÔoMńz ˙‚JíµĺZµjŘ!™ píZ˛ć×ŘmŰüs}pÚ쬄1Đ㸓„ô«ř„Ň&áßŐň ýbçš`!jäb`;ŕ= k ŻKÓžx?l=„LRĄJ¸ *T×€M"n ×óŚ].ÖÝŕ&°KĘĄKĘŞp"2‚Áśl­Zµj˙€d>«`ß*UߏľW”Ec%ŚÂ$KRĄXF}ʱ“€üĂR«DTĆ`JÜËnżoQ¨VÖ®'ĽăĽć\Ěŕ@ŕĽgşµAR#‰Y„jpÇîj€É· ¸ő*T«¦­Ź\ť°5j‘j‰Ŕ%x =«¸Ú°®{KńËzŐ§Hj¶ďř˘#Ôč#ŞŁ€«V¬«aßí#\"[QÉ0¬"GëŢ {ăö%ČÄ8Ҳ_Đ^•ÚGhĆ!P•7•K¬C®IÔá!T)¶1%R§¦8î]*Ĺű„ˇ={ăk#0‰Ô-ZµkŮ^×µg /´u(÷Źďî°% Jň©ö8µé«ŽJ*ŢĐ*đ cŻáT© …‡Ě•ű„˝Ç_äW”5 Č^BňĽ…AlZŐÄ‹pr‚ŨŻ%QC±łvÁ?ýµéľˇ¨Řă×M r!©{ŔCRĄrSţH"ĺ€ţ(a=† }z≄a´@q3ŮÁ°pręW•UĽ…ô=˘Ç°€j¨ťą­Zô˝+‘[Ň!ĂŚ4©lhJđŽ”˙bU˝`8ţ §aÜĚ §ÓŚ`ZŞ@­„J•8ë ţ«>i˝/KŇôżě+Ů^•äÔŕ(śr‰ÁJů^U/ŠâE˘€˛Ŕ6â‰VU…a¨˘L"ŠřV®ňŰRňĽ—Ç`‡=0&z8ŹrµjŐ«VŔSö—ĺ*ĐVˇkŞ˙gVÔW•ĺy^’ÖŻ™9mŠŘă ‚ …+DżÇú¬˘ŹŐ¦ż| ˙±ţ* šŐĚ7žŕҨ€ĽÚú¨ŞŤä/+ĘďOőS~ Đ_&z8¶€ĂŻÄ ¸EŤŞ5KĘň©R×č‘ŮmÓüTŞUô qjbs¶9n—°˝J×Őő}phĂý¦Ë|Tľ ň©SRĄĺy_‘–—•ĺx^x´€µńŹŘý…*C›¬Ę uG ®—Ąé 0/P=G§·5ZüoÇ(Żőź+Ő®–űzB"-†Ř»9‰¬Ä¸Ůz^‚°˝/KŇú€EőŢ—hŁĽţ fL« ĄSĄXmZúÚ÷"9˘¶Ű®—n@¶Ý(ôŔ˝/ĎĚ>PŰ`ix5.sY‰€…//Ň«DĚ}nšš×¤6V­[‰ŇĄJ•*C\&źČ‚İÄG4žĎD­‹M¨Â ­‘ĆF˝G¤%OH ?kčWxH˘ŢŠő=Km”śÄÄ5/1év©żżk¦é~ŕÄqĘ F3ÎG«ů?Bí‡MÜ®—hńm®ý™*©żU|¤/ŠÚČ™+ań€Ľ#ę=ă'12 ­u×Hý]D/ĎŐŇ1§ ŕţŔü7š—×'ŤJ•=/*©ŐkńČ·úfJÔŁ‹ÇhÚĄŞ mę—«@S€ kđˇ _eř€Ĺ©¤q®óÔÉ´7kđ/Ĺűł‰áĆAÁŰ˙°ű ŁPýq Uʆ—PŘüpöŞd°_™UŠnV»a‚ô¬¶ˇĎC¦ đ3şWmŞ:äĽ'n@Kb€b‚+d0Ă8ŕź«SPۨZR¤ BëkµjŐĺص0V¬”LíÖZDdÖc¤zŽÝędL5î…XĘäJľž˘DˇĎÝ»`dX!”p6/©sÓZ»`áŞŕľČRĄö[ 6Ú\*ĄqŐmž—•J•*T©SëÚ UGnĐÚĆéöMäęâ;p¶ž˘]ȶČtÄ.Ś kÍ?p6Ý@@NŐ« azâ U«^—˘˝č«+뀨oŰý_Wܣĵkë|ZąŞĎtÖű˝˝ŻV¬+ ҲPB¦;q6‘–ˇmŇ(1]˘ g®q›crlb "x·ŔJ—KŇąÚ'ŕ†ý·Őő}oŠ‚óÇj•*o6ĽĆ—´í~Ňúľ*T·ÂńöÉŞ+f!5Í'«H8B'‡pµj­S¶¤[MśšjjŔupÇ/%y0í ÂCUoŃVĽŞm»• %®BŇô˝/KÖ}˘2†˙ghw0žĐë0DZÂZÜ "x7†Đ7\`. ŢÎ.5"9ŐTvŔH#ďKń˘­¨=ŇŃč꼣ŞňĽŻ!V“ll»b3ŹĹ¶#NXuČŘÖĆ` Pţ.L• qěs-D‰¦© ţCđ­M„`wŕ —˘¬«*Ęô®$Ű€›Lu„%‹ ®0ÂfNŕ ç‚r‚®"V©ş@"©R ĄJëíČ€™7 ě˙źÄ îf±’­k1łě`Fqěŕ@u€ŘľÁî;0Oi“‡RÄđŽbP0%] ˛\·ęéľ„0Ö e±›[9_–­k˝/H[m®Ś—¤OČ‘ÂŮŞ:ŕŽŃ!Á‘ékqÚµjĐ2ÚDçŐ_ đ-Z+ Ňô­µęýE!Xkä ë#ŰŇ©]¶ý«[K˝ÜvC €ŕ1‹fÖT¨é]ČŇ1ÂĘâbNpĂ-« ÄS."?‚U=eL; ¦~˘)]>«iZ&Ü(aÚ‚DµĹ˛Zż ­}ĆE˘ö˝+Ú'‚ ŕ†­zW++Ňô˝az ҲfqČ0ɪ۸âŞU­źU´ŻämKń ˇ®#Ü(Ş*ĽŻýŠňĽŞĘQ˛¬ŻM˛×Ľ5ó(1{ᄝ«ŕk= "#űŹ`®ń޶ę%µ/HŹ™7í‚Ű [6˛,y8ÇĺyŠ^UNěk)ŽMKN[ŔY_$ŔGXţČöÄЉ}6ÝcŘŁŇÔ1ČmdXöĂŚC~`Ż€W6‚ňĽÇX¨¶¶(ČpuŤđikŢ!-b&{q´ík°^—˘˝\©Sm·Ykčc”"„CíÜ­Zµ|,Ö?†uę[XGs!8ါ %¬GY,ŻKŇô¬¶ąuŮmÖ-‹‘P9JÖ?Ť°`Ňą‚€µĺPz Ę"Ą« ?ŚuCá‘ĆĚĺž éR©ă9ŽŘ¶,śŕ©kÔ *‘8jĐŔĚ넇řÔW•ä* ʢÇ5«aŚŹ1âҨyDZĘ:Ë·`ŇćM.Đ×HpŞv‹t¶ú« €3Ř>˘D*ţ0ű2ČôÖ˝+ŤŻP"G¬bŹ2• ÄL'ćK¤8W’‚ňĽ•äŻ%yDZ¨‘0Ú¦Ô}ßĹJ—‚W¶Ő©yë Dş@ܶ‡Ţ1CŹ®)®\±8í[€G‚ 2‘ kŇ&ń’Á˛¨]!łěpj°öµ$5UP"VŕµpŘ 8·H›Zóʉ_JĄYF"eT<Q®bGS"r[× #·Ě'Z‰×KŇôÚë"-j+Z§ř¤ňÇXOĆ&‘$ČŚ`˘ĺŽ1 MŻp'Ă_ŕkŞÜX©yTCSę>­Ś?×ÜČ´Ee_Ž83éÉGlĘ\Č"ĺ }b«U\GUMŻhšWx®AÇ3]\ŠTŞT đUŇ@PŞ‘DV0"qŢ…éz^†dWţ×KmpT cĄE?~ž€jáůUHüĆL„G$ CP!°·ĄKĘňĽŞT¨/4µířľ/‹âřľ/ŚAÂu zŕí€`%zź¬>•…jŰDu¸Zµr'="•8AúĚ#¨r8‡ęň«ž±Ôň´Ka ^•Ä«`úv•L낡¨}ş•µ…éYVWĄbą‰“ŠĐ3ň¨9@Ńôä!Ş$đ©RĄXĂÁ#ŤJ—•NN!ǰŠđUŔ꼕¦ą´EDpÜĚŠ3Î"rq¨vĹ‚:µČž VWŐe]Ŕ?ä@WD}/ ţµĺR ĽŞa1ĆÔ}{[w:W-UĂĽE\k ¸íܶÂ’ĽŻ+ÉUbN``0ţ­…7JŐ«ţfż`{ä QzTĽŻ(ę€ĎäŻ%y1Ň&w.°‚°řµć˘@ő3:µĺ_ŻKËlx‡s+đö¶8ţ*T©TŚµĺ€€s…ŻJăjŐËPÇLaׂĽ/"4ŽŹ§X6î=a S†•*T©R¦"ŃŐŔ¨ěpŰ–"ŐDđhw?ŐřŰ9­Zµne¬˝++Ň€üs µĺPT¨/!yTpZ¸q1¶Ń~—=ä(vŠć1ťP8Ś~ßň -©­Šľč+Ąq(w)ł|‰"!Ô¸Ü>D¨pŕ ¨"d ŃĹ·Mĺy ‚ňĽâĐâŘ-%ú‰ˇŚ!Ůí˙®FÇq1`ű5!J‚ ¨/+Î-PéíZ;+B{ ĎKČU Lmö˝*^U*mgúĺ€Čpµc "UhëXĂ‹­żXŻŔÄŰQ^ ňĽś~˘jf3“Ymd1!S"0jľaXV˝+€Ů\vč‰Úµkę§Ąđ==*=ŕ¶ř¬=«^•«Ăúĺ”÷ýeŹvű ýĄt»bá·h”4THj_-®Ó¶7”‹UB4‰Ąl Ł hÝ+‰ő¦1‡ąR¦Ľű+ĂjáĺyT©SZ×g´‘ŕč‚8Dő‰= Ąvöż?Jí N°Őţ6»S_×v5Ŕ ĽŞTű>¨˘WĄjŐŻKo±«U"&zĂjĐ3(…J•!­Ż*‘ ‰n˛[ďÔuĄJ°Ré +ő¶_®¤fzĂŻa?’Ű7€‹WŹŇ1‘kÉ ‘pill ©X.2yí•‘oh˝ŕđ‘#’ĐŮśŕ%‡ńŠ1Ů$úV¶ nż HĎlB"FBG©HŔihh€ş_żă&—ŇÇÝ ›Ń^–§Ç92ř±¬˝âŰ̉€E~#ÔKR ¨9pA®7•­KĽ5/ÜC¬`Hő„lľ·Ĺm řŰŻŃ âM!őÎ-mJíµ^Š+žĆ†;¤ ±,:j…Ň&F@d<0ćAd0~7XéSJăl#Ň  #jęڨjĆf@Ocó•{/ý—ŐE´?rżh/+Ęň ‹ł‡nÜl‡N6‰DÜ}í{^×µéz,:qŇę&}ŞT©yU”óDĚ@á%Ä®A©éľ JµńÂZđ¤Ő•P0&˛ŽŰň@5ŻKҵjÖŰ+W„j¨Câí}±ö"ŔŻOŮm@Ŕl`vDâŮő–Ĺ˙xÇľ!ťŕ/ÔL ^zp(j[aaľ7Ů“ścíJąQ@TmĹöę•/ý‚ ‹ŇĄ×n¦6@¸6ŰrQ76Î>Hözţ1ÎÄ-ś±`ß‘CŽŘ7îB'®.•ϤMČj#ŰôÁ©꬯KĐ^—ىíł‰ ĹŚv¶€@-ą¨~ž1ŕ…ł[ ř„F` ¶ŃAéRú­[žř„ş{o“&đ]0^׫^—Ąéz^–ĄµŽĂ9=ŔJé —«söú›l#>Ó8Ž2ׄËV2?éBă…ě!¸›ťćŔÔđ.•Ţ ż×Ň;+]Ëd(±"ł‘»ČcĆ­›l#1cĹ/qum‡6µS*ŃJłKҲ¬ˇ´íZµéö/KŇô­^ Mw‡˛Ĺ †ÜަÚ÷€1—SýíPTAyZ€űrI–®U|ŞŔ_óň&ĺ B"v­ZµjؤSŠH…e+SelNfÄ6žĹÜ PĐ©Z¸Ś’ F€Ŕý}żXK^SW ¶Ü«Vľ/‹ć@­€łaXV ˝íz1ÔÔCWR2.?x`ľÂD!ś@Ęצ¤aĺ| Ä ž˛Z´0™‡"a µ5¶MŽ+•0.O}É©[ž1·m·Á€ z—:Ë÷8IÎ&ĆV®@=«WX-DbSc+lwĆř eGU±űĆ(÷ĂUŇ"ÄŔČ B¬¤Ň&ů#Ôa·xŔákcüZ8Im¸„ń‡n†ÁµâÚôĄkâ"F‰CD\ʰ¤mL)qť˛ŽÜJ•*ú¶žĐŰ=eĺSŚeôÚÄÉsÔď!‡MYŔá‚BÔŢĽU«•«Táư-·Đţx Ć‘ŐT‰Dâ0Ö©|_*ŘL6ĐŰ©Ňň«ŁKʧ¤ňW•ä*łŇë‚iÖJăkÁ;dúöZ»‰ÖŹĹaz Ř_ö/kŇô݇Ay^QžŻKâGň"Ő3ÓŇňĽČpBVŔDń‚ÔŞt«=ŕ×€O˛ăµú­mô10´6`q„”KPT•ĺy^J˘©R¤c¨^^‚ĄpĽDĵZˇgĄ¨Ć1Ňô ˝éz^•…¶c¶Ŕ!J•p-\ϱÁEy*ŚĆ"ŚÁ`qędJ'JÔb¸ö®Ën†ąp‡žp–Ř©śš€­—Ľ…B?Őé€úÁ|T©o„Á·´vÎLÜEU T "Ší‰^•˙Q—YŢCÄýë9­zV­ÇąÉ¸‡›D U­{^UĺŹOkr ¬  Ö˝+*Ęô®Ň´vŕňT©R¦Ó¶ß¦^QÂ0íízĚzŕ„b>˘()Ş^U*TŞT©őéË~Ŕ–˘Ď¬ÄX †•ĺjĽŻ+ĘĄkbĺ[ÚýµŰjGć*WHţ6°0= ycűZÄü{nŐm¤F1‚Jň¨=ĺkŤŻKŇěĄîץč+ b˝.ء©ŮÖýhżŐ«ťVÂd7•ä*G±[÷Żo®˛Ű®˝ä<".TéR(č‡$0 ‚ Şđ-[ęZŐÄl¶ŕÚĚ XGiŰÚ˛­ZŰgŘŔץőy@FÖŰ.Ö˝®Ö˘‘ţ.ÇuUŹÇ. ;#„LÄÂĺyÇĄŇtĘa´5€Ąń|ŔvâGľ§!űŔ;/JË W˛ő Ň%zäTG|AŢCńĽW‹Syb#!0?`>?Ô Ř^—ý…öŻaz Đ^•Üuý‰ď„6űŕlpíÓk2­|Q-XđĆ]óś ň*Ő 2›•/# 84ÂzâJďϱ¨ž7Č—»T©RĄJ•pŞřĆMą‘©U‹™GÇaZ°­ĆŇŘđ؉Rˇ„¶˝ŕ#=ç1’ŠNxŁ-/%y¬V­7ÇĄOJźQM°AkÔľúŰv'čŻY-˘aŻu1đâ=ăµézVľŃ?ÄO—JKČT#R¸wÄé~j‡S"óç´P8NÓ/HwS„šm•ĆŐŻHä«Č8"C‘qô6Ă©ZµjăX8a(^ŐÚ xČLÁ ÉĂŰŚClł%Á2ARéQ^U#ŇácŚKXÄ‹ÓŇňâŽĹézV­­ZµnÎÔ˝emőĆ´ľ-żő7 ěŢ—®!`€ŔFAŔmÎa“ĘŁŚát‰¸*ÇX)RĄ\ajájŐ«W#€ěŻ@” ±1í[naR+ť=/*‚ ¨/*†Ôb!Ź#ĐA~ôľµÄýĺÚ°­|_hµlJĽWH›2ĄJ•*zÂeJ•*U+W’Đ8ÉŹă-»{Zź¶ŽĚ6ĄîgX‚ąŐŻo6qí‡ć>ś¶«ó!äžźëĄNqX†J-qĽ”©RĄ\`®$ËńÉŔOŰVă»za2"2éTZF=±Ző‚×oúµ~Ś:•çą’Ż 1 ꩜DáŔĂ«›ęűĂĄKʦ+sjŚ`!hýkV¬ ˛­ÝHÄ‚•*`Äa'5«kVú„[őjűwt®wÇ'RĽŰcŐ Z–Řʸ­_â0nB˘¨ —ëY Đ0ÚC†B©[žF#¦ŮíZ"Q<Ŕqtĺ‡lz UâűÇ®@, Ř⿎ŐĚLˇ ^őKŽř$N‘3Ó5aۉj­V#Ś8<#śň`[ĄŢ"á]+ìĘv­XV ^#Ş©Ň®/ă%cŰĽ…Źl^év^U*TU*sŹXZµjŕqĎ#Ąh-Ď$Lµ«…«µCRĂŤĺyTŚ«DÄ/Ć8ęu”Ěn{oÇ É®/ßčzĄw€5ç0o•°^UN•*U€@/Ć<ăÖ ‡çëZµjŐ¸3¶8ÂJg€yÓÚ&°“|¤ ˇĚĄĺyUÁ ńĎŰ ő‚ŘNŐŁ–ץjŐˇ˛H˝«V­_ňiy+ëŢ`‰źŕTŹÜC’Ľˇa_ś_*T©R¬#ŻÂ€p[†=[V«ű+ ů§•AU= Xś#ńl "ŐLJ•Ĺ<:D*T©R¦'řĘňĽŞ0¶ĄHá8ż#u„8Ű—LU=*T«5Č…Oxcń[‡!TD)Vx„ňB&żŤAW•ĺTŠx˙!ÖoD/KĐĺ(ś÷"'J•9Ě!J5/*±Â'–™pŮ­\Ç bĐĆŔ& B_™µŽ0śZÄČq{CŽ2žř&`Čç s“Ç9ÇńČŔ>ćµp¬Ŕ\ĚH˝ä0r“ţĆDő{zâĘĎ(=«cźX×Đ8‰˙µyDSŐ[ZĽC0ţ#ń¬ÚÂąl˙Őµá:¸Ă˙Ú?š˙Ú?6<}˙Ú?ţcđś~28ŕŰŐáKüßÎĚŢĂŞđ™mpˇŰe1Př•đw¨Zˇ[‹hďWŻÉ×ćëňôŐă°Ş‘TŠtSŕą ĺÍT\Lá[•¶®˘‡ŕźŻÎ·_śžŁđ%ygĘŰ ęŤ †}qĂśń ÁÍť8ŰŠ ŐhSŮűwŞÖż5Vb(z. NĹg˝ęކ?­}Çą8çV”óc\ëęyęŃ>G ńĘç#:ŚU˘k÷üj¶9ňŐđş¨ěˇŔ÷>SŁZ®ň‡Äáo@,`mů.;  %j•ž©Ľ˘zx10ź|Ő{Řč'Ô€Wţć ÜŚË͸rUÓ6ÝpśrőŔ(Âi÷Čä§™[#ȤgčŻ Ôp ›řĆ‚v*cá˝ý;â%ŞĽ¦rWt‹®Ĺśô4¤f˘zŽN--'Ş+6dÓ#ÄÓţĽ€5·ŢŇ\BPćĆ­âŐŚIGÝžaß' Í`&Yşďf3¨ Ä;Ľ8;301xW8Ż•&3»ýb©4î»vc…LźdĚf§>őŤ=Çľ#_Žň‡;{7«…c >¸ý˛C±™ÁŰógţęö)Ą aóiĽÇkýÚe"\ˬm Ńß7±XěÖFľĚ «Ó¸®«4ŞÓ› öŞvy.řUűv=ŇQiŢŐŁ˝N ăĺ@ćë¤tĆÜĚ_`őlCŘ4Äb~­aÔĆ6bĚ ApÓö`l4Psg ú!Cł8Ž(_p­ŕ]Ă'ž‚˛Y˘±i\ POjŮ÷Ü{ŹqîË*1ě÷Ó5ĂÜr$SÁC˝Ł\ě9ȵĆň>AAâ˘Iµfşß6»HäKĂ1qś­ůTäC®÷ ţ/zđ˙ÓEĚíxě Üţ—zˇ_ä@ýOÉ^ÇřĹyîł2ăp„ˇŇ.Ďe@ŞTNކ^ošiĐĎr—Ź.Ulż‡ń=_Ĺír˙Ú?˙‡MůžeJ•(ó?˙ĘůŁůă˙‹YzúÖ?śń¶KÁůnŤłQÖ~ y+ţĽ‹zËyÖ{ŹĽ?íĺ?ŕÖËe˛ŕĺtžkü Čeü”đźźR´ĽjŽŁţ´8©Y? ‰¬?áž5ăQůuçÄK‰ řOâĽkëQá6Ą~B\IP?ŕÝ”Ôi4VřJüŠ˙Śpd•˘ĺ¸żůÓţ>Ą`Đ˙ËWŤ‡ümË—¨đüÍäügńWQŠńüşč?˙đ_„?ĺÝCř®Â]ĽśĘÍ@˙…żĘ?ż uő˙ ~ ŕ?Ą~2´Sٍăó*TŻËüGI“ţ*Ą%uđŻă92`ü‡ńŢ48?%aă|×/Fđpřů ď@_äŢJĐk·Â3ź^‹—˙™?|÷š%C[ăqÖ{‡ą~ üÄż€H~ ę¸é?ŕOZk¨˝`đŰřďüIü×7ᬹ¦W欶/üK¬üÚҡ˘ýKđá'ćÜąs|™uźŚD×si]ŶVŐ/Y“ńŘb°~jx84Voń“Ŕgs”|5ů+A˙h%Ë—._ăT©Sm*ę ü“E~%Ë—á|µ¦Ąb˙5Ńx˘Q(˙‘ązG[â©XĽŢ«—řnŻŚ^/E˙ÍÝNXĹJ›zđWá>A ä_Ŕݱ~#𜺏íĺsóńMWˇÝđśxjTŰ"ńÝx«đß ˇĐĂź:ŕj]â˙ĺčżáĽ^IDŘđ׎ü/üč!‹óľĘx/I–}âĺâĄxďEë|_Â_ţ ř'ß0ę]O‘×Zg•çI§ŹÁq_śä•˙ZSYĺyńš.^‹eËśč<Ž+IˇüJ•*W†Ł ăĘů‹á4?€ÎÔ¬y\őŕ9ÂétšŔ5żđ?Ż;žĽ1Ôčď&SĚxi•*TŻřcđ 7/.\rxcâ9×_ň§Śü;—®ăľt8psńř É gäíât’čR^‹Őő9źőyřϬwâ8ńÔŻů§Z輺U—Ŕjç'Ç„óÖřĎ€—ă?ގÖřÍ ¨i4Áď,­oŤň_ąđ•¨ü'źljÍͦÓhV†0eVŔ2˙Ŕ ŔšČžC|Ę0eüŔţ`Çńź Ď…"i¨üK—–Ö§‘eţ–u˙)rŮlż~:”J‹XqÜY{F®}M˙ËřŮOPS_‚ľ7Äj\¸9žá‹UĘŐđJ™H¶ßá^«—-‡śĂătŢăďřź0‡3ŢľtŽ“ţ±´Ú_ă_Ët8ďyŽpeđžgđ.\ąr˙†\_9ärĆu’98_ř%Ë—.^—Xţ¬ĐÇÎs©ÔĺĂ“:†ţaśţâuşÍ |Ě9ň>' 0F:h9ü»ń„ę5§ńu†A”üwŤđž{•—ExR'ň:Âh©RĄ2ĄJ•+đÄ<×+!ąXŻ*J•á<.Ş•¤Ô~cř‡‚ô^Ž=ëż=ĄJ•ĺę”?5ü·Ŕ.#¨áÝG˙Ŕ˙ĺB~{řGü™řU˙$oç­oüi˙ q//”%ů+.ىZŞqřçüˇ?=•¤ÍJ•ř‹ů§ČođĎÉqz._™ü‹—,ň×ü7óÝ~ř‹¨|śĘŻ~¤ü§Yř? Ź€|©¨?3_–šnŔ?~#Ęžü&ć^k *m/Î~ ă<Ő›ŃńkŁ­C嬾w˙ŕ.\ż"ęŰPë? đąxďČÁÔŻ2ęiXs‡A´#ăżęąßăó*V››ůŻŔxŞT¨ńń%~đ/™Ô~5jÚm6Ő^Gń¸~iü*ńT©RżńžD˝áš_ů—řoŚň¦ń+Kř.+‹—/]Ë—7Ářoä‡ň>cYĺuó^n\áo‘óŹáź ›ĐyđĎÁuŻçŽ“Ęó¬pë?<ăđ.^ ¬4GĎZŹ#ĎŻă_ř•ë?<ó>Ľç×ŕ:ŻńđO?őu¬ńĽ~řNŁńjVoČyŮPÇ?ŠţĂţ:˘~ugťu6ň?‡Pü$üú•+Ŕy®^‹ĹEÔ¶Xečą~'đĎĢV‡ó*T§Aĺ\šžpsźÖˇ›xkĹX­Gá,ĽÜąqŕkĘ뼤¨Ĺâ´ž$›y\ź‚˙ĚVŠ›`ĹËŹâTGÇyďđźĹ.š<,5ÜĽ–ĄxÎ źČżĚ~&ţ4<Íç'†§ßžĄJ•)• üU~#󕨎‡9•¦Ąx+ţĄJü“óh•*W’Ą‰_˙fü!‡ţH˙ř/˙Ú?Ôq¤AĄăÍXLÄLÖş“™Rµ,zJĎfłD©RĽ@ĘČ•(”D!ł‡‰RĄĄ# ^+ëJÔfÓmgxA¶—ŹÂĺŠ#é+5+@hW­ĂÎOx3ĎŕÓž2ămŠ°Ň—*™z×EĹń­/—_‚—„ąX Â’‘1Zôđ•Y¬őYt ¸óăâĺ0üć˘Jҡł&ú*&h®,–DcOŢł ăÚ^°˛VĽ Ĺ`śµžÚN*T©X˛mrŢ´¸!,(»”‹·ýdŽŇŢĄ˛ĺ[„ߤЛřé–‚÷.\ĄâRs/ p¦WtVŃ# sÓYńÂ-ëá’ć ôíÂü»ś™vg2±SŚ ëLž4šL6ĹF޲ď†Č,˝ ¤Ň4â˘aç@ĆçMJĐ{G{‹S6ś4pĹ@óPk »ŕđÔf™Â Ša¶ŻQô†§fY¦5ł”ßnçyUŠ×´ĽŤ=gÁ9ɡ[“ĎIYĺÁiyëÄ–J„JőH{A1ÎŞ•¨02N°h2{JĹ˝K€ĽEś“xÂ>šÖĄ¸¬ŚçOX »hž±Äqz–‰çĺ†$¨ĆUÄ­Aä{a4Ŕ#ĄjÖG¬…ĺM­ľôn8ŤýF;‰Hé/€śĘÉ›Mź2ĺ[D¬DjVŽW+Ě6eŰ®ĺŇ OFP+ Á!‡Ň¸ď@ö–B˘„»ŇaŇ.^“úŽÝ¶†Ú[e|F*VáM7)ÍŶĺč ˘WiŹ$¤[•Ş˘@đŠ#MD`WŕŠĂgî\¶*VĄű€rs•*ëIGFŮÚm*T§Qî8©^ăń*ĺb°˘8óđfŇüĽ5'y}#ózSÂáEDkŁinŕídĽą=Ą’ÉHo»Űć˛,‰˘ĄJÓy^±˛’Ş_¨üĂÜď ň@@aţ¤|w ĺ6—GÔ[ʍëL›i\n_Ě\šŚż1ŞÍhᇆ.ť4÷˝˘y^`âU?q~cl©Xłáâ•ĎŰXčbËđą}eőŕLŹY\EY´¤÷9o°G_M/8——ŠşČ;Ĺ@¬Ü"ĚĽřŘK””q«„­fĘGÓAË›,żŽ˛1r§+j%V}±ÎZCxCG Uˇ<˘’´­ŞTŻ ëŽ¬q¨1É ŚŁ¬:ď =Ë‹;ĆĺĂĂQ4*ਗę$1Ôëë‡Ön˘ŰäZS)”á±/`gXMî1wŕňˇőAF^b\Jtę˛R©»Ě­+N^FłÎÄ #˝ĄJÉÇ•NĺÂŚ¦j1U6ďh¨űś2âéę+Á*§3¸ĺ¢2´0đQL, ż0Đd÷(”z”EmĹɡľŞőćR>Ś,ç ˛Gd7•ë©ZŐŞÂRY–XÖ/ ¨)9Ę^7#żQEĽÎ'ył&äc»ŔÍčYX ÉŁţâS4šÚ-FÎl”†ň‰[čIrĄJ¨Ů]B˝MýE"Ąh©±Đµ/ܬŠAąTwĐ0 [éi!`KʢlA7”˙ů(©¶yCl.Š”ÍÝ ;”0•)Jń8Ë*âTŔ–J•č۸’#ĆĐ|^ŻoPlŤ8‹|ůyĺŽxĂ“†°á x nVŘ»ś!žđŢ)`VŰCĚv\ZÝŽęŔÍłŚ14ÓęS‹·` R°•¶w’ˇžLU•Čޤ©RĄ> ‡g†=ç ĐçŔşŇĹĂ…đö—Řáác‘‡GAÁ˘®qy`w pg°ŚL…Ŕ0ôE`.;b˘ęV*l,–ŠYnĄ°V‚e"xiÜŽ†-QŔÁí‡řÍXşŽF úÁj-řtsá (@÷Љ…vsI§ µädö8śŘAHE·Ú‚rĐŔď q2šĂĽrŽ…÷ňXĂĽ8bĹÍâČ–G}H`j oü/h)ikxřĎŢwĐ8păŽ0+[Íş‹–¦7( Ţw†ó„Mľ9xâV^t‹Ď8ÄDĹşŹic:Ç şW* Ţ±n9a“˘Ńrô;xl „ŕEfˇc‚'qS„€5sŁ1Qp5Č6ÔߊŚ<é%Ë…8Š÷ä±7¤. µuaj-étbýx*Lň„!‚pP^tXrâĄŮŠÁśCťJЇ¸ĺ̬ž ŮĎXUŔ¬Y,đ0šŔésxsĘve)¬99–Ź9ę1c’ç ÁRť<Śš¶…±Á§xĽăx¶ÜVV ™YŻYă÷=NăĎÔ9¸Q»Hĺ?lĄřd—`;ü*”˛Ň’ ŃžzCŮę-ôňÁÎÂJ)‡9† ­ş ]ą4ŠÁ¸e’ÉsDĽ%8WŁď‘ w?î ˘{ö‹#ą=˛–D¦9¤ o÷ w8ĺ—‚\Ú&}Ç.°s oxHú͇1¶›·rj!ď:e.%lÂ٨|âG‰ěÍ·(Ë. ľ±ĎKĄ‹pv¬ľ'<•˛Ą#é.s…Ţ9w/X9cž4žĺ_3g€†’«Ě4>š7c Ţ+ű‚†ńâ-ľđw˝6b´ś-NšÜ-G—KَŽŽä  öŚ:YĽNńPő Ç2ëcH\3Řx 2bę-ĂBń ÚĂĽJ”JŤĄťMĹ0w¶‹–ĂŁ ^˘Ü顔”ËÎŤn’ú›Çʨ…Ú$ĄX]xáć;ď u>'†Ř25š-—9–eĺŹŔŻC˘ĺ®O‰´% ŁYIcÄ•QŠńąr6Ň ę#“Źp[Öđ"J}JGŇTu«ęXîRů• x+8i˛Y’ňÔJ+.Čx6äîV/¬p0ĆqÍ{—ˇi©L¨1F*4¸ € Ó"*ő:YÂ99ĂznYęm6›N ˛;Eőî_łĚLm7Đqžđń‚ÜĘĄ4 ď `Seâ^ő¦Î',}j#ΞxËëHßFYR®5TK…ÂňńQÓŃ…‘NÂmŕe X‘qVě'ďĐĂ÷+ćQ•µ`Ď=Â:Ť8“–”á’•’űÇ a‹PKl ¬Y‘ÜaĚ`Ü|*éK›š@;GiěŔÔb JŃą-Š8TebÍŘąPř—ŽIG¨Âş†ţę CP·{J=J%NňńŽ_¬ĽhZVŐ9h!“Af‡µhŻQp]Ąw ôDa± j´Dđ+u÷ŠMˇđ+q !(ČTp–D«Ď-" ]śÖ8 Ă ¬¸Â=ŁmČ?p pŢRëś.^  Ç‰pÖ»é}Gťç¨B ăA¶đ{—‹śą2ń.ő“Ą3ă)4ukZŠópăyxHÇXr{ËλłAÎ>cc îĆ\ęť»ęýĘÉí/xŠ9„ąĽ#ÎZ>ń±ąÖIĚ bĚ6`4‹ę)FRľ!—|ĽčöŔ; *"Ŕp˘Q(Áő9ép4ÄMxĺç_¤pÎYaĚgÜęÇÔZŢ>á=Ă śš6HsPŰhś!“é¨gĹ´©S/ŁB·onć»bJÚćě8ćm..„˝7p3 ŠŘąNL29h]GCŽŁëÇťL#›¬ł–Ă™íăĆFGޡŰ›óâ©Qś&˛mÚĄJ—ďđpcŰ7*şŘó‡µ@D凣©â+r‘Ôh`ő†xĎ(ń†ŕŹ ÉdP6Â@‡¬mĄJŇę Ţ Ałú•|ĹąRĄdďšá„˙2ŚGŇX8Đë8Q(”YŁŰ[莂X‰¬Ź1„ď‡Yăď8ŽŘ2zPČł;M¦ĐűÇXú΢N"ťÁľĹ¸n^9"WŚşŹ¤8Ňjc‡ĘÂ&>5ŽzÁÄHžĺQŽ++đG.Lq“'yzɡRËŇD˛nA‡B+7—Ť˝Kř—”pAńYęrbßĹóőüA[h\±[Á˝ĺĺÝdt3ѡbí˘â *Ý—ăĨԹrĺâŘ.`ć0h¨a<¬Ňł–›ő&+ŔAZÔçxpŽţ*›Á÷†\X Ľ®ş¶ĹĺĘ„łBÔroľPoz%ĺÍĂ.:„pB PJ•*V9ENH¸ĺ¬—/iÖW­Ap+ŰNĽ'¶«Çk‹ŽävŠĹ”‚1Óa^łyىoygQpátáeÂ&Ń8é©X°Đ€Đ·ÇyşČ¤"ĺ&ăhj's¨`Sg aH`Đ<燀w˘źRś0ۤ÷,Ă*˝#MÁ˝ă„\Ľ\Sh)6N%’ŕĺB+bűĹaĐ94ÇkÍ„[óĽBĐĽ”‹F…µak ¦SÔÚ^¨Ü÷—.w‡¤Â\¤łE®µŹ8 4oŮG¨)›Ćă}ër:ʉm&5LôG}5~QĽ]ë8ńŢĂ`qŽůĆG/}Kz/ÍÜÎ8ëAÚÜkýGţĺĹ‚ţŕ§x•yŽ-(2-Íčy|¤Ľ…ůUś%ë2–×~1¦ŕŹăď˝ęz7ôoŽŚRXĘźS€¸Ť„ăsÜ˝˛iÍjá­ń÷””ʤHŤ—Mm·„„ ÂY=’ö!.\Ľ –Ąą¶ ă…xžŐ•ĎÔWĽÜąrę-¶ÇŚ-ńPŮ̦PE1BčŕxUm©Qâ Úq*tGM‹ä X8‰ż€‡:ĹÁ‘©{h0>EL%éK‰Zlâ´ ‹ĄýŔ;‹—Š,Ҹ±zEąZNc‹đÝqÖ“ĘZŠé0q+ęo5{`-Ç཯ ˝dŢryF Ů”n—ť<˘^š}NĽß”eÇŢYÎ8GBő¤n.Kś1l¶cĽ ó§z^Ú;ĂÖo-ÇÔA輼ë%ĎTQÔ+‚ŤőŢL>¬®ł Ż :mnQr@¨>4­Po+.[ń^úoÁí/A´¸/}<z/OXxđ“ÓÇq1Qń.ú‰g¨{Ę8śBTş›á•‘Cĺ7‹,7b†ĄJ%ôđ-B*V‹ÍJ•+°/j—//l^šŇń/EÇ*rđ]hyđ®§x˝ôXK0†UKˤ`řńx`Ô[JëHďUÔĽ fđčâ\ąqć¸č‚3irâ·ëEbőą«%Ą1Ú0Ž)žÎ“#N‡Ąő«}K OyrhfńôĐŕ®Č:G­.ô KÍÇ·MĂŢYÔ —…˝W”ÉĆRϜپ^řZ7QĂź ÎF_ęˇ.%âáíťÎٶäŠE:VôÜW˝O8ÉMęMG¸wž˛ńZI.ňË—.#¨·‡.8}E—‘žšX¤´[2ń‹ÔľÖ“wbS‹—®őůKĂ˶*V±ë,Nă ¸ÚUjLŃ(ж›J”â˛hí—Ťk }ăšoĽ\áŽe>˘:˘¸Ľ’ĺřW aŇÍşĹwŚi9Âę\ąl· 4ŤăŃ%b±viYĂďEË—…Ö‹ś7Ź®±đއĽ+đ® Ĺǰhă‹‹´ĚŰ|Żŕ1z)‡´ąqu´}"ă}# j-ÇŚń“ΰܫkA zŽ“1Ô´´ŞńŃŰw¨/{F®T}!±§†‡Ä´,w—qbčxđ\ąÖu®€¸*QÜŁć15îQą.ŃR‘XřS,zÎÁúJCCŇ Mně˘<ţŁ>Ŕ 3Ž%Ë߸}hMFGÄ´´űÂí¤—.o+ŰŢ1Ř€ĹĘő„­cĄ#žeE;śĘ‹ë5/¤˝îp•+ ¬†đ2Ô©ż€ĹË—.^‡MĹź¸ĄĘw ­ĄK{Šöp nR–úŠú—Ą0&^[;či‰Qhčą÷9ÁĹË—Ź©~â ¬uˇ(÷+ć-éŻq›{”|Ͳa´p«#ÚQ)Žx†z 4J”čş#©rç¬+pJ#»t´l–y.;Ä©zCÜ´§0ŕĹčá§ë,t,ŕűžçDşÇƆşĹé QRŽD˛˘÷qáĄuCęzZÚsŰ+Ár‘|* ÇŤLZ0"îK†]ă‹ŔXá¤w.\ĽQĄĎ¬­E¸ó‹ÍË`¨{báę<0ŠEÂŻ‚ˇ…­.gÄŮo™wÇBŢôň„y•ëK­;ň Ć2ňĹmcb*Ă8G"ł“qLłŢŽËQ":nnŔ†LJ$MuĄhqĚX<¸w>řʤT§Ôłń…˝<ˇĄˇn]Ľ„Ż!Hlu*Ĺ3zVŇđşÁíŤŕ^˙€ĄcyRĄ2ťßbŰUJ•+Ä5ťd[¬zhßpőőˇÄ¤¤fxB,–D?siXú›Áá¦ĺĹľ¤Ĺäiň,\ą´ÚT©Ľp7…¨·¦üKm J;Çq{K`nDŃw‡ţ°K­ĄĺC×.2• e˘V›—+Ôżx¨1vݍŰEˆĄ×‰h—ă¸6EĽß–‰DbžM{N3Ś0s„ÉŁiđ‚řÍÜľm‡}w.ńx^›ÍbĺâĺŔ¶ľ‡Â¶řŢĐ–T,ŤĽĂܤަ)ą·ÜżRÜÜä9Ębń{é˝ ľVř©R¦ŇýKbçÖO Ő—¦çGáŹ0\tú0í. 0µ~áX}GP\ ň®˛]fôšNpĎŢ›Ň2F^Uyť´‡žę,˛\Xa.‡{ő‚ł˙Ú?ń5 "śT ÍuáŻ-a6•8Čh¬%Ĺ1X­rç5¤jĺš•+ÄěNȧ*ÜVk3l?ęʸzx•SźýÁ÷(űEKJtS)‚`Mu®´¤Łw5‹—®%>ĺ{e%%%%%"|D©ĘV^íîîQîWJeiářĚ^µ&‡ć;ÇE>^xÉŠÚV Ź ăW–Ľ/:9Ćű‘ť5; UŞ­ęVŠÍ@ÍJ• ›ÓRĄJ×Y^⼭ Ěî>ăęąđĘÇŰ6e=b¬¬ř%+ÍRĄ,§žsĽ©D¨/ZÉdoÖ[CŻ“¶nusnĘ”Jő)éŤú›Du3[ŔŘüÔ8ÖPŽůßÂkᫍú„vČŢ gzą•äWŕV´Đ7Ç1Äř˲ŁG{š•¤JŐQŢŢUK–4=ëYí‹sî˛w z‰SăED•ă­u¤ů.D˙9­țʭWă4ěî{ź4CŤâU°•˙„űţá?XĽT©QŔ[+ÁZ×Fu¨GÓKřJ†jp×X4'¸é ź~j¬T+—GŢýÄMśĄó)Ţo;ŮRµÓ·Ě 1R´Š7ËÍJ•+U›J•*;Â2°G=Ç™Yw1΄6fĄJđÖŞŇ)Ä-÷˘˛)ĹN%“y_1˘?;b˛“™¸˛Šő§ś´ŔG-–á~&˘č74(GÓŔůĆťuLůÇTBq˝ôuŕ u଍îqšÍJ‰°61ZPHŃĐ›ąYř1^}Ą{€-·Ä­MµÔ©QŘXíÍG{j­âôcâTXógF¨›Ę•˘¬Th‚šüzvw'ÖŠ–©D¨łwâ4q*÷gqŘůżę'G©S¸íąű‰{śÁéĹk^‰»?ɤoUaŤűŇ·ŚAőâŰÂkYăë@î ĂÔMżpŕŹ5Ł–şÁď/­G’µßłöÎăb´ĄĘŢĄfˇľ{J÷ ™UƤهŤ$•ŕuH›Ę•6ĺ•*T¬Ç‚Ąh1ĺťĂŤ<ź:Že…=Ä敢Ľ5Ş´‚8¬%Ęś_­ćń>ěĘ©ËqݬĘ»Ź˙'QoË7«a‹›‚Ď"aŚUhűĹa]Ü’™$z—ŔŻąoąoąhj5ŤA¸zÇXăľçáę|çŕDçę§;é<•ĄCŤçŔ±¸:+P%m˘«îk×¶i¬Ąybś@űxÜo·¤"ôNMŔ¨MŘčT©Ă~ ~ă­Ą`o˘Ľ•ŞłÜ=ćĎ1R}Ĺô›ĽË7x•Üg=Ćĺ•É]ő9ś}NbVć6–‡¶9@¶Ą)¤ă[”ʦŞĹ ~A´&řăë¦%Ü®âÝAś^9ú„ć —mşkϱĚAĆńO‰»ÎŽŹRĽ'x—łĚ6iýJ†7aĚ×ĚîśÚ÷ĹjéşůDŢT}ąRĄJ•Ї2Ą`oĄ×ł-\á~Qrśőő,Śl¶[a¶U/ÖŞ•šđW‡‰l‰w‘Săm‘mP6Ž;ťÇhůë ¸śÄ›śKŔ¤wťŮ<:xx+BN4ń×9đž#NýCÚ}Ké•_RŻy÷7’˙ů 7g?ú–K;Ť¶6ÔkŻ‘W[Ý<\đ—*˛›mĚ'é•;µüKnŃRĽ*TâÁĹJ•‹”TJđ¦ňĄMëźćyńAćSÄPśŁĚ%·+ 3rZW˛RY,–{”ňVšÓR™C*ŘlT¨ńtőŽńîVř®˘­ŚW¬&7ű—.o@łOo ˇ.%hblá5V2dÔ ŁîAľađßÄżÔ¶Tâ= ZŰĽ>Rćî6‚÷ 2ręUńĽŻh¨©ĎPtVš†Íâ˘\iž‡>çsm58€ţű‚ŚsJđV*VˇśÁ4K‹mčăW§íAENiĽlвíĎä¨Ŕ 1yă‘»5˘ŽyÍ~-ÄCYwqÉq]čN7—’a1biJŃĂČĺ=hHňă˝NĐç&“ń Ĺ3íęŘöë ę\_f ŕzSîWË+ Ą‰Mw>HžŠŻę˛+Z˘]·âwâ;3đÇÓČ6O‰˙¨-ťĎ©Z·ő(ĘÚ´T©RĄxí8‚óŽXżLďŕ8g3»vĽŇ«Ž&Őç0[6ŚŞĂÄۤVŽíUřś˘Vń8e0ÇđĂfé,ś C˝Ç…Ö‘'v—Ü޲Ŕ¨fÉL”Ż™űŹÝă‚(GŚ̢WĚŻ™Ľßˇĺď=š+@~ôqĽvé5w4Ö•MĂ}ČGÜćQ ©Ó;ŹýM‚Ăb¬¶ńÔě„©QŰ´©RĄy)•*V%ŞŽĎ]Ď|©[Ŕ܉c*"ÔO\÷çoSś®gyĺú›]ŰŇĘđVk]x'iUN%FpŽć#ń‘3ö"hežćĚJÚ07ü*¸ĆđoqŃĎú‡¶Éo>¨N"çh‰k‚î2Ł´¬·=`”Ű;‚J KŃSuhJtź±—FŞëűřKťČo8úŚç™łHđ8îrÎ MŤŘ^çŹP\ ş6ćWŠĄJ•*V·vđ%h©RĄBĐN‘ŮpóŽBvťÎ"•oÜ7źőîyí ;oP0čÔ{ńÖkĘNe{áčůĐá.m0”ćŇ(ůĘ‘ôŠŠ÷›p;ň§€+ %`6vy÷ś©ăPî[Œ׉^÷\fýANö–1ć{‹§;÷Żh{K:ŐĚÁ„˛´`ޓߞ—ő> U,ÔŰqĚŮćq·]Në¸ńń(Ł×äÄ⡠;ž: o(ç*±[®ĄJ•¦ĺĘJJK—,ĄÄ¨zË0§0*rśđó…µzś*lśĘŻĽ;nNfŐpĺťTa9~-ĽŘ•>´l3^*ÍxúÂ\ŻxňJÍ^}0/(ˇ}\h8üQdŞÚ04_Nń;Édé`ʬ)ÄÝ€*qŠíâqĽć|`“áź ąóѵ3Îr´ő*k´}zÖwÔ¬ ŤćóěŠ|Kogű/§sܺٗ×_őŽgÂq»}ĂuÁľÇöR|űʫΚ•ŠÔ‚/˘ZĘ•š…ťĹS—şŠňĂíź ô'ÇßŃ*$¨s…NL ĺ÷AoÜćEż©w€¸îłŽç ďőŹźäݱ*¶!í–}JŹřŃ[ĘÓ^*ň+%a,•¤ÂiVŢ{‹ ·đť î YŞëŤ&Đ)oRĹĄŠ[ĽŻw>^:!lĺŻP-eG’W_˛ }ç™R˝Mág$[4s÷9‰ZIÄvNx7ÁĹ˙<˝Ęw|F)?ólşZ݉čYĽĽ{;C ·ÜĄĺ„%ťżÉS‚-Ń^%§+Xýŕ}Á‰pCiU ˘V ÁPć<°îŃDC»hłŽc}NI}"ۨˇSʶ]ş4ű•Ń6sĎ©orŃgR°7ĹJÓ^Jđs­wr˝Ě&U玣łŕed(ü4ďE^ŇĺöŁŃ=ĽŔŁ &kÜĺńÎěxŚM˘vAż˝!ą*Qź“÷*ö‰Yçluő0ošŹ­apQ˘­ÜV^‡8Q)++ĺű’Ű=JÂâ…ĄKÝí÷7w>ŘR+©cĆúNuT­c˙’†%NO“źXë<'(ó+j÷×P|;Ď‹ľnzŤ_ŻqŠßʏžüýKź`ŮVŻ®áŘ?l·Żě«îVPÄP÷˘Ąy«ĂĆđlĽs*;Ę÷ĘÔwß=¬®Ł4đ8âµ9MnˇµÄąFŽăŞżżp ÇÔ(ÝŠ»@Łď´âǨz•LČfĂGáéÚZňčć†n#Ěő=˝h ÍCŢ‹ź‰YPŤřؤµŕţĘřĎc>째ú˙bWqpĹaŰ|Ŕ¶ÄúJtJ%|ăî%ăhŁźŁ+Ë÷+Ôr®R1/xm*łÂr¸Ăź¨ŠĐKńÄCc÷‹g 츗’Z_QäĄMťó Kuőfţćó|m*%”Ĺl×^:ńŞ~đµőŠśěĘ÷ W|Uń)ÝÔXŻĂL¸ Ś%ĎDDç t÷<ćÓ¸*–x,"¬㪝NFÓ‰g04 ‚šĂé.đDěăOĚëę;ĂĚgŽ q,`ب±(*qEĽMŢŕEËz&ďD·¨€vţ`•¬ z“sťçI·Ô§­ćđoáŽüϸJťŢ*#·îS˙¶TPöe.ęţ ÉK= ŽâÜ6\´6ú`Ăâ_ąK’W­Ą˝ĘŤŕW‰ľAřeVŇĄx+đ†&ĺř͸ŃÓ^$;ÇSˇŹ¬2ĎĽ‡ŚvĆ(M¨Şh«wI„ĽŕăW-#)qMM壴-Ď1RPÁ`˛Đ§0ŢVňŻiđ`3Đ›÷•Ľćz%ĽŕĹMŤcînüDl9‚÷S‚l¤ rLJáŽÍôφ}J2ľBę¨8Š|‹–ËfňŮqlłÔúJŠal q,y%vo •ŠŠí>I]†V˝Úz=fŻ ż^çGĚ·˝ăţlĄDŘbtÁU~Śű™ľ*ţ V7–ńýŽŠ‰+UhŻdhn-¶ĹoçC‹aŕ>WG Â8ŻQ˝is†rNˇÜ2*ĎI°ÍŹ…;đśh3ŢrĐ+!(p(ĹNSďy^ĄôÎ"‡8„xnqÜ)ś|OóˇiâYÎŇ­ž'_y9†˙cv[ÄłwüťýD°`ť˛¬OSvÝśBĄWÉĚC̤ă¸>öĹhÜűť‡µÔ©^+gŇQ”ޢró×’´zEEvĂfç;ép0o[ř ˝†”śK40^óŇu9B;ă–pŔ¸xRUx7É΀·Aď&ŠbcTŻŹä¨ ‹[ĹVÜ^ÝâŇîlOÔ¸´KÖ"»ő)>Hž˘&ŇŕUJ­§†éÁÄ ö•_h!ľä%MűĹO†ÓgĚĽÔú•; ÔŻĂ.9}bĄJ •O\eôŤĽĎ¤űTAFěî„n°ťÎîTÜâĐF˙ÔB-âsĎŽĄjŻ0±mnoÁĘxśY,””––ĽÁÜĺ—,©ąňNr˙ű ™U“Üî0ťÎRŤf„¸•¤Ç®Žň…Ł@f˛‚3t¶[Ě7ő t4pa!D-ÜŁÜŁÜ\©ľ˘Sç<1A~ŕGkĹNŘňAÜe9ÜĹJđTŮĂ*SąŕŻhýŔ}ĘŹ.@nżRĎxŕĂÄýKbľĺ;ŕ(ńFĨŕ\Â+ńëČŘ‹|đÜNt9†ů­WQ…Kfţź \şiţÇy÷ĚŮĽ[´÷âÚ§ĚŕžŢZ¸•¤†ĐoIľUşy"·‰k‘–ÎFzżŮ^˛a–ŕg8yŲ˙sm…MÂ’ĚÎ6Ç,ę Śś±âx×ÄIó>“vɴ۬ ߯ÂŢo?SoR >+.‘Nô˛ŕŇĎrȇWëi_76›Ććđm)–® ±hâĄy­Ýâę)É(Üă]xGíę7-6>0šĆ§:äšś†ćwŢ]˛ĺ.oôś>báŢ/üΡ»9oٞ»u™4UÄ­ˇľath "×VÓ„ŢŇťB˙űŹNH¸ćń('SŽ1´¤xÖCE\ń6ęqś˛2w+D)ÄN÷•”÷)î$‹ëh«ÎŠÂ\J™_0Űç'{ÓSşVąýKw."áR˝Ą -ÂqŽiZ+Ć„®´&Ŕ•í÷˙m®˝‰Ď3–޶gÄ­kWD§¨>ĺ}ĹýęcŽYg;ĺ—.V„®Ôąů4qŠý˛«ťŤŹmCPŞŔbŤŽt+T¸ďľ®etMĄłë|K­»ÉjĽýb°x†ľłXÉqąS‚T¬pĐi+ÁR´TA"W“őŹÔýKKfě?Iţr–SbĄA?P+csźýJIoÜŰęSÖó€Ë`ˇľâĄEkEfĽ<­bßhMŃÝŚň×vÎŞÁ3O¨Ę”8pk(™)ˇ•)—ťźąÍ¶Dż|Ęő“ÎŞŇ) đ´işµ×‚­ű›Ś™}Ťű‚]MŠ›‹Ů÷9űźs-ÎŐĚsĎ;!˛C/ p Y­5˘´TCĽ•*T·Ô îĺú–í›uš•ĎĽ_ă.ţßrŮłńž†Pń)9ÁHMßŇĹi¬ÖłdsZŹ ö4<ř,űޞDľw›ë,©¸ÖÎXtÓgŹąą.)6ÂŚVEŽŢŃ®¸ÉQ­.+­VřÂŰy¨ŕÂŃqŔ>§Á)92m•*ö”-ů‹sŽa»Ší—żÔ'űNIĂä„ Úns‡‰Ö®Ľqé†yÜzűÍeŰ®łZ+J\i¦ĄJĹ2Ąćޥʸ{M‚|đE˝Ž ďň˛§Ě©R˛Űî"O†%bú•ę 7.nJ>Ą`D^Ąf´ÖkS˛˝h­ß©ZjU±ˇŹ>L70čp +űŃß}LxqX˙z|ÍORĎQ~&ĹĄá›}ľćěżHşŇxŤ ˘T!‹ŘC!°amPo02†(‡i^ĺômóŹĽń9·¨w ¡ł*ţá¶đŁóaµi Ës™fů ~ eSYO÷¦˘Ž_ fĽ)|á±Ćk6ć™hMTYU»»7[łu•DáŹě=ĺÚŁł(Iżr§Ü¬óĚm횎¶í…oš•˘łZ|U:Ž}ëZ.ntĽÎ±ZźQßW)qu‡K6•źś9ď)¦™yBWÄIµű›~ŘęXÚ_±űÁü›ýÂ`É đKŽ‘;Ň—g]{†Ű`ŹýŚ8!ĂŽ #q;&Çî+ć!°”™ćpTXĆ*Ŕ­5>pčŁî-ř«]J•+5~ ˙\(# łŹśl[¸·.,/bů„b_ČQ/ďEJŠĹuÄľC˛ŔŘěŢ⪯xey+EÇɡC®ĆĆŞÂčÔ'¬Yäć+"a÷’ß\ř^ůc çC€¸{ăžeK”Ľ˙"ÖÄ˝ÔJŚŁ†*÷šľ?pm9ÁřHF8Č˝&µ™y¬˝¦ý±ď:1Ěá„áÁ´HŞ™»y[D8©ZŞŢR· â;mýÇaMB«Š—˘ŤŽ±Z*WÝÉřsfŮ}CrC–=j%1uÖ+ —Vç÷Żäj;čŻ]k¬+\ć(s€«ËŕbßP¸7†í@˘ˇ¦ĺiWţăąxëA[Ú˙Ţ~4*<<´Őí°â®4K]‰@\V«9Ý•Š•*öśěóźîWY4QĘHCăúÁá0-ŤS”`sŽ㯩óÔ j=˘DŢs{‹nÓŤ»•×öQ.RS –a[ýç¤ţ漕+My]˘ălTřŔQ9•żXaÉÉ}°=DőĆ^ć—űśź{iU Í5šŐXQýŤ»ľ.1çYŢP_xK*%4éŘÂ%JČÚ<Î8€yÔ­řĂ·ßz4…hŻrę"ľ%VŇű°&îóŞŁ˝·ş=L˝\qVčWâ2j4Ui^_É{ŰĎ.Tůś\`›?ˇ€çp§ p7¸Ź°ŘÝí•ďůoäP––ĘeJÍÁn+>§S÷¦Ľ5¦ĽUš•"ĽÔ©[|ĘĽ}JÇUýÇPç´ůÂwŠpÄ»‚pëNsR°ő׆Ľ}5Ű}Î"w‹"SNŽxxĂĚ÷'x¨3ćĘŁç}řmÝŮĽ«ÝĂţeF;ŕ! łháĐ5 FŁI¨ŃVĘ™ęÚ,ḇ&“*Á1É;•7M’× `o>ŕ@¬v—ěýÂT˘Xl.nňÍľćÝôVj q)=±XŻ JÍx*TŻżL˝C™Üę{%CćW±ĚµćěĆŚ§YÁ˘µ«MjŻÁm«ąń›"9çÖ*{Ŕát”~"Ű8űèo*9i«Ýţhv‡¶<ÇśvÇk{Ă ÁÇ€Čwă4Üř—ëę„ÜAZRň4%ŚÚQ{1]CśďS–Ů_2Źr‰¶k5’+Űżh­ušđTŮqY}`.:j<Ŕßcc*+ąÎG¦%bĄfˇÁ¤ćJüźúęěgYě‡f—xÁŢ3©îńụĶ+ËVÎk5ޱZkJ¨čâ±~Ǣ¦˝ř ‹Öă¦T6ya~Ľ|d\VkuÁJy`FşŐ_ČJ yeó˙X˙]Ç“|ĘőŠ–ËeüOÔÚm®Ą;0GUi­5+ŤFŃö#Ń´_MĹܧ˝GŚ7´¨›D§đbo>ĚV‹‡¦šÇ} )ţÄTâµVkŔ˝0 "o+yÂ'Ľ©Ľ'r™LëďŐđJÎ’,}8ĐtĂ8ŕ”¸âYł©Xré=ęb‘=E¸ăžQ˨x“I¬ČČ ]h1Gq}lElAŮ‹‘Že«x"ΉĹC™Ăő8~'L®˙ĬlWbîAň\ő•qą˘Ľ5+J‡2čš'qü›Ë ěÓ×ŢŁĽă}D÷+<Ë:—xąőÄ=D!HlçW=U>z•ŕtÖ…¨—ľ=ĐÖđdč?ęoÔWŢÄÝ)?Rĺ߸éç-K%ËsÄ/ÄĽ—/OsgV+î[-–áŇqu.Čć´†Ŕ4ň*ŕ>ťpčŻz;ä߉Ä7‚Ú?p)ó8a'_Pßoä#Ř•ďĘŻ<@őŁ÷A>%úcČ5ÖµňŇ%ař†L7Žaj*J•*'ř•đ`ĽżąNŘĚęmrĄiąĐ'Ŕ‡ťy""ąj箆ýřS[¸KÜ.ÍĺSS„#ąËÜ´WrŹr€ąC /·‚Çśs5p0ÔŰÔłÔż‰g¨Ôá‚ó´®ň0g1óŤ˛59ÖĂYŕ0ˇËd±ă S{ÂŮ[r`§ÜDiśJËybďőcĚᓸ˝Ë'*”îŕäÓWĽ¬UËźh©R´Vnj^´U7×x¨6ĹŰ’¦łĘýEÝÔ:š¶ťIĽ7`Ű*T¬4nń¦´!Ů´śĘ}JÍ`RĄb±Ďéx–~'ÚRQ)Ô\Ü•pbY8@ÚJ®YOąŇßrŃWĐQ\ş"«kޱ.2ćÓiXp#{.âÜ AĽ¸c‡.†9–9űKJ}A€OP÷ś¨ÇrŹěçśKöyÁކFĺ ĹbĂć"ŢńŘÇ,<ë ' "Ł]A0Ţp|üłZkEFÎ*T­ľáł_Ě2-´¶Ux9źX?ç]Ď÷[a¤çMd%m*Äwvu ®%ÎH‡Ť˘’°iÓ÷4ĽBeQqo| ü‘őţD~˝Á8cÝ?’Ú/ÔJc{ĆÚ'ŔŢ;ěJ•޸}J¨Ó´UËĘĘBŰĹÄß|UĘIYea‹ô€aŔé|,é´‡¶(É’ •€dśśnQC˛üĘÝ®)Ú1ÇÜ v›@ýäcŁ@^^*%ĆňŇđ€ťÓÖ+Sń¸ŽŮPEeőŕŮţăĽʸ©©sâPQë_ÜÚs \ Ö(ĹD±…÷6A<´o—µiłsů¶‚ËÖź¸3áń84q.|hăy©gÜ1pÁëěŽŕťĘâ<Ôę˙Sp˙3—Ť˘¶ÖŇç̲ŰZ”qń-s(÷6<­ľ#rÝ.9Ď«R˝.—B\M8p1´ą’Ř+±  ˇ¨[u=Ň5čp˛7g-ĘŽÍőŢ xĹČ„úĎźxůŃĎÖzOţ’µv@Ů*^Peeq|žĄ‚A˘H޶”˝ő_żpYQ)Îäô÷”uŽ&ßQë Ë>µ8K‰LV@«>vŹR·ĽM˙ÜÜěv=K–yŘaşnĄ?sa>QŻĎ„µËóĂ-ÓhúÄNtŘřÔŕióŽő°VýK—/ NEo "ś¬ODKş”vpiáňU÷++>ňň«^Âö(ňJŤĄŚ8|o= ěŇ&ÄUÝđT¬­˛÷©XeaŢ's˛ "0MÁ†˙©´=ăi´wŰű6›Jśr«YÎ*TŻe.UqĆŞ;{÷Łsrůď*Xâ)ęľb›óŃRÓä›2’o>b¦;7îuaţĂ}đ“ĺ‹Đ°îSo­X6n —„Ůďqr¦Ób~Św!ŢýĎöAEŔÓŰ»*ţĄJ•G2ŞTłÄ˘+§­U™z*TăExSIµ,"SZW6KÔ§$^ߦ!É,ÍMĎ?©]÷î~Čš®Ytč÷  Uľqą1,\Í߸GXÝ7Řť¨|Ĺ·hßyę{ť}Grăî|1 łf$ŁcśQ»ş†Ľâň /îQ÷ Š!*ËüËł|¸4LJ—}2Cm±ďžÓ2µňü ŐüŽ&Ç1®§s|DöA3S–Ššxśo:ăéÁę%ŚVW¨6~'ůsúŹŁB׼öĺćńË EĄÇvĺx†S®Ľ5—Cy~óŚ;K'ţ†„Đď=†ŇŻ Dçyr®0=;2Ž9ŽÍ“ż†żŮŰ)mÇSm°íw6}\)Ľö‘NřŠła÷ŮË ÔJúq}s)•&ĎÜU‡1ŰC—.—tCÜĽ'®`Ü0ś%FĂŮŁA˝$<°dňš(ży"CrpŃVä¨ë墲'÷ˇŢ+©CBÔłŔE»›˝ř…%śäĘ•›QM‰8śń_Čűő çoLě{"půśÓŽ?ö÷.öĹrĆnósĚ›öfĄbĄeÝ3H•¦Ľµ–†Să-÷- †âĄŔĽčÚT¦TŽcdwćnqxŇ|D‹{‘;—Ô¶_?St8 ®+ۨvDě˙Q_ @ůgÄw›.>óŢ·‹fŇŻgQ®b¶Vđ"lüaˡŚ[étľ.aކ>ň÷ˇkŽ`mQ沭ÇöŇy|łYĽ6 ŮU…aAŢ7Ńý•¶űÖ.¶śÎçĆäÜĐé|;u.«‹jő:ś®u÷8ÜZ‡·śtżp‹¤R| žđ+@ňšFćLŐ“Ńäć tá^ ™4^µiŠ˘ŢšÇţć}žTZ!sÔBŘŚÉĽvE8jÓ,xÚ/§n‘°tĹő lĂDMşrŻoÝ€;żą»đ™´ú•Úʶ#l©R±ľŁfá¸$­))Ę„IóYyl,xҨ—mĄ SEf8bąN*TŁÜŁîW¨‡eGą_ň›’™ľ»@}_Üżj%{âu‡ďů×ĹÚĄĹÁîZđJ^_ä2¬‰S¨¶Ë˛ĺ›“hrĹÖ¸rĺÆ|ś`ŽÍÎńßÔĺ—Pßwő> Ć+ÜţFďx`Á܄ɒ‹—f˙°Y;†ĐŰ­ö!l=CK±…·Ŕ-¨ýé­W+üŔl'ż÷(o¬§&)~Łźń㯝E-ĆËúÜ?ąwFźSkÝŤ ňĘ6Ĺý|˛˝·Ż0÷uV­¬#÷ĄôĹ^u–çfňË^¶ÜtěóXąe)w"0ş€¦ęlę(çhŽĄ¬ýĘ:ţÄ~ţĺN)÷˝˙Ü0Š˘şĹ{ąÇĂĽWßňQ˙´÷K=Ëz–»E˝ĺ ď!.m,Ţtşśq.÷Đé|8€‹®łŽ8Ź˛âżŹÜ-ţgMę}ŕľăö+“©ý…=ţĄ>yž¨˘Çw8[7Đó#–&\9tąbŻ­–’ť3¸%ţĄÇxźT¤w‡öUóü–Ôře.§Á-’UĂŐ,•é—÷łá4šŚ“qy4;ܨŃkĐ˙XAÜŞÚÁö‚9çn»Ď<çâڬ¸§î*ëżŮÔ·¬s·dTÓ(;÷/ĐÍËŞąŮgÍ€ŢR56ÚýÎ_ă´}T!lę#Ţ}`/ŻÔ˘>’“ö”ű›ÄIÚ&ä·g™RĽZXmżć+5­ćl$§ďMxě››ćZď)‹\ąod·ÖŃ\ _¤Ů°sěă^ď.WkőÎ8§<˙g˙fţĄ’ż‡ć1x©L´Ľ·¬±‹x°‰Y|łçđJÄ{‹ '1ˇ.\8˘m(”{”;€‚›z„o.>?łŚ7›Ę‰~";Á¨ň𠬻o Y—gaüŔ-¨Ź·©łb*X…„¶[vţ°ŞŰ<Ó–MU‚©÷.ů•Zn[Ávĺ7őSbď~ŕĂxű÷źŚvťB×cű,÷ú%Ťż°]pÄG%ú¨¦ĺ-S‡ů”ďh™uĎôśĘu´§î^€=DF§Gő¦´ 7•˘ĺÎ+EÄ×Cć6»ů§®*ËHî|°U»üb=Es7ýOFđW;JŘŻî(ttËÍÄß<ÂúE¶žbVđ®öśî{—_RǸ bË%ĎÖˇ-6†„ŽłŹirýŔ ¸Crâ™ihޞR|%úMńéŔŔů•ó— ‹ćQą&“'€ÉĄS Ë„g§­=?8%n ôęZŻ®˘Ô w•D @~ńŃ9`đ;•šŐsgá•\á~žŕQF>Rˇ%3q†ČôÇgî#úJşGťşŽÁmŽeQnë„­í縫đ{‚ťŹ’ZóżÜ«…»¤ű›J:źrĄJ®3RŇÎL/ČĂEb±CO]ë>ôtąŠ®ţG˱XáŽ>ă,›ĽĘą^÷–}ŁeŻÔąŰ‚V×:˙s×ňs´xßĎPřâ%mÁá›đăÔAřbş‚„ůÂźű‚óý••¸¸ă“ˇĹG ĄĄĄˇĽĘŽ"Č”ŕÆ!šhy•é ÂÍŕ¦ű2Ăą~Çá\˘o ŻPFPýřŹ  ŐVĚ®Č6Gm˙¸ă|lÉPűŠŃń+cÚRłnŰú–3⾏۶Ȥ©óő9k4wxąŢS·Ó)ÂTăÓg⬦hqź™ú·Ő˛›ŻůśńǸó·í” áŃŰňĹ öŢSžb5őĚ 6Ů8fŰ9JáÜ€áüÍ>Ą>Ą>Ą>´Ĺ@>`ť‹BűÓRžL-ęT­|aŰlFűň;K´đĹĺýŻś»pwŮýe«n%v=ó…﨟ĂĎĚéŔÚúî^ôţŁcţSa7ĺÄŮŮŤňÜé1L¨m=šyjuµˇĐ™=Ë%eÓFůeMĺ{śG&>‡Ť™iĎöč7D0,úÉ“Iă3R™I›öc¶çěśď šţJę ˙gřĹ6•u›•ý—Á(aéß,¬[ł‡lŘĐC’_(wŐZRö‰O„\;Ŕ9UźÖK&ĆŰ> ĆŹňĘżúu,j6+űŇÚ Ř¶C®ăÜ·^Ąěľ Îççé”á eő•Üě@iZ…"Ąš*đ(Γ]y*ą°‚P‡ťF†Ń.Ž ŹÜůeż©Íž§żWPnĂtˇ˛X|0^ň“ęs¸—qí±VÝyŽ9ÜráĂ—yĆŮqőaÇ2ÍęQĹzÇ?ęwó›„ ]N˙Âs÷.ąţʻ͟0CťˇĽŁ&>Âh Řŕ1´ŁÄ´tł†Î;''ú×}Ăj{ŠU5ž(°OĽ™©IÜ߲!ăůŘĎťŢÉwż)˛úű–SŢđw¸·D" `^ďčÂ7`ť˙‰Ď4uŘÇ}#ÁdQŕÚQîZ@lď>i{ę>¤[ßoĽ}=Ä[xhcŃŽ­¶›CĪ߬Wf*Q)8QŁxŮ…Ô±őîT©RĽęX©YqaĚč#żŠ´qş†ň˘ô;ý@î'2ʏń_Ř۱¨›Š÷Ź˝§ś©˛źPY64á÷9>píDwß>¬*rkt÷ŇčrčvŠËîZ§‡ŔÔ–o);oĽzŹ»őĽnI»gĺJ† VPîs“I¤Á„UD(UbE’ĎpL%ó+×ń‰NŰ2íôϸ‹_0߉ctĘ·]vÎ ÄýĄß˙©^÷„¸\ŘÝť ;„§'‹tRnsŠÍhÇ@Z@˘‰ĹxţĂđßhŮ(ą´8!ËGkP,UÝĹ@˘Ą”8©ÍJ•«ŢTůÍdN7b—/‰ĎîęąÓW> yrĎśW˙gq6>ăĂű`˘u97ęΠŮq†ĐwÉľ^ § Č;ĂĄŇĹľ¸p먣Ľ˙Ň:f ŠÁíPťAÚU• fĎ:LXsX«řĹ0/T3G0oE|Jzź•Ńżąogň!{GboN°V^ĎöśBŻä/˘ľĺľSb}í–#éóŞ;ňVPĆ/-----î[Ü ĺ‚;NJk&đ®á´ ç÷-ęV Ţ/™ÔÎw0ˇ-ŘŃg"‚ŘM¨¨'fý'Ť,‚¨6Y”B4Ňk©±ĚOQlµ)í›>`VëlŮąÎ{ËŰxë´ĄneşŢZw-—ĵ“yĽ ŮĚOiňJ»‰ëxí Ao9¸¬ÖŞÉ—+©`\čţŁo•Ź„ŕ÷cGw74ýĎŤÄÜ/÷6&UvóŚ8‚U%›AéäÎŕqĆY[ÔŘůöŻ –-NYsNϬŤďźĚ8dÇ-Ł&“JK!…·Ü%{ĽĂęo)÷Üł˙ÜŰh­VĘť¶˛+އuô`ű©P>C/Óů/Ü-ŠęRhçM䆓_¶Ä-ĚDˇĎđźŞé>áĹN9ţAţĘ”pđµ6lĹżb¦ýÔŮłĽ~ÉN™iʲµôĂ ĺJŔÓd/Ei¬%Ħ*č­o…Ő j0áŰî;oąçĽ9çäâ Ú*1ņ8~ĺśsg$/¬8îRĆŚ9†äpét°iĂ—C˘ýŽ49Z.(€p)Ä:1ÝĂl=ępÉŽx2`ń¨E3śD-ąö÷Ў®ÄUśaÎ7…ű›ű”ű”îç ¤ŁŃÓ“6óŃ[yađßÓ áçćS­¦çĚł˝ˇ(•é›Ę†ä¬r„dÖ'©dŁ©IÎĄŞ‰FÇîmöËęTű…»ÉDĺrśĘuý—Ľ8ĂÝ;xś‡§f%í˝Ź\Áý0¶ÎĚCĆŃg̨•aj-ą«â 懭 ¶Ĺx+aB ‹––€îůąéäĎsŽ_­/Żě ŕ˘wsŁÖgś$'q›ëĽ±ťŔ¸NlpGĹÖ…Ö‡ôš:жÎ0R2Ăąw‚ŰAđ†’ž îŕÎw izg;ăŚ2K&ý÷ W7ÁÔć|NýMŽjZ¶ď+Ô|9•|ŔO’ ©łr_˝6ń§8`Ó­Ţ Nˇš˝™B˙h·*>\V?Ü«”s8ű•)DZQ ľLĄěĎĐ1˙óú€ć-éâ˘Tľ%ěËx2ĆńęƸ©*V*ÉRĽ âzśée§ˇź>N±Č[ŽáĽăîTŮÇp(¨ĺĹŃâ*Ceŕg%é«yÇÖ‚ÜĘÇ&‚:śşn›ś“Ľ1ÓB»ťÜt±u¶śń…!?sbĂ<ĺ4-#.»Ś·ÔŢSîQŢóik·ôĹ ÝŮJŰĎDô9‰Mz•ţ®WX8ł®chYłÎ*sšő Üç‘fLŰ»ĆLĐůŠ­±*?ŮP•€˝Ą9¨*=°ÝŽîßPíčÚtť‰öé*:kÜŁg O2˝ăŤÉcéăÄw|9¨Á¶%;”A÷čZ.~„NĄž ]ô9r㦀Ł+fyoůˇŔ\ űŚą‰eANţšRŕ«zp[v‡u‡0ăY,åæ´:®+uôcł“ ¬ Kľćě«ŰI¤Ňaő¤ŇC}DVŇďAŰ6Ëz?lťŃęCłĎDŕ†Ĺy– ßâ#o˝çcöGţgřwńîs˛ őo UÁHŃSz°(¬ŕącă„`-8>YĘާđťz?pßs‰PŘťăť»ë_¶(bż ç E9VʍĆĚ»ă”C (đu:.8gv~ł>µÎřÎ6’ßxr;‰Ô˙Să.Ăy8I-÷-÷-ź(kV|ĺĂ…FNHď&Fđ4˶őŽ&Lrń™AÚ QŤŕŤâ  Đ;îVÇG1đ@ #Č~çÜvGő8CÄ7?Ü˙+Ř"&§učK%VN˙X2J¶Č@€ĽOl Đ6´ý ľ˝w9Ţu÷8TP´†<' ÜŁł¸µ»>ĽÔi´ů›MłR nGE¶ńÎVľ3±9Đ’Ž5Ť7 Ď 8`ł*°ăˇÍ\ďx—Ríĺ,•8–}úŽEŚ bm8ćŔď,č5ŤK˝ňžĄĄĄ.8VÇč°u1+IÔæ>Á ś˛dÖ´GśŚqSÔ´SŽÖrÇb '?ý#8}C°Ĺe˙qÇÔ7w6e§?ŘoଞŇ{Á9¸ w‘po0’ŤřGىQG2Ďp7¶ő8NMáÎ{¬(RÚ)SǨ&“˛T¬VNp¨¸îܬsđ«A©'a­ŮˇŇÎŢ 4÷Ô&ŹäIÄW,1Í„JĹ×^rÁFLk'F—,]K¨ŻHÓ nA9ĺ­DgS­IzL+—_qíPÁ¤Ńd§Ľ€žň6ĽČŹ4qÁ“ŢL\řźĺěCµűÁţă˙q,HďúÇMNŚUqü†>K®MŃ)M qŁë@Ź wX^` AŰÄ_§©că©aw[ąó¸tá•8ßÔĄ_RĹ˙#˝0S‰f΋­UfT]h8Ż!›w"VžÜń'fłŠĘб™w‚ř…‘ˇ,ý6 ;–w9áűhhŢčt8[ޞŽxęraáŹ,p¸éËá0é`ŰqӨГ‰o˙%Ąą tµnJ>l č–*`†xŕŔ@ŁAîö÷8ýŔ 2ő÷ŽúŽĚVT=bˇšő´·żń ň6†ďA.ă*ËŔcš 5‡oň*˙Öźę:+·ťš_ö’ˇ[űc‰w8ćpđ7¬ŞÉŰÇưcM0ĺŇlJë4úź»j–-ŹĐKŔ@H˝Fô\Łąű ;‚¶† Ţń"Y Énn|<`Ȳq)x‚öĺi ÔăŽ}č©Q]°ßË;bŮW+OUë|Şfâá9şBŮą•ÔäÉż-eŐé”(jpĆ”9ÄűÖ⣥ˇ.–-ÔGQGÇ\8;ŢKoÔŞă yHXŢX!98rÎQŽ˘Ć: śŔ„X0µm‚Md«Ť ţ2iKްĐNŮ1Ůöč=ę…8€óxÁ‚,ćňď=D@ŁüźPĐÝ€!´=Ź:Ŕî.•X¶ŰŽŹPQŤÄJjV&ĎĤç#ľń)¬ˇ ŢsťhěäVoÄ 3dL®5–:)”Ęcy5Xę­ęQ­ń:]Nłî#âäĂäõúĹŹĆŹx5ĽrëĆăÄĺ‡,ĺgQc–„9ĚÂŃí É‚Ě,Q“&*p6„2jđh2ó R©ő–‹wF ŚpË6ĺ8°xlhŕŔ,´9¨iŇ)ÄŮřb&:?ŚŻć ›é¸6[2˘o‡l~Ą…Ŕ¶PEúK2ôď,€u*Q,ę%â.NGx¶"iŁw/Ă— |.–:ř}ËP÷†3”Ô4G>đ,cĄËDppĺ‡3”ZĂŽ´™CˇŤďő¤†ż­&bdŔ˛ů4sĐě0(Á’*0x…¤á ÔhR—Gsş íÂ2oÍbź'©GrWL6Źł‰đđĂrwÎr`-©ë‹ď¬UěýĘ˝đŞĘeç"[AűMÍČ.Îó»ř”›9 `QYA”ńüĎvÂráĐéqK±Ě§Ôł¨>ا&$tİ{'G'xt±Or’žđ-Đ ¦u–w‹Îu¤ÁG™ĘEEE·&L7›3śšxÍ_1őŠ!—eÎő:GCĹ{† #_sA¤É…HËh?m`.n®{ Vh”Ô¬Uí*oEgęěĹ· ××dJÜânýlÂŹĂ+dżęís—Ü]?ła.6—ú”śąNžb-@G*lËővgf¤¶ŕVş_—],r¨9rÎă™Ţňe}"Ą˛Ůo¸,Ë0éž0ůeŚęVŁk‚<ÎPŕŽ˙pÉ“ŮzŚśĐe Tă¶o$¸úË˙z•#» 2a˘o݇0dÖě[-X7P÷T)˛…ËŃWÍÚř€4÷h°‰N+MA|qîA­źÜčńÔë ĎÔâ;l•GËßÂűa¸TJM‹ů` „ŁÔŻdRQĽ¬Đ[Ë9„ > µ@ŁĆáŇĺěv,|®\:銍ËĂbú‚„­ŮÜčF1ő9ž™w‡&ň«6rŚK §=TcąYpđh4Čó;EEE¶uďE/Ž50[Zä4Lúg3běŇŤĚMÎ &€8›®üĂ´Ţ5Ăł®ŕh˛ÎÎmŮÇx4.t(çŤ?ňň)ÄŘE(÷Ľ R®Sqs±€űFßýJ®v;F‰Y'Žb#L7¨äg;Ŕ=踕đ9| G(ą#8|n‡Hĺ‰7>fÎ•ŹŤ¦őĎs–ým>b˘˙’›íŚ-ÔăśŐŔ­ |`SČ”ĆÇkťŁ˛ă¨Ç¨{¸úJNsŇ<Â<Ăěń“EvĹ묆÷;Ü07†{† Dˇ†Ž‡őścvZîä×uńoÔ8‹tɤɂ—äAáËáKŚEď<Äga)9%zţN9Á(~%'ÄÜ—ý‡aËz€]öśÎĆ3o¶[ő› â->fâđĺŇ.Ży¤±ć:ś9tąô˙cxnrGÂÇC©ÂĽá;î_QĆĎN÷6ßÔ?¤8ů` Ůđ$ă,ćz \­ eĘőŽóăło÷g,uó‚;™OXásfÂ-łăÖ$6—|řE{“!’5AÚzbV P¸bŔ¶+ĆĆ ®=Iw‘Ţ›eĂĆdÁ¤×wŁ˘o˘úŃLAć%ăhüâmëyN™L/ŰŤŞâđýčöq‡ę!Űü›K=KĹ â/Ź3hÇîń+( Qç—S†8P"/Ät>éráĐésVÎ3ŃÜ‹.ˇ<»JÚäđÍÖÝŮ·mËŤč"Ţ"':|˙bK÷ţâ˘ç.ýÎ' ÇLěśł—ŕ‹¨)ČéÜá:!Ěyś÷9Ŕ,Ű„ç &ß$D C'„І'RĆSŢą†&EXC'lľˇŕ2i2kŽe;˙K+ܰ¨–5â#Ü>%ű&ŢĄăęG±q’WąÁśťĺJ•V ‹–ř4Ôoé*S+Ü îYŃË‹÷xŽjÚ%Hńtş\ş…ŠŘrŕl˝.\(b¤Ż©dăC˘ťž%ßđÜkę|ą›¨¸ű2’Ë÷ă\3ë@/¦PyžŤ6âŇ › ¦ŃWqýNýś•Ş{ś0÷*Ź4ÁfŮäú„#”ć8GרGmż°Qkc > ˘˛Al Ş=ĎćO ˇć!â]SÔ»ÝÁ®ęza"ŘmúĎĹeäÁ“IIĄ]‰çŢN%kěĹJD¸ÚZ}ĺ}ĹöXó’»“ŞĐlc`^ŮÜwë. ;Q ąď‡µ( łÜ¤·ń:ť.…ÖzÇQÇ®—"E1\¸´‡´ŚtÚqŮŠžŮ˙Ť˘Ęýˇn6b%Śî)ôĘJFz\|;K>Ł—Eű‰ę6K˝źěşŮ‰*ź†R,MŮf|˘]D§3pÎS•Çź¬>pâÖĆLŹpÉÍNĚíÎph<˘;ţGŇ,”Á qč2;ÓC]dÁ¤đ2ďâŁAĆ)lď6D“á.Ë{jm÷/âo˙ě˘ăcĚ©CN;Đ\ľŚ'¨×gňQá–”ťiHNäDŮĐŕݨË-Ýʧó¸Z-€xežâ]ÇĐŽ+ĺÓ::Ž9Gµ:HďĄă@‰gŢ–RńiđJýMş/ĺ”ýĆ»®ÉoŘog¸ŘÔ7áţÄć§=C'lq‡ u[(x‡§,«9ÁSťĎÜŢ%źęs‡ß¸pølGbż°vđK˝çcÖŁ?x Úm Z0(¬î!ÖŔj2†V*\”ËÔ4N´Yć2i „+űˇá†ćÖ*ălTŻ{KÜŇm/˙¬Ů‚ń¶-ýßÔŞŘĹÄą^Ł-÷-—/@ÂŻŤ5î÷˘ŐőłŔkŘ?šŘ§0n3“±ç<َ@Ţ2č|R†€VŚú›w7řţ ‰p\$¤Föçü0čí>ł´IĐeâćÓor˘0ß*§č—ěʹކ•ąÄ}@ŢVő ÇÄ®YÔ"o^ăčęv1¦ĆŽ!‚T2{Éĺ\÷>pa,I[ůi4§¨ŘÚ;ĄN±>¨ž˘Žp-‡Húđšh4]ô†Ži/^´„şăű€żČúm-Ş?pă㯙RĄEL˙ő™ň&Đž·Ť}Jýép,•nN \«v9€eŠÓ‡F×ë[Ć.?Âĺ팰±+}xĺÚ\ÇC­ĹLç&Źś1ÚWoň3ć?ý`Qű¸ý’·Żr×ĂÄKŮç¦6Ąű•ő/ÔUĺ—.Qî#‡Álű0´\­­ç@ŁdŢWdşeS›Ś}dś[ü†ëbÖÇ.Bçpb˝Ďő ě …Ă7qţÚMi%’Í­«bë4z•ęZ?$aŢ˝<ˇÖ“’ńë=MΡ“ˇé÷…-°č|ŕ‰±ůŠżúĹvń-˝żPőęiýNČ6 ÜäúĆäKÜć s(cë79ŽqçŇ‚˛†‡IŹĽ8r,äpťńqQé”Ú%(ÉŁ=J6áÖĺÜaĽ–ĄpĎ™Ŕ=Ç”Ř?HĘ•ü‰Ô÷{Ë^bťS¦?9iiO©O¨ŐJ®ńąÜră…z•ܢ\Á©z1^ĺßÖCÜşăMC ýŔ>ᎎ“Ţ‹O¨ ŘJÇĐ‹eľóo¸(Iů1nîř4:˛r0h9' & ŃŻF}0]°/Áy'd"s Í Čňeä"Ô[ŃërÍ™}Îa±Čl/ę7_©ÎP°hwű‚FTL\T´»>p rqVŃ+_znkÔpĺĂ6,twp•¶Üa[˙gŁ`0wnX[‡K©Ë¬|0˛»ď,eŮťDşA˛ń˝HĂ[ëpćŮl´úd»Ŕ˙1ËŽŇŽż‘*ŠĎ–îĆĺtMŹ–sĚ%{eúţä•îmˇ?L؇w* Úuž81mžćÇx©đ`ř1.µ‚…°J˝ ˘§ŕ×B¸5Ě0(‰Ô L^M~b#LâÎĽóô#čď.Ó’ýKë†~˙ ˙¸·˙QäţćÇčq3b2Ą÷ˇśýÁ¨¬Ź…%ĆŇ˝Ţt1P±mË—C˝áÇ{FÉ·Áśsű•Eőţ‘ĺŔoŘîË>¦ĆÜĹ˝˘Ą±ˇÜĐáĎysĂÇ é·ˇŽŠ9śS©ń šÂ]ËÚŐqŃQ%Jů#NX#Ľú&ýâÁń¸Mϸ•—[pcäźąŠż¨ťŮ·ÜřmŠ}J÷?©niÂUíÉ ö=1ă§]ŘÄ=ŕĐMŁčźüŚ!ž'Gp†ĆˇÎLŽxâě|R‹o9†“<ź¶~Ą×$>3Ô%Ą9Źt‡)ó\Ź/™w űŤü‹ZýÁ˝ôCvg'Ô6FrG”e÷†\ 0oĆčfő0áË‘dc łŽ1Ţ.öţĄVĎ ôđ‰˙©]JˇöÇmż°^"ŻFvXßpyźř#ę÷D¬w—,[T)Ä´ż¨&ÝĆíŸĺ;ő”źÔ@ëpĺĂ7|ÂŤŮ·Źó3Ţ3ĎťŢ}`ľČD˛=ëÖId¤2ń·q®ŘS©đ&đRĚ=ˇđ„€„[ýÎţńŢfN±ę>±Vě¸DłÂ¨ů|6öô\¸ý%»ĽJg‘8Dr‰»“Ŕčpf»á–śî|A"vAë¸űţĘŢé‡/’áËbˇc°žŢĺś˝K‚ ÎŢâ݇hźĚŞŮ†x߼;űaÚăsqňD¦Ą-ĺżě›  ďO?î +ů˙¨6~†ł“7§´vŰő/®ĺţÎű!Ŕ7…żúęĺÜNăyÜ=Ľ—îW.änďlń.řĂź¨¬đ8t^ŁŹ¤`a´gÔ¤›O¦Bűę)傜2†ýeą~ďÖ\ ˙IWă{ČéfÇ#,\Édwžđ·¬ ÄS QĐ źRßSŤżć(NE@‘U˙©ÇÜ=eď}C‹Ž|ź˛Q°)cĐÁ Ř¬[ę)soP.} >ĺ%e˝ËH|˙°řvś7×xá1ČgPâ.Ëî\Űh†ŇęUóĽ3p„kęw¤Đ©fěÜw§`ąa‘ţa‚%•,VM/´52Űż ®Ď¨oěé÷.”÷żîoÜ·ţoúSn^ĄŻú0poĽ˙ĂbY ďËÔoľqń·6xOŢ éë)±â–F–wáSS­nŇŰ–>Op6"Ń›ś1^ŕoÔ©ĚĎ&3©OQrńĽ=˘8J•˘PăŽă÷ĺ‡1lĂ©ŔŽ _†{2¶®^ :Ú,^‰‹„Ţ[9ű—öpí÷‡b»î°l—l8ŹQ˙ň_ŮHBY2-ľŚ¶w.%ł űBĽčß=T}eŞ\˛łÉ8űNnN^_‚n˘+¸/Ô ń†.řţŔ¬ÔüN4ŮđcÉĺ‡S˝.ŔÇÎ T0Á°äĐ4Ü©y.7pw>ç¦-·‹˛-Ş5-ŁÜřo6 ú•[wÜ\/ěw†đ»®á˘qÍĎ4ÜýÇ ¶€OgQ9nC€ç†·‹b%cŕtś‘¨§rĺ˝K®_ä-•6ä„|ÄÔ·ÝËcđKŠËrĎĐÇMLt“‡‡@ŽnĚ{ن*Ă (Ĺ|ôAÜvÇzÉňhIłÜoęť &η/hă].šZ'Ěq´Ýź±–H;F ËbťK‹˙Ř“ątľ QXpé_¨ĺť‘xËs‡HÓ8bۇ<±FÄ[•qz8ÁíŠČÇÖ9EÔ˙iîpGrýC}ż¨AŹ|!äźĺ¶Ěűć^Ôń:D‰Sá-–÷Ľú–ťÁw^od;ŁNI»WĎw‹téŢ]‚6a[ßëýŕř a-í /o˝Ӡۉł÷)4X}AÚ<±‡pÉ6ýc¨@¶P`ŃÍ IiÄSÚvRž™ýK}2ýő›*|ŶUnÜť‡őµÄ<~Hfţ«îoŰü”`ĎĎPŞÝŔ#Λ¦âS—°a>ž 8ca‚ó´mˇŚgÚ9réb9K ŃŠŠťÎŕíÂ-ělNg[JEňěßî_gě”ŰO¨“#+Ó-9?dŮÜś˝|J>ĄŰ1oő1éţ%ôJíÝŇ2ĚťÜlt¨ÔCŁLâqPŮ®śp㬵8V+ ŮF›% Á“H $~żs˙"(rţâTŢzC·ěÇuhře§¶$ ¨­(Ęn~‹Žäýęę»2ďé‘N%»3¸Č§ît1U¬ez.˘éę}"ýE>"« ´\[øyžĎ>¦ën-Z¶.ä;0Ď™ňA9DĹËáS\:YĎGf‡KďQ΢ۗ;-.Çő¬Ŕ¸şśÇ™î†<Ă}Ţ%Ű*=»†˙©|ľćÂ-Ľn?čÁ÷ąk!•RÇ %Ą%|ĘÄrJÍÜ4ÇçűU˘µßÔă»űP¦⥆Ýú"ĺśBü°ÚY7~ ŃűďQ5(w0=1ÔÜąĚ8yŻX=Çvnţ˛[+—Q–‚ąoqŻ(HÜ4ç®đW ú”˙™kĂöĹ­ę"¸Żú›–lő=äŘŮűbwX ÷-Ůţwü?É^–w+çUźÁ1y>ľő|Ć.Ńm],* Ł­Ë/hă Zćz":Gám>§z?đ”ácÉ.ˇçEÓplĐáËLćŃ١ÓÜJútöB)ŢĺŮ^هwgžl[÷†=áĘuőţĄü'7sď{aĐËÚ;767Ó.ĎRdçáźx05(w9›Üę”'`ő Źěˇ§‡G}Bň‡ĚżCMĄ{nWXcłX§‰wâ›3Ś;ˇÂz‡ 9śď‡bˇĽ}tC˙Řzp@Ębń̬§ÎIŇË2C}ˇîyÇRú%vďµýĂ7w}ÇŃË @ŢĄUJPé˙Qâ°†T bA¨‚ą´CJ‘ěŰÓÜřËÂk{×Q4űl@˘ýJ(ůb˛˝m8oőČoĎîq·RťĚ/7«ĽÍĺĂ’#ˇ‚ŕÁďźqý&Ł·.ŹąŢXriş•†;-ÇXăć8sÇ•[^°äćVĐVş™í‡śBw–1Ű á»ăKŮÖ^ŁáÁ,¨)ś·cî:Łň‚Č˝đŕćsą:CI ™C÷,#z?±wÝż*íű!Ů´ŰÄvż¨˙LŹń)>fĎ[Ęzeű%‘ôśc’>zÉ*řŔŽ6«A€ţ͉»đK9ŠĽÍú”ĎÜŰćmę'¦ńk|0e'Š…©D_Ô·sÇűÁŽvţĹÚŽ]ŁŞgđŠ,ăőŽÍăáâ\Őu˘ĺË—9–îDNtź7Bu¬:žř˘9cŽ9çÔpääś÷Ë6\ĺŰyŘͦš>°ç†n\*"Ű—°.q˛ĺÁąQÚ;ú„ętęÜÇÖm"őpc¬zaą™É]Ç?rŽ`č¸_©ĽŻsúKPôţÇšĺî%qű•±ónK ‰C/§ű)Î(ú›÷ C (ÔKţBž%8Ůçű*ľˇ,\úK9aĐ·űź¸Ű(9eťŢĺ*$‰7¸śE,ŕŐNśĎé9śýĽçbT?±îv?©ĆÎM绾âąĚ0,ĽŢ›—.m6Ĺá™čŠ91Ď@ĺęíî:ÖňöŽÜ9gůhrpŠŕĹńOŠ2¤â2ŚqĂÄJkK“Ś:\9qs¶‡˛%ô×Üápě‡81×ŢŽfÝ´{'8 Ä«‹xp饙yÇqu śhŹżîyű÷%ĺee'Ö^ZË9žŽŢ˘ÖÇ1ˇ6î<Ó÷Ž7Ô˛+˙ąÔălWdŐěĘxă5¤Íű.+Ô¤›’ďm˙ŮGX{Ń,+:źÖ6î? ÍĺíÄWDWąOWś™,ăAĄ”˙ańÄ1Ě1YIĹ;Ž6_¦çÔŁęY—}ٞš/Ě´j±ś™ŕău{s‡,9‡2áÝËŹňÔă–±¦Č67eĹśš\ ráˇGQűއóW´ôan6búŢ;s¤zś3†<1čŹ:?Ë3† W±°Ł÷¬ćp0é®ăÎ=eďËî%0k $€ÎĆ-Cn˛­ř„7~°íđĹpl׾"SdVm‚ĄűŃSń˘‡Y´´†ţˇˇSr켍&7çhÓ–'˙"ąXúE<şM42ĂZ–3‡"8€ě–0ÁŹ™kĚ6`Ýeé91SPlśă“MË—/MË— Y¦vŚĹÓòΰó°sÂŢ^Ľ,čĆíˇ¦8ď#¤Ń—Ĺ^Ć®ăMŰÔp3žcnbpx‰†wdÄ澣Äy•š‡›‚›Ă†ó8‚5nĎQu0ßďŔ6gzy„ţ ކM&đ—nÎ!î-ľfÂŁ´ŘC•‡·|1/î źîU¬â ďĂś‹2bĚ~óíż‰oÄżc¨bÂś›Öĺ‚ű‰ŃQWk4Ńŕ°(śěNÇůpBwí¶l ¶ë¬Y +Y˝7.\ą~MâĄ÷‹çËěçGsÇ ůŚ-ú‹mąpččrĂi¸NeĄčCĚW[Ć̵>0řŞŘćs­ś"’ăŁî\˛!Űůâ]mţ"FŐ1;ę¦÷·&†?ăąPGQůś}ĂĂ:ŚlÉţ#Ľâ[¸E[PQ¬†ĐăĽrf=0C@ŁćYĚ#ľŘ7oů ßÔâp„-ŢĐőęqżös*ÖqL X¤řËpfđ ÄŞ›|°Ŕ§áŔŁpJŔŢŰD8Ţ#Źä´úK‚*(÷(÷ćWĚŁÜ+ÜÚm,ő.[N1mźQÜC– ěŔřĎ#˘)ĆÓďEʆ˙ ĹOÜ%›Ířď7‘ÂŞ]F ?V9Ă˝1ŕť±őęY»ÄMžŚ¸ëŘV‡.*úĂ)ÜĂ–žgoń9ů)ŘţÇK•&Ä·F÷“f+’78îqÄŻ˙%`»ÍŘńÄŘ[Ö ©Siqe“â}i¶ZG™f˛t"Cť<P‰r`†EłŮ Äâz@Ł7ţgS´ gĎĽb«söA˝ő3z-č26>e ,ćq/ąBo|¬Ţ üĺQß~ĺűŢlđÔ§&ŁPˇX´(‚Ť´šIŇţĄç†đ웋ÍéąrĺËŃyĽDMĐl¦;m‡ýΧ!÷?éţáďÔ Wö"˙šCŢŽ#šVĄXpĺŃa_ČÇyÜGj¬x-ΓĄ¬°ŕÁΕ§á›z—ó9ů¬Q»:ĎŰq Fq‰6‹wőË.Śłn†Ń–÷/§Ę-·‡Ţ ő ó(Ň!śۢěÇ {Ęä4Wg0oďEÖšďp+ô%ű—|ÍűýŁÔ+Ö·Šĺő“÷+ů‹wĽÚmďQŕ7Ú`ÉŕŻhÜĐř–?ŤŤ˘ĺË—.\ąz/@!žvS‰ÂűŚ7Űů> l}âě`·kî°—­đÎ2ŔY_‘SËÉ»ĹÜ9`}˘¬¸rµđs†αÔŢ%ĂrîW̨ŘÎäT^‘¨gÔłÖ,E˛ĺ±päeŢ-”u› šŰ ó?ŚJ' EŔŁA'oŽő”¸5łýĹäá¤Č{–\ń÷ óü† ě”ůkî]ěţ(Óý•Ů™Pt @°T<›ŤD9Ţ+ăď ‹ősĺŐrü7›=ʉIV*–ń9ÜŚ»ŮţÍÔKˇű‰M îz'…|Śůţ‰ĚwŘâ0‰ţÂ?2ö‚~Ąt±Ă†Qłˇ ôDNc—WŁűŔěE·;đp„ŻXrl×˝ĺ§"ʶŃ~ąĂDYüÁîm—CŤú—îʨę2íF~"T4 ĘsN!8Đýčř„¦Ş¸”ĂâlOC&)8âz5FIAĚWPÁĽăŹî8Űű= ąîăîw!łŘ7łú`Ú¦Éq>ü¦ň~Ůę '΋—®ĺËÍÁ"ŘŻrô[ő*ó)ČÄý?âoĂą6qÄ«źRýŕbż™b]K÷6•‡CäoWÇ­FĐj]`СĚo±“<4“Źż Âo9†ÄĽ Akâw°÷ÇPEu-îîSĚ,ŠÝfĚĹÁ®÷­kEË.^.^o;Ľ‰÷»pďć;µßÄ7ö‚} °QÁ6¦Uî/Ľ !ŹŁ~¶cß"şĹD ˘äAĽôE_]ж)Q—/âo)÷7vĎł+({÷üśż[JíţFÚ?Ä'ýŔîżĚ á‚ŇŹ ^Ł:›$˙z\ą´L¸r4áÉďÔ5č“& *°0‚+­Ľd4F Çߌćs Í„9Á‚Ş!Đ}°Ó¤ČÓü”}ÎtŠqá80o óyaNX˛^›Ú8Ńxv!Ü´ůp©NÚ–~cëÄ'úK 6=N/R÷>bÔ˘ă_ĚTśüah¸ícĺxţx.©Ňip"2Żť–đQ)ČŘŽuo7ąOąđnnG08»ĆŤŞźPâWsjôË\]ŮDbYĽhüCf%ďˇpĺç;ibę9ř†¤_0dÁÎ ~ĽFaž4Mŕ¬Hc˙‚lăi¸ű•°ő¤ËżÔ[s~Nď+7ˇÚ ý˝fĺűpÓX[%Í˝ĎÚYëűMľŁÚŮwĽUsÄŮĆß=Îí†úó'‚;—ą±öĹ´^Žlă‚;lÄŻ’q(ÝÜyt_î?ÍU5ďÂ4ŮČéc—KĄ }cgÄţŇÄł,ążÔ۽⽠°)S–ýÇy°q[íŁgqA—.—Y?ŕŤxšŚ“I¬Ý#Ôţé44ćCIâ7jĚ[Îw`ťFđŇiă„aí+Š‘ôx đA¶ş Đ;/ó˛+ÔO©ľ/CŞ{—/BwĽŮ¶ĎśW}z‚÷ë˘+ièpqú'D9ö›Ć/<Îvě—_÷9ŢXŹ.«÷¤iąqËĄSZźĄ•H)Ç4acó´µŰ‡sfŘ”Wl[´áśmÔ¤ăsÔɇ3¸î$áś‘4ş\8Ą•”ő('i0s„ Îúo)~"Žt‹qspŰirôîT˝(sńäD77%ËĘ âĺćăľĚßyąëúwĚŰöś}Ť™v(đ—ąó9Mű/cú‰[÷Ü_Út’ýÍŻ‘Ůőâ70ĺˇ.]iIoö^ŮS¶>„Ţg©ßÁţá»}EÔî<}Csîq+kâlŮ?zmb¸ÍŤ rá•pN ÖMâ<Ŕ &HCÂh4š82i0iÜۆ˘}N0η‰˙´1{\8‹¶=?ŘňĘźáe”ŘOŤC.\«”îq ípݨ(ÍË—…EĹ˝ő\EËŔ;śÄŕË—.;Ęóń7­†—µîZßg¸´ßOřś>aÓÓ¸qř›Uř—K}A·ăݏ¸wű)_0}Ă7ĽÓŃqĽvŃyŞžňĺŃÇCĄŽ‡C®±O¸’Ąz”8ŕ†Ö÷73˛;Ůî>±ÔćUqü‹ď7—“&°YM.8âO;@Ňi2x &“…µdń‰”oË•7î ń‚YLŮIŃ<‡ďCxK*%?ďIęă ´€ ÇqűŞđ>ç2çĆ Ú•µf˝]ĺ멬Łcăr;b–ž4nA2ŽbÓâ\Ë8ýĄžÉ®:—ş{Ú§ű«ů,¸»Wźú—°':íÜ)ě:?ĵř›_:A"/Ťnź=řxë|‡ÂŕŰ~łĂüM†gqŮdëEzŹ8wÚ(áĂ(•))(Öă„`ädÁ““Ćx -ĽűOĽĽĽ´¦TŢSaL«ęp¦;;ÇaýC×Ě÷—ôbć‰K¸OŠ]÷°dä‡Ü3FýKđYQهąe‚ŚT¦S)ĹĹn»—.\o.\¸žĄĄ¸‹BBJO–Ň‚o{%’Ź;|Î4ňpŶĺÂ.—ř€/ŰË7ř{0ř~ٸÝh!J¨´Ô˝ |ĎÔÔ%d·­.MŚş_Árŕm÷—ýÎ:9 Ó6Ă—)mź˝n¸ră„ďI †“=xĎ ŠÁ®Ą $T×˝”ÂüŁ’żg–}î7Ăc¶Á0âżA)ŢÜŰG(k7›ŃĚí%řwľŕŕ3 w€pcig$KÄazŽtşt ęZ>Çr„Żs篹gcáýDžç·ŇďűÔĄí´cnŕ\ĄřбwđÎMó‚žwř—JâXy”DŘDôł™^ç—‚ çh;Ŕ:›J0éëpřź ¦g©ÇBÝÇPg2˛žâQőŠ÷„ß1އÇÎج ¬ şŕśí=†ľ§QżąÜ—őôŽ´;`uŽS÷łŕµU/Ň&Í ´mąčŚ)›ú–uňÔľĆ+–N9Gŕľ7—{‘ËážŮÂ8cĄËŽQĂŕ|2g·I¤Í×1oÍ54šM&€y*Q÷8M€đ¸g[‘Żr±µA'ë Ř󹇨(ÔxçÖ"s¦ĹKJ†hçŢ/^âTAŮ´u_˝$8‹Q3rô Á6X»ć*ĺS–7ÜtĎĽ›[ńłÚKď}BQîäŕe`§î5>R×ő>đ˘Ţ6"ęsFď9t>Cá˛C‹âUć Ţőď>ăÄyL:*9`›rčrtş].}4s¤Á °ć>š„ÁĆłAă0`Ţv0Űî-čó :=Ŕ±S*ú?R˝%AFäĽ[±Çxł—ŮăKĆŃ“;wý”:/§c.n* dwŽĘK—‚]±¨8 Ľ;Âżąč.|šúëw. Ą˙Ű Iv'ÁĆ6r~ĺśCcx*7J%!oiivĘMşĘĎŢ–­żß\[‡ÂřÖë›0.a6sëAŢ*ŰĽWX>h«ÜäeČmĆXáĂÓžaÄxÖbÉH©ŢM#&“Ŕd† fš×ŢmvŘ{•_sžfč0vâQ×rÓä€đËŇ2ÍŹîŽŔöCUéű‰xî€î^ŽĚŘ_¬^źzTů—ˇĐ?öĘĹQ¨ ®őŘÝ•ą°ő)ëbSźüýK€v”Ľs·sŁüJx?ÝćáÁő,–F’kAŹźQ·w™Ä˝b`V‡E/şŤśét>EÇ.,N3ÎB¶ć]Ć® ¸ ňĂČéVC~8Á.Ą"™zLrńžAĺôĎ?XvűŽßí‡nŕnź¸Öćü÷*ŮîYܵĺĐ-„Žeul|¦Šĺëąqܨ”ĆsłĂł5ž~9žńÝŽ/m@ —.ľâ˙e{Šđ[ŕ?öŽÓź©Gc÷?îSŹÔ­ËîQtđńöĺÓ-6Ý=Ëľt-Ë ĹÁ1Uo€Ňčěţ&Äp„¦~¦ŤeĆŠżP rŢ'C÷µšBét¸rĺŔÓ§lAíňîŕ„ZÂĺĂL©Ü2dŇi2d•#÷/’ťÂđyď Î.¸˙gqGbżP*µŻ(~âŁnWŁß*´\ĽŮ))ˆͥÓOî];ÎwB;Rq>eËŽ㏹ľ(űč‚wţ#É.}ĹţÄÚśĽĆ•ôlNżS€Á·ÉĽh©Âžers:Xá‹R啕薼ë…yŐw$91c~°ĺ‚ÄśaĐřXö şk_H¨_Qݸ—ś8aÎĆ9ráË©ĎÉ9‡$[â¬4šCQĺ0“ncÖZĺ„2AŕCÄă¤÷ÔłŽJ´çcî>łď$ 4 ěĘwŇ1_ÓĹrćŃĘ#ő-î^/2ÍÉđţ¦×ýĆ3”îüŽďÁ9Ý‹¶ pĂcű—ˇĚ6ß—¶nµ+„±§˛ö{ő:ĎúGo´ąéę;7ýśďä SSq?túEz‹w—Ž4‰&ÚQQ˙¶€w6aÖ Ţv µîA«Gýe/húŽŢŘčré|Ł´ˇŁ‘ “ CI‹®bݸ‹x4šH‡Ü żsä€÷)ěëv*î —ŽóĚĹ1¦ć70ÓĚí#¶…˝i˝7oüDw§„s.ŰtÜąrČ#än9śéä'?pÜ~'ů7XDëöËőú›ńĚéÔzpz—.*ě@¬Q»€™HďĚwkűô‚¨ôG‡îu}N§rÖüAEzŽŰź¸i¶®`§ °÷€<+C—W._/K‡fLKŽŰdXŔ{Ă.ĄĹ%¬âÂé2`É•Ľ!¨ń ľĐ8!IaóE[żY%ËGa9> xŤ2©†‹Đ-”}čąx­ó.÷ĹË—Ł÷>§˙ő,oýťďĎąP+,ż_ŮpOġÇöoUÇřŹŁ÷ ŚXÜâ\ Ô7őÁ‡qé‚é„Eń(‹MźSvJ›ëP˛Î`Ř™őá7¨řŻÁ±žăďÜ˝1v—Šq+ |Çf±Fđ;ráđ9|Tś|f“żľńQ˘đhTK™4š Y)˙¨ązz?©cÄ᎗řÔ,ťu¬pËłëX[(Po5ŽrďwťW7›úź©ú–ŇrÚÍ;ľçÓ,ŮŮŚöy–>Y»*qq}Ž1ně '2±]łŐŰ1ZţÁ66‹*ŕŕŢ…ů–“ŕT._Ш‰ÎBµÔ©ó–ýÝźq<ńAý—îńô:_®–€‰Ś8Éž—;pfŚ{gĹ.ř‹8ÍÖěEÓd˛\×dřKgü’Ň €a‘NÓýEÁűüy•ő¨-•o˘đ‡,˙ę—ť±o˘Z[î[î[Üů%çεBž1AGz.úFqÁpú @&–,؉D{‚ő;`;"ÝŘ·éÓsěţ›ežGV‡Äčb1 ÍáďŽvR’HěhçbżÄJjpĺË—\¸aC°‡„đ-ńą4“™GÜ4]ąÎ:łu¶‡ĽÉ-ÁÁ¦+0J9z/ŹŽ<÷”đ[±*Yő.˝ĎÄz —čţ@:ÂA{ź.ÔŠĺ¦ćŢ Üăí.ô«Zď]é«oę\u­J íó.:Hä-•Ebţ`ĹK+’,ÝŤÍâŕSqí©ń9cqĂ…‚·„;_Ż_x2`„TšŚšňâőăqu«Ś*`č¸üq¦ \Př;ĹćýÎgýÍ´^7\©O|CăT7yŔĆ˙3ź†nOą^´ @yŃy¸ŠO›Âˉd4:OâŻ-Č Ă­{b¶ă‡Ä¸ˇG.“ľÓĽť®)…J¨ŕYFČQ,ĂŢRSÔ¤LV—.€·C *°îBÉŢ <§XVh2hZ"µŽÇ€Ň> „á9ĘŢ‹xčwź^—/ăŘÓ›—6"TűźR»…ţO–Ţĺď/ęsą¦ńrńnδ…‹4pýřeů(î&|Ňžđ)ÄéţĄŹçţĆ]N†2č¶%\`ç†7fÇ,ż[C»*ĂZKľI^±µ¬ÝßzóÜ=Îg’ń~3mâł7¦ĺË"˙ł‰rńq^ĄčYrŤş|7´/ŽęÍNµ¨·©Ö‡©đJÖVě8÷—PµýE˘ýŔöŔşĹ¤-—Â)Ă[Çh˝´ EKÉŠ¸˝dŰIOě˝}Oęt“ťőđÁá埨9bSP-¨ŽĽ]@Dá˘ü7‹Őz.Tüi˝"ş–| ©rĺË‹ĽąrĺË0A#łRĺË—/ăGc7Şĺů7ňľ^!…ÓŐĄbů6[Ö#Î'1oÁuB’’Í<ň5Öńrҽ˜áç*ź†đc'żä4^O)‡I§› §¨3ýcĂ˝ĂńËń8i<'†ôXSÖ¤ź1OK]7/G=:řbč٬bYńę*ݦü¶ĺăWúÍjuhbó=˛©Ărβň],ć aB+,´‡Ľ»â3ž§“ĺ)źâ<čVöŽ ™ZŽ˙Pńš <\ńyNČ7‡qśV ârýŨ(¶łyż%é˝MÁÉxIÄS.^._fŚimĎ+c!Ëźpôó‹—ä˝7:Ú˙Ö/‹d6n=ľ°Ĺ§C§@ŮxöÖw8u>ł°Ăžóiç/ §¬qĽ]`Ţq $0ˇř‰á`Ţú]·?sć3ý‘ć_S‘ľťAn -[üA˛ôÜĽSłqó‹Őrĺéĺ®ĺˆíC‰z=}Ń.® Ô§ąWR˝"zNöKń޵C9háŕĆ«Ŕ÷‹ދŐó¤ç*WqŰH*‰U·ťÓuĽ»ßKĄŐĚn]ţá´˝îăHM„[ÉŔĎŠ­ťFÍň;Â^ÉŽńó9ć.ٙÅM{ŃEÔˇ^ >5ëن—©—<nv€ÝVŔ©Äîqʏo±Ä R}"j<Ă&. €ůŚ%ń¨O0§Łë}ńBűqa}ÚA^źSoL+Ô˛š|×\ĹoŚ‹¬\ĽŠ@ ;‚fÚ]ż8Ů—@Ű/ÝË™Pć±Wť “.ŁPß@:–ęé“A¤PoĎW6q›eCrú#ýŠćF|›|Ny&Î6ź¤·ÔądĽs,|xş –¦Éf›ČÓ(bóÖK—­´a±´ąrŕěKŃrĺËÇŇzđÓR˙š®\ôĹĽŢ»Ńz›ÄéAŰ¸Šś;`âYýĄîŘąő…Çpůđ§}oÚ.—.V˘ŢiânĂ.#ˇÖim÷OÔąrŮs„yňj›{~°ö%{Ńa7eúâľ ú'ČŔsŐSTţťŠ›eăwŤuƫǧJÚ´ŤK5\ąS5/_Ë/RŮäúHŽv–<8±đDôĹňAŔłnŽ"Ë×rô^oPąă†_R˛Ţiť\˝đ¨=á˙XÎy [u›ř•źYt đ-hÜ×±9`TrĺŮ ĺ 7ë ¶ scć]CÄ`‚ڎ•Xß»uÚBŽ™Ĺg'ĚJ|’Ťž4^S ĺáôfň·%é6Ázě*\ąsŽŻ7.©\ăiµ_ćS±-srĺ[\ď®ĺčżÇÖ%űĂÄŮŽ™apzÇ"ÎP˙S™ó† ߨ¬CŔ*wˇ‹[Á ›{ŃrĚ1B)ŃA7Xh] šĂ*:ąciű‚Á{Ź8ýŕÁ˙: “ÓČ[Ŕ0hb&.6Ř…w‰Ĺ90ÚľŁĚŮOäÄ ÎŇžĺ=ʢŢ6ń,^‹Ŕ`t AĽ\ŰC§ »Ë€ŐďxĄĽĽËŐrăÚ\ąrĺË—/].\Ľ*"ܸ¬Ń~ Íęć&9śmʏĆűGeA ¶}OűN§1‹˙ÜU±R˝éç中\ ZrÄŢgÉd·Ü¶\îZÓ˝8ŃÄt$ľâř Şĺ#÷¬D˛ oAá0ĽÂ {”÷Ú*âZó˛uĐZOX›á]˘Ű/YÜĽŢU0o7/v}E¶Ú÷Š0›|DI}K—/WË—‹—.+|3ę^«ÍćóyĽ»ÄŔíń‹—ďís’|N7‡q‡¸NQ6ř'Ë€·ÁŠ0í»Ěpŕ<ĽÁ¦é7ôŔď*ô‹‹ť.9‰Eę],»Ce\¤ůśˇ¨Ys†Ľˇ¨7ă5Ö8!ëćţĽ@븻׀w‡ś^x—ŕ[Ööţˇ/yőŞ÷ĚýMW.^ —.\ąrňˇ++cÄyŇčŻqo<´^‹ÍćózŇp–“gî;K¨ű%Ó_Čű?pkęo¨Ź˙±÷ď›S—™`˘nłŽ9÷9Ř‚řlÇ,ް͑ôĂŁę.™±ŞxÔ§šö–÷ŃđĘIuBĘ•Á jˇż€ÉRÚč›~ÚŁMËŇĽ&ÉO¨Ťń§ýŕi†ź·śąĚ-ć\i7‰Mk7` < QęFŮľDlď˘đżő ę_‚óyąÎlÁʲďÜAŠ‚źSg‰¸Ä§¦-ľNHá6éž»Î97PŘW–UîěEëd¦ŁŢŤëąWĚŘÖ=%Ž·@އ†(F_ë.jĺV/ÚqĐE·JśĂbŁ—SÄ#Äłń*w/Ô\ÚQÓ)!x˙á¶ň(ć ę5Ţ—ÖFđŘ ®2޵‰âąETvcÔAʬ¤ç?&žľŁŢs›†B.˙Ë–N]§ęźDd‡‰đ2ŐnƧhŻëEËÖ­ŃŢo]ćô,aQtÚFŞgĘXĘ%™·ÔwYÄZGÜuĚR˝űž˙ČSá ÖýýĎ–ň·”ţ˘%ĄçZoÖ]ëb§(Ц˘ĺÜľóWmÍĹqÖŐéZÁ·ĂÜm>§ÔçáĹŃ6~5‹.ů›<‘ßűŤ9ţÍ´ď #H#ř#[lłŹîV·‹mé˝W..»ąâq‹›—îte%g´upŠ»‘Eí;ŠG‰É» ô€8É» %Ëő««ĂyxcĚąsxsŕĽŢ‹¨±o]âĺĽË®®XĂĄÎ7éć;•:®Éw 劬Ăuő7żĂę*娅ݖz—-÷÷©Ńiwŕ(oáŹ,r;?ö•Z_˙b±÷Ά‡Ó"ŤŽĄďޱĂ6gÜU¶.^&îaDňĐâcđU}wxg,|bő_nÔ6Ű„˛ Ł÷‹Á˛ÎIx7ه9ű‡ŻpŮ„<°w"Ţđض\¸mg¨GşX¸8ŃÜωÄ]ŮrĺË—ŰňrG—79KŃz.sˇc/Mć—ř% ŽYłĂSnĄĽ,ľµn S`^%ßŕŠríń=1ݺ;fŢ —¤j]ĺÖÁ_m.űźÍ?ďÍNL;‡1ÝĽˇÔ}NεŢđ†6śÎU¦ôűĺúJ7đ‚Ŕz;D#ßxę~üW^!íq*}ŢÎ1í˘ĺϸ‰Z–q.nqsźĽ3˛=Ă…ŽöőŻě1Ń;cŘ;a°÷.§ß2ç{ÄľŚ*O—’<ş9âĺćÉz—Ys|Đ;ĘľŁëdˇ˛Ů8˙Ô¸;׳înoń;üźř¨Y(—íŹĘo‡ěśžq¨oâ°˝\ýégWهL6C8űťÓŽ%ťĘJJ{Đqžˇ j8çŔl0‡‰C\JLĘ`ŁÜhăđo‘ĽvçýřƇŰt‹ą‡t˛"g”ňCfáłç‘÷ÔCbâýĹżą»gž§Gćpßu9łÔ?Ěă˙sęwÎxă*ľÚž§sŹąA»ÓB^‡Á˘çýGú01=JÖ6h!8AŰŠ3ú›e9Ä=Cµů†×ďGz \˝)d§¸q Ľ&ćażĂŢ•˝tĂ;Ćű—ěŢ;¬ţÍ›v;u,° ßë˙´>C)ő))8CŕDO ËŔďŢNqĽ>L¬¬}"'2ĺĺoYĽŢÚ…1ôÇýJ^_äˇ8‹î|&ě~cżg©î¸©[>`–źłÇ~%ËúJp,ľĺř]^0…8ŤŰŕĘ„űÚ|ŇljRĄÔYľ‡ ę;dâŔâŇśK–0s%ÄÔú„1Ţ7Q aŢSę1˝)?ôr¸V›%Ë&Ňĺč8ЇżüNÓ)÷6|ĆĂe}K·eľá ůí” çÔ0·˙eŻÉôKrÄv6%°DĚąrĺË—ă´ąrĺę¸îTŘŕ÷,ćq˘óoÎ6ÂŃ.^o7ę_—Kz•ď|ß©żl©ńÜZŔvĎ˙%u6—8ărU–ŞZrKhÍž˛ĄÖ1·‚ťOtřĐcé”çrlő´[]ă-ä”#ďyoQ·›•­ 0¦ć/Ň-g©ŔćŁhÜýĎś<}CxÜ) ¸ÇÁý†Řş'2Śfç˙%Ą8<7¤qý͆Keľĺ˛ŇÓé” K—´.L^xťS“†_IJ Q@›MĄĺş``üTmË›—>Il~ŁFĺů—ń.CÔ.Só+çű÷9%Ë%Ë”@ĺO˝ça>ô!(x"›ĘNĄéÚQąŤ8ŰĆ;‹n‹ő’»jŘҲćň˝ĹőřţĹ>Đv;w´ęu80˙Hě‚ŮÉ+ů¦;}F§î[Ţú n~ńrţ&ÓęSĄČ×…Bz"¬ď~"_X]wráłëAî"ń>L¤¨Î^"«n›{ĹŽxYąĚÚQ>ĺ°ć©Ç3Đ•˙Ć~ămŹĄzŚżm)Ň4ÁÚĽ†_PöçÜs9 ¸ŕćuš/Jţ%ŽMá‹Ĺ?ŕÁ‹Ç»br®^ĺ^ďö!űx–e$[oű[uÔ˙rŮő/nsĄ#d˝&í mĹőĹËÇa­•oüđܸ¬ÖĽâą~ł÷/Ö>â *~Ąď~¸Ź˙©Ćľ¦Ű’Ô‚ŰOť&ť5?{´Ü¸‡¨™÷ŠŤÁA*ů•ÄÓyŁď.oŔ)Är˝K”;ʬWS¸nbÁ±ýť±ć’ J™-ĆĚ ë7®őѨ1#łPě÷.ĄŤËÓqăvć® r˙QKĽ÷’§ĺ‚Šî1hßűŤ§Üé‹_iŐ0kfęÂ™Ď ç…ęvd-‡ąrĺę­źäQ.^‡×ű/źÂÄNw„×â0ÇqĐ+ęQeß>~aí(8ĐáŠÝŁ–wDŰ—3ťŘ;Ü÷—ÔŰĽw¸ďżö˙bw|Ď­ă¬Â· Ö˘0»éŢ>°#‡ßXç™YKűÔ>±âż7KŤČ7=ĄŐJ¶;Ă‹ĐËú—‘*ą"™]°ľ_äąyçżXÔwHËŤTëź$ç h#Ä.Ą {—ć®^„űebóDD±R"xŻPC™ąŽŮ7I˛{Ç^:‡0cQ<Ƕ«Ę˘˝řAbDď~=Ĺ˝ŹÔ8żQŕ=ÇÁęm¦Î8”E}Ĺ×Ö ÖNeęç Äłť?pobćw^§Ľ˙˛“sŹPoHďËx×^+ŐNÎ䓉ĐÇxňľ˘ň—:ÁÎ.ë¸;e[źüąp{—/ýC‰ŘÓdćŮ~âF>˘ Ĺć媥{+É/*ÁÇ/Ëń!ć~Čč.ŮDV«Ô1t“śöC™TLńĐK†$ăÄ&j] éëYÄŞçůç1őÔáűâl#ťáÍúžŢâí%,***[ű€1{1rh ęĺ"!ńźIişŔ©ó‡Ľ/ţÎ7ęUËNt;‰ćĽ Ţ^«—Ťµ^oHĽ ŻîY±×0z÷;©Ó$X¬yÝ›tK]mű™Ä»‡řśłĽ0M˝GÜľ˙˛“rsąü‚ÎbŢ\Ä ÎŠ{Ä7ł¸ Ä÷˘‡ĺ.-ĎÂĽ óÔQ-6™Ľ!II/P V…kËÉ7±veí@ËĘF)”č§ n•jéĽtÜ9ä1m©Ű€áśG¤ľżłú•5řŃzŃĺĐpŕÔ!¨m‡G¨µüÉüŃĂ^kśó*š—âąsmW§Ógňíű‡8 ń´¤]âťńuµŽ>Y»ţŁ´ëîrâď…LëęÜ7ىNÓź¸´j·ŢsŽ1ĽĽĐůî0lňŢ›ŇÔۨÂČŚßEi 4®Ńć=«/$1á•n 4^v•(đŢ•KRç†yPö—Üy0łąîlćQß ę\hsJÚ-ÁN‡#ن•ŕćłŮ‹Ç)FĚŽOp|ü/Ëxą·r˝MĚÜąőEVŘ5ąÄáĽC´áŠÜńÔ8Ŕń áżÔi9—[7•Mçqntfâńţńó ͢Ôěxyj.\ąrĺÁ+ ż‘ő®ĺËŃ´żŢĺŢPy%cňŠű—%2ź^ Ś`Ópo|3Śé÷ŽŁ_ăŕ˝k©đhąz ĄŚżsşrAŢ-Yî/bĎ–<·¦9tX`´u“l…°â ŃËK2Đgq/x¬řâň’’ýK{–ŕó»:oŔ2ósfS•zć]ÝwDkępŮ9,Oń*™î‰.Ź©vĹźęsٰq–u‡.tÔí—¶ćgň;K—‹—Ť°5›ńᨹ7…‹—®ĺËŐxąrńvÚďJôÎżRŇŇ™LG"ڏs8'ýĄoAÄż;©b¶ő­KKe±˝Á:Ú{ż±ţ˘Üq1q¶™^ŮD7žŃPŁ”ăąÖ9!ĽĽâ k¬ŠsĽ Ćx—~;×zĹůď@¤±”Jq~çú‹|EÇŕĘy¨ ÉÔN™X7ú‹Źó;¨—Ü}hyČٸ€¶)řĆŐOŘ‹9ţK®%Ë—/ÝC~ _3Ž%ÍńSOĺË–ËŐz.^•DçMćü4Jz++ď &(ć^«Éç˝|CŽŮosďśĺôlˇňÁ2žeDŤŐNLäSXë#IŃ+Ť$6cąxő v±ZřŐN ;;8^żążËńń6‚!âns÷´¬¬W߆ôZBkäśnC/EâŕŽ42§ú€°Np÷† Ţ ox—¶Ńß Ť; yÚđu:ŻEË—˘ĺćÇ7˘üĄâ.‡M{”%ÝßăĚů9ć-Ô†ďhśeŻq®§&*r­„ß}&„¬3î}Aéâ*i‰Zw[O‰°—î ¦ ĂŃmŮŘżç”đóŚ\J‚ÉÜó¤vxŻ@Ô!!gýřĹ ;H•›Íž7`űÚâWą±óy˝'™±-pö—ŠŢ,”Ŕ˝J}A0ö€8—.\ąrĺčéqrĺË—Şĺé«iz._‚ő\wŽ‹ŠŘh˝G[ó;FÖqˇô”˛‰ÄŢ.E2áńĚżrď;ÓCĽă‰ĎÜ=?©Éż$®ˇ¸“˝ľ§/ÄöĂoąţŕĽ\ĽÖ6›EÔ°—xE´{׹—ˇ%N éJ]7›Í桷z(۸«Š=J">ńPu?Á6>e˛âĺ=Í©—Ąkâmç·gUřn-÷ÍřoUčŻÂi˝wřŰ7+Ţo8†Ďú•RˇŤ§Ô.çł,Âŕ^ňóó>˙łüłR¸•Ü^ˇóľ›vË:%Ď˝#Rď|Ş(Ô?ËK˘ô-Ţ+—¦Ţđ¨—/@Ó´°Â{qXÚKĹJ”ÉxëMÎzn ßđ/ěËđÜĽÝKś_žüKËλü×Äălnó•ÍÇ×sjÉŢX7Ä6¨F2°µe&J~!.}gŇ x›đ@Ëő-ňT|ţéůĄ3Xą}˶ô\ÚVoEËĐ­Ńy{ÖŠľĺC¶/ ečëW=&ódżÂCž ‰¶n^«ÇQá˝w®đš/łv|ă˝cżäčYr˘őľáî2ÖČíł—gh&(|¸pµfŇÇ’Ó)Ô"ŢFś\ç;KĹę%ŰżŻĹ˝.öÔšW^ —,ő6›{”{•ó)÷›ťę¸·4--÷/^Ąéĺ/Ař+—.\ŮçEËŇó.ő_šĺËËľ›×Ě 1~ü+›zeúĂ•ŠNqÜîĚO§ĽpÁ¶Ţ Id¤}#ŁoScÜŁçŤ;Ş;Ëř—ă± ¶üˇ­ŕŢžbJ®őď)•îm——_,߲Yë!d˛Y.^ŽŹĐąrĺË—/ÉrçC/][ŃrőŢ»Ĺćň—ăĚ˝ˇô^[Ąĺ%‘ Ây±§€PLTEţA}Ü,aÜ8jÍ2a»%Lń>uâ,]Ő4e´*RŇ2bÂ.Zú>xĺ9nÄ)U˙C€ă5iő=uĚ*Yá:mŇ)UĂ&QÉ1^Ř4eÚ6hĹ0\í/eí=tę2iéxŮ+^˝,UŢ+\Đ*Yő1ié0fěšéż~cεÜçÜ{°ŕ“9żüĆkŽ űdo¸˝‚-ŕ¦Ů­ßj¸é?ęĎÎv,˝Ć:#ŢôKÉR*ĂÂ`P©„+as%x^Ú‰®Çëqf·ő¸:ľŃ6´ĺVvž1^-Ŕ^‰ýŮlruuugUÄĚX­ú1,çJş›Ăá^É­«PÇŻëx‘k †śś oöGŻ_˝úř‘Ô0 ă 2¨!„Ő: ™9UaJjĐ«„KĄiµú¬ś{hŔ —rµ٧őc˙ď˙~ń÷źß_N2ŰcgČešAJ˘ $$UIĄ‰–VÔąx<żUC„Ž 9ů奜nÂ+¸ĺövŚ×/ţÍíď?aŁ CŔJz@n!Z˛L˘RQ†Ă•hiýšâˇ~8­-—sĆĄpK¦CBüűĹ>QľżWAQäÖčy/Í+Ńó y+Ą ›Ă%Ëz\ťËĺ g Q ,Ś2^ĽřńýĎďß˙|)Až0ý­í†˝űJĘ6›YL_'Ŕ«7ÚíÎAGÔˇľT3»Ľ• #Ś?ţ&Čź“#®ĄŇyÁ°b¦ (±|/öz+ásŤŐf_2t ł†EˇťS_«®É#BŢŚ2^üřńť”ĽÜ‘Q¦”ß Lá¦Tč)î{Ş·ÚV]Ůoü~¨Ü>źž^Ż«Ż%#Hýv(äoÎřń1yů}Rb0ILÇoHX\ëűą˘ÁIĐńëמö_ńü =óĘyte=>YżýřbLR:`ڱ3)ÚŽ%J^Jů‹`ř•ţF?U(TRŰ˝Tú×üÜ܇Šy0H1‰xćó•ř˛^ż}ýڱżĎ/'GdçľHQ™ęW ˛dĄç Ě}bĚ˙ŞĂôSĆPĘyz]d˝.Až?^‹Ő1†ĺü<Ě< ý>P˛Ô`đkîĂŻ_ečPü`DSWEX'ČŹ!cźéxýćo‘ňd¨ÍčůůyZúE¬ďÇ ú•Ę|°ř~°ŕřc6Xů”»¤^Ż[<ÓńćÍŮdg„=㽊X­XÄ{VýţäŃn*ŕlÂýj(Á!ö WVâ6a™ýśńBbĽ~=&„0«Ä8ď™{)¬\̡Y¬č4úG˛Á` dŤľ?TĄµŮ%€kµżb^YJ höĹ"dŚÄx}6꬝ť3 gôNNzP’™Íd2łS,úQ…J PHR°SźLB¨JĎŐjuđieE(•>Q->ÓËäËŃp윦×#J*PĚĚ’TĚÜ4B†‡2E>Rú«Žę){ÁˇŤę^ 2dĽ9AP?FŠągN‹łÜŔşYĚBţźEŃżčČdN«ţâ𳪠 6±ě,,ěKÎ’Ř!ĎĆ č?NŻÍÁ`€„dBôt´H/”§x™)úCáp@ ŻC…P hirňŁćÇsmĂgO;—dzý§ü ŮŔ’?©`>ďn2§áâ@úZ 9Ăô Ő@p[(­bÍë}‰1"R†Ś3Ë™EoٱLźä±hH©üýŮý<;»7»WĚ8Ş $˦ę/ŽBN`ďVł0 ú+q†föy‘aÁ]O†Mřhńćógł9j6˙Îrŕ+W•ľĂáőzĹK¨ë;fí˘×<%ÖÁć–łťˇnŔL×ăkD0›?˙üą·wš)z§e‡×áőޡÁW°Ôl·Ă!;šWR@ĆŘ˙?Š'†fúč¨nfŚß™=­–éťă$C#Đ'Kůş] ˘K¬'l< ÷•~Z?­Y?:Ú·ź?C{ 8ĘŇ›O’\‹~”i[e*ŃĽá…ţú9cF3ă çě}5›żš?+!dďÝěi9‹yË岣,$űUĐ”Dč'On/ĺrŐ˛ y¦-ĎúR”AVňŚň™BR~›Ť•E)ŠB2UH&“…J2Mř6ńRĐĎhŢĽ~3ć¬q†>şŇŰNćżšKÓ_ůüŃĆĆîďŻĘ= öŢííĹʱĂrŚ”0ĘĘ´hő?Ć!3 Ż˙;CSęńî0ţ`‰ŻůAţh“lŚ‹ĂĂÓ‹‹‹Ă2\v‘Éž1 «TŚ;€Ě°ĚuÖŚ Ť>Š~0ŔŚ•LŘ9ň›Üöß]”OˇďŢ".U@d'"b]ý‡9Ź®2%Ö™…±ĚšąĹhž»V[Á°ôÂŰaś °Ă‘ČŽd20nNc‡ @EúâŰ·/EßëŻĐD„Ő/U—— rµL®ęq,ĐŚ:ëgNe­[,çsń›1ĽˇüM2/ŰĽą‘eŚw‡Ţ‹ĂX:}řEű Ç…vÓ&”?T¤AőH‚Ł««¤ÄşđÄ “ 9ŰĂćő`0ś¤p¤˘Ű# †ĚŹp~)Ç.b üşX6™LŞ?®°6»ÁDwťŁ 1ČĚŚŃČsŚ%GA{a„ă÷ Y1„÷]c KĘ’Ě@ĂĹE,}śN;n &ť]5jŕ©BýÁ˘gg(Ť±JŚŤŤ1(wŞś±wŃOĘR7›2Dą_N§Ó_ŽAHĎ;üţ†Aw5Q‘$éE5ä.«UrVNd<삤“aEr•÷pĎŰ—Ą 7›Yż_¤ĄŹż¤Źçç˝(qPäęęjQ©Ô é™§C>Ă ç%0r¶8‹ĹĽ˘ =1Ľ~$ęÍ ®ůÁ ď(—żĚĎĎźŮĺĆv5f`Ä? Ś1¸eÇA9w•e–jăÁ~Ä|†ŚŞČ(_ŕŇ( ek+dÓ©PČq‘ůi<ň »WĎ,w˛Â”uv䔓!cŘěIŇe0ƬĂ[>-$ó'ńu0îO0˘Ź’…"MŚĹÂZn`Çc÷ë A‚ćü†•A¬r A("˝ŤI#XQrŚqxŞ „dÔ7Ôë„8Y9ů” …’ë'ů$ aĹţÚ‘]2Q­ť0wÉö-gŔa0µŤ˛×n€ŽBŕgUňUěŤÖď'ĆşŠC>}ú4$·×Ö¶×’ @dkyűÄWńíRŇ ~•µŐ"DŽ]30ěöŤ0‚ń34Ę(ÇŞ@VÔ€@AÖ `­­­ĺ1˝ú×ňvŽąbĎGŰŰŰHa¸ä¦ý@±Ňˇ”™kŰ”´1ÚŽč#VŢcĺújť!NN¶ČŻíî‚"+fÉ䓿&&ěW»ůµ5FÂŕ¦ř1ě›±ÚlWmĂň,jEmLŘübŢ0pěŘ=YűúédŤ!`»y?SĚ2!ZJ臄í¶!gĺB./ŃÝ5ňön™AŞbťÇĽśĂ™Ç+Uüżľ˝Íůdž™ AIĘF CHŻ`h —$µ]LŢy»Ľüvv¨ŁL /µtGˇĎ„\ĺÖŕ),Îx–%“dF!&<Žđ#•Đ;˛ĹăWśq©íúÚv@źUá{8„¤ËţľűSŤCµKŃXË3B>)cdŁ‘”µ;˘‚lÄ|^*‰•Č…°ă7şÁÁ[a:Ľ"#–ú~YťšÓU|[T* Rpďeý6ů wÁđ#Á˛jŃóôµ˛ĎA$†Ęv AFš¦y9ŰÄ`@É +ú2ŽwKXť0:ö$K6úKŞ‘Q!°ŽCŠş n‚”Ří»klR‘”ő‰ĐGălo:€ŔS&ÝDÍ~FŔ詹µJ©ő$ëŘ R{BΖˇë0†Ý&!HEŁM¬PqŃdęP8t:Bu:™ Ąër9±Ů‚áŔ8kń@§ó™Ő— ]Äçl…É—o4RŰş”LJąo­=ĐRťG#™6‚ßa:tşHÇÎ+n#)!4Y42 ˙ Ŕ¸\>X×čń´ZÂËÉWšńÜ’"’ł±÷»´´¤»7ŹHQ~{B,ëMžW`4¨ F1ăseÉ•Mx©u,DńăVÜŰb\Κŕq%19ü#·‘Qą2„D"ľGźŘž:íMZŢ/ˇŘhčśNµ“Ż+L’ %“±5Łq˙§ł†ĎÉ Ćo´âř ¤0—sKÔčžÄCÎhlśCrýß!&ńÄyO6Bµ6ÁŞÂ´´¸ČöřY§Ó$¶`@jŚá>˛qÎ:,’anŤyk(ħC<" –€ëuÔ©&|>ťa±Éě„zĘÄV‹)#!đůwć˙í-r–›SB6Ű}ĚşL¬ôg6sş,)1)SdÍZ­&BFĘýóIÉÖ™ň<:ť …łë$Ë"«¶˛{{NÓaň)@ÜDćy•Řžy«#E$+ţ"–HŇU9Q*pŻ«ŕwµjiÂaZá•H±â´2šŔ¶˙’[#Ś©),ßuf#:“ŹĘ˙䣠d=SďÉ[B­Y†Ç·±a–UPäłY'(¸·;Ä"żţ'ÄľÔŃE»ÝÇeŇ|‚µ„ŰEŢŇ1z1\.‚ íjÉhâ­H)LłĽüYwě,şĽV;§Őv#”[€4ănŞ–`®Ă…đńŢët¶[Đòޑ“˙éŢßą¤©}‹"‘ w‚@;ŇGťÉŠ]ś &E¨ µ'wi¬ĎűĽÎx/b¤©}|RR›Ň¶Đ•tbŘł.®ckË™U8[Î,äl5yÁ‹u€Ő:#W?ËŕĄ{˘)i˘ń6›"DP@H—‡„mµâÚ‚×¶ „X­-…X·ŃXë8îĆăK6őĺX犙’{¦„(Ú‡Cü w‚%:Ť‹W»k ˇŘr:Ý-\Q–®Ä2Ł®Ç1?Äs†öć/)*Di6ďŤR«µZîD–ĺ/Ţ˙cKá¬1łĺĘzDČmťAâY^6ŘF!K]ă= wYłéą÷0‡„8AČ*ŘćÇJNÂÝŮŞ)Ř«–S˘u ˛qpŠŽF.ěYüX1ŢK:pżšF7ô ÔÝŠ„¤S¸=lônťL „ląk rbă’("$'BŢvlO]eB÷”\Ú¦ŃH±7j…&ĽeTtuŮ„;á:^  ¶Ł yďî8$«Ř‚Ý”ŽC%mY^^zR˛´ô8 Ą0^xŚlÝZâ1˘h%ÜžšG멉YDbś[nôfr[ÖE»ŚŃo ë"„âÎ ş‘,éxŘçDŚ1Ńlu wí1ŇmÄ=Z˘¨Mą„ű 9Ń­IJ®Ů—ĎY¶Ź6á·\Š‘2XŰîá¦n÷Ţ`wj%(čÍ'ČTÍítßÝą)ě[\ ëś"DÍ„pČŇŘľŘeBćŚsĽPî[ďß#áBHIm¸[ŢyjŮâj6d"„ED„T# L¨RT(Çîďß˙ő×_ďlMč+i˘oÔî(ł·ÓsÇ!YäÚ–+;„\Öăę ń‹úeĘ/©Őó~âŕ­qŽG%aěľ­ýEFî˘éŃşµä3î2· ΄¦ab …‡xť;K„´‡ű‰¸1.DŢ’×îď»ŮG‚®Źť–&ˇ“Ř“mŐŕ­»š“ů‹˘ÎÜ]í!D‡Ŕ«¤9bbdŽX~dměmâ/ć.ť‹ü• äŇňrîş`Ŕî¨â áâżOG0čŹ mŘŇýiĂóŃ[ץ—Öřřčy˙ţ}âĂ FšŮa”D‹ÜFÖrqóqŠb´Ű9ö9°Í.§sęĄj˘۰V‹Ü˝ě*şĆG]$ňŘJ¸yč‘`Mlř–m€x˛źnQ ĆĂűĂv¸RYůç×ŘŕĄôšCvAŠń^+hŤT'ž.â‰PYj)żjT"n7§ŔZ‚ě`Qo¶suúđhłrN,W|$ŇIŐŢE•bĽ÷Ť]Ł›zo«Ć&Ł÷Swî–[˘ĐÍé“ &źˇ!lćyčss•-'ź™ĄXĺ6Ö–:Rľgڦ'‘hâÎg;Ś>n¸ÇŤÍĄĹ(CĚ–ČŔ–H˝^'€šv›Š>†Bä6YűĘżľÍq3˘‘`SaŁú-%Ťsn í咦ŢPßĺ%OkëÁĎŞ*QČ·/Çóżćçç?|ŘCž%ř4ŚŃŤÍľ-făcŔ]¦E¦¤^gß1l0Ć3 v`ă—‹Co:ýëx~>=?|úáĂÜ·&ë±E:»O·řDJZ ÉŔśÁ ôçRě/ŤÄ/F!ňű/±˛—>÷?žf>ćýűÂk9ź´´řňâ«V–±‹}®d}ýÓ´ţěěL˙Q݇,Í‚ŕ(Ó÷#Çi’RŤdţ¨eĘŁŕˇVk$˘ † 2A~»ľ2ŤZ¤oy-ŔŚP6}Z Hůr€A@™ăgœ˞6G‚¬Ŕ“ŇׯzŤŐ*ÖĘmŇßďčCT`ŽŹÓé?-B"úËÉ(˙C'±îrń1Sü8I˝"tIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Love/styles.less000066400000000000000000000033271361462701300241760ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #B3274E; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #fff; @loading-text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); // LOGIN @login-color: #eee; @login-background-color: #490915; @login-rgba-background-color: rgba(0,0,0,0.5); @login-box-shadow: 0px 2px 10px rgba(0,0,0,0.5); @login-border: none; @login-border-radius: 7px; @powered-color: #ddd; @languages-color: #ddd; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #490915; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #fff; @folders-disabled-color: #aaa; @folders-selected-color: #fff; @folders-selected-background-color: #490915; @folders-selected-rgba-background-color: rgba(0,0,0,0.3); @folders-focused-color: #fff; @folders-focused-background-color: #490915; @folders-focused-rgba-background-color: rgba(0,0,0,0.3); @folders-hover-color: #fff; @folders-hover-background-color: #490915; @folders-hover-rgba-background-color: rgba(0,0,0,0.3); @folders-drop-color: #fff; @folders-drop-background-color: #490915; @folders-drop-rgba-background-color: rgba(0,0,0,0.3); // SETTINGS @settings-menu-color: #fff; @settings-menu-disabled-color: #aaa; @settings-menu-selected-color: #fff; @settings-menu-selected-background-color: #490915; @settings-menu-selected-rgba-background-color: rgba(0,0,0,0.5); @settings-menu-hover-color: #fff; @settings-menu-hover-background-color: #490915; @settings-menu-hover-rgba-background-color: rgba(0,0,0,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Mobile/000077500000000000000000000000001361462701300222605ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Mobile/ext.less000066400000000000000000000006141361462701300237510ustar00rootroot00000000000000 .b-login-content .loginFormWrapper { width: 90%; .wrapper { padding: 30px 30px 10px 30px; } } .thm-login { width: 100% !important; width: calc(~'100% - 60px') !important; max-width: 303px !important; box-shadow: 0 1px 4px #ccc !important; box-shadow: 0 1px 5px rgba(0,0,0,.2) !important; box-shadow: 0 0 0 1px rgba(0,0,0,.04),0 1px 5px rgba(0,0,0,.1) !important; }rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Mobile/images/000077500000000000000000000000001361462701300235255ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Mobile/images/preview.png000066400000000000000000000017011361462701300257130ustar00rootroot00000000000000‰PNG  IHDRddG #í-sPLTE˙˙˙UÂÓ~#IDATxÚěÁĂ ůS_áUŹ 0't‹´—ÚIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Mobile/styles.less000066400000000000000000000001021361462701300244640ustar00rootroot00000000000000 @spinner-background: rgba(255,255,255,.4); @spinner-color: #666; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Snow/000077500000000000000000000000001361462701300217775ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Snow/images/000077500000000000000000000000001361462701300232445ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Snow/images/background.jpg000066400000000000000000003414611361462701300260760ustar00rootroot00000000000000˙Ř˙áExifII*˙ěDucky2˙îAdobedŔ˙Ű„         #"""#''''''''''     !! !!''''''''''˙Ŕ8€"˙Ä•!1AQaq"2‘B#ˇ±ÁŃRđáb3ń$‚C˛Sr’4!1AQaq‘ˇ±ÁđŃáń"2˙Ú ?üTf™( € `7Xh€i&‡Zë©B¸ťR@ŔiH$PP’Á" ŇÂP p8 p pDLPŽ Ž¨ŕp8`6*A@@H¨@ŕa(CŔ8*©€‚ŕ ¸" @@P PH€LHQ! ¨)†m‡nź'Ż8f¸pZ˙”Â^|‰÷J›uňUéŞőEÓ®’ĺ‘ţ‡RUý©Ë[ś™­k]¦ôN.C–ôµm*»"'Y­·^ˇŐ_»ô0ş‹ŰîĆđbíÖ˛†¨şá¦5Ęú˙±}kZÉ«keŹ7ă:Żę1VK“ă·C4˝,ęśÁ0F“@@ ° ú!@ADĂ*iŕpÁ©€‚  *©€‚ŕ!S@@50@ŕ€†\0P@0T. €‚ pŔAPŔAPÂC`D ‚ŕ €‚ÄŔA@ŔC(a ¸A@Ap(` ¨ ¨¤EĂS@@]H‹@5\ ‰@D @@ (((PŔAP@ ¸ (*¦@€€‚ŕM"‚…L&€S@€‚ D $PXšE@Š$Đ ˇL(6š9…¨Đ}‡H !€° ˇ€b )@ P!€Ştj¶MęUď6Q˛ ĽŽ¶JľJ¸ë>L@Ű“µ%hĚÝěÔ=ZÉ4‰$ˇ0¤0@@RÁ Ŕ Ť†@0€ň0Ą"4IFg˛±Ç$P«ąˇZý‡g¨*$"ś/¸ KÔ҆ĐQH €…„0 € …ŔŔP8 8‚8@@Ç(*@ŕ Ŕŕ`L(8 P¸„ pŔPT*@\0€"Ŕ@Ŕ@5‚ ` ¸0T08C0€¨aÔŔAPŔëkU5W ŽÓŻzŃŰ“ÜKÍ{:ţŮŐ‘WYäĆÝx´­ĺ˘ÄV#ŞęŔńa¶Fř´ żädZ4¤čĹRÜ•çč:Ő˝ą'ปÝ,řy/ÜĽőńëî=‘Ó‡¶ßĺ)ř/&.TáOĆw ®Kvţ)A7­ňWÝkE˙˦ç÷hk“ µU*řĄ¸]Ź> rcxíĹą'‰ DDÇĐ!•O‚ p@Ap@E@@@@@ŕ€‚áČřk €UHzę‰kÓ`" €€ €&APéč= @@@ Ŕ@@@@@@@C`#č8&>Ä  ° ¨!Ž4.Ďq“F…gÄhŇęŔÎ B !—ÄP¢ &€‚ €‚ĹDP(`L 50 €şG¨ €*ÔŔ & @‚ *S(P¨!ˇAb€$E@i@Š h )A-T7Z· ť¦M)-CZ ă[Î… Ąu;1:ľ0Š\*án7ţ eíú¸+HőH›rNpČ&Ît‚J¶¬ť‚“B(–˝B(@!1€ m@P@Ä€„&P©±€T†·iyÂPŠ–ÔiĂâËJŞŰehôKK’&µ¸}B mN˘@Ŕ¸$0€p4€`¤Ŕ A$’* ‚RT(‘Ŕŕ*ÎĹU&R¬&U'ąj±ő$µ¶ĄÇÔPVĺGâ1ń{„H€„Ŕq(pŔŕp  !˘ i)ŕi(…@ŕ C, AlPË‚`P\CB‚ŕ!DD0†\LÁp‚2  €‚ŕ €„\§[Ű­ť¬ő[#<—y.ě˙D4’i˝‘ŮŤáĘáSo0Šžě°×ÚĆňŰĘŃ ?äbkűѧjŤŃ:ţŐş2ęUóv[FŁŘ÷s~U{ąGFG\U¦,ĽV~W˘sĺ#“+Ą­8ÔWĐt:±‰, ŠD8` ¨@¨@¨@¨@¨`i?AUV™^jĽˇµ ‹ŻČmŰÖ>…Âş×tTMl˛e˝=MmGĹU ¸áËţ“YZŠşYUjŃ›RÜ TŔ ¸a\Cń D â€+@@A|Bŕ .@@Ŕ@Ŕ €‚ŕ †\  !X‰‚` ¸@’hkAÇę. G€H´ 8ú/‹`4†( Pi„@Ap(8Š P@ˇšB03€‚ľáQH(.@@h¸(4P ę` L €€"Š kĐ@L ˘€+6  hPŠ €"¤@˘5(|Űp˛=¶Ő %g6j¦ßa]ţ_cZńđEé?•BüÖ˘q_®•l\´rEfőrIBh*"1@ ˇ $E&†HŔ@ @Rh@1€l@BhŠ( 4ˇ @ ŕ (`€`]u¶Ç«(]†!€ ”P i!Ŕ@ŇCHePB!„ 8*CŽi-Ç «+@‡±PřÎÁ@U4\ ڤ–Ŕçô@7?  ¶Ül(@ŕ â8."G pÇL ŔÄi(CHi p8a4 AP0T0‚ â8 ¸ 8”8Ž!L€„8 €$‚ 5Ç›ŰĄŞ–Żf@AQtÎëŽÔk”ě:ćă‰Ňµ†ü™Ŕ@,Ӈ۲—áÁPŔAP0\ DÄ`/q` ®#€¨.eŔŕ řʉpAĄ(÷[ §iĐ"­Jo`«¬ĹWę;ţP«¨cĆÓ—úÜ9Şzş´ő)ţćüÉşR“{„a?Ś5$Á­Űý±@TŔAPÇ .©Ap HAP L2  *Ô@Aqô˘ €Ź 5\ j ¸AÔ@Ap(¦C+Š` ¨ DD€&Ŕ@Tq@  j‚Hâ‚3Ť%†ëCF§D*UÚʵRŢČ őilm6š‡ĺĆ—"‚šŔ ¸©ŔA0L!Ŕłw®ş·?RâkÍŹPN/Wi\ p $ ¨B‚ AAH Ôš@ 6 Ńˇ@L4(@gń@T@ŁÔŇ=Ŕ Ň h AP( &€†„Ô—‚ Úŕ–€(M0&ŠT4(-˘Z`E H ¤KE±8€…ĐŔ&‹h¶‰ ‘Ń !41„Q0 Ć  Dč˘PŠ€@P&„Q,€€L`Ř€+Pˇ C!”Ü˝c€Ň† ŕ4ŠČ C(€iE$ €) CJ@ŇCH!$RE%ý…H®#€š*C¤8`pĘHaĐŕp\P›’ś Hq! }†“c‚€*p\p8@(e@ŕ ÁP8‹„08(ŕ 1Ŕ@5#Ŕŕ&¦¨B €€ĄńAá—‚â5Răčq& gÄŇg( F( ¸A€‚ p@Ap@ApŠô ľ#€" €‚` ¨ ‚  €‚  E@ŕ„‹Ź @Á0T €‚ŕ8Gĸ@Gâ\ €š.˘ ¸`GâPá…G‚á„0"áÄ8L ‚¸‡¨!Ä80€®!NˇP„"¸ ‚‰„@A†…@@!T0& Ŕ ¨Ô@Ap gÂj+Y˛MÂlěěô–:ÄDězXzţŢ5‰ŰšZkéčjOdľ_‡ĎG“Őë^ťĽOÜ”?_Ł4ÖM¶Ú^’Ť0őz¸®ž7ůíű„…ň•ËÓé[[ß"ýşWëő8ű™}ěÍ­k]*{î©čö8[řÚř¦źIvč’ó˝^_[Ďš´[oo˛;»ů=żoĂ–ŁÂŮXsumnaYřJ$Ľ˝Ś-ţdőRśHÎ:­Ľ˙O:ة٭lÓ«_Oô2î´«LkîΞÇČa˝“ÇVŇÓĐŚéÚĆŻOܶ˙Ł%öćź^Ž>®Kcş¦ő¶čîËluŻů4O×S—«…Ľńe5i‹»gl±âŞ?Q:/sÍźčńŇ­ňŃx9raÉŹ÷Ö'cn¶>yŞŁD坼9rÚµ˘ŃjŘÍäÜáç@ Ű.aj·Ý©Đ„§E«#ZÎ ôkÖ®|4u\lśZLó,ěVŞżŤtżÜbk†YtéK_4+Ń©­R<Ü”µlŰ«ŞoDÔ ]e‚ŕPEH(`PX 4i€"Ň hA¤ †łkĐ–Ť`u˘µˇ˙P0€Ź'EޱńŇ_˝qŞĄ˛Ţćh–ŤmVž¤Áś¶…I-(ZĐš"ˇˇ÷@D¶&€4\ ˇ˘M –‚! c"¤j–k’N=J˘NőVÚTž‹­k[¦ý¸i¬MéôţĄÂ×–LšşćiŐUď c*` pŠ @h¶‰h‚& %  M ©B @H2š$ C:(b ¨‰ЍQ"e B Ő !€P 1!€Ć„‘H€Ň€B) ¤=Ę" €€ŤA*Š@Ń„‘Hˇ”$R@ $ZE !¤8P8.@@Ŕ i@ŕ !@Ć”Ť ¤‘P4†BŔऊ&@@ ‘P4DÁP4‡$‡€ €‰ÁP⊀€†Q8eńaDaKšMo±U«¬]§ ›,¸Ţ­Cűµ•°7‘Âü^­“|i]VŻUÜQŮjryź%°”_ň–I6´:•UëV×ÔĎ*»ŇzŚ5„E@Ň"’HiŇeD¤>%ŔŐA¨âQ§Ŕ5” Ż€k,M`P\B>†Ť ŔA|TžÍ°ăíôµT¬”¤żî[ˇ&–çËĂ4{8şqum~Ň‹=gĘôKęaŃéa쬎ÍÍv®Úxc?)űOłÍŹ ŕěĂŃľLöÂôTo“úÚë/·Ë’ßëúŚ]ěĺ€âiÔqA¢ €¦ j` ¨ * r*‚ŕ H Ö¸Żu5R—’`ăÁ—*łÇGeE6…0ŹGâţ7s[fv\4\tńő–Čň`|M5p›HPqF‘ôúźʎ¤03€‚ŕ .˘ @50T"¸><ĽYŔAP8˘ €€j p\0† giĹŠ¨€‚á„0j ¸!ÔŔAP L L €€&P LDÔ@ ¸W&J.5łKŃ3ÖĹ=^źą•·oÝŻ×dy0t`Y{VŻZ×j›Ż;%źňĺ˝ď’ÎÖrŢçwĆ`ĺ{f¶ŐŇżsuńüä˘Fů±˙§záOE_«wK{Ně)ŢVí[˙ŰÚŻęrüŹSÚż»Eř[Ł9!žďY<ÝZűŐ™ZĎ”:đ^9řxvĄ•«ŁNS=‹dë÷:‘ýĎ+ʲóö5¶>†+Ş]V­řhĂ-zÔĎĎJRI-?ĐN wÖcÉľc·µńMúřű´ÖŻ‹ýÉčvćË\U›)ods[ą‘éD—úŚ‹¶şř)n5~NkőúŐłľG«s ›äČđâ­ď«Ń3,ř)٢ˍţQ§×čZ“ę…ŘëQń˘ÓŐ"ó<‹<0üţ‡śčÓ†µô:0ć͇š7OíoĂ&­Ž\™2esw0iJŐö)‡‚t˝Ó¶‰˝`ôú¸şÉŮa»´ŻÉ=żŘ’r·‡>őůĄt¸˝DgęŮöUk­r9Oý΋ářĺg9sŞ_ţěUÇíׄşÇâŢđ\Ţ©ntyýŽËëşáĂ‚†Ţ¦6®nć;eČŐkŹm"MňSăůŰť­Ę_-÷7˛ëoěý$gQâ4L]…‡šţ<đŤgÔĆ µ¬ŕPiÁSB€$c€€&Ĺ· CZcäÔč˝N®źSÝěŞţV­_äéş~…­ÇbŻ_ů99*Ş7j=/úÔëus`÷ŇUµ*éjÝţ<ĽXčŻ_ä1v-\Ö÷0?ĆÜěˇ×ţˇÜčâĹצ•cĹÉŮ»nßyß:z±ľý}=&|>ÍÝy+Żű«Ş&ŠĐř¸~‡­›Qt©©V˙*­íő<Ę]×G˛3f7.•ik(Č´ńęNJQZlţČŇďËťľé_Ęk}‘y8şĘK]'ÉľJ¤á(3h•YŔš-¨$©‚M$ M hE@4CY´"ÄĐT@Š"h˛@†…´KAKmÔŐvr*Úş>Pą5/C1&Ýś˝_–" DR€‚‚ "Ńp&€Đš" –‹bh6‰4d´4K,–‚¤EîLĆH†& HCP€Š12„*Ŕ !„@0( h bCJJ $†ĐĐ"€C¸Ę€Ň’ ¨’H¤„ŠiZ¶Ą-<±$uŕÇtżôż…b±µUo Ů`s]e=Ůy±Ů$’Ńj¶ĺµKڞ˝UlŐvB6yy~5¬N“÷"ôtq#@ŕi )bG@@JFŔQHpREŔ’ !Ŕ !ÄŤ!¤J$8R*€jFT$†Ç$‡5RŕP8)!ŔÁ08) €&©PĆWěą%(8šă˝«ř×_ˇSWZZظŮCŘću~t=řוô3ç†˙ąT[VxRľ7GăB1ávłť–ç^:cZÓÉVŁuj®¨Ă\ą2q|iŕ•™ě×ô-ő®˝x°ńü¬µđ‡'W]uPĆ‘®GÎŰB[‘1u0RCH¨”ŠĂEâ_€#Š4@Ă3H“AĆtZšCgGFËfĽëĄ´×ÇÔNžNž,Ob«ś¶ůVOCŻ—¨˙Ç×µTëĆşˇĂňÝ~7®d´ľ–űŁí‹%rWzą5ąĂ9ĽďWoËĺÉîWÔ…o»9ţ;%©Ú˘[_ńhô~G{jö1ęë˙ÚĹĐę×­‰ös(łR§Â˙¨ÎIóřuZ‘ÉŃ%wçëâO±ŇěÓžlŤ[Íś•›żŘľWj]ÖźŰUč„4ÖŚÚŐüĄ˝éDŻ>A¬` ¨ ©€‚  "` ¨`Ó+dn4㢵ë[lô5ËG‚ËŰm&Š7éősŢÖĄk:IÓń˙Kö2W±W˘mWh2čgíĽ©a«łňÖß©ô¸Ň…kŐW#PŕHĎ—•ź/źęv—K·ź:§‡“QçGžß]uoŠŮp%Z^]ăM|Éávş=ŽŻiä˛ĺŹ#m]mŻ©ę`OĹe˛[ňđYSË:Îřćě÷>;«ŠÝ~ľ%~J-?©çćřÜş•î;.Ińó©ŠĹź>UZŃÚďd‘őY>>ąúxşŮ_E^QôDę[ú÷ë×»ăá„3×ů:|m1WW˙rŹVµ•ćYĺń KľČA§âźAŻP.&ŞŽÖâ”·˘G˝Öřü+ŹkŰuUŁVĹe2ăp–ăŔ¦uőn+÷6ż_&)Ĺ’ĽlĽ3Óřě”Ë•őňŃ:Uű¸ŢÜZuŐíĺ˝zö¶NĹŢ“Ą~Á7—ŹeZ׊Z‰ăŠr^Jľ;RöĄ—ä›OîmJ~)[úśľÝŁ“Z ‰Ó‘Yč—âggŇH—âieÄ ÖĹ—âÍx‹Áź.,Ö|Xqf(@gĐ!š@@Ăô4€€" €€#ApC4@„@ 8mj>UmYyZ2 8č|e2佳^ÍÖş)n$čÇÚÇ›>L!iWëęyłćÂťq٤÷^ ęÝl¬śY9Oę]K?áľnťiŰX•’ĄÜ¦ü/C·ąŮţ/·LiNŤŻý'™i˝ąY¶Ţí‰ÍśŮËőcz™ëÎ=ňĂź­\ü’˛ÖľŻ˙IćáUYjîá-eŽ—ö˛cNÝ•î•uIxő# ß%[«UN[kM z÷¦.\ÔÎÇfľď&« yŽ>ýµ­ăłÓ}‡\ýďRÓ2˙7KÇ–ŞŐľ‰O“˝vq,źĹ_ŤaY?'•ž×wu¶GuVáĚ‹ęOG<¶„ש–%@ hPih ŕ ¸4EkřÚµŻë+DmŹ+Ă’ŻÚäÓşN%/=r:ŃŇ4s¨ÝńđI)kf÷*=?ădîv×fů+íĘ· —Ĺx‚){ö»ŽżeF=mŻöFĐyř»0×%iľEŢWŘwíg»łµµ˛U´yH»˙)—ý{/ąJuÓëâµőÖĘŰ?FŽ&Ťmk^›łZ)ô!Ł-D«ş¦Ľż$Ů·/×rš›DşšA,bł‚Z5h–3Am- $‚E4 %ˇAM  !ˇ&¨hE4(DŃP " hM ŃP ¤€p&… č´K(L‚ -’¡ŤcµŞÚZ/ř)UŮÂÜ×/YVZn rŞ»h”˛aĚF§gâ«·©†;˙’_÷Ö úťo y9xŢ>¦¬ť´[yk ¤Ń0P ȆT°â)l@  CQ ŕ!eŔhˇ! -Ŕh4"ŕ Hˇ¤1Ö9$Ę˝$Ş·‘ˇş:Çi­Ô@Ŕh H¤€``4‚HH¤€ŞĄ:輝ŹŠ­xx±ÍŤŇ_5>‡bÍU‰6˘ľ¨•¶?H”÷~„^“WZůz¶ňÚů?+ć żÝ‡ęVYSkdݵ["®±ŐÍç“ŘÇŰ˝mߡvµťUlµő Î !ŔÇ ŕi’ !Ŕ Hi "•GLA!ŔĆBCH¤Š&ŞTŕ¨(H¨ÔŔA\Y\@ô* Hp¸šćł®ŞŐK ‰ĽjőpÖşŮ7fíąŃ‚Ľ±şµ¦Ĺ«-××ît+M9Ąâ_čEş÷[j:ßÚN—_d ‹dĄŞÔjcD°‚)$1Ŕ@ŕpR@( TjˇŃp8(©¬ ŚqL•µµUiÁěbďułä®5GĘĎM<–ŽďŤËŐĂÎŮ_žÚ>…‰^‡aőëN=†¸ŰĹŽ?ă|^OŰjݵ ŕíö-ŮĘîöÚµôBęőoÚĘ©]*µłôCLÉÖÇ» 1bXńëO©Źw«~Í+~ jרgíbé,8š@  ęŃ[±EkűzéoŻŇŁůL}ŹË–N/oíhâëgxăJŮÚ"Öđw÷ű]«Ţ¸ş¶nŞ«“ǬżĐ3w{|»—K¦l´˙LÔ†žŐő9~?«Ňęvż˛d˛uJ4Ső ÝśÝ*őpŻĘÜyfVÖgÁĄţ3¬ëüµ‘âĂt­Ć6 őîâů}l9iŠÔşm»YĚžu¬Űô^‡ws/,ÚÝĺ˘ükko ”»Đ5:2«˝“IIž–ĂH„ÜnŮÉńxđR—ě^ÉŢ»ŻűQżSĽ»Y˛bjôúŻ%bĎ­Ç’ÖË{d»›YË=®˘ţgCŰż…Â_Ófq[Łkw_Z›LĎĄOUäÁÓxşŢm˘_ňČľWÓęň­ń=ŠţŢ6_qS6nŤm‚ôMżÉKŃIÝň»={ÖŘÚáeÔęyy˛ß=ýËţí…YĎVQ.}G$8"˘¤8>,\Y¤Yq&…Ö|PqF|C‰¤0€3âM ˘đbÇuewŻ‚ßIOăm>¤cĹî[ŽßS±:cuÄ·Ş÷KłŽ'ű[ÜîĹ’ů>)äĘů^Űż˙qăö¨ÖIőEők‘>MĹ=<,˙lđő;ł:`ŁpőkeúźEňXrją,qÉŻ´Iť~AÖ´Ç«pśí?CĐěvŚé4ĺ[hŕ–Ô¶ěăŁçľ?'.ţi5nQ'»Úîő+ťô{J+z¦ě˙nľ»Ůęaíâí|r\Ňĺi_Śż§©ĹŰídîe÷˛¤­ ~;4Íç§:ÓäşÝ~·eăëß•bZôźqÁHa®Ţ©„JŞ` ˇÚ–ŞM¨OU gÇvłbÉL*ʸť¦Öke÷9^Š‹#«ŕö·‚Ţ řđű®±Gý~äJô{ÝÎżb™«ţLn0Ýy_S ü®Niă¬cTTxíŞS,=k߯lÓ K×Đ•¬r~$“뇒Ľ’´}H˘‹#~KŹ$E­[-2©ÝşŰMź‚äĺ€Ŕ\PB( PT } @ŇEŔ „KHѡAp(4h*˘ @‚ŕ ń.€H3âiÄ\F ŕ Ó¸\&Ĥ†Ş‚jxʉjŁâ gÄN¦°O¬]Hu7ud´ ęnęfę- ŁWRZ Î[Eű9+Jć˝´ÜrŤŻ»˝Ru·ťŕĄeÚŁÇ}2-jÎŢ·VůşŮ2ŕÄŢ*˝S{šôşyűX-ž•­*żmV­úšMü<ÜňS 1Q6޶^ž4şČż+éĹúźC§Ní2Ű#µ+Ťş¨ŃĎ–y*Ö¦\ß+â–•žńę17xô$––Ąj˘©¶Ö¦|=˙ňŇÎĽrßús:VĘ=8¨ńő2yl´˘â¦RDVy?+·ż×c84rő~E ŠÎŃ ‚ł«łüTý ŹC»©[,1<•»uµ“_ŹÔH[Žőň㪵ęŇ~LĎc.*`®w%ŻŠżÚ”ËoÉćv+JćµiűVÂÂ]ch±A"š&%˘Z,MCDAŁD ‚`*^†ŤÔD ˘ÚňH4$ )ˇA ˘ŕM›A´K †€¦…@ ˇ2 ±™%ô eކ ÚxŐ±±jž„1˝ííQK›=Ś=잨żnů—&ţ+×·/Ë`/­j»^đ/ĆĽ’”gŘż˙Ă®ŢC WŁĆ˙đŠ'ߣޥ«U×’Řćµ[Ml^,Š©ÖŰÂż˛ęă9v‰q´čKDX‘ T±Ä€ÄŔ@0ÄE!&"‰ #Qˇ ¨`„0–Ą ¤ÜE †4"€ÓlŢŽ­®«¦ěĘś¦+ä.·_©Q޶;oąĄj’…ł1Ç‹“›ll®ąp_Ô¨-5¬QCMm‘ŇĐÔ˘éj]ĂZý@Śxť·Ń ¨mzy:][¬'ŁŁ‡ä‘ˇÖŞSLn®[đ$ŐV›”¬×Ô˘’š2©XŐčUV›n®Ú§(!ʲ‰#o¨ëG˝¶ 'M€hµę*¦ÜĹň†T9)őJ+e·µĘSçčť8şŻ&5uhoÁÓŐřęä˝±äkÝI5_ż>ÎÝ,®µvTN*ŢĚÖw©˝Ł|xšĂíßxkA5Ź­Ž"[ńę.®{en·†Ö©ö÷­Ëôűží:ř±ĺ—eŞ b~ăĄu‡Ż˘+©É䄿;xş¦ęż&$+‹%8ŰÓŃ’«KËK¦íyź “µ•k¬č¬Ňm¤–ŻbÖ޶żĆšYĆÇżÖéţż‘Z¬¸żg«_S‡©—5»×ĹjĘĘÚ˝ˇ_Ë?·^:82`É…QÝG55űž·o/K.GŤR×Ęż µĄS<ě¸/#Ç•E–ëqf{¬ż  iRú!¤0r’)"„‘I ”í¸B¤Ů»ëµŤdM?-"킵²L;x.ĺÇÇ“x·[ČóŃĹ)JĚyHbk’†ęÓ†ˇˇ¤!¤4ŠUE$4ŇH¨@ŕ€€%ˇAbi(- €3¤T UŇH¤"’*Ă`M MPŃ-#F‘- "Z”ĽîµénTnŻŐhSB€rdĄÖJY«­­äwÉ“.G–ö›˝dPŃŘîděҸî’U‡őn79ˇ P4ŽŚx+l/$ę§C*ŐÚaLjŔž,|JU(4€3â\źHj gÄ8š¬vzĄˇµ±ňƸ­|\87ľ)k«đE±Z‘ËIĆjS”ő |ą7®ĺńś*ů^K'tˇxF™; EqěŚx ‚:3Zôöňăpęĺ2ó|žnĹr$ÚP­ő˙»îr=wÔP†Š€€iŕp L0‚ p¤ćV­jzë;Ýzň\,ľ›3“«•u“Éz7[hźÔé_'Y_ăq÷"_á!jâĂ^˝4őű čć®j>¶]\~3ĺzŢŔłcŻgşkö3řÜ)Ú٬´®‹î;'ęÍ×vÁěaŠ­ľ‡›Řé۬ŞÝ•ązgîfľKpłTN^…őp[´ěóZεŰ_!g$ÚN«Č$izŞŢĘş¤á1$Ę&‘PĂ1áS ­CQ%j8`D ‰¤1C6„ŃŁD´›BF‰h á Š4„(EʼnpUSÄ8š*ŤTÎ 8ŹŠ Ę xˇ:ˇŁ(/¸0TJŁU)  EBÎ hŐ˘Zú“D4jס +&hŐ˘"˛h†ŤZ%Ôń´›ßĐúŤÉ^÷Qő;šU¬'šđţç•ÔÉ|=ŠĺöÝ©Ź[U)ŃžĄľsŠ˙ú7˙BĆ|¶ôűďFÝşâřߍţ>7Ą›Ş{7:¶yżۧRę%bČřÚ­ůő=JĽ?7ÓµᚚǣđţÇ‘ńý,×ůułÖ+»]}¶˙P“Ą—ë_MlxÖ;)T­ćZÓ'ŹŢÁĐĹÖżµšŻ,~+’mł—˙°öžNĘëŇÍWü’ÜÎo‰ë®×o,ĄWółú!˝‰8Ý÷ÇŞęÚ†Ű˙CˇĂ=żťx—n´ÁT­Zţ|Víž5“—:?$ĆĺŮľ¨hE´(DT4(6džůmĆ››Ó­…ăÉkä‡GĹχ# pÁľ.Ĺ«G#~ŐŁEŁDäĹ|oň^Ť?ˇśęďÉÚÇ3É…»~*Ľ_í””3ÎÉg{Úďűśęäp(I-˘Z"Ą©%˘ŕ2Z4h–4" ŠđKEŠ& &<D@š-ˇ03h–Ť& ‚%ŁF‰`@¶-˘Z& My,–¨E´HIl–-Y,‚DĐÄ"l¦Ľ‚X™D°§GyUŁgK˛§g«ĐĺMŐ§]^Ö˝ą=Âb‘yńb°SŠçm'o±ËkÂ{ ɕފ±ٶKŞVZ”Îl×­âFĺűµx¸YKŘÁę)™$i-D°†ÄL‡Ŕ@Ŕ@0"“Ä&0Hj†$6VB! CBC˘†€hhE44"‘E&ëŞÜ裳SoĐçZj]˛;$¶B#LŤ¤ŁfEY2ďjş-u/+UĘĹBËVá­}I¦–Fü˘Ľ’”MŻKVRÔšSM8đCnÚ˝Xľă" ŽŤI¤*©:ľ*i§H{•)Ń·o¸ŐlŰăăV:ĄXow±ŮWů/FÓpšú–#ămW–íl­« îŽĺ×M«ńŐčפj7˘M5ű˝ ‰®+>7ü|Ń«ë囫ghü^ĹaZ˛*Ú«scÓča˝q[&5«kFĽz¦Ď"Î[=Ž[ä«ë['hüěÜ$żµ#Rň—ŁÚĂÔ\ßq%\ĽZ˛ť'ÔçżÇű´Í|™kk8‡­¸úšäçŃLJĎ•ż/«~żˇ‡o-zuµ°YŮämxâ˝joŚç·W9˝»ôřyŘ©|=„ˇÄńÝzťYúÖÉ’®ş&ˇ±őłĽŇť"7~¤–ćdź [uĎ{S«NÖţźňĚkŮĚžóë'EşÉntłnÚëôú†?ŤĚÜÚ"ekú § ˛fľZ/Ćz´_GrgŻąŽ×Ç1n3ˇ®kS=Ą]_‡˙&]^Îl…2pĄšäĐďĘváŰ‹îcěrëëTć·m/ęz¸úÉŻäY*ömję§Ôňűą;=Ě©u.UoË4ěçËńÔë`Ć˙:®y¬ř723ÍΉëářĚë{ö^L‰čŁńź®ňµëâµ×µo{$YeoOĐß/Ć`íUw«“ŘÇuĘőjaúžgw'+×s<ر¨ÇfKÄé=–szŢ:ą@ peˇHi `Ťpb¶\‹Sm˝aN‚ ®¶JĘ®´ăÂÜŃbË):ş©I¶˝OVsşdé,^ÚŹĂ-fý}KɉäK«’Ť¬u_冦ÉnkýżĎg&,UÂź+Ěř#»[:Ő×Z­ŕĂ&;b»Ą–Ű3Ł­{Y{vSG°ö=ú٧[MźÔ2vl¬ŐRŤŽšâxńŢ”ŐŰfsף}íd8Ů1Ľöpý ’=+b§´¨ÜUnÎLŐÂŁÚsęVH¤¤RBE "‚ĘqŢíŞ©Ť[ô^§µŕžN®GkSśŐăĘ­5ăýĆżʧ^Ąłć_Ç÷(ńsł•yÓ’F˝ŚíWo /\¸łc˙éiŻ$ĂücĹËń÷UÉ›Że›.±ó[»?ˇÉz[ť.ťl´ičĎĄëvz? WÓÉw›-ß,¶˘N´q 'Éâ|ŹŰÉjä¶Ux˛˝ÔYĘ -˙WŐÄĘL †ŕi $T0 …‚„¦ h¶É`KB‚‰e†«g˛gN•ňă÷Ő7q»!ÇvÇ“'ě¬Ććř=‡N?s~N¬]LÝKZ™cXiŁĎÉXÉeőa…1V•uŻífwÉ‹áE6ô˙¨t›jŐnbÍu·Ý»li––»™Mč¶2¦;ÝĹSmť*YRͨObňYuëřSMżRËΆ´{ ‚ěÝěě÷z±GÔŞP5R˘BjZ(­hz]“˘Š·r« Xͱ7UŞúšÖüęÜj‡“»”őô,w«i­=@ĺsg/sĄăWUvńŕk ¤Úďě‰y-:l9ZłÚ Λ·zţß:°Ż^ÍZjÓJRšE°]4˘[Öć|@Î ŇŔř—!"šž!Ŕŕ‚UF«;)e$tus.ľG{W–‘v`Şíuž,•‡]&#ěÎt{*ΫÇť ő:˝‡Řvü8ÖľfNl˙!’ą-\iqZ&ő'(ľ–Ć%lyj¸=V©ęol†Ř°Ĺ'Ďűtóv3änöü*µ…äęĂ—|—Ć“jźş=>âčç§ÂMëĎ#tj[Ş:şýL+ëŇÍ[Xłó ľK 2>ĄńĽXí5ç3ż‘túŮz˝ŚŠď– ®tżü“”÷ľ6žŰxńĄíÓK-%ŁĂÔČ»®âĄo{ăł\·â—ź ľCŁzäÉ—%L4[úýK<ČA‚B€4  A`´&Š& hP4K€‚â5RŕiB©JĄ¤TźÁ§âP'Sn,–€ĹÔPÍZ% 3hE€‘IŔĂ@Đ& 3hˇ0¬Ú!čhÉh ™0hĐ—ăj¸i´ęü/fŠĎ«zţ7ŮÄţŹčO{á{Č˙‰W“ź% Jú~_ňÓ»ĺv’ŮD›üŻČߡZW O%ĺ´ő„F6ďojář˙Ťů>ľZeU­ÖV˛Őzh} ĹEg‘U+µŢcĐůZüŻÉö˛× 2qwi.*{˝ň4ř×OÍßK?)/î*yKł§>Ž,˙ń‹5óvsŮŢÍŮ«Z©kúIżG˙‰Ă‘áéŢľĺ·Ő¶˙VqüßÇ,Ô_#Őü•—,‰k+ţä|ý-lvWŁjÉÍZŢF¬ź´ë~ŹŞů˙_ăň.x[˝Ô«¤µýO–îf]®ÎLőŻw ¤ăV}?wăíÝědĹź>ş¦4°YikY%µwij|ő<|éÉ»RĎŰŢ©ýŃ1©ĺ±®ŁŚÖĹoi×ö»F©oFź^Ř?·Á×›&+b®8{L©) ˘)¤1)* ”ŔCÜřżŽÁň]~}ĚnŽ+–f޵'äďřţć<=ďţ/ĄŹ†:««d¶¶µŇÜůĽ=śŘ.ă–JŐţŢKčzżó8°v≠j˛ĺČíź;Ö*üU<Ąçż¤÷u|ok{łzü‡ZŹ6»ű©C|w”y?1—n×˝‹7˝[©ÖĽxĄµCO‘ů\ť¬ŻŰUŻYW5­­G˛g™||{ôöH€Ń@ŕ H˘FI.BD9DBi Z&‹ÁŹ&L©c§6µăâ =N§ÇŢřl9Ě×â«´Ťď‚i“·ZqČé›Ă0řś™2Ůő즕üŐ˝ Ö»=zŇî—É{B˝\´×“ÓĂÖŁĄŢ©’Ę!řDgňäî[­_Ęî×Ë})§ť“—µl¸ä[­™ężŽžĆ<ą2/ÂbżSąÓÂł]RÖ¶yN^ČLXÇ^ŘnÜÍZÓÔĆĄolą©”ĽQ,j¸Ý¦ß]Ă#Ăgídz˝cbŽL˝·űqhżî+mí•OŐýľ'+Ń—‡«LkžmÖ±á‡&G[dµŞˇx& łÚ—ČíŤB! Łâ4ŕÄŐZ)PýLŇ5ĄŁń‰4śčő:)řĄÍęĘăUů%¬îÍą`mwŹößú‘ěVÚŐčVTÚV' «Ç¨ŻjŐŐVSZ4sá˝ůđłţ§CĎ|5Š)ťěĹŠÖżç•$–Öó!ř©uÝě¦[jŻoü|x-_¬›ć­.ýľ|ZÖ<ľ˛ÇŤ».V{@W ŁF…Ŕŕ¨08)&RL‚ pT1ް:zŮo\ORü›‹yL+ńŮž®¬˛ÉV¸ę–§n çÉtť˙«Ńmč–?áőmßË^˘ř¬tŁ]‹v›«Ä÷±˝˛b˝í‚ßg÷ô8qáX;´Rš«ä¤žŞő{=n‹É9hďe¬' S˘™°S:8ĄořăMĘ9Őiź*µłV®Ď˙oËlĺů¬W^Ő«®*.*<2{#>ĎČwúůž+*Ő'µVŤ|‡jťŠRô˝•¬˘řő„zXí_g 3q·aŇiÍIăv˛äËšĎ-k[WńŠíˇgđ9€piK@Đp(h4§aÂ.´‡ g<ŚÖ*¦ĚšĂł•ą§Ą˝„P„ŃP&"ŕ8Ŕဒe$8)$ŠH* €!˘YŁ%›D´hČh‚ -’Q0RĄ›I/ݰhÜt¶:ĹŐšŮús¬V˛´D§ \|-— [5ĹŽőĎMŰúˇ{·Ími[8ÓĐqI®lN–|Sŕ´–bŔN i”KY,¶KET ˘ AZôűÄěW?~3Ł˙sł/_·ó9­ŮÁHÇĄW&´Î:şß!ŮęcxđYUYňÚ\’ł}c×řŻÉŐě.ÇbŐłŞ|+Yzúěy_9’ů~C"ľŠ‘Z§č} ;Y:^Ďiű™Zzkg˘ţ‡'Ęaęü—E|†ŞŢ‹Î“˙ĄýIÝ™oí·žÚĎ˙­ĺÍ–™zů?,4KŚřoűNţß˙ńýëu×âiDőúś?Úęôľ%±äO°Óv®Ď“Ńő>gNžNżÉ~mWń{»/O¸,¶ŰĎ^dîňţ[»‡żž™pătUŻś)ŐúŹW˝üĄŐÁÖá×ËŤŞäÉxvt•ƵłS/S²«łă´čźˇ)şąNŮ­ĂvLĎNŹ˘ěö:Ď.lź"«|ôĽurU·5iş»pjR>vý|©+5<µúš`|s+i˙îŘëü+T×ŕÓj×[zé> IŹ*‘lidą8Ú\FÄ\'ŔÁ¤´@ –‹ Ѧ‬Ú& %ú´i´EfĐŤ% !ˇ&€%˘€Š†‰4h–€‚Z-ˇ4žâ‚Ú% %˘vвZ’`1 –Y,І‰e’ĐĐŁRáD“:…OBf—S$¶’$hEÔ˛„Đh¦I"e4( ‘&12Ů!R"€ŠjIlCŔ!˝€ŠB€Ć&Ŕ!¤T?@:ěC ‚ІE¤Z‰E!š) Ő­ÔŠ*¨¤$´h´›Ń-EJ»8[›c­«u+FX>5šÝkő7˘§öFľ†«źT,N.Fů.¨ˇnĚń[óSäĽőÖ¶ý±cv˛·‚÷Nʶ'kφ,е˛ăşÝ+Vbu3¶NÉíęîKI"˛č’ő2®ŽM+ţK$ôUl˝M˛h’iDán]éËmŃSSŠüZOTt¶’őÓÁËŽżšOÁ­®ët·^QJŇť»ă«ĄVŹiđÇŐÍíĺvČÜYjĚnëf¸ďähjgĺŐóö4|jý|ł®ŮńáµpŐoŁŹ–R™ź;ČÔ±ęfĎ—ŻjZźµîŚ3÷˛çuqÇŚµäË/fů’­’Ikˇ‘t‘rí ˝ĂD˘‚žĺh!¤Ű…«{#ŇĂńë.»Uă˝mů»y©ĎŃÁîĺ‹+)Mă˛ÚQľ.×o~Ý­Iăt׏RÉëÝ›};<\ŮňáŁiÇřśé(žßQuëD“w‰Éoí:©ŐŻO&NÝőĄö—«fx3w;—¶+Ţ14ÝÜ-s±˝ýqCş­ojŐÍSi? ¦8PT$4 ŁLYrcMQÄťď+Æ–łĺfyÉ-¤›m-K=•†ÜrŐę÷KЬ˝•ř,.w˙ˇČ‘A1¶|ŐÍĆ+ oc1š"’őš1H€"€ €  p BĐ P(ú*ŃÚĘ»Kéľ;ü ¸lč”jöýO©×Ç—-yZ*ýwźBóaË$Y»QëK’ň^^‡Čeíg‡ŐżâśE~ľM:ý‡Ź°°żĘ”˘YŢXľ3´ď~đqĆ”Ú˙S§& *ď>=GźR{# sĺÉg_ýąüř'µgŹť¨ťŇ„Ň7ÍŰéŃĽY/ř(Z=gô3µ©uń˛cŕx©ťe¦\©ĄgĘďWü•~¨ëuěä´gJ´«•UäyşôĚ’¶ŤlĘ8şą®˛Vśż¤3·&LUj™v·®ÇşöëŮdpęš×ČvsS3ŻôŢBŽÎšëâOÜp‡o”t|qVtŠöiű—©ÓÚŻMŃv3ĹŁIŻ÷C>§oł,=l*©§6ó~śbâ{˝^ĆJaÁ†łZ-^ĘKčt­Öwy,ťěˇ%á›/ňé|]l®™q˝VÓ•WÚÇšh¬ňŐë»ećĚč4îÓŁŠ·ÇŹ•łÎ­úś –go{3Ď’Šř˝Ľµ_śîŮε–Ţ«M :#7ɨJ#q*¶ŕŇa%]ţĄąDJ¬$TÚ¶V«†µDF¦Ş˛’d•;}ܸqׯĘÍî]ęçÓěuÓ»lWÇÔÍiËtů_ţŰ=‘ĺusÎňÚIń¬é/ÔŃ÷0äěSł’ŤŢµŐ-ť–Ěż.ś=ÎÎ,ÖÇŰŻC^ç[mŕň»ž|śěŞšÓńPŽÎçzÝšQVÍJŚ´ń2pń|"8 â_ń(ÍTjĄńc⪳«1䪥ŞŐ—÷#:+l´Ä¸ÖýŔ>Ő-ř´´J$¬6˛ëÝΫbpĺË÷J<@ňä˝aÖ8Űf,ŐNź†ŐpŇ4ĹU´ľ­ëZšD¬­ă䣒ݶěů=ŮY5´qâÖŤ‘!ę4Ąú}NśX¸Ů´ÓQ¸‚1áłă}ÔęŤm‚lěÚ­LŞíKBÓ]Ť{Ę«ĂSJË۲Ż(ÓÔ;1bśJąÖ ˛ëoŰĹ-¬’’ p8`Ó>w­%)Ň^Â5ëĄďRb'ű¶ýJ•Ó~˛éS\”WvmY=k¨Ű·“ ¦Są(ˇ˝bľŐ9äk°©ěr´qʎľeŹŤ?‹ĂÝ⽾_ö˙é’3Ľú˙/µÓx˛iSN)˝^‡:GvuŮ]˙UĆgńĺűżCŠËîp4¤ŞP\@@DŔAp@Apń* ŔŔG_9Vɓ۲‡Y[‘‹rZ-~ ŐťůşŢî,šĺU¶M»w¦;ńźIćŕ(ÔM@GâjއÄ.˛âMxk>!ś‹§‰×‚¶­;'[lŽx*­¦žń¨Fůr,O†4“ŢC•—YŢ)Ü•Ă5Ý®řĄŕßü>ŇOJ= 謱ڹ˙ •—ę<ęŘéǵd.=|“<“ZAŤ˛ßňIµ[x !š2*3h†Ť%”fĐ‹@g‚Ú EŠ5(4B ň1:Ňę×R—»±vÖţ:­ŘĄ1*aPŢďĐyúŹ-Ýčá˝Ń=l9q^Ęëńkts«dNkg,ďÄďJN{)ŕÇŠÖÍ‘é2ľ‡>^ÎK^hÝj¶Gv{â¬W"ŇßĐÇřýlź˛Đţ„×/c5-Ť~J5g3«R˝7=;cxńqŔ”ž}éjÚ.ś˝u*˛kĐFŤ1_%•(¦ĎduŻ&’Ň\äęeŁşjU"_Üéxňt±Ó%+­ôȬ§T>ËÍÚ¦ŹkďU˛hómKQµdÓ^Ô“×ě_ ézW%k•¤®ßđŹ% J–"‹®¶ŁËZ7Jék%˘ šAěüwÇőű=\™r§Ę­ĂN6Gź^§c-šÇŤ˝cÓěCgŮËůúŮp4˛VIý§ÇÜš‚Z%˘ŕ +(4LfĐš4‚`*! u&†„Ń   ÉhŐÔ É˘Z4j h+6‰hŐ’Ńš-˘X&Šh@f&[D‘PŃ-ÉaPŃ&ŤĐKE’ÔfĐŃ )Ń@Ń{Í ,–[%…C%˘ÄѢ@–"™,)1(Ü‚DÔ"´”›o]j"e10$’„ÂĄˇ0/qŘ b† †'°"+QˇTbE ĐŠAHH`4Q%4AĄ2p­’ZŰÉ^ĺťU_ŤS3Q§+7É˝}FJÜ Š)'Ą¤–­RýĄ*…\eEUşą[˘ÖK;+[XđM|„05ľgf•tH×4[ső9bHş©qżč1UäER-"V墡˘’)ŞH´$ŠE Ą±(¸ KAAijR@‡AUşąO_PHi]+{ľ–íák'ˇ‡>­°äí«>iZŤhęÓ٦pŕ|rŃëşýş?Đö˝Ěýśľ×c¬ž ŻÝ“GU˙w#Qź!ŘĹÖĎň+©\ZY»_"ݶ§úww§ü;×.WzŮD%úž×rŘmZ׫š¸˛ćŞŚ–™µWâ—#‹ä:Ůđŕ»¶[­ßöU?‹SĆôţ?·”—ŁťiU\k_-Ž•JÓTšó÷:)‰d¤ŢаF­eŽŐËřÚ’ýQŃÁieY˛P‘Ťíí˙ŹŹVmYtŁÖ}d%E)š÷›JńeĹ–&ś'(ëÁ·&ţ¨yŢ<šüťŢÁ5ćńkŔâě¸S«ş«v´GĐä‚®¦ ÇnVâ­ĂŘp@î¶oçSÝcµ[voJÁ·o/o é™N:&“Ó•W”yU­k¤ŻiUQYđŽžßsߚާM8¶ż%¦§" "" i  U)T řŽ P@ ¸\ *@ hÓ‰ŹVL}ŽÂ­ëT©ŤS9ŕßZáVłmÚ"«Ŕ1şČşj¸—ĺvÓČţ„ömźNXďnü—”NKbĎ“ť¸¶ż3ĄöSĂj· +yAćíŰÚÇzYrzZŻW'włÉw{nü-‚D$4Š€€C€@ŕ!€ !HŐeĄáčiŹ;Şm>MVEĽWŞ˛O g~µ–NS:É›ŁRšÜîĎ•×mŹN~HëWÝÇ“óä“ŕčĎLxŐqŐ~k{¤P p4ŠI08)T|F‰€/Ь´€u­ëNudóĽĚł§7IMĘô&ÔÄśż>ĽĄĄš˛´˛ŞëŤUjŢĺQѸ˘ű•fáşęĐFĂ{4˘$îXm-ĄN/vóĽAŐŹ"x]­oËĐ+ź& ă´%?SKc÷U[Ńů2Yr· ËgB˛MRÎlÂ0Ë’ĄvAFíWk8ŻŰ3VuuZďWŹ”Jň€çvÖVâÔ«:·ř¨D€Ę “ť7¦ôŞ["Uí3&őNŐ‹­IöW—  Öąk+t.<1ÄjiZҮՔנžŐźűťXV<şŐK1¶Kí°©’[TQ˝ź]{Šöä­­WˇÁwĘÍřđm–•M5çÁś PT’7Ç—Ťxµ)éú$RDVµ˝kN)kĽżRR‹U*˘ŐPŇ-T‚UGĵR¸—ń4€€¬¸‡Xź„ig«]ş,~hM›D´hÉa2Ł% 3h–[D2‰q(@D†´¶J«ţÖ 6á-YÓKăŔ¸eĹ7ZČ襖ܿö’”̰őńewŞnWí;OäŕşÇ*ËÁÉÓĄždÖŠş˛úŐÇ‚×Ë*˙ÚŽSÓËÚŔŰĄ©ÍUśy©Éű´§vŘs§\*žŢJKox“\ÇK7u/ĂşV 4~âZ­QĹź5˛Ű]*¶GV,îů,­ĄcDc‹ą™¨š'«ł/w­[­Z––ăuoFzʸéGJë '­–Ľ¸Ĺ«ăę]›ŢśmŤč÷G.L–ÉnVßbňÖóĘŰx2aSWM쟍ĆÄŔďľ^Ű˝k‹Xá*«)•ęٵłb®+Őjčż5M7Ţ|şR•Ĺf˙$ůŮřű ©\užVM嚪ý>ˇ .ŁĺšŹZřľÉúłŹ/_*ç‘W•Öőý˛Írß>TÁ5VŇęÚťßň­kÓËŽjôNŞŞ ďŐŹCă°vz×Í“—*·ôŃÇ|–>˝Ťš‹Ű—ů/ů=żăÓđWŠĽ¸^­'—ńYăÉW[/ ťRsŐő}|]n0%íäŐńŰRݰRżÄ¦8ŤšŮýěyÝ[Ä^éĂJí3“Ż’™˝ÎͲşĺă©ţÔŢÎ~ą>:ýšfËŘθŽĽI;qŹ?x>jŐJÖUr“i=´>Ë=Ď‹®,ŹüöŁNńęyťŽ§ĆôşöÇ‘ňËdâŰÚ~Jľ5óđ&‹A[DѤ  ¬š’`ŐÔN¤Á0ieśBɦK©ż]B°u%ÔŮÖ u‘µ%ŁWR"˛h5h†¬Ú$щ  –‹@fĐš,–¨‚Z-ˇ4›D´\ĐŃ,Ѣ#rM“D´Y,12Ů,bhˇPÉe˛B¤’„ŔKAµ ¶°! {ľŤ  !-BÉn6ý>’P™± *AŤ `±2™ ` ¨ˇ!˘†R$¤A! ĐŠ(†ŠÖŕ†·¤]`„]PE¤)Y=ŔĽaŽ©x)BÔ¨uQąO]™("ˇ­ĘHZůء˘ęJ)lÔ¤$ŠE‹D#DHˇT¤T4R)Ńka$Rô*hH¤$RZ„4†%ä ŤQé>í3őżŠ˙Ć¦ŞŹW§žLóËÍř{éŃ·S y,ýąĄ2%ĺkŞô8ł÷2ö2M›Uq4MÄĄąĚ¦"t- ’g»jN®”i÷)äüjĽé+ěbĄlR@l¸eÉÉľ*¬~ۢšÍ6…#ZÚÜx­€ô-l8kZŐ´žŢYtĄxËr–ŞQĎ×TȦóřszň»ě*%řěý#Ô¬‹a÷oÉÚRÝ&rĺĆëw+ŠzĄľ‡M«ě]ŮY8ÓŹg1Qŕ" U!S«[ˇěJ HĐ "ŐB¨´€GŔh¸8FŤ ŠÎA¤ ę  ‚š‚ "|ÔˇŹl€‚ëŽ÷Vu«jŞlׄ(~t!Ť Ŕ T†Dvő­îUr˘J›\Y1aĎgjdJŢ„a¦L¸Ţ:Ý$źíő>Ą•ť˛ľ4®­úlş¶¶ⳇW2˝ ˛fXżĹD·gF,ë':cZU~,ʙ镪ćĆĄé(ç›>+'TŇŐŘÁ#ÓÉŽ®‹.©ôőGmo%"’)" ˘8¶>,×ŰĽK«ŹX.!©§â@bŽSgýLîůYżRšF•˝RIV^ŔN5®ĚÎą_ßs¦Ü_âü Ż ß‰ptÖ”ŽU¬7´śÓg’şJy¬ě­˙o€Y»»®ŕk—mů7ÉŤ§Ň®SÔĄ“•lŻçc(¸´%Rήw‡iKZĎUˇmŮú!ŐÚ»Wk“{YâŻĺ>k5v×Řč­Zy0µ\?ęµE+FG±˙s6˘ăNOî+םfŻ`9oXm-†jŃ-´Âm  "@@ I„LҨIUBF‰QuDCH´ř ¨€„\ ˘ ÝEC*&Ęb€%’[j `K&jv)Ź…ZZžJDG’/ŹŠźęt^ܟћŁUäJٞ”oHuub˛ăX˘(ĺuşµş$ Ă׾OĘ­(~NĽýwšµr•ÖďÁÇ]Ňn“~ÎYUljţ)n+W.ŠÜ“[4o|1K¬_Ť­¬ś˝ZYŮä»|kţćÔĘ»5ľ=źöÇ W:čdĺ­”y6ěuň^µÇHT[ÉĎz߫Źűů5íYZ•˛´_gTĂjńł«Ý8& kúŠ Ö¶ľ*Î;B{’ˇ=TšňU¤ÇŮr˝Uµ~ĽÖ°–¶ŐÁT»łz$–á{7^TŮnuŁi»)ôF6«[¨úČÜ«8ôf7m˝\›E´NŔHµNVçE0©«É1m ÎآĽ×í×p¬˘w=^ź©ÔęŻńÎ}SIjţ˛ylö:xľ?·Ö® 2RŰŇÓęľ‚ô+’ß5Ű÷yĄUOű#OęwÓ7Gĺ©Ă"ă—Âą}ź“’ß Ř÷xÖÉă˙˝˙Đë§[ˇń‰dËel‹f÷ý*Kť’çoâ˝%N•şu¶Ť5ÉýNZőţ;âëË-ąeń:Ú~î}Ľ+¬»V•Ť¤ţşś=żŽĂŢO±ÖČťí«ň™ęÎż;G–-Ť×ţé×úČuş}Ś6îâȓݵł~‘ęyŐřîݲ—·c&DěďoÚ”6¸Ł›đ; ?wł‹ŮĎF«n|­NVŃY×sýs;«ç„]Ş•ě“M&á­´:!AJ˛ŔŰ˝o­tzHŁ(×ę(;VÖď#Űx1®Eîň…A¨ÂĹť~Ň÷9řŢ>¦9&÷m-şĆŻË#„µ_S«%Ö~µě”qg/µn<‰R´;:x­Wî[Ee z‹'V©ÚŘî´Ő¦e\÷ĺGg*› Ëu“#şQ#*ž\ľë«iA)- Ť°R–ÉU}+ęB©uM4ÓŐjŁWÖ^ji*ŞĘ?-#‹łŹ†fĄ9ŐĆĆ˵nNÖ­]ťx·ô0j\˝[3˛4jŃ-2Ł7V%)§čhŃ Měěä—-Ëz–Ń0BeÁ!DŔGÔ @@ÂP bŔHC€k°@ŕ ,â‰!ZéÖÔ&);·^> R˙䦋Şńĺ0…ÁŇkĆ\nezŐWOÜżr:\-jŰmţMŢÉUŐ¤Űň„W8Äi0) ‘#J‘SDJ«©˘"¦‚ĐŕHrE&‡"%¦K)˛[šŇFŘŠ„ţ›’çČßĐS®Ŕ*$ćw3˛‡ËŚč+R¶ßFtzĂňFJĹľćľÓ[2šÚP*űu—ąăô7¶Ţł]~‚xšĆ“¬?P0ż+$ÝtőńޤçWŕëW\U×ÁTŃßŔpm‡*IS‚łopµyżÁhMĄŐ˝7(ëÉU|vÇV“އZŻ—ŽŘŇś]ŢJ=^ä]eŻ.¶Űúm—%)OsОő8}ÎyąD'¤S“ĂlčEq,kť÷đ€O wv{=‘ę|nżc«›Żj%}S»ZdžcÓYp:÷2boÚ|ĘŃĹň˝~Ož7IŇtdňŢËXţ7ŻÔęĺËÝJÍĘKĘôŹ©‡ÇtşÝÎľVĺ嬪©Ńzż0ěý»o†Ó“˙ŕÇá0d§n÷ŻţÜ5oř&ńnŚú˙[uňäÎŢ5Ź®žYĺc\›ŠÓî}GrýNÂxrfT×TšLů˙‘ëŕëŢ´ëäy+e.Zzţ…—z÷G6V’Pöf9óŞB4%’שL·ŁŽŻ“Ń:řFy]bÜ“Wz} ÎZŘ›Km˝_’űž×[C§Šť¬—ĺ{%j·żčŹ— }'k´×JÝŚ-®KńoęĎ›˝­{r»voËÔďÉߦN•zŞ­Y$Ąíąż_âńQ,˝»§ńNęÉ8I»?ŹĂŃzÖźđĎ+ŻÚÍÖ·,VŹZřˇôy±ŕË…bĽ{v…]cí‡ÜřěťiÉWĎŻ•÷‘ôĘť)k5^Ihß–¶j[ ÓŰŃŐ¨MńÚřňŰ•îçTá‹#ěf­ŐŐh–´Ú\jMs,Uµrµ{LVŐŐŞż©QËZ;ÝU)ź ĐďĹ“ŻłŤľi5Go_Cź¨ń¬©ŮYŢ˙“ˇŰŻüž5ĆÝůnś)!F <8mlŞTĹkć|™ŢŠÔ÷k^Ú&eť™ňRŐv­N,źŹ© ±Ku浪µ_í{GĐĆQ)ůő)©ŕ¶:fÇlµçŤ5Îľ¨Äőţ7·ń05ŰĹĎ,¸|U´ ~îżřüWÁN÷J«„.UŞÓŚicĆëĺÍ×ÍLŘe^Žtźč}~>çZ˝ŮUtŔŞÚ«Ii>‡™˙űRżłŞţ˙Š$ż,Ëzf»3ôđüÖżeŽę9JÖ?ş¦_3üĹŇęaµ±¤ťš«uôHďęwk›¨»Y+ěŃí/Äîaňż!ŮčV™0ă­ńŰGg:2N©7~›‘äŕřÎÎlřńeëŮbźÎíqIy=ß’ęö2ŕÇÖęÓüiKŐ(Ť‘ĺő˙ű{Z¶ÍJ*7 )“Őďö;k ;];Żn&ú&áěő-Ý[»Ëćłt/×Ďíç˛ç Í}|µjüˇ$ö~Î|Ůs<ů˛,—KŚBZ~‡,Ë4Ѣ‘(¤% Ŕb`0†ä €ADĂŤŠjÝĂÝ} ˘jś·ŕ¬5ĺeŽ»˝äÖřm‹ŽD˘ňćF‰x´äôS¬.–vmţšo$ă檦b>ľ¦o–ln?|îA]_”ěuó«éx„ŰK—˙j~‡7oąźµ‘Ű-§Â_I•1ą<rDΛ‡ §É—&čĆľ>­ď‰ĺn*·“?ĹŰ]+:łĐ­pűµĄmhuü©ŚGÜZŽWÔş˘˝Z˛¶©ŻA"ËG]V‡{lje™·1U§8ňáĺgjyđĆú©ÖŢö6–ŹĐç­·>M±cÉK§ăÉ·¬ě–¬tD_"lj`˛ň¤*7ËC+bËk6Öćř*éV­§ VvÇƉ6á9Ź$]«CKskÖĘ/:-ţĆW·'˘Ř±‘IE$HҨ•˘‘i ¦ŕC12ˇ±5ę2oĐ–X!Š b*&(C€…¨` €€ €F0 H †!ČHŹŻ źG[ŘyrµKµjVÖr¬ßÓčKqg.7ÓěŰ> E•UaňÚdä˛iĂßĚžę§Č.•±r›sJ·•#ţďCŢ.łęňŁY3c˘ĄÝ\$˙îú’y=–ř˙Ţ< ¶J KBC@R-2QHJ˛Ó3PZ*Ń2¤ÍB®DŮ2K`6ČclN8ČD¶Kcsą-–@H¤@\F•jµ“6ĺČV×bř/ Šš+7ôFś“·"łáXFu’oőcB˙—mü%•BbÍ…´­MQŤqĺM:¦4Żá‘&ŚsŮ^úx:íej©_‘…Ý(ôZ°'b­ěŮÄŞ›v×ÁK3ťV‚ĘŞŇş{”/qV‘EŻ–Eo’a6ŰđiŽÉ®łő.ʸŞďU©S ”Kđú¶î^ËÖ›¦sŇíäMůĐßl3[Űł«Ľj‡#ŰëőßđíÖΗ•VµÓÁägřţß *cłűk±éŰ.N—Wž{<™-­S˙cÎĹó]Ĺhi4ţ†fő™V»:Řr÷>?řąëjd¦•vMmł4ífŻÄôÖ,k–[îׯ–vuňŮáYű1N[}Ľß!Ü}kWžr—ţí?ˇ:Ţť÷óŹ%óżn´n×qő“Đě|[ĄńóŮSžÚ¦·ĺ辇S˝ÔË–©áöîÜU´·5ůÓĺUÜŻ-®Ť˙±m»śÄÎ &Žľ÷ńžwüM1B…®ţw9M˘ )’Š ă)żBA©kČ‹h–˝ę4ľląk{»*¨I˝ @ź{±ŠÝlxńäV˛kDőŃ9;YňbXŻfčµúţ¦02€€ P1î€@@Ŕ€JJH @(ö*%ˇ4_ÔL Z3fÖő3ş ÂČĆČŢĆVAc #+(6˛2˛2Ó&‰-˘Y4CFŚ–‚˘SBhŠ–BZg´[D´A›D4hŃ ČhŃ­Id´"šđ'XŃmx&´KF„2*%š4C@‰h–‹‚Z"ˇˇ5ˇBX¨ŻuVá2•"ÉÝ5IŐťUĂ‚ÖWĆőNt`rv1,Y8×fĄĂiµbW“ŇÉ\kü—Ţ»3‡.ovőÓđOaIY[K~Pĺűߍ|}˛§Žë“ăčüOˇëvsdď|ň:YmKWWZ¸zoWĚäË—5ąf»˝–“fŰ˙Q6őě¬îćŰ˙Đf”” Ĺ!’0†0öBŔŔÓ;®Iµô:-ťŰđuš˙ŰäçÇgÉq|_©ÓkĄWzĂşŃÚ/Ů\†–Ž ˛dȬ«JÂZq‚±<–Çwirĺ2ń^ÜlďŻ)ů‘Í•*Z]x¶¶3枌ĽŐNܪݧÔÍQ·čXŐSĐŰkŰĆńşňOOM ®’Ű$ÁQŰŹ±l”XŇŠÖ5ňýL2ĺ·(Ł„Ľ™Őş˝IşëU˙q8^KŰW˘ÜŮ]Yş×t'U‡ă«ő9ég[+-Ć y2¦Ó{b»Ľ«nVLJíY8fo©ůUË^ŕ+^úŇßbŻ_Żźą—ŰĂ^y!¸ú"oŽř®ńäŻŐĂ«ÝŮhĐŠH”RŃHÍŞ“D“‡´-ŃVvORŰĺ!{4á >[­‰ż–µ*|˛ZzšsQ OC+6Ţ®K°„ !•`“ŔŕŔ"ŕD ±L A(#€ŔhŐřާS·…×7u›UVUš^żCÉ=µzظfy¸Ţ5Sţ„ňéŢ}ÇŻjô0_+čćµ±,xén5Çť|ľźO/JÖëUW±’ŞÎ¶— ŇĄö;ٲu-ü{rŐ9^‹u ‹7ľů·WxN­LŐúË–ôËÓý·ŢN»:¸»JőşÔ÷(ÖkzýN/nŃÎ-'Áő}Ěý\vľ<ŐĺYTÇ’ÍBqŞ“?K&N­¸:ŞÝËI,óé˝ďTľ>ťź:ëä\OO7C˘Ż^ţĺę¦ÍzýLłUbëV‘ů= ĘÎ9+ÖŞí~/fjúYßÁ·_*Ë_g*–ô_SŁ.*^޶|j‰´Çš‘HÓ51ŐĄ‰Îšů!2ˇ˘Ó!2‘¦9 aU ˇÖA= {( • GĐÍĘÜŘ\kN‹aY~3äZ˛üxź*Öń€Ő*Ö^ćA-é j˙:JÜX©ÎĐô^HViBc­Ývş–˘šUĚß±dÝRKÁŽ,‹›zÉNŻ#ĺ˘LÎ.Š·ÂÖoRU•×ďę]«řq©ŠO’OÔ˘˝ťuzzVRŁźSvő†Ą=Ů–Z¬m:lŔ)Ę´Ń~@˙cŁsf»µ_Ş2¬»§¸ZWçgŻ„]®“މ’mřËJ[2Y¬šäĄ!ÔĹŽÝş~yf•O] °|sYkkŮZ«X^O<ą˛ĄWĹYď0‘îW>>›Ĺľ[+Y˝—©›łĄëŮc—ä{žîob®+O¬Ý^˙!ńîš{ÔŃ}×ýQÁňx-üĘßľóŃ}O[ÁÔ¦,.Ń|ŹWő%é3ëţljN·z¶‹á´­šFß'ň . auk5bm´zŁ·˝Úíu3ExĽmMe3çsdľl–Éw«mšśó{%d‚†ĆÔCň:ýá ´ôţŚ ”ÓŇ=EĄśÇF… »ęČ3uzé ™Ą˘ËGúC@SB€&P‚Š`ěhD a€ĐŕIŚ˘–„•¸E!’†Đ—č6K`K3±m™ŮčUec;YÉ“dVvňdѵڙ“!ŁFC –LÄEfÉfŹÔ–E@™L@C!¨-’Ŕ† †‹d˛+6K-’ĐTşéţÄý Z _$Äj+jU’ŮŠ?P3h–[D´Ef&Š0!’ŃmÂłfŹŻ‘UZ%=t%ŁŁŻ“5ÚŞüŞ·lž®ÝufµPÎÝ\­ę^ř—á‘­tžÝLwףýP±%˙>ŞľďFÎ*Ň×·©gĄL/Ůö¬őÚLííui M˙Ő‚VŠj’{ÁÇťvť–µ[A•ódµąriřHşĺĎ’–˘\´Ő‘ds¬–«o×rkw[Nó¸Ú%˘4V|ź"dHŔ  L)11 Bµ)Kăkű˝GLJ´o"Ąl4`2‰E +r‚D˘ŠŔhbC*-R[QBR%Š)nRܤĘD”¶*-lR%lR‘ĄlŃš-kD’zęU_ŃšëëáY«e[ĹŢŐú}G^§aߊ¬5ýŢ­nľ*¬–—’v:»™ňR”ŕÝyë&ł†v˙Űł®­T©’ę÷ZéčOjůńÓ—].?Ýe«9úrŃ_=Óâ륙Ď×ídĂ‘Ą­lő«.ńé¬ç>¸¬®Írr«woz˝dľŢOs,ű~Ű…+Ěž˘Ąh›ĂZ¬ŻTž‡‘Řľ[ĺo2‹­ Y‹9ľŠëőňv/Ǎߡč,={cÇZňy-gFăgő9:ňÚŞţŰk÷é§ő=zŢÍëÂ×T·dÚĎŐčYŃ/Wkşů^;4Ţúzáɧiá÷)Z7eUufu´¸ńîv.-"ěÓ†·k–ęĘ•vURáL#Óčü>[ĺÁ“"Y:ů5ż¶ŹFY dęňÔÉHďí|WcĎš´á‚–j’őj|N–§îP ”"Ń(¤ޤ–“ná+Ł/W-¤˝ ·M/'-Ż‘~/O°Rö«•ú †ęęáîtaüq»~ ř笭ĐÝ,±p®® ¦ąÝť›mž–.ö|˝oăŢ8ViC…ŕâŻ]żÜŕéÇZŃq©’îvž+u±Ů¬VnRôôźBWg±ěľ»ČýŻűĆÔ›d®¤­w ˝9:™ż“l ĽŻľ›F>Ć|xí‹ÝiÝUä‚˝»§i«üwÓa@ ‚’@/¨S^ H Ř7 Ŕ6@0H`$04ެ$SQ§ŤăÁ4tŞź%ÖĘ馀µŘn¶KHý¨Îů-’łçčMkşFřÄ×-|­ď®¬čÇ•ř]ŞÂŘé® Öţĺvkc‡-˙6ćéú Ţ|]N9,îĄ%§Ł92QŰ%Ý+ř¦öô=,9gąś÷ď&ťiM¨›őQŘvvooÉ×¶MŕĎ^}Tť«o z?©É^ĎKă>k-kŠzëđÖmĹé6R}.÷Jíu1vk“*¬-e¸QýOŠů.—c§Ű˝3)äÝ«OÉŹű[<¸ă3Ł~\Mśó×®>·«ń˝^ľ|ťŢ«Ną«řŐlľÇÜř^âYűą­Y×#Şm¸™=<ٲ|OÁŕĄgşIN±?“<}Žç±ŹL¶żąeV§Ho] ă<ą»í·®CË:gľOZăR4ŹSćz˝n¶zbëU«:ÍÔÎűaÖ]›ęĹ™pŃH”ĘÔ"“  ‚“S®ĆśżFS+NŹ`§Wfő`ź/Ćß Ő”6¶#DÓťn•®¬ĎBÝćWŹeCl@1 @ `!€E@ˇ08aH PŔ ˇ Ž +޶˝yU=QŐŰę·°ÖkmęŚúý‹a­ŞŞ­.Sgn~Ĺńa«…î[Á›şł1ĎѧgEWGíßFźűžţ[­K7eÍëFü[łź?bíx«“KÁď.µr;)vŃńsľ†<űoFü=ąy]ߌíäËl·Č­ŽÎS–ŕíďb_ĹÁ×y:$ą}TÖ®\-Nℿ ëű‘ľ_jŘUňăćŇš-áŰÇ|é‹“žŰ9×K·¸ńąä’VŢNnďN¶ÂŻ\‰äOö™ćíö±ĺVŞOý© /ĺ’ą°Q§ýĘŰDjK»ëţc6ĚĎG/RŤć×N;“ŘČď–Úč´G Ş“m(ovs:uqżÍËôzšŢYłŇ®–»SŕÉâČůdu…żˇŐ‡>+?nšz-ŚűsQş´•^ĎŐôěćCBC*ÄZ˛[îK»xěÁÓĐŠ9+hÄę˘<*ýÂt!ľ:"93IVŃîOčTK´Ż©%ŰŠP  r҆ô C®<™?m[­u U“fěŇ®ţ¤-ţĹ⿉˝˝F k…«5kěĄúÝ×k&ëáťKŠ­“SUŻ&aź´ÝĄoúTRµŐŐĘ~ĽăQUż“Jµ+Źíň/s‹´ě´(®íÂfwN¶sż©Ôřđć´«Ň~§5ŇOG2PW%ô­Mí‘;%g-ů9TŐĘщٷ/pŤr{Ż*›6˙µ·±¶NÍÝëîYÚĘg#ł¶­Čś˝ő:űý®ĆwW{MVÉhp”Ű{˛Z‘"Ąˇ0¨řĄ»ĐIŔŰ”’ÜtŃh… ßFR®Ťz’—§b µU~äš;7+Á*­ş7XňCŞZym4Éh „…HŠ @ @&HĐ!$¦2 "B@¦ÉlM‰°™ť™M™¶ł;Čbަl¶E¨d4[ ͉•ô%K%–ÉaPIOrYš!šĐ˛Yl–A›D´hČh4_ěM”Ť‹P&Ő'éčSô&!ˇ4[D°3h“F‰dTA,¶Ľ’ĐVmâÍzQҵ—şúŃXrűM¶¦D+7fݵf¸1d»ĺVëU»;xbĎUwMýtf=śŢŇö±¨qż˘î›ŮµmWgDő[‘g‚öuşŐJ–rôíˇ˝Ó/,Ó5ŐV딍3’żFŹZ¸^›†Fşřăg˙°ëŮr™iÚ,˝Źk' VVň‡ŕü¸,Ý›ovCFůď\—ĺUČËqchuIÚqoe%ŇłFŁPłxěŐv.—ç§ űOŚ·qq1§©y,ěădĽUËÎ ÚőĄkLXT±ÓŹ/Ë`fÔ­oŤŐ(h¶Ă_ŰŁytMmäÁ¦›Oto†Ęőxí˙„ R(’‚Üd˘€hˇ!€ĐĆPĘ$˘ĄR)Rˇ¤-Š[”R;şÝ˛«ę¦*˝W©‡SěföŰ… Éěôúo«kEůVŢ#ÉdŢÜ1ĺ^_[§—łËŽŠľ_ݎX:YłZŐ˘_‹9ŇOK»š˝L8Ş«Ž›ž?s݇ÖJYL©˘3Éň}–ňcÇ~8ŰŃ$¶ű—ŹoÔżc;nÚşąďD“:Ł?mäË\¦ŽŞ ­{d»˝Ü·»3E˘kXkčtSł™Qăćřż©‚)Z5Âę˛ŃÚ®ŐMrŞÝŻC4ttů˙'•ů(vŰő,+čúÝç7Ét/lŹ. ʶ¶Ky+݇.~ŤúŮ*ëz?Ă–†}ŃoyfÁ“^jeëą}Ľëu«‚Ýěőy ‡ĆaăX·fëWčF÷w5–*ĹÝ´–˘>şÝ^zE$^l7Ă‘ăżî[Á% HHc@ Ep Ŕ EBkM%ÇČ'ŞH-ąUĄ.’z|ŐUłµe˝™ËTáťťw\¸ý«V8ů_îJBŻręÚĄÇýEꮞŻ{łşCţůD®>¦Ř1S âŻ6Ű$úV9ÓÇŐ¦5»„ŃĎ‹©šíMbł«g§‘şŐÚ«“[#Ďżw3”˘żmË4¸ěĎ‚™yŰŤjpvk†¶K •çîtŕĎ^ĹŰż>§©ZÝŐ9IÂbţP—ˇô5řNżoâ럡‘Ű=TŢŻËóX<žŽ>˝űxéŮq…¸łëţ2˙‹5şßćíMš–ˇ}Yź˙O+:oű|µá7®sÇ»ă1aíW*öqßÝŁţÔĺ4}—[ ľSĄJüž\¸Úrôn<ţľNO’˙ěév/×ëá­Ż]/w˘źĐŰá>GąßYóö]V(JŞ5ÝżčgĘůYűd™Ňď+ă$¶m»Ög >[â˙ů bw̱bĆźăĎő8ú˝O‡čg«Żb·Ďµ[˛zż¶ĆÖËÖ˙ě=Kâ«öóămŐOôf|ľ^¶nľk`ÉFŻWlýmł;VOýI,˝ßQň]ś='\öëű–¶śáI>_>Eź=ó*đWmńŢJß!ŮÇńď­ŰÂíËńĹ{Żó”oÂgń»»ó»¬či“¤$żĆĎě.«ö¦9ŰĄŹ|Tídü2)qşű“gůěąĎwéú žĹ~3ÚĂž*łZßű/Ězžgc­›­j¬Ş”­dO)zXÄ@k—­› +“%b·ŘľŻS'jÖ®8NŞ\žŢ.­ŻŐX;Qg]š~Ć|Ľłűő_ţ«Ŕ¶Ő­oj5[~ÖĹ“{•uVŐIŰň}‰Čşřô®=ţç^Źż×Ą˛/Ë×î‡íĆŢëśä˝?Ęň-Ź%çVą)R(=>ţÎ[ŞŇźăŞĐó}SěK2*CALGQ7w^5µZüąz ±ť:őMW5¸rSGŕčě`ĂZŇŮ-˘¬%]Űő+><]†«ŠéZŠXeë^řń+5UEoÁťř\ůpŰëZ5ůsR’ÜɨўšĎ…WŮĄť]TVíu×äőť^ľ¦Ą©gş6&VOhŤÎŠ*ö%çËt[˛ĐH«Żc§‡ŻŠÜ×次6vŰŰljfçÁŃńŠ~_—Đđňv’XÖJ»Éľ/’ŻąJäÇË_ěn¸ŐśďŤĽőnyIĂéyaαVŐ­óBČ«uŻßîpw~EăÇţ\oqKĹ—Ő~G«“·Ď sŹG:ŻCĚů×_ä*óĎ ´pë˙w¦†||yć_ő­yyqĹźďšX/‰v–4Ý«ÉUž/o˝›.Hŕ±:éÇÉy»öĎ\úÉŃâZíô3x˛ĺËîćjtŃńńÎoý1ĺĺĽOűi“3ĂJrս䌸«žľî-üŁ>ß.I˙lh>“·+۶§|gL9[šŐ¦Ľě^kełXď˝}¬–»§,-7äă­ďî+_Vôeśú=SŧFtŰ+«xňNg]*–«vŠ¦Ô­±«QCZ‡µZănűú“WU-ŮS(§Ô˘_Ú (–9ŇB2h{VFŐZ’gHđpÔů  4ÂÓóV˝ă×úžŤ+’ÎŮé_i*şűVŰďöÔó)–řnŻG UÍOošČÖK[•§éăýLŐíbÇíW-n­{ig]¤â«ł›k%ŠĽj§HK_S•¨,*ëw]ü}®¬ÚńŕËÄ1ŞÜ¸ŽŠăĽ«ňŠ/RňS–®×CꓵU]ˇ-ĘÉfřĆŐŇF{„ňUQăQ¦Ň`Ńwj4őÔ ‘Al–Q;Éb0&Pš ‘ ˇ=™m€ŔZjVeM +/}‰n­Ă I¶źŞ3†Ţ››*ůZ’â»-@MyňeiťJ—3!dâXVM@?RÉ@%˘Z @LdŤ0ŠA“$ ˛[kLă%•‡^^@Áż$6wö°á§çw ¨­këęr_­’®Şż—*ňÓФ¬"Ĺ2–É4­î±×{8Ső4íu2uxsr¬·[O ţ+$ě}Ď®»:D6ëć=I§G6LĎX┥ĺŚ68ěKő:úÝLť«şWHRŰ˙C Řo%±dýŐô¬XźűŚDTA%żRäR€Í’Í! –‹h–Ed–É€©~¤4i´Ah¸@g4jŃ-™-4CDVpV. "÷Ô6A]6íNJÖšRRlĎ˝_ζ^TďFĺů+7-j¤jcŁŻÖuk-ô~ľJŇÚYĂr–°rfěß$F‰n_jÔľ*ą×GFy±ľ˝–UnZěÎlŮ[+4¦#Běíető2d«IBdi;95«­ÜƫɛÉЍőa&7g+r1ŐÖđׂyY=µy56Ü ž&ěü y+OĹ[Ua|VOÔ,;×kżG×®5/VÔ­ŚßĹvt‡WúžŹ_¬ú}{q\ó5/ďč&ŢĽ'LŻŐµ,ëu n™H×>Í[ËžŤKÖĎi2FZvüzëŢî™”»iVö˙ňúypäáZ»UëVµ7ëö:xéHÇ9tZÉŰŰí˙•…6¶ŇnIźFm»őgńxű5ż·zFníŕöÖtÂřÄŐ=Žťófš<´˛˛OđÝTn™ŢCĄ”Y§˙Ł]\˝ŹëeĄń沗nSXQô:;XqÓÓÁE -fN×K7[ĹŐ«˛Č۵çX˙´žž>Ç_ ďž·şz,j[_ú‰íź'ľďłŹ±—eJa§žűnmNŹř•˛~­ómÎźB°áÇ“-íĄe9Ć˙u~ĄuúůׇąÓůÖWn©JÍ)˘×ţMËřbĚ—;±ř¬ÝŚ]ĄŐłĺ‹#‡KkwÉYfÁ’ťlëÄÚÉŠ"O?/É,Ď|tXóŇye^N,öË–Ď#´»kh'äÍ»ÓýŠV´üSÔwµ«˛Ńů9ÖćÜíÂú&EB) cɱUpÚÚĚ&f‘˘˝Őx§ ńăXüË{ł,”ułogŞfµšâä÷ÜuÉKŇ.µEBëWňoÓCŇčćëÖ×¶GţJţĘúžn<žÜ¤Ą3Nľ_g*ČëË}=]9;ťĄ™đ»Őţ5_ězŘ3[1®Ő—»‘ÂHË qdă™â­2[Tžç™ź&kö[·ď«ŠŻC=}±—g±ŐY­Ź±†ZţV˝Jâ¶l…^–łÝA—oĄ~ҦZÂşIY3źŻŃÇ“zMrŻĹ'úŁ>ß^ÚÉ\«'6çÔĺŤ#JCH `(€(( ˇŕ` @2ˇŁŔ bęő–$ŠđRĐŐš”ŽĽ}Ą’ë+ îţ‡ xďlVW®ä±użs-–On­¤–°.ŤyewÚŠĹŠ™ůeËxsŞŘëĂŹ jý¨âüŽ“á}›S±{-k0×Đé·_e,”|g©ËŘë[ ›ŢŻfvVË­ÖĄ˘[ń÷Řžěí×ęá«Nß—ŐęyçwfŘrQe«‹= ăuň"QVzź ňx~;&KdĆěîˇYx<Ô’B-›2ô%ÎggŻŹŕţG˝wٵUk™»«Y­yk:ÖN–OŤř<¸0ţyZnîżWŻú/Cä>C6^·JąÝ1ÍhŁOĹ}~Çżßůšt{ú×\±:ÎWĺNĚĺĺűlś\ç'¤uńýrŢgmľµň} ™ń÷1>»k#˛Kőđ}ÎX‹:*Ű=k*®˙đ|Ć~ÇĆő>b˝ž˛÷pŻĘŐ¬Bł˙´Ç±ómň/»×mWJŞ?5ôeňńľVYÇĎŻĄO)ă,ĽóśzzŁäţCłŰ·łŘÇ\oý©9Lŕ7îvňwsŰ>D“z$Ľ$`t“'§ł›˝}Ŕ! Ş&ď_Çš•5^~€{=Öéa囲ťr$ý¨f?-‚Ůť{¸_ą‡Š®ž »»X©ŘęÓÚµ—ĺŠÚ~¦ßÖţ˝¬Ýš[ÜÓŘZęsŮ?ő.Ţó2ßüŮ“µ×/k>^źG­Š–Ś—Sgĺ/ü3>—^Ýśóć«ËxăŽusô=OxqQv]gx˙Tpuľm[/·š•ljčť| mńâwۢÉ<ą˝˛Oíćv:™úŞŻ=xňŰTĚ$éů×fŐ÷žzŻŰfçč˙ óţ_Ó†˙YŘéĽmçéóśś}kŁ'UŕęÓµŐÉg+óiĆźˇ‡[żźZÚ÷v¤ţIëŁ=¬ę¬űff#Îç±ń é–?Ső–[đÝť,˛|đŹ“ę;d¦|+’Ë Ç«ŮšćşřŢ­qc˙Ţľ­˙»=˝1W +ŠÜ¨żkzś}®ŻO6k[.~7Ń:ňZ]âďÝ}5lď3źÇ«ĎÇÝîe˛Ąo.Ú-źg­nµŐmegmt=n§K­†ď&+ű–Z')Çô2ítqĺľL¶Ďůjřé¤xÜż´Ţ8řOÖç<üĽ‚E$m‚"’@ŕiTÁŻ^µwădÚj?©)K[š8{Ž‹őđőżÉví˙mG“°ýŠ^ŐV­ŰV©ź:ĺTÇ‘´ŞŰvÜÚĎŻěUqoÂőű“ëË^ąĂ*aŔëďQj˙mlô“‡"|í)':¤o{ţ>Ýbrź“zšťŮ¬š%ŁFhŇ E2B†§Gg<íSJóƸńläÂ겮NĘ®SăąŐ~¦·ůňYÚźŰX†ßÔ…ę3umzb¶WÁR±vE»]{ŃŕNÔ¬BşÝšdîYők›ŠiŮÖÔz¨/㥌ݿÓ~ćoĘ˝jSťT<‰x^úś:ÉáźÇ%¦łăM…ßëd‡ŮëŮ«8WKĘđÍ>'ăűŮÉžŹŰ·ěç»e›˝ŚöţÝ4Ąi[ZŞ-©áw:_,µNĎ[dmŁŐîĺ͆ŢÖ>5ââîćÍ|ôľuµ®ˇńđ…Ëǡ6růćI×Ý뮾EDś5»ňrśë§d˛l– Ey6éăëäÍĂł{RŤhčą>^4&+»âzňÝdĎ||lť+¸ş•Ą’'7SŁNţ?ŹJÍ©®L“g±čüŻG«“±ŠËąL9Ő*¬ŻŁmmm6gGc ę—~Šą;ok]RŻ(ýęN™ŰŽ;ő㻟íßžgN™{>oä>9ô«EůZÚ»Ú?žÚžyマÉdÁšÝëdµüqŐňv·ŹĐđo[VζPÖŤ=Ź)ń­řßśC%–Ń,ËI‚Z,M("˘Vh Ú%ŁFµ! –[D˛+&LX…ą0&ťtj$Ň­+KýG–Őă°-˙_1‰…C6",şÚŻđh†Un«]ż!:R‰Ú61¶Gk/OCUg|nw2®7mv^ ·LT»m&kzŐ¨{xfV§·NW XvtoŤŚ,’łKbŻnNb ` ­¸Ů[ýLŠč¦Ns¤$Njó¤ŻW/:ĄŻ†M2şJ‰Obę-ĆEhÂ)P Č!–ŠJ‚ *¤"@Ň a(ih]v\ś)Ő“%°G«ŮěăÆ¸zďuşô˙©ç×”¤·z]?áđk±çĚěz8:ÝUjćħĘ~ fłąęśqĐęóČç%µj|ú›-ótÖ|u˛üśŞ<˙‘Ë{ö-ĄiűWßÉŃńWł®LOZn]ě™Ćü°§·X˙#qę“=zö2eę{ŘŁÜKTýVçľ-¶Ý.ˇę“FvyúжOžłč&ÎĄËĐfďćěcöň$”§ˇe–‰«Ť0äöŻ\‘<\Ă;ž<ß%ov‘Z×ń†Ď9âÍ—uÇf§t‹*XúŤę_-EöŐŮz–ĄúwËŰěî6Ö:Ěëęl˛ľź[ ěů;52÷ňĂä;ťlýÉ>VkŤVę=MńžÇ;ë®î­ňözXňß˙sgőúvľC& Y0^®—˙řvőFü¦LXqM(—çgşqˇÇŰďdíÖ´Ľ>ňÇíÇ^ÉQŞúŰ·kRădôŤŁĐÉk÷-©‡]Ď[ˇńŢ˙['bĎ…qţM˝fŞf>§™H䝥Ż)zIřVÍÖÉŹH¦5îäMpUŤU˙t/ŚO*âżJ˦»¸íĘ–R”jŁy<Ůmë©ô™-Ń}šľö?đßOm(űo>§ńaWnłÂmŕXž4˘0ţ‚Ĺ‘ŐĂŐ:+.;,n·IěEőn±Ö[‚/i\b ˝ÝZŹÔY-[Ä/»AP–ĄŔ$8«Y®-č4‡TRE@‘u”ĺn"ŇuÚĘňÓ-żłd¶6ĹŮĹü›gÉM˙j^Č‘Ič׹ďuň¬–áyšFźˇĹkäÉěí&É‚‘0„4‚ ‚’@Ťńc®ISŻ„Â©Ź•´·„5\đRĂKÖ®źţäFj~oŤa/!P„P’*†ÉPŻúŹOÓĎÜ‘ę0k±ŮlÔ]UŽŹňŇNP{ ­Ů˝ń,v×ÖßC;ZöŞ«łu["RoBŇ„pZźĐnĄż $!˝€•fś­Đ»ÚŮ_+ŮŮí-Ë'‹+Ž…H¤†‚ d@  5ÁŘÉÖĘłcŽJwŐhg˙ÉŤË|™yg»ăZ¨M/˛2řަoä˙#-,©DÚvňŕópe¶ µËMmW*v=Ľ)“řY»9o[dVJöô1e’ÉśßçłrËvŰÄţ=Nţj÷ŻVącĎvŻŤýYévz]ť-Ř]g•§.©Ę_ˇççîő?“‡ą‡÷ąi˛“ |—eeÍ“âłLŐëËyśqĎ9¤ň“‹Ď<\Üq䲾KZµâ¬ŰUôú˘uŐyz]®ĺrő©×ęRĘ‹÷¨Űčsu:™;«GV«˝›^}.őúŠÔ­ů5ąďÓ'áŹÝŠdľŐúúíľ*úĘZ?¸±áxjť?&őncOˇ?ËůNUŘś%ô1vµ/Ćí4Íű5łJÔpö9]2[W©bRËH|–Ěxę«Wvh“uJŰ“’¶˛â¶ň]F/%›ŃŔ•m“w˘)á±|bĽVĺG3PŕP]±´Ą˛jĄĂŃz”./˘´\]gB_eT´DŃś ^-_ŠŁ0«"i !˘Z4d°!˘hŃ’Ä"šD´"š`´ B(Lh $ ĹŠůŻÂ›ęő$tžj-ÇëčJ;‹jőoĘ‘’®SňŃ—K>Eš´µ›­´†tĺî®˝k‹÷,—ĺg°úů0ö®›Ă®Ľ–Ć~Şăż_&NŐń×[L·ôg˘ňcIâYr¤”łLőnޏ¬©’ţ^ěó?řîĂČ•–Ź{ČëíŠÇ=Ž–˛µ·vFvŠs©żswXńKuŇíúśđTK×r @CB(%˘M¤4"eOü( ‘ :^ŘîŻ]Ö¨Őö}Ü~Îfß+rwôF$Ůhˇ\˝eÖ˝iNXčÔ§çępe̢Řń.8[ž/W$2XYŃľ,ĽY+–Ü­~čĹúť¸ţC;µq×[p–ä.öĺż{ŞűŐńŻňSeę˝-ô»˙JÇłÚě®®>NŢ•©Á˙Ëć_˙żę^og±Ň®GŐŞÍU)D}^—«ĄxÓüm*ę˙klńz9­Ř묹——Tžéy7ËŮ˝zŢţ:óŞ×Š˙·ÔÔ¬Yϡĺ±[?cřëáZެ”—ŻÖNŽřüťWl™c›Ń/ˇ}ź–ĂLµXŇuKVWW˝^ĺkŤęő_ORq­sŹ'»‹·ŮĎlŹIiUô<ë&›OO{ţO6,–ĹlU”ăvy|›ovŰţ¦.7ă¨d´P™+LŘRöÇz䣋UÍ_Ôl’+é:źÔď?ţEäÉ–ÉÍ©‘%ÎÉL#.­ű?1Nî źŽÖÄö­,Ą*˙CÇÇŢíbö•24°¶ńŻ łl_/ۨ«Ĺ%‘ĺ˛J97şqŕßí>žľě~·ëččÉ—µńťKő3ݻݫaľ;L5Ľž-íl–v»nÍËoy5Ď“ŢË|°«Í·Ĺl¤É™·~:5&|őA-KZi"(M(-’ĐT´K,P(Íěf÷5zhfČ!˘YmȨ±›ĐŃŠŢKqOú…*¦šż_čtĺ묷­–•ŹČÍfľń4śS/żŽéihÉ’¸^uD˘»8őúŻŢUŻězÉ‚­ťřŻÝ0zVÉZ%[Ů&Đś­y™ń×GZąFG_cWz_“źY9 Ő„÷%”É"¤o%•xˇ=ÇůYJ{S‡‡}Q“V…;×Q_ček6ţŔfÔ»ŞqgáŰVÜA‰Ś Lˇ=€Ôb C)R˘„†TRܡ"Ń@‘IE% @‘IE$PăAŔŇĐa°ŔĽUŁÉU‘Ĺ[üźĐôó÷k†ŘńŕŽ5‡hÚ=,eč–kĐůk' •˛äôŹ0o[ăčő—µíŻÝ˙ĐňJM˝öEŢýÓ;vŹ[ł{dëW>+:Ć®hyö˝ň9˝ťšŃ7©*÷áÓ⶯­†ňN E ŞFřhšna˙±‚5Ĺ đsô*WMil”Jö•W+Y ,—MZ±Uł‰aUĆŐĄ?djĹfńrŞ´ÎßB˛É‘+RŃ Şš$EM*TRZU±)UlQUGˇÔů,Ýl뤯ŽúZ¶n"‹úś5E˘Ćn^®Üż%—/V˝:ŐcĹHŽ-í§÷g5rť‰H¤µ)‘®Kj¸˝„íkďŕI‘E@$lşŮ[†˘-}3‚ čÇӵҿ)«MĘ×_CKUĹ“Oę ”‰#EąJjšHŐ}KT„ĽÁQ+`‰Ş4H*Ť@E@ŇĐ H¤‡(Ô c›¦,włšÂŹP*·ÇŽ?ÉnW˝EzřÝĺÂŻ”źĹ‰Qéiźă˙7wçdJÉ“#áëˇŃ–´âąčľ„cöU˘›ú˛Ž\”UłŞső"ś®‰ÚĽbĎÉb p4‚$ˇ@ŔŁ(:QŰo ÓZ2 ­d'KeŞĆžŁµ^8MC{›Z‚ZťÇş…eŰúÖ¦JŃ˙vÍ ÷1Ía-ÎŚř«Žüť%™%Ĺ@Ó¨ŔP8*P8T ’Yl%¨  ptłĄŐë˝\٧?w6|´ËoĹŇ8ĆÓęs!¤L]˝y;ůrćÇšŐ¬ăŮAWďeÉŮŻcnVt‘TµRdţ—oöŰ·ŮţV_sЬ(Pb‘JĄ$‡N!ך”ŠH¤Š€!&R©I ")*–Ş @ŕŔE103u3hŐ™Ř%edfęjČfŁ,š!ŁFK*"ˇ”Ŕ¨ˇ€7č4:%®Śp¶A:}B/Őq2tăşşŰÔă7yŞ©ó§Ř–5ĺvŻźž­_2ËNß䚇ćĆÉ[băw®Á‚NÍężŘ™ř]ü˝âĹ|5®W.žW‰1´Ú)[i]úăĚîí]“Ů·lWp˙ü‘uľ\ÖJ'Svţ˘ă|ź—׹M¶ô.#UgZM÷'%źjł<·—Ç wţ×ú 7˛^[ż&Šüëő!âsŁĐ–­ŤLďˇP.Vn®ĐSŁöăvŚ“—6óąvËâ› .\˘7-u웵´I˙Sz[üi]D¨ĺ’¶XëGhŢ_‚jăťäĄ¦®`Mčô5ľ&¬śŻgnRôŹB‰ÖŻč-f^Ĺ)Z˝…hűM˘4؂څ¦ä hE  $–ŠbDSD€€b` 6L cµŁÂn%ú•Ź÷§1÷:.©•F7 k¤Ń…ş÷UZ9ÖQŹÜě˝rYV‹hŐ“źkYúBŤ†ŽŚ8z˝ŞBŁŁŞIŘžÖUŐŻń°.:M­ĺ®ŢJâ®*ţ)=ZÝšeľŢ|sgT”ZĎčgű Ůzx˛©nş6‡ńŮďk[ěŢ“YÔęǛŒ¸+¦%˘~O7±Ř®^/=»)äב׀ű=ŻvݱŐ]=lŽH) ­]źąD»'WÁ1,ߌřśż'l•§*´ź qnŽËű]Ľhu`ř.żcąźĄŹ˛ŢLŻ)I&żţ$}S;ëńůz˙/[˝Ź­ef˛µ‘şZŢÜěěôđSŁ—żNĹ1fíRµÍž˛ë˙ŞŐ…?‘‹ĺůâ}GČwú—év-‰ŐÖ˛Ţ>M6ë:=VŹąÔéSâ±ä§cÝ·;•U·kF•×dx&§*† L¨DĄ-/Qđ·ĺôÜżý´ť”§ŞcČݨťvň1t´ńŤ^¤}ąU˘WqhÜçşIÍ\ŻP" .ŔD´PŃ0Ţ‹s^˛ä”Ą»4®[Ť©mVŕrÚ¶«‹(e`ÍědY8«FueĹGorďEŕçXů»Zźµz‘O˛ó÷/îÓž5ĄRRFŽ|ąk[ŇŐ¤ţVj4:0wź_ĹÁ>3¬úłÔÇ‘ĽuÉ‘*;$Ú]‚mŹ?äű *ő±>-ď*…ń˝ŰäVëf·)Ö­úFĆ_/×*Ď˝o ý—ĹőŢLţďöă×őô/s'ëţugÚčfÇšË;^ŹZş¦˙B:ëłÔÉîŰŐ—š´ ÷ďÂÖ˘Vuť'ĘđyŹ”÷qßµĹŮFâÉ9čKo}\]ŢĘídć©Ć}_Üĺe˛1[ťILL*,AŁ3`&T´K-’˘B§č"™$"‰aR&6&€–gcG± 2^ĺ2Ys˘(­[W&»ÁĎc§§Źź;?ĘżÚXRĎÖymĘş=Ă6,’҇Łľď™×d›Źˇ¦l“vÚĄg!9+b®+[2\›đyŮKÝÚéÉéäÉg‰Ţ‹U¬3Ťw_÷RI~Ë  ×É›f´Lăq.6=\™1¬jö\©h<ţűYŻiBňJ±€Äȡ*żÜŕ·I§ţĚÍDë°ďvŢš%°R­mK-4Ťrv·í*ŽßşĎń ÚĽyD¦•˛9ÓoBníd¬Ö†‰cłÓAd«¶Îđ%2Y0@ء "„†Hb(ˇ˘‰E„ŞHŃ"4H¨.¨ITHi "’*´ BHhi "€`€hŠB©BZ!ĽŠD˘*ęÜ-Km˝^äT˛ˇ˘Ń(´®¦•DWÁ˘,EÔŇ¨ŠšUlTZE¤J.¨Ą ··*C@‹¦;Ţx&ăxx©Îę©7/eąčW>UőRµ\U­ĽśťgLy'')OE]ťťśŘéť*a­Żh›?P”©Ź?[ •SwµˇFşzŹřąraç“˙u˝ěâ*o|üîúĘÜ2B‹/űŁcěâĹ“ß\čüYë>¨#—ŹÓđâK«ŇE¤iU˘ÔÓs:ěj*Ş-!Uli‚‚ŁA2©@$8ĐJVĚKqŔĺ·$©MjŠĂNy,˘6#íM+ä鵪˙Ço(ŠĂýÉĄüę™>ĹÓßbńŞŇömŻÇa^ęô™‹/FWvłü·Z´[B‚€) *$ľ¶JáYš˙ô«úŤńqőč_ ÖkdÖ’¤+_–ě kµymáy’/űtť=IĺjÚjĹ­ś°^JkDĐ+iéç`5weĹ6÷ţ‡Ąí¬ŐŁËXµN\ÉDócR¶+ůy¦eGˇ›íŮ©Ç^ĺŰ»yceTtő˛{¸ć˙٤™ćĆ»XÖLąn‡jű=UOî¶ă¶ő9W›ł|›űłŤŐ­ZŃěi\VµŐRs«±Š÷UĄâ·/Né×\08*Ôuł«Ý !ŔŔRŕ ‰ALL°K „H_€'ř•€%"ŇE$¤¦‘I "‘$4†2hCÉŞ‘É)Y¦Ň”Ť*ń;ů$MVK“Z2l‹ ˛*T˛L–XĘ ¶K(–"„T!  @0$c"„ÚŐQČ 4Jä˛PŤť¸ŐsÜćNŻ˝ÝâEŠĽµţĺú†5 Ů™»Ů׏€çn<|Z»r¬×s ZĎFäí]‰Ý‰MKpµgM#Ťr^˛¶†aDçG ÚůJŹZŻ$«ß+t^ÝvŃ"­G–Š·[F¦4U˙kÔvědmŞ®1±>‹ľ¨żO‚zDĎÔÇ›Ůę–Ćąńć˛WkH–Ń”áďő,JŇż›[/Y.Ô¤ŞÎű2&ś!ĎĐ˝SťVšžJµˇ‘µ«řO)2jKI_A=B`Hš6ĽĐ @c:xż-¨ó&®ÔĄŇ­fĎYfA¦,•äą$ÜţçáŤ.ŐîńŰF¶hË-^:đäŰzÇKä§.jż’Ł1wvŃ˝'Am@AVI=„[Ţ©Ş¶“Ţ †ÚKviŽśňV»KŁ/WÚȡëŁĐš9UU,•ö4Xę­ÎŻOAv*ŐÔ¨ĐXg”x vÇNN÷z3Nv~Ţ©™ľmN‹bşűXCâß_ĽńüyäáFŢ5GZŐi6v•ô=+äÄľF׾j?‹·^g|iqUă˙tź;íV“kZô9žń?c6˙–ż_GŐéWŽšÝŮ^VŤýO0¦&Ť pć'čPš Ňî‰*ŮkĽ/cTuŃhö’)Z_Fś­Řdä˛UWeűH®;YÍś†Z¨„Ô%ĄJÉŤ7Ë—2˝ťźŐi cSB`Db®7hČá=eăáÍ{ź´…‡†;Ő>JŰ+•lĽ3«'iíŤEQŐŐéĺůÔëűN™-Wz»JN«Y’'MןŰ_•~Ăëc˛­ą(OcŻ6%K7jň¶6Ô-uGlů-o5^›bďz`u^ß*¦›ź$÷ű˱ZWŞ­m÷'ÝÍ|VNĽ”~ăšąřwdů dé¬7Ż,ŤCooŁ'ČSVŘ«HÉá­›őg ,jävt{ËŻk¬­ş[Wçň9;9)—5kg0K$žĆs©z˘l–EC'č[D°©3˛4dŮhÁ!‰‘A% e1=€–C(DT’ö+É!RÄ6 $†[d2 ŘĽÉPö7Ä®ëWW4źÉ-Ě­3´ť^Š!G©eqŕČŰisJzv˛[xéř˛«ţ<­YŤĎ’zű eä«ó÷/á?,şöo-é‹RÓ1żJüźŁÄ›ĽđăĺGÎÖóçő'ł{p®\vkčEţÜ÷É|XŢ Ő7ëô9™wµ®Űł–üČÔK%”ÄÉU&µ|×ä´ő2`íhăŕ™˝ČUNŘÚţ€î­ ­·cY.+D|mG-h·däiÚj;YˬĘ!KL–´ h1 R)ŠER%‚U­ŤĆhŇ»‹Ş!ŠU$RܤXŠ@4 $†Gä¶!  đ E"Vĺ)E˘˘–ĺ"QH¨´Z!€¤iS:îh‹´©˘3Ş5EEÔŇľ ęŤjhş’·.¦’™Kr±á¶TÝ|zť=Z:ŢĘŐ‡ő ©ÁÝVs±ÓŐĹ|Vş˛ÓHgíjfł«†›ŘíęçySVÝyA*+ŐµňZÖ|k-ýM0d®,ŢÝŐ_ŰČőC Ý›»Z•üRÓęiŃŐŢ~€]łuźbťs-Ţż_ ŚÝźä%Îżšoňúzşů2ĺ´(¬˝Y•¨ńÝŇۢ ©hÎĄ˘«jěi]ŚŞô5®Á–µ43©˘ ŨŮT Ś–@Á $ç]FÔUz”*¦Ü#Bčç}Đ›«ŃnCm·®âz›*ÖőÓF€Ę4tiOk®8ŇňÉĄż¶Ţv?RgMëXI茬«˘¦˘Qśk¨ÝR×ŔŇiJ4ëű6ʫٳ®7»E×ÁEÇ/j­uěÚä˝OczO­jRŢîţjUWŠj>çÎŞd˝î덮2ě’ýĄńňßËÇ>]}\qJ»NŹŔďÖ¬۷üőďkeN÷pĽ6gšţćfÖËD2éĆ;p{ł¦+Mžćąl«N|yGź­Ooó== úůÝ.ë“öÝë÷&|âďĆ›îŰT‘¦K[&.xśFč›ôćîÔiUęg—łX­ĺ[tľ…ă˛sÝnÎ^ŻÔ p2ˇÇ c‚©Nië° •ü’˛ĐŻkňsĄ}AfkF‡™·U0vcÁŮ6¶D޶›Ť=NŚ uକ˛Ż-<Ť1ËŹQÁQ08P1Ŕ@SE$$ŠH˘’)L$RIŮÂßĐĽTVł­§B)kVÓ]ýĄm¬’~EXĆą=»:ďY7V٧/6LvMŮj·*Żüő%4˛ewüv^‚ÍŽµuTZżÇŠÍÍ´GC´ĎmlS®¸ďWWFfËĘîíůďŕ†ÍFRŃ-2„ hK(h€*ŃQ0 @8P`DŔĐ}BŤ¤lP@j!˛YPĘJaÄU•ľč‹ UÔčµkűšŐ)hĹ'çbąÚ˛Ň–ôr*Ż­tÓÓMÓ‹XůVÜśţ/gőG.,É5Tˇs:+EآnÎĽ&ň3~Ë>ç–ąsc¤Í[ç:-<™v2bÉWíµ)ţZjÍb×Án˛¨ŇIë+ęgkâö4\ćcŐxŐ/ôĂާ–¨ĄÖmĘzAÍ2¦˙µl @P1™%14%¨(€P°(@°J©ţ€MFëäk@ÝK×@TłSĐéÁÔżaZÔiqÚ|ł·_%z·Ĺ‘C׏’[‹#,]^¶GKbĽYDů;3WŻ‹üą7ŞétňäË[ÇŐËg´ÚjÔĹeÍ/ą-΋c¦ńe·¸×ŞŹCš”ŇŞQŰŰÁ‘Y¬Î[nîy÷Ăz˝ϡQvTĘĄ8hć{›¬0›łŤ %oq}@{ RŇqłvŃď!“JŰŻë2HŢRŃ0hÉkĚhŔ‚úďsŃćźnW&µiz’ÎωǓ'Čő늴µů&–OŰúôÔř.Ž—k˝‰W±.)ŔÚüŞý`Ż‚ůzv+—g»ébną’IđŮÔĺ˙ĺţÉ>ľl0¨ˇu«YŁ_ˇíŕřn­°vrăÇn­ű”ă—ŹŹ¬}Ě}y×+Ó˙\ďKŻ[Îv1őzřWWň;ŐMžžO'Zír͂գł®<–P­‡Ň`ďüWĂeXş¸/’ËđÉ—&–…Ľ#Í˙ě]Ĺ—µ‹5{o7["v¦(ŹmíŤFĽwrLťµâç®Nq%csβ:/–Ęötłăc®âşFm[% ¨d˝Ëh–%’Ë}łh4‚Ëd°¬Ř™V%‘HLl@H†ÄŔ’YL–EKŘQ T2Yl†dµ%A ĚŐŁ6  d3FC"Âw˛Ł˘ŮądLązż,§± Š4ÜMř~6/FżÔ‹FŔd÷Ä,–S%’ŞX™D"cAeč ‚=@ŇF„4C[h EÄěMcÉj Jt†ľ¤2¨ő ZUjZ+;e·¤n]pżwÚ{Éq nR5ˆoTěÝ^ţ©ĺëUÖ¶Áý=K‰˝đý7(ěě*âëŞBť8ő.'U/%lPŔ„·€ )%)nR!·*-· µŕ"ŃkbuآѢ3[š"ĄiSDgSTT]M*B.»•· ˘ĄmŠŮŁłşđzn´'äóđĺ¶9…$ß-ň9łýcŻ7^ÎÎôs.`}WşjKC =Ś”j«ň_öžŤ!ŢÜ'.KdÍzŃN¬íÁ‰`«v˛›Dţ‚ËwŠŽÔ¬żˇÁ|·ČćîAŐęfyx˙‡ő<öíËóž^grşýŚŐjµ›ŻűH˝í|ŽÖŢ@ş˛Ń•Yi…oViVaVkVoVi&{HV’ ‘ ŮȤR&Ę4VŞS•É]CÜ•ů(j>ˇ®űuM+«• ¬ˇ=¤›Lú¦Ëڧm‹çŽż·Sşž§kŻn¦Öéâ÷3fm·§’«™|oIv;şĺo‹âxYţW·ü§ü<öµ-V“ŐřJ eň»$™ö¸›O©ÚÇõڽm|©rŞŃ§4łĄ•’đtë?×G>—ý˝\ЗݶÜ;-Řá¦{ëü9ýÉšŮ2,›5°­’÷·7oËÔIan»Ţj<Ź ű'őô8˛URî©ň^¤Kn^ďČĐĚ-Ń€C* † ZVM©FôŕÓµTNç1Ą­{Ő*¨ŻĐŢfÝlií;cT¶Ťy0ÇKYÂŃ-ŮŃ[Őۂݬe’ü·M=Y핸«“G•KW®Ć•ŕ«5Ń?%¶«­šzżQäÇĆ-Ęd.ˇ@ŕp4†‰Ái"P$ŠC’B@© &BA§"‘6K`oŐĄ˛ç­+e]ĺŰh«ąŇÉŹşěŇUVµm wŹ©ĹÖĎ“Ż•dĆ“¶Şťčçíűřý·MŞ|ź&ŁŃ™»Ľ5ăúţ·^~äZŻ©Ó(ĺəպQDy,Ţ6ýKgÂoÉć¶M¶ŻĐĆ®ü— ţ…S±eĄµFđ’üRM—ˇŐϕߒ缕“ź/Ě‚˛b(Bc%ˇ„1(ťĽ›cĄ”ÖËFN:rNÉĂ[!ű·OqT^µĹV·ł˘ÉŹń_’/2ä«‘m°Q{Tćüř Ë-kDŞżw“#wšŻzK1˛upÔ2Ĥ ¨46ëâ®k:ŮÄkˇU-’«#Š˝Ůߏ­Š—Y1[OI“6ăRkŠř¬˛ĽURÓĐ‹ÖříĆĘéĺxń'–ËW§ŐśËkgWľŰGĐKż’|ßĂ/Ń‘©čgë<™jÖ•ŹÉviŠ­VšYn‹.–us&¶^ ĂP†›v@ÜY•[j’Qę&Óű±ż¦ŤŠąrQ¨¶Ó‚rĹÖřűN”tKŠŤőőf6ł˝ą[v `‡)5D‰”K@b(@"J ‘€†‚€P8AÝZćľEL6u~_ÓÍ٧VŞą<žRßîyx=Ďz«ăfá3|ýÍ[»˙'«[™˛lŐŤ’čvޱŽďÎĚîĹÖÇŹńůr«<îŻCOw±řÖşŞ˝?©Ů×íÓ.[R‹J-©›íÎ/öĂä;ë%]kxĐó:ÖÉî·[>_MĎK˙Y2Űjhśá}l=6ýÜ\ĽżOĐ»“ˇŐăw±v•k›5Ą-ňŚqYÚŻ—Ź'«ň=Lý‰˝lť+Ż˙'ŤK¬|«mţ…śÄ§’žâšŰoX)¶¦űˇ4"‰@¦Ľ&ŠSKé± ?ÔOWč4áUI¬<š8Ü.ąşÓŚi«ô)đN¶ĄfĎĎüŔďţ[:Ë«Żźw§ęÎŹŹżKcźz·¶*¦ę±¸|ĽĺýďţLŕŻů_ťĎO‹ęö:KŮÉŘm)ü¬«YKS–˝Ďę˙őëöo“"ěfά˛]ľ\TÝăCÂęw˛t˛¬ŞµËĹ5ZäÖ©ż)î_ţĹOáő×aSłîĘěâJ!x„g>yg3‰7ť˙‡oFÝťęW·ň8Şłc˛ŁĽń­íâO™˙ěČűŢÖNµzŢŐUiJlëâŇFo»ëäéőę±őm“Ü­w˛ô\Žą2f·<·wĽ%ĘÎ\"âĎ»öžŚ,¶ –Šč†µ%–Ń-±2Ú%  –[Bh*-h[%›%–Ń1ŕŠÍ˘M!‘PÄQ &IL–±ŸT=О'ÁżBZđT î QändO`#TÉi˝M>äYNÄ2ĄdTŃl–Ö„˝Ę{’Č%­Ie˛H©{Ëd0$’Č{…&&6" $§ą &ILAH’‰Q‰E…wŘĄ\!čQkT]4ÔŠÁuRánTt`¦nK&:ý˝R•NĘí~IjÍ—V6˘=N¬9ž—˝Ö»­ Fif«Ë“%›…]›ô›t‰•éč<ô÷q;csçO(:•öđňz;j3”ěß&l4Žzż´eČ»1\UmÖ_čelę_ă?S«§Ž˛µ­¶űŞtqĂ«†ˇů‘šŰ|ą-~W¤éˇŠô"ÄD6‚ÖÄ"“Đ"Š[™–ĽV‹D"JŃTÍx4©QhŃŤ*T«ŞÔŐlB5Ş*)·%lRZ–2±ú<­ńeXŢŞSňt<8ňĄeŁ~QÍ…ăMĽ›­¤čÛܳŞP—Šĺ‡¬´Ößę__±l×·-Z#‡3˙-ľćý$ćÖkF˘Ag ™jeµn¦˛×Őű]~Âç]ĐŕĎ[W-ĄBnQÓńďňşű;ş­l}\sZďé˙,áľG’îíC~‡oň)K{y–Ťµ+mÎlőĆň[ŮŇ?µm HОÓ2OSDÂÖµf‰U–FőfśŚ*ËL yL¤|€ÖE$Hä «vŢŻ@ŐíäĆM)ggZ'ŕŻăf¶šµ˙wfşą­×}ť=´ă]ĎGˇ>TĚëlV_¶dŹ•·ł_xăntŰěgyĎó_§l]zv4ş¶ék˝ľ˝z¸1ävü+áł^Ęř,ącŻä›ńô:;Y~7=ŇË~V®›Îúç ń­–ďEˇ§7J×ËcË‚.íUŰš8Ý•CMěT]Ş˛.uÜÉŇÍč‹Ä۶›]Í ŃUĎwt•lgâ ,ݵ{˘©Ť»Uş;Ru„x0ä|2Ő¨Oc˘íu¬óŐżqéSźłŠŘŻ4•WŞ‚é=޵¨ő˝5^ŁÝZtó^řłăŃß'îoĚťÝbëŮdÍ‘Ď^ş&ާťTşxťí®[ě˝ éö­“=išŞřÜ«$ŚŮş˛»ióßž\öm9˙%´ć.ěu©Ůíq¦;Ő5ë©ĺař˙ŽĚýĘciUĂRâO?ć;Yrgţ?íĹ‹J××ęg'•ÉÇŻŃŻÚřÍĽúËÚů>˙[¦>ΗMjôhÇă—ÄgĎîuiÇ-ń´éőF>ĹţSâqB˙67ř·ć48zý~çĹö+ÚÍŠË4ČÖ«‹ĐI2ÍË6főř[nË›.]ÎŹCäşť^Ő˛g}żĎăŃÄx>|čďçĹŘí_6ë[ęÓő9Ξ2Éţpçĺe·?ěĆ!šdĆ$2*†„‡€Fřm}*żj2µ«)8FůŕřďäçĂ<Ô~Ł®GZÚ±2:ä­)řŻÉ…µY0ÚÖvŻô·Kré•óĺvd!ŠŃŃä»uÚw6­+Z:L§»9«kU5W]n–;&őbÂń:~[×Ôyr'ĹŃęŚÝíÇ‹z˛dqJ¶ŘúöO§rµíw6đ iŐĂPŔ   @&% Ęv8ý¶Ű˘ŹR-\-żĘ ­ßJ-}Q+ŰI¨&|ŃŃJ׌'ʤdĆî˙v‹dȱµJxÜŚëk­žâ'ôŞ`ănVsčeš™v¶Č¬7jÜ[ŃěFKZ]yJÎ1řZ¸¸~`LěÁŰăZâöć4P[oŐ$ťřišµÉÔWކ˘Ú©Ŕ›«š¸hönńÖźśVŻG:ݧ†ňńŢ>ÚŁ2ú·ĺăč3›«[ůP˙ęraĂlÖ…˛Ýž†/'Šď’sb2µŐīЭ·çţX—´ő೥ľśŞŮqQŞZĐÎl¸0ń¶J_mwLäm·/wĽť~«ÉWk¸Ż‚ćwMŢ1Ě(.ÉVÍ')lĹD p ¨ ‰€.¦¨ŤG¤'YqŤę „ÄQ10©€‚‚–„\ „ŕp@‡0fWüß_ÜÁ‹—g&ű'ŕńM/ź&D•í*ş"Y«.;~V×J‰?ÁĚýĚ>;—ż)iGŘíSłLtkʦßît¬ýnަ,?“´K__,Ďl^úâîusW5˛R­ŇÎe|^ZŇąi‘ńťuÓs~çnýk×ńVĄ‘ĺvłűů긨I/±g3;z§Bżk=]é\ŤŃĘýWĽ”Äö4Śţ‚)‰ &@„0h@@ॡAp( ){QĘýP[%¬Üé:1@e$A«D44IŁDµC"ČÖ˛&‰hѢZ ÍŃŁD´EfŃ0hŃ$´LÉň-چ€†hѢYl—Vć<qŮ˝˝Jâ”Ô¹™,Öę©qZ˛-XŘŠ1ů†&±9Đo`SOB=BöK’YS{YŘ6Cb×С %©n!Ď—ˇL–]dTµˇ ˛AÉe˛©d–KY,±DÇ€¬Éf–¬8_ˇ6«D˘%´ü’ÓZř"ĄîK)’ŔL’‰aIl@Z)ęP ·% +U©i ЮӬ¬ťwLËÉÓ:ĹWVĄîŠ•ŰÁv1§eúŠÝKY§XŞôeŕÍÎŽíBű®>[7űQľĺÓÖĂ|)§nIę—ˇĐŐ]aěqt˛eĘÝ®ĺ-ÜŢ˝š[-°ż˛~żBĆjë^˝6Ş˙s|y)gĹiô<ÎĆbż%­ĹS-’N:ţŘCLufíeĹwN)/čqĚËňő4ěv}ÔŞë jŰŢLk«Ť¤UŤ8YGÔĄZÖülô*¶Ą4ĺ$d«Vĺş~@ŐbăK%«{^–¤O“L—t­jś8Ô1Wťmk®Zh^–ŞNĘ ięR#ÉH )R(Ń2‘´˘5©’4©b5Fµ3F”Ü©ZTÚ¦U:0´˙¦|šf©UÇ/µĹ­lśˇYE!l‡ąŹJ«ăµ¬ř­ ‹¶K6ŇŰţ…ĽmÖŞµüßő$§Bńäö®řůP:uó[•kW+VV>˝ďŠŮeE4x˝¬™-lŹ]ýÓ‹5/gJm_'ž¬Şâ ĹźÚµśLéčBÇsχ%ž,Š#I{â··žËüv—©Ç{ół¶Ó¨VÍ4Đ1ßW7k-•śĚz%[ÍiÉ[ű·2Ĺ“ĺ{Ď&µô f®::WňMą@ Y»·>~Ĺ&bź“DŔŃ2Ó2L©(Ö¬´Ě“)=5‘Άr4´O@“4Ę.NľŽ}Ś«Kq˙¶<ł‰3Ô鿏ŞĆí>öš)ÜTcŘţF ¶Ĺ{ŰMś˝W©ęt˛×ż×}Lďü•SKy+·ź©…Ńö1ű–µD¸+ŁÝĂź2ÇM»hˇ·Žť;¬RÇŹč]%Ë6M?ńˇçŕëvrdŞöěĄęÚÓSŰËžĎ íÖŚ—ĆáŐ˙Ş<żţg´śşŐ%ş4zť¬ŻŹ 4šUnx÷üo|Y´uŃžźcł—/R˝®®N)~úž-˛[%ť®ćĎv<ĎR®—­%%ö'Fß©Šmčjˇ¨ÔŇ{¶tőrćw®:5Çw>‡;ÚĂÇŽö·âžšÚvJŐ¶ź’űhęěüŤiŹz®ZvKĚöłt»ťĽ7vuŁ…–ŃśőmĄYă?źĘ~×řü>›­ň8-Ú],),U¬VËŐ?w»Üĺ—©“/o—äć4y1żqĄçToZŞŐQęĚąÚyL‹źón['!d˝iV,bĘłvnĎÉ%J şąqá»wSčý JŁU˝me)9—“ěg¶{KŇ«öÔX1ß%ŐhăŐúô·[´ă†żoů+'®lu˙ňg{f5ú÷·TŻLN]¦ĚĎ?kŘÉĆŐšµ2yţĺ˝Ďqą´Ěť˝Ú<«’ŞcýĚĽ÷_ÚŮÇürősŮ'X·‰Fąqó§n3čyUn¶OĘsýîăVÇL•z˙¬1g1%âąłőަÉÉíkZ99Ť¤ Ô÷d  ¤‡ĹČTŔŕ¨@LŔ4[¨š8-ˇ4Q(L €p€ŕp p8 ĐŕpA´±Ž¨°¦ţ¨lĐ>|ąăÜ·.;#Z! [% !ˇ2ÚĐ$ýD1Hq 4›ŮLJ:±ulíWuĘŤKhśť{Ň®ÍBKÉ&‹†´{ú 4.b †Ť –€Ĺ˘Z5‚ZÎ kCHDV-ŃłD4MŃ«D´ŮU‹ZŃ·Ü"./ő"˛kÉ Ű%U\#&–f„2*X•jĺ=$ŇrŃ;‚ő|!kT”ŕ»^Ó+OˇTVżöę€ćunÍ©ŁĆŐMk˘F÷«ĹZä®­Ęi“Ęq;Ö°ÓŰę1uĹejŮ«nC:•}Îs­ź“•­ĺů&,¬‰= š´Č¬řę˛-šBş˝9˛ĄŚÖ¸ńa¶|­^5Ş_—¤yýHĎJ×#tuu{qsNG‡Řmň–«îDrŹCţ?ńW\eúO/kßôÂľ¦•ÜĘŻCDȵµNŠ^ŐŞÓOSš¬ęÇ)E¶eŚ´®FžşŁjV©»WĎU®ËRë‘ńv~ #LXż/ÇňşÖR´Vă–őătµ©ç`­˛RŮpŰŽE¤-Ă|ôş˝ď)n™eüĄçżBŻo&>ݲo.~‡ˇŮţ2Çíä·¶¬ćěĹuqĺĎNÍ?cüšúś˝¬=žÎ{Z¸ß”éˇ?)Ćúbs,S=tŢ4µ´N§4žµ:™iŇöhŐoŢŮćözď­uKYYµ2‰Z•š)™I…Zz—S2Ö…E˘Ó3L´Ŕą,̤Â-2Ó2-iŤ2B@´ĘLÍ2“Ó6ëfXsW+Ż%W0s¦Rz•ĄđvľF˙ČĄbŹJËđzn˝ľ7©—5ŇyZŃ/‡‘ÓĎŘy1őńĺtŁţOo' {+§“ZYE¬ý_†fďOó<ďŽíäĂج͖W^łäő{?Őµíš÷xęőkD¤ózË©×ů;dO%ă~$ę§ĘáĎlř»_ű6žM2•§SJ⢭«’]’ť ¶7LjŰ'áîĄńÝ:ö±Zą1ÚŞÚÓ?ʱ}Ěů:#UбZÖ´ăYü^ŐúŻŇË|¸¶¶5ŁVóˇętúyłăĄ~G剫aĽţZxf-ďyë1ą;N/©w»Ý>Ż ĂĘŐŞ˛˘|j§SËďăŕşöʵÉ^p·Uô;ľGĆaíß/v÷ľKE˝ş¨QjkÜîâËŇţ_S.޸_źîŞô˙RK™›Ď[ďKÎîqŮĺW·G“‚üqD&päłviYÚ©é$ŇHĆ€E@!ŞhbC„0ІER(šŚ4"Š P€@· ¤ ’d$`©$D* )qękJ:9ť ©Ó’Ü…{/ og\iŮṉ_ósýĆ­+QZČśx•¬í˛«ÓęN•*V¶w{zYMĄlÍ=ę«5Ľ°¶JYET1ÉĂ8SÇG? ˇň‚ÝŁMĘŘE=W-„ÄP=„7±( ˇ  ¸`ÇW¤p¦cS+&›’ťŰcM[G¸_ÚŮĽ'Ťkľ¬¬"]aLęZşztÓŢB$ ŽÜyđŕÁ4ÖďÇ™.—}ž­ą~čiýŃç0V´Bm'ŕÍńţZž_Ć7ëuž[r¶”_ęzUµ8ľŐti^>Ć\tt«Ń˙ˇ§W±\<ąËO]=IeżĆÉóÖµżc«’¶šE’q+ÉĂ«*íZö˛P›”„jLKtęśĚLnmÁ6­ýQ •řeŇí¸±V\ć4ŘŐQ)kYŘÍc|řšZÍ8®ČUŚÝZÝ@AŞ«ş›=’ %Ŕ@1›© 4C@dŃ-4K*3d˛Ú$˘@p(PRCh Ŕŕd @@Ö‚,Q©Ŕ4Qx±{™)Ť¸Wq!XŔAŐ—§’™Ż‹wâ¦~‡< 4(ÍčÉhѢ`Ł&KFŤĐ´\Đe 5EbW-§SĐÇ‚ś/|SPŞÎ'ʱĽ­ö:sŰ´®“ÓţŢ;˘zľĺs{nRiÍX’É—°·´[ôJNě Î-ť.ÚüÁžr‹ü *?Ü뼜8Şí’ňÝ´Ş^°q¤uQö-ŠŇ¦˙qĎc84hP Ѭ //Ŕ:‰ŐîtŮJNľş“d¬řĄ¨ÍÇk)KCGSj*ń[şÇĺččęâĘ Ú;3%­fSúöDVtU–¬ľŔ±ńł~ 8ăI7¸ťŞÜÉ{>|ô´[ÎÇˇŹ§‰ăvşNĘmZ§­”măŻ]uň%ŽÚŃ8•>±ęS^m«Im˝Î{(zmŕß.7ŽßG­[ŇW¨®ŁŁś–‹i­Z‚Z23bZ=5´ĺUŞž­jF;Ýĺ\mĹyxmŘXŐ•ěą)ý mŘ͉ŰŐÜ˝C+lV‡5zš_U’ŐinęsS5Ż’ő®•kDYďÂ+ŽĽRÝú“ZĽ¶ÇîEqÎŹ-Ý˝»ęžššÓ˛±d|c”ŞĹ”˘+Ő«˝˛¤Ş×ÝU]9űť\í›&ůdISÇä®ďČw-•aéŃŇŞ˛^X;Lżüe;«%Wuż'äŢÎźć±—‹řöFYqôŻ|·«É +=azłČ­]»t«Éî©ýŢwřO­…ăY/]ezE»=^´¬çoűŚŮÓ¶5;ç:Ď7Nů3^Ň©O óچסéeË‹·‰ţoަßůžc3Zń߲^IJ™ ËE$ŚLC,›PöÄ­ť%ą~ü[›¬¶’l̇ä(ÉgfŰ%Gť®>j¦÷Ô%%¦ćo]Âźr5¬ů §żLĚgjÚd•]u)Úȧ}Ȩ»đfÍ]ˇĂFOR*X†ÍW^öÄň¨ixň “˘Řp¬­ďŕvëM)|o’{—\ăBň4ACĐC) µµ§ŠŐŤhĄ±"÷]Íqeľ+r¦ţLQh©[[%˛]Ţ۲ť­g6mżWô1LŃZe&fR`­%2–ĺJŰŐuj}Žk‚vZ[H8ŃrÚ†ô[QµU1ĺM˝Ţ•ee+ÁŠôČÄ”ěh”Wź•ŕĆkËô€†´f•´§¦«RqM¬çĘܡ-†Uꪡ-Ľ’AhęëeÇ_ýʦ«Şo±Č‹®»y*WĄ‚ř˝ě—µůVŰ/Yđ,ü^EJĹWţťŽjó˘N»?§“Zל]ţ¦µśWD§vRbĄŻwJż µM˙ U›RńtŢČć­Ť9ŽĄ7m­ŤťÇĹu»I¤ô6y"µâő[š‰cŇęß­\޸“ćÖ­†Nć dµUuźÉúž~>ŐénUJZ¦ť:ݧ|Şm¬-ËľŚç«ŃĹŮ˙seJ‰˝ô9{ů{xo5»ö­­Z˙b» UQiÂş$˙ÜÓ®Nş®d­Y„Ţ©˙RßD÷su»«.+ŕíZMoäŕmNŽW†vwsSż^¸'kŻ÷ŘáLÍjzôŐ”ŚĘOb+DRŘ„]JU—VfŠEF‰Ť†‚-™ Ť ÉC*JLĚĄ°QIQi—-ęÜż,Í= L ’ęô3E&ŐZ©5Çg[¤¶“*·bś[TőĐ­ť[Móm6™5ÉTÖI›Lđ¶Ú3›ňQhő(|¬ĺ˛aݎĹň™rtłţU®fŐpăơĄĺˇ|~>Ţ ]®÷b¶ĺ\mbv™mů¦ hÚI6E«:˘Ż˛DŃą€'‹~É­ő6~‹s&žˇ,(*ZlPĐČUŞoWA[*®12Rź÷ ?Ć+ż’©FÚ•ˇµV‚UÇę.Qm6EşKšë&UQ^?BŻö–“Şr´dŔ Ŕ@´E‘«!“!ŁFfĘd´[Q8t( !ŔŕpŔĐ‚8"¦'O> ŐşŮYnś 5ęő|¶Ç’i RňoąJqĂ›jŽ+eş;±ĺtÄłv•ioĚ—ébÎŢN¶TŰ׋1»Ő¬ĚĹü‡jŘb”;©vúaë˙'˘•R÷9ko;ť]ŽšĚńß-•kJţfżL-cëă^Ý|í"tŕVďÍÇç÷9 ďí[U\±ş7<ź‘ŁRđ•”ęnŃĄFD´lŃ›A´KFŤĘ#a2šaŮ&áN¬ôńe§·zbnŢÚžLňĘ­­YUm'Ł6+«©îděs´˝˘­˛bϤíŞúI¦×ĺZ´©Dµű‘“łk§V”§řßČ›âż,Vł«®Ş6z) »YÍ›oŐŤ-H& i igVč Ŕ5 X„FÖýşzšY§Xô&ÖŇžYK'ň¬ĂŹSF‰h ܽٛJuŘŮ T«o‘–Li®T0UNĘt^\IÚ•mvG=î“i)®őŔ˛c´Ůdi8ŞKQw+Ő~ëG 'ĚúťŠ®VËTř©«{Ď ©ŮĂ‹&GVďÉ­§’¦~ýÜ,¨ëU-/^J<M§YZ—ÚłľkY·d˙kzh`›«ÓÉ“†wł˛‡ŕĚŇÎ[3dT4Il–*ł±ÓMoŕŃěE+߼Y[YPçům“ł‘ꢳ±Ž>–^Í­—öăło“ôlÖńÇü±úÎ˙đďí|ŽJőń^őVwrţއşý~ây0>ţät÷ş–Ë‚•ĆĺăńëˇÉńőxňeĺř´¶bőËĘĚÎ8¨Ď×ęő±µ’ÎŮl´űžk= ÝĚy±Z™¨žEűZ<÷±‹ť›žéd˝ĘbhІ'°Ř€–&S!‘H–6&˛YD˝‚¤ťŠd˛¤ęjÉeJŞÓP©É˘„fś3[~Uú™Ąĺ€ŻVŢ„C«“Y”Ú2vl”Mśą ¶I’M¤wáÇŹŻ3•4÷ZÝU‰ĺă•Jz/I'±×ľ,Ž©;UěÖĄü§·F˝őn4kö}=Ié»*]Űö-ŤzüďŤáÍGÇű[CÉ‚ŐŔ°âŐ·«ŘľçłÍň42ŇĘ­miih·&±ÉrŰÉŮŠ”âÝ‹i©RŚ5Ç3KL¨hśŹW·U.e˛k‹&<•q¤îŤm‹•۶•ZČO‘n»vJšV5lĎ‹N77÷±µÂŇ«ęŚ[Ş´WZř`‡U ĐxÂKęPęZfi”F¤B( )34Ë*VkrSňX E i±Ż4”=}L‘­j¬µP˘«–´đÂĘĘV‚äů%˛B·*ٵ˘(qn?“ÓÂ.÷J4”ő3‘umj´h…% :UîŇT—ęÍk‘ŐŞ7-îÎlwâţŰsNĘÍk䬷­˛RĎ”´·łłŐÉ›Č콞€k[™‚pÍŠŤŞö+–¦IŽFŁY::™éŠî÷™©Ë#Mv˙1Űńä\ůj›đCí^Ři‡eMSG,”žŁSćědÎëÍĎÍ=I‘ «E"QH"ŃI‹E‚ŃH„Z*,d¦P#[’0‹C% L¤Bz”-†¶Ç’‰ZőuVŐ6´`ŠU&Z"żąGŰP„4tâęĄňstÝcčg—·Ető{×Ęű€$ÚZ•T÷fui$ËmčĘĘô–ŐhȤĂú‚”ŔŐ$µz„‹śiŕS TšÓ>LzVÍ'¤Č䨮Mąn[ň9"G Ra$ÉŃŰIĽŤE´Ź$VPÚ 'WŃťIŮgoOm©úB2»YąZµŐ˝äiŚ“;?¨ä¨©$`R )ŚŃHŠ´2Q@ZS((%ŚA)11±0 u 1€§µzńł_»b*ąY&â|ť¸žŻ¬×XÜč«„ťĽťÝ®ÇS7c^”^Ć6Şě´mĐčÍńűj¸˙Ľ&íčKĺëĆÍ'ŤíÎYOĘ“jÂüE›ĹšÔ­ąŞ¸Vő(vĺŞlI2‰`C!–ĚŘFl†]eD± ¨P8Đ @(¤Đ‹‚`8€ Ď©“±Š·¦Uv–µooˇXzôę/{°˙/í˘bëçÁ×Ć­E9mĄ§ŔűÔ¶Lôŕą7U ç¦ă\utäíŻă×7Uł‹UÓKµnTN­kj׬˙аŢĐ÷źC T}<Ľ˛~Ű&“Z’{Uúźz™)D°×YGśętŰ%Úµźć ťMN¬]HhÝÔ†ŠŽvŚěŽ‹#+- 1h†ŤZ"Č Ú…@  `†Đ CH”‘% ^$H-‡ăę± @´P™0KEh/ ´M–…˛XTÖŐŞ~¦­›”·5°­‘¸I—oÎç-ĺkäíÉdˇ?'6j$Ó[0±/ňŞosÚ4L¶P•Y•íʱů 4ń¬—Un$mŐÓ O.6ěőOčë:Ň÷»Ž.+őëVőĄčĺ?Üo’ßĘÂřhë«©ž&đŕ¶G»Ň«ěk“=+[ŮQ>+Cťťë&NËöÜ*îÚGÔY­á˛V™˛,hČh•c&K-îKňEIk>UZâćŐŮ+ŮŰîţXí׿íPŃĂ›5ó]äłŐúÉbŇD˛ d=ČŇDöĐ’ ±%=‰`!1‰îE@™L$—±D°¨bcd˛Éc$(đKoUŕ˘X*SkbYD˛)2Jduŕěcަ5‹–M§C^ßeŕjµIŮęäŕĄíŽĘőÝlt,?Ę˙6LŠ­é•,ĺ}~Ćl÷|ˇVŞYO"ěRőĹg[Ő•ěű{¬ZŮ­Ď;®îłUSy‡ö/öOnĚĹV3-7»Ëj¨¬WŃ#ŁŐ+ĘÖ™ŃT±awĄyd´WÂfߎFŞö˛”Î|łg»RŻŰU´r[7°JµÖĆâő·-%ŁŠÎójń^‹ĺŕŻ[=b™Ěěí»źB›–:jÄŞĽ•X[;Dč4 ŐnµËĐŁB‘ ‹EŁ4ËL%iRÖ¦ksJ•ŕ¤J)2†Rm5ô$`Z˛–ă_µöŤžä}@ˇŃNëő.ߊQş%'‹ű•D욲ű0)şńMůÖו°íU¤¸E~§Öu1f]zăîń˝ëłZí¶ţIn%Żä>?F¸oÍ·hĺO÷†väřî·{,Ý6©¬ľžgęs|˙»üŚ|—řŐbŻÄÎĄő÷‘ćČ“˙¬Ů}|Úv×WĘáÍ“¶ nÉjÚŰEńłaÉ׿·•E–żÔôű5’™o‹UÇ'¬áĂ“ĺNĆ{ńtI&’Ť5gR8/“©žÍ­ăI)§_=c©yÉĄl¬˙˝`Ëł’‰_Uyź+Ôâ[ŽY0Ze«j§Td™EÖňĺCßÔÉ1¦˘zęT™ÉRQc’$r KŮI¦®^µ±ÄW×Ëô;ţ3ńűµÉVškr[ź #Ě:ë켔ۋÓĂűzYłĺ»K…eęÎtí#ĄÔÆžÓę:üňăX”®5nęO<´vV¤SÖ«ýHĎ“ ꪴuŤľ¤äě+ŐŃ&’Ž/éőů5“|›mËdM"ĐÉ‘¦ #L‚Ć™(`Z •©RTŠôtIż"L H›%±’P0‘0b`śiô( p*»EÔ§˘şŮšŞ•áŹ[ÍqÖ>ĺgÍu~5p–đgť^1ÓŽ–uŞĘ“µva—/~Y/ÇŃb˝±á¶VćÖҲ˙őXĺi’»˘g-o­«L^Ý«OÉtnr^ŘžëĆ7/>Ć'Í% tŮ|¬ěÔ7şî—ěÁU·ˇq í­—ędŰÜÓ+Ék˝Će7g]vő$ p ” ‘îCEW)ďŕ.Ž«V§Đ‚ťxăŤĂsd~V†”­g•ˇť¬ŰŹşMk¨:Ö®^¬k"z5 ô_VvŞ«‰’`»$›‡ @D@ ¸ PiâQ(4@D@ ¸MŤÉnĘ×rmX3APg[ăűś^ö$šN!¸f}jăw呥Eş·üźV­vj±_‡_ŚďĽÉź+gOĎFĽ|wŻ~=ŐňÝ{[Ż×Ě©Şă‘%´Ąéő'ŕó[Ţż^íşŢ®ő_ů>RÓbŠôÇ ÎßÜţ†Ý ř;yE×öňSűô‰ô9óúĺź;ÓŃŇIűË/ĆuÇ›×řÜ™{WŁüqăłĺvzŮ>GĄ6ë]ŮÖ8»­Ťűt÷1Ľ4ʱZ˙Őž]~±î%kUŇu˛zÁ6ysĺs:Oírřńă7zßéÍŰÇÖ¦J˙ÎŐj\ú™$z?#\8iN¶,M:ęňGüž~ĆĽnĎöĹ™{|4%”ÉaĚŮlÎÁ+6K)Ę„Ŕ«Rő|Zrő‚u*ÄŠ@40C" ”z?ńŘ{ë"ľ^9*ż -ţ˙b[“jÉ·#ĚŞ·0¦5p{żń ą;?ĎÇ5Ƣł0üňOěcń}ľ¦Ć\1Żg3j·zÂđźĐź·\ç3ňżŻMăuçuú™űNËy:©hÍŐÖζPÓ†ľ§Öőţ>ť*fţ;—“ZOŤ4Rx}ź‰ěŕĹ~Ć[VS—U-ęIç-űgŞß 'ß}zF¸ň_ůŐë© e˝3˙‹%/.×Ů™7kG&Üm ‘IDp(6hŐ˘ÂČĘČč˛1˛*0˛!Łk#6Q“%˘Ú% ‰AIzčwtşo5«‘şţ N;8mŐŽŹO˝Ôęuí~Oü™ă­v­~¦Y~6řůŮY{uŞ˛˝´ź Řc‰ †‘É H¤ Ĺ"‰bl‚Y,¦C ›7ŁK°3ÉgmüÚYł2°XĹ­LŮ­°TŇŠ÷UoŠőg]±ăľ˝Ő•vşđqµ©­yeÇěcQ˝w<5ÁL‹…Ý›ńŕ®ÂÄŞťÓuOŔ±á¶ Ű%µ˛ZA–;»cľµ¶ż©Súo·JVőňqö-Vř¬|Üéľ bsîE–¨ăČÝ›vrü’µ24˛!™­FL‡ąłÇwG‘UđO[x2i˝µő" VئK †CܶK ɱl†rJd˛ džšĂ‰c†–Ş®Kű?ť–Şą-U˘LRT11±1U,‘±nA,–S%…C%–÷%I ¶K D˛‰d&6&$–CÜ1ÓŹ:óŚę!0;/ÜU̸ąÄ”3ŘĹNŲVš3ś–4ÂC’P¨ŞÄęHŔŢ™?)ZżSËŁ«Ő˝QŤoä5nBcNv±|’ĐΉů岋kYm\­JŠ­Ŕm§_¨›^Š‹«Đ´gRŃięZfh¤Ę5FÉ2Ó*4E&Bc’Ár9"FEŚ”Á04WŃ˝l‡FŰ—˛2N55WüeďčQU|ô{řcŽ)©×Đ…jŐ·QňźęE"`Z)2H¨ĐÂ-™h H„ĘA"‘š,¨´Ę#↋Fh´Qh´f‹[‘UICL©V‹DHÓ(˘*©ŮŞ­Ű„§ńýnýq_ąÔ„Ňi-Ý—3ËÚîŮňÉžßE1ŻŘőţŁŢę¶ňÚ«µt™sꎞĎĹôrŰŢĎomL˝RM“ycyső;ţKęw#Ýţ×ë˙©}Mú}+üW<~y-.±»…ř“‹/Ĺ`ÉU…+^b®«“źąčÚőVTä•Únµ{čK}¸3Źâ{Ů_+QRwvgł×é¬GÖvÖÓĘËŐžW˝ňXs[Kp_Úę˘WÜ>?äsS'Öy1?Üě審nŘ«ěářě8o\wśß۬ëúz;ţGR¶Y0Ý~{Şę¤ăË…âŐąOo_ą`C% 2Š)2A0-1ÉYEHÓ aâÇ“+k]ˇKŻăđăË’őËYâ´Oîső{wëŮńŞ˛¶ëÉíâu˛Yxqµ–˛ˇţ¦mĽű¬y_ČÉÔěd®'VŘő:ťşöŞôăjţäy˝Ţ¦e’ůŞąRÍ·Ł_–_˛K5g\Wo䬝±aŇ;yýńµ®Zĺ¶J«ąZ˝N ¸ď“µ’ęěÝž‹îzýµşŘíî?ĘđÚô$ăľmyŘú™łä˛Ąb©µ/Eą…«jYŇÚ4áŁÚíäĎŹőéËŐ­×čx·µ­gk¶ě÷orřŰRĚ’PÓ4ŠLŁ2“Ó! 0-3Zbw«˛zúÉÓ†ĽRČď Đ”†¨–k/ČĽy+‘*]j¶ :ć«­mŻý ±VË*Mjµ2×đčȨáÝÂ^ ,Ą·E5[rČţšâ«XÚٲťko#ľ5EűĄú%b CbQä$EtĐRŔ Ld 0)oŹEjr»g:eRÎŻ’ÝlJG~J¬•áGůWT‰ëĄJ_%–«H9=Ësç:żA«·oˇ2µ˝Ý]Ś•ŕŻKjôu9hŰ™&úÚu«KQ–ë>mo©QWů"mVźĐs*'#{lŚËwmAÉńŃä·ż©żłŤVÓf¬ś-<™ŕxĺ«ůPŽ®OŤ(ëÁąjĎXŹS6¬r:ş·[hĐ–ÎŮnZŇIEC4¤íŚËViBhëJę˙ˇTż&ŇPo•RZż%Ňśu{ł-%m,ľĚkVŻTM¨ëö.×ă«7 é˘rć?@‚…O »Xís‹Z*­çęe×ę_6w…ţ—[ńUýöňŮź˙)ZűTĂ^5M{“éĺc>ç},7«VIŮŻˇ‰2˙ëŢý›·gţ}§ÝÓÝžĎÇŕě­mHVčOĂönł¬Włuş„ź©ß×Éצ;őđţk Öľ§™ŮíőrQ<˝¬Éëe§űs/ŽwâúoEĽY役źGWkäsRůşŮ+[-j­ć,\ťś·/ŐŚÔŶ¨LÍĘd°fv-™°• ¬TĄ›÷-Âľ-BµĺeVř¦âYÜşĘÝw‹ťmkd-ÂM+Z‹»F˛[…c·ů«|wŰ÷OÔׯ×ÉŽÍYÖÔ˛‹C ¸/‹µ‚­ňÖö˙‚qÓňľ˙†=¬V_šIR©%śčéÇÖ˛Ą­š­ÂŇždćiŐĂM?FY÷Äżm44$2ˇ€¤`Đ|wĆuńÓvÝ—VҲIŞŻŞÔđ°×ňŇąmÂŤĄkoő>Sâź_ső[ż^©úýŚyv››íŐżţYąďŃďeË‹»×͇«š¶»«¬ŐĚ6ŹŽ·_.<˙Ç˝ZÉŘăů>Ţ_ŹëaÁŠßäjž®<Ś;=ţĆ<9rZŐł\”éOgä~+/włîŰ*¦:¤Ş˘^›‡OŁÓéĺšćWĚÔ$ÚOôDžRxúߢŮĺ|˝'Őä|– ~ÂÇ5˘vS:ś©AÝËÔęäç—<—×”OÓvxY-[ĺ˝č¸Ő¶Ő} xÝťţ¬yL˝ľ„Š!Ť"‡$ÉfmȱQ Ćƶfv(ĆĆlŐ™˛Ł6ĄŻeZëg˘C{ü´»Uy®čµ†·–=FýжK]gnމ8¬;&ö”oßč_5ŞńZŻ%j•ŞÜ=<ťňí%Gü‹ľ\˛éʵŇmýN^ÇKÝěß·|µö7µŞőÓÁŤçŃK7JŮ«‡?eűk#/®†6ůömüocž=¨ĄÎ†˙ü…łőóĽ+‹ĂSÖkő3ęö±ä¦\–ĹU’•–衵ä}{~‘’ŻKRĘm@¤ľËĆň;bž/_Ëy2{EH&HHBE"„’ؤؤM“ ;2$m“ ÎŰ–gb{‘o%˛,ɢ,ŤY›Z™4)kg´K@lű«­k­ü¤Ĺd­9ş(ofKDµ Ó .NuŞkUýÇ=Ľ›XÍ‘clG[ö¦ţĆŤx;:y­ńÍäφÜr¨ŁŰýÄ‹ż5ÓĐăÚé_«‘CŞă·‡łżWĆu˛fÎŐ¬÷űxŞ5ŻÍő’tµ%ÄčaóŐ˝°cÉG8“üŁę´f¸Í둎w:mpü^L7íŮdÇUl’ńé˘~č§Äúű^Ë˙Ó§ÎżW˙iĺui—'cpĎ>I¨˙sęsvzýuUź"ٞŇLřÍśö­y[/ăćľ^Ý{vťpU.:]­ťŹ9źEźÂŰďKSś6˘ĎsçY<§ÓźFĽo׏T˛YL–e´2 ÜncÁîä­]Uźŕ͗ŴܨÝgĐbcb –oÖŻ˛M[oŚ[ĐÁ•‡2Äß*ň^>ŹŐ·Ł«6qx Űś¤ţĐy¬éÉثīZµeŁ»ÝŁ•ŠBd2Ů,Š–K)’—‘1‰˛X†Öâ†EI,»(d˛ %”K D˛„ŔËÉH’ ‰š+B1Ő˛~ľA¨ŐlC´Ź“€Ť•’“VZ™xô(¤Q¤h´f‹L˘‹Fe&˘eŐ™¦Rz˛zLęĘL¨´ôäŁAĎ’)0†ŘŃ24Ŕ´RŘÍ€´Zfh¤ĘŤH„RDQš4*7Ç‹źNžWˇ‚ŢŽyqµT”x…¸‰WcłŐ9źT˘mđ|›m´˝ ¦5őü[QŔb®:·^RěŁBŁ$R ´UDz‚‘h…ąH˘‘H’¶)†‚4CD˘‘`¤R!2‘Q`ś5Ô^cŁŢîöűx°äĚŐR”-Řęůěö÷ńučô®¶űżüŹźM­S†¶=oŽÍĐá|ť÷Ë*z;KmA=Ůłşţ#ŻĎ»[oJMšńô˙Pů^ćOţC–+CÁ ­zů=Χc­“®óaŻ·‰J–ŁEäńľ_ăÝ,ű?,wn׍aż?a/<ťÝŘ^™ęĄ•FZhě·OŐ}NŹG§Fł[“Ź>ꎗA®ŹĹ[˛×ĺi˛Oďy;ť^ßQö-eLŘü}_Źł'ńŁ’Őëן *›µÖ†ezä¶'k_šŢ°gL¸ťďk?ß*ť˛JăM*ś¤hÂL´śrŤř펫Wľčˇ,v•_/TŤW“ÓXÝ[ÜQć8šdĘ“âëĘÄh/WV›ţí`RQcĐA},řđdo%eFŹv™y»ů˛¸«áO neÔË‹GlŞSPžđvߣ‡:÷0[Śúj‰Ćň¨ëü–\q\żäŻŻ“Ö±?óRĽ]Ňť!śđuşuY3YZţ˙„kŐîľÎkŃV)U+×s7Ö|¬÷­łäÇÔĄ˛SÚĎX^_©äfíçĎi˝ˇ-Ş´Hî·Č¬yď‹5f‰ÂkÓęUş]N×ůpŰŚęříý 8ë÷ę^z_‡?Wä;kO*𼜹2[&KZú6ÜŁ×oŻńئµm˝'vţěńód÷r[$*ňsľ=vL÷K÷"¤„ähŇ(i“#ärBeHčx¦ŠŘÜÇž°ěąmäëĹlU· jŢä¤eŽ™&jˇúť•N´rúąsŮYÖş%ä¬vk ®Ţľ¤«d˝q=+«ňE{% ±ĺY šú0öiIµ­˘SčYx§5s:Áś…Ý9~;6Ą&×–X‚BIźBФ` c$~$#’FAu´[72e"źA‚ůµŁÔ†)e B@) Šçf’oE¤&ľŐ–:ĺÝYÂKp%ĘpÔ5ĽŽH,dIIkF]-Ů”±‘Zrq „0¦kűkŠŤ+[DŢĆGˇˇž¸?™Žë•W*UjŕÍą=7§Ődßy:ýť‡g«•ŮŢ®ŤEާţ‡^oo­L˝Ž:Ä٭ߡá˙ň=Ď˙Ş˙Đő:=•ŢÁ|9őľĎę˝N~^7­Ë랎ľ7ǤŮ×7ŐâŰ-ď•ćoóo”ýOw©ŰĂL¶¬şąűY5úą)Ůţ4M¦ŰÔő{+ńýZăÇŢ•˙›ňç3żOŁ>>Ć+r|mWř}Q¦ pŞa«—e.Ţ$žţëěÇfŢÍë{şÝk[?ö9o{d·+ą~¦ťŚą2[ŤÚ|[†ŚMIůfßÁŽI(dŚKâúťNݲ+'¶¨“ZĄ'ÓtßOřď^ë&,z9|żMOG·Óů >/'[˙&ó ­é§čsóń·Öó8í=Ý<<¤ôś^{Öů~w­‚Ö§W®ś6ą8Ş˙C»Ąň2ôŻÝěŐV•—U_)=‡â{ůµ®“óm?ÜőţVݧńXş´[µ[?őęgĘxń';y»­O/.mă'1}ę?“ę.ĎO%¦«Z'ęšő>u;RŇĄY?ÖNď‡ěfĹۦCĄÚ}ËäÁ‘pıµ\uőő8z˝[vi—*¶¸W.1ąÝÓůLYsRąpŞ]ţ*őú™ľÝż ľ†*aĂεžr˛ŢÚ%ô<ÎÖkĚ<^ËŐ7Y\‘ÓóśŻ;Ŕ˙R"«ĎÔô+ÔÇŰÁÖěç«o%Ó×Oü‰Ó›Ü|Ózjýç˱{{^Ę{R ć“Hb‘€äS¨¤M€6&Ĺ 6Él%°Ĺ:d¶Ç"dVl—±bđ›D5©¬d“D4j÷! ¬Ú$¶@Vv2f¶ÜÍů +°ă.ʼnX áęä͎ىm>ELo[^µš©–>Il4*VÖqTŰßAi”E&QH¤Éň2˘ĆJeäh‚GŻo“Äţ3řXęë}~™lç§ČöWUőż¤ůŹű~Ç×bë¨1§»—ŰöąŰ†ü%Çô„凣(¤Z3-0Ťq'gŁJ5ÔŢřčÚł˛¬ś›joĚ“QT´RF.>Ů1ÚךŰGEá— ăL˘˛u˛cV¶–­_Ki#_;ŻGOW™Ęá%)l™é`ěá¶EüRÝlx’m3Á‘dJwPK5eoŢłţM§T˘?ˇżĹO˝{FśbTc‡Űîöł~>xŻ?©éuóőů˙ö©Ób[Ć{őć÷«jö˛J‰rŽźäČĽBqúť93u2ä·_:ŐhąĂ8_áv.şĎ’ŮÎŁvfv:]ěî!‹ÝľĹÚĺşýO3°ń<ÖöTRt3É{e˝˛[{9p$ÍOÝ=†™#Z2ŠL©"FII0.M1äöí)O(šc­˙ÉkB~ Ý*ńđ«„ögź?]= ňfVTT•Ä–,­qő˛ňäÖč­UëwwZ×·bW5řv?T[ďoUťáÇ5oUĄüI˝1Ű^Ő‰łťŹ;¬Ż^:9PzYóŰSU–˙ ż}%řÇ đäĄy^°¶2“ˇeÉŮşĹgz¸3ĎŤbżĺ—Őśôf (¤ĐI! X 6Z‡_¨®’W‚h´ô‘CU‘ÖŽíV»ŮÂ&®[—tuëͤęěµŢ jÄľµ±Ńß7â«eVĽż±Ôşx_^ÖĄëiÖöÓŠôÍ‹µ˙éňUŃe·iŻRłt˛.ľ,NŐ­jŰ˝›„fß^9ü5“·<~^nLnŹOĘ’Őn¶c&{ťgŐŞŻůý™•Wů@P•µß©~U&ŇeŃ5•*ľ:­W€6®7{ M•št˛ĐęŻfżĹyiŤ'Wá7äË'r‰¬VŻąEĄ›Ýť8pa¶$šĄáşŘĹőľż†ç¤ôü°ÁŤö±dwýîÉóhçÍ\tÉÇm-úťŻŮĄ•1UŇ‹JŞę™źieš<ÎĽšŐ-˙Q:őëŮ/OyÝH‘ŁH¤R$h‚ĐÉCA]=^¦^۲ĹU.Yî|w_łÖĄ±ć‡Mę“~QŕőűYşÍŰ ˇµDĎwă3vłă¶nŦŹJ(KmŮË˙ÓrôÎ>®źţy˝÷źŁ“łńmšÖÁ,ĺ&â>ęüwwŻžąS¬'®»˘3ü¶WزĹe\kJ¸N~¦ÝN×w>eNi×vál?őśçNë˙ŤăzözO7‘fuś‰B·Đó»˝×g+şă Jk˛=ŘÄł.»·ů”ľ‡ťňÎßW/Ůq¶´ŃlgÇwŹN7Ńż?×9őç=}ŘbřŚţâ÷ZTZ¸rv÷°fˆ¸zđ«ýÚĆ‹dpuţW˛ňŻvĘÔţĺ ‡/b~­’K[hśŻRßŰö›žŢŚO×őąľţŻłÔÍŐUycňڜ͛v;ą»MýN˙9ľ“8ĎWI˙éÇŻ<ďŁŐč˙ˇň7Yr«V‰Ş]j¤tů‹ăîĺÉiľ Ž8ú/ @IYzółö˝¸Ë­»9i›=ňŇŠ•ł•T1¬—Iµ tÜI„—Šü.śÄčŢĺNîĹ\ĘÖÄőĆÓIúzňö+íqwµżwű“ëWÜVçkhľµóÖë&řÚMŻOS?ÇŘsd\nÓÓéą›cÍ—Ü»j7pÖ’dŮ´Ő6KdČ›%±6&Ŕ–EŠl‡±BcÇ“ÚËLśU•Z|^Ě’[€>ź­“Żü{vóbŻY]EźŞ<őń}|×Yz=޶śŞ[q˝ň=\Y=ęÝUEqĚ5˙™]nŽ?ŤŻó;ďóOüx“ťLtŢ~:«Đítp<ßÎĚťýş©ÇU2דĂĎň˝ŰçĺŽÖÄ“Šb^źcŮě÷s˙ńźÍŔŇ˝lą(•˙™ŹÇw«ßĘ–~˝Uֵȗ’N›yÎťňtîßĎmŐ;.*‹KzËGťŤUżÍÂ=Ż•ţgÝËďŮfŧ´ö•¦ń)uVĺhÍN‰ZşţĹC{řŹSµŕá9ô5vüj®Ó«žHĘőĺůWJ-ețлŇÔÜɰ¦Ů2L„T’ؤM€6Ka!T2Sz!yB%˘ÉaYX†ibVoÉ›4z˛â‰T¶L•ĄÚÚ$Uz9Ż—&&¸ÚŠ[{×ÇŽůÉ—ÚăŞg±’–Ë‚ßÇjŮĺĺ–MKqĺtúOÇÚÉ^j¶×§ČŢ™ŻŤb–ŞĄĄęeŽ·âî˙E7LĎ«˙ŘiJ¬ĂnÖiYG’ĚśtÔćÝśă VÜŐiIÉvŞ´˙ˇÓÝěcřε1§9năţ¶=hMVńĘaî|×Ěôóĺďół˙Şť_¤n…â\çIvĺă?.ě\{ťkőňë*ŰÔůϑÇŻe…(ÉMz}Os ÝłĹŞ/ĎţŽç[ŁiÍÚÇWÝčK65._Żg‹đ]ľ·VďńşšOݎç|ž,x{—®+Qëř˝›đz?#Źâé×w麬ܔqłn<é'Ź‹ óĺ®$âÎuc§ë×Ýą×öéí– ŞÖóÉźÖجÓuŃĆÄr´Ş§Z<”ĺ hČöřąäVVŇU“ąY«1~Ňl«_ŤŇđ·#-'ňݦťZ…˛2˝ĺD@%ją‚lů9Ř”C%”ÉdT’S%˝BĄ’Ę{’Č$CT”ˇi2KÜ€ Y-›ÓQńŇ[ÜW[}›/+RuH´á2mţŚ•Y’S$Ée2YŹ‘‹ČĐ C%CD˘‚,d­Š@44JܢŠ)†ŠŤŔ%°Ŕ¤Q°†·-2 @ZcDŚĄR)lJ)TŚ”PCEŁ2ŃE"ĐŢ'ĹZ®grďZÓŹŻ” J/TőĐŐR™8Úş/+ě<µ˝ě’Z"¦łE"uýJ@ZFŠ‹E"J®ŕYH”iM,¬ë¤ÎĄeŃÖ¦+٬®iŕôşřńăMc·$ő‰“‹·E™jˇlăÓÁŽ,Źëeá꾆ş%ĺÝÜĎíŻc‰Zýă˛k|OgŞ˙’{ôĺZf®ľüőpׯŤö2čăEč‹Ý;ť[×>ž;dIÚĎ˙ywłµÝš‰sbů%-Y±˙·TăŞKÇčO[ ëdX•]“MŰ#Ú} ¬<ťľľ&±[Oý)LG©—kĄl٨ń(­”ŢßňiL ÷µű긷ĆŢZúŽÝî­ç&•”rZ@ú/6%‡%±ňVŹ(’óÓ<®ďλ¦fn2{9GGS=zů}ĆĄCPŽpL óĺY˛Ű"Pź1 @Ŕ[ ˇˇ’9§$Ó#L ’0)2©[^ʵZ˛®*dłĺŹÇ5É›±GÂÎ#Đ®żjÔ·Žjý|IJŃ,š[Ő¬]\şŇţ¬Ď Ďýµ§Q<ŐÉŹZţćŤ/‹6kZŽŻŠŃ7ˇ­-\xŐéĄ6ôDfíeŞV¤p{µŕĎ-p:ýUŐ«µÚvz Úę·keýďXg'c6ezß›űx7­ńćÇî=,´Ź©rőőô8ééęäö«ĘÖ˛_±ÎÚ—ţ‡]Ţ;®.ÉzęseĄh×2jV*dNZVĎmĘ3­’_PäŘUC_bëgÄ…g±hµ:şą±bż,ŽŇżjŻ—ő9\Ć„©.=®ßbôʱőꕬ“łJm,]ŽĘy—S=yQŞ©ň­ęqtűwĂe][N×j\zeí®ĆIĄľ;Í2mřĎ“?Żâuoö÷ëz7ËÖÇŇŁµyÝŰEeűWÜĺ¶%k«xň‰ż;v­¶n]|HS'»K%Ą¶6uűĄ˛ôű3Élo*Óńf·ë~U˝kÜçĄ˙ďňŹCLx•nőH·„śąňĽ*ÉWKy"×á ~ďuËźË}̲9­Ya^ž.|ňÖŻ2\ˇÖysĺËĎöş´˝6ľ)ĽĂj?FuŕîŃq¦•Ż÷5»3eíĎô˛úńýŽ®L¸łűWoŚ8V2ěeǕʧ“ů9Ń™çĎ{ľÜŞś§çSË't·łA™ňereFi™«1ňaZ¦4Ě•‡$Éč`ďv˛âţ4›˛ăGłKĐňäÓ{`É\¸˙uv’Y˝·:}V\öŢżGŁO‰í§ůŃ}?$z}|uřţµňĺ_’RăýĎń˝î×o#÷}ş­Z^}ěžĎj™zü§N6^‡/+w/¶ă·Ś™łß5ŕ_=ňçţU-'—ţGŻŘĹ_’éÖŐŇëZżGĺ3Âńv?Ś“y'‰ďăxzx±á˝•]ś)óbůvÎÝ>Śřó»ßŻŐäWâ»tţÄ߬ˇgěöú¸_QŞ­5{¸~ß“í÷:¶­°¤ńŰFÚg‹ŮÍ›=­›+JÍ$ŇĐ׎Ţn_öžYă˛l˙L©Kĺ·)oú~¬čĎńÝŚ*Ť©ć—ă¤Ëđ‘ŃÖÉׯKŰÉŠÖľVéĎ\ÄÎŻfÎŰôýşőň«<Ů1UŞQ¸ňÜŰw¤‹ĺ—ÓŞOž˝>UúIá­ń9şRţ¦0ÓR×ËT޶†żˇŰj^ąíř«%ţ? ý ;µ˝úÖXőz6— ý·ŹZfsé=Őq[Űľ”łýŢŚô±u±bÉl¸÷şŰÇč|üÉíŰ-şť*ÚÚÝU%>¬ľS¦^Ľ'ŤőíËź—>kä˝ŐUś¨×Oź–ŹKc{Ő´i~˙k&ůWţťś}nmʡełŻŇHś^ź[® )2ŃŞĘÓ(‚Ş‘É#L‚¤d¦9 ´ČÓ„d±±0!’Ëd0‰d˛™,Ň$hh‘ -1˘$¤Č«EÉđEk+sDź"”c…U®ä´řČ BcTH¤ÓßÉ;Ω´őÔ2v/’޶đŰźř1oRdb*Dؤ–ËȤ™ l™ÄoRXŘžŔL’Ć&ĄńyúťJděĺły«Ą1Ż'ÉbŻČő:˝Š¸˝´âµß˙Áäu+ŽęĘŐNËfÎ{_.ź…Ý]ă ¨3g;čkëz] âé[©Ú|ťÔŢźCËídę|}kźĄ•Zô˛^Ó0ř˙”ě{öË™ű—k·•Ú˙ţŚŤ¨ĺghűą$—y˙…·‡ur.âÉ–őŞÉvůB9pő]¦ŮŕץKÖ¶łŇ¶ŘŰ5ZqĄ¸ú´i^D«gTĺ-™­aVµv•mH͆ŘZViÎÍÓ%¨ĺµť+VłVŁ—ü­”ňYé˛ôD0¸RL€žá›Él@–ő ¤Ç$™&G!;†& ‰°¨¶Ćv-˛ä‹hŰ*ÍŁ7mu ô:Ýg“ńeĹÁżĘą<›ő±÷©’Ľ­HŻź0qő»wWłÍ•ĹkřŐěŮ=lÝ›ŢŐXí~nyCÓ˙#S/łßě<ĹqÂşüÚS(ňzřţą©—äęćgOčröűŮ1÷ZŇ‹ŤŞöa˙Ä׳äcÉíaj^źě-ŰÄ—LśŰ5í|Źm*Ö¸ë5˛•©ć|Ż{éĄYyššÂ~dĎ6|tÉNĄ2űŠ«O1ô8s÷=śĎé5đŃ<Żç…ž>Ý9t`ů§SăĂnYŢőąÝůCn•ďŢřŰ˙-hć®ĎĘő<Úߩشq\Ľ&ˇžź[i%e\/Ăôú zzfp¶|sĽĽ^ĎOS<ő~ĺą-íkS«Ż—«ŰČłVĽs×tmňUŮÄ©ŠőĺG*©žwĆáľ.ÎE‘:şŐĚ™éZë/˛»_ŔĂ|–żů2Ţf»Áćäë^kťÇ íęU°ĺěfż·WiłsăsÔżZŹ­ŹiŚi7bfű,ąîđ—ź"—šů4íßńICń'5­řÂđe¤]CÔÚ”ŠŐżčă~/ű–¬Ď+ş´řźFdęŰOdsşµŁÜčÉG‘­F’Ő(ä´’X8ὂÝíÇú”ÜY›cuµUäôŘ+uß'ZÚ]w9­ąčdTkÎńhg~>ăá±)Ęd˛)Ęd°©{&@LjÄě PsIq§Ô‡ T± ‰,—ąL—ąŹ‘ˇy(d”€h‚“ů(‘ - ŠA ´B)Hd˘Š)Bő4E@Q% †Ri÷ Z(”R˘‘(h¨˘‰QxŇłUz}H5ĂZZSÝěTtQŇŠ9 2m«nŚ-[q:0ňiŇëO ¨¬UÝěç»ŮÂ)ÓđáVĂUű­·‚†č•Űü™(Ţü!ZÚ¤ewWeÁBh´gSlXí–ʕ݀‘i_­|Y*žµm%c«·Jaö펪¶™ź±sݞoOv/L|]ÔNÇŻ©Ö§áů4’ŹS—ŻŮÇŘ^ÖTą?čUăŹň~ÔjcąŻlUݱĹř!aéäý¶Źł˙¨»ąpä\(ż)\aiýHÁŇČî˝ÚşÓĎÔ|iřzXńÖ´T’[IŹoc3ŠG˛Ô×ÝÇKŞ-k˘Oţěĺxućë[ąKĐ©ÝĹ^–wuWX^_ł±l}nşÁJ˲óţâÁÚÉl•¦Hă}jüšfíÓOo%%5)Ž şňĐ"óä®\¶µUě¶3Di˘(„ĘL‚—©H„R*Uˇ’ŠEV“„˛ O@6ĹeLµµ¦Ö!˙ąë`ʲeݰë‹>uŮ»4Ď} ­­WĘ­¦Ľ –=,ť•LWĹ’2e´®uߌi©Ŕ‰’‹ R)ŠZ„RggEöfőë´›Z¶qť:[&UZßŰ{Čě4X»‹#¤YZĎ_Gúžľ,Źyň+eľŐ^ ˙‘[bȱ[•±¨ĺőË뼗ěŇúÚÜĄ˛uöÁëv/5ž dxňWg¶ç6?Śjó’éăßMŮ—ČbżĽň$ÝZŁl폣έ;QÂOŇGn;Ž^ÓÂň†ĽRŃý`ÉjmŘě.ÇÁVË÷5äÁ(/  €P&5 ‚@­ŔS(bĚ€†€i”@Ŕ´2FS-ń¦Şâw3ôÉeÖy,ćÎ`ĂzňťYŤ\4¬˙Ő‡^ŘZăĵ~`ĎEęéÍGNťq?ÜŇRsuŢJ5ŠęhôGWe×%^Z/]N>«Íü…KďUł3:~Z˝ŰtđÚ““DŽNĺđcĄqŕPÖńčv*«#Ç‘¨z&pö2b¦WZ©Ż†&ď;ëě\Î>žî[ú›ýWöżnŹA|†lťĹÚâĄi¤ň=ÜťśŐłüURâżäĆ™y[ŤT![%uşŃlĆMéŇgÂíνkż'Ęß±ŐXíU¤słÖZňŹ;+•Í[OC?qŞş-™ŕOéÂ_+zňô:_%ü\WÂęâéţIËM­!¸ë‰őqdĂš×ˆÖjŃŁnZž ßĐ]¬wŹmĽVýÓ¤}IĺăŢqßęľ>]Ż=™vűůű9,îÝRn+ł_F_K˝ěŰŰĘçŮú3Żłńôě[ť_ v“$Wăz¸Ôĺ»vކřć~ ňÝüę˛ü}ož™±ÇÓş˙”/“YrĽxqŃŮ)ł„vŕx˝µ\-:WM‘Űě_Ż‹ÜĄ9Ż?O©™núçMk&zo\yxľ3µvą%Eĺ·©ědëŇř=†Ýi ičŹ˙+Ů·íăEôSţçgKĽ»5x3ţ÷§¤Ł^SË­íčž7ǤďęžĎ[§‡Ő÷RŃ·,ó·sŻülĽSšŰZúI©Ó×X˝}1iŽHLi ITC’$d#’$rW!$ČH ‰±6&Ŕ,m’ŮP™ ¦IP€A 0’dµ/cJo ʶâĺUĘ–J°¦Ť )y܆“rRSÔ€mÉusXdqŐ·°žHŃUšŞ6Ęćžä6-„Š@¨ c%€BÜL6Km×ËŹ|ÔĎ“( Şň\´¬ęĐWŁ‹Ű·ç‰oŁkCýOrÎő|[đÎŇ*ë{1·M›^‡—žů)oÜŐüÉżUaëĺĂš¶„ÖÍŻFk“Ż\™}Ël·Cë_5Ó¶Hăáů4˝ëZ»?ŰôÔ.ĎfÇ‹D´m±ĘŻzţÖ×ŘîxúąkIý4 uqă·9vôL¨ĺËŹ=¨˛äs§ę‘Ë'«ü|˝¬ŐÇgĂkťü$řt˝őŹ4Ľ V,Ł“jb˛4y,LŹQ6UI,»Ňô‡jş«)¬ůF«ŁŮľäÖ“ŹYi©ÓĚÂgˇâłv:¶ěVĘbiMŰ4řźŹÇŮy_bŻŤ¶ü†ţ^KÜHÓµ\Xű)…·J¶ŞŮ”S¨Ó"F;„čLŠt ¦ÄŮ-‰°dn¤męfŘU[U©•’ő*ÖŇ žˇMżCĐéü…ęňeĘÓ®:é]µ<Ë8pü\7˛Ý pł^íłu;řëź„9‹ŐŻů#ąňUëF:ÖqYD/nÝiŽ´ëi¦ţźů‘۲ÍŐW{¨ő-¬ţ® dUě,ŠRĺ?Łf˙%FÝr%ôaŐęňŚą4ŞŐ/SŞů(±Ľźş«Óčg·Ő˝çčń±[†ZŰŃžżsŻÚ·WNľVÖ®Ô«8łß«zZŐŽ~4†vőW_ŞŞíťŢůRJľ5ú éý–÷ôíŹ7 ;ůr«c•jéÉčŹjŞÜWą$Eš8~O»› ÖOŚ©oÉŹJÖţ/g-›oŐý„âçS›7˘űůóő«(«Gýčó0÷{Ľ¶îžőz›ő{Ů(Öźž;~0÷Ge±S mlÓľđNĽË‹Ó‹ËÇí]dĘě©ĂÖľdç~MłäľLŽŮ[ĘŘÁů3[Uyđ|ëä*®µł…čĂ•'-Żä^㫯Ţ,¶—O·ő•ôjŮŐ)†…Gfˇ~ęî=čŐ¸Ą«Ů,ń¦ÖŹS˛*˛~J^Ť?&vŞľGŹŹâ¤8ŢkĂ^»“T¸¶Ír`Tq?r!D-¬ľÍ-xŇ Č©ę&;D‰ÔE2B„¤VŃ!ݰĄ¶ S¤“Ľ—ˇ ą%TÚ%X†d˛‰{‘Xůň1ˇ †„XŃ(Ą¸ ¤HĐEˇ˘Q@QH”4XŠE˘ĺ-Ę4UýA8@M/¨ô¶Ű„[p“ ĺŠ%/ ë @) Ďč0C) R­ ‹@R7Ą±(…©Î]mĆÉÄÁb:o“„i,xňŢöKe»1U¶Vě´^ ńQŃ?-•s­Ű¦ĎÔĆÉÖĐĚÓiĎ“˛şŐJ—čšdŠşÝJđJň6¸Ä·Dk‰dv˙ň[AŠ:şą/ŽîŐŻ$–¨¨őpű–˘÷’VF=Üw˛­ęĄU99/ŰĎ“DřŻDtu»WŞK6´z+šŢĚĺëřeŐŻ,ôűÉ×ÝČÖJWÂŐŻÔ×_ĘłSE-…—ŞóeçkEtIyÂo-:y«ŘÍZpó/Ę=.Ţ<–ŞXżÝúxłtúXái“×vtŕí+áł­ő{6nfc7®Ç °gÁzÚöV«ŢtÔďíői›9™ŞŃ}ýN^¶7ŘÎňfľ¸ôT·˙Í^ţö[CÓÓč$ü—řpdĹ—>tU\7őʎÇÚě˙!ŐńăÇúť}ěŮj­OqCŃRžmŞęâĘšłÔ&R! 24´Zdd"ĘL„Ę(˛“3L˘˘Ć„ś€ŠD&RÓ!‚)J(´RÓTJ-k‹>LU˝iµÔ3§oIc§ůîł8ŽßŤëu»9Ý;Y}ś|[Wúéˇ(ô»¸ű]JaÎꯇ2Zęqv>?»\´Ą±5l˙–:WýżCęş8zk­^ŞÍ^ŐhůU6›Pĺ5ßůů>KŢÖŻ ă}_ü™ń·¤íţEr łü‡ŐXŰĚ·ˇť©jYŇ덫ŁOy>޸©uüětUěĺĆ’vűy>Säz]ž¦E~Ĺë{emÍ\–yo·űîXă(fŮ0Ŕ$dŤ0(¤{” ÉH‘§PÓ$`Z(¤Č·_*Ă~mNb†€ěÖŮ=ęŢ,őőý“­ž[Zmęa†ŞÖäŢ‹X6WWvŻ‚+žŮm{ó{ř5Ę˝Ę+×Vd±·w_M΄ŐőEżŔĺ\Şć!˘óZ¶†žĄ[\wČßą†ó[µ†Ű:éFIĺĺxăçągŚçźŽĎ;%ďl–y,íi†Ř¤™mËÝîtar9"G \ŽH‘Č#“9“¤ŽLärŘ«îä®>JĽśr{}źŹÉ‡51Ńó®HJŃ䎏Ců•µýÎ<\l{ثƕĄ­ÎŐţ繏/,Ľsťc~>;9ăzW‹ŰéaëeĹG—Kţí5KÔÓµńq|_Ç—Žđ›Ţ>§ČäÉnŢOsN.*ľžWâł]ôÝł8ĄUłôBŰ$˝ä™mť?áĹň¸zý{S*ĹâmÁć3ÜÍÝř›ÝäČąßËâŮăgŹrŮ)W\WłxŰQ¤—Ćń—~{§”ëf}#6ɰ¤ŰD @'JµŰű&ŠĘÚ4¦çMÍ“q©Ť™óm¦Č­¬ÓѲ_]ě*ŮĘS ’Z˛—¦ĹZőZ36Ôč `LŽBKbHÁ”J~ 0€!î 5´"¤Ű©Çů8ąŐZł­\Cţ¦P4ݵ\5ŞP>ž¸şÖÇ“ÝoWjä}wyI¦řĚlśžoĘu»TË›ŠnŞkOŰúu{y¬˛sU»˛Uµ¬“m-¤O:ˑնíĺ’Ę®>Ďc˙ácŃ-_ěwĎ ±żŚsSŽK/©ż[¨ť­§/»$p5 ŁŻ©‘Ú–ŁrÓÓě^Nľ+ąŮżC›"·VßžHuŹÇwr«eéşăv»ŇŮžľÜÝš^¸ű0cöş·t»łâÜ(WŞťO™µěíÉ˝_ť‰yr4ęîÝ^ęt¨;+—5ňVĽU›jşł5n­´|Zpöut/Ő¦K>ŇN±ř¶§RŹSŽ–ę­©zů˙µ˙Đź“˝z^˝¶J‰í§–Ků~–Ç,×ţ”’4îŕÇňťJćëą˝eŃ˝YŹŻy_ňéĺT¶¸nҲô˙ÔŹ¦u§Ć*Ż«kMüź'Ňë[7s(‹MÓô[ž—Ďv­NlvuÓ•ăO˛-ë Őy>3ă0ŇÎů6ś;YLź8ôqý¦:[>ZcZÚíU~§łóXşŘ:¸©\ieqZŮ-b«QÓľéÓŽşđHžâ+J‘H›&B)˝ lRL‘I˝Il%°A+Y¨‘7ˇÚA­Ľř'dÇ. †Ű VĐĘÍúš7ˇť)ö2Ľ~Ôéëć= ĹŘĄ0[ĺď }L cjă7¸c»Ç’ą®Ť4źĐ$Wm/Ďl˝‹¬j©~3şűł¶–ęW«ooL µgęxF˙Ęk¨úŞş7<żY,©gŮ]޶>ľJfĄŐ±;'av{–yýĚ6i$”öm¨ťČ‚oÂçŻ#%í{;ŰVő2ň[&éŕÍh•¸čĐW%§Eú”×%®äŐZ© .˙•!­ő‘bŞŁ^_¤Ž˛ęů6ą'm§bŤ•ť¬ýĘÂ^^–Ö–UłßÔžuËĂ[“źŰM_–©JúĎŘ­č’µťźúé´täÉďO…Ľ:V«S7ŞĆw˛kęCŘ«DčKŘŠ–K%€›ÄEo¸¬ôĐ%RţŃ&9Đ–ĺM‰)’@‰(¬@H`F!€Ć$0)ІJR!‚)J(ł°¤R% 2ŁT“CŃ}É­†“`\­Gô%ú”ś †ô%ąÔi”Z’J˘‘#A†‰EUµ–‰Â:m‘ŃU-}NR—ˇuÚÔvV_¨í‘»+/(´QŁ»łťŠFH´Â4GŁĐłI§_ĆÚó<ÔzÝ{Vťzş&ýW™5ăŐź'C½Ęމ/ Fč·‡ UVŃ-R+ÚŐĺjńkÁÍ’´yąĺͬéUŕżŰ/C¬ET$,Šąéř^5ŐŻöoG^Iéś”ç‰&Ż 6ŰőELg“ńżÉhކťwš·O oŐx;1ßj'lŮ®+Q[‹Ż‰Q˘¶˛Y-ÍĺÉÉC>ɦáΫb˛ő2dě>UźźŮáţ=ë…_›żí^…ţ“űrşdÉš×{L»3LʰďÇ“zO„_kŻ—ŠjŃ?Úb°v+†Ů_ăM™Î1"­ICL ZfŠL¨´ĘD&R*-2E&)]"6ýB4R ꍶ`h4 –Ó˙VĹqku¶ŕ´J) 7ëŕËŮȱ`Ż;˝R>—Ćĺě|=şŮp{]ŚO•‰Ů˙áź5ÖěfëdYp[ŤÖ‰źTľK7Gâ«ŘěĺY{µÇ]4ţž†|·ňʧ‹żŃícě,\_丽W”}o‡ĹźżOzaidÉO.Čňúź7ň˝¬ôÁNµÜ~ß§Ń˙3˛_©K+viNNľ$žVý8í诔ů^ţnßeÚś©ŠšcJV‹ÉŻđ«_Ž·k˝{s·ţÍg_őő5żĎä­íLÝLmŐĹ–ĎýŽţç{đńö˝•›âjăń˙Bí™3>GĘŤö˛Ó>{dÇŤcŁ˘0n ÄP d6*s‘4ăa'#'qϨF‰†™#D2iH¤J ÓiĘd¦9«{UĘßČ•ťmČBÚÜśµC)’P‚@ĄPOR%˙AĚnµµLnŢ„ľI'´ŤVÎĽĽčüiő’­¬qŰÁ”Ž@ÖĘ»·ŻŞ3nX§Ç€˝Ľ ^ËIüfcÁ2tăĎkM_ăXŃuţC& /5™iy8€™ Żc_Ýě×-o–Őj•Ogo‰cË‚–í¤ó.UÇÉÄńđŮĺ,ą+NłUžP˝}JÄ­—"M;ë-NŻÔźŞďF·ëĺµďk.).[ĘŹI/OťVN\©Ćf»ĎˇĄ{8ňŐőxĽiţ*ÍËźF ~ż]҉ű—·Ťa!·éţŚź_öăµ-GPýÝŐęvq^ą%ĺO€ÇŃÍŘÇůi‘ąvłŮdívńYⵡ×M†ď=ĚÎnű=WZŃŰ/Ę5~aL–É‘äłÖÎNŢ—vď'·žŇ­˘łđČîtíŹ2x×á‘éˇĆL6ĺ‰Ĺ˘$ô>3&|ůo—-ŰUP“ÚYäI¦Î|í_Š{Żľ;8Yr˝Ş|…fřo łĆ–úú3Ź7ńşýĹ’ŽjśÚµđĎ7“™neę>zĎú×>Řż¶ýőŰňşö/Ťân*ĄxÔśß!›>†Éę·©ÄܱxĚú3·źu„‘#(´Ç&cI DHä‚ů ’ _!¦ĄN‰îĚäîřü=LÎ˙ĘżXă-)ő%â,šéítV>­3ő,íX›ëżÔóđö2`Ë\´•_őúIŐ§U`xđ[ž%)ëÉ}Žfř\mĹUźŃ6byu–[ńü·|{ěź+ěŕŻÉŕÇŘÁ˙ął˙”ţÄ|•×[©Ź§‹wűŁÓ˙ÉŰŇĎÖÉŠÖëW†4ý8˘;Ýşők\Źą[iËHFe»ťrńą›ë9Ż_.l•Ąj˙' Ćzż%Ź/±‹«×ĆíTµizŻś\’xUk:ą×ýŽžďk6,Ď×ăz=lŢşxf­ňŮł=9îĚž9rďŻ.;â· •ămáiŘĎ“ł“Ýɡ->†gOĺŠ#@„ú/šKMČJSú=> [sIdÖ­ëŕťv˙Bą¸‚ MjC\ueĂęg-î®ÖäÄ EE€€``€p0 ŘńŐ×”®oj˛hçŹ M÷Ĺ[]ű‘IKʬśŤkFişĚ8đ*Ůă·%ą¤dîrʲdSôA“°Ý×*žżR3h »i~6O]ŽK¶őnKrgbd30%ž·W­Ôíôýş(ʵµĽ«zýŹ?«‹lőǒεsŞűĎ[O­‘,WO%´ŽRÉ#çóbɇ%±dQdvü^nÎ ÉWŻŠî.’Ôő»}®·WŤłW•ßíI&Î;|íSUĂąŃKŹö&Ű:V˝l4ĎnÍk.¸Ůžgkáłvű7Í“2­l˙”´ĽžNÎ<ńß°Ő9Ĺ~’Ď/ć©Ü˘ţF ¶ö\+VŻo®ž 7SđŰ©ń=^žZĺćď‘O„żˇżuô¨«›ąZµ]*ě¤ů7—'%~mŮj¬Ű“ŢëwúÝîťđ÷ZVĄ6üŻű—ÔąňYzőyß-Úéö^?â¨á)ţJ4•i–›2E¦ËßŔŇŇBłłŘoD VV›Ť¨IW©NѰCC^‚IŰ]†™E!’0‹ZŚ”R“#EE–ŚŃH Iř! 2Ť«gV¬·Zٶ˝›Ű IÎFôIlŹ=3Lwµ-Ę®u,ztË“ZÎé«lźť|›ăÁî*ß#\וĺ+´¸ÖŻóQůÎä®ÖN ‰ÂOO·ˇwĺśř{ USŤv9s{kYü“™ ů¸b«Z¶×űŰ»8ŐZVvýŶ3'ËŃęV·­ŠňÖ…©ę>§[±Ű“˛»ŮCÓÓîpt©Ő}k<“íđnŢtŹ÷;>!ôk׊»Ă»ö=Čžqý¦çnŚßžwqS§ŤäM5ZĹšjgŇ˝“7ż“OD{X-Ňěu{ĺ‘Ţ8äć—%ŻŔĂlŹ±í©łMŐ'áË·ąăßŮěűKłŽŽÎ5NWŞ#żÚ§_ëÖşŮEZđ‰¶l}­ź/Eĺł:üŻ^Ú^Ť~‰—~4çëŹ- ×·—\ÎŘ”RZAŠÔĂjLh‘I–ŚĘL )¦R*4Lh„ĘL"ŃiÂŹS4QFŠËHÜҕӝ”ŐnŚVŽ}şÚžŰn°ź€‹ĄëÁđPë˛e`ü«e}ž˛NŹ”Ń˝µL»Q´©V’^ µz=8ě „j±5M¦ĚĚ)Áę|mľ6Ôµ>EŰF˝¸^»Z5ëä®ÔËjó­ZnŹge×čuzX2vş4o%¨Ý9Lě|ĎC±Ů'Ź-fŮŻÉzËÔěý#ů öa˙.>×Ó×îgÔů>Ż_·Ůíű-[$ĽK~/˙33yŢvzź%đÝl٭ٶocśr†Ďą“/J¶řüY–\,ÚŹ>?Đß˙–ÇÚčfÁŢmĺo–&—ţ6žýľž%Ô˝—©Ó]ż'aöşÖżRî·«ŰĎŘń2ĺË–Ó–ÎÍi©Żo\ă¶rÍÉÓyî™C’@Ó&!€SŻ lZj95*Ú^Äąä?Á˝ŁsşÝ6·–dĺ87Żőˇ8EbÉ˙p¤€ HČ ¦4@A¶;ŐSŽŠŢ,ü :ďuKMšş… Ępr5.JHppCFÍĐ´gdoeˇ•´gck"ńc¦TęęÓÝ[Ŕ‹ď<ŘVj~4Ö%F–ö/Ďv9ç¦ íŤKűł‡ď{ŐţcňŃđoĘ˙µ‘ó= r}Ě_•m˙ąô˙Ô/€ëÎLť‹-*¸Őý^ă±Ů˝ľ¨îîďeIž 4ýN?“éü_­˙éě˝äÔţRÚűĄ;ťo¶nť–©şÇýÉyGÍwşĎ©Ř¶Ő’Ő5éő&ď6đćb['ą#{$§±$T˛ĺ˛ä’ äbň2_‚™,‚Y/ÉL–3d2Ů/r*ĺ[ Ő=Ćż5űť­Žőśv××ÁYÓŻ[‹ÝBkL^źk UĆD·ňżC¦˝w‹­|Mřzţ‡SŻD—b×ŐCŹSż's mŁŃŰÁ©öfőőyQŹáGĆďfwWÜÇJŢŐĺÉ)Ť ˛|vµ—Żió'fl6É×ÇD“p•“ÓA…¬ݲWŰr’‹%ëőZdÉ›](´^5ŤÍáµ}t‡ô şĺĚךů9ë䯵šÓő·ZŇÓ‰ď-č+Ć'Ć»¨zł<ťŚp×.6~ŕĺćö{«“ŚsŁR¬peŽmĄĹ=RúŽlO6vńĹh’9{TËkO»3ťtŽ'¸†Äe¤˘@‡°†É LCr‰¶áI‰Ťî&A,LlL bcbaX ‰EŃU«sJ_Üҵu@‘úź*¸!ŃĚŻ%Q4ʉI· snI-D’RĚőťH5ücMÄ‚Š?&)—ˇEŤĐE"ë«4]e”hŰZ [Ă ÔST•Q/ú &Á0m Ťü`Ór+hzě='MŠ)Ey‘D‚,†X)2“ ¤Â-2“!1§ hź‚Ó2^§N)VM?TTi†ŽUś4ŃVĄ) &˙ĐĘ/ŽúLIĄ±»dť«Ľ•íŢ]V©)“ł­^ť±Uduçć\3‘ćÇdčŰKÔX1¬ą–6ř§ĺ—ň—ě÷şĘ«UŹZŻ]V§Oauű9:öSŤuí_'=păĹ|™©WÎÚ¸˙—Ł~ĂĆňg·âöź÷:­ť,6/ÍUL{ł™ÇĂČěß>lŽů)jřŞič…Őëßł‘c®‹űź˘;iňřźďĆ×ÚÝÖěaĎW|:FŤD2d˝ő«lť1Íň ­ŻL ©ßű_•ęŮĺ¦{yqô3ä~뫺Ńë ň»8ńăĎzbž„žţ—ŻŤú Z٦Ňp†ER(˘†‹LýHŤL¤X-™¤ŕ¨ŃcU·ăfçÁ…Y­,ęĺo°~ÝUiç{j["­ęµŤL+}*¬Ą#e’U“ÓţŘ·vŞ«-]oö'r—>}KL ű€‘ `($™Ŕ©ds!"Tçţ˘ŃůÔRÚÓbbtEXŇżQJ®n>ŔL¶?É­X.-Ťë¶…D€¶”R~ŁL¦A˘±j S-OŹhŤlëĘ4ő +.;]˝T˙ˇľÎ5UŹ"Ói&©ß^ąîŇLéN÷,źĐî˝±¬I¸ö÷G?ň}ĺíŞ˙Žw{“j˛ç[ŻÍBđÁQŞ:§3±żk,ä÷zÝ_ڦ,ŐÉ–üŐ\ÂG«Úéc®.ÇbL~ÓöjÔµo,äč,Řë‰6­™ą^ăŇ}ĚÝź‘vNµ˙%wĂŤ—šśĽ­ŢżÓ¬“˙őżË™Ű­šŞŐÁGjäň’Ň‹ŕé|†U‚˝zc«łµ®—äÜ=ÎÎŹC 1ĺěSëäěV2S~?c‡ŻňŐËlTç|••|—ütň‘›Í·ÇwŰůYÄ“Ë>‡‰ňX0cĆýŚqZÝ×ÜâŇ{ů<¸=ďţÁÚ¶uŽŘ{5ÉŐÉ­qU$ęשŕjuđéË——^ @#L™ŃÓĄr]דĄšü,˝NcŁ­Úľ'\iŞŐżĘÍkôYŐľ.żs^Kdővz4väÁ‡ŮĽ~5łĺn:íčpvnÎv±r¶5˘koą]ś×ëeÇJh©TŁĂ3–ç«["đv:xŻÂ•i[G{ýŰŮäöíĆ+űxú3«'[ŻÇů–r•ž:śÚČďzţ5Ý'¬"ĚëüúĄŢŚ›B)㲧?íő&µw|Vţ 2n–Q>v)âU˝kkB~MéWĹ,ÚŘćĎËÜsúQĄp%‘ňÖ‰hah— OEr:aV¶¬ÍĺyĆŞ’bhĘPJ Ó…ťf`’Š”‰P&„TˇĘ$`9C”HR‚Q Iׇä/‡«~µj—)üüëąÄÍ^Žś=ÜŘ1ß;~7őńö&˝¬ÔĹl5żám×ÜŔDÖ´Í“µiwUm-Hä‰ČR ¤$@ŐCbFšNZŘ Ž˝_€—j·ĺcu˝˛ÖIÇIüWő&Ş)g0Ĺk7ŁŰ—VµDIP &Ôř;&ťZßÉVü(ŇňńnĽřĄEg»;´ŇđüŢÔP­Ż˘ ”˙7ř(„FŔV‘HE"䊩)Š’ 4­%O cJ!ŻÉţßCzĚ%Ň™ú…bÔ8ěĺÇ ˘Z-’±±•‘µŚÝ[űŘ»W2Ä˝»Jň–č- ´×ęmŹ%u­a%, ±×%ëĂ5fľÜžĹqU¬™*í¤$¶%<™3U¶ÚZýy­ďZ–ü©gX ˝ŠŢ®źűö´qŮ·fŰ—ęvĺĄ1ÖΔO×čpżP ő»=ţż˙°uíů4ŞÓŃĄäňDĹ1ßĺ˛áë[ŻjűŽ"–·…čÎ|!ŮęŇŘńY*Ztk×Ę9Éc…®KăşÉK:Ýj¬·&öµěíwĘĎVŢă{’±Ä2YoÉ,/˘Ä”örmjK –IL–U"YD˛ !–K –C)’¢Ä2Ů ŠęĂ‹Űüímüxěa´ŇĎGë±…ńfŕ›Ö«ÇˇĎ›ŤLzř×|<đä™ŐRt2É+±*>z~'_C­źç’ńF§†ç^l‹Eݎ¬řMçŐÉĐę>¶7“=˙ýľ˝» ÚÓǡĹlŽŇ¶L–˙ýµN ëÍ×ëeÇŹńµm–ŽGŇßź§bĘłQ«¶¬śxŮŮ-‘ß•b»ţKx= ńŕ±ßT’–Îl—ŁŻjRň,Hó;~ăJ¸í jŰ2É_Ž[n–Ĺwńä®\~ÝśÚTCZÍ1Ąm\S-öŽ vΫVŁő9łĺČŻjsšż×CŁłŮĹ’Ž«›KHáfkQ –S%™i"Éeż$0†"U„K(›nžâc{‰K$˘@L–S%…b4 @P ’™­&oCąu×I„ ®ntŃGgľÄűkÔv|RŞ*4ĺ)µ©>çĐśnzŤŃΛj­5’]ŞÖ‹RjÝ5¸‘E&QHŠL„0Ť“\`d'M*Ű’‡g©UrˇâËę4˙ň¤Őxbĺ¤ ˘r2)h¤B)†‰C@PÖâ‹L¤ČE ‹LŰšMRłoSiŠŃoÝĹo‰ä™n*·lÚŮ(č›SVá^üńĘÚa˘©_ńńł‰×ěVZă®'ů×džNNJŇŢŻTŃš~ܤՕ„¦?ŹY±×+ČŐě“s©®/ŚUşw˛µV°ĽśJćË‘SíTµłMčŹcßÇŹ%0·7˛ĐÔĆnÇ7Čvă˙ÓăŰűÚ˙cOŠĘť/†ÚĆ©}?‘Çíçä–—Súů:>3Ó}‹č˘*˝~˘oěY?_ó«ź±‰ŕÍzF“§Řô>/-U¸m:?ż†uäɇyćIŇbbNnÇg ±7W›kö¨e“.¦ěÎ~ŁäV,nέ7}ţç6 Vôx­ú 2÷q«ŐĚkőjíyń]IÜÎ<1q˘›öĄ«Ę$Ó'fĘíSeä+îv7zT JLMCŤÁQI†¦Z3L¤ü™hÍ2ŁJąĐÉ2ęĘŤQĄYťKDF‰”™še"ŁDŔťRÓÔräR&ÄŘG$HXI •2QCL‰*4L *ŢČąĐÉ6ś Z©VŐią5Ťß‚¦S€%hőžş ąPNŔTŚ™*(i“! YÓÖĎLsKVU·g$ť=lŘńňy˝ęĹž:Rµ˛Ş…mO7&+â´YGŁ.ÝÜ·´×ńŞđŤ±wV±ĺ¤Î’Śó¤ňč¤ü%ţć8i’É*č˝NÚÖś8Găčsö;OᎼRó˙AŞě˛Y,šŐŐi'eÚéRߌlŽl}ś•´«oą§c±kŞ+R#Yőڍý·em‚m•Ů$Ôµä—irÄiĎTÚŐŢĘ´ü|íŘmEÂŽĎΠ–9… †DÝa@"—iëłčćjdµpŽ”Ň„Ř*^gaZö¶ţ ˝­WčĽMn§ývÖ&4 :%Do»‡·čs şůiŽü®ĄDř2âĘŰĄa­ÜAĺť”ěcĹ×ăŹKůűú™±c|Ż©kFFą-Ă.Ż5lvü–ĐĎ5ËŐďäîęaXëďäÓŇ|/RY“ą+»OüÎ+ô]ěíîKzęŤ0gYÝčô˙·ěq]ĺĹ{Sť”?V$ĽöZěÁÓXďÎí8Ř]¬YňßńK‚ŰT.ž{ZĎÜůR,ÝŚřrşĘăşÓŔçN3ŮĘęęÝ^Ť8h۵ťžíČečtűX9Żç»äÇE8ëWŻ/©î|źËfĂŃë_­ţ+v~­UmţçĘAŰÓďŰ©‘^ôYřŐ×rjŞýQŹ/ç®věÔňă77żw®»=ηÂ&׺ϗ2‹[x_ńˇÓÓĹŇůĚ_Ęíâá—¸^Ő|UÜyšÁü^­{T¦jg«yéXü}4<;ü‹§['K­^8-“Ü­›üľ‹ý Og§=g§v­“ߎží>c…{+ :ßĆX“Qż%?¸ódÓ7c7büóÝŢĐ«-řFRu“&z1nÓŠE%C”L€ť^ݱڔ˝řâNXűÚf­«jrjÓŽßC “ŻuŢΧÝÉl«*ütU…´"ÓÇlśšµTCłŮśRkďÍU.Ą&š×Qž†·i7jVńJ¨á±ĎŠŠÖ”Yls+żĹq•«óö+łXsůz YÚ¶‹LŁj˙ž‘u lĘÍ–¸Úüy6N,¶Ég˘U@<¸íeZWöˇbÄ©in_„Ë5Z«†ŽoÍ[̡۪7Éě¦ůKł9äÓ-ů$ťbËÉ‘dB@ Ś@LF$8ĺ˘@ůŠ$$`Đ ±X%RĽÜm:§gˇtşÇ5˛űŽ”µ-®ÄeŇďęŐµě#&W_Ć»ú™ăquý›KO©b“ź#xÝ®ý ęb­˛×ÝqVvćé]fŞÂźůŢĺ1Á{đ|j¶B­Őć¶ýCäz˝|oŐśrSŕÓ±ń¸raÇ“«č¶ň‰űOşĺű<şcuľ»/$]»]ÁíöńŕëôéGUkě­ć|łÇľGG ~Ą—RĚV$ëVŢďb-ŹŠm˝E\Î-…•$ÓNgŔ#5¸%–ôvMƆî1sľJÍ\{i-v9$ ”tĽCŐL=ăęL„i#LÍ2“ ëĹ~Pť˘ vQĘĎň^Č™Ij™Rd™RAD¶KaPĹ*ŞgôĵZíęTE˘ßFgt“äĘ»ââżÔ‹ŮŻé°ʰŰjŃT–źSź&eg[ŞĹÓ–ü ÄiŁfÜ{Ů»9ýŰŁ&[%…I%1"c E±›ئMÄĘbh„fÓ’Z4‚bŁňC ’Yl†Ęd˛ňK)ů%‘P÷%”÷'fŃ‚Ů_îÖž¬Ňü1ŐäkUçÉĎnĹÚJş?,Ľ­ľ´îá1Žnćl©cĺZB=eL®•pó‹4´[žqß#üWęz}n˝rU+^=¸p´z ÷ÓË·lvő:ą0ŕx˛Ű’–ÓóÍZ·U]ŃĎ›ĺ8f®*ŐŮJMěżCŁ6LY8şŰ…âQ®;vgžýŘv•ýĄşŐIËE–™˘ş§‰Ý’oNzúśY»:–Xë­ü˙ćÉV:3bÇ’Ő˝–´—SĆí÷ď\Źh’«Ýî<ß#š™yRĘŐ{×ÁŹs·^Ć:F>6ťl˙Ů36úp×ŹŹŻ?ÓŽöwłµ·{™˛™,Ăq/rYV%‘RÄĆ&=‰)ěHC+DM·(–(LLl–@‰€Or^ĺ=Č{…b†%¸Ŕ`!€ŔR$h ŞŐk>Ł·ĺYô2 Ö‰%É—Ęk50—ŕjÍh€§fâ|I“)2Ŕą(‰)QIř!2ˇ¦LŚŁD¦4h¤ČL¤ÉH„ĘEŠÜ¦cCLĄˇL˘Ć™(`h™˘ÉdŰz·Ł1L¤Ŕ´ËNLĘL¨čÁŘɂܱ˝÷^ý뼾ósy™0L¤]3ŮŰŘîľĂŞtJµsůţA_ qaNŤ¨·ÓčŹ0Ň–‹'Ľj6óîÎOłÜęö1féűYž°ë®ç›l7­˘©µŕĽYŢKqUܬť—KqŞOŐłVďÂtůiÖYjřÚŻ‹7TáK{kW±Ď6L—‡äč®JÚÖĆś4"VK©‘îŃÓŹ |Őů8­|Ôł­¬ÍúůąN;ąť…ÓÉ‚´Ł·)hŔy*«wTĺ-„‡Ŕr4É ˘“"FѦh¬˘-˘“*6«5®±ý *ÍđţVŢ€•Ő\iŞŮ®.»˘i‘;´×ăm ÖLŠÚĚŻŞ‹—¸–‘1őĽŠ°«ĘđsěĘá{Zlˇ6VZ·łIUlsč ™Čr*®BH™ Ć™4Ч唟ˇšj>…-÷“–VľŰmÁKeC‘ËDż H"dŽ@` ČÉ J*Nž¶\TmdSËI9Ső::ÖĂ[YĺÝj‰G[ęRńlvâ­ŕ§l=UĆź•ü†ĘÍk$ˇWc†+z¶Č=/~Ď®ňiÉIž>Î<ŐášżŻăŁ}GF˘Í8GO–PÄŐęcŁäµôLćěf¶F¨ë ľ»ťrŰZŹ] ZćuVŻŐŔ+ž}PΧTë]·Jş#•¨mzT–ÔŁ\M)o@®_ÉÎĚĘB@Ó•Uů% ^üškÁś K]Ů%éą"Ô5ĺµ č¶AHß­“;·‘J^w9Ćšň­Źřů—*Ńię ŽňČ©JĄł‰.ą°>µiĹŇŹŞú˛»9qäęŞŢĐŇ˙TcyůiÉ×Ĺ“g)VpăÓÉŰŰéÓ.IŻâăXÔ>6őXťďikúĄčmNĺ3ÖőŞü”©Ř[wčIÇŐç_«~ş÷«tř뱆L·ËnWrüä®_nÖ˝ô—5ýL Oş†Đj€€% Pb’e9‰´K˛(©“(%R‰•ę˝@®L92e *G[q˛¶đD›c¤§Ę!ěüŠ+Ťó·yIlh±ĽxěŞĺł:ËČ©J¶”&’˙SlÖXŐiF˘żą=Č®L|–EťV{ń‡eş9žUîsŞąegdá±€˝íw6$'PШr€ô R1I26"€L@2@ ’‚m?ÇrAY¦šđ]9VłvOąŽÚ?ő2»Ée-Bú©nćq]>Ý%Z¬»*¶›Ö63ĄV5ĘĎîk…ă˝ëÍĹäŃч Ř•ď“ŹŞ”ŹKJ$«K+F›Ë<žć cjŃř[oŁ1ëŰŘʲŃţž –l]ĆÝ»gµ˛ß.é¸_OGĂß+Ĺ‘[ö&¸Ďú•ÜŔűxé“ –âWŞ4Ď|].Ązř˙}”Ő“vIëřĹďżĺ_gµńîV¬ë˘ŃłĚí߯žëŘ_ŠI6”jsd§ąűu˛đzřqSŁĐłČ¦öSdőüź‚ń=o˛núG‘íU~ë]Ąf“•ŕ·‘d«ä¸Á‰¸ËłŻ|™j±W'r޲ѻľlŞę¶áí8MůG¬ÔÉ4¦[=9ZIbëŁ.or˙•ľ‘âL—$ŁDKIŮ´á–×÷-XŔÝRZ 2W)×EäRŞe&d™JÄVĽ†™’°ůٱ2G äl†ŕ"ĚŮ7-jNK-%n Í6zkŕ̶HX†CܶKY,opIe˛l†&S@HxZfŃ-äMj4&ŠkRY2^ŲY›ZcG±  ‡±ob,*ˇ’Ęd?$T˛LLЇą,§ą, YÄNž€K"¶}•ZĄZĂŤ}®˝}Ú6ďĹÂ×ęy­ŕ®nĂö«d«][ňY~RχGcŻťQŐS›{4z•Ŕ˝îÝć5UťŰŽô¬aWĺz­gVxťěą/Ř˝nĺU´—-ÉĎT›xčő©Ú¦\WÍDⓣóąŃď(şă‘ěŢŹúŹă“}|µőţ‡ŹdÓičׂ[Óľ¬śŢŘôëńTWĺ{ňƵUŮśýěřx?kßdľÇf֧ǬżąŐlţŚăěvúÝŚ-ş—e?ő3Ž5fď<ĺyĚ—ąL–a¨—ą?$ř"ÉaSbJd°„É)’Ecb" L˘X ’6 %”É{…`1"Đ€Ňä@E°ä‚“ІC% ‘É)Ś Ld"“¤Q ” †TZe䢓‚Ń4ČU”™ ŤnThŠD&RÖĹ"QH¨¤W‚PŔcب{Jôô“*H)0-j4ČL˘‹E&Be Ť‰E&řs›ÇoýÚčßţŻő&wíż+˝»ŠüŹÇRÜ©Ť&üŞ#ł6zSľ×:hô×OSć/Kă»ÇjţKFŹCĄßX0[f­Óűo˙¤·ÇĽçĺ%řO{˝‡µJÓ]\˸p;%ÍÚş'˛ú ©rnLú%)’ŞőŢÜ— OMÂ6UUü¦P+;'ęµF^ăý" uşP—ę´WjUźŘ\ĄË3voĚŻ°ĺĘ›Ç^\w‚#LXňeźnĽˇKľÝ’]+ÁµţYđaŮVęW\ŤŮ~këúš×ł—±ŃĘŰüé»Zhfę°}{;eX¬Ż\z¶bŐ•yCâôVđuüumU|ą!bj~Jî«[¶+Wآ_ŠÎA$HIWŮ"„Ů,b`C%–K6K-˘X‚‚Ą[$&1!2‰`H™DřIe2BĄ’Ëd˛+;Ńl†XÎƶ3°Vl†[3dX–K)’Č©%ě6KĘ&ÄT1+ÚŹ•[«őCdX·W±ěe÷,ťĄ4ărńâÇŰědËgĆł.Żs“b–D¬“ž?ÜÖđ4±îu=›§L0«Mzśů0t»wľ'¦Zîörňuşő¤·[:čŁXť& íâUVÉŽőÇ“,+ZÚmáíÚúłßĽôyyňĺë«ő*˙ÇŞM¨mGŁÝëÚ¸i{_ܲSk;xđ’<ă¸L†[ ŤwK$lLĆÄŔ†K)’„6"(d”Édě$–Q/pŘ$ÓR€–O“KV^„:ÄΩʆ€C(…!$Q4Ŕc%ä˛ @2‰ŠL„4rQ’‹’“ h dŚ E™I•–‹Uő-%ĚÓH¶˙ ”˘’…ő&š}ДƆR'ě4Ŕ¤2G L@´(µ©H„RaR!˘ĚŃI”Z-34ĘA*Ë­šrś?S4RÓ“n^ďÉjĎĎő2L¤Ę5L¤ĚÓ•§č92’¤ $ĄşťŚä¤×ťPFĽŇŰP\môdńOaÍk¶ŻÔŁW}˝ČŇ«B]˘>ŁJ¶Ř"ÝÓ[j ůšŞ„´d¦˛±I§ä´Â6­Ýg‹Üjͨ˙C$Ć™u1˝2ÚŹMžŤzŻC«'oL5Ćń©RôŇĎä9:2ö2ežOIđe")Š‘ÉL N 1ݧ˘“číŻ@é„פ™Ąee>¦\­:̝ݚü˙@‚óËOB踨¶ěÇăą‹vźËp6˝šP–„H“†»#!@ˇčLڎŽI‹, RÜ#ZLC2SUČĄvşU}ÂŹXő%ľJPé«ÔUXÔ—/Qű‰hąh‚…-ú›ăöă‡)źR1*ňZţ^N”ç*đç` ľy]ZßHű 6>*IWSÝëő“¶*áÇÇ%Z¶[ÚżŤëĂ8{}z^·ĎgOw“O6úOÔź°ňZV««‡ą:•0K˙Č%€9  G €m‹3ĆšJgţ AÝî[řîďw±ÍTíd–­“Kj•›á*Qۇ&'~ëPeĂĄWŤM0Ůg«ĄÔµäY+LňŞ˙:čF W//ňô'eookýşřg#Ő¶–†‹±8ÝnĄřfR p‘×Wb˘ě­TˇčM[N"S4VPŇŐŰ+ţÝ·T“KÉ‹Xë»–]ň:Â~w2˝gň¦Ţ€U­¤×SžÎYmZ©ą2l°)%¶)(© &Xę­fŞ·n &<¸raşÇuů5)-HjŐpÔ?):ŰŤ«e˝\ëô!69 őúů×gKăýşÎęN»Ó%©Ëż/Ş<żç:â­qW‹Ť_Jwł{MŐÎVôIl˝LçÂë«,·Ë‹&ZqÉŤĄgá˘ű¸3ö3V´MSͦEu3v-‰ß:ŐżĆt:,­eĘŽ'ĎŁ&óô·Ç˘ťü˝4Ý™˙#­ÚŻ ľ?G§úwpv-~nĽáCuÖC.żS&g6\)ĺżř,éş#±Š˛şRÜ’ő2ÔčíâÇŠécs¦«x9ä¨a,RBE(r ˘d$&)`9%&J„ؤ"…"±“!%‘ČŽX2,%­ś]2ZźTV<Ťä›=Ě€CŻn’w}nWĺž—Zť[%›§(‡ţ§Îýöňz™űqôé‹«m^šhŇňfĎŻ?bV/Ź"ě,ŹZYE_üđŘň[=˛'Ş‹}[ ťü9ú<3&ólľëű…×ů X:vĹŽ­f‡Őż#ź×>?äďŻc±›ŘĆňńć–ńéęxź!ާn´­hëĹĚż©ŻKäV,7ĹŘNőŐ×ÎűŁÎĽZÍ×E:"xĚżNëjSÔv~ †šĄÄe3±mH’KVęái䙢@®GOFÖ÷•V_n»·ęrŠő¦JÚë•S—_RUz™ţSżŤdÇĺż'WR¸/Ž×ÇŤŃdŃŐěц.§W2®oiÓĎçô9{&Nć?íÇ[qT^›ĎNĘëîaÍž+†Őxë¶4ŕçŻV¸pŰ'fSzV¨ÇąL¸{7µ9*·*ĘNśÝËW+׍ą/ĘŻÔ &×ĺgmĄ· Šd`1€ ˘YD´2M% ¬Ú%–É`C%€€#l–@=IaCd±¶DÂl– ‰‘RČe2Y›Ü¶ČaY؆U™r,K%”ČdT±1˛X,r .3ä;Í!ł7¸X†RjęüČl+ĐéäÁĆs*«§Ć¶ÖeůAbĄm‹%;ĺÎÎÔ‡¬­Ůçňj==ł×Đjb»}ÇZU·JJ¬ďSS%™T’S%‘bŮ,)2YB`C%”÷%…-']Ť=ť\żĆ&EDŇwuä¶-dY¸ÎŔgZVëOÜźú’ôZ/&µ«Ć­kxŃŐß%¸·§’ ‰ň]”7 qŤw"“Żă Żę[J!:µŕ µšRŚgSMéő%V5`r€ €F"ˇŽD†H‚L`R(hAIŚťŠ¤4ÉC(´4Je4h¶3’ęĘUji]T35b“ŇXFľ! &G(†ŠV(Ńż„Ü d"Ód&9Đ ‘ t4ËLrT_ФBeIř)‹L˘“)2S„h™Fi”™E”™L‰Ť)XĘJLŁY™¦TrRzęg#L¨Ţ·—<™$ĘWi@1˝”ĄG„rŃj ÎĺFžăŐ=˝A34ĘL L¤ĚÓ)0ŤS™&R·¨Hä„ĘL˘¤¤ČCL )”І™¦>Mţ&CM­´ ęp”îŃź;;-tô&·J®Żv]*«ĎěTUěŐĄ84Ąů­V¨‹*ŮĂpü[{sW©ą95)ţ>†d«8Ź"†´#Đ ő$rHI!, *©żĐÎJVk`6®ĐĹÁ‰Z+®âćýAŤi*SŘ´á8ÜΖoVvŕęĺ˛Ç›Ź,vjWŇAŽd™uQŻ“»?FÖĎwXlj$çęqűyHüSŽ^ ¨Uµ•§oVkJŞ˙‘>QŞűśÎî ĄšÉŻEˇUěu»őĎK˙"ö®JŃŇ–[k¤ýő0íöë|UÇĂňPŻ“IłŤŮç×+®‹Me“gÉ»$Lˇ¨¤$¦ G  ĄÇ"ŠL×WŤ»%3ˇ‚™Đz­ÂĆŞöäěś6f™Ii•&iŽ@ľAÉ“"4Y!5ëäjŞurĚ[ ÝUËóKüĽ"+~4–KČőŹ&nÚDčeięžţ ›ÉeJ$RËŮjwuzř2Q;ĺá™?ÚÍzťĆ,¸ł(u{ëŞLÇäş÷§b×­[Ą”Ęő&ď ŹO:Á‰.ÎUĘŘÔUúł‡§šť®ĺžj'Í~)ř‚ş©ö~;.íŹZ˙¸tzµë×ů˝—Ĺ/Ů_$őű‡ü xi—'fеXŇßčyŇz–ů>¦ñ‰ńOGąçgáîßŰ\hß⟡f÷}|Ř/JŕÉMvO}N¬}|X,ň¦Ň[úAĹÖË7fżÉ´y:±ĺ}ŽľFÔ=T~„˘»#LŠŘ©DĹvÓäs{őË‘ňUQĹh¶+c­ŤäĎjÎYn•đ¤ŕ &cµÝµ+‹%8Ú·RęőÔňť›múęDȦ>PMW+*ÎúăëĺË~Rć=¬XreĄďHjŠmęW±›đüç­~§g[?[Ż‘cľ+S$p»™_rsĽďä+U˝Zŕ–ÜIŁŹ…’n' ý@ôű/Żul5Ę±ą›ŻVy{8@ÄŔD2YŁ! !™ŘŐ™2*Y,¦E€B%°ˇ˛gČI-řm“,M‰°ˇ˛[d¶E6Él%˝@M’Ř Ě d1ŮÂĄ˝Hc{ȱ,†S!‘H’µđô ×qBŮ Ú8&ŻPĄ{xDUî‡}W–şë®Ćw‰ĐŐĹ´ĄtQ·î@®vK4Č’s]žĆL‚X†ÄČ©d=‹d2*Y,˘@Bc%,‘±0­ńű{UĚ­W‚­řŐ·$Vέ­§FÍqâ˘|•¦«´ÓI&ÖĽNu›Xi%ôćł}[˙B˛,u\¸Ď¨嵥չ[™ÖÔ‘-ÔěE;ßÂ7÷Ş{1iU>HSä›d˝€sĚ´!˘‚@Ę1 Ć€ (¤C$ (h”0(©$h!˘“$i– % Ą#oÁ ÁS§Ô#Jż%âLÓ…ˇS:ůůx‘#L˘äiä#B“ţ†iŤ04źĐÔ™ (Ń&i–E&_ÔÍ€˛E"ŠE&B)0‹Ld&PÉa™I™ÉI”Ze&g#4L©2N LŁDĘL‰aRd'Re&DŤIEÉI4ŔŃ1¦Be&‰Ť™K@‹C%jRe2ta4ÚdČŔŇÖWs°)0Šd¨( Lr@ä „„”"b*PI! kVíŁ{Rś¬«1.59ÓhÖ®äŔöşÝaĘŐŐrcuŃď©Ç‡µ›­™Ň¶|UšâöÜč]Ě=L®<·je˝±fëwš®\|r˝­S?‘§Ęß#µ)[E-Yiyf˝LżMcË)7+ěo—8®KQŢŘ”Vľ§“›żÚ¶MŢ8ý´ÓĐWrřůŞcÇÁWFÚ‰9“odzÝn‡oĺWůqŞU´Ţíř”w|'ÇfęvsÓµŤ5Ĺq¶őzř¶|/Łń]Žţ™±4¸iZżîg­ńťL~?łLŘŁ"ĺ Ë_Űŕń{±Ňďgż^üWąiŻöµÉéÔtţJ˝®îdŻIć—­} ĺoßÍ/Šî˙ý›SŤj§‹ŇÍ}Ž);»ż5ÚíÍ*ý¬ON5ÝýŮ×ŰęáŻÄŕËŹ÷l©6KW(ÖŢýÇŤ%r4ÍÔěőńW.Zq­Ü/YúśüŠrŇE(žA(ŞP´&PHEH%.’u‰Ť ,’˘µt`])jßéęS¤Ţ^Ć5Ëi‡Ş+-¬’Kg¸h«”&ÚqĺŠĎźÜŐĄVď`'ůÚňĺh.@kË꾦\_–ŽÄ¶D‰°Šl–ÄěK`6Ĺ,\…,ˇË &B@őľ7"ĹŠýśŮżč±Ďź°żů¬ĽŰöęčö«ô8úO«ÎË·<übwýWĆu&ąégl{Ş˝ŚÜďĘňëéŢą1¬ŢŇÄďö–cÝÇ·mö8^źŮ¤CĚĎň92vhéřâÇeĆżő5ůlmä§b‰şŢŞZő&s馺:ß©“ž[«Ńj’ó÷9ţGÝľWkaöé]*ău÷5řśötË…ÚSVŢÇ.~˙c- ŤY'Ľkˇyß\G:5¦\”NµłIď)–™GfÚÉŐWóđ˙ęuaË|ťkŮżË]O-2ŐÚP›‡ŕ7ţ^gŤăł”üů1ˇÉ@ Ŕ$M&@m’Ř2dˇ± E P¤$€c–HŔr9$b‡#L”2QR9$`R(`P‚@y)µ]…wˇ,r¬Ő[‰iHĎ7{©ŐĆ«UZYJşŐëęiÖíŰł_ăv¨ňÖŰZ%¦uu T}g—Ţ•<^©#“/Éű|±őqÖ‰8ÔĎ_÷Ń]y: ˝GÖ¦N5ĺĘÖ·ˇ† üwFËŽG’ńţŻkż\<µç[×ü‹ÉÉŚYšÉŐČ–kŔžühŰäóć®/ń*˙&ŽË]Yâ}ĘS )‡q&ůWÂgšśD9 &BK˘¤BČ*A9ŹOR$Ű­ËŠÝČËŘ|U–éůÔôzŮ1^řčńÚ×o’µ\%÷<ëćĹ{C«~GN ,\Zł˘Z7ć(íě ůݬÚÉ´ŁŞőÇL<ůq˛˘ŻşÖ©zś:]{Yvi{dJZOË3ëĺľnÖ\wMÓ*u·˘3ý ëô°Ű/?~ąRŐĄżęs÷1^ą=Ű:ĹŢśM+ÖÍŃČó«VŐ¦őOVŽ;ÝZö˛P›m/BĎ®€6ČzČ`goBlÍ•RČl«Č%’ŮNSŐŘ­kZş¨l+Éoę;VŐŞłP™›`†Ů-„’ŘQ$Č6Kdbbl–Âś’ŘČpl‹ö3łđA,–7ą,Ť%ŮVz_Żź-«Ř˛UKE1,H^ńÝL]ž|ěÓ¬hŚ}ŚŹ=°V­ŮY×˙3Ůëü}:ą^LWn­C«bÝ~šżbĘ-mý[ôFż^9ă՟۞9ŢŹźÍŠŘîé‘q˛2âŃŇ»O?v™s$ęß_ =î­ňfĆńŻÜ¸żM<™ĎEŢ×ŃĺŮ'ż;ŰÂ=ç[_Z·çĺ??cĎv«Ü^ťĚ9F‰˙ęi=Ű'Ťw"ňöŘŠś—vŇf<™2ž„=Ś„Ée2XX–K)÷ L’¶%"_’`HĤ®mSŠÓĚ’S¶[6­ć ÍÚĐÔč÷%Š$¦KĄWęÉÉ቉¶ô s!jĎÜĽ-fárŚ@¦ 1 )Ę ´( !€™ Ś”ĆB)0) ‘ ‹Aä’Š)2E&!¦H&ThČL¤Ŕ´Ę“4ĘL"ä¤ĚÓ˘e&FŕŠ4L˘˝·4Tn­˝(bŐnŁDĘD'%&hi’ŠERd! - †Č„Rc’F¦Ę!˝[xeF'L°-2Ó3Z 8(ŇJL„ŃH"Ç©+čR*e'$Ś %€´ĘLÍ‚4E#4ËL _AĎ©29¤i“#”T\ŚĚ¤Ŕ˘‰L ú’R)h|‘2IU¤ˇ™ČIˇRf™I”{=l]~îW‰ătIs^C.l˝Ž˝g,k{tďćTÇŠŻŤhÔµ»Fů+N˙jqÝVŞ©Ů˝62Ťóvł.žŐ»WłőS´»MűÔ\čĄZ Ä]G_݆®'}N|}LśşöY+uŞ~ôúý^×w?˝Ňěqáć#ô>ŠýŢżN”§s=}Ć’mčŰő„|źĂŕů ×Í~Ťý¶«łŮËŰîpö±v±fuí«{ŻVď-ż¬’ÍżO¸÷~K୑߷вË[·wIS®ż‹7čRřţ=oW[~‹ZśŹĺ«zĽs^łŽK$ńk˙J>«ńʧ’[Ű®ńÝ/„ív˘ůWł‰ů¶ď쏤ĹěÖ•ÁŠő»ĹUX”Ţ‹Éä|ţo•ĆÚ˘tęmËĎ˙ąź;‹.\yđ٬‰č뼗-äzß-źäGŹł^§ńUýŻő<É;>Gµßˇ ;tŕśŮ=ą?ř<éf§Ek!&|r`\„‘É‹‘GE27Ť - qg52ńN˛Űrޤ*§k¦ŞĽ/SžĘŐŽZJ”kŘO&^4ôZř.αřĹďUŤĽ“%˝\čäRQ\.MÂRü!Rmt´ŐůŘô2Ş{ţ/u5kŞ9˙´+cËZ{ŤEgŽľ¦|ŹK?jődžŹo’Ë“•:ż§©ÉŰęßä“á¤Ůú±ŁžE"*E"\ÇLµ¶Zň˘’=l?*˛v•\SŻ $˙Ýž ĹÓëőpgíf»şö)goşßúĄ»ßVٰWťhăŽÚ#ćSjaÄîoŹł›;bĄ˘—ÝÁżoµŹ°ęńcöâyG™9Óô‚–ŰĂE&‰E -@Ô ‚´ÄŘI,Kb%˛ˇ¶&ÄŘĄ€ŰŠE 9„ €@11HIC˛e„RÂI䀩˘eR2F4R¤ˇ˘ ‚H1’PŮ%V¶Ľ¤¶Ô†Ý~ÍşÖvŞMµÇSŻ­‡¦ý·“',–ŐQzžk+W‡"Č”şřd°z_#×yŰËŠĘÖ˘‹ĐXű•ętđŞE¬ßç_Ł<ëçÉkŢęÎĽç’FR3µě7íäĂ—/<uMK_Sś% J¤@ 90¶Jɵ)x$dWmiŤ/qV-ŞĚđÚŮÓ×’ÜĹeş·)—¨éťŐ*ĄĺżP;iŰěaxąÂ¦-[?¸—ČdK'•˛9ćĽ/CŠů9YĂ|[bLŽÎĎev/[ńăhJĎŐ™#4Ę­$d+ d¶'b[OĐ‹2›3l*WÇÂŞó;hkň(Z?ődý¨ZÄ 5/ĄÔ±WµRĺm–Ç7Î˙Á_ĐŚłgy?ĄEź)TꌕmgGl(JĘ`/G ­ŐUš…ęfŮľ|¶sH…ő9™b%°¤Ř¦A‚ÔěK˙Q‘:€śů3z=5hćZ”ČĄJµ«h‹ŐUqJlöýBÜŞô4Çe\ř˛şňUişýî:řëNÖ/rżiYYzť_9‚´¶,¸ę•Zuq§Ôô0÷ú}Űű^ÜßŇŐťľ¦ťŢ¶>Ţjšő5śqË?·3x|Ď_µ›JşÝŞĘšřʱęü˝+“ŻŹ/„˙ŇČćËđąë/Ő××Fzëß/Auó.7ăÇ]u[2Iy•m›,x8zöÍ•WעúžíÜE[ÔĆöÁń¸xŻĘďeĺżúc6Lą^KŮËŰčľ˙źs˙ŻlwöşYŻ{äć­ĺ'¤/CȶŤťýgÜÍ8évęÔ>Z¤ŽLŘÝ.é‘E—7µnz2«đM¬ÓŰńiŁ;Y˝Ě©YË!”ÉdRbăfĄ-ěĽ|9“cˇăáŠę®g`k ŕs[&šň,]®ÚҤᵫt“Ń˝P»ł»¬čĽĂšDł«ľŐiäĂ-kV•\úŚ]fö!”ö%&C)’ÂÂ"“$¦AbD1&HŘŔC†€ˇ€1 ŠZ ’“‡ÔZ»YUnŔCÉŠŘÚOÉVĂzUYěŔ…ˇE_éE{lÇ\¶?qmčR†‰ECDˇc% p¦Q@™RHÓ*,kRä#DĆJ~J“.°Ţ®‘¦9墖X6uáO¬čË®GÁŮňrźTmZŐŐ¨Ź0©ůňoW—¨˝ËUÂP˝ĎY(H„R`h4B)0‹‘¦HĘ,rBc*G$„„hö!1i¦5ąšź§ęNĄ×ęDŔ+Ę %4÷Ó-34ĘL¨Ő2“3L´ˇÁ+ęR’˘†‰µŘdŤ0-1ݎ2rQśŤ04Lrf¬9D93L©*4L¤ĚÓ¤ŚÎB@ˇ=DŘHŠ–9"FŠL„ˤ;$Ü)ŐišR·iÚ‰ÂÝŁ«QW-nšľ/S%ťáÍuT¸Kü~ĂSZ«^ť'T˙ąk˙c”ôrĺĹŹmjĚëZśő_˵¬˙EŕjkŻáđü•ňűťpŞq{?ŰöhúëâÇ’‰ö)[ÚŠ[juúŐů×J™+×·ßwTz˙ ßĹ^ŻiösĄ–íµÎÚżÄϔČöÎWlEěăRą/Ü×üŘňäŻ˙Zyź6¬ůNż˝ů<^—Ĺw;×ĺJńÄ˙ţ%´_ˇő6řÔţ/˙Ž­ăńŽYĺţâäăÜąÇ˙ö,”Śőîâzs…É}ýOwÇôp·ŘëŕŻ;.K˙)ŘřîßCµĐʫؤVW­j˙SßůĎÉÔĂÔ·W"V×’M4ŇKqg§uľÝŢOË÷{yňű=Ś~Őhć´Źő“ÎIÚcő;~Kć-ň8ńRôTt—fĽżˇĹŽĘ4ť?wŘÔű)´ëä\‡{VúDZ” 4äĹȉ­2q{LšĹm Ô祡ËRi\ŤÝN|ŻöŐiätiăh†›»ŤdҵUQĺîQćx§”·:1Zô˘ľWôf8ž*.JyĚGfvľGJę€čÍ|vŻ~¶©śË «vµˇ/(yńZĘ®ş´ˇ˘=Ţę“ŐhÓ+5.‚‘ZÜ›{Ix0fěÝcÁG{˝x˘‹ęŞĽË•Ş—ž[ŻgĄŹă;ZV˝łëN.*µZ¨ş8~â}nűx»ułĺg*>“±ô9íŇĹÖÇŰĘÖJuëţ<Ź_ýLŰőJůîŐł;ŰĂ5?uZJÎľ©śŰeuÇ\é{ž©řúŁÔë|–ďËăË‘J˝^:ŐŻÚÍ; \˝Ěůű-aę×Tęâ~˘\ę>l‘Rą/\vĺDÚ­˝W©&•@NSkBÝ&ß@#Q‚¤Ě9€Iµ+`)7$"­<Ě”ĽÎćI–›dŠL„R-1ęJa#Qm‹‘2'aŞ®D»"[e"”LˇIH‰ @`)a,ş„Â@ ME É  Q@Hh$™`›ÓeK3‘¦&ƬBc”A|‡$Hä ±Ňą*Ňqt<­bµR”Ą‹Ţ¶$«Ĺ'±ľ=šĘÓ"đµxíG‘~<”6sd­,MŮů4ËK¬tÇTŰÝŹ+QYŰFô@q¶Ĺ,×51Ń~7ĺo&-”6"[ ˘d@ź@‘h’d$"‘H92OˇI™Čä “fIŹ‘˛Śą 4’d™%ŘkzŘ6K`o_oy·-™ľÎ»iţˇís˘iëčbńdĺúřf±fŐh˙ÔvĆ­EG˛‚U)‡ňł×Ôo-U9­€Ęůi‹ń˘ŐţţDćtô7kmV˙MĚź]Ě7§¨RÉš·ŁÓň9›:rĽTŁ˘Üĺ"Âcd°ĄäK`I`ôІÚę'ęA6a[ĶöŮib«u~ż@Ş÷,ŘZĘŻ”SŃLChç¬ň˙p=®—gˇÖę{´äz^Ż÷;z}Ź/·ŰÍŘČň;şĆŐN ßăúýL¶Éü‹/pţçFo†Ĺ‘ňĂ‘Ő?]Qy±8—żË“ŁÚů ™V,WäĽňŐ%÷=×maµ1Ş8ďnżĹu¸Őr»Ůyłúý3ĄŰÉ“Ľ˛e´Ľ“VżŮ sŽ»ř/<Î3ňô{Ł–ďxçOű´kő92|V ľXîŇý1ůŚn˝šäKKĄ?uˇËŐËl« Ş· x†-ç,$ą˛˝;Óř¸zôĺeý[ő<.Ďşîí™5gëˇô=‹äÇNu‹(‹Ýż›Úě>Ö,Xýž-·Ę´ž_Âřý÷»ÇnIfÝŚ+ ř§+ĐÁ­‘#lDUc˛V—^P;vo:B^‚ÄîŻ4Së&Ů+‰NK-Vă°šđĘÖN6ć¶·ű•'WG^ë6'Kî´bóRďÇŤiçěe…,žKnő3ţVV÷_Đ&z&říŤĹ”6J6ă—=}Ë=´^ H§©D˘–ŚŠUsB’M«gů}Š*µ|ˇě?.u´­| äôA ¨IÎâ cL‘˘˘ć L„ĘL"Ó.ŤL¶×ŘÍ1 :oĹ:é §ŰúĚÖĐÓßčkîţ3*} ŤqŢjÝĽy&Î^ňgÍąŤđ4¦2S™IReFd&TC’%9&@ Z”™śŤ04ĺŕkęg-–˝·©Dś bÖ…&g>FF©–™’e˘Ť-34ĘL¨Ő2“3L¤Â4LrBe&QC’drLrD„r99rRfR9ŮXjĆR4ŘHäÉX©I™¦>@T„‘> TŽLärŔ±Ł9)04F¸»®zWËFI›őî©–¶ăÎ?´©]Ëą‡XđŐÚ«w#ľ}ĄîŕqmíQߥŹ$d«öÓÖÉýCşŘ.©Žo{hěF~‹ěŕɕ㭕Z·±X1âëÍ-‘Z÷ÝÁyoL–·_›Ąü3Ď·W±\śx¶üYlĂnĺíUí,j¸üXᓣµüŠR”Ëi^Í_Ęézż°Xő0üÇČcęW§‡ńJUoýŃ˙j=Ž×g>€Ç‘ekí{=Úît˙‹•)”í‘nŇń–ďg»&írj»N’'+R¬žĘä í}–)*´ç;±ň35äŚä`lš{zš[ ?P5ĄÚ–‡KţSo$%éä{}ČŤ-«”%{RU[SŁ!7äŃ­ň·Zń”ęµfsäRĹ URµ«Vá6”łę>;áńőűXű}^ĘÉDš˝tz5ę™ňšźAńýľ‡Ĺô•[{ťś’˝ż)úGˇ*V=ńůéÝÉź;[âÜŞĄO“«ăg·đ}ľ«ÖřĄŐ=öäżŘäÇ˙Ů~Adnęą*ßěj?EÓtŻîaYŻ`É•M«ĺ’î%ârů˙řµ/’ď[ÚÇŹňĄ^ŹîÎśß5ń}ęŰŻŘV®6÷{}ô7ů^ź˙&ýĽ=ĄWŹG‡ÄýcSĘë˙őţÇż˙ęťVęÝ\·ôy¦Îµçw+Ö§bőęŮŰŽ6ÜĆ©7 ěůlťgťcëcŕ±®-íĘZÚuŹÔÔh•Ýt.îhšýHj¶{ęRŻâęŔ1ný ˛qŰÉťěę¸ŐBő&ŽÍč}‚´ĺ~3§©ĄqMÝŐn˘Ń›ü\5 ¬€Ń¤ÍY \±É€¦É‘6K°0Ű’ؤ ‘I2 ’ř´“{0ÚkrŐ‡R­Ggô0Ż€Ŕ 1˛X X¤l–ĘÂDŘĄRL€#’$rČÓ"B@Ń2¤Ďůr^4ďdĄ/©Ź$€ôZÇlswÉWvÇ—5\t‰ţăž™9Ń`®Ťąm›á±·nI¸Ť4˝ŢEjă´^»Ł’·Í[έů[’ą×:[ZN«ä•eŤ®uÜ\ö­Ż)qő_S!Zü›vŐů&QCl$—aKä$‰`J! ’@ ‘KHS 1ÉA|‘ś‡"«^AČĘC‘ٱ.ÄČHUI-’Ů-ŃŠ–žS ÓÔÖ׊»WX“ŹÜ˛ŻĐĽy*±:Ůë¨Lc{ÚÎlĺ›W^»ű21áwŐéSx˘¬(â·"¸e­Vž‡MoąŰ]?؋᭵Ćăý‰V˙ň”  űY*ď0üł”m5ľ„°¤!±‘/ŐŤîMź€%´EŮ/WI•ÄŻTÓŐ?É2yQetŤŹłňĺĆŐtŹäŞăY/\•PçUőrşyĽ:¨‘»UCP÷=GÓëóY.Ý©«»Ogčq÷1WĄňü”ÓOĹ•Žvěć®*ľ.Ú6ĎwÜëün,xmimÇŐý~ÇÍ«:µj¸kTשY2äË~ylíoVIpł^żÎWńĹ•}j˙]O;Ł&|ő¶=v·¦¦ťŻ‘żgÂčˇDŰĚŁˇ|‡W«ÔK®żČÔqňź«-ËtćLwvş¸»5K'öëV·G•ŮřËă«ËŹ"jş´ô;0ĺżoˇnOóiŐ˝µđxżËĎÁâw|–ORůgÜń—ěě·qvzü3EmOÉ$őpŽ|™Ż|8ë’ŤRí§Ľ­tÔⵜčěe˝x»8ÖLkX}ž Ę´r«§«9¬Ęd2)1™+ÚłĹÄîW¸ž7O-™·ˇ-ÓĄĄą·ˇqĚŢŽ}Lë~6ĺą6łmÇťĐl±Zđz­ĚŻwg/pd2)11˛[ B™Bc%°¤Äö2IOb@LLl–„÷, @ö"špŔ1C (٦ť{ţ7VSş:ră÷jĽYy8ńŰ-쨬×ý óćt\j˙'ąSŃ?ÄżýČë­&Šą5hŕY˛¶’łmťŹ'łJórß‘ 3ăľXUkŠđe^­ĺKQäĽöşŞ˝-§1Yň§űžž.ËŇŢß·ŹOˇÍ|VÇŁS{]ß.mŻÁú1K8Ż}|OÇ|sży«YcNʶŐ(<Ś1źłň¸3]ńįƸÖʶü©ß×ů%ÚĹÚÇÜ˝k[×üi˙˛ő8ţ;ăp5üţÍŐpbr”îש=w«3ľóŮŹĎă¶’¶J7U‘+&´Ö#ţďďgËŃĚ­ny1K§-tŤŽĎěô˝ŚY{˝ěYt­ˇ6ĄIóÝ̸°ełřëŰ;¤¬“jXë Ě“óôWwä˙›‡…°Ö™SMÝ)ÝÖžľĄS“p™¦±J­˝t-]'Ĺ ÚSKteNNĘ<«Éj٦Ą®¸ÎËÉť«ÉĚĂ#“¤ŐęÔž/nvmě‹Čńđó:+Fú#Ź[cmŁZöy5]m¸Li›‚k‡ˇ ™rmËň5f lÓ2V 5‘r#ą .Iv%Ů쀹&Y2)ĺŤ39)0:)eu lVOÚŚŢV´J ¦_ŰÔ Ä˙%č]îćĐ+Dź%°{rŰo@%)ȸYË‚ęé]GełĐ#!1‰°©d±˛[2XŰ%°$“˛MÂťX6mŇJݬIŮŐrO’\Łô(ôs|V.§Q÷nýęň§µá4÷䎬Ëâ?řę^Îř©žď"ÇU6”¸Â~†žßÉăěYwrŇýKiouŞŐ×˙JđËů>·GY=»ćÇq®:=ţSo&wç菝ěő˛uí^KL•W§—Ĺí&{=˙’ÇÚéUâŞÂÜRřÝe´¶‹ž4–,9dŽJ*F™‡( ”‰”W#ZćUÄč´łs&7·böu{:ů3vm»7«Ü€Zč QőŘ—)€ĺRäR –uBD)¤$™ ňb‘ärHI’[S!$ŠJbäNÄň%˛*Ű&E"’2&Äؤ Y-ZńOCL6śvŻťNvĘÄíËKqőýVť°Ňą*˙t¦žĹ×%+YVŐŻ©7ËŠď…¦<1Óáe[J¶Ě"(ÖkľkĆĘřť+ĘĎ_CGz`ühą[Ë#&JĺŻ.-[×ŔV"c%…KžFÜ‘f@›^ š§6R˝r·ó°V÷ËĆ•uPü bř׺őičŚ+~3+—˘edµl•-¦’4ǤłóŞ˝r%\Żü‹gU®Ç›ßĘíeŤd÷+E Ďs•R‰WyÔĘöNÍĄ–’r‘7ędlůkz¶ ŠZýܵ§·[µWşLĆaąz}Hł6ŕ˝IdPÉcd2’ĆHRd±˛Y€€LL l)1 @&Ĺ ÄE ’6&$¦Ib0ˇ’ĆH$l@`€Ť"Pʆ41ŤaMYŐĘpýNŠáyRÉkjÎbń»Úʉµ%ëĹRÜ›–¶1Ďw{żE˘6¶E‰Ö»ú™ö(Ą]wű•őíÎŽ–Ů řĎņŁ5;˝ţěyµęâ5;;âü´z˛I–Ü˝F)¬Ň„B*©˝»=5ÝŞ\?ÖĽ“Źg®ž Qu¨*rNÉ“1]7›­t‚dĄCÜHj*ddIrĆ€%hţħ#EŠD&R€‹™dŤZdˇ„Ze'&iŚ Hä!?Đ™üQa$ĚB©1É9ŇF™še&’4ĚärQŞe&dś”FL„Ç!Z¦RfIÁI„j¬Z±ŚŤX¨ßŐŚ•†ŃŞ´Ź‘—!ÉSČIśŤKSŕ +e*v5˝e®&k-ZI­‹çřňA őI¤žˇjşďäÉÝ·/suŞź¸ŞRÖŚ$y.˙lB"@ß\•ĆśNěé}[ăÍVż*J×ţ§5{Y,i»xŘÁî×ůěĄăRĵ‡Č¸xםHęöď[W˙*¶’őFýŚíU[“uňŽ,XďŹłŽ™+’ťŹg´úé$¦ÖÚv8kçËE‘Ęmiŕ×ä\މkŁ˙quz™]ë’ëŤSťw`™šÓąŠŞŘ늩;NÚ±,J;iŰfzq_ÝeýO?ą|Ů\*ţ Xó"Ä—łFń*+=Uv2Çu›7ćĄxDc›`˝Ől\şm-¦jęͶŁc:vmŞü^čęNޞ´OvĚ™I—k`Uu®ŻÔ‡[UKZ0ŞLŇ® “-0ŤŞÇĘT&R`XČ*Il$UV»…ą*ÚÚĄ˘-v+łCĹ[ŇU¶1ÉK+8ZxeÔtsWŁuÜÂąnńĽ\ß ž3¤ú†:ÚĚµŽŞîŢ7·ů™rt±ő2%Ćš«yó˙SŽŘąąĺöFYň;i]Ćěí ýÁ -çŔ¤¬‰WI2¶›Zł®Ějí([ú™HIF®óT§ň"Y‘ hĄě3ŁŻj{~e'-B†ô9ňÚľĺ¸D}5EĄ¸Z·±ľ>ľlŠî«ZnžçW[rR–ÉŤă¶=ź©Ë“6\}ËYM[´GŞ&¦Ż.o+jď}ęc/gŁ;{}ëaż·Dą%-ż6LMâ¦mm“#mĄ°'»)“fęÝlˇ­Ó"ޤRO!r¤RO!ň¤ŞŮ¦™ šbýéD΀uRŹ2ük¨,u¤óÝx:zŘňÓ4¸uŤ`«bÇ\—Íw+Â&ł¬izµ¦‰ Ą‘M^ľ†ť|xňópŇzŐăĂw’ÉhŞâ@Ž.b5*ÜŐaěj˙Óßc »Oĺ°Écl™*“d67b[@&Kd€3Nżg7W'ą†Üo r^†:‹PŻqZź1› ˛ćX«ŤW 9µ­ĺŁ|Ď&–÷ŢEü\˛ž«‹UŻíkÔůěYraȲă|o]jĹkÚí»6ĺ·ú˛bcŃů>î>×¶°Ú1©˙•ZúŁĎ’@˘¤rDŽJŞ”L±rô.®¬™r5ĂekÖŻiZuÇ’Őnµm#;(g«Z«,Ş–¶qŽ6ÓhŐ=ČăGÁŇ?q6Ź$G8ëąśýB@ŰÁ܉~ˇ P‰”ŠŞ”.H™ ą IŽI€Ą ‘H¤$†“ €RäR&ÉcR)&DAR&ýؤ,&`Rätuäą)D7![qrĽŇńc_›oŽđAr 3V(Ú©ŮÂ{ăšĘ{ĘÍll¬ëYł‘´§ô4Ĺ}ęĚÖoT]-WŞA´›9Ř»eâ⤷+Gp·‡%¬ÍčÖ¤Hé^:˝Yż';č߯{×-^56ť˝KěgĎ’ÎąeGölŚpg¶ óŞźĎSŽ.Ţ%kUŐ˝§F‹đóđçɆÓFţ«Ă=|jVů1ń˛ÚÝĘť^šĺ}má˝_č,]ç›=qŃq§™ÜNóÓîíż ˙‘דŞŇłÎÍňořÓđŻú›çî{Ő,¦›ŤÂý|şűś[ŐĘ-öIÇV]~őńVv×Yeçíű¶Ż˛µň˙ŕÓŻÔ®ŢV­ĺŻöo‰~x«ŞPß‚|ŻŞŮÂVŽOS+Ö™źă}W†a‡%žTۙы*uČý&P1ŃŹŻĺw)xF˛wm(^†Ë-– Ýoł“ ™}Ćś%  r&K\b7˛ \‹V”´ŰrfĽRzY™ňµtŰÔ ÝÓsx3宆ní¨đ đAż-5ş©’´±YęQ˘»mÖ‡ˇ•fdvn~€vaĄl–Gh7WĆćŞŇq{VUN®Ví®Őˇ-~1®ZşÚAČ Wurž¦nÄ» c˛–ł«µŢ„>ư”Ł{äŻôBátö)ެyy¸úŽÎťĽ™sXéő#^SV h˝›(’©ZŃ7]dĺn,ס¦+¨â˙B/Ť¶íËęgµuŻĆÎłˇ.ËÉupra,‹5: k,\Śĺú„ý@Ó“*Ź•ę›â›ýކR^ă®IĚť©/P;»Ë­—ĺkŐţ×]żĐëŔŻ–•}šE©¶ňţç=»n˝OwxkĆ‹s.žl·ľLą,ě©VőŘ3ś}]źâăĘňfĺk[jř;”ÍŤÓbş_Š{ALJłüŹđg\¦xŰĘ\x:őr­kYioÎŐ…îígk9męĹ(ËrA¦’g! i!$HÓDŮŮŹ-×w¬ó^N~żb¸ĄZĽąAčRÔöůGŰtô kźo>=­+ë©Űžő¶dýZ9?‹KkŽ˙¦çM1NjďőA›ZuvWJ+äéČąUűvUlâϟڢÍGÔĺ­­?‹sâg~ŽśóK$޻ɓ»¶î`¬ŘďZÖ÷´ŮčÓ0äU[d˛yíő(¦Čbv&B1ČRĆ ˇ€c’C_QˇË &YUĄď.µoŠ›G„#­¸µeşrD—‡óĺ®zŢî*ľ w`ĎnÍíϲätuŠNßdsgË’ĎÚĽŐcüUę=~§±ń=.÷GĽ˝ěMc˝]meŞőGVO‡Ĺ~ţ^Ţv˝źÝĂŐůźˇ5ťšůyč§Üů+`ëYăÄÓkĘmoCĎJř»Ź©Šnĺqői—WŰRiŘÁ—­‘âÍ^6_ŃŻTe!NBE"Đhr) ˇ¨0ŕ%`Á @¤@Ř›d¶6śrŤ=I’M‰Š@sĚ$¤MŠBś„Č„‘H›H u»«äś2&@ oȤ–Ĺ$Ů-‰±¤šź>€Cd¶izĚ„Ś âěűkŹrÖěxކęÖvm+Z<­™¶M1Ąó8öń·ĆłĚ3ĆČlŠ ld¶&K,ß‚Xţ¤6@› …&K)˛ ŘH› L@Ů,10b`!› L‘˛X‰î"0 B"„ d  –!‰€€ @E1`4ÉÄ0ˇŤ0*J’$ih¤ČL`mWHZj[µWîÔ¶†žĺľWr‘QĄmVŇHą„gEĹ;[rkv­/ÎŕĆžęô/ś×•T™j6ô‘śéŰ3łŇ·c Éě]ĂkÎÇecŔÝ*Űĺ¬z™óűŮŇ‚9NďQjOV;cÇTÖ¶f™3:4šV«8Ó»·îr5qNňß…á I‘]m_ő5çů;qŃy9›)eiqzú»ĽŮYVW©ŤîťśňľF|łqµyͨµáŕôiŰŻńí‘Ń*OUčxÜľćâ'O@–;˝ěs¬ćŐkoFgnÎKRŘŰšŮλśĽ‡Éň 2‘ČV’D°M¤”™”±¦F;đ˝lÔĄ¬çĎ|ŤhëOăNü‡–)jhĽř Q‚·ÉeĹÂ[łĐ®j+,IËHçËoöá}Qˆíe«ÝΡś×}»j·t˝f pŰ ¦řŇLăěRÖ·:©ő'OjÍ_DÖ˛0Ç^l~äÝ_o&Eîą[Ń“?R’4ä.F|…Č‹‹lRO$)@\±HR ČOĐ@PĹ  cÇZ[%VIToňkx čé+Ľ­â˛®Dźo/ĐhëĎŇĹŐë_+üík/iżMő:qdędéäě]{>äcČëë˙ĄÝ|ÝÜą-‡łŠŮq[K&˘>©ť=®ž,}Zb¶_o ,ěŰRŰ{gÚŢď3> Z¶ĎŐOجU»=dô2|jéô1|źW-ž_ĆÓ¤$ÎĎŽ˙áóu×QŮ]§Ę/¤ý~§«nž,ť+tčăÓU{Ą:‹Rů}zţ=×˙콺4»®Jů{Xď˙ěr>†<\bČ×8ňš”y=ź€ů»|iîŐy¦żč{°fî|'ń˛Q×5W«¨sW¦âás‹3Ż/žřç’˝Ü/nĘËEč÷>·&«Ű=q«fă ůI<üXzżŐ÷óµnĹ´Ź-˙ÚŹß7ß¶W•eâ›ŇźÚ—Řu[˙®gn>©ů ÷­•ĺíăuđżíKŃgĄŘîwľC¨Ý±Îľ&“Şi§ýdđ;}«vűěYCĽič˘ ńÜúó¬ä$™ Ňä$™a, ’P!$HHČ$‰b– \Ŕą"6ámedŻ*¨ÝѶ÷„‡|°âż¨Ő—†koÎŞ72Yź•&Ľż¨k,u…ąłőÔÚîŤĹ·'†7łý•[Złgö2f÷NĘ„sŮ:=B‰b’["â¤RL„„T‰ą%±;SdȤ–ČŞv&E0L°*I’[¶CblM‘Cd¶ ’&Á˛[ -eVŞÉC×Ę8vŮlŻâšÝ•’ΗÓ@ľF«V·d9OQ3DąŃůfwŻ&XŞ‘6 ’ŮÉ‘‰…! M’6Kd±*XŰ$’Ć&@€˛)6HÉb&ŔOV ¤Éb``1Ä14R h„0`Ŕ$dŤŔD!R2G%R_•¶{A¶GH”ĄŰȦQĄń%^I=´F2  @&2F€´Ę3)0‹E")04L´Ě“)3HŐ1É Ž@ąD„„T€¤RH! T€¦@*€@R2&4DŤ0-‰E"ŁJݨM¸N`Ý:ełľGĹzy9‘I–#ż%)‘VŞĐŇüSô!fᎴ«ü“×ĐÁÚ×i·¶E{;Ű“P €E"‘ˇČH¤RAR4Č4Lfc,rJc¤$@]#’d$"äĄc9 Ő1¦e#äHJ3ä9Iú‡#9C’ę.POÔĎIňaČŽB’Ť9‘Č$‚ä$„ĆÓN7(© "B@ą‘Č9\ŽHä9(¤Ęź©śŽ@ąfr94äÇČĘGČiŤy#) ׹ňa!Zr#>L9Ćś‚Lů…Ćś‘ś„Ťr 3䆍$$ĎHѤ—Š‹#†ŕÂQ¶LjŔh™I™¦R`kVËLÎĄ¦r4Jcµ± @%°l†Č±-’Ů-•U&ÔÍŽ”Ń~~Ni5Çj],mkę®ŐŐĄę˝§č>‡G¦»µ˛ľL‹u»öź/ěÖ­ÚďńE.Ęĺ\t_Śţ›5ő_#zw~+ů.şÖ.«ĽC†xß×ěwłÖôśx1´í·„s[ĺ;(úĘÍakZ¨óąŮ‹ĺšč˙T¶Ü×…öő –N;Ţ=Łč»”ęfĂ˙ëU^:˙u´ŹÔůţ÷K©ŇÄ»Ý,ójŮpŞjĘdß{«_Šż[ł“ň‹Ur–Üꏙĺâtô ă/żâş»=ŢÇrë&{riE|B1–g#’6ą !1ĎÔŞą drú‡/¨!$HräRG&Ŕ©d‰˛ vżR]…Č šz=ĆéoÉ®;YęŢ€]kĆmc?wóOÁV|čŕÁKp·(Ű7‹#%n.Mżµ'ᵉý¬¶p¬śZíę÷%Ůż"’"‘6.D\6Ĺ"ä) ‡"lM“#EHĄ ˛d l™‰˛Ů-Č›’d)ęĘö˛żíz4™® âÇWî¶Őż¶?ÔŇŻ%3ß+sŤ§iđׂŽ;ŐŇζÝnLť?—j·ł¬*ë^+VŮÉtčÝlˇŻ!6K`É™ )_…eWWýĆmšÓJţMCŮJÉî~7SčĐďJńSŞDdżëUW˝«ĹŻ@˝EÎí7+Îć«…˙(ÔÇ+|µ_Đ*dlDX6K ll–6ÄÂ%Ś–Â“ÄJ¤Ä6"–2[b6-€10,l@ †& eŁ@Rc$a  Ŕ@@Ŕ@CŔiÝĻӊMjőĐŇŞŞ©řZ©1Ćë§$˝TĺkZvآŐ.ěŰ·ăô1jmô)?m53>žŰ—«ő¦2F€c’F€ˇ’]µˇT«łĐn­nŁÉŞ•Áţ>RŠĎ¸ő·€L¤EżsŰô`hÓ3’“*cDÍ+Ź#şÇg˛fx©l—U¦–Ý3Ö˘_Ť˛CËU ˘É©n8©ÖÉwzč­OíňÇl KJ»p‘ťo–˝™Ő]Ű_ęvö{TÇeGEfµ×e#—ť094ÉKdŁě¸Şn8HU3#ŽIEH @1E&DŚ hÉ2Т‘ –Š‹E&Je†@Ŕm$@ “0 ’Ř °’[UČI2ČÓ3‘¦¤ŽH‘ϨHäÍ2é-ĘSmZÖô…ű®«UUůěCý°‡“ň‹­žĺEŞÖŃeýĽËq˘űt^¬•kÝńťŕ)“eŵ2)"®BHäQ§ äD„§"ńUdş«pź“ ojYZ®Ů„vćÁZÓ•T4“Ó_ęrČ_=ď^.«^~äH$\ŠIä]&ɵYKwčJ+Ą—ę]ŻšůňEˇÄéč4“¬?ęUüާĂ"Ď]ˇ ÖkDšK`´Âvzú¤rDŽAŠ‘Ę"A0bärD„r dJ 4äĂ“3ź¨HraČÎXHrAČÎC‘Fś‘ś„iÉ"$RQ¤„‘!$?PäD„•#“9 I:0×%^ŃWĽś|Ťż‘w iŕ«ăĄÜ˝×’y`Çé?ÔĎ5řă‰ŐčsH¤ŹB™ÓkD+·zN;jdź X˙symGôňŠrç%ăĘčţŹÁĄ«\±aŠ›Äýu"§&JÚÓ_ęL™»)q°+¤±ň3‘Čr#$Ę4L®FR9Y#)ýJ×r3ä iČ$ÎBP H‘Č1rRf|ŠL#DËLÉ2ŃFÉ–ŚQi„j™Re#äĘd»ěl†Á؆ŘPŮ-´ěIĄ3V•Ń~F) ëÍwl5~°Ě°«;¦–‰ę̹٤›”Ľ×:ĺZŃB{¶J;Y^9' đŐW–Öţ„[˛ń[‹RšßÉŻyçJşVŃú•üšľUÉY‰9ĺ2ľˇ$UĘŁ9r˝BQ’‘Hr&E Sł˛d$"lR.@9 &E!qR?rÉqđg+ÔR k\ŽłćB™+VŰF24ĆôĘÝś˝ťă“ŤŚäM"l™d\T‰˛dR4T‰˛[Ô ‘I2) ©“"l*›%˛dRl'ÔRNŕv;aö˛wUqYŃšăĎJa¬ŐQ]´–ńő81äŕőJËŃí÷6ěfĂ‘qóHâÖĎÔ˛¦5çŮ«·5Ë9jž¨ŕµą6ý}Młv–ZşqüTpúÍ’¬ ’Ř6I6Éĺ ?M˛H/•v¶ţ…]Ѷ“±„ł{˛čnńWEëą ˝Ţ ÉlŠ@Řý%€CdČPÉcb Ba" @›$lE#b L‘˝D ډ&1Ś@Ť† dŚ ˇęŔ!€€!Ś@5L@jÍyŰQ ąr4ÉQ@$T€€ LŞ~ĺ˙ŕ€L©XÚá«~FÜÝ«­<3ž·˛Ů•kÚßo@«Zm($¦iŽH‘¦ŮÔĄ2;UŮ×$~%ʱLš'ĘľJëv*ť1×vŮŘÓµÜÉLŹ7 nţ¦»uNu×Lk#¦l•ă‘dëŃäµóeJ^ČUĎ“[Ýłĺ{=$śëÚŞÍ‹÷˙}Kůgţť6ö=… ž:ř_CĎÉjZîÔ\kčmJv:Ôµáqňž§4ĎęKVCČ€)ŚI€G$€2)ôň]±ŢźąięEOŻ’ňc­1ÖÚňpiKcÍ^ C[ ‰öšÇîNž‚Lčµ&ś„ ĘřëJ¨rü—N¬´ŕĹ2Ólše¦d™JÁHI2QR&ÉlM€Ű%±H›"›b‘H¤ ’d$ ‘É’9!1ÉEÉŃŽ¶«™Ńř9dĽVJÓg":-JĚĚ} Ć’M+rG%¬íiTýĽ~–e1­řJćŕ1Ľrřîfź»HţäMk‘4ă`Ť/ljR_‘ś“{ňs)"®@ŽAČ "G T„“! TŽH4JÖp”ť}w>*ĎňPÓ3ę¬|“­ź?+Ŕ< ävÇ’˛śÁQvłYÔ~Ę8Hčľ8­–:Ë·ú ¨·ş«6Këęsc¦kdĺfÓoWŕ©ý2Y-[qłŮĂC˝Ô´Öľv+‘ÖŞW†ýLfH±R>DHHUň "G _ äD„¤„Ł9 I "BX!$Hä 'r¤rD„rD„„ĹČIUČäŽA \„‘!Č NůDň ÝYćj¶©˘ĹŤ=uS‘Y­Vć\Ţ^°RÇVJóŻář9§ti|Îą4Ůn‰É’¶iŐjĽ„ĘčvX¨Ľě‰żךpÎ{dµÔ?Ϧ.BH‘Ér934‘ÉśŽ@ŇF¬e#Ťy0äg#’Ť9‘—!ň@k"”gÉX(iýLärŞĂLË’)06L´Ě‹L©[¦Z±‚±J̨ÝX|‘аrA1¬’Ů„ěMŘť‰ä@݉l\‘2‚ś‚›8®ŻĐ–ĘĹ—Ű·(źTESµ•6mÁµ±¬W޵´zĘÜŢ´ĄÝrĄ©ËÚ´ĺkŃ$‚k«.v/Gé?aöVKV”˘źSžK»đţÖ›:r嵥>[(ăÉŽřŁ’ÜŽRÍ×>Î^ÓE«Ť łcXŻĹ9_RĘd$™€˝—!$Hä ”L„„T„“! 9ŠDäMŠDŔmZ P ‘IR)ˇH"’dRH¤–É’ v%˛d$Şr&Ä) ©’Řť‚›b™Š@rLČH„Ř ˛[›ô˛[ôb Md6@6  %Ť˛XPŘ€M L$DÁ˛BH6K‘1˛d˛Xؤ!€ †&„ĆK ĚB€ÄEdP!€`0*cÄĐÉ€@1C€)€“&$ĆT1“#dÔ·«$`5ˇH¦Ś™.FDŚ +gW5pýQ׆Ýkq÷*ď–Ď_ąĹ%c˝±Ý^»ŻRŁÔěăYiĂ\±íUčgÖ˛Á‚Ů^­¸Hây®ďl‰Ă¶ńő&_ýK˝ń1ŮŮ˝oĆô»jËZNÇ<’Ó ´ĆJc’©€$!©{oô;1»Z±‘~¬äĆÚ˛uRׂíŘ˝´_Fý‰âŁZ­ĚqkzǨńçkńľ«ÔָޮŻW§ ź%“UN4–g‹ň˝~ĺ_˛^fĹRń9vÔ–]á-˝ ‡WsKÝÖłU&îÎ^ĺŁDËV1V*Bci#aň4‘6D‹1m’Ů2‘H›UHä‰ ŇG&r9(´Ç$HHF’4Č:±ävq ď«ięŽef¶q ¬ÖĎrę:1µJ;˛˛^Đ­WŁđsrqČh© &@*ä%!Čh© "G \„‘,rrDŽ@éÁ{>XčŇvţćiN»ĆýĚ­q®şy8ÓR§o'WňiiĆÔc^ĄJć¶zdŞŇËZǡ=|ůř䳆Ľřd`É‹ U¦ogčłžÍŰŤxkp‰ÍšůCUn2&XäŠa"”HI2‡( äH\‚I*PJ$ą ú\„\ŽLĆČI, ’%„°.BI䀠’drHI2HI2ČOÔ‰ .~ˇ$H䢥ŽH‘ČŃ\‘2ňúŤXĚ4Y 3‘ČF’g#4’9/¨HI i#–g#cDĆ™’e&Şeň1”4ËŁub•̆¬ó#H|Šc^Bv2äÄě kČ—c>AČš­'I˙A6™´n@rm.:&îµ[8“™ł«qeÇÁ~ď/Ě•O»Żă]>¦Üqv«É8·Żźł8­-mĹUżŞ::Řrăşłiz˘Í.:pbxëuˇĎ7ÉîÂmÎěnŇMł×á”K.2ž¦b›äŇT$VlxgžFŁÂlçţEďnT˛ŹűY®jăÍŽ[‹-gĐÜ™mNoŰýľ ä–ü HÖ4śˇDŽAŠ’ey:ЏLvä÷~0rȤë§VŻ®ňänŻtţ„őşřóc»źÍh— Äăźg,‰łŻ­ÖĺkĽµŇşGÔäËÁd˛Łü| X–! ˛)¶Ld¶H¤™TŠY2…!qR)Š@r)ŠB¨RL„€ĺR) blR)ČH›&@¦É‘H›ň%±6 §"lM€‘6)~m’Ř7…6É‘916bl$MŤ˛B‰H›1`E&ÄŔD€LL b  ŘŘä1Ll`/$…V`E€††!€P @€` Ś@€`1 é‚€¤eC *F™#”™,i™@R)2$`Ze&Bcąd¦0*FDŽJ(L$ĽY-˘”ÍŻ‰dü–ŚËZҰ֦´ČíGg¤L bÇMnÍizYE6G łł–tb|p»}Âc[»^ż…żˇÍ-=wň*dµ›yGWd‹4‰Ç–ŐPőDr–ß©WËZMcý •€Ń2•Ś“+rFr9ů’3.BH.E$Čä¤$™ä€4‘ÉśŽ@ŇBHäQrL„!$HH1¤„‘!(&4’$%…ĹČĺ‘!!!$Hä ’$$ ’d$ ’$%rÉŠ‘É9eŐ9˘$r4T„“!#EČI§ ’$$ ’$$ ”D„r‘Č!(‰ aW(%!!39 Ç$HH!$HH!$ČHHů@LŽ@c’d$ ‘HärHR>D#“9c.G$r .‹‘É9ą±śŽ@ŐXrŚ“°1˛°ůň cYHËrÖ~˘äĚů…_ äbů&ČRŔŇ®l“pžŚě˘Á…­-˝YĹU?#ŁŞËYz-ʕߛ?µTŇ–ö9_g-ÚNÜSôbŢíëZj’.˝ů'e 9ô/‘ăĹsd·bĹzö+-j´9;Žß‹SÇÉž ¶y1©Ń?ŢLá˝z™i’tă;—ž¶¦;5iOÇĐŃä\¸r†őHáĎ\´·çgeáŠuL†„K˛*Ó@DŽ@ą –Ŕéëu˙ěąqăĄĂNÜ—Ť ŕɇË‹#s­ť\hs{ů¦}ËiőeÜg«Đů Ž´®:¨­·ý<ťl¶ÇšĽ|¸hęMw:úéuţć=<.¶¶K¨ă˘ź_%˝NÎü–Ż­d“Óx<üřzÔÇgKM–ÚśýśŢîVÓüV•ý×ÇîdS­k«%ş˛{˛v%łn× äŚj#ąÎŰ"›~¤¶&&Ȧނ’d*…"*E$Č› ©¤R49 &DH„1I2)ȤR)§"lR""lM“ 9ŠBá¶Kp €ź"l‰€Ű%°%°¦Ů!" ˛XH¦H)6  ¸/P @ -€”‘Il2L@€bPŔC C ¦Ŕh (!ČHä@HŔa"ŠHĘc‘ ©&G QI‘0P%&BEŤ2*@ˇ“! PH‚Jk%•xx~LÂ@čX¨’vrkuăáěqîÔ˝ s]Ex?č5zZŽŢ˝îńұľç¶[YCýIäŢŕo|´˝6üڤ‘ČŃiŹ‘śŽJcIDHä ĺęD„r9"B@ą "G \„‘#.@™ ä ‘Ęc$`9“ H䀖ČI2ČI9ä‰R9&BJb¤$™ .BIş«^ʵM·˛FŮ:ąńCµtjS_i/ŻnşÁnr˛YńV®ŻÖNŰŇŘýĽëüŮUx*L~­Dד!&˝ąYěě¸ŮĂu™‡ča$UČ!,ądŠ‘Č$ą "B@ą &B@©‘! \„‘#*BI.P¤™ ą &BAŠ I”4T°–HEHä™ cEHI24T„’ČI9©‘ „“! \„‘,9r9"BPČrD„r@ä "G \„‘#”ň\ŽLä`\„‘,$ş4“9Ťɇ"$$hą "FÉrë =Ě«hŃ©4mD?ču»¶Ź)nTĄ4Ęn&7ly–;NţľÖÉv´â–Çź“Zf¶+w’ęXěYńŢöĹo˛úN<ĺj—úÎͶŢďPźQ¦7Ë—žNu•2“ÉŮÉZ;%:&ôFX•ou[[Ť^öô=\]}G‰Y];Mm]ăA9/Źăěúϸ«ň•uŻâs\ÖÇ׾”¬ąňס×ńöá|ťL•i¤řŮůH}\U®G™ÓŰ­STŞýÖúłYěÎőyoZăY]bŤÂdjz?"ńd¬űŻ•RŚ^0ÍŤNW,ŰŻ×yÓ|ىÍ%W%ëűl׬0=|8Ţ<~Ý­ÉÁčQ·qčlđőŢL–mżËWý>ům{;YęËlôI//S^¸lÚłsŕÖę¶««pšŐś=*$žk}‘x»UÍ{ă´C•_Ş,ż™×ľÁÔ[ÚýĆ–*Ő¬[y{žvz<9|oWô ď˙ô˝,ŚďÂçËŞ˙ÄV|Ł—ť÷8[Răc^ŰÇĎ•ŻtŽgaZŠ’[&Ał*nÂäKb*E"‘LR) ‘H„bl"‘ BśŠDŘ› ©ŠDŘ ±6&ɉ± B›bd¤` Ä&ÄŘ ˛XH‚†Ä!€Md¶ $’1 °›ÄÄ M…&ŔÄŘÉ1 `ÄEcHr*Ä0"€¨0€`( E0`)4ŰŁb€ P2Ě™A°Ä1Ȥc’Sä„R~ XČ`Za"Š‘’P#`9G 0Śr *@™ ÂI’čą4XI)Ť0( C‘’R9&B@ąČI22Č#$"¤$R9Hĺ€är‰*G$J Ż«Ű}yMJ¶˙OŞ^¦žţ†ż•­–¶äźŐ˙ÁÂ]Lk—5óYŢî_Ź˘ô&H‘É@L„R9$$ ’d© $$ ’@˘ä$€,$™ *BIbä$b¤$™*G$rD±Ë*BI©‘! ĹČI2\„‘! \„“! TŽH.BI.BQ9¤rD„rL„—EČIČä‰a iČ9!( $$€–’D„°bä$™ © b”T‡"@ V‡+ršł×s#J¸RŘż/Aňnłĺw)1ÓEŻ’‡[ąRUŻ †ëöbĺ;Ť#’ĐE§]~‡¨»=šcś8]jŁŚkˇĺIéô»UĂJ«ÝÚ×i%⨳ěž_wŁŐˑҶí%\–Ň«fÉĎz»:Öhć9-©Ć±ćËßy&iGŁ~žŢř];ňş\“\}Y­`v0pÇgŹo–ę,ô_©ă6Óiî´:{]Ç—‡ézJłOFrO©›ť›ń‡($™‘§Fl­aµšŁÖ•ÓĹ˙sgť1±ŰÓP­–ĎčXÍű6íYâëńơlţÇť[Ú¶Nş4ô;qvkŘçŽËMcěsaĄa§dŐ_ăőś;ďJć­}Ĺ®ç5×R©©S騯یügđZ?ż©ĎŰTY&ŤKÝ}E°‘‹b‘H¤ËG"‘H€m‹’$`9€€r)€äMŠBF¨b’"‘äR&Ĺ!pŰ%ą¤r `ÄŮ$E"’dS"’±IT D)9„’ȢDŔÉ‘„ŘM„’äL&ŔM‰€0@  @ €PdP!b˘€A$SČ€eB 0%ÄT&ôÔőZhHŢ„•ý˘Iż°ˇµ)„ %-¤őL¨H5đ ’h¤ĆHIE ¦2™IÉÓ¤rL„A$¦9Č$!ŽI*FHH‘€DPI#ä‘”9’EĘ &F20ŽI *b¤ T„“#ZRc‘'2QC’ \„“!$EČI2 T„“!%1`L€€=H‘€ä$@HI2H#ä¤%’T°–Nˇ¨!ČRÂ@|‡$Hä ä’&B@©A+Ô™ ĄQ \! \°’$$ ’d$ ’d$ ’d$ ’erL„R9"G%1RÉą &BA‹’$rČ&@H Y2ČŇoý“J]QK—ôđ­Tµ:Ż˝aéú ŞV·:íĺ Ş-ĘÍ/B˘dr„áI2R‡$HHÔ\„“!#URLˇR4Ń’˙Aňs>†r«´ą`Z ”4Ů% ±ö3bmŇŰîž»›±lŐ˘kZů0LöĹ#%…9&@LA^É4ś'ŁBdTµä™¤Ű Š@`ÉäĹ"‘IH¤™ .‡!"‘I49 &B@r) E"‘H0ä&E!U"’dR ±H¤Č¤R €H€$A"$ŮŮ2U Á0[‘ H¤ `€HÄŔL&†!‰€‚D&Ř€Ŕ€€Ä† 2`0 ) `$"€ Ąär§¸äT ·ŕ¨‘Ą RŰ@$` ( cL0H„€HŔ@  $!€ä$€9€Ť} ~ Űđ6)ČH„€ä$($rŔ$$Pĺę,$B@$r! D9 ($($r! 9H„€ä$! „€ŤŞëŦ怔S#†á$¶–Mv~@›=bt^˘ „€HHy $r„€e ‡#L ¬˝ú›× uneĆTfÓ«×_ŞŘRů ¶l–Ŕ&~¤¶‘HRČ$R@‚@Rŕ @Ŕ‘6¤HĄ¤$""H)76)•I±„` lR*† b1Á @hL€0 ˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Snow/images/preview.png000066400000000000000000000130341361462701300254340ustar00rootroot00000000000000‰PNG  IHDRddGë€88ęÔ±=cĄcžëiçüëw­˝“€Óž{׉]ż|ëµwJ~ř[[ÂĂ´±±±ą§ěŮłcfěä"›==ŹŤŮ67?`±X¬\.ݬ¬Ś­ŚĂEą ßÍ­tţĂ5É˙Íp3>~V>ś‰˝ÍždłŕŇF0EÄlĆ 5¦¬üÔüüżą9ËŃYůif.>>÷3eXţÁžgĆQrřkňw‘Zz…83ź•>ll|tŻcĚűŕŢ xgF©yÁf('–çţ YŘ©#Ć^¦OKI”b’ŘÝâED A´˛"űČ˙°Ôý8Ć›>ăĹlc·Á#¸ÍżCŁÎ̬ŚúĆÉßĹBCa%tśŐf56(*ĘĘ5Äиˇ–˙ ±„ ›•!Ä ‹ôJŮä`2hľńą1N&ä)˙Dc†˙Á ±ÓÍś˙‹ çĂôÂĽł'PÁŠÉ ąů§·`OO0/­4ÂT b®<ć={;né ů([^Ŕż]yĺgÜ,[ł¨Ś·ČĆ ™÷Ů‚,ÍĽűÓűű™×qš…N[2űl ł2­ň4Ő0š©# dnžXö˝^26×>uŚ.-ť†0>씕f~ô~N˝ŢÓS$ÍxçäůŮ‹…‹őBŔ˙ˇăđY ‚k)™;ĺyČF9|ç=‰Í ęŠ=(89Ą~ÄńG3¦žF÷z­| ­CËŢfÚĽ?Ç–ţ,ó|÷.ŤŤň履ŘůĘPŹŤŰYÍ睤Ô4žö5Ź A‡Ë..˛íl»=˙î@V”'>;‰ťÍçžçÎ "ĎÇěy4nu1VαqOţ&žGď =ÖÝüüÍÍÖÖˇcrśůůü(k+Ď9q âsvĂ{sޱ1P•=ź™+ÇĚ„P7 ®´ół¬‰Ď ö°µłYpĘ CbBGŢ÷—mń**¶ă·|ÎçăĎgp’ŽĄ“ŹN—ôń8Óǧ’źĎ[*ćŰmd ç0mÂâÓn˙:zJEGG<żĎÍ{Îs9_nápÔń?cY_ň1;y~ţÔpz“ÁŕF¸Ó9’‚eŨ!چJ¶@F6 ôů|žŚźŢ„SáxÎÇ;˛çNgăvţřŁí©D6”ŃwďŠ?–µMLÖĂ[[ ˇC·Ľrz“ËÁ6äF'+es1ť±ŠGřÁÍčÁ>m·ĐbŰ6I1ĂÄbşîî†‰5Ř÷ĺâŹíąXÎ÷=—ÇB¬"ͧv~ô]–† Aµec „Q`ΉµxÄÎn|ücţY™÷*Ů˛ą‚ťťĤ}c^…ŠrłwÔ3%[´ëďrd° ňü˙űĘÁIŮšuVGVz۶ Z]fyÝd!´xŹě¦gÔ4Y˛7jůQssSĆ=ŕ¸9`óyłT)¤=¦üĐWTĹ…ĄÄ+ h‡HƆ÷%gćŕE%¸NŘÚ(íW‰ zşłlĐŤ –9x^ A`'U¦›MŚŐó3…ś2ŁĂ š÷fžöĆüŻŚŔ:„5ăÝ †Ě±đČőČw,б‚‹ÝĚ3]`ŞSňk{P_6Ă Ô_,÷ř$¶ “±2N×Ó/*5ËÓ‚ý5 ŠĆčÂĚńß2řxH'ÖŢ“ľ‚g2×maC Ă ň—4ĐĐŕ a~á‹ę5„ĚŃ……j…1NË„šCŮ»ałłđýĂŁá—bT!&ş˘ÓťÚĘóÉłŮĺŁ6‚Q`fĐřĐY1аđ·©ŕ-ËM‰—qaŮŔ|ś´MĆ»Ńů¬mwY„°Ŕ6ČaF ţ•ĄrŠ/GX˙­¬śś@UťŚňĆĺPpg>`€:RÁ?…˝LKôâ"­„”(Żä^r–ůâ a ¨Ű“ńgŻĂwżÓĚĺNŃ~…8bÇĹ÷yp,(i9NsÉܰę~ŔrÂŢĘI}ĘT‰pŤHA+ÚׂFщ xWľ‰ !d‡ç›św*VÖQ Y°Ů-ź¸Ú”ľŠŰÝŰH·«'2Wţ7“7%™ÓZ_…ÉŠ«E};ĄŕĆď[×Áťh<¬ëŠ )N…u-ÍG1˘ĂŔ€ŃlbýŁ´ ­IĹt!R{ó9Ůç&TńaŻŞÉ˛°˝×¨Ő8b\‡‡7ôă0™0ľÍ:'‚gJ4śSfJ ĂdPŠŮÂö6>¬[ŘŰ.H’ CzďóÇ~z‘!>D„IY–5H˝ Ë5˘ŻŹÎwNŤŕ5o8=oJ?Ý‹éâp¸, @ĐŔŐöěöZäv[¨¤+é˘$j‰+Ş®Đu­¸*€{ďCUÖꄟž¸óáČK'ął3ńfbbż“L‹vcN {müŮ5Đ …8Mkhšđa»ŠÝ‹IŹ\ëîd}»Đú˛·GţS ’iB0űÁŕ°ŕ›i‘2”× °bČ(®eŤ’Ü*ę=]Őµn¤čş÷$MŻÉ5˝°··Wź”ę­î7™#ÓĄ 6ţř㚼ŮčĂnßi)a zZĹk8Ö¨aĐ„4WKsŞš¬Ő$© H‚«°=é‘ýzĎSwďíZ-™’şžŘ ź_t‚$¨_äÄÎDP–ŠSâ2h/R1‹Xń«ŰÍ0{EIU5©¦§“şś.T«<C×2=U•k@ É×—HĘqÎâ,;Ľ/w=!ť8Ńi»™ ĂV*şÝ&c +KÎô¸@­ˇęzZpąŇ÷ž;/©wMÖuąµŰ"!rýîâ—Nđúbq‚ĽWŚÜ_*Ę›)®mS‡%§X,,Čš[âôZRVuµVhÔ*‚P©VÝ{]05ŕYŇ:lű ’@ ţ?u® ‰ź/hÁ (.ńWkp}ű¶¶fÎłÄ TÉWd¸Ý’––jĆL–Üî® Ŕ—{{îV«[čj“ąŐívIô1‰ą/ý›_ŕ‚A˛ˇ+q‹1‹Śo߆˛Ât0|PRÓeUV{˝ĘWĽGo» ®*ś*z˝ŕRëą_<®]O“ m!µuöĎ”­ •(Ż‚Y—…‚ $U]ÔdŇÓÓşř…«°şî*ôŽ>)t…–^wA¸D_‡ě”&ÄNpçúŤçŇÎztF´¸şj¦ĹŠB ÔÜR­&§5OMS[5äÄ%ÜźnˇˇëŞ€+MŐ[D|äŹôýźšÓÍbBôy’ŻmłşBB F —ÔzUś«árU IY(ş´črWő^†(°Ŕ§š?]¦`Ń˝Ś§l!f¬ŘjbĺŁ`#$hľ‚Ô€yÂŐ4˝ˇU ˇŇUNÍ˙n·Ą7Ô]·˙ÍúŐńá[h¤RĘ%ŰňłÉ8;He !BŔ[ÉŠPŻ@ś„†*÷ü˝LOřR ŻÚÝ•®F~ü8BxŘ2Â{I4$)t7˶â7ĆřF‘×:(ŔÄŔ‹V­Ň­ ]mč™§÷ű™Lż!tĄ®đéSájdd‚„ĂąÇ÷««ŕI¤RĚŹÉřýf‹2†!̵×ҨČ$ Í%ôúO‹Ó*0î———»ęŹ###?':|żMéşSŽâ`˙`lC‡lé5BŻu٤U0vUżżWYÔ~J«ßę ËËź„Bfäă„+*>‹€n^—<ýPćúXýĆ4VfŇ4Ř)g)Á& ”mć`¦ß÷÷µîr"ŃýÔŐýőJcy8şöÉ]ý‘9|o 'ݦ÷§›q˝TĘDqö~-Â<]¬`¤‚™Ľ‚‘®ŃŇjý^ @ZĄŻşBÂźč'ŇUG® źţÇJpĎ2$PâŚ§Ż®vV1TE ¬†  éŇ+™ŘÁ‚fh¸*•j˝â’[uW Óďůˇ/~?1 )ů´ţăČçzĎOCL…ů„~™JNß;ŐéŇ~ k+#«ˇ¤@b‡J˘ˇrqˇZŻ&wĚ…@@B¶Ń’Ĺ!" Ç ¬ CKď'j55„ľm2éO¸\Ťe>~NŔ^X9Ţ€Eľ$sžéiNY4JtŠ0E0Č ° TfĹĄą’ ?¨Č` ZÝeH=B\úD˙ăúŻO„çSÇ!®´!{JÓdŁÖńěwŚa "Y‚Řo]J€sµZÝÔ4µ¦Ş-żžđëŐĺędnÔż,×G>Âoq6ŁžéŐKggź”2ţý+âIšB¶+HCżP[ŞĄîŇÔžŢďAđTż« Ą•đďË€w}q>~ţ¤ű"6ťÍë¦ó}iĂăą7jWĄľ ţ›Ň0Ă–Ŕt25đÄŐ/®´ćסf3™ĺOŐĚçĎ}U•¸Ú=˝ŹřxÎh:ă׏܉†Ăö.Á~Wü" bŔ¨R«W+­~`ů‹î9ˉϟ{ |íŇľl>¨üHڏS|Q¸ŤéŇŞňmzŁičęŞíŹ4@ŇĚ=¦›é°ŕĚËËUß…PűU‡&ŮW77]®őŔúććĂCŕ#qúR—/NEΔ8%=MüÓÉbÓb¤)AôĎĽ/1ęuL1r&ű=Ä´jźU—gҵľ^_F]«'FHŠřGňl—¦÷wôth@!ČHŰU+XB`Öë.Dą\››•L_ßĎhęnőÁőŘÝ ě®Ăyw7Cđ%¦»!r\2Ń™–Í„ÄDTŕ@˙ié;Ú:lë(¤TţDer®@ő?ą  CË­q\”5Ş*\şRˇWĆ ¦ër“‡+P@¬Ŕ1`Ö'w6»F»zEčţ‡mßi¦mă8.ÍU8|ýhpÉ+ ÂđřuÓô§¤` đśD!đCŘîÝ|ťjZ‰ŕ„ă:ŚUX˝aŻ[©Ëßd¸Đ ~]i†Ź‡MdĐ(­Ăy—aŐA÷ëV2Le$9ą×ÓӲǣ×ę   Â)őőú0Lżý†(üer’ ×?:¤^Đj:,Ý•¤ęéyW6Ę 2 RÂŚ¦b÷7°ÉIČ9Ćl’ŕ:hŞ`Î4D4’đĺŃ9Í#'r«‚áů cŚęë4T =«mč€ń ˙ײGV=INKČś‹Q\CÁÚ´XĚ `ygŞŞu€!FŁ5ˇ%9®Á’¤ë Ú,ÝČ „Mdvup;ieLŞÄ8n6Óé2’Ě˝)€hĽ3éj/›ŞD˘§j,DŘT @kh¬!ŕńuř·«ŞUígÄ˙`ŤR¨ăáĄIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Snow/styles.less000066400000000000000000000033271361462701300242170ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #48525C; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #fff; @loading-text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); // LOGIN @login-color: #eee; @login-background-color: #2b333d; @login-rgba-background-color: rgba(0,0,0,0.6); @login-box-shadow: 0px 2px 10px rgba(0,0,0,0.5); @login-border: none; @login-border-radius: 7px; @powered-color: #fff; @languages-color: #fff; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #48525C; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #fff; @folders-disabled-color: #aaa; @folders-selected-color: #fff; @folders-selected-background-color: #2b333d; @folders-selected-rgba-background-color: rgba(0,0,0,0.5); @folders-focused-color: #fff; @folders-focused-background-color: #2b333d; @folders-focused-rgba-background-color: rgba(0,0,0,0.7); @folders-hover-color: #fff; @folders-hover-background-color: #2b333d; @folders-hover-rgba-background-color: rgba(0,0,0,0.5); @folders-drop-color: #fff; @folders-drop-background-color: #2b333d; @folders-drop-rgba-background-color: rgba(0,0,0,0.5); // SETTINGS @settings-menu-color: #fff; @settings-menu-disabled-color: #aaa; @settings-menu-selected-color: #fff; @settings-menu-selected-background-color: #2b333d; @settings-menu-selected-rgba-background-color: rgba(0,0,0,0.5); @settings-menu-hover-color: #fff; @settings-menu-hover-background-color: #2b333d; @settings-menu-hover-rgba-background-color: rgba(0,0,0,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Squares/000077500000000000000000000000001361462701300224745ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Squares/images/000077500000000000000000000000001361462701300237415ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Squares/images/background.jpg000066400000000000000000001011031361462701300265560ustar00rootroot00000000000000˙Ř˙áExifII*˙ěDucky<˙á+http://ns.adobe.com/xap/1.0/ ˙îAdobedŔ˙Ű„       ˙ŔRR˙Äz!1AQa"q2‘ˇ±BÁR#b3đŃáńr‚C’˘˛Scâ$4˙Ú ?ýIކĺ&\ŕĘç‚DĐQĎš;@\ ł0E+‹ #Vľ" ÚŢh‘rJ éÄńâăŔŮʆÎEF‡|j€#vdŤď€“4‹T2 Ý"+› Âv|enĘ ZdK¸ëŞ €&1Ăş XzPaţ&Č";vOš sś ™˙läi朡"ĎŹ1ú ®1 oÄ‹ ŞfÓ˘ b*×8AŇŹéţh9ŠS9>!H—©bů9“ DVÔA2$: Ě*t˛°¬č,ą ĹÂđlrć#Ţ™¸-ôAťťŃ ŔÖě0ÜKŐ€A‹ČÚ…4cWA˘"hÖ˛`‚+Tg·( ćÁC,(ŰÚĂĚ  ËŘÝŁ’nDš ŁJ“M˛ťtA?ń ‚9â …ěIă€Ĺş Űbďb‚Ŕ´őA˘ ­®€8ĄńŞc‡Ť†©ĘCŠâ.|J ŕŚaůdEČzżD’u.I&˙$ůślŔްA˘ŕnžÉjĽŁBÂ訹ĘSĂ2hĚ˙čbdĚ€w`ę‚Ă›PŚ ®âě ąş‘ö`__Ş ýSŐ¬B‰}P†×#¶Y˛ zżž¨3ŰD0 ¶Pf;EPlX  ‡ôč±Ńr‚€ş ,HcgŞ(2PDX^ĺ‘&T˛ 㣀TADŠŐŽB Ě.Ď悢I€-âTPy K3˝˙D ™±@R ‘đ@L° Ő‘F˛ ćŕř” ŽB:D mú $ŤÂ|ů¦ně˙ňĄ|J óf°A‚*P`ą°@Ć/8–Ő ©˝NąŔ¨ ĽEÝÝÚ­S„ŵ  hç8A€é$X8ʍ kô@ĹĘ2»’;śĘH۸j™‘¨{YXuÔŮ ¸˛ µŤ< jjPr`ĎRctžśÖžH;»N·A…€ÁĹŚĐ-g§ŠÎ ° µĘ-~H=;ř¤ć2ÜB—U¨P•ă0‰Ý"Í=^č Ž\ ů Â3sŰäč4!ČŇ"j8AG‹šŰoÔUxy,cAÔ ¨8ŁŇqwó=;ŕYîPiJ..F5A„ŁűęmDž=ĎşžLH”!YaŻĹň5©ä‚ŚfE"íbč ‹á"MQMPŹ Ĺíd 7EŁ®Pb$1ŕc¸ ä ăCi Đáß©m$ÄĂlK“`‚b%ąšFł㌚QDc2j<3‚)„F îI¦.ü&|BĹČńĘÝă ô7ˇAchő@n‹4M4AĄ´Ć@wÔ˛ Dâ=?4D„[mú ÂPâÜ–ÍŢŠ;µě‚Źä~1îŰúJ ?#€źîxv”Ţ2™äŚž±kµ%Đ ßvnPb9¬oÔ L'ŕÝ‘-ňb=EŢčcą·x–AŚřŤL©ŕPiňB[X˝ÝÖWA;Ŕj¶…™EŻć€Ś¸čň¶<śQşÖˇAĐńňkŁ„ł–ű^^!"a Ň Üř ‘ËĹŻ­"poSÓTČDĚLdâ.ôftŔpl,€iF†ÄLŤŔ>ďO•Đondúh-Tä¬+’á?k•˝Aę Ç“ö[¨@žě'(´ąpnj–'Č ÜmSdw ŹWč‚FíŐ ˛dµÍű~a8ł>EĐ;câ hEi‚‚€"5Ş NÓ{áĆ IíF/s‚Ő!ŘŞ ›ď | ĺ˛4]*ŔáÚĂ, €\Uą˙ÉO4 0!ĘŁąÉ@Díqd €™î,é/Ń<ô: ňqí1DÎŢZ čŐ§ÁwĘ !ŠU$I­˛€‡ŁôA3—q6k ’ME‰ÂÖ$L îD_sßYóýH4 ÚŚ´˛NŔa.{đ=»AÚŰFP ٲ ă=‘#Ş ‰$‡h$»ţ;E–,@31żÍ>c/l—¦>($5)S„rmt‚o4 ˝ Ô6('-“r<ŞÇÍÉ„Nz¦{Čƨ±Ĺ0O,€ŕäz?Ĺ şĐ› ĹĹ…pAŞöAZ’\âáŹD:=PPH˛0•l>H9n.‚‰‰>» ^¨)«_4ŘßT\†ř «’ŐµIA]Č8@ji” E]Ţč3ą ˘ 1čí”=Z2 㛉>»1(7AÎQ1%ĽĘŽŕľPÂÇ’ w;  @ŽáT}7@nzAú Ň&íQ”Ëe›ŞXb4 wRŁ0çCŞ$1v Ę 4lh-8¸sT`îÖ@IĹOű éCä ]Á@;{ ‰Dű’ެ˙++Ů!I†d‹ T (NP1íŁGTRäSŞ #ČAßĂýTAĆT¨4A‰Ą+‚áý¸‘A^ąALň-D ăJ eĚŠĆĺI|e3ŘdKŤsvěMĐ`I t I€ĆPjĂŐ%ń@=Zú \UŮś¶.Öcü†”(ßQˇĘĺ/Á3Š7Z óČ‚K\ĺKç: ¨äX c€Ńk ¸´AÔq´XKÍ®l/ęo$ăűDĽ™3$Ľ­„g'4đA2ž&›­-˘pI÷+ŽÔ ᛓŐzh€źŽŢ÷%đ€0;˝_$ŰoŃ{@#6wŁYo`_É/ÇŢ O+i-®Ź;÷{lOŰą—4OŰăTÉĘOřöm%Şďbč$ľ J ]Ă]Ô(PiYźÉň-“”]Ĺ®g ]PĚH;(,KŃąÉ:ťµń(SµĽĐs儌h]Ë 6Ć4¢ig@ď墶źT9ą ˝|cÉČ™ŢÔ@™Ę4{~¨e,ř ŽS?jl\Ó¦Pq2• 4?$îBäĘ÷ APäĺţF• 9`‚ĚůC÷x† rs“I3tA2ĺä«Í¸`÷ąY÷¶´"SćŰIłe†Pzĺë‘oš   &˘EŢńA; ÄŢĹĐ ísâI˘c( ¦O».Ţ( ó,wZÔ@ĘSw{\ ¨8€jĘYđA†4ŔATÜĂ(9Eď‚n.ďL—$j LZČsśZt A‡'8`gM %ĎČhgL7»És;X°@{śî@ťt`¤'Ë´1~´A·Ě¸4ůywFU‡‡ńŔ¤[Z”ý~m—¸rśřxöJ[+F©AăăwjdŐxˇ"Űh: Ó‹ kŐęĺx˝©Őűhězś·«ô@5Nęt äĺ4ÝňËĚkąÁµ îs;śd°(™ŮÜay&OŞÖ˘ 3»nă¸l2¨ÇЬ+B€Ů-P[Í…jP!çŃXAŚo–ýPk >h¶Ä3ĺT- ŃĐšSô@0j]ô&Čä]€şpÚŕałĘżěqËůŕtzř„Ŕ%øΗ#śíäw2&¤ź$ÔĐ;AÚO¶ţP˘†Č,E‰{}Pcs“‚‚yOńL^ÔóAĎ =EĐ  čă=ÓČ,‚÷ä s[d Ć1$‘d…XüPL«»É¶_Ü4fëŃĐ%µ łŚXɞκt(ţŮî‚LpĚP00'ۉµú ¨“RKȰëŞdnjT]ôĐ` $0M®Ćbsĺ–~‹ç(0bçŕthÄ’Îô@šDjPLśđAé‘;ÉzŃpEÝĚĆZÔú ća‡ýh»şäŹlődŕPwęDz~ďŃjm” ę‚×:h%Ż„j: ˛K3Ń$˝{GĹňk‡b< >Ű*>%${e¸Vľ(!Ŕ ô?˘ u@F¤Óqř  $ŮHľĄĘä3?šL2€ŽÇčpfqOšH;EÁŹ4©«$Xâă(KĐÔYr¸0ĄÝ-ŃžHŰ{EJ‚† ą`Ô/D ˇ řj±AßÚ™µ«ĄPs1"Ś4ř ¨vt žĎt‡,r‚fb'´ů„ş",O‚S&ş2 ďŻĹ´ŢÎFKŰ‘d‚Fâ(hrG)cÝč€{=uÂDT7šĽm˛/j˛ KüJ,BťP@Śb<iEĂ ¶/@2€ ŹVĂĎ3-Än˛ .Č$±keHV&ĹĐ2'ĹËb2,ĐAÔ šî¦niŸäővŻšO_”©“d6ÝďtH%±žjpâř(Â;…fx°°Î¨ęç( g,B P'Ô‚Ú¦”A°vá2Â&â¨%ăQ””›Ś ť˛Ń˛Dą|ßɸí.Pô•šŚ‚^›‰~¨(›ćč'”K·ö‡@Çu Đ .( °hp<ŞXź’[mČA"Szš Änôăćă›rÇJÓÉ@vA¨/o˘ ĺ”»$ ťŽ,€Ý'rD-§’T»?Á"Ŕ8ra ŚŚ EÂÄKżTr ÍŰDł0$`ä vÂŕ>ˇˇjĺnGă@;^žh:<ŚÝ؄ܙ!Ť*‚ŞŤMv“`€ÚÚ¸A€Ą°č(lµµ@˘ K‡Ó(./´Jä hXă(¶•©Ę-@>H1ڵę€i¦gíoš $Őrä˝p"D…4Ę Ň‘/B‚@x˝i ˇó˘TÁĹÄřŚ žBL$Y…5XŠ ÄT56ţ¨0ő;¸Ę IÓD Ąs@}ç: “"±ÂŚE\}PyöĽ†AĄ—ŔŞ á sÁęC·ÁxŠ µ$?ÝňA#ş–%<¤ŕ &ÂřŃST šD‘ţ¨1pTę‚fHŚŹ…@%ŻT˙@rČ8‰µPNkđA™Ë ¨˛&÷| ĎHô €s)0¶PQ`kBP&łfńA€¤·RĚ‹žŇ|S4^Ú ĺË#ďČšł}@kŠg¶OGjjÔH¨A#hřÜ‚öŻš.č» bT—gA|L7’4Ş  ű~hjÖĐ ÝČ93š&áčáÚ@AŞ ÷X ®1.â K ¦$u łśáH‡|ş •zŤ0-6wĐ ó@´AÇщ'„&[ĂŠ„wA@µď”ů7 ±ńd pYĐH$ ŔđACh4©@PŘ ë ?D»-d <â|hxÔ\ś ¸ą:”ů#ýĽ]ÄéR,HßQdĆăŽ.u@ĆÔ4(CmJAâAŐÚeRá›űs«€ßT™ŞŐAš.×(:~8íä _m\K›Ô Fż»:2. qdD\jÝŐ=Ô`*P$U…ô@TiŞ ©}(5@1{Y› K }żŞ MŽEĐ ĎÁ‡Ás” 8éŞ H!™Ů–čśŐ×PhČ€IÂ,w RČ-ÁµĐ PDÉ÷$ôfú ’MÇ™A3.zäéY™ YĆ,_ę–˛Î.*Ôlč€ 1¦PKUŻ˘ [T6ă°‚÷b‚C|B¸")°,ŽăŠ ŐÚNPU(PKCt ±q@íđAĐvŠ–%hš2HŇ;h ś–H4MI%ɸAP ÄDŃĎ\ pů( †ŞÁĹNwwĹév5@“”š;…: 5P%ô˘ 1y„vďdÉÚ1˘Lë#!„ˇgŞ ćÚx&Ć”®•AČĘ´ÍŠ¸6˝‚VňAž ř Ä/ŕź ď5¨A˝-ťUÜZěąmÔ7Av—4ŃŚşłkpcżč‚řůN{Pufa´€âš áČ[ź”Xvýh¸.MrŰ´ä”ÍCéA©L  ‹„Ó˝ž9@ńSq5¨¤Ť+d Á Ő-Ä›HgşrÝ2€ÝV°ŃrHÚk€HĽ T › †&´(+ńČáv˛„TŇĆFú ë¸ ňą%p€|é„í>H­M4@8jÔś ăĘí¨« ҨĚFI ­h¶!őAGqŤ*1yŐDFLĺú Ŕ±.iőA˘”_Ş h‘஀•ŘŠanľ(=| ӓز f" 9Aą1v©A蔓Fč$‹d›ű3ňŠÉĘŁË(45ŃĎFŞ€Ŕ ĺ?[·h@ŮA1ÜjtAŢDÔ[R-â×A góŐ÷VŮ(0Üáđ§'ÝĄ;j “Ř1ŐC‚××TysMş?Ář ş v‹„@‘‘`lŐA»?D {‚Ă(;Ş;p‚ Ýôk9ABMjÄ A 1Ő*˨A¶4ŻtŔt  JÝ–r[ŞDl”‡DÚ[ď\ Ah˝Úč/„S“Ş“.Ăâä°Ęűú ńäő@ ÇD'¤€{µ@ Ŕ’O› ňî÷@J;źxp,mtČ‚NĘf¨ °,Ń®ŮĆ&üĘ ł…ÉŰŕ\ Ç‹‡ľ\ żkđ`-R{( mśKkń©"ˇĄ8ŐąĘ đA Ňí˘ ‰ÜK8T K†h6ç, ~:‘Fp‚@87A3pČdł|PC=3Ş ÄŐîö @·š ř ––´Ę“‚ţH*Ĺf°@n‹nj D«Rč‹€öů   ‘}J é$—ٲ€ťFPqz9(;B<0awŻš sĎŞÂt y 6Č„i»x %c*VîÚY,= Đpq‚U"e±ŐŤ í!Š $›[ 3w|Pt06É@’vżú ‰ ŃĐh€rŔcD‹T–ŞrŻŃ$fŘ(3Äއ(+Śbx ŰP ^@Ö’×T…ł‚‚¸€—,iZżÁM4@— Z×<ß›2㹡ßú ŕfăÇôA‡%+&>:ńmPÔ»üPX¦ČUÚĹYʼnĄ2‚Zĺ›D K©@Äŕѱ`‚?!ŰŚXĚťňŔX  "Fęb8żîůéVDFÁ,žíĄ±p‚XľĄÜî*Pµ@™Pő°Aś‘” űł NEß4µ|sp÷1smihŇżę‚ C6pk®  <LJ’ . éôA€.CP ĎÜZĺî-ĐaÁaţ:9ú ›ĺΨ4ËÄÖ…-¶j x Ŕ°ę!Ďq˛ný Đ4š`‚vŞ D@l‹ vŇ·Â ”c"Éq^¨1 |P#sčcR2—0ă>Ů8ÝŞ˝*nPm‘ 7Ń~*~?Ňî<Đ[Éëcr@ÎîĚÂEÜâ€ĺ!Đs|Ś ŔR.‚ŁMÁdľN63Ý˝(9rűó74§’lvłZčĆ-J´śNĄĆ¨4ÝL\ x<ăZ×ÉQ´Afý¸(#‘˙Ž·z2„¤MMr€y \ ˛NČ˝oT¤(÷@îz‹Ś ç±űl0 j ”Ç ť±Ń´Äit?B>áŹJ č&v;» –×%{źŐňA1ÜA("KLJ ™XÜj(Č C°5ăSćČ ;—AÖ˝¸zýPaáD‘`Đrí(,Ô¶™A WDň»ŃKŠ@w‚ŞCä X¶Ě€bOm‚ B<D ‘bâ+´n0‚K±±ş3ŹÚ~h0Ĺß®6ÝüĐj˙d˝…[(zŰ!Ę’sti6Ę -€PWDâĎąĽim®9r“üb÷˘ ÚĹÉ˝Đj16?DřźŮ×ę$˝0M,Dlŕ>¨€\ŐČKi{e%Pkú…0Ú ŮQĄ¬YÎPsĺ?Ë jÍôA1ÚE«”ڶíÉ^ăkaŕw$üŃ­ŢžA¨˙dö±AÇžĐ&®č"†ţh0Č6Ap}€µđQ” ô»?T\ Nâi› $ŐA‰Ú*› ÁA׋iß'Ą$é› \&ů@ĽFčL‚o‚[w;Ó(11î-FA¨c„šjPĺ´@“Üv ÎÔ&AQśv€Kj°Ţč6č&TĹH1"‡Í&&V耗wh/9Z>PH‡,źµÎŽW·3Ú#ăT c HŻŰ[ębKÝníĂTg$č‚c(3’äa•ęjP#—„íőÁ@Ž^*Čă%Š|6ísŕ‚äÍŃ)@Č9 A§ÍłÉžÔA2äâ 7ąđ(ËÄAďíđ(sŠMÝćĹN&őłô(&\śF$î"®řySÁ÷bH"W˝—îů Űű`˛H=Ş‚d%ɰqÇs>úł=®‚G<;ő0áç }şćˇń8ÂE§xčĺî‚ĚřŞ™ P÷'ą†K\†kÚŽ{r°‚Pĺ”Z1rl źkťńÓ#p@ű<ńŹŁÄ¸AŁńÄďŽÉM]ÚöAEód‹¸AÎpä”ĺ8‡bŕ 7ěń2áć"±ˇęY„ÇÚŕĺĐ‹‘ý48pŚeîFr¤bî|B˘\d~µ@DTŐň‚9÷Čqí­ß!ćµaĽ¶¨*>ś„pjŹ‚§@ăG°A¦u Ő@!ťĘ¶®XŹ’ áś"$$XÓoę‚ýŢ_{‘Đ / CüŠ ÷xČ çaky ŇڱTě\Üá<’îó» M`ÖčŕpÚM0öŠQ ‡"č|ą(%™Ą­Â ]®Bąbn ·ÁfŁáţ].ÄZ¬čnŰ·Í‹Z§( ‚M ÜlhDŕ ů Ö˘ú Ă»v”A¨@%GR=(–áőAÎAŚkDŚ2h 5k ¨9Š bä %Ehw$9݉ŃÂ×@€ |nPH"şh5 -ô@Ŕ‚%ş¬Î‚®ĺLI}sä?É1{}L_ŕ‚dZ$ŠôAé”d%§TŔQŢ,ÖA‹5?Ý39nÝPG4DvŚ˘ ±Ű#CTÝY’ĺńAľŇlč_(0,,ěĄuAśŇ`ř žFx˝ęöęČ%šŚč(µôAŽÝ·Ş "ÁXź$-ŕ4@MöąARj˝@eL Ě2m4« ^.ć­ržŘţď’Íş.삦řĹĐ` ?A&őî{ YÍ5@P 7š »MJŚ ©łŹŠ L‰ŰńA&‘b]7¨cń@Ŕ1‘”ŢâčA-®awe$ ŰŠEĐbćLG’ł¸,uAFh­c gä+×TÍŕ‚ ¸wäöL]ąH\±¨@‘ÝLÝňZµ×;ʤŕ *98A2Çôh7i"79AĄ ™˝]P0@;řd évÇZŃ^’4d©­đ”‰!‚ ­I7 „śč‚n?§=`O€ŃN ˛Śü¨‚Çwęc:ĐżT(÷–¨A7^(úN[*ÎmŐH 0wÄęôAĐ8‹ů Ěžh$ö€É'uˇA‰.Wž ?‚ H#Ş Ó(<1}€‚ÄCT0@嚇("MŤg ń(4;Cż’Fď”Ă%GnŃ”¦ŹT#Č}[A“Ł %č ĐŚ : Ř nć¶PtáyZýľH:Döš°:»áržůwgA4"ÔA¨bŮÉAĐDň@چ@JCl‰˝LIwѨ4˘Ň ’ߪÚŁ(%Đu‹—νPi (ȸ¸@Kśi޶Ő0ŐÁĘ H7¦¨ =2×ÉvŁ?DĹţ%i (F¤i˘ 2v—( H9z Ą×(&qm5A‘f6178Aq¤¬P5 *Pr۲1 ŐAD¸qq”˘ €!ÇĹ$°&˝_ßä~”AÖ$ąa\  šĆş ‰ľůôdâ~&ĄČ 5AŇ ťČ1ڱc„8śFŽ‚‰$6P%„Ž”t›p ć€y=Ľ`Ä ×*/ *Č5#(z€6Aăă Ć,jŰr ąÂ‰=.VĐ]ôśY;EEŤĐj€™S`pĹĹÁ˘±­ôę‚äŔŮĐľĐiÚI,č&D€ŔĐŮbűW #ČôŐ˝B x»» ĺ3ü„[č;0"Č4ŁJ(,ł»Ý&"’€—tN¨1Ü<PZ—8&q¨‘Â2x‡>( 0A.tAÖä5¨Ö»>i´a#ŐAĚJlŰ©Š ä?sźirMŔÝ~ üĆó~Śa.`[{ő`‚á)Dš’îlč(I €%čîč:o ;&DĐ×Tů96Hf«‡/5+l°AŹ/;°•ňÁÇ/svîăن{ ­Ľr ×A¶@14%b@ gů ÓaőA #şîýs:;_Ł ŰbE+Ń8+Ú¨$ŔX]qL xž#BΦůn'}4dům`\|bww‘ş "Îč14cđAÖqă2,-„16×ęč KmÍŮĐE±›m·MPČUrY⠓₉‘’ýPDůąÄä#6f‹Ş<ż’j9˙Pň$?ňÔ˙HAŇ\\0"4ŃĘ Đs ,‚ xĹZŁ5@îH˝$1śXř K\ Ć"×twj Ă(@Am!8ŔRŔ Ň„KƧ‚[ŤÉf'(+dhÇÄ: y@hí2ő »Zč1ćĺb7Pt6ţfîÝS™±Ýú @†ş‰Mr€÷ą‰ő×V7˝ĚkľŁ WąŹ$a)vÝAZ8@‡”| Ľ]ô(9ĚĘiw@ÉŻŤRß´ Źw—÷ü‚EvÖ€ Ńą-]G ŽeݙϚ a@‚ű ‰ÚYîﮨ҉ÂÜG˛ů Î+OÚI\Şâç4™śXÝňHž)–Óę›âÄX ĆF¦Č/‹·Ü"µĐt;‹ j€.táPü)Ô ä‚l4@€DPaHl˙Ś Öą°A2%…J ¤ŮjC ŁP±@H8A«´Śä YâAŃĂÓ8Ő%› $A‰a]č× ÍAţČŰ”ˇđ@>Ů18ňä–´Ż’F§/d ĎťpĽ$Ś HŁ ś &x¤OŞŁí˙#Ať¨:D0“Üł”bÎH}"RJńČ@šĘ˘ůŐ†ń@Hv¸Â„÷TP \»3 ,Ď}PAŠ ‰®0r˘.5dÜŔÜ Ă;E(;‹‚R0bš ĂŐv@“QôA¤ĚŔ˛ŚvK×ÉQŰć‰řd žq8Üj‚79vs„b©Ş ÝPv– AÜ÷–B™ˇĹ#áO4c>2YţE¡ü2ŹkVAĐ$Äą0¤cD¸vžµAvň(11?4€f4k LŁŚü`biqŞ &RJ}Pqî._ŞĘ.A¨AÓńŘ{…ěΡÜ5P,Hvc’‚şž]j‰RĹ/–čę"PkżF@JPd’ă'©ó@ Ô±®/‹bý;˘ĺŞř@’ MuAQ$Ć•@1bsš ÄŐÉ Ę’Śűłd##.š ‰@ě% ­čÖ(4¬ €ş•0Ç(śXÜ ’ŔWTygĆ9yľÖĄrOąĆďsĄPc8—, ÂLw˘ÄUô&R.ÂŹ”îD´AdtWÉA|UoG@–aK #k ÇÓś 9ô› ĆQÝŁ”d& ü&j?Ő1-´ m˛b4˛h¸˛w‰ÍPsT‹„ 1g}iJ&M÷ ąa„H>Đ_D¤il„îEîqňGÜ«$w€@j ťńżÜ‚ygăŔ;ťM\ľ/4üZýPwíĐę€Úőš ®9mĺôAŘJ®PgíÝ~9~D§ü`Ôw7TâdC}Ą GÉ81‰=Pj$64ČS˘Ćf®)˘ 7kDÉ"!"ú ——ÚX Ţäśjn‚f%3ÝP ݸ]ĂnŘÄT@ľ‚˛ýb;JRÜš @“­Â ”§¶Q%™¨‚c)nwş Lµ ÇŠ 9Rą@ ’P'©AĘmľrÉj ‘b/t Ô Ű٤€ăŘóAŇ1ď‹ Pt,'($‹—sŞ ĺ‰h¸{ů “ᯢ Ͷ¬jżĚx8ĂíŘ_(,I¨Kś }Én mPqîaĎ—šq`\  kJĐ:äş”ÂNW%őAäktäCQš„¸&ëŔŕ;|Pt&Lď{ a2&˛Ęchv߯T n§Ĺ!ˇAB.YĐb-ňa'/ąľHŰ™ŮDź"‚á#J ˛eA‚€lŔ¸đd¸í–(6éă((ĘFMpPČÔРרϊ ™b'W("€ôÂH‚tAÍ˙§ć‚ăPíT"Tř xÉßő©Ü+”@Pßúޤ:LI-đ@ľă[ ®1Ú>Ý2É24tę$Ç9A!˦PO);I·[ –¶áwčM‚lăqňA$ćČ6@šČ+ޱ®,peP΀•#Píĺtqw8@j@D'“FA„=]@¶P˛/”pj|mÍ*„(ż$€°o˘124f"Ž%ďd7 ¨ľđőd#‡mPbŃÍEĐ‘`Zš ›Ń©”ÉÚ×Aß„b=|J 8č3D±Â‰ S”™‚‹ĺZ Ö ›Í_l›—ů äF>H,cq„8Ąüy˝|ĐXˇ!Ř”‹Ćߪ'hލ‹»\ h$4Á@ň`,·‚ ’#a”ŁÉÜ (:ń‰Ć´Ş{čűŤ‚ŚNĐ.ŘA‹u@ŢA¨ůA@±5vADVL|säÜD‚¨ţ “Iv ‡‡íů ębĚMuA7Ô c 9#,Uľ:é„KkŐs‘(ń±qWA,Ô®¨$cóAĐŤÝ_Şk;„ÉË}¨:K›ń˙}ú9`á¦Í–ARĺă<~®ăje'wŤ"P7•ş ‚Ňô×o“:âžnłDÍ]2Łë„¨ý,Pu2ăÜÄŐ‹ĐľT)DĆQ‰rY]ąs‡ąAŤílnŚ@yR^šitL6ÖN4d5ˇA2ČĘń9ł 6Ëö4kexů„0˝ę1ăĺ ŘÇ4aÉ †Ń’ŕ ZD^¨6Ös‘tâfÍÜŢL‚vLT‹ ŔLU›@č:pdž1™iEéâPX{ÓTKŤĂÉŔčP9‘®jцi´AĎŽĘÖ¬‚wŔŘŐń WĐvâźüxDš‡ĄuAc“ŤKÉŠ n/şvčPq‡>Óq´˛ aÇů˙[  =ľP70ŤËŚ X€I Aś˝j>0ŚËî˛ rý¬t{ ‘¶‚őAqŚMĂżDSă™6´(.2)m*‚H 3Űr^D µEJ yxŮŢ÷şrqîĄüĐO$řÁ‡~¸(&|Ľ VwčP›„–˝čPO˝řß»äPv¦Ćd’*€ăÎ$ÚŻŃśp/„kń@Ohlč!ĆŰ0(mn5A„©×ĹĂęmp57($ČS!äąAډć€wzŃw=O@q·sUŮ‚ .M rěOi@µĆ1ˇA¤.E: j$Ăŕ!Ŕ˛žŢéfb,;D["tÚ@qZ §@w&¨*„łÔeµÚÚ Ĺŕ \ ęMźÍĹPIv ß%9j” \“‹  ;3`^÷űżDäE..n0ŔVř@—=Ĺ?Oh¦¨:’\|Đ-RM‹2™ţ9–­6üPr,ěôŐ]é{ ç9(×TpřÂиó*˛'Ĺ&=ŐąA¦^5;ČË{¨ń@M¶Ë«|CÁŹ“Ç©Ę ŚeÝ­QÄş NI#q6 ĚĎ021$ź4Hą{ '#íőA-ąČ,rdy ŽpŚÇ«ÉËW=P,ÎŐ9AçAî©qŕ‚ă°W@A÷FO« §242amŁÔ‚yD PL_ü‚ 0Iđ€„ˇfAš®,,€‰n7 6őÄm&ú ˝]Đb0|ĐPŁpYĐ6˝Iş ĄĘÄ3 eÖ#THo˘ ‰×(7¨>MĐi”ńA»ś°v@7k ĺňĹĺ: –jEE)‹y  ÄÝ÷ uş häÜgT—訠,0‚$\¨“¸>h@(Ç4žAȵ‚nňä˛q°Ph P˛’;¶Pt•Ĺ)Ş gkä &ŽEšĎńAČ–jSV2‚yN:—b€čŮľ(/ŚöEú°ŃA­ÂLÄśţ;ýĜ۪ 26ĐnSŘFB`€Íd¶ýP\_¸@ÎP;¨ú Ńí,m„nBN1ä€Ţ.ŐĘ Đŕ Ć4ŘßÉśš¬‚Apçâ€G>h'š%řÉ­Đrf €ŻĄß˘~áýż4˝ŇpplŢŔnŤqTÜŰÉAQo‚ ŔÚĎŐűŤMż4cîÜí1¶]Đă“zĽ(+/&@µâ;Ś~ë;ô@ąÜŕŞ?¶ž(1.žBč3Ľ]1c=˛¦ď»F肇łód¶¤›ÉĘF ÷oň˛Ý‘>Šf¨6ó´v[Ş ă‹ń‰Yî<T-Ô ’*#˘ Bâ˙$3Źęwň@MöË,ĎŐB~Ę:ÜŰÜcâÎ[¶Çk3ĺh\ ‹ ĂhÜ ¨‚  â •Úߪ ŰAÝSŃž1!Y3Ţ–@ĘU`^í†×AÍťš‡äUŠś ű1ęíń@¶ŇD¬D÷(5˙dhÇ'D¶Ž21ŻšrNŰĄJŐ5Ú¸» #¶,r ÄVÚ ¨6Č»ôAa¶¶>¨1&ĚĚ‚`Ć%í’€ŁR…ÁŮŞ~Ô Frl€1,ú ¸ÓČ,‚śnÔč€ŇMę‚LAś˘ĚÍT‡wA«Gő áĆ >kŃD™MľH*„ŐĘwu9@nÓ@±Đh€&,2Č:q‚" ş¦DŹ4î ťPDcGΨ3ięRÂ.öżč?k€HµÚ+m@8A‹X ”&Ź!É˙D»kst[úu–ë ¶PŘsŕ‚d„žŚŐŃ—,ÁťŤ÷ }O3ŹTzYěgŮAĎő|uÜY¶ů: Ú2Ä  ‚lP%˙ů[É;Ň –ů ł Ĺh± Đ|ť9îĚŔéôA;XÔP I1˛ CKsťJ Ź®¨*č-ś€Ča‰͸űcGtÍ(rÔnÖČ:q8`Ýkć‚ňĎăD`  ÁÁ·’ MIş ¤‹d ŠírXa›ÚÁ2 \ mHńA,M>n"vG.őA¨Î B[ęPs‰Łdöéd°,Mµ@Ô“Ű|: ă5›TŃ—m§Č i=†PIg#'ąÂ»©Rq€`ŘÁ@€´Pĺ(A†Č:W÷A4É˝ĐPjÇ@n¶éŞ AÚ½P_{qčďń@ŕ›„Ë‚Řjînş $NŇ@vĘr\”–g Ęîp‚€–hB \šaQndŔč€b6do-?Tq'#¸ ÄŤ„ř2l úµŐ#sţ ä•"Ô»uA",mAd[h˘ ŮŃW°•°PaP˝0ţč¨7ř ˝‘vke4vqâ€F° «®dŐ˛ ?P8Ř™‘őů ÇŹ9ŘÇ!ĘŰá'nß™AÄ@‚ŔAĘ Ý?¶L3DKw_,‚yO!Ś ¸­E GÁdL\_.3ĺŮ$Ŕ=eîsmőů0AŁÉĘědí`Áîó±ţKܰAĄÍĚ÷(zOšRŚe'ŚÝâĂ*&@Ô9@DŘ˙Š˘AÝl `.ŢĐ1„vľÚř ľńűQ ä>ş ÄDVCĹGŹŚËŇŢež&äätAQráߥh\^'/d]c*$‘nĐ}YµČ;–Ńoä`<î¬»Ś®md5cuA˘śqwA䄹 A2ˇË'7Ü⸺ ᔥË2⻆´Ąv|eÜ}Pa!Űk(1íµ‹ ÂNĆ,|J 8řŔ#cj\ çĎÉËińńËo[lp榷Aů˙-26„óó‡>ĺu`¤śš tµ˘7/çć‚bH%ŠqžJCsزžá%ɵ‹ gg~¨)Áî!ĺ+ů ͆k Â1 8˘qź.ßSęX wňyü‚™íiIân–ćpč¨bÁN(qňĘc–;Ä[ŰC=ě‚ĺřßěxŰJÉŹĆü7 ÇAÖH:Đ˙ţo˙‡˙ŞćË@÷6@ĹÍ0Ź®5Ö¨:6ęŮ@IÁhPĹ;F×{ hF‡9A«¸‡ňA°÷AUĹ‘`ôÖ« ¨’y…^5@öłŃ9šÄµ*劒Ů@ź­‚ vĹč*Á!qR€xšŮH;˘ĆŤ”*ÇŃ(,\‚/„ ‡Ú `I$d˛m sŞ»:hŻʶ7·Ĺ;höACÖ6ß; ňń—pűn|P$÷(‚˘ţěcăôAĐŚţäj ŔÔ‚\ ;…¬­X4bŤŐ=aÍ2y ţߏů d\›h‚˙1˙ł¸zů în*Ř@Ŕż@CmH¶(ĹłA„ČÖ†č8sŹçµśy –$^ą@H´{PwŔř ÍStoµµA CSB€Ź˘ ‹” 6(0“ťČ0,_()PĚ‚źą€rPq™îŘ@îůáµ @ýPa Í¤áŰÁNŇĺéAÔš‚=EEzężşP|čČ;;ţ¨0‘7,‚ e.Háéä®É5@€S˘ "hE´Af!0, Ń‹™i$ŻÝcźF§(<âQÚƇTŕŔLO# |\•°↺ ŽRűŻO9 ťPg„łT 'ş5« D€¨4×T $JőŃ‚#L` —ĘŽ\b`áB‚Čkhö„î33 A Ü4]Ţ:ńíţ~hrDXßTXbďP‚· ŕ]ĆąkýXw .1_˘ . @¸©@w‡Š@/ŕPb íĆ;©l ńŔöMPgh±¦/„“ů›uAťéc”p`G‚sĐŃ`wRÄ !šş„î$‚l«¸±@1"•@îíMšČ@>(ab`.‚÷!$Vż$YÚ†č%ÎâÄ Ź˙Éb]ĹŢh*"-Kd Ĺ€ T˘vEň‚yXňko˘Âá¨,€–_Ş®J˝ŘŐĎ’­":ꂞAŁáźH "ěőŔA?ÍĚ÷0 0P/!Vtż$ř éŢää€'s9¦B ĺ; pč!ű^W@‡`‚9Ŕ–ÓqZ Ă´Qƶ'ę·{\b4ßâ‚ÍŹĚh€yřA4{ő@|e1ür|7Ő¸m&1©@ń€Ňz‚ÔAB$Ѳ$ëŐ-Ľz}PvrÄ€śť…°f†öA¶ ¸·Ĺ3Xť3‡` VŞ ă;x Y‰Ş –1Ş;öÔ $ť®Ú OĄ°.€ o”MW«a­ú 'Fk„ IfÁEŤŁu‰˛µťź­a, ˛zX١!…`2őѬEÉPŔ]ríL \{Ý"âĄĐbĆ·×ë@€j5ş ÍşÔ| ŔI©l ÄżÉŕŰ 4{ A%ľš ú\ XTČ ’D” p3€8®B I´| qD"Őťţ;V•¦ Č|’€2.ćů@Pi„I ¨A2w5©@8†mPL:‡Ú€ 4(&d{%‡ŹĹ‡ÍőA€ëdů@8zx ŰÁ ’Ă!(ą }Puá2p{—Š f­1qńAŤE<ĐËŹAĄ°ę0‚I†ů@nµYň‚¸€ďaJ2 f!éŐ ŔAÁŕ‚÷DŠšeülÎý`LȧT .L\b¨4ÄŤj-Tă7Ňtş Čó@IŰs”xĚ}î“áň‚·BŇ•Yßsŕ®ĐáÝK` %!{@ąşÝ[s‘j Ţä7űôAźŽÂNG¨1@Ă: Ϥ=°D†ń±@‰ RĄ+Ň!ÎŽ2i(A‰Ý ĂT1&Č7 #2e¶bŰŞĚčĹĎXě®*og”‡ŰnˇiDě4¸»=Ph‹: @» ÜH`ýcĽJBCő(ŇĹĽPKgć$_î°đA¨ő“ŃŇ2hPFR…ř Ű''qćčB*[ ’w96@ŠJŚ Đ"<±2=ˇŢ^H:ŽN0@ßkP G'&U ΖáŕČ đpw17˘ îAĆÓL ™ÎG ]'ÇNçŰrÇ(7ąĆEMĽP&@Pa/1˘‹jśmęÁÄ#}P2©`+Ş $x‚A7v‚ߊ?™AŤ#Kj‚MfKTŮF,PbH%ĽÂ &NI5 ;M2P ¸cFĘ P °A‰biâ‚ ’ýPI‹’M5@0 "ˇ÷HY™45l Č31"Ďt3ng@†5ř vŃÍĘ KŇç޶t,^ĺÄİ#Íłú>h9Ŕ°A¨ÇÉq†ä‰fgú ˇ!¶żC|Đrä2&h%Ĺ4Ę hÖŹt m㎵ú bFŰł ÄŐNI# =D› 9_Ůź—•PrŁnFµ[ ˛ ăN ­TŤŃ ç«ÜIÜ ,rÔ ú ™Älgp.€8 Ó¸f6(:pĘśžL¬Ť(4`1”ą_ß8jy “RĚĹd@‘ŃUIµ~äd]™Ę ¶őńA™îfb÷?TęÎ| Ö•#ó@Jš Ń'căT(Qtă¸>rŰJŠć¨>*®ÂĄ0®(Ľj4@˙ş—‹ Ł´šáH÷—¸·šćÔ0&„ćĺú‹Ůň-ę»áăÓ×m1t ‹S: Äl„Ţ˙ů~1"÷Ő}Ă^ăţH 8"ŁD K],QąŁ@DŃ­ť]@ŕá­›ĆbÄd$ďŤč3”ŘÉ^×!·~4y*{+Ł ¨Čh†˝t˘»dŐ7ş E+Gş äă}Ź=¤;QĐެg_â>·n7¶bDźÉb0|Đ` 6ć"ô@ŽSę<{u« źuČís\ Ň—ą6nűŻn7¶v¶ęŽŔ¸iů2@Â!ŞîăFA-<`źC„îJ311vĽťîÎxüjF‰&ęĐfÍĄPgŔŤ|PH&G` ö@\dËťÍäq‘ÇŤĆVĂ2ó4[eú O !Çť.Yż4ĺ¶”ŁôA·\7@{’€fꨲϫć€ä FE·Ď?š<¤F‘fę<­M”=lFr–âC5.î­Eµ(3ˇw°@ĹŚâTy ÂO sŰÇřň@¸,ő!$1®PbrP;.ŮÂL  ĚIÚMPup,P;DŞdÂV öA„ű™ş ĂžŘËIJcňA űL1ÜKň?oqęqrďäŹÍ‚nówfdLC%LA¶I©*x G­X4¸Ë–ť3Dµ2).ÜQś^~Şř ĂŚmmŢl‚G÷9—É Ą*h.€2-CR .NPU˘4ÉA„Aavş ڶ‚Ő·’ţ(ÚN/T8ąŹj cWŻDŔň8ĆŻÝäľCÔŚ ‘Kš I{ –ÚÝ2ą&ÇT6Đ5°AWĹiRůAÍšŁÉP1zś bű˘r¨(ÝÉđAaAT"/pč%ÚMń( 3j‚dś…ÍO_’ ™1/ŕPzîaV@Č”HHë_˘ îĄYî‚DĄqGAĄV7@ťÄń 9óA=ä|B ¬ç‚ÎďŐIÖć‚Č,Z8AĎŹn[Ť›ę™#ů EŻ„Śn—%hYśŇĄ–ÖˇAR/z>P=ŘAŁavAĎpÚş Ĺä-O˘ |cgz ±X†˘ ¸Rç c÷a2  Ő‘lç˘ Ú»X ˇć®>¨+ŚHJ#pÇĆŰôźŠ $@vľ|_{üq_˘Cůt˘‘n„AÝäč(Ôt@9·ËT2 ȉ˛m,.0Ŕđ9DJ1qD 5rŚžqkŐPÓ(4vźńd)x2 .ějPa[PhŰ@®P$ČĘőŞ ŕÜ9ŕÔg§’˙ó EŤOÁ “ ŤZă悉“nvč°ýP Ő7Ń;–48ĹČq„ M®.‚˘%ĐYgs‹ Î l[tN®ČZ ‹ —~ě ç=ľéj|b“]ΰqBŐ1ÇAň@VÇČ b^@čă&†ĹFŔÜ  ‰ÖL*†:hÄPÝ‘#3ó(ćÝq”ÔTS;N]ĚěČ3ÍëTË´BTĄ*ő Ŕ‘QP2‚¸ťĄ{ ±!«ś Âä=NPg7Ŕ Ôj›X Â.u9UÁĆ$Đ8~ ‚îC Cm˝Đ%¶®#p ±×DÜCäݦá|  Ž!¨_ę P ĆÂ@ĆŮAâ…#vtEí`§ö¸Śjű©äĐ-[ŕ n †@ć:2€PQ%ËŮTL‚o`€Üędj“ƵA˘i\án‰ [¸So͉Ť UDşşWDÜŠ ž†:9Ń’4ă`żÍm¸"ůA\qŰĎÇ!zýu FľYĐLť†Ú: 2$˝™k#đ@ĂhÔÜ Ŕť®Cü`ÄŠ Ć 9 ÷(3@wj¤#Ö,€‘™ÍN$Ę„I‰Ë ‰Ěť˝Î+„Ŕ‹| Ň,XP‹ ¨qqN"\‘ß/¸ąđAŁÁŔA>ßĚŐ—ăßÚpoÜPQ.jhr€{_n-t–Ö`ÄX ńJš2 eĘ~ç a#'Ü\ĆÇĹ4EµĘ Áé Žş ·sărčâµ®‚L8ŘDÁljA1ĺĺ"łc÷P Ţď0 WŔ wJmťđ—¨ZÖAŁĹÄ í¦jP'Ź„ńń.P0â€Ü#¨(ĆbE  Mz '2&b=4Ú‚wLťŔ×D&ŇĹ <\,@Ť˛ĺ(q¶ľ%—D ˘*='ę€4Ź…Š3¶ąAŤfÍ{„DÜŃ;_¸±A@öŠ·K _¸>.D[Ą‚0ăă1m´ĹJqqXW5(*„&'ŇŹ¤ŢôAG’t"Mä‚LĄ#ęfË ¨ĘG{mň×p>Hfo'ň˛‰“;ępő‹×Tĺ ‹ Żg‡sm¶ Â@V4ŔrśáńJP9 ŰevsZýÎP MĆh_»Ę;xÂg-űŞbŰz=ĐU,h˛VîĹîxÝü2DŚ ÜoîŔ]źč¸pĆg kš äÜv’*ĐVX›ábůA€xĐU$łüJĄ›ýKĐҨŔţ%:;ŐîHpZČFk]z %j†&Č˝+tÂ%˛>n‚Ýś›ä ›_ŞLÎőAEŔ n ˘—ŐZ‡Č0 HrP1}˛pĚĚ‚‰ RŁčz‚-’€$çýĐ` »±(ôcT"(Ä L©QCd rŚŚź$2  ]픨čáĐP• @ŠŤ.Ps”Ź» +o˘ $ßâ€íÔ ôŇ%»p‚6Űö $Ă+>´\yXżÉhî:ęwn ,^7ŃE„bŮtĐQ¬Ö(8Ä †—AĄ*k‚5¦J‹Ś —éŐÇŐ!fj ]˛‚Š eSJ„‚I4¨+`‚Üd¶©Č'śîüyŃíőAŔ‰Đĺŕ1Ş ŕ‰”ąI·k íÜjŐŃb×mPg—îů ón-» LČ7~x0łÓɡ…đ0¤8ŐÓĄÝŃŻŰ’Śť«L‹y Ŕŕét‚äüB!Í ąŤ(>(4ëIŃĐAć€&7 ČΠ|ŁÚÝ2r@Âś`ž0šy Xť˘×Ş «‘cń@Z¨@!ó™˘ (€($úDEP€:áń‰ŐµĐ.I`.‚Č–(‚&‘×TärÎ1Ţ Jr€ÔĺŽć58A|r’-—ú ·ŤC»Ů¸ ë„Ç-ÄýĚÎl‚¶L1 (H‡#Í’9ĄYţ%âĹę5@Î_ĆZŚąÜ Ëa Âl!&µ)ŞÜ‚ çVA‰‰­Ű(6ÉzPf.J €ßpýPfh» I•ť `µ9@’ţH‰ |ĐśE>(ĘC悸ö&­1©q^0.@m˲řüšpŚoňAŢOşŁŔ ‘:`‚9ţ?#ŠQţ(<ćqŰzŕ Ŕ€Ç(:~9'ÜOé·mPP µ=PVńű~h9ŠŠÔç)Ó%ÁŇčÖâĹŃô* &5ĄPP'_őADšBnr™–dŤů † 8¶PińĽX[;Č€YŮ!PE·¦P-'¦0€‘©˛[„˘…ę‚{ٰqęŇá¶;kt ˝)Ş#@›\ů Ű#fdD“tfHł:¸7\ ‰P ëD„Y™ŽB hČS8AP/t:çÓźKá™|ŕ ˘EŤ‚.ń,‚·u<Ô¸A‘¸ű$Ő·2&b#p€Ů < ĽN8a˙TC€Č3Ó´^Č$Á‡Š ‘‰˙4 ¸A¤äóAť$?$S\ ΂6¸č°/ź’ś`{¦AÍŢŹ| Á˙ŐHâśů b^ş hMlP;E(č14r.€pŹ‚j|Đ1—J› ăůú±ęn$ş˘ýtâ¤bŤP!ÉTAł5Ă ł‡@;©ŕ‚…$Ő˙př NľPO)/4‚@"ź4 ŠžÔĆČćî5-!ŕ —łęPq"%­˘ 3”€kÔ ŚGŃHń'(0 ÜŮXŤBm˙Ä\ čĐŃ-“¨1o7@ YČłš‰j cýŮÂńŇ}¦~Ś»^Čv{y>H1äă 2roB‚ČĘqîf6č0b#óA&•6łőAÔrń›y  â gćČ ËŚ9”¶Ś–%Ž_ǧň7V(+ßüfÝa_´ 'ĺn[Ů÷Q™üP‡ eĆů !ÚHĄKs Ćˇ#˙ö°>h6Ę B FÚś„nÓÉŰ"-]Pi ™ x ť¦”¦PSr;ĎŠ cA„dŐA¶Š” 1÷PX˛ )qŘɇAŁ8“e«A{˘"îXü0źäöŔ.Îá8‡Šd6˝Üj¬)Ç’Ěď4ş?şýc8’ŔąÉĆţşjĹ9!şłˇč@ĐIÚÁmÜmT€`eáDůčxÄ ¶çî‚;č§ć€Ű'sVĘĽB^Ô c­_Ş c3R<Đ-2A“îoŃ™_Ş|c=Ó;`/&vňA˝˙Ç5÷ÜtőAęÁc'o ˙ $ş,$L5d X]©Ź\ …E˛D–#L Ě( Ĺ.P$€Fő n§Ý‘ ⨠–ÍĽ µc”㹙ꂉ“Ó9A/ĆXŰh ™m9şľ×źT;¦"+J »š &g7Âśdž(ť_Ψ«š5 VAĘ; ` \‚č4I”‡É‡Űjĺí\” $Ŕą()°·Ńń–}2PT…/D»T]-ŔEšą@Žćş#GAg}PÎMZŘA„‰A˛ô@ˇbNk»CWő@»‹ 9Ł6b7Š·[ĺŤÂc! .ůA;iw@sz˘ýYöęĹ" ·AÚ‡k­<ĐP.‚dA-aŞ1Ü$·Q„&<3ÝÓę‚wÍT:Ź? ‡ćĄ{TČ«ú Ăp ńAÎ@oĹ E…H}ŕÇDâŰ)mo»˘ ‰ď¸­PP(ܸ¶P÷ 6P 8cŚ ł»P ®äŁĚ \ńłÜnA–LŢß«®/ŹKš0Śv‰;ÉŢĂD{9˘ :‡®X?·ÝgÂQă»äY{dHUĆPs`12ń ‚„\Đů Ä%Úáî Ö|ş <†eú Â'îô?7tnŻ#źěŽâ94¦Ô´žďęłů ÁÜśáé,rŹ ÚĂĐ&}¤lc—˝Á´†ÎŚ€1"¬ůA„7ÜÇA\Ł-˝v4íb0č$ňËöŰŞ ÎNAM´ZĄŤŘ4(9Ć2ÚĆP&†ů nwń O#·kŹrĂc î9&Í”$_¸0ÂÉ“i„Űű~h<‘aÔaÔô/ń÷Řă~ď˘C–qrR¸9ĚĽŕâˇę€bîÝiRăÁqAa”Ík’ÉkŚ  oöA‘ŻĹC"Pb\µ´A©‡+ÝS\”.Č/ŚvFµ.ÁÓD¬ ?TN8PRš ¨Đ=†4eÝ5­XٵµA©Č7 î |hŃĹĐbĺŔ¶pä óČ›‚ ŚApČ ¸…îĽäw~(*Žŕ9@JDDč IĆP}\X¸{ +ż@76 Ş Wę.Zč€cµŹ’ŐŘx”ŤŔAď©Aź·S”Áü=¨:I…Ď’ N_Á q`lKj: ‰:ŢČ8ÄĽFÓ–×t=`‘LŐŤŚÝÄ[Éâ@ŇŐ@ČÝS–ÜôA˘ű@| ˇw¶I1t"űô(ÉÍK耕is„2l Ě@caň@€XµBIÍhE-M]˛z óqúbÁÍh‚î[ć‚ř żěÁýzj"2t@ŠÔ].y8…(^¨ ; €s’Î;Ĺľŕ8?˘†ô„ ,nP“J ÄËŇ0‘p 5Ę‹˝z H­ú ĐřŐą‹ÄÓ(.¸Ŕ´˛‚ĄIĄîT°ĆB'>Řk}*!ţ=P\=@ŰTCŠ[î`ŕ ™Tň0wŨ«”ąkÉ'7lh !ŕśČöę+ŻšT„÷HZ2Č -‚OfÚѤРiă!‰l °ä]† Jř(1‹_TpsbfŁd1#l Ł)ŃÍÄ -ŹކČąľ_¦ čĹ@+Ak ~¨$˝b-D a: (őý¨8ÄËhcL Ňő6AŚŽŕę‚äKĐUµ¤Ŕ8AU&QđtŔ‘Bh‚Ä5B ‡ Eę"„ \ aš ä"×ÂŘT ˙"€íÚç@“ÝŚ báđ0b|P%ęôë˘|PqPGmíńÔ°ń(*bq 8ľŮh÷˘ ĺ­YîX =ÉJňfč=÷Žš Ć1Ü{~h śb¦4Ár€”¶ňHDíŤ6娂Däŕ˝ú ÂR,p©ÚI%D‹s”°‡,G‰ČíÉrlâ%¶ąŐĘćaíQ÷8×âśÉÝęń˘qÜH.íD%=±Ň¬‚Žö`jz ÜF{ÇuěY’“D‰3ľďˇ4,ăä'–h]ü‚‚GŤĐkăw[ Ň2í ˝ß'qÚL|ě]ÎP>×'ňN§/\ś‡j Ăńř6·µăÜPařߍ 4rKn©ŐÝPoŐOq@vĐş C’E~HAJ=‚tđX‚@6°@ŮpčP©˛ 'BČ&1‰.ÎŰm‡@N0 ‚ř Gž”7©@:–ú ľ>7ävt"!Ł”(ń}Ps攡Í8F‘‹m!Đs~WőTt+tŔ˝|rrCÍ„ËK ¨şU^ŇAaC„P—ąşËl{ ‘)Ďd ̆r:j‚gËÍlŚÚ#íaătyż$;r;ôňEŘř)rŃ.<y?}3DKÜťE\kN*1ăý·˝J Đ'Q”E©µîodT—m×-‡íů ç"Ń\ßÉWs ‹ Łr/ŃäFş ăű›§’ ÷ŻMg5Ô2ä÷$#GjřĹíä€r` îC¨%Ý͆¨7Ş:t‹»› Ćč9ţCîă,Ä=PDC‚%đ\ä `Íęč(€# @2 W˛,KB,jš FĐ6łş Ĺ9˘3Wř îîY wAĚ‚LZ€ş1© f&şÝ@“ŐHáŞnh×(8Ć ¸c’€5&´Ő^†čZę‹>Ť„.Ô¦J°ŠĂ.4ăÓₜ;Šśämóp\4pv"žZ o{‹4™A¤DC éŔ\Lć•ACi˛ ßçŞ?8#ň9A ;_ŕ€zą°Â î(,‚+&­P%™ňqnŢÍĐtî˝bŐš Ň1ąó@H–/A„@ŔTŚ &ĆrJQ’@%h†AfYĆ1Čz Ün9ˇ‰Wč©!ÁzA%Ü Uť`1QŹűSMĹČ/„ŰŇš žڵ^ÉĐ-”Ś‹ľ\!"äTҨ1„ظ}jHĐŠčŚÁ÷fcO˘Č úŰ(: «qpKŘţ7Ŕ±AÔš J KMŞźä_šz™Čž¨8‰Š ľ)B&5˘BxŃF3÷@!٧’í±a@č+oy ±Â7,LmVř éľZ”Äľ(&s}Žk\ ŕţŞě{ ¨`±Ęą Ń;H:&FÖčql ˇ-Ĺ…cwÖČ ’YĐ21‹ÉŠ‘źŃ2Ą®u‡öbÇ_Ş-\ Ű  ­¦AîŐißmş vČŹ  6Éúꀸé”8A>ăaľh/a4`nl•YźňýţF íú ™F{Ee"C´‡ę‚"?u^ţH4•3˘ ŔcC K] Ťµ('°‹Z¨X(J ń,A AĘFrsßD §Ü r‚I \¸>N¦čÄ^č3Ä‚ř¤%É ’ôňAĐ Óp˘Ścg"`‰FF‚µş •˘t¶<˘ç(Ŕ‘ňA&!7Ł źn.hrPolX°ŐĐ_bň`îÎ1%îFpyů@<ÜŹÚu :Š Ň AÚ»Ś°€89ŐăÚy×>H;&ń(S9ň@DQŮÉ@ŚăRŰO äCU´î  ˛|e”•Ő:5˙D7"UŃA¤NŰwĄň§cČ™t C˛ &űŤP;ŁűľH<ÇňŤÂ7łů4ŐOőáć2”¬\ Ű9 ôTu˛ ŰĘ$FßAPŹ?{FĄžˇ{|­éh‹T L9ŘăĹ\Ź’ČŕPüĐLěGÄ í3[Zč .nQ¤rn‚·ńŹL«ŕPLg IĎ‚ śAČ›=¨PaÉÂiřP =Î3S X ç!.^IÎw™Ąg`‚OŮö8=t@ŽW}®|BŹśFślNw·Ëa9`)nˇNČ˙±>Çf.4@ű?•onž!˙_ňküO˙AÔą‘".]H˝_žř(¨)ŚŤJŠ uA ’Ŕáy8ŰŐÝČ.0Ď*xč\Ó”$ gA Çs»>@0ĄÁ@ ę wLÚ64PçaŰ|8AGŹňL<„‰ŕ%îöžFŮ—kŮy¸öŽţď^"}W°cTîp~ď‘AĄµÎFPÄwUón<2Íźâť‘AŞ j*|ĐWKsŃŮT}$_˘ ¦Ö@ĘÎL\@8§Í^¦íqâ«6X ™ś|őAR—ń‘bÍ’]ȵNm¸ź$±,r8.]M~¨Ę].—ÖĂ(8ŕ|ĐUK„ b7ÇBô@íb:árXÓDâ+®Pak=ĐDýeŤNKfÁXvů‰ › ^Íś ÂDI˛PřčcX—¶¨pŮ$€Ňk@Ęě2‚Ł&„Fjá7Í^Ńl çń{ ŔV‚˘č4=ađč;hMb~H0aĐĺŐ'Ҩ(R†>H&D H Z¨ ­[6P wjPHpŔ[©pÚ ÝÔz˝Đm¶qÚ`,˙4pGAfú Cî| @űµÂ ŃE·m$€ëT´‹†ktA\OďĂŻđAßi–(€˝…ě‚9Ą8ô;@Ű[iC„T’â5@R‚9ńĚf•óA¸nA†ň(+ŚwHŠÚš„ ` (l™ň&‚Ž@–%Şr‚d×°ÉAčhWAtÜ)sŞ@€AÎPKŠ0mÄ Ăst( ŃŔ<‚ ž>šů Çs1.ná8Š˘ 6ˇ`}áľ((‚_\vĘ ML ÂR¦Iş Ú­óAÎ~ąRˇbËáíoqS,ÚČ4HoŠv Qźč‚Üš¸Á@3~¨­MĄŤ…Ę.ĺ°€ňŔARÚŐ@±‰í˛NAqt‹˝P<{}Ř˝Şß¤ô7A8ĄYćX˛ Ü `ă,îf&˘á)žă@»0j !%Ó("-°đA¬í| ˇę‹Vč*®úݸ;ăT"עÍę&5ł c¦  J]Ĺđr€!ľh Ň…_ÓĎ­ţ;µ@Š—ř ĺĚkĆOő4PHď›”I±ľ¨6ó˘T ňa'8˘ŰŤ˛®(‚9˘cřü“=Ä7m®Zč9nŇ÷PW%Đ_ÉŃtCµ†| —é; Ć$AAŚ bkL ë81go$ ˇbď­±!ÚH#ŰŁď¨č€ö¨ŰśęČ DŔNíţV@CiŞ Ü Ü› ¨m<`›UC_(*~#aŰwę‚L¨•ú @ŰÜîGŰŞ „†wę‚Ěééů `wU¶ůÝbEIw@í#¨9Aśd’Aa,61㙦çęČÄÍ€˝LClr‚Zío˘ $;hYc&?$TüDEi|  $”cPú Ţć×ă۸ »uAĄĚŔvVą@Ř˙Ž™ŞD[É´mµJ %ŕ­\K€Luz Ňä–ťĄng6tńş=şĺâĆ?; ‰Ë¸î9@™öąP@1·TąÚ Ň2ÚKŃÜ̇lYđ€—#—ŮCz Ňć-H6•A3ž63\ş}ÂÝP#“»ÓSÖČň}µ8t $“Jh€¸Eȸt˙Xý®Fv˛đČłMŻ„=„snß¶đfwĄĐ#Z/ćČ6ň϶‡€ĺ„{lí]PscŠ6)-=Ó%ž§(9’4˙Tů#˙ęs=m|Đy¬ńĘ8k ëĂ?î7J čH¸ˇ@·Ó› ™Ô»ßô@ÔÔQ‘hł×TŽęQŞ "5 ÁJżĹnâ,h†gÂ|ÎügĹĐH±3Y®<~¶˝PQ:Ѭn€9/˘––§Tä±ů ‰zHDXŠeńÚ(K‘¨Ě°®h€i÷ Ôš§0”J2{ĺX†ÂŚ3őA˘űéC”ŽPPzŇĄ]Î`â.Cęw|’™A;KÖ˝PĹ·7ŹD ČÚ‡0Íč4ś—Ş›ˇIĽĽidTr2ŻT&;©@P)UÍ´ Űś–,¸8d5$ĺJ°¸˘â•|Ů› ™‚,.P&,v5®>45'P—84…íd‰ât@9 @IŔ“T§Š !‰Đ ÜßTNvÉŢô@Đ 3:¨=“—ykź“ ’@µGĺE˙šźµľ(<®Ń(5IµđŻŕ4dű Ŕ0üLĹôŐDś|ŠFUŔ¬w.KUăoŐçK őóÚ\Ô”ĚĂ­C5NP ‡atĎĆyů Ä5ȱ6˛ "ŕů Î2m„‹D·¤ ť´­JĚ1:~8-3€ÔAĐĘ€ź$‹gÁ*ĘϢ aAa„“z ¸¸z„E‰k›”\L{´AL6»]_ŕ€f®bi\Ýě ‹aN#yÁĘôv: ©Pď„ NćwA€p@ŔAî‹TU)©˛ CŤŔ2;dIgÔ ÚbÚ_ ÂEç*ł3 ňbX“q”"EP$˝,öꀛí“\µEhA… s{ $ cmh8đ@@†k ¨Ĺč*Č{0&EâNrÓ&$ÔŚ ‚ĚXS "KQ˙—źTë`LÝâ P`÷4lÝő7T颧?\ĽNeä—çţÉ˙Ă˙¸ ů°Ę ş?ĆuüO'’řŹš ÇÍ  őÇĎęr}ŢH;ĎÖ‚~óäKÉ Łb‡ä˙ëóAÎw(¸ č=óA_pA'ÖPj Ćź/¦^H9 ”}#Í_Ă˙Ű˙Źę¬=a•ĐYą@qe°ÉíÇĎęG/ŽĂÍźHAp@Ç(7Ú»ÉNáť‚_w’A§p‚‡÷8üţ(Ř Ľ EŠe-4>˛űăć—ĄFĺs˙n~_TĹáć‚~Чöƨ.>©y Ü–A1ôőGÍňYĽÜ ýĎń˘“ŇPhŮÇĐŹ5¸üĐHő ¤y ˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Squares/images/background.png000066400000000000000000001623311361462701300265740ustar00rootroot00000000000000‰PNG  IHDRRR-´tŻ pHYs  šśiCCPPhotoshop ICC profilexÚc``žŕčâäĘ$ŔŔPPTRääĄŔ~žŤ™!1ą¸Ŕ1 Ŕ‡!/?/•020|»ĆŔČŔŔŔpY×ŃĹÉ•4Ŕš\PTÂŔŔp€Á(%µ8™á CzyIA c HRvA cHvH3c OIjE s~AeQfzF‰‚ˇĄĄĄ‚cJ~RŞBpeqIjn±‚g^r~QA~QbIj Ô^—ü÷ÄĚ<#U*Č( >1H.-*%CC"C=Ă†Ł oĹ]KW0Ţcc bšŔtY9’y!óK––[¬z¬­¬÷Ř,٦±}cgß͡ÄŃĹń…3‘ó—#×nMî4}2ýüęë‚ďá?~ťúÓúĎń˙ 4ú–ń] cHRMz%€ů˙€éu0ę`:o’_ĹFá;IDATxÚěýÉ’,É•$˛Ljî7$CwQő˘ď˙车^uweeŞ@Äu7UŢBYÄQ˝4ß©qŻ»Űŕ&GĎáĂCřo¨8ĐT¨: ţ  c\8q ! ˘#ˇ˘áźń‚†„ O81PD$~_@ÂĹ? čhȸůw󱄀  ť˙<t ź2Ndţ]Ŕ~ HHč¨(hř' ` ř§ĚW;ňŔ@GDĆ_q #  čȨ~‡ @DGPpxĂÇ  ß' ňŻĺB‰‚Ž "€  ""€Ž€ đ›Wp˘ b ńw3_ řŚć»–4$üŤĎˇ# 8ńŔ‰€żF?ăŻxŕD0D4Dśřßpa``  č(ř@BCágŁcŕŔ÷u_/˝ň¬$ '"Oý™ čř€Âłpˇb "ŁŁ `°.tţśŽĚł–đäg˝±BĚÇą4DtV;đ|4tdW‘‚€€‹ç|žý'22"2~ŕŔNţÔÁs\10ń‰ŚŽđŮ7 T$śëRç»ĐYźf•8ŃXO"ßťÂ*Ö§ćĘü“ €Âşń` ¨(.¨ţ-Ě÷z°.ÍwoľöYE€€ŠŽ€ĚWYXCt$$Vş„€†čřĹŐ©°z%\xĂď‘ů{ě¸QřîD4\(¨ĽÍßoăłlw•şŻ—W)ŐŠ‹}Ó@CBADŔĹł0ĎńĽŹWŢ?çť¶˘Ł#!˛¸PŘßŢ›2"Nťç4°;Ľű¨¸ř5ŤŹý—ĎÖĹ{xŔŠAvwđ ĎU@Ä@EDŔ 2+×ŕë»Đů : 2†Ň…ĽŐŔĘn«đo#_[f‡5>ŇěUö[ŕ» th¬ĂÖŕßĎg—ĐYß:˙7˙lö-ŕóčH¬•ŞjęÄ: \¬m`·Öůš»žYĂ"ű4Ý?2.tÖĐ†Ś“Żô‰‹u|ŹçgäéžKll÷µűşŻWU©Ć;ćśJ 2ţ†»Š‚ ŕBbwŢż§»† '"2*Oaņ‹źá֧ٙȟ8k_p6ĎCâ˙"*'±Ćšpa q"¬KŞL:Mu/ó»23˛âtžî١Ěîe°;Ë®ž‘“™f¶€ďhŰÔŮý3˘źOŕĚXŰgőśĎ0ó'%ľó™ vgsŇ<ůUłĘĎ_łjÍwݞ¦ÍßGäoę@GDAĺLD|ŕÁęY=·wtt<NŕohĽ3tŢf‡ř\4÷«u×F°“Św•şŻ—W)ŕd2'ŚJü(đĚĎOé…ähžč„ÄŻ HžÄ~CŐŁ" ŕDç}=˝š?±ŕÂŔÁ»đś *ç¸YŹ‚+hÇL|8ýý€wőĆ ,ňlÎO…uˇóutd4ÄxfgÓY&Vyö'@u ťg}ţ„żâťs۬}Ďyt­Sx ł˘%ÎóÝ ¬9łsŐ¤;«~3F×=‹f\|ß+˙®˛Ă›ýYŕ}AiŕkŠě‡çÄ©{EFCCŰúˇČľpţ~ßÁ@|p°ÚĎŞ9gÚó®R÷őň*•|źOě §˛‚A,čDá™jD§'î N…ŐÝIdU©ě+f ̵ ±Ż{—„„„ŠŚ•čU#ÂÓxR#gĹ`¨qViDŻ+g!5‘gđäĎ{­Îz]);:_[BŔ““ěDĺ§ĐaĚž¦2»ż€Äź<+Óě/V¤Ď˝q·ńÜĐŻYÍ€OdăMóp ó]W'Ş®3r>]ż˝€ĘZÖűůZ ±µ“P¨Ye7§É6ąn ď®W `wZ9#$ľS .ď;î*u_ŻÇĄ.ĎI•¸ÍÄľgđ´ÍťS"¦2űí©§ đÓ>kŔŕ~­˛k×ěg »‰Tž˛Äťâ0¦#ÄYýWĺéś8ů¬EťĎ´±ówPÚV"ÉŤŘÔ'~á9ŃeM\‰ťa᫡q‚ĘüŠČľ"s&T=ąpáAÜK;ÎYG+kBĺtŮqáÁ÷{ö•…ž¦şĆ׹;śťÝÉÇ ůNťµż°ÖĎ~WSćŕ;ŤZEwm‘ďôzmÉ—úŻNś+˛—ĽFŢ:çÄܸÔ}} .•ůůťlcŚÎOňśĆ"ĎTŕIéěŔ3?85Ţ}A,fÎHŰ2pß~pŰ·đ`M.qš@v@eŹ0ˇ>?9ß +K¬¬';¦€ĆŢáÁŮ$ďÄŁ@–D$&$ü{NHłŞ ö•ďŚNz‰ój –÷pŽDĺ“«[fÇ3;Ëî}¨6ŚŐł ŮbIšźkóÜÎĺÁ(¶óŇŘ˝î, ťÝŢÜŘv°“m’YŮŔçś¶W~pzśłýÇ]Ąîë&ľ‹§ěŕťy~Ę&ĆspćkŢă'îČĎxvßŐÉ)*Ä0:±ő†Ć»yäţM;ţ‹ťRs'QYmśĆ´»†ŮUuî¬"qńÂţBřHwď4ąEŮs&¦ÜÂĚťzc5hF»…sżŠČMýN$˛?XË :;±ČĘ:úÜ;dNWÁű»Î;Aă«?qpęibvz˙ÁY;qPX5;˙nˇĺ9ÚĘof/ÜXećż‹łřŞ">ůČ™÷ŽÎ÷č ¦®nK{öŔ~ľ—cc EŁŔŤ?­ĺ©ć$>jg­čƱ:+Ŕ¬)ýÄÉh Ä—N†'÷_ĹěSíŃö&ť<¬¸MQ`OŘŚ)«Âî:ŐŁ6âIžúŔţLs[â#fv~•Ü­dFYőÖµđYt˘ŐÚ© ßÎ|=‰\‹Ŕߌö©ÚEţ­%Ϥ…żwMłđł¬CU˝öĺý Ř''ßĺîëľ^WĄfe‚óÇ@Â_đN~ç“ܤބ'*2žDJŁ{¬Äs:¸3»Č˝ĚxđÓ|’Đyײ×čBrrW4ĎĆIŢ#¸§®ŤU"ńÔ|°buî…őG<ÍtěDhśsŔz b1‘sk"˘Ö𓸕XÚŢ8_jJ:ü†Śč,#zĎNävŁ?''ŇDD?U6Îż¶¬âĚ&OČÚĽE|ňwsÁůj•¤ •ŻR•ł±Ö VÍ7śśMOVöČę|Y€ ŻZĚÝŕ>ů®R÷őâ+üx#s D];:~¸Ł€qŕü”7bŮł‚|šq~ńN<-•0–üďĘţMłTßv𪌧áđs®üxcß|â+Ţů|łŐ,Ť]“¦¶Áj÷+QŢĘPݏóÜEΦ«rĎÓšŘř7žÄĚz0+Ĺ?rűĚÓ~G"w}@Ć_đ`Ź:çÍá>%±»#»űl¬tłŢţŻx˛.tţţ"ţ ĎyÝ3뜀;'qý˙He“póĘ]e"ß7¦éĹ ­fÖ^ĺÎCű… ďw•şŻ—÷Ro<ʼn'«ł#éĢ#ďÝ“])¬yN]´Łnü:íҢ”y 4žŹ •\¨ÉJ Äg;ž<÷§­d>yOOF¬ź[4N­Y­łŁ‰Ć{@ŢęDŹ÷RĹĚŃ?ŤË$˛Ď+ń›Ůńn3Ąy ‘źŻImâÝ…öô¦züDpgTÉ,śžö¤ł] ÎÓ‰‚@nE /,qëÖ<OíĐ1%ˇpçĆČŢuÎň…ťZg7¤ \Qqrx©ÔdŢ™2_«XSsâ\Ý×}Ý×k«Ô ?&±_hśô&+2ş6Á=2÷'p*ŠVÔž»Âţ [c|ˇ˘âB5ë|ÜŠ\śb)łRt˛“†µ!''­ŔS˘Ş˝łë¬JŮť`'ł§› Ö˝č¬D‰U07NÜśEVŰÄ-–řŕ‰¸ř—Ú<Îę%ŽfeWÚýŞŞ7kť“_wç×uľŹ•ĎÔä%Şaƶo8X+U;ťµsây'«8—ÍvâŕÄ(”fMT*Ë5Owľň…˛Y/Ď‘óŢ•ůnßUęľ^]Ą&J1Č=g»ä‰jNDł‡8¸Śś:YŠbrhOöÎh¸«Čä1‹ß3Ě~š˙vđ;+głęť|ć~k âŤ8NçŚď¨"¨dőDž·ä“›1ĚżđŔÉşł”;š5 Ő‹ÍÚaÍDÍ{Hő:Ňń4žŐůÚN€}ÜYMĽŻp¶šxx!_ś™ŕţ`đnq˛_•ä<VĆâú6X˝§’ŕâ3ětÔł%nçó¨ä––˛YG8Č4B?kđ°)ó>¶P‚űşŻ×V©ĘŢ]Ěś&¤q›ŘM0·Y˝Qrmjdĺ¨ÓK´› öYPżp% âRŚń1¶2żRwůµĹďć\EvkOKóŮÇ4y{[Ü›'žµfÎx7?ƤżŞÓ2Oó`M;ĚąěbŔ^ﲮ¸łzdţć´®~E¬„Éť ¬M•űÎJťŤj8¶‰ş“ÉVQńn6ŚŃEö›Şa…őÔÇdţÄcHdoÍY©µ×­ÖÚtk '˝Ś›{~_ßQĄ"1—‹^J0źł[Á›Ľ_ Ţü7žÝS#q@śČŕÉ«ňQ7XÂŁ2ż;y†©Č¸0čŘ%$˛™tjÂ6-b*Ë•–9°k]łpq“vvĂzhmuňÔ#&FwG霵ޏL4?b)‚‘Ľ_•xP‘]éÄŁ+ Tx Ţ-4-Z ¤IzN°‡ Sk©‘Éx’c~ňťŽTRfk ŐcÁZľ5-•SëĹß|u_[=Fs´[MÖđÜUęľ^ŹK 3Y0RęGźÚ`mnđ=7š‰S¸s—ËZ#bßq/V­¸Í{i›_29Rţ‰3č ČÁŻŇ®©ËJ{©Żę´@v|ö`©‘×¶rPéˇ˙*¬*Ŕ…wÖŮĘWé§÷ćÚ–żđéaNk!šUÝ©h{xň'Ę-gŘ˙ä4·ôEĂntťŐVŘaŕÔ}qÖĚ©Ú+ţjů?Äm;{ń^̧DUćÁźźěµ¸·hkF3{ŞóQqĂ[!s_ŻŻR˝|ágÄÉ {ůa%]§j.ĂťnŐnpçĺęҶ‰)¸ŠÜ/-‡7U!.?ű0gń"Żi%$´8Ńu›Ů*˝7Ĺß‘;ÂĆ›+«8Pr¸¬,ě·ş=2źuäö/XE<=~ńĚ–¶~rőv‰~¦‡Ďt´ć0ÚÉs°ć4W‰Ć*>ŚŚ©źĽpŕÂÁ­jĹ/Ü\tYĘčĺ{0¸ăóŕ˝E|űŽ' žěKçťŕÁ ^˛#VuŐOVONż÷u_Ż­RŃő!Řß±°w űbăŚŐ±ă0îí—oI÷L˛ř«s#Ľxł}#űgx*‰>•ĂLѓР©Đfň4CR^{™=V5BüJ°qĄ'?2Ř˝ł“ŤZŮE?ZG%ţžXa¦ľ¬ŘbMľľĄTě<ĂOcýóěG»RhŰüLĆćî3*5auř›©î`‹ů§÷ŽŃÜUnyN,e°†±ł>^¬OúÎäĎÂę3Yw/u_ßŃK םh]ť<Ďł˝˘Ň†5É?á ëŔ0żZś†O€şd°SfnşR žňîŤb·O¦śsĄ íî@%L óm`'#U ó]ĘĂĺWŮ9ŠĂŮÂh× Î4ě+*Ż_y€ś¦ŠÂ1źąÁ뜪ć×ÜĂ­ţ©rf1űäĘÜČĐĚ›:Ą“š`é§—E°WĂ`˙VĺÁW+Źř;›ű×ŕ.VJĘŔźŐěżĚ@YšůPîďëľ^[ĄN#Ńźë 6˝‰üq?p@¬©‹ ń ĺ7R<ע˝Ń~&rW‘Š,’ń9ąS™ýPAÁ ďž‚f7ńDAĂ'żk`ŕÜбN¬Lgí°ňŕ9¬ąÎU΀*ŔÓŰŞŔŽđ‰7;ĺ»Ç]<Ácc =P‰áG<ůî-6Q cř‰':2ßÓÖMÍyę«f˙rm “šđ42ĄŮ.nřš6¶ŤčâÉn.P§”XÓ‹ëc!Bő“ء6„Ă?­B «Óµ0ŮĂfăuW©űzůţbGČäúRůÉ)˛źřŐÝş±‚żXŘC5Ď^‘Ȇ<<ĺé$msFÂov‡;0¸Ą~żqÖĹŞ’°ő ¶ŁCŕÔXŃńG|ŇŮ\z»FÜ8X3Ě‚»APÁźń jV‰|uśřŔČżđ}Ř™séś‘¬ą§“sđH]>ß˙OOp‘]Iđ kŚ6Óç˙Á,GP!<6—1Ľ˛ŃóĆ]ĂDéß©ă[ľ8B§ßyµ¦'·zQE5ůđĂĂşëd÷Š»JÝ׫«ÔźíJĐ=Í”‘•ˤ=Ö§1Śl~cŔoÔŇ7»©UÎ0ÝÜój·€nµŕRâUÎbŮś«€Š_x¦“}:AݫԂ‘Üžwü•ʱłűć|s˘f˝ř$¶ŐřłŔÝ~ĺ÷GłĹ~3"”9á ďĆň†Y«Ć‰APŮçd:štźáőný=÷?‘7ŹőDÖú»UC‘}ÖĚń*žoæCĘVö z™Ż~Ϣ˝YµłÜ۬ĽüOaĽpaúořuóďëěÖĘ]Ąîëĺ_3>S0pXĂßí_”Ý[őÍąVSAÚî´•[˝l$9đČ3ó]D±ć˘®áË~čň¶1Xs“íKܬě|y+śĆ‘ôü‡Y@°§h /kX Řó,}CĂ»=(5ĺEűc®t«dć“f¬@ÄfqŽ˘YkîěTçÉS®™Ă5\‚±0ńĘşçĽč\1· *.»Í W•¶qI˛=ýšQňbT)¸ŇJăX9';´f#†ťSsb˝Nຯűze•;#M‘~”Ó—2n<ËÉŚôU‘sK"rmŰťŮč8»l¬ş÷v<OžţJ–Pśľ$Z^‘RxŔHĽfÓBŚ+l¨6|¸»‡¬WÍŢÁęáÎM”˝ßëż ›+$¦™XD+CJLĚf7“áě˝főnŁňK˝s;čŞ×­ö+¬Łř˘ŕÎüiâ;ÁVJŁěŁSó¶Ŕ®ˇJëéĚ…ťĎç¤cjfşX´ĂŐâtÂ~.žw/u_ßPĄ"÷×™…T±Őţ(gE^MiăHÉł(±ßđ 5§ÝN÷“JĆMńß6§ß5{R »T5jv.oŁY@´OĺśĎđa•ĚAW™ą•'bńkL4V<Ě˝LÎé‚«Öţ˛A[ŚŠÁę=đdO{GČQŕ$†Ôťh ®MžÇÉ yRIÎ ©R›»}† _{ĺTĽ™kÖí ˛R'l1âłď0Ăpó=¸č‚<{:˝Ó‡{^MďpvisŹ…;ŰřľľĄJÉ/m±ş«÷\ ±Đö¬ZÇ+fő»ĂJř|p*v9m{ĄA$~|ŃÖĚ©"’Ů0ŚÂ“›¬p­¬1şÓfö#Óý‡y„SĘŢěOĽ¤PĂwm‰éÁÜöĄwKÓ3)[ż»Ľtî 7Ę ^®śp¶ďďţŠä ÁĂ;ţî:x{°ŘCçú .V6Ő5śĆ"ÝM ˙IbuËžDó.o˘“_ŞýZ&ßX¤ÜŐÜŕŢ1RÍüĎľyě5cóSń7Ѭé=(DÎÁôx>éÎŘÇu<𓜗^łß¬Îűú†*5ś Ś ^[ Ő@!P~—Óa’‚¬ąmÜ=‰3ËŻW>kiĂ”” łtůCţfÔ\µGÎIĎŠŘ<ÚŕÍ *ńßĺ¶Č´¨Ü˙5ď3ëˇ|ㆷ‰šONi•Ú6Ą0Ľ“)V™‹ZČĽZč—âęř*§˛Ĺ‹íě +{t’ÔIR(«–\®1Ń5şÚ9B}0]€9–b™®DŐÂ÷49U˘ş[ŐďüÚĽ*”ě*ŐăÁ9OąŚť>… ·'Â}}ÇŽŻ[«í’ęČéI%đÓ¨)!B9śÁ“Nĺý:n›xyÚÂU ·vˇ­<ˇÍťÓĽ#woÄ{ł•˝ç,gUVąę ąß?S®‚R”^>śd~šEYł¦â®‰“ăĂ“Ď=Rk(Ďß¶ń»U˝¬Ő^رDÖ;ťŘWVpő–f€q·sEĆO&={›6ĺ6MŚ<łU•…zM}ťęv±a6]TŰ8úrŔi…şÁîô»JÝ×ëŃóh÷ÜË»§ÄĎⓞ´łrüÓHŽŁŢĹ[ŚäśĆ žtâMŔ¦Aé8­ MY6űhĄż|Eą˙[ŽŰJM—篲O޵f€¸_`樜g‚‘˘ĘS)§đ” ĺďDę›=Ň3Su&JwyZŤgy /SŢšşG*çf=OJ>˙ á_ś~Ý/”¬q"#ŁáÂóp%[v~ďE$,šŻ6ě±PřűZéďfâĆŻm]*¬’ş8=÷»—şŻo¨R‰¬ĺ@Oň©ŢËŢ4 <”ńÉę}™ťîwÝ=G7oI~"ňš—fgźNzŹDą3Ô+Ý$Ó¦¤{sŢJvÍ Pţ]FĂ>ĽŮ˙ xÓř 4÷ěŤMć´›‰ ź¬ ť›łfʬîdßäd|:B®.ťUq8ać%dbäËjîÍ NĽłÇ’—o±šđŘ”ѸůÉg0O>úOżsr>ůn^ćž,/çäßMŕŽPŞˇNDěŤÚA©j ű©°ˇ}·Žďľľá ˙Ę>D•dfTýÜ2ľµ}:ń¶iS?Ä<Íš?ď'SR‚÷SŔ˙ ýP9P“;ř«ýź’kWĆĹYEÝŽřZqӡ͙éżé®••Ő©ąŹiNŽć\vş•ü*g”JŐíkDë~ć÷ý…˙Ţ6T»â.Ă©T“ź_ůĽObň@˘SÝÂň´áż6ÝŹjń/vb–Zş˘áOÎ?źżˇŕç—ÔáÁç§5wËĹn}ŹŇó±ůzÉŹ4|Ńý—_XAýâ5}_÷őĘ^j¦ŃUŢ˙unßíťŮé=‰`4şEîÎäk§?Ľs HDm'é“XÔě«’ýs¬@lërFIă9xXÇ–‰ÝÂjÁÎ,ąX¶ ź·X‡ł‚˝ŰuR3ĎN±—˝}'˙É yšśě$šŢ켚ťÉuš'´“?6>ţ‹k9¬ř~3§Ł›qŐí&щř°'ęiµŇśöŢí;5ř/v˘r”¸á‰OşÜZş§Ń‚HĹ÷›Ůů‹WĐń JěßS7áľľcÇ··»ŐjŃúŘdź’ěŢ~–7)Ć3чťĘ»gĆĆżOMđť¸á:Ř/ v2ń›h¨Äަ˛Ć¬t•‡U!—»¬A®ś;“á?8)jë×Qđɉ*CĽP8oüakĺßtîĄ:yŕÂŔß™ŘŐ)őĺaÜeĎ)ŐˇĘMf2Ű[sôd/eçŻÖMł w4•ŻžÓf¶ĂIŽÇDő.»j*ź¦ň3wršË±é/N«)Äł$’™¨ÉuŘüjîëľ^YĄ {¦ĺc„mc-~LŘ221Ţ@ä"nűýhőiŨËD#§ŽË)éŇőÎÔăÄ9Łsë=µ7ÂçĺJ5qZý„“.›0ßG}ACÁŘT·3?peďjR“S@`VËe—©ŘťČźxŢÖɧ4 0˙ąŮGĺáçŮÉ]âQL±éÝt’Yšěe¨L ›f5ĆľśMËć6ošćŚt}íĺ©ylž,™Č÷ÉŢôdŐĎĽ#U:ve;4ČA'Űß´ł˛căčűĹß×}˝®J]Îb‘ĎGÄĹz8ŹŔ©N6bĺ?›ý›˛‰ł˝ˇ9?vűKC7”7g5tsÔĹŞ F>¤ŠiÔFGŢíĄf)Ö·Eţm2·ě<”lík·ńÎTś +Q ¨xđ:Ü}tö(zÎÝÚšÓµąm»łNżšîĽőć¤ĎÄ˝!ěŚ7üţ¬ 3łµŮy Ľ“\ĽsʬĂÉ˝d° Nâ’Ďr#Źv=şĺŔV'¬Ó–»ifŇWĽYť÷őM¸ÔĺÝóň"RĚĆęô­lśtXasq˙d…Ü„OWO°[iÎ/Öܧ|(1Aµ•+›‹dwöŰÄ`TWžxcş_%Ëhq«ŁłĚ/O~ šN^™—ývžW©KćëšłçMdvLµnNŻ¦ŮĄ89CÁé ŃNőRsńđ,Řń;fb{ýÚ×KĄ†*3ů"j?ëwpŻÖíśó;”Ö~=x2—NňĚ@»ěµ#ßŃëVß×7T©hŹiQA=îä †Í5ĽnÎÝçfe‡˝áőUŃ]će†Ş’ű‚ý•;š“•‘řţĂY}ůfuŢ×·ôRʲ ¬BŤ *`ź‘čW‰¦…\ś"ŞÝŮŠ“Ba}Ż2#~úž‰Śěa.ď˘{¶‹:ő˛‘ĺśđ'âhď&1(V ]uş@â)®TňD¦˛g–n—ŢĚ™®;s|8Gř•8ë™[¸Ę<đ‡UľĂZľÎJ–śu>gpçöŢĆćęŇśÇ=˙&˛.ssäĄ×¸÷Śćb´/ž•\RX©ŤÍ™ř4Ž5k}˛>Qěôč”ćqóĄîëŞÔDą…PÎćV…°ew&*a”M5==†Ý7•rľĚo•ůwr˘ęfJ•Lgf7‰p%2®]Ľ €‚ż1c«ÚŃ)š Ą„ŽuśtsŻNYź )Mr'Îë5wA°kKĂS»ťMŠ;´H‡›Äć‚_Yó‹Q݉iťś« ¤JüĘŘR»’s×Ö.p* dąFÖŘ“˝ŕü­4&łvo6˛A€¶ˇ„ŃÜŇäťh"fYŐ:ŮůOňAďëľ^z…źřI Dg )LgęN]Ëd8ţf­Ľ78ń$ł1ˇâá>|¶ĺ˝űĂ>Ĺ0†ťńWü g›r×~ĺąĎNčĦĎF˝ÜM„˙ćRĎç"öüä‰â_¨ŢźŢˇJm˙ë–"#ŤJ˘3JŘT9p:yŕ–P®™Ńűm”‡S˝Ë(¸đ¶MŠůŐĄxa|Z-ćeđĂÝb`·VQđ›ąRĂŚPĄË$˘ćŇ?Í{—WC@ÄßXQŐG|ŕźČ3Wbŕ0ó-oľ Ý›”űşŻWöROî>Ůmt|"ŁÓ•mđs9=Ě;PĂľšzáäű»NŃÉűr° ®Rů׿¤_ ś>í·Ţ <đtŚdj†Í©÷b…XLłTălzlQšé–÷îŞ(‘ß§¤šÎżŹěߌ­ŻmdcĚ­ÂᎨŮ_b96"TĂłut% î-Yrî Üü_¬>b_É3_ßJżÂ–>ŐŮ­6ŁTÝ]sĎPŃńĂ<5ą!rúnŰ~ŰýáÜŇŻnµń}}ĎŽO~hJÔMöL“«[#Z˛á. °›ęćPIŹŞŻ–ë-ř‰^é’…yN«{†9ów1ŃY)…z4ič §¬Ę™§zk.l&_^śĹ“čÁÇš:Űäş`VÜ/'¨Č“ Ú+ëää©ç‰^ űD%çýÁ~°˛ÎĚ8ťÁPŮ5ëĚA­˛rÜźN‹®DĚNľŰýK~Wćä76ç@ť*śťŁ™…^~ŮšžáßçálĆÄÉ^›ŤÄßlˇŠç®R÷őę*ČFâRč}×ŮÝ€,çŚd4U.ťr„“sĄíä4Ňíö”¸]˝;q˙<şFV¦;!Ŕ¬FéŮäU<™ çkŞĽś qP×Ý-…Íy¦±ď!#â“ZÂĘn‘×R Ű\ě˘čü-ąź<łÍzîÉ7;íAŃĚëśWů|EnĚ:â€4xŮ9¤Ť ćË>VÉą«ťĎ¦™k¬G’‡ůt:wůEÄ?mL‰Ŕ{Ou5—«V÷ě?ŮbsĄŰáľľˇJĹí\M¤8°Ĩ‡µ%H%˛ű†ĽłzÍ;ţaíIÚ22µËâY‹=O€˛ „Îk—¸|Ć;Qę=[Eb?{7s†ł\„q7žËĘJąśŔWÂ^˛^¤n˝8K‰ŻWŽ-Ýάoźěş:Áü˙Oľjé|÷LăľąsĘëüDáN.ÓK¦±kcúdíŢ2Ăúp/9Ě•‚}CÔş“éwÄzU•úᄲζűÚvyjαVyW©űzu•ö^ ¬$Ă$Ń[él§ßŔú3»™Â,˝ÄI°mÄłž<˝@ÁoŰŽ(9ăa}®ËĆČ“¨*=D„ʬdŐ,óěü¬afgŁ+@sząÎ¬7[~sÇ{ aäłVŠźqŮ-y¸Ď”[IóOť‰ “«Zś Đ36aÖ}5Úł¶qŞ®ęÚ*O»äEcjřŇ9 jN â^Y•ĘöŽ&;?Dn ĂĆ«-˛OěžnĹ:¸\Cĺ8Ľá¸«Ô}˝şJ5nÂ2ń‹ŕ\¨DţÎe…XwÂy3—/ˇŕÓIžň#9đDFĂIĆŔÔ îa˛Ý‚çé:¨ ›®ŁâáçŁ ŕiEsłÂ?sľYΕú©Í~ÝńKR¨’o"±¬éŰŮĚĘŠĆâVćg˛ăoŮö™]šzĚHç¬ÁóŰčĂ+Ä[ĘŔb'fĹśęYrZĆŞ¸Ú$Fnb#;ćö‚JŚľY;ľ|!~Ë%b:°Še­Â äćűŘ‹×ŮDé·řŢźüś€řţ}Ý׫'ľBô)Z;,¶Ó0ç¬@Ť …ŕ“Ą? ŢŽU"ńĂ4~rf ŢFv*zü=1\~ÁË;¸9óĽ;G%0‡)±>U{u7gO]J&ş›ŚÓO×jë`.ćÔäČąW5VNč™÷eµĘ°ĂRr¶üĎd(K̉A¬~u ę—ׂ”™}^ ~čÉąµŇĹ  ăÄžfH1Xx/ąXá`d^]VpĘÍěŁ.;cH'ĐŤňEw–ysšRţ|ćô|_÷őjôĽŰ—V;čęä©A”(˛ó¤Ćć†űäI§™ť4¶,Pá«EbęŤ}H·om$ĂqĄw;ňÄ7ćVNnđlS6'ĽdOďę­]u~űJŤ’"P 2ň:€u*ް¦Äňéëîâ*߬ ćׯě©hg9Ü)ýFÝSsgÓŘÉÁĘäjS`_–Yä*UťsźíI §°ÇÍLżÍät勛Ŋ„?Í ­ü.gŞŔyő䫼Yť÷őú*•ě5۸ç?éřÖě~«4ôb•k «ç¤»î…•ěÝ9!ü˝eÄÉj4Ľ®2Ť÷ďÄl¸D 46}`"zö´»í'Ýí”pwŮÝ@ ¦zá%g"ËSN”Ő;ĽŮá$ć¦*‰˘Ó)FÖ®-=tx NŹ—7…Çć^5Ń&ĺTLŤbsm¨d{-ôKÓíž6/M^Ł“Šęe1«<2wPŢž;ëuąS5âw…3ěá Zž.ňdŻdtÂlô 8}ă¸u|÷ő-čyrÖŇ@fď‘·­µ”«Á»÷ř‰=XcŇŔJ9Nôh[śđ@ż—csĐŚś-ç>ţŤs^°ÖŁŕ7j^ąąš•ěôÔ#ŻÎáâßčU>+ŢÇ.÷ijš± ËűhE^q?36O“JďňNž˝0ďfݧhd="âÍŻµsf¬t >¬™Śöo¸Ľ}Ldun!T[‡ňôuÉŢ-údOŰX§.Nś¦á´ŽZžî ˙Šř‰ŚŚ§/ÎţóÉ=fţ'΂ÚE&bé÷Žďľ^~…5ţšÍŤ.žAVBH´dr*€°Ś`ţů@Ŕ˙ŹŤőÝŰ®© ă‰VoŘ]EÎv+·o2@ç¤óN΂Ĺá xÇÓŽĘ-?đWrvnôLqî#y?'ą¨N˝]5GrnÝ>ńĎî«ÔWţJ\/˛’F§jĘ#Ľ3Ekŕť ™8”ŇňXÎĄ•|´ĚíBáł{ZÝ˝\Ş*ąăÉŚĚYÓ~ŕIţ¬`~5kł™qň˙ p߉čý'"î…žé ?ěě ăďő®R÷őň^ xlîJ@Ŕ›śĺ_7˝”ŢŘyźvixŕéä8ń >ý+›s>ĘÉ-¸Ňwq)lg|9ą]Ű~{ž))y.ÎQłŞ}Ň+QC“đI,ŞyćTÂËÉÇôL}é´Ť v¶tˇš}UfŻPˇô«ČYŁ+W!őŤ ”ŚO»Ć‹w5űÉäYOIWJşQŢ0ŘŐV#EŮ첓ZĄbE  lţ¤‘sô'«_3\8žňL‡ţĘ»Äé?ąčˇśPń†ĺŽż¸â¤ÍŽű®R÷őę*Uč×”Ě6Ľů§\Î+ź>ç—9—Ă“Á̇ťé‚YŚúĚ}\Bö+/ť,Ía$:8  ú‘Aě{á ”áĂéçJ‘Ó“Řáesś4áŠÎHŞÍŞ[ Ugg2Ř'«–XëÝ.PÓů ˛o:YUš»ž@G•şÍ{ňfY˙%>V5O)o]ŠX[ÂĄ·ü¤ú.’%Îĺô·;7˙şŽfíLĺe%‹jÔ?‘~07Y>ZŮ{—Ɖďş'ľűú\*p§¦UQ“ĹDą•×ěĽ;•+Á!zÍÓéö9 "T8Í9‘y˘˘Ý)Ň ¬JđF\PĂiwÚě'gШOčěÁŠ·eěQyĚĽ“µÜZÁŰʼn¨Éża0wPU±mÂŐ ‰g98)§Né[l4±ÇŔĘ0 `ł1ě)/¬©°G Ü-Čí*8l޸…· ëä¤mŰ7xß|ŮĄŤŞ¨áߢŢÓ©˙yăżr#ź×}Ý׫«”ś0ď‘Á(ŠPcp?Wě.‚mŰ~±Ş'€s’T{Ă•CŢ—™O3«3SŤ§Ľ…j6˘ÔůuËólöß<ś\ ô޶ˇ»r Ťěw”;ĐÉ8SK"Ň^Čž:Y±±©kꦝ ôâTeä>Şă ěÄf W®1óŠrvîX|†a °vŚ‹ n3yîÉ˝ßŕl)µČ!KÄî§+—&×™ÚĄ)t÷vę[Î{p5…ąśňyP}¬ćˇÝ˝Ô}}.µt!ę‡ęƤ)üěÍzP¬éÍÜčH÷ßđ¤?gDă UJ¸fĂn GN p§Đěc^čü˛’Ë›3~ĺ“RÉďő°“·tx¶<ők§–ě·Ýa·“čĹžCUç4şĎŃÔ©.TbWźř¸őnľOĂ .Ń™Ç8váé_>Éň —ç]'3ayĽdľ—ŕĽ=÷…ď2śVěa¦<Ř[aÓűöM°ZüpňëaÇ M›ČîË ď'×Í꼯o¨R•łB¶ŻäeEÇJśUě´Ăąś×„ŐDďĄ:±‹ĹlNQ*ěľ`wxnş%•Ě..ňÎ-u^4AšÝnďµFTëdXnÜŐl©é‡ Ýbâv-qď¬öd°®Ľtm±˛§ĐĄ5„ł“ůˇŮŘ8«.¦F0ÇIŐ1ŮçjÇ޲ťş=Yę†L){>Ú«pą+D"€Ĺ¸Ňŕ 8+1XY®<úhŐfu6ňŔ…_Xá–Kxů9­MË]ĄîëŐU*ůsÖ‰‚GćÖ iÎľ‹PLÎ2ŁS馮ţŤěË™wY&×:Í3Ăpvö ĚQ8śô´Xâs§ÖŤą É®€ĹŕŻÚ yi‚•¦8qu*/âÍbŞf|z¶ĘFy`ߪL×Oyźś*‹Ů—»ĽéţŇěű9_áěQ»3`G°:ťvJąkrA8¨ âmłz?X•“ý^ćť@™_oöé€]·¤ĽśµŻűÝ–óźxgťéBSfäoó®R÷őę*Ő­± VĽ/ćÓę&:Ńéë+YŢBŽçg\›žÇćdy2˝˛ą*4ú":ÁD;"o¬”óW=Ő¨ÓčöJ’6¦“u$Ż«dô¦Ůý|÷q¦,GÜbż…pnť¶ŮŢ|ß¶d–©ĽŞ’wwŃ.&pżUś±T†SŮxWGµ˛VgŮn>ĆŘöŠpőP_±"XÉ?N2l»3OŁ+Lĺ+¬ö{ćŮrĺ¦G`t­–§_ăţqáŰ5Ü÷u_ŻĆĄâvš»µz'g-)^OĎK“żęŘpVç<5Ń܇3:±đĚË«ĺÉs·ÂŞšŮ9쇽SÎŤíY™ťéŮť(‘iŘO3ó{Äč®î«Ú’]Qä‚5ĽiśëOÖŞÇ•ŘSőd*íÜ`ě¬% wS7‹ëŘr.<čĐR‰I—Ľh|îÝÉ.§S«–8q_PX!Ł‘±9KöéTvĂR”'ű¨^NZě®»µÚÂŞVV_őÄ{_÷őÚ*µ8đawđÄ]ű`˘f˛{řĹ~±pS?ČĄ}ÚĂ9ő°ËÔ±ů ť§ŚÁ*—‹{‚ćŽO•}ňŘʦ’Ξ×F`rHôN<č(x· tâ;=YËůxöÂOfĹ6tĽăŔ›;ÖF”ŇüVŁř°Ůţ3ńÖńÝ×ëŻđgę7ŕ©T×6Şwö=ţÂ) ňĎ2ůߍ}ČéýĹ;1çÁYb˛ź8=c$N|˫ಣA‰_¸ŹĘŢ!Vşî5~śPşO4š>‹«‹Ü ćL÷ÉłĽ'hčřg|â`77Ś8ýĹYĺŤÎ'Ő»·5ÓziÍtšÁĽŕ ŕŹÄŤşEŕ{Ř©ŘÉîŚţÉ[D±Q;ř3űŇlŤđŔ‰wî冷’ŮZńćŽg˛~očÓ.Rçn÷:źŮ§ť˙Ŕ×|™•1ŘĎeęŁÇYżě¨»JÝ×Ë{©AޤeđI:đ¤śÔ…ö'‘ĺ̉â@g§Ą}Ói×ÚaÖPŻÍÓ™ęŮÄSĽĂ öÍ•_{Ć g¨#ă‰Áý {Đ'!Piżvů‘gX¬Ďéą+—9˝€xNä÷Ŕ›üä×$¶”rťä<¬Ů4ŹvLÄÇß•Ľ)ٱ©u ws}Č›u?ťjĆŚÁýÂEÖkr-j˙°×/8מL«ž’+;łµÓ Ó‹Aţ0+cľńyî8ůŕ{¨°ĆăćJsđÎťˇśĽ˝«Ô}˝~ǧôíf}]'"#B¤ş/mN•ť˙•˝Ű۱抇«Z±+et'Nj§}N Ďčéł4«ě¬©ŹKö ]Ś'xďźÜ» 'čÎŤÝŐ$Ű;inNü™·żďf©«Éö#ot¨;°ËIٙӤžE4Ď©Y33ükeç餬T¬ĚűÇ C řő‘ySrţĚô V‡Ůkág@NĂúëH/ĺĆťĄśŻça°·śčĄ«”ĂčĘćë̢¸ť[îë;ŞTŢĆN?ŮÁ1l:Ť‰čČŁ6Đ˙({#y?Ovąy•ťjŇ<1Č‹¸r>©Ü€EëWO; 8m؇•Őö ę/zK9s4/V¤ĺŘý §KuÖ°˛©e‘}prĽĚ,WnaµžHěőY±˘?Á]5ì›ż §Ăy«Ë4‘˘mĆriXj`ńôÁŢ ¬şkv<ɧŇ\_–ÂXlřA¤/»[çáů|žě0;ťÖŁS…”t_÷őÚ*ušuܸV 1ÜŃOdüŤ)ľyšŮč´8ŠĘó.tnË1véZĺŤŇÍľJV˝td‰VĆ.7ľlnA¤źĺ°÷Kĺł dM‡MŻ"9ŰÇ],‡“xuÇíFŮĽáŻĆÎfç'öÔě&®Mi=ů€ČXb=®љđĂ`o9%ŚFwG‹óމĎ/žf—ąmÍś¶ČN“i¶®çň;9‘±Bďv)ť×6łóUôŤ|]sA•#(˙ťf%ÂŤKÝ×ë«ÔaďÝäó1¬¶íŢÖ+í6q+ŞúőĽˇZÁîpő§Ăů¶%«·01ť4°«z0g f,I)v˛‡3ČQ¨¬ŃiÁŢMŇD<ńF/Ń5˝ r2•%[ĚäŔËŽŕýžPöLĹp˘ \1÷±±‘?p7'c÷šIôşlě;k×If¨Ţ˝śćVďx0#*ÓA5:?!:Ë&šcQ9Ĺ=ąV>Gwcń‹˘/’“qx[8Č‹•›ŕpľô]Ąîëő¸TC&—xÁ<Ľ™–^äÄęştOż¶„¶îśŕľeě 2¤Or 5OF˝PŰć$ŇĆM¸„±úÁ˝”˛Ę·îş0“YŽ1ŤsŤć˘AĹâʤR‘ȬĘV1ĂěÄî$uyľĂ Đî^RÜú„‹=Lc˙Ň +‚ —łĂ†tďţĹô‰Av—^QôN5ş˛ ăżâ"ŰSžçJ±‡»˘Ë9¬É>⮞ĆÔ:w—‘Ž\BĚ•ęz°Ă‚7w•şŻ×ďř˘÷"}E`o`y˘¬}̬‡ýOtbâĆĚéÖrTň§ű·2Zƶ=Kf#żÚ6ÖżĂ3ŐA}[dלѵrXŕ}ˇĽËĹúÜÉß/>ĽxFJĐ ¬b‘h<ŘQť[­®ÔŘu˙đI–w±ĎÂÁŤ^$ÇžJ/öbËŰXß=“g%gUľ7ÍÝcŕsčěű´jĺQwŞsô&6űËî¸płŇěz÷Äďś*ÉĺĹí(|_ßPĄ´á›Ş]ÎäŤ{§N`‚üŇ2±đ„'ż;ŮëNéâlĘ‘SŢP=ś:§sQěźľYZrťŞÄ>ľ¦Ľ7ďĺ˘ýGŠ÷‰SP$:Ľ‹ Ň»­zű^ČŔRb ¬Š|Ť`‡(öĽµ<™Fł°laçJYědÔőOł…Z!ÍSĘ Vć§’»fźÔÔş§t~_fW“Üe<éŹ%źÓŽOr¤+ěq5<óŠYÎéâQ5v_Ý|÷Yĺw•şŻo¨RbD'â‘Čęé đ´6Ł·ýڵ*uýâÝ}éa‚ó3~±7ŔĂł|ŰÄdjFtÄ–/úđ?›'źĘ;{6óç"úľ¤\Ęů»0]řÓ»ůODśřAôiwżĎz8éwbb?67&“ń+ÝÎ;+Đ«ćě/>Xć`1÷ź¬n w]7ľ=ßŐB'ô ĚěkV®Keo%FýĺÔÖ‡3™›=łŞ ÖîdÁ:űŞÓž9ĘţĚî™ÜŘ˙DÎm`݊۬_÷ő˛+üűŠîÝTDŔoäs‡/÷ŮÂíVâ©ČöM; í¦žxó©¨Ö füfW9Z <č°.|»ZłŃśv'·‡ąĹ{ó±é“ĎĐE¤=9\YÍđ¶ĽűŚGüô¤7/ăĘs§śŃ‰^ýuÓŰ,D`çsŃ%fVřŐĚÍŃ@Á‡5ÚŘ4Éźžţ: R(xZΞśÍ"]ÍO׬ßád7ś|?ů=ţ8ȡÄ;>ńżâ +˝Đů d•ÜA‚ŻféľőgâôĆ–ç~W©űzu•ú/d; ĹÍěŠ}ęä§y’m»Mo¦wţ©rf“›¶ÔŤLÁ`θSŚŢŰ)ó hu®.׋±íw§ĄÝ±8q÷—É|T?˙â^fiLş](ő•Oë|‚˝I˘ő% Ř’ą‚F+¤úU5PŞýÔ©<©VoďíŞ™±pŠrwúz·˘N]çü=(5¦QĹôź~‘Ü’wü+~żąŐ+IďŹ8éh×řxSmÜůřŇ1+ZŹ6¬úŔĂÝoâ}ěĆĄîë;Đó@‡_ÝŰ•Vµ\Ű”šž¸ý/dĎą o® ÍZ™Ä{sbśś26˙Ë{¦Âű|ű2Í4ęEW®`‡öô…w%€Áź/o”±©i¤dľśď žĽçĄB\Ľa1» ;„ĺĂ56áHVýrzéf–ÖSx¦=¬!®Ó}ë×ŕ $ÝR2ötš<ěĽvňv×S{ŘL„°űF'Téî“Ř›.?«ŔďÓaŢ•–h¤»”:`)ˇŰ]ĄîëŞÔę™&2;{›¦)ľłknş\s†wBËűrlyYęt‚‘q”#ý,/ú É#.’‘Ő١s–VÓĚ`§ĄlŹţ®94É©¬÷î^ń¤B"ZSř¨.žËö˝Éü™ŐněŤ[żŔŤ¬űś˝™‘ Céá©0˛ŇuóBżúŐ>Z±ĆF©wp'–ü8‰›‡`mr@Ąď`!˘˙ řż®ݨŞ÷¬ŐL´@&zň©2;¦Q ˘úů®R÷őň*%ľc¶ČŤ¸N2^®‰"Ň?huFęäŮą#;ń03AŮÜĹ Á“[0@.ťÎ ™]LűâËR­ › Ageí®Kkµ¸u›ĺŤ{Y —ŤerZ;OäÄp.âŮqK¨Ęt\î:ykĎ&EÜIŻ«@–Wv2C$rÔŚŻŻDa±0ş•6§9ßťě×â<†Č˝ŁTp%™ďeńď÷ظ ĘĹŐ켪LŐęO€˛ă;¤?#şź*îď*u_Ż®RŃý‚Ľľ›qŇh˙L±|‚3©*ľz{fÎ^ť=MÜüÆqibO˝’­ 7†9ϝ쏿6ri˘7őBÁ¤=í?’X1`˙N!E°V0m)]ÝŐMů˘Ńľ/K-(ׂهśfvĂů1Ă*žŔůTÎ ň7Ćľfx|Ń;NÍĘĐÝŁşëűŢ7JÁ'~l†n˛™pzőňěJü}wÖĎÁz,WŚč}Ig »#Ě)tj‡¤±yŢUęľ^^Ą*·ešUT§”ŞPéś]Dd;źŤÍM3ńě [Évmlä/_dýiŁÔÔĂ"ŐýOăŮóţäąY\xuwZËäk_N’S:{%O`lŹ÷*ł.&v)ŮľrâJîYÍp2geÎĚŕţ “Ńř·ŤřyÁ“•S§Ľ^NW;9Č*ţ„°%&dMwNu1Ňg˙&¦źD´f8™Ť+Nyt¶_°âru¦•3ěA-ÁÚ$‚Š$lŢ÷šö¦žĆă2Úu÷R÷ő-¸”’u,óÄ>¸ÓŽN˝jNo«ě’ďČĘĘ DQ±u Ýîłŕ¶Lß«9 ó@ô]:ŰdĺH`ż4O±z*±ŕ«ßňd€gŮ…ťG˘ŐR˙aóď[ÂÖ°O{ŕCĘjjެ­™Ną Ă1))w{¦j5~sU ŢĆVÍLd8°oĂBŮÄ'•ŕľ!áá]׬Źo<ĄÁŽň%ů÷cË-|—N˙1¦oą!”ެTôY-äB‰]ÜyŠăŮťŕ’̰jöŘ’Ţ2ZénąÜ–ĎËt„–SxďŰĚÓÉČĂâ˛3ĺĹźWŘfë¤:޸“L›’VýśîŢ<źu2SőÜAW˝5Ëfć0Ăxľ:yX%çâ ľ7™őkV¨=c0đë”őW­ă^‰:‘]›t×isĎQG+fśţÖ×fTĽ¶nŽ«Đ¬ĆŻżěuŞZ˝í»«Ô}˝şJ ďń·kި8[8Će\^˙RŠUłÖQ«i`Ň6» eƶ%ę>ĺyëY´µ ćT"O»7±Đősók»ś—ľ¦ŐČǨŢčuň’–›/ÜKÁ3‡źíŕěS©NVž_ŕ~˛±îuâÔ‰ _ťSY¦gś¸+U~öšÍY;ÂŢÚ–WzAĘśzĺ‰pÚĄ/ŰęŤV…\¦.çą*slĄs5{z ŞŹŞů¬Ź­f\¬Žë˝ĆÂ*?߯»JÝ×ë{©ľyëĎł|úó)W„ĺJ&MÉ!EźkáęŐőĺâ}WÝGÜܓʖü’okz×é”·}+~±S™ďĂÉś_Ú•"¬üe'ňąä*šŮoÁŮ.ŃJßOgQÁXsÁo›NYÄ źe"’“Ě•ęN”€9ŚP8ë&Z—ŘgÎŮîŤţÍLy¸'÷›sR–ΩđNŃí)#'™hNXç–¶±ŢĘĂ{Téđ™™Ë ZďVł»Ë¸îÝ˝Ô}˝ľJ- e~&'ľű“źřLÔ·:ÔśeŽ ĺ>ěF5ďľĂX9ĚíÔů»¨1Ó}]~ßŘRL»‘‡ç1!N"»B +3,»ŮŁp×ÚâË˝ʬ”ďvx€ë®Rßĺ Úżđ¤ÔűµMŹĚdĐYî_ÜLĹGú°v(ş^u"P‘ÝŇJ°XyÄѸ`ߪ⩭"ă“X’żB¬vǡ@Á;·Â4‡ęí|"Kę§+ŹP™3%ÝLń«­ĆĄ*ď‹o§ŐWVŔäÄxit‚ťqäÉŐýčŃÜŇĘž5p˙¦sů)Gţ.&’‡dG‰Ëť`!˙\(ŕr˙LL˛â”\SáÎ.łË[~—Lu·ą=îëőU ŢÚöř–8zď-ýlúÂ-Z,źÂÝ}ĄjypÎ+ě”O÷5•XKÄŔ‰wčń;+U°ĎjcW¸|‡/ľGë°”AR!.zń©:űžv€źýôgí{⻯—_á?ŃcĄ§7nůÇ–Ú˝ŰĎ[Úz·O‹”ţ»çĘeŐď‰?Ń«Jśč$đö%µ!Ůq}Ą6ĚłöéÔ…`Ż‚N4?ş[›řÎŻÄĘę–/ÚÉť–{Rť~؉AŢ.žîčvµ^Çďěą^ĽëŚřwňŐ«{Ŕ “ű˛•ÚĐđ°A˘‹Üŕ/vO¬) •®4kď ź§ô˙’ÚđdmŢSŠű©jţfaçW6r"Ş^ȰÚSš7Ą6Hy Ô†Hěí(|_ŻŻR˙…˝~3{Y¬ż‹N5ăą˙ż°•;ŢČŽ¬Î—š(Š4°űvđ §ýV˘sŕ–Ş­’Ĺ®ťĽ{SGWíRÜÝCĚŠ%%qsÖÝEô¦˛›v&ę<ÜáT4ün›…"qţĂĚŠ«ćşĘ?yn~ÚÇ´9k5pî‹ěg_râ׌NAůovţ„äÄ÷uéĆËá^0lľÇ‰ż»Ĺ©˙äÖˇy#˛D›wŚŕâÁŻ îęß‹fľˇßMňk ĽÜjăűzýÄ',eíĹĄ €ŮJrr;™ĄKNGĎč8č^©4¬Ř_Dš¶y7ÎĽ÷ŔýC·R8Ň÷Iű¸nĺkŕî[^"ť ˝ťU¦Ó_`Ą›7˛«TSşť:»0uJaŰRťV­U>ĂJĄ\†2‘ĂöżáŤ¦Đy áĂŽ§rÇĚt2Ntß F´‡»°ĂU˘“Kěz¬9\ůś—=,V¶Ř ®éÁśź¸ů&ŔÜňÎ.©ř·$© äÇĽ‹dڬqţoÄ/Or’˝bîëľ^ąă«V¦4,˝j1GoÎs.ѡĚ^ŁróžĚPď·Ťű°jUß…Ăěϸíýgî^ßŮĚ)çÚ–ź8&ł%NşĚ ˛É«çŮdţą\saGíőfZžžĎŕYĹć‚®ÚÜŤËŞ`Üv§.9Í\h™’ S;_çI¨p%JíŰ…‹ěţäéěb˙)_ůŔZ5YěĂZ𥱛¶Ą°ë Î@N[ĘŘĹ*Řą L¬kťfˇ“„2ÚĄ:î*u_/ŻRÍ>śasË v’ڬN¤ćh*CNYQRú‹m®Ž%;®炳„Ýć]:S v9®›“zä~.ŘÓrbČwc+9YĽJŕZN|+« ˛«š>ĺ‡]@÷JĄĘŹn:ĐÉ]©:˘›ý•x˛ütÍR7ŘŤî%ă_đăi^”KpŮSö^wîýĺĘUpÚĄąQ¬ţTľuĂČ–˛v*{%m7óš«Yń…—]Ň žÜ·€ůńâ±vűŹŢ×}˝¶JÍOóE &ą%bDÉwÉÎB·`ţLäą T–ŔŢGB\ĺýą6XđRŮq[şçLďć?=s\Ôâ(™Ďu°X.3Áž“šř*;aű‘Ęů\dG%ű¦Dłł–·Ôʼn0gÎDr"ŃĽîDR±3]ä‚Ńnm,»×ÄÍŰΦÝé˵Ry*«xt~ű“®+0{"łošłňË`VÉúšęţ7lěőĺýÔcUÖ|0ąCßŐnôüľľĄJÁ>łŚ3L˙í‡ęĆ{ńđĆ«rźźY»™;š/w2Ů.js[źřŕî-q*©ü¤'×îÎ'qvkt¶\ťAu_×·%­ÚĘ^N÷ăôÍ1\ľZŐ<¤ä^±łŻdŕ–«Ăë›O–\ĺ*ť‡“_ŔzĽ”ľJ°Z ď‹»¦®'XUÝY‡9k Ői]™Ő°ÓAîwŤ<‹@őź’ŢĺY|ř™ÉÉ^±¶őÉÁÜŘɰó^•Č^>î÷u_ݬR•Ľ]ŕ}ÖÉĘt±“™ŚbJV'·$oÉĺçr°g¸ĚŢid‚vçľeď·’QgM‰Î%0o1"ỼáŮďé䙺q–rvCŞĆŐ*{4©h†µľňPSA$«FÁgöŢÂćłknp˘‚’p>đćź(A¶DĂ“nĂť“e46'ĚNJĽđ?ĺĄTn1gôO*‡fg6·É“>Ř*y~Ͼヌ+ßě4Á;I§˘{iĂó¶ ›Óú}Ý×+w|Ýj]íÂĺ÷Ńí0Śč†mNéÖßűxHS"Ő8#<ÍĆš9(J$Nüô_ž°›‹= .Żń>ú‹Ëwi4ŞL‚1źĺ†·ÜÎĆÂÓ~ä`ĄŽ[g(íJ0˘&%Îtđś“n$ʵs¦+î$3Ďz`íýć«{xĂ #ÜqűłäLP9ve{mŠ=QŚÉëĺŕłčö˘ÉöDŐüžś=ßśľzŘ˝bâ`óžrpn|,m ÄĎż3dîë;p©ŕ™G(MvŢŚCG:xÖ-sŞ™}3ŚMKéÄ(ÄľpŕÄ/¸đ´+ř°ţNŽŮ|öĄÚUšxĄŻŞb§.˛7©Ë Řß@Śęád”lĺÍéY+pžhDË5ĹÎşÝů§Ďćą%€e<ąěd>*™°lŕf 'pšŞ›ßü°gŞ˛r”ţĽRi‚•ŇRÖRíf™ @—ý ĹŁ×tźřh/x9%â"zď3‚;X}"şf:§ôF÷‹űşŻ—^á?ox.Ě.^ůoěâFˇ@N¶| *WŠĎÁś?Ľ›ZÎę~o—J±´VÖ0ȲlÜo_[ŞBĄźŢJłTĆeä”ó÷üÓŠ„_9ÍDŁBŔo ä±rřžvT›WĚtÜ#ěDÁ‰?PE>ŇÜ ţff<36ü;Ä$ď’÷Ť“çô‡ů°śg#gY¸ţý=˙ô4ľžŤyÍ9đo×$¸˙J˙4ŘďĺBĹŢ8'yó‰ęĂ5źźvhH_Đ´{Çw_ŻŻR˙…gˇĹÎsqoíÎ…RÍ€żGsN{â¬uŮ3Ő?=˝éXqŕoÜ›§ AęxsÎ6ďti–÷© [˘9ügâě5ĎÎIÎăOOˇcsÖ9roȬČÍ8U2ďýéJÜ•4Ľ±źŔ6÷üßřaŹ›Ëî …?V#GľŤş$ń3ĺ7·24¦K]đ»ËôÜúbĎ˝Â'ě 5fü•SśŇ5˘5?‘úÉĺ$ߨ,jŰĚť¨öĚě‡7÷u_ŻťřÄă+ŢźËĎMGĺn:đÓcÚťîLťN˛'ąçb–g&` wżŘ—$N 'g–â­¬x9X‡’» Ą*Ă —Ýsh†ôfb çĂ-¶O  đěŽ)¸ěôĹ%WÇ4<˙¬DSĄÂé?ĎÄbV“ĎÚťEřĂŮťpŇůɵ ’) ëŔłgŐLg‡äLősŤžĆŃś4eĎ7îŕ„¬ő/ÜŽÝŰ})ÇĹy˝ŚÍUVő‹Ż¨Ó<ÉAąSCďëőUŞp:¨_t2JńÎdNĂ›˙ć”ŢĚigi•Ť¨6ďµ”76Mkeg%TŁŰ©-@©Ţťg;Đs}¸gXąpĹgă2!řÜG˘WŐ~ĽňîK檣c{öf}O2łJÉĚ™Éô‰Ř=Č„WŠE§ňą[ Ł Kţe?Ôůlĺý›·|öě׸v++˘»Ě*?{ĎxřňčtžN꜊{®oN:K>bɬ“hö}ôÄ©]c2SV3Ľň2î*u_ŻďĄ"÷osw“8ŐÔÍu`§şĚ¸^ęŠĘśŰŕŢyJ_ÖWůIŰ=wXw,ŐŘĹźżôúRŢĘiRłćAç¶`—„äž°ń,…-寚=uAěŻć畜用_”ż0đ —Şnyč+7ˇ;S}ĄFťx'–7ěfŁŚ/O•üßJQ•˘GťŢg¸ß©ćXDoéÄ9x#ŰvíHxâ oDś¬†ĺx?'ďâôuq+†gŃj—>éő{«žŕ#ßµ»JÝ×ë«”24ĺ(S¦đł »Śśť†·Rs3ÔÍOůbJŇŕŮXŽÝÉ›&iÎ20“H˘;¸F §7úđÉTľ^cW7'«ŕĺL˝lŽčd˘*ĄA™[ p&a"®6{Ź'©{+ÎG}« »–äôáfÝt婎fxýťşÓ@wŞÎ ޸ů†W˙ąd3«2w™]é‹™#ň ô›zHI|ÎĐĘ`X›ŹbîY´p¸.V÷µĘ÷»ŇHŢUęľ^]ĄgÂĘŁf?—sI°–cyҧGk6´ő™zÔĂ^ŰŃ9ßđç~nľ§Ć¤ceBEghş‘NO#Ůç9[fLň°ł¦®ě—hĹ_ŕf+R)6wőĺ–î †=7çc]ô"–«Ś|–»Óí˘ź·ú¤Ějě,,ĄÉpďrŮŤ/|a÷grjŹÎqŹ@®tĹ›Ó^Ć…ß١îâ«Ě|Á=*üěq211*_m$¶4ľŕĚk; »OEŞd=yúJ_ąć˝ůÚNć('Wń‰¬¬`§+©4‚{Ő…żi6żŘ+'j:˙K:ŁÄ‰›nOٸYť÷ő Uę⤤Yp"Ut}C&]E@żěho§ťÔĹÝÜĘîţdW×ÁB˙ÎÓę:XVíŠtˇ !ł'ş§©«l s9)ŁN|§w\ruŁ˘»‹?6ÍŚćdá”AńÝ߆+W`ç¤G ÎŤjw$óŐÍ ćĚtś‡źřłJ?É«ťSůÁçRÉlŤ|&KçóÜŇ=ὫPÝ1@ħ٦ɾô ľ§č1¦KÍd}…Mźs'°ß×ë«”410N«OřĹ’Śôbyn˝ľ”“㙸‘®_ć*ť¸°MŇŚŔÔÓ™i»_Çmę;ě‹Ţś?Ł ^ÜXŹÁŞç“ő¤ł ŽÍ˙Ii3ĹülgőqÍ[@9*DvtÝYX“ŮŘ9#_Ţ3ú‘7:h'(]na“<ź w»vđë•<,ßń“şž•ÉpëžMĂţ|sňztÖ̧ůhâ„ÍĂöŇR~Řr môŮ»ŘńŁÁś…űşŻWâR+XţÁĹÉnz0vş\™+Ůĺd é|U;“ ;dv˘(ÂĆąŚsĆxn®+ĘDž~–«r)CYĽ«Ó›łfůtű+­ůe©đ”yÓÉöi®Ý>”kv=Č htż52łOŕĆ/qżßńĂNNOVťŚJeł¶‘ýYbvD4î7řX.ŘójĎ(d0uYů˝ź¬szŻŢČâÜ“(…ďŔé”2M†ďô"gđ üÄ ŕ°C4…Ů|´ŽrgČÜ×w\áż!p>ŞÔÎŔOß‹WÖy¦Ň­1K.ńżţČ™,›Łť]µVšúě~s–qçÎ?ă‰ÁOÖťîťťfŞHd»‘9ý¤âV9ďÝě§h'$ąH=0ńěÔ€-s<±wśŹöN?ßî$ó©"yŁ+ÓDb°ië[?ˇâ ˙•öpöVDĂ?mjÁčdóÎ÷Ią;ŤžŐŘŘJ’Ż€=Ľ°íf¦†ÔŮŮŠ™ćű€R—zά)‘żĂl±ĘŚ®ON•ŮwĆţŃżÁ×›đWbRł^Ě˝«Ô}˝~â«Ô¬¨ŞĚDÂ9n'tš)M?c%+)äŹ=9 Ź/YĹoD€ĺYśĚ{xŕä6NÓŰŕ9Q&Üé 1n‰¤Ńůăâ2v8Ę´9q8CA›3ůăť|ÍNNş•¬ĐH´ýaä‚‹®€'łp˛ß ďN%ĚŔ¦ÄÓVB~îšü)«ŁóŃ•2Ńđŕ–żqď'ţéJ).ö OÖú=7żŕĚšUpććaŰj’\çŮ żăbća!öőÁWS67Şh<0Kčćžß×wT©fłĆý›<ʞť(•‡ X°ćDĎĄű¨d|*ÉO›®„ĺl˛­»sőN<»0ȱśnpk·_P7ŤÝĺ …ÄZđ´÷çĹź/­aµĂ]p’UŘ\şQâkKÄ™š“BÎvµvX©-Ő .bŇs9ŲĆëçć`°käAÓŤC‹ťÔ‹i·źŚĆ7ë!aŻÎdč`¶ŞŇaçµ@šěŤŘ»ˇwâcŐĘcq0U<ĘFÎŘZé2Á>ÄpO{_÷őęźÜ8ޱ\xŇR*űđý>“•,]jđQíů™ŮS]<­KóŇÍ_^[(±Ł9ÖS%«lŇÁDňn4ć •¬mKFľUw´61řôg+OŐ±1é»Óvśť˛3°ň®fóp ´zˇĂ^ëÝ쨾;ň·\.R‘Űi|{”ä)­›1Ľ—ŢBf;‡ňĘQű‹űÇ•~šÉĎěţ]+™şřý‹Äě䊢•ĂłđÚ0LÁiW­=żŻď¨R0Ě O¬pÂÂĚHôBkĆ-¤čŹětŐŻJ M_ÎxGžÉ0•ę—ĄuĹ“/žśŃX ł±.ł§:˙ľ=R#ť‰-ú'HI«í#üę‹sĚ•vםŻ3YeNî̲]¤.<ś‘zĄYĚöĺwPXá”Ě·˛)‚]›őK ¨8é<źí÷Ů\mTCĄ_ôŰYn2K™(Ží`®áĺűŘŻvz-ČĄON©Ý9âB›JÔ‹Ď.ůŔŇ#ßž÷ő¸ÔĹ”ňbIyřçgŞŰşg¬“••Hlç@eýŰćn׍)ËK3Q˝vąĎhdLÂçżyąě}0č3ňu–ĘLí~ ń9 !*FŞ›ź5üě&SQ[żÁť•\ŮQęş7rOVé‹ď™RÉ+űŹĄó»ŘÇL‡9ĺ¬f{ä‰uŻWpÚŻS ÷•p3ĽV:&ÎߪT3ŁpxżěXľt0˛Żgu9ThŔ×Ę<7 p÷Ü˝‡Mw/u_ßPĄ’7_ yEüęL%ŐPÂ/ě ťŕ&~@Ýň)ádŞä-nIiËţÄŞ˛u„¸}ŁŢ,ÓťxmĽâ¶I<ˇ(ľă'YJťťŐ<[&,:4$:˛'ĎpšC;îÁ»ýÂNhŻĐěP>6e߬čňîx°¶«Ęôä rO0qŞůÜHĐ9mG:Ç(}XÝj`şń Ď|÷2~c/y˛üu'‰Ü|4Ö.ĄÉŔŽĆÁU1mÚéĘşuŘëýĆĄîë;Đó†Ě{ă¬SŃLŁH?ríü+Ţ:ŔĚÂČú°öOĘb Ľ_ŢŞ«í±y˛Č“)™ą5xw>kâ:g:ĺSç1E'ĘĚ.0±oĘv°Sś?ëa·OŐ»‹j›ÂŐȱ1›ä'&|Ł3“ě‡nťAŁSîäĆŮ\óťąwť.Éž Jä÷4ŰSî˝0CpŢ›?µQą…Ë7°ŕâ#4{l­ôví‚q©–Ł“’ź(üý]ÎÂF-ámăó®R÷őň*%Ý6eŘiĚeXÉ7ě¶’xňa=š)ý}™ éÎsŃÝ;Ŕ9U™ĹRěN/Ňňg͉ť¶ÎfÍh‰Ľĺ8 36ĹS/öÉkÎhIv kË0ďâpFű°ëßě*fęcä\^ě†!•Mµ3žňëä×Rń€rŽóŐ›uĐŮţщ0‹a%~ŰäzdűëTnüä_Ţ Šwt'čĆjŢťü óbU! o­h?áäËś=µý ›óç}Ý׫q©řdÍnęźxł?XZťü[˝˙j®É›ňčŠčŕ«©ov$'ŻJvůěRŞŐĺĄT‰ę(ĺFŚËÚ’‹HŻ”†ťđ€őarÚ `m ¨ęd—Ŕí<ĚI˝ĽŻ«(ôëU˙ŃÍŻú;9ĂŻ”áf”<q«ôZHô"–j˛íŠ[–ĎđćŻ;ő&ó=Čţ Í‚ĂČ÷âŁňř/ÎÚň-_ćáZ“čsÓ¨ ÷´Á3öňW…wÁş+ÜUęľ^ŹK…-kłîř$ÖŇY>=źČačřŔ/dg7âéť›´yNň0ń řł?Ü3 şĽtžhe*Égí˛nfb(âMOöĺÉç g–q⛟o¶˘­â`M®[}ťŚÍUE"7mňNäšÖ±…ŤEŃđ“Ďîi^Őŕ$ÜŮÉťvłüdU<8AO„üű_IÓřóToź¬żáŹf=śIÖéČŘÁ(QgUśđD"žö˘PD·ďĂT#ä‚}Óp•\Ă4żßUęľ^|…¬°[ĽĹ«BóÖě ˙nF‘]R·ÂB®qĹŽďÜĎ)UO^0ľ0"#*ë_pĹxŕ‰w˘?ÍhnÄŔ/N lěH €OâëňrRĄkôżJöČřwĽ=’îfî´'ȬťÉ™ĆŞ?ůŞ.2ô2~â?â“l÷ÎIóBÁŻtřśŠ•°µxJÝyyżB<‡Óúę'ţ> ŻJďŞ˙J·ĐŢĹi{#ű"°ŞĚÍÄŢ+:ŮP@Áţ“^©Ńlś6ńđ>0ş’%n%ßńAŐܧŤŰáľľ=?x ś"Š÷÷ŐŽ&Óǻӫ7X[ěś-¶úpŽ_f­>7'§ť“źřAM]Úâbeţ¬@ D^2ŃSçO"şşŹĐg¦oyňv DTVĎÔťĂő†™ %îQă̸sSâŐĘk‰ćłV|ŕB5r¬^~šĎŃŔ5ζ+WbV˙ěÜV©č:~óĎzVčd) ™—ţfŚWw±ěöŕDŃÎiĺD /<í-<đ“IŚ3[Pn¬SŃ8Pťx–íü~ăR÷ő¸TłóQgßúś»sééĄę Î/fřČm Đď©ŕiävY[<)=2§‰bfĂä <ťě9śU7$ޱf~wŰXĹţÁĂ1erj[0ŮK—ž.áÖuĂŘŠÝů ~ň«”Ršđi۶é ćhžb5#^Ä˝ŇćZÚ7VĄ<“S\:Q©Ęüa=Nň´śą±S7wŘŤ+şÎvn ˘”ń€ő‹W¦gŃě2řý™óű›3Ä=ąŐĆ÷őú*•Ů»LGßęŤz§ÇÚr7*ř :Ľ¬Ooç†,1Samz5˛‹7™xďş9Ą=p˘Jś61&%ÎuY*üɬ|ŕą% o üŞ9SĘ­ŞňŐ$'h·ĄÇR2đ Ú[–ŚŕĄ“µ°Ć f¦ÎžÉ2ßßÂ.¦Y˙Ö‰éĚľMŽ żšaç<€ď['7ꀋ;ĂL­·±ň¬"gćć®1±çĘîdĺőĐśÚ3ÜÓ62VąÉsýđ4_÷őĘ*rĺé]x닼oĄŃÍމJxŠě8„pČűłlßSO|Ý.o™5Q˙ÚćMťlâĂę°É(:Ů ¬b82Żіî¬Đë.9xúŘ*ËsAX“2ëeá<)&…üd [´?“ú¶•ëŢWJpbÝąžÁ:şL&Ą_’Ů­żáŤ(~"OŕŘÔ'ŮYŢs—›úÉIër¶Éŕ^޸S2¸t;Ńć“ř¸Ř‡0B®.P“Tˇ‹ŢäeEOdŃ®Řx•K}X™ł©?=çh+XëÖ=Ý g]"Íú‰Rű'$$ŁdŐ€B›’{®O§Ý5k…˘•-‰Ţ9•,ŠĺÄ)N—ň_/ł3˙6;9ąş2_®yŕ¶Ż™?_ŮŐĘY"“áěń'oăűşŻWŁçŤ–•gVâëł·ţEʰč”nO'yŞe2´ÍźśIMHđś×úć—78cv{ľĚi¦ş2 O)k7Xäw·:ĺt«lAţč`ÝmÜ$>ń°ďÁÍźö ‡5›gąĽ¦"ůŹ˙€v ŞÂŤî[iCÔҶqÎimÎ_ěÂ@áĽeé¤VĽX3«Z÷;Ť·uj”;ŮËoë$=XÉľ•M™ŁťăĘŮ«Nq¨PN{"s!Ű·ůľîë•Ujöëqę`O(9\NÄ•SmqŇĚŔořdW‘ŘýÝôtO"˝Ť;§@L{ÎUă_qK®,Ľ›w#ËRÁ¤Í{® Éxoŕ 5ą sâöŮ“†ĚműÄľfVčÔ†ŔŢ)mťŃîĐśIĄé¬ůYvFN- ťÜ/÷YĘ•Ăzpćł\+c"żŞQĺ¸27DžżS¬î¬™;ŃřŃHčŃĚŐ‚'˝“Ů9Ů.ĆŤýnŘpľęŃűşŻWV©âóŘČÉ™.´cKÖ{l'+sB›_ŮÉöGť :‘´Őľ‰ţŔţ%ĐGnâ,OvL3 o=Z°69řu)…<™ xw*Ş6z˙Nžh łŐěSţF|*đµéuTó)äiÓńʬ1ŤŹ7‘żżň7ô4c+˙?ČL<§' žÜ‡H[0űRąóÁ÷ŐÄä^-°Źű•ŚŤę=čťz_ß5ńužĺ&4noń×xŻŐ¬Ěż8ĎČM‰áŤ©”qsDź;®7+/:}ZVňwÚ0žĂ;§së{¤=)¬oŢIUwhÝóÜĹ„¸áÔOME'Ϩrň†­WűW{ɬľzMąˇG*űfžjŢŇ–멜N'tNNĚÁ÷Ęaw±ěurňyLŔźo睤š ¶–˘G ŽË~‰zĹńoŚŔö^Á÷e÷%ç® ĂĎěsÁî-8!âľîëuU*ŠôAéν ěE.Dú }uŐ>­÷]ꏉKWň¬ QŞľ1»«L&ÂŢÉôä'5ź+yŤ$(ŻřÁ3|ßž¬ťŕJĚ*ĎÜť {QýČćsźě<€ĹŁÎŁ™)¨Şs¶MŢN…aKŚö8€­j Î^“[ôyó‰ZGĄîuşÝĘŤ›Ęfń'ÖÂJ”n8‹oţĆŠsşŢ×s€÷®ňŢ㥿Ëf vŽŘ“’á÷éDć 8ßIW÷őú*•č¤rđ¬ <đ ĐĂr± ş]‹`.M!WZĚĚş±¬.˘™›ë mÚgUśŽ2Żž(dtÂŘś:;±ČLŽMrĄJfĚ. 8­©ŇEwĐ/e9űÎŮT\±Dől·grÜü˝;'2𻊓?™ä pĆL§v®ů5‹ČĐî¸đNŔË^ÝÝc°çÔeÓáM řŇ1aÓjccÚ_V¬|™•É|y?'Ü[™@Úm._–Č×X±ă†C:ÖQßUęľ^]ĄÄŤĽÜŤĚ»gĺľ/P%©ýŠďęÝ\ĹL–t˛/är9şřUšÍ2?çňĘU?ŤÍíŚNAä®KĎ‘· PX•”W×ń@'ÇH»0ĺ2Ŕ® •“̧2SgÄ(o[żč˝Ţ6^yňą“1X›‡=%XŮŐt;lUÖ'8Ż88?˝ó~ˇs/NűŹÍ1|wâĆSk|ý•“ëŁJô·»Śl7'ż'o.V.a°k§ÝŹ­Wuł§§śÉ?\ŽŮ3[ALđáű~egµ22“`}PTˇ@vĚ…ŕ)ueÍ_äTŹ Í› J|/”­9ś›šŚQź›"y˘čĂŢ3ß±ŕďÖě«Ä»‰Ó}ÍŻöFVÔ¬)wĐůćÁ =6ňČůV˙A,üéŚřĂŐü˛ţľ?É‹KSÝeö—< Ą?řąyluÄÍîëľľgÇ·XÓŤl§Ëx”ş—ćÍž¸ĘŽ v$¨¬Us‚•"#mj˛mävr“¦”ŞY Oďľ•JGĎ€˝.Ąy˛łÓăH«Č’/›V1s‚‹¬BËĹD‰ĆÂăáéÖ]‹Mrj î/ ßą‹g>±éěM–N®{*S’]`˝žŃµ>‘w„“;ĘNöČ_‚ŐÍ;$qîĺ*QŤ¬{ ŔiđťL‡ö%MK›ÚF¶oçß(łg¦|)[ź“éR|W©űú®ßÄ‘†·MRë“=¬~’AUé?÷††Žl]×<O<66ö°/T#2“Ř3ÉIiţłpø’9»ťç„%+ŹďaĚ]ĺďÁŠwŽ{‹ĆJňH<8šc-L(řŻTňH„8m9*'đ5uÉ›đĎÔĂDv`Żú•Żrfói§WťlYí3*>XŮźí“ۆƩërúćąPµě†LőJ‚#qƸmgĺętNŤě@ĺi5ßźę}«ôŰOW˝ĺÂuW©űzńţł9ĺđ®mąDaËč®ř.ąoř őtíKę/Ě®:¶Nĺńä Ą”ĘŽŚżŘ‰Żlů~˛V8ró¬9>ś´2żâĂgNžxLnˇ™˝×ż·>§s–:ńŔiÖ=Ś%g3Ŕ”¦zřÄď ťCeŤďČř°céJŠźYöűĂÓUỲä-Âp—śÁéď`˝?Łq'đámĽßkţţ‚'ą'Ý9Jä;đ5Ů.ČÁZr1¬ć;ôŽźö±8Ů ‚3rsÖ_%Ăţ®R÷őzôüÁ¬ď§ď‹Ĺ'"[YV¬Öčh~˘;ĂľčÁ:ťîĽdyMÝň°reŘ7|ň·ł ;CvŻ ćvËýĺ˛[ů''°bVdňF/pk¬Ëť.š•ĺe >é[*"ŢŘwď´ű?_Í×ţ0ď;zZÎvkTR*/k°żŚdjM¬ď™=ďᝤX3ßáF~Ć즲=h:'ş‹;ÓË. ťw´3‹>™íĺÄÜUęľľa⛞•¸ě"2ěĘ1¬ţ’s­vůÁ˘¶e sš;ýÄ ö¶ćrNĆ€*śThÍy2“qEzÚŁjrxä~Éú<ꋍ]ˇäľ˛%ű' 'ö4ŐŽ)`»ÜK ł%˘ťŕĆ–‰ÜÍVű-OŢđe^<üşŞQěl…QrĆÂd}]Äň§ŃpđëŨęF¶łÝä˝Ňq1&™ÉŢXŁ“3?Ç–óđŕ )?%9űQ§ýż¸]7_ęľľ=_ą^OŁÚđF˝›Á©€ä%ű'!ëTýH2ß™‰˙ c?ĹűDĄČËůĄ89p6<¨Öy°ň„-yTÜÍĆEď[ŢęšX§BŔ¤¬Sę‹Đ©„—ëŚ~ŞćĘ’¨D씩ÍëĚĽëĚnű`Z„&{qŕ•v¨Jy«Ťďë;ŞTĺdq•j8ÚQEůWr\»¬>đÁ¦ą{‘'K6> ÷ňܬś/d>ŇÁąĄS%ť>×üćĆţâ}üIÍFC ®tÉ8¶óaUZ¶Şúd3ĚŚkś\r+'»Â3<ąB™Ś ˘˛~€ yŇéF÷gîßş1ű9c%vgňđT~L`šVµçfvňMsBĚĺlÁŔ Ý'ąŠĂߍy-µ3Čë—Ś~żË/çB “ vČiü %L$î.fruł7î*u_Ż®RŐĘ`EpeúÔA=ÉÉ)¨eZ\?±™ŇćÉ˝•Ó^!žő»O{ć÷7÷rĘô]LďÄîiŘsˇłëY¬ń€„O§cbc\ôkv…jNz‹ü°úOŚnM.]ĺ2źŹ¸Ţ‰7™«Áî—bZHŹ×ĽßĚćČ&ę#'CuN™”r®:kŁ*€6“#6ü'’ű!Źň…éŠ-ŮîŽ `§r1QUˤ€Ô3¬Čř•háěZ®ÚĂN†‰ w/u_ŻŻR»=/íÄ©×ě3ě^RřËé"¶.UĆ ź ÄČ—ßš_Ŕ9Ąs‚)›óČę×ÝŘWféňlŠv#Ůqë`w>ů'µ/‰ÍŮN= \-/jcŞ{†Ć©PĚ‚ÁŢMŚÉÓÎ1ä!>¬ŻYnxňŢ‚u)™Žz‘l(p'°\R2ŐŇ+ŁtŤt™íP캢ĽřÉ=Ź[’ęÓl'1Δľ.uůcăOÖ.9Ö<Éő8ÍžŐÎPRęÝKÝ×wT©ŮÉ$ďĆ÷ÔťˇĂč桋[=ńŤ·‰<ŇŞ«Ć Ű;»­čNB*ÁŔůoaÜĘŤŘ9ŽÍ{~%űEóą.źŇl>iĚzščö‰ă‹“ŠćÂť¶6Ś(OgJUdŐTşzpÚfÜňŮ“ńđ]ŘO˛,łYÝ‹9•ŤÉť`âNOvhËŁ®çň^d«B6VÎŞď>rţť]+xęfővvYâ•$»7ënÄśOF/ëłďt†űúž*umšŹÂĎź¦¸ęľGţQŃîć…ČO˘Să҆2ăÖ=Hn¤ž vÜĹć;,śJ&“ĂĚölö‰Qz'N3OüA>P˛6yXÁÜY‹‹O¶rN—]ŘśŠŮXĚät;,4Ö’fľV$|gŇgîŠď•3b4/˛qs9{ŰťGp–NŰ>cú“&śÎ#“¸ôî ;ÍWgü$ş“.%÷pM]hWł»AâüÉd{’ĎŐČIQ˛ß°tݲfîëľ^WĄ˘r@‹ŢÚ$rÁIj¸Mg¤N%ëLáY3Ňť$nĺÖvnN*‰}V±;‰Ľa.cĆsŢ66gśXZÝńDÎa?ň)’ź{u¦Aq7qŕIeóĺ~ââĎ”×h"{t…:ůsş÷iÓů÷°{ztçrř¤ęđ.;¶'˛$÷JĹSg Î8mččzzŮĎ4úŮ "óň„č8˝5ť[ĂËĚ·™:öđď0WĎ›Ďň›ü`¦„6­“籸»| #Ň˙nř«î*u_Ż®Ró®Ű¬‰Čţ47ëÔ•żxÝěLćA%ďĚ4­LäE‰ĆÍÝR$>Łš7ýš†'ŽAÖÍńŢwvg…p'çhP×Ö9mt&ž«yVµ›Ň]f­4×â™ăśĎĽ˛âSĆgť®¬ÂSyü4.ť1|‘C‘ś‚ üÍÉvuîÍÎâ§Q®ÉÍ~“×9ď ?PťŔÓ©?ŚśřľúÚťĽź"Ť™NÝN'čĚę;+ĐtJťĚ‘±)"‘§€ŚźFúS@f¬,ź»żßî*u_ŻľÂ˙˝Ý[§–řźÔČ&3>ÍSHÔ›Oü˛u/É»¦ßڱ.×qĄ,Љ=éúŚöś›öA/HřŕäŁůsv Ć8lŠáoÄŇő1 Oüąá‰ÝÎśŇţŚwc=J˛‰x'fîéç#~šą ÝđôH‘ P®ăü™ščAÖę‰~â?â'gŁĆĘ ň’–Jyvbżŕ˙Ä;«±&Ç„Šß“ˇ‘śö§ěĹŔ˙ĆÚ"”ŢyË™xöÎ˙Î ľ»·ĚäýF˘úŤćŻřßČűv1xÜUęľľ=ź3LôśpZW›Č ĆŘĄC)DY2·C'Y–g™hďągž `ą‹\gégŁvß´’YÇćŽýAÂň«{˝)ŻËbDv†9±b*w“ č~¬üDZŰWłqëvrS'Öz2âóŕ4'‰{éčć^íÁŞ §e5+w*7Őn›ďHÜ;4{”F< Ó¨QZ •hwŘ‹ŻrNmśťw"+í@Ă;Ähű°ík䬤źŢ”Ě«’-{_÷őę‰/Óg öżŐ.-VŻ Ă]R¶‡ůT~\<Ń—y„Ý~ŇÂ%:tîé¤v÷{bw&{­ËßÜ^ÜŤË“N›´ĂüM)śÁóěŢ;ąőŐ,úężöQič8+7ŚĹuîđ‹—ťú2ߥN ŹXšÇ*~g-Ś‚ኪm:¦Ă›Íd/v8i˘[‡=ó4› n’orjľ'4óŕ"Ý`ę¶łmüz!ákţěväOŞÝ‡˛3”Ż$ś»JÝ׫«T ÖŰŚő®|Îjoˇ±8«użťłsĄĄ<ČwüŠ?%ç’ ýR>ůLëĚd.eŔ¬ą țݞŇ4O*…îćb=]f7̬ąjÉkIUapŹŘČj¬LɬźhT;1uŞűÝěŃ:wűÉ)zÁŽČr|oöxĐŤî‰Ŕ“]éśľ qómôľ ŢV@ąK3]5!ŻôQ8Ż9±°~›…“ďŕ´ź6•u°‹_rż·$es­L×Ć Á]ĄîëŐUJzłÁÉLü&퀺ó!g.h´€\ă†Y8™ÝG 'h×~Dj9Šł–ä©[ě°"§„âNj촒Ľ:'Ń8°pĺĆ\‚ŕynÇŘÁsű`ýťúŕÎýdđ||6…iu:TžÔ`Ą›´{S'¬i/9ÁoÓ5ĽĂ 'Ĺ“ô°»góöo©|ł´™X0ł\ŢĆ€ňř–?ýŠŐ+ÁNyJŔÖgëkşUÝű„DM’ÓťüTM˙ż~»ŕÝ×7T©=1.‰:ČyZŰ—=Ź’Ńh°IöŚj<‡Rk$v…wţ‡ŃßĂ÷ňËŽÝ ¶#ďĹľTMoîA´)Ó-ň°˘¤Ńˇ¤Y%ČWOô¸,€˝K*.{\N~‘oňęź`d Ŕߡ÷đ&WqušÝ~z«iÎţ«Ţ8¨Ë|PÝřdg(|)»3jL=NÎĎ TGfë;“ĘVŽ—ÜĂäđ©}>ŘÁÉď®Óßt9ľ_äcn†gxíWňĚ]Ąîëőčą\‘ÂĆŞt;Żśnľ¦4Ěč´Ó0Ěj^ç-˘ŕ´˘¬9cXŽşÝ®’…îR+|*2V7ő4ŇŐŘË5&žFY–ĂŰĚ·IÄ»+bpřŕć]̆˾or݇÷n°CxšÎR:*˝en oĚ2=ü«ĚáX‰-ŮÎęaËgŤv” ¨Ü Łď•L€Ęi.ń+ŁS—żî$W•ľ#8Yoń(ÄÜ=ČÁęî˘ÁűTĺ‰-3'đŢ3ho©űúŽ*•ĎČłvřłżň¬Ôůh­8Žës?]‰"§”nôľĺSU«l*˙?’‰Ř­OĎáĺżÉĹTbÂ<ě;.d·™’[A´Rą[ Ň<™u"Ir¨ýdN~OŔŔ“(˙ňHv O 8k&sÜ‹·sţĚŢćźôĽËřp‹gí˙Vrqdĺ¬ —Ý\:9!0běÜ=ŃłD/ü°FţWÁŚZˇďßü8—r žÉA®Ęiß»îšŰĐn&Â}}C•’‹˛<ĹwNvŠÓFŻëSY!:͢‘×[tžfwN]¦_]f·2ďŘSU×™˙>چMâ×”©Ę~ćäŽ|A† }ą•(.ťl#‡Kzŕ ďÜňĘÄVM“y'Tőbö™Ě ĺrŇřú«¤xěrYžĚ|á\Ă5m!@p ^·OL`Ž{$ĆĄLŠnś.óvo@LđáąN=V’ĚĹŮVN‡š#ł #;6 ”őę×Ý9ÖÄŰáľľŁJÜCÍóS¬DÝ'‡°MSb1îµŔd†F§ůćí*¶j ă`§w0BŢÓ™´WÓv°ĐEů~U ě3ĆÓ—´ŔŽ ?6_eĂg_eâ) ślş•xrMiv9“ć l˙gĐ%vyëO÷‘.6‰ě2Ąât0J(áJAU*§śTĄÝV‚g7?3 LÎ4^:ĆćÔů‹ő'xrSbXŔi×˝Äýbôó L-*nÉňăVČÜ×7T© ›ěj”ńĆĚŘŃö%ôGŠTíždZ¸¨}­öŻ®Ý:˝ĺ2ě¬vP©óŞ:ŐĂ΂hîHú¦DűD@Ĺ«Mäv?Ú˝Ěě ÔpNAĘ<•w›8¬»L_ŞN§ußťíř6ÉɹÓěTĎ”żř¤†NÄćk"U'ß%ľ$ľGźřý¬ŃîŚďäâv‰ď]t&bóţíťěńyďy3î?\'gO¨kĘöé›Ţ:ÎPNwź3u6ë~N›÷Äw_/żÂż±GŹĽcŻ;tßđŠÉMúŤ¨ÉbřÄ?8÷.ńž+—•Îąá˛Űĺ<Íľ0Ý}ÄĘřÓ×%» Čá2rÓ×|Z’˝›ć)%JXR°ç§ňyyÓĂł ö‰ňgP/µ\ŇgŤžŘ’Ň;뎲i>­bîŢśŔ*VÚÜbVü‘‰ČpŻô´‹×ŇNăÝĐhP%č×Ȇßđ±Á2+MŔoî%— ŐOü ;Řáś˝aäžb×ţ"˛NvkÂ:‹CÚ‰Ü×}˝¶—ţŰčŃX¬Á Ôy4źŻHĺp46 +Δ—UČř9Ľů†‘ZmŔźö“ŠÜYU˘HŮ đČ5ěćŮ7·…ÁźsĐéi8™*:+~±21˛`ělŞţ«Q­@îP¶^Ě/ŹÉÁ ²ĄÉşí^fÉ˝Ű=*şűd)¨tĄ ěW:»SöT&ŕy~5 Ě„t*Ug©R.|żš«Ťň‡ł!Ţů}‘ď`÷ýˇ[ +a_šŽ#ń©wľ‡ş)Ú˝Uć3(Kwć+}.—Řsá7^—»9ŰžâLFá“wěĚí]f.±š°¶,p'®ĚĄË|…a$&ŹśBÔ!4z¶dwzÁČz0vł|+<3R6ąęźĽE »5±+'4ůOă¦Ö]Ďin*u4“  …ź’k&W68-b8E1yŞŤţ©+ą&ł'LTB ĎtNŞ{z…¤“sJg×8ďQňĹÓođÓĐěçńÝ×wôRĂ˙QY `OłhGrą”++o)€śÄO~G±ovÝć”{¶ĚĐ9§ TŰ«ÂL<_˛»ĘźNST2»2X{vró>ý§vywF˰?r$w ÓńíâóIT¨4'ł4»-W&Ш_’r2ŰS›~eµ$ÖďâżMÎşč¬(SĹŁ¤ŠF†­’0™«?řî]|ll»ÇaPßă?SŮ/«2‘¦@WőLGDFXw^Nfm^•H®0—·´w•şŻWW©ä}đÎ9ď˛Ołř”ş93ž–G/°Ňt÷Ű®Žŕ6ŞD`-o6?Ć·&ÂŇ]Őâ–<<¸+¬>c'{áŚ@n|6±[xŇâ6IĎHÍúa©k•đ9…­Ý`·G)ěNŢČ,ëěĐ´™ÓŚ:ĚŠídpÎW|âť[Ę@W¬fôítźŁ|Ľ'=]î‚yŤŞ¤•ç'}]ˇÚh˛m?ľä‘)»tţćNŢ+U÷ΰŮŞŢŠ*u&áI]ygaK°¸Żűzm•ęt‰<ě…ÖŚ"wSť®ŕťłŇđäí•Řg<9ŻIĄ×íRŐěL©m–/ŐiNr©-HD‹ä‡°üŠÓ—ěżáŢŻ3PͲŠ|E‘hNäs(¬‘]ĚcHVě5N;b˝g&Ž'úśKSś‰9 ó9“`ú7ż‡ť]]ĆÉją°çČWtË~¶Ú94˙Ť\ŻćO}"±ţłG±M~ŞÄ»~âťč_ßT•ě‚Á;B2ľ5ě#d±zÖ»¶4Ź›‰p_ßKjXçŚR‰źťy/‚›Í“®>yËIňň]ýᬒĹmĄv%BşŞ˝ gÇĚůoxść®é´ňç¬{zöôşóAÇqĺ TkŢ.¦5Ô-{A®5qËĹJ[÷S¬Sąü§‰Óâ×nNS1ŚúËIĺ`µÖl=Č” F†}ď‚=…»µÄÉßżĽÜĺ“Í…ZšCéŞáD›Č˝b$c´úÎw˘Ý.`°ÇÍôë›sß“Ďcą…Ţ ™űz}•zŕ´¦¶đ¤_ś‘ämŘÉhĎěČ|\'ťŇôŤ§©îšv˝˙{1RŚ-éÖś]vÇ“z°Ú`°ďŇl&V­Ýz‡vërÚUwX8=+¦™OĹZŕč$.ńô…|‰w /żäIíâ÷€Ěy±Ó«Ďłđ¦ő7Ň"Â>Ě` 8Ís×üŮ̬Čě[ź¬\Ń9[ó/biŤĚ‰=ѬŇńXť^·G^bJs¤šrĐ7Z‰öŕ#Č…ýă®R÷ő ź|mgţ\a}(Dj3Ů2pZ:6w“•ČĽ?ŻöĆ>©<ŽŢŮUâěŐA¨«’ťšłôŞűŽH$eb8}ø„ü&ú’žk±ďĄ ¬ć‡îć&_„âŁ?Ř/5Ŕ®ôÚ^f¦ç))ůbż$T/đő[ t%{aVÄLĽďfŞë=)śšÁßö}Ý׫'ľĺą8 žş‡~µmË!Üć]Ě˙„w>™óJ'c`đë«1fU›Ëî"‹8Ń-ŻÜj—*ˇ`:ĹŹŘŮžřŮmVĺĘwňÜüÔGéÜ {ÉdEw{Ä-tR(ÖÜuö9šN+] Ö† î©´'čü›bFiň3)Tć(/ń2v–pUëÄńô®D;¬¬‰t€ŞRyÚĂ%<íN,?óŐ6ŢämQ©ZŮőó߬Îűz}•šŠµccqĎ;řÉ˝ôÜë4¦ źÓ9cáX8áĺŤÇł|‡—Bńg>૦‚É%”"©QŞ»Ąfd>ťŇvLŽá…sYwrŢś9“B»_°ů»k&ÖͧżnÖ®ĂÎČÉžĽsďyŘm«s¦ěîc@„ö™ÁsmgjhAÂ…7; Ďńbş řgÓSęÁÎ\+űO~¤Á\ÜH¶;Ř.őe`źzň>1đ†'{ĽĚő°ň˛@ě†Ëór«úp&ldő:ůűČ÷Žďľ^…˙‹^đţ?˘âx:{ł±Żéřt‚\3ËRlóň±IÔ†ł'öőĽÓ’OđĚzć`5dĐŮn9˘L¤čÁZ6č5Ďóç¶+ěr~⟉˛ÉÁn˘Ö˙öP§yĂn Ý.á`ŹX#ÄÓ˙ÉŢ©±#›gô͵(»wkĚ•h[^3X‡u-Ú˛%Ł€ŮŐ1âÉ˝gßr;Ţq:ţršóRĆDVĽćJ|™?:ďĺsÚq^»©męŁçŢâc NÖĹššnÇÁűşŻ×V©˙Ľa0Ę7š÷ç“'żŰËö'˝é’sŔĄčOV–Ís#gěy_žUĺ'v%^6 =ú=xJ—;Ľ…zđÄ/¦nŹ]Í‘¸Ö;§šh6ütwDŁłÓŞÄ äBfŁĂ\Ëä]¸é»¶ö@ÉX\ţ€'Ţą/8Y únľDçś–¶ĽdyIMődržCć˙»ŇȵeąQ ýÖ1n^‚Ă*<íű"«µrÍŕţkđw›9Ź"R•ßő§=&.;ŰßUęľ^=ńÁÚ\ÝSÓ>笴řŤčĂŽÎ3‹"Q ů¬ ×#ťś‰K˝“Ń3QébÇŞ™\•|väY¬$ąf iśEĂĆT—rbÍo|Uu›]˛ŃŢHD¨o[Sx[÷łŮő´r¶Z5YÉ8‰Uó¤źNü 0™tÎL…;˛`%X'{±ë’99E¦{5Wq)q2çĆŔ>ębż'ďŞŔg ňB'%8(‘[ÍR=śyQ·%«'ćÉĘ3ă®R÷ő¸Ôâ6FVŹĆÍĐÔ˙'űeźx·nCéšßŞ÷FS§ű }]Ôu5tĽoąáDé_›sšł€Ő"ň›+î›*Ü%FcńÉ)łS’V6ÖnJN0ëL ďaĎĘA~×ؤÄ}ŚśKd‘'{TÍęđŕsWĺ©d`sí-® “!Ň·Ş#ËDú…oµ-źoşćD»•vއ]7çąÓŰÎNLLřšŢ‡lfěđ#Ę˝ĺwód-»x/(7z~_ßPĄ¤Ú t~›z×Äş vý«Äz3ŃvŘ]­:yˇ˘ŕô>K~!Őî)ĂŽę‡ÝÖş•r‘X~FczćnîAŢŤěg9ŕ*ť+xŹ»Ú%gIô-§O›ĘÂ~)r?o Ńąĺ§śĽ •ĂŠŞŕT Ř3Ýž9“ď…M™XÍîŽĚd)TŹÍm [\{OkŇV·ł5‹ťűi)ǶMPbM4bńO‡µH‰ďΠţ|¸‹fW(ĎőľîëµUJČíéáa#ľĚ bU_›‡šNÍŞvŕ‰9iÓ˝;ĐĘ“8lšÝlő ̵läo‹íp˛×Ď_5î«t@Ů*rË*öV”ň fźôô6Q…ěäą@o„Bg»aßŕbMňđüěFş§°Fó”"`Č7Żv vËÓ–łz©\=ĄäO{Ęk®ŃŮł`sź´ăgâűűG+0˛c•Kü'wŃ^7ÝĚ:Ř‹[BĂ}Ý×+«T"Ú’ˇ¬`ˇ ‰}G2—ćbRŢDx»?Ö-ź{ž]ůŚgÎl“'őĆŽEľ·ŐzŘjä¸M1ZˇÓ7ćTć×_ö6J>‹qÓ!÷/˝Mµ’îŔŇ 6žľĂxşśWä qˇ›=ŕiý[`ݦ÷ rVVS'&ŢU÷™acpď Ńó:ś29waËîŇ»uqúZ5r±Ůëţ°‚;P—\­>:ĚT=ś› ˙%YĎ™´nÉőňuéě­ŁŮń=qľ«Ô}}zžěJÔŤ5 çĂ­)Ąó„©·×,Ő©éZîÍŢoÝ{5W°pż/ÉDQŠźŇIEďÉůcĺ3Čwĺâś—ÍÉ VěwOgŐ6ś­ąË fe4ľcáćKÝ×·M|Óóäl2Đč UpYgyJ“yđp}× tb,So›9_Ŕ)y—Óś¦'čé<•ÓŠš‰uśvçUĘ]ßßÖîëň‰ěĆ6U.”öÓ›^X˙˛ŕÖ•Çe27“‘Ł»ˇ°i°ĄŰťç˝#ާ‡\îŔťî Ú/\Ψ‡·Ůž|Ľ–»WđÄxáÉ*>;Ą“Z¦ksxčÜnvű@5ȱ3;µků&g;xNj¶_ÖÉŻÔkş\Eoß}˝ľJ a-ŰÜ<­ČURRg1‘öčtşŐs&śĎ“ôFd¶[očš+}ţÉ—î$6Ý»‹K•­´ ż®7ÉÎ+ó°GܱńŻÓ–şY 5ł,‡ą”?gţĽ7'{¨HŢ˙Żş)ľ˝Xú‰ÜQíúgÝ Ö]ËëjG›q:;oXkÜĎwł3Ŕnnžřűßau^pÍnĆŹŮý‰žyÎíNŠďx˛3;xW¸\{˘ßąËhŢA'™Ó>[Ő»JÝ׋Żđŕťh¨çř ˙b7§jeVt ‰öâNé;x¶Ĺ.ü“@—Ď0ń;Ď6°+Ýü¦Âuă_ż!ŕaBçî÷Ö|hc>łÓ‡Qú`=ČO»Wuv"OĽăP0V1ťJÓ—Äô€„˙Žb˙‡Ht˝ăOřd*F„×\śß&Kóß5«5c®jŘřŚ>ěF<ąâ™s®´ÖŇ‚_xĂ#?seŁv<ńżăÉ#ô(ââOŰsĚ“ŞüŻßđŕä–Ľs|2«˛'Ö|Ţťâ6NŮ]Ąîëőßd!ôŘn<±Ń*–ĹNR÷˘=vń^Ż»,˙ştQ dÎ=ݧ™GŐ{°ÓĘ`˙–ąăOx·S¦Ü†'“ÄęŐ9'Â^rŮ^1Ž2ѲfąË9aX»ÉE€y¬k×2Q¤wvsSvΑYÉ}Ńřö ľúÜ´’•]g˛Â%ŮmKł°ú-95G;.tÖFő†łžţŕTýäÜ×éŔŢŮĺ^ě€&›bľĎĘŹÖ|<ř»‘ű}ßfBĺ+fÎŞ˝«„“á OöľîëUU*“Ĺ-]\°Wç°oäy9¬~ËNXŞt*Č[–ŰL§ă Ńô@ĹďěăďďŤÓĎtómî6†»đq9„ę*ýŮŕ\óĺK<Ô%ź¨FÍź2Ă7öÉ»Č'`En ź• Ý‹j¶ěş‹l%yH€ŹľTĘ WT°cUw—vżÎţÓÛǕČYč:*¦~ćĽý`×”đ"ŰÁ}ľ(ŹĹD_©ĂÉ<ÝB—h=ÓŔűĹâNXÚďxŁç÷őm¸T"Łs~îOł%Ĺ˙[H‰ę’?Á'ąÎŃH‘ęQä¶kň»çě o]etą™śś Üs¤÷-¸đn×ßčĦDś[ĽójŽcpzCßv~ç¦>9)Y9ÚqnâŐÇ–¸·ś_Ty"«ňÚ€uł”K®ěĎjśíIśîâwsŔĺ}ŇŮăTnűqĺGgň!.âvÍľ;˝MqVć»=ĚTN7§ßăą+˝\MOj`‚]Ą—)°3UÖ±¦üHO‹{⻯×W©ČY,ů^ńÄźśó”ČĐVJY$ĂüšÄzPůYÍěQŕmQ s^ßüęšsĎĺ;p˛ňśf'ěµ9§•Ë\Đî `5Wbemu2Ç/ň®”«2<Ĺ4ł’ŽÍ˝÷ š.1©"°Ď»Xw"ű=%ÔDÖí„‹đ –݉9g§_ŢŤ»ąlc°ňŢĹÁşă¸±ń‹Ő”'kNd5 žü†‘§H¦Ů…‹><{jr!+.ůýTěň•.-ż=ďz+dîë{ŞTaŻţ`*äĹ4¤`¸ľU)ŢŃŘ-X(ÍĄPëÖˇ#ŐJSŔ椔í2çX)‡}bÔ‰}“ę§&Żb·Ühhfĺą°4ąRËÄmëÖ‰{ §ŹĂzBĺlŠű™ýż„OçT>Ű@ÂÎ"A ţ¬ę÷hyÝEűwuviJi¸đ`^ËĹZ[ÍfíLËZ~;bj%'OČ9Şšµ6\}gF±[‡ťjşÝüää89-"’ýz:…BÎyw•şŻWW)e2]žâ.4T˛!=Ŕ»y‡…ĽGńŔŹín­müźFo ów‹;ŤHŽtä–jE›±9˝ÖMĺśh¨͉GVĆjG'Ąa]śé†ŐľŇ÷HßŇťo§\UµŚÄ$…f7k«ŐSŁő*Ë‹ XAýŔÓú•L˙'6·ęç“ő›Ţ(đw¦N‚=Ou&ôéÍܰ8˛ßŚf]]öÜvçi¬WVÁNoě-›q§ú%±;ođVČÜ×ë«ÔěŘ»ÚNW¨•d>sŽş÷‘ÝB·?‹RžňČd%»%jKO2–Ş{ŞáŮ<—ÝŘ‹Î2¸[OöÇ»p ŰJô_Ěňá…d‡ŕLŻ‹ŘŻüŕ&ňvŮĐśip8‡A•»y2Ň` ÉŢŃ>§ËotĂ“iĹŐą8z-Ţö&;ݝbŰ6+ń´Ó]ă|}ó:qŻÁ÷7ňůh;ď Ů˝Ţ Ďtx ·©›ş5 ŢĄĚzX÷9Xąďëľ^[Ą`Ż˘‰úśžŹ°ĄďU'OŠ3mVęÖřOĄźᦪe˛ß!}­˛’/ĽńMĆŁ†]ů””RĚĂ™Ş“*ćJ„;ZĹň$ÇIsĄ´µ™űČDĆ;ě9™­mQúźTĐÓ˝Ş›+ö ®X›ä9\íˇwR=GĆOň˛]†;9aĹݨzśŔŽVw i“ÄŁ¸ČłĘü®¶éc.vťs2ˬ׳ç9Íňě§Îř$+uMąú›×Ť>cĹü‹A”±ăAUUŘpň v§\»¬ÓsI'o›wT" 6vĺ+NA®Ln:đ„Ź-ů*rŹ•íî}!⍨Zçiüŕěµüs ű‚YY«ý.üB5#¸'SÜ_Řĺiű(ĆăIdţ¤§nG"ĂiöOoÎ'—›M4›5r6ç:)…Ouxŕ“8Ýb†Ć{⻯×_á?áaŹ\)W>đGŁáęK21\yť3Óń§ń`ť’C{|9xg<7ĹxŞaÎŤ&Śą]ű'4w@p.燱xů/ÍZ3ÇgbÉë]ŘŃŤxŹÜ55çü;ő5`o0˙îčZěHSíFĐťŔ01üż˛3©X | ?ČŚ ¬łý{¶jýsb.|łVô˝cń–Jo%¤g+Äo’ţhPůNE^@ÁňV’¸Żěř=}BůäS‡ř±‹Nv«.ü3>ěú(éţ®R÷őę^jˇ©Íg9ńŞd–Ýĺ_5Ş» žéL­±z­ÄM†ĽŐkUçYź^)ŃţKŇĆfŔ[ďjśz â$÷3±ňť¬¬‘Éď'ÁýĽ<Ů“7ňr®SŹSŤ+EÖŻ˛>íĺ4âdť§Qüe.ĽĎÇ–Ć.®%ĚkŞä]Î/Ζ€Ý*µ‡s‚¬Ř‹Yűôk˙bŘű®đ7’¸Ĺ‹|+±łĹNŹÄ™ŽmcěÍ>űΊD!ón'ćnMBÚÜóďëľ^YĄ’S@——6|GÎÄ….;ô‹Ĺ4kŮD„ĺ'[xö#·du«±®UďŮÔ·tka¤Ĺ;ś!Esa’śˇ\/hU7úŁňblG"Í…\‡ĘCw˙ĽˇěboM>ŃályĂL¬ű‰wÖÝËžŤ}P˛gpâ`ďSĚS¶đú“fË^͝ϷmľŮŽÍN,@ÄĂŞke¦–mʬޚŞ~Ău®ń™ČoPě±ÓŚÚkó˝řSÔEŢy±ŻČęëřîëőUjN,Ůś ľ†‡5Bť—ŁÝ ZzYňŐŹv‹‚“[ć Żt‡ đdĘÖ¸Ńóűú†*7źZxÓ×íÖ›¨?îÜ'IÇšř™®śR‚'©Ĺ® VÖžüęl‚¶uSËq*¸ Ŕ6ź´/IĘóLÁç™XĬ†b`Â*—Ŕ.lpŹ8ŚĚ'·ĂůçĘŐ*śi*źg¦3Äaŕ• µřôJ¬Ň ŮSDÓŐÁt2µÔmuwnÓúO'•*:Ó§›»h1Du¨Ń=óŔÜMy7źÖ"cKTÜŁÂ÷ŠÎşŮO7Öç“ě9â®R÷ő UŞúě'ç%ęmĎÄLĘ•VwáY &9MÜf1p”ć’8§O5ľdRžśW:ąÖ‰^PJLY;ď@\DiĘĺ”Ú#Ú{¬Ŕ9?Ú[Ąí«;«"™‹ŞÇ˝ç‚3ç‡3!N;źëq¤âŃîMó×=R†ÔÂŹŔÚ_XµOĽy¦n¬<—;ąľ)Ő‹…­ł˝ěÖĽ iśB»ĄµTęU´Ëq'VĄ»S·ň/"#łŹ“ŹńdĎ»ÄáÔśzW©űú†*u8+jŘ“¨Űîî’ŃšÉ5Ěěů•6¬ÚQ7'•â4đůÝźîU–·Ţ¬p{ś•Ţč`,ži¬=‘˘%:SY·*ż~ĺasÄá=ŕŕiž™čšMW/ˇ¬żJÄ&óÍ1ŹVىӤ´—h.SŘÚv‚ťŚOˇ@űŔhćęŕUýŠfUPQ'Wôä÷@¦Áž„Ă,Ůŕ»Ćeǿ˿çČÔ %.kÂű†Ą-ĆŐĘ»y-ěwŇŐ}}C•ďćťčG ÷ÉžZR}8ńhö?Ăß—‰^+ץż8ç„Jś¦:@lĂąőĘ_rš“Ď›Ż9¨Ł=8±č‘OidíFŐś)vQtbó ŻKµŞĄ›sٸďS—Ô­ĂÍ®>•{®jťťx_‰ťR1·2ňu€žü÷Ŕ.$ł ëv5ŇjŁ·±@Ä“Z›ĺ(ťĘň9FPjđFa¦AݤŤÎg"mĚâĹIŇŤn‡÷ ©Ć™fń^łßţR÷őM;ľäSĽ 47™]X‚ý"/kg;çśĚ­ůLqęLö”*vŘ|9‘Ď}ßÜŻ«jŐ ĺ 9ěŁ7ěMŐ8Ď •[§ F»+TN˛ÁiżřRu­©¬lÂË'ÝđÄ›‰/Ö_9ç{ÍîW6{žÄóߨE‰ÜĚ%űBT<đ«=c˘ť¤űÔ‚ę ĄŢm 2±:‘¸™«5ť®“´™Eu +ě*;źedŹÔ­ą˙M»ŕĚZÉhÖCÉ{đNg¸ŻďÁĄ QNöRő˝_łHf—5“F žVV2ĺ)™X;:]ŹÖĆ»ąę¨ĚţIénr®⡚¨—ěĂŠĺ7rŚ5şâwÉŤüŤNŁy«‘8W0ţ5·üók®śâf—ř$Fţ¬ďh((Ě+~n1ťN˛•3ťÓU´§Bçc^ě9á=ťQ…˘ĺ-cösOv;¨ý°±qF FŰg–ÎDćę–¶ČŹ`&Ű;çÁĂžžsvvô¬Ó:ńĐćăş«Ô}˝ú ˙ŤóAaeŘý®WJK š\ľ°˘ćŚňWnŞĎçŠp?í~ü]J‹/őýň…KôDęô…‘÷Ý@sJK´q$Ł=ÚçI=Ŕř’Ň2+é»±ä§}Ć8ť÷Ő™Qń7~_3)ăŔżâŤH0ϲâ_pqúę§»ńu1[řx¦˙嬉ďř39âsžkô%ţG|ü]JË|ł2Ęxî,¬±bą'TĽăż“űY˝~ża|šWü•žÇ…Âą|'·YQ4ś8Áwöw•şŻW÷RźĚA:éU2ńäĢ”`U’ŚOk;‚'µě$…Îî'-Z;°čä°óXöLl¶Ńçó(gWQ6\f8#Nőu9ż$2«Ŕ˙zĂž|ž ~諥>íąĺßĚŽđ4§-Ţô‹šŮű‘ŚČŢŻąvÂ,1yfMt(™>_Ă“˙uŘéĽp"•÷Í›‘ Hu]`-•ź–ň•#YśťűÇ“ÜÜŚO#QŘÔÎźÎ{®3OttĽ‘5vŰńô#$v™Ďô 7 ¬Ú7«óľ^_ĄT;¦ /á˛öWN™pš¨”şqáBŁđjŇŇ&©›gŮť•$í˙ŇŃ,í…ľ[ţJZnf@ű čYVÎŁ_ýÎď‹ÝŘÉ>®’Wžě·Ô̢FÄĹ@0Ť ’ĎÔÝÍěž'Ă^uŃLŠ`Ś|PŰ+§ąîޞlĚ´h­NđNž•0ťŮáNŤ+wţ´ĂůĹW˝TÄ}cĂN`V>¨­ĎM 4Ś…EćzI—YÍĆhŢî.Ów/u_ß±ăkO ó'{ŢűşŻ×V©ażłć ىwg GN63űłq˙W©ž(2¬ć“Gfłv€Oe ÷J(ąŚ0/NŕrYˬ5`_qČu/•Uć°~·:CNÎ r> Ü?7¸ŰżXU/ńT˘ZĂş“h¬ü ‚4;§Bälbá—óLAmâ“üőŕĚÍ´íü#˝gŢQ™Ů)Ni§ú(ŘĹ7ňŐŐ_śvaE‡ýÚ;˝K+VjO$’«t””(,áÉľĂé7sťlm˙šť¨3ß©Űáľľ§Juöc»żËy ĽżűiO¶xť¬«vW:ś+—\Ź‚'ł5Ű5{§tž˛Ůc\<ŃcËŇ›Ţ#]Uâé_96ťYP‡ëĐÓ<«ÁmP˝łrąşS;„@nU…ÓTŚőµUů±±ÄáÍäp¶f1óá`Ôüj†S’{¤JÄi־ʝháv.ň}ŞÎ’ý ”Ě—ŮwVrégr.>v1±şQµ¸]ëS»AGöĽę¦ú–Éxő_÷őş*µ ˘SŚ”®”śopń¤-­eWéé§'žÍjJf®ëľ6ďŰ`·Úč©-qâ:śąŇą/ĚĆ‹Ůä—Ť;C`eňăEŕOř„Ü»;źaçäč§nőËŮ‹™ŃŘcu<śX0ŚágÖÝáÔ… ҵ ű—Îg0źI¦Ĺ…w>KůuMVŘ…‡“ëOc`‹‡»{B/Wý™lhŐÜ0Šő>ßáÁ”żÄ÷lňó/,Ź™ŔéZUR‘Ŕ×R¶^üľîëµUJ©›JŘîvuěÔĄÖ-ëj©ÓŠ«ŕ–𥋧â`Gٰ:÷ÂĘ´ŠÎ¸ĽI)q\Ţp°¦ąpšVÝňîTźYK‰]ËpĹę_2Źű Ŕ®˘yďXÚ–ÎłmRŤL%°ŢŠĹ‘­„IÜ…ÂUěŔ ŰhwźŻąlvĂýJŮXRÚg¬ôĐYÁšő>çÉţ¨ü*͵É_ß­ZLnĺÚ6(31řóí—şwËĂ8] ^ŮťÝUęľ^ßKI'źĚ7ZąnJ]“‹°`ő•¬?eGé3<÷~S7?śNŁ-ŕJ†ÓîN) ÍŐoءnĎ"ż®ä%%ň§‚Q ć_xÚ.žâ˛ĄÖ5óľ–:Ů[JŐOŢá‰çy¸ŢbJ+é VéˇY‡2;CŘ«.[’ŇÎČž±šwâ.űw]öťŹÜZ‚ď,ŘO©O+žvr6ßęÂď!°Ăç WÜ_ÄÜ5{'ßwâ—´d9káĆĄîë[ŞÔÂĆćc ;čĹąbú­]Ü€pŇ÷śx’·[–ş§l˝‹&+çŠdä]Qg¸ ˡňyČď6oý×ĂŐeĐJť‹X[Ť5˘Ů—!rÚs3ň{ä/ŞŽŁoi§§ëIŢöťJ˘îZĄÜŘŹ%p÷ §S î4Ůbzľ«úIĘ’ĎC·G–P´jŐĐEőr·Wx—QrO‚ܢú6é+ő]ßÎlŚË̬ášŢąGívýéś%ď*u_Ż®ROö/Rr%o÷ń)%íFâßRľA »ů“g"CżaPěbU Ďţă=E5;A˝†˛{µ§?í ľŇŁ"] ‚ݧŐfśl 0¶„®µPć:č±+–ëRŰ.§…göŘfÔä(q†{ţÁdC±ľ™Xťř•đąĚMˇ\ zXOâmC¤‚]FŐţ€é2Ńďú_ńć= |˝n2<ăŇ(‰ĎžXŐĹO·jˇ`‰>_ň‘ą«Ô}˝ř ±ąőř°3Ç<«ţüެŁÁÍVĆţčd•ksśú›·˙ťwŕ†„żů^Űp8 ŕ÷äÇÍ9¤âŤßE4~NU?‰VEW°•nľę§¶xŮ}]¶'ĂĘîM˘}ŇUˇ˝Ď—GŢE<®Ó38] xp×8ĽO›LÍç†U>‹Č9V{ ácš„+YćcsŇÎĆXţSmŰLÎÍÂ_Ł˙ňDý ţ?ř`Ąwc&%3Y“󿲎.$| ăÝé8ŮÎ<Çćs>wĹ{Çw_ßĐKťěuô™ľxöš3?SŐv…ť8éäoňä$'e«vÔÉwkŕ‡3H+—twÂx—Ó˙DÔźîef­KŢăuwDÉ;.¸gč֚͞ç´7Ýň)YY[Ă¬Ş™f\¬<”ÂPS^@Á"˝3ě±óĎ3»ÉŐGîľôfő t‘ä_¦—NŻ?ń†‹n| Šç0&üÎΚűfž:ěwú†ů;–7„ü˘WV´¶sľJŠDČ+Ý2V´ľ1± –B1ŹĽŻűzm•<—Ůüç“XŽ”uÚĄM-ă±Í'´P“¶ÝŐęWfÇ0S9Á„A~ŽPő9iÉéżoxY´“÷šS7;‚Äł¦Ő˛ĺ@eVÍá-¸ ¨ŰţN|…™<Ń7\}ˇ=›;Üa5ŁÉZÝAÜ\>Ĺ‹ýÝXO{SÁą…ň†JŢ+tf=2Ĺg§n^–ö{Ęr†ł=µŮ°›M¶óftŽ×`˝ďD®ÄQKśe;±7UcÍŞ‰ fMóŇ ÎÚw…W–ĂŤKÝ×wôR+˙$Úů©ůߥ‘“yő}şŰ9Ş[c!v“RFg-9Ř×dĎŽťŢ‹#¨C]PwN©<|;“Eá*6á425X;ąĚg¨=iÝŮ+bTgŮ)9nÚÚ•˛˘4Ř[śX»˝’+ćŬyî5öpgz± N“ňe”Kw ŘçŢ× OŻýKVâ="⢌|üć{'ŞXr>ń±žŞ]č‡UŠi›‚ĺü٨NXú©űşŻWV©Dt$:ďSÉ’mSÂOÜZţÚOîˇNb¨Ů‰ČęĹ.W€BOdńÂź9[ŔE•sYGĂ;ž<Óm­$ésŚf%gĹOtYXŹÎRĺ#tkŢP^Ü,–Mˇ '«(˙avq•ťL F:[ż»˛^„łkŇm›«űJÜéś'+ó×›s˝ůQĘÖ®ł±˛6»Ş¨{ꛇűÄđϲp{XżTŚçUçŃ vk‰;…‡5PŐőfŘ˝>Ń­ŢSDö˘ÂĐę]ĄîëĺUJî!‹iÜ­WMušRƦ‰Ž¬KĘ.d†Ży´m˝^&ę6ČřiTv'⋚¶˛ć)/3:bĄv%gS)]y9 DbúťőkŘŐá"ź!Pé—9IwsĐsF}iôĎ?WňÎ1ˇŕ“ŘYqýŠŰ\·Ô`¶čśÜů\Ŕ­ÉĚ˝dťÉ[ćĎłaqD‡óˇďëľ^[ĄŔÍąöqŤçQÝŇp’ŔJKęÎŃŕ`^QĄŇ/[‰Ś/ý ¸µ‡ëŤĽŃ/'úFwmË(Ć›’·LË7´±¦(˝ŘáSŽx.űcŠă¤|ŻĺůÖť…Ľ)ďaéű&GLu0¸J7ăßŃu^›»îTőáÝ&i­:; Nţëĺ‰vqÁ‡ďi~ť)¤ŃlńŮűťĚzĎÔ9]ŘÝS‘ąlís#ç"Ú—bÎÔËS8¸Gf¸ĽÓÉyůľîëµUjsnD„HbĎ}K ’KîDfă–Ővqꀳ&•=—‰Ď´-Ťd<>É gµ:ż;sŹm ™€Ü †śOŞń]iÍăÄKÝŃéN0·f§yč×–*?ě°+fRcÎ^äL3čČ—Řw5Vݱńď/ëä”Jߍ÷tVŤÓzĹ™ ÎU~›âDo‡ń.%ާ‡] ¬ÔŤľĎËĂ.˛š‰?śÄ÷ĚĂnÍ Űëţ=\ěäçn˝žÁ»šĽî‰ďľ^_ĄÄDŚN±v,îó ď˙s fEu3Ô;YÍŢĽ‰ű?ůלx&j ]đĚu‘·Hßňí&Îu’˙4(ńÇ‹ąď ™üB°KśýÄ›+ÔŔa漺(MsÁľčÁZ긥"«ă’ rt-*ś>—>DJŕYµ‚YgÁľĄĂČÓŕü[ŘO‚ĚfÔZ~ÂâMfĐk?Ý“e#‰§=Ô§c„TĆ»ĄJUő˘Í~čÁΕw“ĚÔŔË}äŘ´:Ńź›Ą*ĽŻűzíħ|ĽŕÜáŐčµîČÁ¬©AtÖá&ŁŻĘ–žS˘‡ýńäg 3P<-Íę7«Ý;3žäý2Pńnoa ‘?·°~=”ÍčŰ>^ŢęĂNŢÓ{DU÷t®űśb>·mÂ`˝®Äş;EĺÝ r7›ÝNĹţŠŰnvĎž“7Oă˙ĘçRĺ“öąâ±uXŕ;qđ•/}¬4Ż`%Ű»{şôĚc˛ÎpląË{Ľé<őäü®«ňý»«Ô}˝şJÁĘŻŘ·Ąsw}ÝďÂqăžžHuÝSIđťyĄD*v•¨”É©ÎÄŚ/ăV‰sÔŕ.*ą)Äzß8Ë][~^¤ ďś‹}ŞS&vü`UMĆ‚”0ĐŚUťŢ÷ăÔË%xe @ÂÇ<©ÉŠÄ'µlzýŃýIv®iđVRŰřđËÁ!“í>|dFµŻě\ŕÓrh€˛÷€'ľăvWxubÇ’,ĽóžřŮL¦ř…YČĂqsł*1/ţ.cZ–o¬o‡w€‘™eťSífµ±Sě*µr‘›şnŻ“l5sc*@FrV1\—¤Í N>h)}Ů>~°—ÂeG‚`&aíŁ»ÚÍ©Ěôˬü9wî21źÍŚ«ĆšRť7ˇÍßn?Nxż8˝1ĂŇ &î /8˝o„·RE‹S9 Ĺ÷źú¤ńXÝŽa^A2,Ú_KGÜ|ŻéfÂţ‡°¨¸¸úŰw•şĎ««TôwúşKîf˛h3NÎu'+ÚPŃ˝‘q.NUçÝ8ÚgN;ţĆ»m%'F·Ő[íćkců»çśJ·ńŔŽo0xžvŞëĆŁf¶ĺŕȬţ#3[ĽSR¸… ś#Ş˝˛:;’l߇´(w‡tó,Ý‹*‘4łkŮX°¸łśÎ+Γܥlç&U©;”Ȫ4LÎϬ@Ű6܇ŹDĂŽw¦L+f:{ÎNĚN“çŔĹŻEÝÜYC7gGbů·ďů}^_Ą¦×JXć=ÍĹśDé]+QŤd~T ¦-G5:#©÷*™â°8Ďv' tb_‚žĎä…fÝ™†2±Őbő~eg ¬Z˙ŐüĎjD5±¸Ü…ČűEýÓf’ÉXŚ8PXiűŹń؇˝†»ł"$"GŃ{»y…&ş[Š™(<©:39°kŚv˙˝űlö¬JĆߣkXłR:řÚľččWíîŇ=eĆĹĹüt…‚•ŚO§yŞ/:řÓEw°°‚HŞ€ćĎ*Ňą1ЬdÜĚ­Ň.öÄaQX¶†3ý&"Rń´ú¬v…,őó“»ú­ă»ĎWôRŃýÄ^öŠlöZ ěůąGRŘśx3VÓ©ë=É’ęÜká˙éC˘ĎGÇöfnzX\1ÄĐĚö7Üse© Ž“*‡Ry7^IÍśřHÜ%šëuńŞÔs§EŔĽSĺNe!ś %”*łßYG°Ô$9ÂťXôî˛,.~ňXŹVM‹ůPě–®ÎN.U—“ «\%Őů)ɇkrj•lŁ\çÁĐÜYÁ2·Ź»SpŔíbóÝE›p[riśn6w•şĎ««ÔĹ+|wŹTě4Űąˇ——Qâ}µsö5&;k`\«ť;řŤW~ĺăFb≛˝h}_r*x_RžF˙”üť':ľ}ČIdą1oöx9éÉ×+TçîTŔ¶ä»ÖfÎüęź6ŽaISmNók¬×ňąĽ¬Â;±sFV*çf­‹*sçź ”îůzĚeŤYŁzVÖ;í`ż¨bUc´Oڦ29…VgóUd~^;űÓHü*-ŚÝä3ˇčĹ~Z˛˘ŐťŢ;ľű| z.LJ(D'Nqń>ĽŰ}v‚ކ«[\·.çŹL‡˘©ćĆß§ko÷Ő“‰ÁJ'RY?»űÇ´±Ë¬CŁFě€ŮHňČÝfăČ«6ň5t;üMýbp"a\ĽH»gŕD¬»“ٰ±19BI-R†vűn]a·Ż{ň<)eNö6@{=ń'"?—Ŕ|AˇŠ‰xu=K€7nŤď– @\öŤŃםgł»V^~úć~äµĂűÚŰ÷ü>_UĄtgĚÄAÇ„ńXlŁsÓ7עb®ĄöeĘ Węđww0ť_kěĆWGňĄŞ°Ł‹wü ov,Ţt¨Ż¸ŹR}H¬J˙<±1[N¤:飞—zĐĚ]Hě‹óÄŹęśQ…Iá+7÷Nt7ŇĚ´ěŘż†Huäܢ‰—* ţag•ŤěÍĚş”ř95`É—O¬ä—ÓÇŕ.j[”Hc¦5ú’ť® 5Ô#ăôdşáDEÁo,Q9Ô<đžTnĎdř›Őyź—źđźvIN=9đn/ě༵?¸Ąşěw×đÝą¸ť×dEĹoĚ’?±đ“n[9KrÂf§2 řŽ˙ŔĂÎ —ďŰĽęŠ}퀟řwürÎg%Ó)ńĎ/khťĚÄ·śąOŕ$Xíă ür2áć*í0w9S9Ű‘J›»Ćęýî)h$Nl¬ćbĆvo}qV†0ür…Ó¬ €ßđ4;ć6ý`«N+…q˛Ť čJ·Đą" ¬8đî,ŃHÖA#˛¦NJ`'ţďśĺáMÉÝKÝç+z©ě4€1aěyľ“Ă“ścpŕIĹI-K±$.ŤÎM'wˇXÍz99S[Ĺ §“÷‚SäžČt4öŃUľĂŔÄvçś$ň…„¨<é¶4\‡ĎJ! bÍI…±ňŮ.ł "s"¦.#2yę2—ˇ]4ř•ń®Ŕzüęß<)ŞŠĆˇ2”.*lj„7θňH‘{ßŘĎÉ5ô_÷†ď]OŢŚ]ܤ>–ů˛ZQÓđtŞk¶ź©ś>»{çh-úćôwmoßóűĽľJ%ł’t5IQ«4ôâüßŕdČ“ÝČĹĽůy:g˝ł %"ĆuŮw‹»4pďÝ©Jëëţ_ŁŰŘéđŚĐČź­ú˙7»(-3‘˝‰joöLjΔKfuâ˙‰?›aaey×Ń>›Ńh{bmR>žÜ{¦ÓľpW˛ńÝT:đć.x–ĚČŘŘůśŢ•ĘqAőu`]Ob{ʲďfrF« á|ϸäJkëčť.˝ËŘnxwőÔ¦Ż“é¶1‹˘sSy3îóú*ĄÎ_üÄĚ 9iíěîł‘ ±ęfŢ‚y#čę⣠&˘˛/;Š‹­>Fv*°¦ĎŚĚ9©°Ź,ť4 ëJb•žM2.NIČTIGVĘB$,XŇŘóÁűömIoýYµú#°oQ[ź®Ý˙™;Áę}gb:…ÔyÝ\ŮdwTą@\N|îFŘĄŘyŇ%-XŐ>Şâq5gQDďů˘Óž›˝§”/ˇŮP‰Ť•J›’ŁłÄú’-đ>÷yíŽOj÷@lvCĹ…Ŕ>IąPB˘ÝyX˛•wë7n§7ť’ńÄ/‚5µąŮÍ<ćH´¤šµ.·ĽřIĎ‚%ĂNjŃŐŘi\ËŽ*°ĆěĆą…ś]ôS—ö$ZĹ+żJ!ÔÜŠâŠ1YéyÁč†éŢŚUë{:7tÝÜî©<ÎtÄËDçă!»Ăí]ő~¶’+ Ţşt;ňZ-ćëOívä{µ›ńŞW1UrČĘÖ3“ůÉEľă—ťIo&Â}ľ¦—]ßvßĂ3«O^ʉhôĹ-ů”xty㞊2ŘC0 U©TlíÓ™%ť•L›ľäLšÓ;îd˙*°ş ż»Hű¨°‡ť7Ç ¤LăÍěN9ýJ |:AB欥-PnSrĆŐ@”űŽvV„`ĚîÝś[:”ŔXX÷bTł^•ĆU‡˝ …űM{¦ôaí/ĆăesÔÄšŘNmb?&˝ć2mŞÓâ+wĘÝ*äŐnD+ŁßżĆś/ąQw{łŢ;ľű|z.G‰î¸ŇçźDoG˛fµ¶,Ó˝÷;݋ä)mżăâ_Ç…"`´•Vǰc︶›˝l;źqtPó”wzůz.Ľâ'TşÍÉýKŠ1¬; f5s¤Ú§ě<áV“;>Ô‹'ëEĺ;s ¤ŞÓ´ű\p~ń*yçŁëÜ!WRm ₣Żőq&Ź÷*Ńófh(‹Ú%ůU4NgĘ8ř{˙”Ěšś‡3gV°2»řIÓ9Řű?ČY“O›/uźŻ©RŞŮ_”şľ™(ö&†±ř·R@“sD+'ˇáŃ©Xš„ş7(™ĄąłĘÜ‹ĎÄáË‘w}űKę§DGŻR0yŤťÓŽ“ÜŠ1)!0kéNĘ‘îO>”ÍN'~PąŇWxO0Óŕ‡«B@Ć51Sý˘ţt*ţ’ýŐ•H‘śMxăR÷y}•ŞÎVŇďXăŐ»™5 }Ř•¬Č©–ŘČĘÎ(P:S^öäŐ(KçťÔ°4'ăÍýůđOěK qę‚™'ŞŞŐŘĂ`ąö*Ĺ^{`÷VȨoŢ>Nćĺ ,(věŮ 0çÇťś)açÉţ Úˇ•…ł)đOÄĂ|cĺSľ*ĄďH=ÜřzwÝw‚“ţ4.\•ü e3Ď =`:ÂŚömIc×»*WĂÉŕMv1} «gńĘŠ/d­ß;ľű|A•Ň?ؤcÇ^ť\îÁń<ÉJÖî6nęŇđnmr «;šŕ´^[U­{›ľ$Ť\ÁXJ¤ÇÔ‰ŤIŁ7¸k G_°/ÉsÉ©Pâe*YŠâĆŞŐŚ¤ çIÔnô8 ű|·žäIśNüš(t0r$]ÝîŤŮi×öQ7»ńE#ăű9ĄVĎäťë”ä ő^¤/]0^łgĹéčć¨v*#{¶jeNä*łłS÷V—ŘĘůüi·,)¬ď*uźWW©ßń†÷eż-Ź˘ç‚â*Ă䤲.{sÝí¤ft‡…iÔ¨ ą¬éxăd=/ ?¨ÍŢPŕ ’ě×°şáľsŻ%5ŽśÚ3Yëť“'¸‹ôßíľ+˙Ş9ń;NŞŕ6'¦'{ş)ÁAóU¶ođΩäąăY [öúăźÝZ¤‹˝m> ”ö'UËßčć"n{đ ó!ńęLS†Ń:őŞÝŢ;.Ë\ ş± ÚA$r ć›1©€„ß‘ůŤéř?»ěl±ˇěąît†űĽţ„_(Î-‘zřr1Ĺ&ÎxrNŮś:P wÖ°¸8›śřAîňĚá“đš]ť”š«‡'v{‘\řÝXëv#€§Qą°wó°Ć÷ełH›svsá3÷‹ę=Ä´~¶±·,ŠoΑ:y¬…™z¶‰Ář˙noĘč<ÎlŚ%q[ 4i–tĎ‘t—t89Á<0˙.¸VWčĆ>čâvł-Ηť\Řhź:q$Oł¸">7¬Č™.ŕIÂBL¬ď•9ÍŁ*ťäźď2ŁSˇł}˘„ó%˘âSݨý‰ŞD;?űĘ*+v7ş97Ţ!nGáű|ĹŽ/tiQ–d…λúĽ•AŢěÍ´ŮA÷ämńëÝěŁř»ž1=Ać˝;şŽ'(E'(ÓŘĹÎCzżqÇP5—‰Vu˛45żÉŰ-.ŰČĆ\°pş¦ŰJç«”łJçŐ»;OtĽ/ňś59‰Fzš`¬9XA3°5ů2]ŹôŔÝhžÔÖĂuPŽ,J7UšWpž}ó=`ł°˘Oţ·sĘmL´Đg|Q§Yůl‡ŮîçŔî, UĘÂ:®úf"ÜçőU Níť×)¬ÁŰĽáŇÔŐŚA‰çxÎ÷ÔďřîÔß' ŮÓâĆ’ňÖŐ{W5śřAg[Ő­éŔ«q´mW Aó*Ůłrg7˘<´¸_ÔąÉA+:·¦;[&™‚5<ŐĚďČî© âi¤=ňUž(ŘXˇ”W#ÝŃnO_íŰ:ąţ;ůR'ąďeať˛Ü×˝„˛“ź W4đo‹‡ J"xŤĘ‡{h'2™ Ýš±¶äŚîK§  ŁÜ^ÍťÔpzŠFe.k 'J&ęĆ-Ľ\ .#mÚAU{IEćX)kĽs[¸ńű«ÓB§GŚĽ˛ý«D¶ć'ůŰČŔWµW¶öš;W)öâ’vwąŠŐ1şŃ'») ŔŮ`ć޵đ Ş.vVśJd«š#|-»ŞĂjĹhEBˇĆ¦[e#~hş“®îóU*Ú ˇ9ôBĂuącGnѨFD˝prvČŞöx N;©ěD攓ɞ”6ą±’E¦X5'Ŕśvni¬"Ý:”Ę-×Ĺë˛s‹{µOcz éz/H ´3%PÍrŮ1/p&mś@GÉěDŞ'8ˇę0Ł)‹™8WVu•?e ‚ščíĚ”ÎęDřbN+řÜĘmÇ’+¬J:5ăS‘šZď×ĺi1.‚SyŘvîGŠÝ Ĺ5Iś$=ś§ó>÷yu/%ouMŮ÷đnŞşË)D˘‚ý>”°°AîŐdÇsé-6€đń2'ĆÝɉÓČćdáĘ—7qÉHŇěł Ô‘\Ř8­VW!ą2$oĺ’ńiń›ň§ä_9lţŞ’6Ş+ŇćIn°µćňur&#}˛s‘rę'üPúĹĆž7Ű;/:‡*™)îIŔ{ŃśŞ§†r•w<Ý^|‡giä«ëŔÝKÝç ŞÔpČv…MĽűŽÝzőý´;±­-*aŘcşĘž/˛b2ů‰Je \äźă(ŮuJ»ő‹ę4íâ…ąTNŤŃ ŤŤ=Ć`%L%áěÔ…)EłĆ•ŢÉn—«·x¤J4­(ćŽ2v«”3đ®f˙MĄA«f4Ŕđš%>­ô†ťiĆJ—+N Ż]'2ť±č[Ys¤ŔľČÍ‹wLç{𬶠ěä6ţÍ@¦ţĹ=ČÔ=žěČ:s16ľŠFĎŠOŢç>ŻÜńIë‰Ă4˘ aI˘kîNÖ§b'©DwńŤWHâŚP3©”¶á|ި-ŐťT0]•”ľ›ś…Uy­ŞŐBÝŃd2vgý{ ¨?‚ąŠť÷ýćÔ™HÄGZžfUńÉţK~SĘwiÎúůF§ŮŕgÜH\ͨ:í §„˝Ě‰µŃ­ ¬¨ůÓ˘ădŮW®ŔąMů^ÝîŔѺ퓌M©G=Úy_)ÖVŻš#q š÷k5NÎo†—éqsďřîóú*U}×\Ół‹5wÝéVŐzřŔ«^n O_3 'fč‰Ů3SÁ×ű·¸3Ź%°(|üń•}PĄ¶C÷sąĽ‰% '.Śž+W®ĆŁ»}ďžŘˇ äŤÓĺľž|‹Y6űB\±ŤXŽ”Ç'9ÉNĂbz–ĹCO9,rľ™Úž`…ĚĹ˝Âáśz)#]t}”yxZ ž<«Ç•ăJĺÄśčŮ,v‰ŘˇŐl 1Ę‚=µ]9ąŁ`·řîúyóĄîó¸T!î18„ň?n• ŔfîŢNşD|9yę¨Ä*"Ń©‹U-=Ů˝ĂóNŘÖ“H¬řˇ•µ/x¦|ÉΙĺ'Ńŕ©™ŘS˘—B\’J±0SuőDhüI+ŐÁŮ•wgŕćm‚Ps°ß’“ÝĚdö†ßŤB'ş±4OÄkîăuÎŃi…»y˛‰;ËŤ)Ů( r^…+©VäĽďě/ 26ĽsˇĽŐĽ¸!É~RŹ?ńČÁ:ů]ďř+®…˝Y©ňŮYWµď¨ć«Üç>/<ᝌîě+?áŔáOKZŰÉYď/Ô¦«‚łÝµá˝ô¸Ăó]`*Kđ./:=yĚFż»)‘¸ˇáłű&“ ÖĆV:­Śŕ ˙ëŠ2Óµ:ľ±ÖťL‰’ şy˙'/ţáÍěeÍ}’Fą°†×%ąŻ“›ń“53:ĄŢXs4MGn'/şjj+¬âť=ŕtú’łŻ¸ZÉî:‘…ĂŹţ''ĘÍjüiŁŃůó&v‰Őźýŕ:|ŕ߸é(F2ţ±$ŇčçHî§ŻOy§w•şĎ«{©“Ľě“÷SaŐšÔ‚łReŠŐÁz”śÜbŞŐjŹ·ĹgM×ßLzŻžżÄŽęD6Ä›~šs "6ťŠśěT%9+|X||b@d|ĐÁŻpf ţÁ›3Š?M‡%´1QEi9 ďĽsÚ–Ş9“ž¤7˙µzNNޤŤŽ)_:Čn ġa]ŃÉ˝i٧L¶ż^ó3”Ąó”˛ř XŮ,ń´ÔŰčL°äW—đŔ»ąm™Ţî`† đ`FFĄ‹˝˛“GMÔŽä®R÷yu•Jv—¦\HĆ}¸-śDąč»FžďsŃđe{˝ikvŮ…nŞü`ÝŠž„+ mËV*,žPO˘CoZ¸Ź@4ÖRŘWmśŻ’»ÍIÝĎ2ú©?<Ů΄.ąĂČńEŠż•ěě·9ŤFn#gá˛k|f'wş&UˇrË F)ś<ů¬X•ŃĹZ9¤OľäÁ<Żé±•9eí¸j هŻŮ`ĹńiÍÍäY$NJX|)Oş';ϨJÜ=lĆß«˝űâĺŐ¬ŕŤěř ůĘ~r¤.|xsQŘ“Uö`™w›îÚ–ś('ĺę÷ Űľůč}îóÚ*µ“÷3îN˘4ű‚¨Nvň…LDŹw[•úŠě´ůŕ&úże{ü6ď®ő›žÍ!ڹы¬u'™FňźĘT·Ái…Wʰ˛¶ěžĘâko¬šŃ§NÓŘ}Py»ąV^¬D;·{ÁŰĘĚŮ3×ä)‡Ň1źíT÷â}ň. t~GéÎÚ‘ěI^–”ău/ŞTŐŮNlú·tâEŞ=ĹŚ’9Yk#{qßP©{y2'Ľ_)µôlřâ÷Ts‹=_ý+uW©űĽľ— Ţ)b+Í™ž™;ÓŻ˛őeŐ ń´LyQÍô€*üÍľ¨9kä(%{±ézČddäőĚęx.{¦`gĽ`dL]Dˇ[e3¦ěí¦DŞÂNë˘?Č%˝ľ8´'; $ęŽ;ý§źftÍč|”;>pPśě•É8Ž©¬Źsęż›}ý@xÇČNő,v:śK"žśçƦ±°/–ĎÍĺ>r2M˘űÚčÇS®ĎśŞ?s2¤Δ˝«Ô}^_Ą‚ď™bL?N±{ĆoéI$¨Ű/¸/žţGJ|¤'±ř™yŇ豜ţ×ČŹŠľ Ł3ţ’˝šÄ+Š®¨ť}ě®lŞˇ|:é*oÎVfÂŘv6ű*9ˇ¦/—xAŮ^Ł‘Š•Îş9Ň»´ą f2w|›˛ĆSHsăÎnşýÉ_ 9űĽ±FîśNUC…ĂmdŚméeÍĘđéÚxżĐĽ§úş¸‚ťŢG*Äňś+acYÓe«ąoKîđîsźWV©hGgO#w¨ŤČČéŢ"ă x?/ýü›ťlߡ/_«ť[¨Ćď:}5®®ţÉWMŁ:¬9] ćeeg€îď*´;ĄXé¤Ń™p]ht¬„3§ÔéĚęU0ůćř”řś…és›ý¬äz)o™ĆLó‹ü˘YőNţ´Bß‹ů `ź đ9ůŇëÇtĽŻ+ä˝×›îtždźż}×k•¦vMôЏĚćxĽ6śÍ.Sń®R÷ů’‰oǵd‹lΛXéÉi'ć 4{¤UŁáp>LçÔ3]PRoNkhč8x*CŢWU$ŢĄłťŽšµŃÉŽ&ÍXusâ¸cůFß7)Ůf~JX’ČAuaâs_VĂšˇÎWÖ˝őžĆÇ/;–…äwî„­Ź×y}âfEż?É•şSazőťtśHtźŮŚMéŁ5~ó±śM×NńâĎ)–ŰiĽJĚ÷HvďĺlľjU`·B©đ9é=(oŻó®R÷yy•jÎNŽ13ÚĆąnÖęÎ$_Ąt:ćEHŰŚŐźxb”jĄ9ý|ćĄf;™‹a6’ő&3@[€ĘĚĎ‚ť5M)4Ń÷…`NYá»~6›÷ Őžĺ›]I+ßý`Ś=Đi¦›g{O\ŘqP)¶Č¸'‰-;Š­U<Í߸Ô}^_ĄŢ33ÝQ_ůť 5K'çJ’HDiçl´Ńq©y[•Ý'Dwb‰z29ľdĎTĹě!×ěĎÖyµ‹G)d*˛Ż|•rj*üŰ`N%ÁŽ ŔÁŢ0bÇ?đF=Ł|/7ŁĎ“ *±vŽÂĄ3;¤Á`/Ëqę‘*3ŢŤ|wÂDbuŐµťěçąŮĹNŮ|r™čěÇßyrKZń‡µß§™ëwyµ‹JLŤŢ|>ÉŘ—Vhđc/~6X?ĄŹ*‹#‚¶žĺVČÜç+Î˙ D_ć„çę«IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Squares/images/preview.png000066400000000000000000000142251361462701300261340ustar00rootroot00000000000000‰PNG  IHDRddG ĐĽ”uZPLTEęęęčččéééëëëçççěěěíííćććĺĺĺîîîäääďďďăăăđđđâââńńńáááňňňŕŕŕŢŢŢßßßóóóôôôőőőÜÜÜ÷÷÷öööűűűŮŮŮÝÝÝ>=ߣIDATxÚ4š‰vܸ’D±ŕVU’e÷{3ó˙ż9÷&Ý>¶%•HąED&JOł§žr;·TZnsÎĽm|I)—\ĘĚ«öÄß”ű(uŤuô1ú:ĆŐRjµçZzŮÓ5řUíµ®tţTn_µĄzî‰ç—šSŻíícą­MVČsÖ’s+y–Ń›H#—QDZjęÇčDZ^ą§V\˘ć­^ëX˝_«ýĹCgé­˛>Ţ;ËŐŃJa“{ËŘ“[ŰZÎŃZKyź­Ś’*\‰uĆĹ÷X~đĚ‹Ëfć§ÂĹă¨5U×80µ—\sě±÷“ť'śÔ:–ž<Ú6yh.©ĺ k¶­,]úę5­Ü?ÇĹ3ÜÂćŘRę3ç:ŇzÍL}¤tąî•J­;‹TÜ:K+}kgX1÷“,¶ť3ďűľ}†·ö#Ą#ńśKź\?×ńaW3é‘<·ńgŤńúŻ˙ă€R¶Ě>ńČML­Ä©Ž‘{ĂbÔĎ!„×WlĹ•;éEČN[Í\Qc•j„[9›Űůý:ęups]}Ő/jq1>ĂlźŔŞŰČCě#2$¨¦r©Íl°Ďĺ6î YŤ}"ŰŤĄů™çë †ěÔzä_\7ČŔ‘ó±2{óâMwmÓŞęrŤ_NRšĚ¬‘.šP\’K«y¨łyâÜ^ŻÄ6I„Ń?ýWeŤHŠúŞ{«ÜĹf 57Ě0J ô®$ó2Ń ź"'±ß­Ôz᳌G›‰SÚ|_W5űƸŽkśd%‹TbĚ-ĎeăÉ]Až@B°fc¸€°é2L[Ŕ{/nÂ/”/HŃćŃ×HÇó‡Ô;"Ô­űőž¤YŐÜâCJ•ü)V”%äeĹúÇcMsÂťbŚA«ŰF!-Ş3±łkýÚŚ;UurpˇD1ÝsĎ…ě^ÄĆ&»C ą‰ý(‘nrôąőĽ|©Îm_/ε/ÂB ĂŇ_¸aÇY<“űŰI “wĹĐň#·ŕ,ľR´‡wа-Ąáđ”ăzÇŃA÷Áč#Š1ߊÇř%îĆ}FĘdŕF]ĺx4M€Äü@’\ hنÇ"§z׸ɖnf¤´ůüJĘě¤*O_`ęáĚłFĎQ5†K°Q; 渷}żżv`eű2¤F_×ř¬o!˛Kđ*mc+ř+A[Vü0&dŻH+v‘Lso$'‘bIe1jIV ë­gĂ„3Đ ?ýŐ âkěk-(”ŕŹ×°(*‡—s[XU3‘o62#ĚŇÔ(Ú0@äÂđ3Á Č{\Q_ňÇgŤ€% _Q+ÇKŚĆ\$BŮТ·ełŚvoV¶t4Y‘/üŘČŁYx$ŻHHĹ|„?>ÇúČ$ëłŕčëő"ö,1l¸Đ HD챚îâ8@‰Ť¦Ş©¤T>˝s— ŞŐŞmÉwúh™8Xp"Ĺ8–üşFăňŕ^iA<%ܵ˘ ‚ů,nEPP˛-‡±;[„˘‹ÎrÓv’--ęIj0&˘ż`Î;vÉęü;dä¬-tˇH!ĽIŠ®VÁđwKÔšÖŕYx»lÖh4ż„Qs(’»qÇŐĄ´Ś~Ł«e*i*…4j¦›6)*D—9¦ľ,ă;ő> ŮAlÍĽĂ}ŠLW&ĂJäŻ÷-5Ľšäđ˛’Mń¦•ĆRĆńL Fω&BŞ)áÇěŐëCá2ę–]Í•ájĚG—7ˇżH¬Bz¸4°8#4 + ÉÖ䋪íOßŃ"„ÍTl3ŞH‰0¨ Ľ`ú3nAFżŞ¤ &+mäˇk[G5•˛Ŕ@fé›ďú˝¦hö‘‡Ć@ ‘"|5N%Z+ÍĐéŠ+¶FďąĂ6®ĂŇÁülwÔ¨Ě6îCŻłl¦}="NR‰ľB$öęĘŔűhađGfuiíl{´1ĐŢ 3H÷ü séô›öÔ˘Ő]FĐÎĚÄ\bŽĹŮä'ąŘéDrŢ[KH¦„©Ďžlp7) z8ď°o8ńnřŤ&Qßr)Ř‚,őˇÁ ŹĘßaXhÖ”í&¶+•ठ"ۧ63«Ăb+¶…»„áčntäÔcˇAŞéo‘0ćm„sĐ/CEU-ě'‰Ü ż«ě‘#«Ę[đŻ#ŹqTC-]Wí´ŃHj˝ťÝS7éa x\q˝PNaĽRÁšO?Őž’ŁÓć·—@#śrt:·#×čQG’Ál˝G<)˛äó–ŤOŹĚ{T$;µ€j˘Rnn âčhl#˝úëEËňz]¦śÂ›ő|Ęç"tÎ_÷zźçľťÔ®ÜvĐčűźs˙ţ~˙zďď~ťçĆׯ÷×˝ý2YOkŁS8PRŐhM=Óęé!ˇĂÁÎMŁÎ;+CµUÉĽÍ7;ŘŢ÷éďv˘sľw>i÷WȆ9cşŃkşegÉóÁÇ$7Ť )7í H"lrTa‡Íçű“óĚ|ÓuźŰţf·ěMś;˝üvľÍnšÄmÉŁ“d±/ŁeźĘÝ qŹĹ-¬y?ë}Î|nçý>›ü†Yű~:®©>ߪ‘sHš ;‘lCDŔ’ÄBÉ«!”ňpÁ˝aŃfvĘQ+zg;÷ÉżN tň=«ď·lŞčěďcQoűŠ–ËJ‡ílűŤËÜy6ŰŢq.QO=®Š %ą±@‘bŕľ;Ĺşß‚$yÔ’PBć«IUŚ ” ¶OŮš\~˛Ĺ·RCř #v¨gdÜvďfÜMŁÁJ»ţŞëŃXÉ8Ěą‚=Łs'š}¨ˇ€4 žéĐÇŞ‰_T{Ä=ÖŔPbDfĽX¬í‘]ŰÓz8Ú%{¨±ĐR=zÁCň á8—»ě¦Š…łźRĂj– č§ëđwĎ»ńßö3‰–S~+NéW(U×ébT˘=ÜeŔť±5ařv'+D5p¤ęŻJúČůK°ĚvS%ŰöŢzÂĽl»%ůĄĐ0ŢL˛DµÍÉő’mb|XÔâ=‹Dź›iĺl“úí»«5Ť#Űş‹KŔ°}˘Dő ˛Ň†Üw·ř¤d2&Ď›Ôa•s:K VIŃđýý‹?ß˙÷ýëź˙ýš÷ţĆkçľýJ晞pNŞŇYJKm—ě; a%Dű8¬ž˛S­ÍqˇNâŁ}{¨·ÚÉ}eW>oŃĘć§!Q= •öB@âZ§XÚĚČŮ>ÄŚ +A˛ Á7BĚyß7y•·űóş>Żă¸ŮOßL»^d7¦B†Aˇ“r°\´(› úfŹŁpł-ĺÜô›Í0ąé0AěŘHiNľK6¸Äkwv ÉŚÇŚićN€™mFGfS sĘt]Rv Ţ^ôJäĎś§ă Üe‡MLmru1QGr¶Š–Ô˘DrYľZ~iÝŠŠ@•ëdËÉ®6Â!dů“E,ä ,ÜQÓ„ş h ™ďTÓ•Ŕz-qĄ’×aC3©NőIP.-7"”óěĘBóŇ Ý=Żĺ5PEF”;4ăXq$N"_¦¶,ŮĺćÓ™öS×f%ťe¸ČS‹ćmörBQ§v°^ŕŃa”rŘ4ôű©ý¸2 éÂ"Ň4-@ŢÓ–B~DgC›‘YM;÷HPúöuďĆ˙ßgu˘{)·MÁBB¤ŠPý ’ŘëцVŐ}ď–ŹFqJ‰Qú¬1†Ľ·€ĆďűoÔóöŐŕl«V»ŁĆŃjFÇ"ž8żRČ SÁĽYxž ŘhIpÚ0`WJ¤+~=‘U,BÚTńtŰR±Ô[Kžy˛•<Ĺ#ń´^…˘z#&äÍ‘0ô»ur‹¦ßË毆cÉ.2·ĆĎt¦Qcjäč Řń7[™7bäd–čKéá·`Ňg2Ç×p—×rś{Ô= iťťv.‡3ëśČ꯹WŻţKDŘTT-,p!đžp$×ďBî­."Â÷×K®C\Ż#kKá4żěŽŇ ÂÓťgń±#ËöźčâäÁ&ˇŘĂ»$éZć´B‘R (ŇŁ56Wźf¤X×FV©m'4ףyĄÉѱ-Á6ßűPęőXBŞEV×Ă‘Ť$ę±9±ĎÇŁŰ źGÉźçvç®=¦K%f+3šáw~ź/Ďeüť,Ck )wGQÝôź›lô& 0)ŐÎąţÍ;37Ç\#“&[©ĎĐÔŤ-bi»‰XŁümlMlL“߂¨F¨ujĹ.Ľ4DÄf´·NĂ§Í …‡şr®6˘WEeâ®›@Ň6,Đi9‰pÖď<Ű®dµÍ‘w dÚĎâI2Ź|µ7íÁŐNňť @Ď`¦ł+M5F3žĆÉ8(J5KŚ*¤¬R´šČś)¦By^‰ •©–A˝ďóŮy®g Xq ×bÄTŤ ľÝ¤ˇ˝]íď† RŇŚŁ Ă_c@Y<—i´g\Ŕ RTĆĺNÖ€¤ŮCý9QvĹ=fŤY6ÄęÄ9ŮË-N€r Ä÷đ¤ĹyQ0C—8Q„y5R=ĄiŃáBŐ“T8U=żÎĺäÎÖae§ů“‚ž¶–-U˝ 2Ŕd›·˝‹'ĚŠ^ćéú­”bęŁ{śŮC4E9wĐ®‘ź"¬QŕŐ“Mg<=ę9ć°č4*ö+§ÖÔG†çGőĎŹíV‰hÍqÂÄżŢűö~żĎŻůSŹ8Ěs|TŁoϡ•Ůrzł•kĺëűôę78ôýö”SĆ'ÇO§?ţ5gÜý@0ŤúsµWe ëĎ1˘ůQ­9hń9`čž6Ô´5¤ÂgŽxŠł ÁÜsAJHQ#ÄD\·-yp Óëő©h˙ď|wqNĺÜË!ÇŻ?×úýy}ţ\”Ŕőúęős¬R/ZgG4źüMCWsRŰďďűüEc,űô§?öohŚÓ%ŮŐéß"%{\ž{X^ţž:uiÇż‡^šŠî˛“hqÎ_ei'[Ť¸–%Ű(›8±T…iĂVă„ßf»ă”^N1ĹWÇL#N¤ů`ŕl2sô,ó9÷‡öDVGglzňF€Ř=@,ŁĹx!9OvŠ1^ü(ćç Y^öBŮËŽ÷âÄ4LŘâý„łtĎXŔ)“Ňz©đÔ1ü±Nzź…Lńčč~!ÄCQ{ '˘zď,‚<3ٶݢä¦pnęU_ĎđÔ©H8˛OŤ÷ śm:ŽqŽCqŠćĺ%}3Ëô\če›óĺ"´G”Ü=¦(2í˛#^ô[śÍF˘ęEkmPŘÍsîě9ž…¬‹¤tÓăp˛E?›Žt†â;7»¦“usAę"©‡9!™Bj>gîh˘<+™ś·ë:XëŞ3ĆP«?ĺbµóţ9Ę©ş¶Ź§xăTĎń şÔžÜ°ŐČĘxőC9»)/CXĆy~P_/ŞăĄä}&y:ÎňŠ©íţôŢ9䉵۳zLkV:ÂőŔ7ęDEslÁmEuF Y®WďSq¨{Nś§ą…bŢÝľĂĚ-Ń–!‰vA.ÜĎ‘Ű)GŇäÚNĎúSftők¶IȬăyuBKâĚÉwb6ęë ЦĹ9cÇęúžQÂż¨'ę8˘aó@/^oˇPLĆG}Öxő×ř!€žŐ¦˝ qĹ—főş«_HOz˝@}ß__´2÷×9˘ľCîśĐŻÍŘpFĄ·â›u ˤ ´x©§Ć+"ą»óK%:ţg!ßQ2çÝ—.úŠs§8ú!{âu÷|5ËWrŽ—AşoŢÄÁ ‘P•'e˝ć–ux"v_ÉŃşÎ7”x4&¦‰žąOß®łňâ]Gőžýż?H° {u`IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Squares/styles.less000066400000000000000000000031761361462701300247160ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #eee; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #000; // LOGIN @login-color: #eee; @login-background-color: #757575; @login-rgba-background-color: rgba(0,0,0,0.5); @login-box-shadow: none; @login-border: none; @login-border-radius: 7px; @spinner-background: rgba(0,0,0,.2); // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #757575; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #333; @folders-disabled-color: #999; @folders-selected-color: #eee; @folders-selected-background-color: #757575; @folders-selected-rgba-background-color: rgba(0,0,0,0.5); @folders-focused-color: #eee; @folders-focused-background-color: #757575; @folders-focused-rgba-background-color: rgba(0,0,0,0.7); @folders-hover-color: #eee; @folders-hover-background-color: #757575; @folders-hover-rgba-background-color: rgba(0,0,0,0.5); @folders-drop-color: #eee; @folders-drop-background-color: #757575; @folders-drop-rgba-background-color: rgba(0,0,0,0.5); // SETTINGS @settings-menu-color: #333; @settings-menu-disabled-color: #999; @settings-menu-selected-color: #eee; @settings-menu-selected-background-color: #757575; @settings-menu-selected-rgba-background-color: rgba(0,0,0,0.5); @settings-menu-hover-color: #eee; @settings-menu-hover-background-color: #757575; @settings-menu-hover-rgba-background-color: rgba(0,0,0,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/SquaresDark/000077500000000000000000000000001361462701300232765ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/SquaresDark/images/000077500000000000000000000000001361462701300245435ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/SquaresDark/images/background.jpg000066400000000000000000000457321361462701300273770ustar00rootroot00000000000000˙Ř˙áExifII*˙ěDuckyF˙á+http://ns.adobe.com/xap/1.0/ ˙îAdobedŔ˙Ű„    ˙Ŕ˙Äv!1AQ"aq‘±ˇŃ2ábr#3ÁBR‚đCń˘S˙Ú ?řP· Y€ţ«c;l„śíŕčĹ»dĚŕ3 ©í¬ô»ŕ\üĐ%ŰŁnFi†jťP1±j%öÓG(lŰŔ|K”6mu$ ybÍ4pú AŹ™A;Ö-BÖálÜśĐH[rĚßŐŮ 9ŰÁĐ=‹vÉ!Ŕf5Ao¶˛ÍµĆEĎÍű‹6Ł HElÉ@˙oj?Ű_2€ô,HĐř”÷a2?‚éŔF˘§PŽÓ´sd¬öÖc]äçćG·µ€‹>%Ę ›6…ÉGo,Y˘ćŽĄd‚ů”R]łn6ÜGo‹“šéD°Đm'f€ĆÜLçÍŇ„öłx”R]„6ĆšŃOÚŮÎ âçć€ŢÎ;śüĐ łn7nGmÖiDٶqŹÄ [¶m‹{€ŻPLB8ŤF%ĐanÍĘP=›Q¸gĽ8‹5YťcŰŮŮń('~ը۔٦•rs@ßoh°Ç7(7FŃ80ĘĄĄn"äă·”6~(ÄäÍ⊌ Ifţ)Ń·ś[ĹĘ ,Ű$rňśś 6ěĆä¦$Eš¬Î‚‘íěŠěř” zŐ¸ÂR„XÓ2sA3ĘÄŹËĂÁ;a×ŐŹŞʍšąÉ{†čˇş%ś\Đgb  [@‹×ęĺ§<ÎtA>䌧¸AÎyX‚€Ńůxx §l#şďú±őAsĚiS®¨'ÝśâÎx„ 熨1 ‡Ď0’F"őÇ:7˘ h1ÉM¶,੠ÎÄA˝qľ®Zp@Ç™Î˙ńHK&ŻĺoT ¦ˇ‰yÍčp˘©.*.6z ęÄř `j qŃcü·2kź ‚„UŽ ť÷éIĹbĎÄ •sŽETaAjSöáĄrmŞ ą5%ű†•©™ĂÝĺoT ¦ˇ<ëvoFn@*KŠ”_G6 ¦'Ĺ€$ bY ;´ĂmPYÉ©('Ü4­LššSŠěľ+˛§Ä Ý笀Ű3µr`ÁÉg®AN˝Ây­áů‚żzfŮŚ­°-W˘^b›ŠĆô‡Őnľh5«˛3™Ť·‘gćÁ‚7onŤ?P@—§rV¤ ¶ćÜz /Šě©ń·yëÄ 6ĺ;7&%%ž¸QýÄęđ¦uü%ŰňąđÚ <ťÚ¨*.Ţ4Ş0Aş·AĄš~ ‚©9ĚsQĂŤnńĆ!˝±ßŽeĆľ ˘żqpP[p?0QX߸>«UýAĹŮu&vsIłÁ‚ oLótéú,îHŰ<Ś?ÉütAĄ¸tŰ@áW}Ś3¨AˇâsهŻĆ‚ß7ę'r7 %şE34ű‰mÚmůʡs'Ążýżˇ;˛ą9FŰ™3‡‚›ď}FŐ[‚ ^7zdNcţNh1µx˙ÖÚó§vR¬1ń'+RśMľrÔ|7ÜÉżŽż«đ@/wś1c«ř roaŇmŕ€‰Ţwé0Ď ŽŰÝIň4¨áĆcAo0%í“Á°Ě ľŰŰv›~GpUFé“t˙ö )a9[śÁ·ÎZŹ ?s&ţ:ţŻÁ»~s‰‹]Đuĺ@‚ë›}>Č €Ć KŹ(PbT Wv@ö_}É5FÔ©‰: ťđÖÍi‘â‚ĺĂ€yPŕšŕőÍÁ°öAŚql3T-ÁĘAĹAם8U Äe޶ćĺÂŘí ŁQń —pňł |=Đ ,C „ęîČ˝K’j†áDF©‰:˘–aٍÉI`ábHúsËu.‡©Ű삣 č‚}Óô'»ÁŹ‚ŽuŚf«?’ vá§pQµtWzj‚}É“CJăA@Â5«äx’Β踸ľČ@%ëšźńřśGĄ†ŞěI—0‚n­Ŕő;}0†ş ^áúRÝŕÇŠ î9Ôf0A°ŁÓ* äşî.‡/˛P zćnŰ%ęqőAÚ-†h3‘O‚rĆüĂiN0¨Đ JşÝ3F|ř ý?Ş [Ŕ {UŔh9PWć b‚WŔč—ŁçĹ@ ¶ ÎE>9fĆüĂiN>#`’¨ę&˝PrXi‚hž­ăýܵŕ 4Š—rÝ Qť«Ä BţźŐ-ŕPOű®ANŤ‰sP1E,˘ńŃóAÓ]˘”@Űf( .\—ésÁő4˘“¸#íćYđP†@Hf„íĹgJѱâ‚]ÇđĚK{ ¨%Ťf€š09ŚPrL5éëFń˘ŐĄÍÎ ‚Řj¶»E(¶ĚP „]ą/Ňç‚ Ô†˘–ń|ŐdĐmv9 äkÓÖŤăD«JšşŮ…n”Kҡá,qAKŁ9Î3ĚÁőAqŰŮÚŤF(%vŨ[&1i†ćrsAşݤ1ÄU‡oeŘŽE@Â;Ą@‚ Ó‹ÔpA§lX7ŤP”Kҡá,q@ömFSśf™‡š ŽÚĂ>ß:źš Ýµn6ÉiÔć‚ç·¶YâP·˛XlsćGőAÍ;p„äĄ ;"Ŕ·0ÁT$ˇŠÍEv}µ—ćâ+óDÚö౏?4T:VĚîE©Ú+@Ý OXđrnZ˛ LbÇW()Ńł€‹›”ĄksÓĚ ± ó3ű[$R<üĐNďoj6ÎŘ´µrsA!j ÜY›pĄ¸ {6mÎS;3cš žÚĂ}<üĐNő›bŃ1Ź0§T=µśă]üĐ´´ÔŤ5?4ó„ÉÇbú„ ˛"Śń@ !´ś_ŰŘŔEń(7BĆç§™A.Ś#r`Ťp@ßolŠG” rű –®uAaÚŘʸ‘ýPoµ´\0Χćžp€ą1ŕĚ_PvDQž(P€‰ ĚÁY€As0ANߍ›2‚7`]¸ ťć蓣|J2Č!©}39¤Űç­üô@$\˘§fAĚpÁŘĆm›0A}ĚM_ú —pÝE«JńAvᣚh’ŕäÜsSŮbCf2@˛ú<żŞíŮĚVşfsS«w^Vô@Ŕ?žé%“·ş ťŃbx #k0©÷@–Čę]¦ĽX¶şľÝś˝Đ@ł8T ?oC'¨Ą^›µńA>ăř¤­iP‚‘ĹÝ›4Ô8Ŕâ–ŕ=[›Ż‚• çT 6鑣WŠÓş,O•Tű çqŐş?Mx rŘ čP%ÖéHŕÍăš‚Ěŕ8AŽb?Nh9nŐ¸°zř YP±u@$"`Afm—ś gPŠ"7ęzu8s -ą\˛n ň¸qD=ĹŔéÓĚ K×g;rÝŞţ(ťĚM§˙`=ÖúĽB Č\”ĺ˦ęŽîă±Ű7BBt9ŐĐ>ŰÎA…3¨@@˝SÓ©ÂŁ$ rѸ +ĘáĹ?^Co§2r짬ř—ÁS­r¦ĎŹ0AŤů€Ý<0ć"wÜą)Vʦ¨Ëě9)ć –îJsŹ-*ás<í?ű~^münŢ(Nä§pbŰŞ2@ýK¸ôťłÜNä¦mČmŞďš×—ř3aW@MŮÔôř: jäÄ®H[Ýą¨í‚!ú׌Š`Š[×e+Rڎ´rďšŰx3Űr1ćŤă˙^? {r˝nrĘŹ©ŞęÝ‹µŞäw zwMł [`q¨-WTÝH 44b˙‚Gs/ţoá»đA0MË’‹’Î \ Čŕx„ 13ş-¬ťţ::×?ůłaĚ n]©épÜH\”gp}MGŃëĚÇřč1Şr镹DĹťś»ć‚Ý{ˇžË‘Ź0@ 뤿Fšn"çrdAäYĂáDeŕÜŽ@'Űw6˛pµÜW˙(31ÇČ ćžÓ~aąhÇ‚¨#~h%tŤ‡3ŞŠę‹t@ 82*LwÜ&źO Íőz Kń="˙ň¨:Ĺň3|Šií7¤–ŤčV®+š¨K„lg ÍEYÉ.2@F łj6\NăŚvü*ăp4*!ܑОf•â ,čÁ`î¸M0₌ßW˘î‹ř{ ™?ÚÜfaZę=ťĆSŐDWq«P"ĄÜVÔ¤F-î®d€ĎřŞŤ‘QR‡ňŢŁý>Č5-®h%řĄĂÝD_É}ÇGĹY'tÉĆ+b‚w›¤ćh.Oö·Vş„ĺÍÉŚ‹W‚ ć­@nV&Db˛d€Ďř˘B_nĄ´OVé8ňű ¶ Š w4ł"<= b"…Ł ĽtAÉp~őÂĚ)쀳ЏűH5dçŠ&DB%®\pŕíöE>ěĂDżür«áî§ŃA¨Ă/rÜ˝2Ě)ě€yV!Ě&š »Ť]ó@1A.ĺúR¬ŢáçŠ&U d´®Ş*ŰŞĂDľZcĄx JÓ8 hsňAK`ď¸dtdEĄ‰äRĽ^Ü€Łłž(:Ç"2Ĺ€ üF$unfÍN‘)9 A>ŕ5™diî‚/&Ł*ˇDN~Ş)ě}RČŃĘ 1¨B ßac˙*‚µ¦qA€4Đçä‚ęĚČÖŤč€ËČ R^$ >%IäFX ĚáťŔř K?Ës#Ęç‚ ±¨B w;zRl)î(±hĂ݇oi‹Fľeíٵ՜LijśÂ ŢŃcń('~Ĺ«väc†bçTa¨~* C0ĂÖ-BḠ\ÍÇmŰšě`–ĚćUé[ RĽPNő»b€ÍťPXvöZ±¦ŽPŰŘ‘igR‚]R»uŁË¬ŃÂ=˝–úi•J ßłjäc†bçTű{DVĢíě`c†(®i[ŹRqĺ GđA…»f¬Ŕx” 8Çl¤Ú éűk ôcsó@~ÚËR>u?4­‹ł"ŰqĚU›6w},ur/Z´!)¶AÔ ™„]ŮŰl; Ş­Z” އčÚbŃĂ7(V­F€Ň Ř žĐÎ2ĎÍ6Ç AKp„Ą-Á™¶ř ~•łMľU(í¨B_Ĺô-7ÓŽĘööšĎÝ«fäĂ8‹m©ĚUOocwŇÇW(ý›1„Ą¶AÔâPf۾߉AŤ›8CŽ('(@\!€mąµ.ŘšmňŞ+qüw‚]ĐJ:7őA;2k×F•ýR˘…ď–µ |Ő$\>y Í{vÝ1Ž‚âĄÍFh%|ţÔ‹R”â A.č‚ÂQŃżŞfMrcGôAM¤TŕŠKň=ůŠ™J„Q;dŠŚ"÷®říoDIÍď–µ!äţ¨,K‡Ď4 Ů ć¸ÝY pDB —5˘–dm4¦;äÇ ę€;—('÷®–oĄýú6;äô¤ujń@¬ň-˙…P7rĐ×EÖë9ś ( |t@—ź§"<=ĐI¤@l +ÁˇĹY&&zApĐF!Ě-ĘŻ‡ş*ňc…u@Ë”Á{·K3mDCźFŔ"ĄÜґիųȷţ@ËTW4‰ŤÉč[Ův‚1 ˘s¤IET÷"–›ýoąź˙:ň@-޻Թ8ÁÉŰş˘”˘ ›·ͧó víÉŰť¶Ť+¸jzw yŠ &ŐćcÖˇ­u­Î{mą¦`5Uîµmys˝räí›lř—4™‘KmţÁÝwü(|B·!9ťĽĹ·T cÜýľU@·.™[”evrîĚPXßş[öřnVë“ÓâáŤë‘»póĺqJ c~@Ľ­żű [—ĄrJ´« ¨»uÚ§ę@MˬĆŰkPŽŰÓ»9Bه˘(y‹Ăʡç‚;§ gP‚żs3˙^>?‚{™D·MĆ|ß‚Śĺ9Ü”aŽ×ŕ‚Źp˙×äw»Ô0"Vöę\Đťç"0Ç'6۬Ű>!´&%1±Í»2 ·ű‚w%{¤^;c™pZ¨„”.ŕbçĚ"°…Đć1ř„pśšĄQu'˙Ďâ “¸`wA Yę5AWľëÇó›Ń-Ňqź0@‚éŤËŹ'k‡Đ ¸?üü‹ţ'vě®CfĆ'ş =÷"6¸n0•đ)oĚE®ĘěŚ`Ć”qJ Ű.˙óř„p»°™Gl%Á@\$ż‚X1Žh ‚Ň–XUńi'pĆÔÎt÷A\<Đ4C¸Äj‚,Më§#·Ů$’ç |=™©jq@\T’ţ `Ć9 ç‘k’Ë đA¨FďPe&Ť8 ëÜMs€K—(#!Ď3Ąx"ł ^(ëHçDy h‡qŐ¶ »tävű"’KśQKܱ"ő-N(9˘äŃ$ §nĚâíD’őA.ä=‚>T g,ŮdF[Jf_˝p 9}‘ô‚3(©÷N,LŠ{„Žt|Đ0“´@oPs‡ę\'µĎ=F—@1 z ę‹“DQ$ ä¸VgVö@ $ę€L<á˘#±Ë7˘(Ĺݰ'4őŻÚţ)=F»ť˝)p§‚1-\Đf!ž€ {CžăăĘĺśłľ'v–Ą–x č†Ľş ÁŔDáĹ믏/˛pÔĎ‚wÜZ”sŁú h–®h3Ď@Bc÷fřŃĎ(4«ť2UG”Ш6´lBN.L iěYޡ’¤Z”`c^]P`ŕ?˘´Hąučy}YĂS”z˛Ś…{ 2·mFžeĚGePt}µ‚>Ź*źš {~ÜŠAÉĘ›pŤÉĄiDĄn_Űć\ [¶ŕ"I¤‚¶,C Ŕ © @Ö-[‘›Ĺ„Z®sAcŰÚHÁÎu('~Ě#nSi«ľl 6ˆ©Ę¨7ŰŰ8Fą‡(,ÂWgĆłđAIX˛ÁˇLŞP%Ř[ÎŘ×ĚęNť˛>ź*”QŮĺ t©@lY·9MâÂ,ĹÎh,{{@ąśę~hýFܧ´UÉÍ^”Í$ő(!ëÝËěŢŤčo,HŚhÇŠ"D“ç™Eg%ßé k/şq°t-Žg-%çčČčÜ*€Ň„ Îi'©A 7VOáěGÉ™x0ŃdYë‚ QOT ^¸ oŽH*Mĺ‚î@ĽĆŚx„’©@\—¤bžoÔś@lŃ c™ËDP›ě$×˙(:Óę(4ŰŐ¤A˝6Íą¸ >#‚ ŢúIAŰQC耸zĺ1ţiÄŠÓŮ8nn('v°–Bžč0óŔ 4%ŽPÝĽkrFŚßŐEX1¦y źsü28Š1âtúŠM6â5A˘A»6Íą¸"(â0ř"ĄÜŹ—ş¨ˇô@yL™±ÍPÝ´y®FŰýT ižH'ÜÖÔłlžˇúóŁZÇ`€Çą“˙|˙ Ý7&c%·EŔf  =Ä‹‹X~`/Jń´zhśÜcŕS±Â8ř„V1˝"?n‡ „&ŕ”Ŕš=@ABn—k_ű KĆé߀ţçčwÎŤo*Ý“ýó@€]śĺ¶.iş.)Ĺ6ď˙†8Ô µ8ą”XĚ*/ľčĹ_Ô( /xÚ}9‚ ˛Śî”™ĂŕĂâč_¸ôµ‡ćőůÎŃŚâÂY»ł÷ă…Ľ|B MůűT8sźPÎcmC8pÜ.ĐřŠ [‘şb^<Ł7+şöÝ?PAŚ®=m°ý@ @nJs1…K8p€ěĽü¶ëŁ„ v7„”P[î¤>›mÇ‚{©Éżnż«đ@‚w'9Îr[pqD»aä\"'s¨-sÁ˘q.h¬mŢ`6ppß +ťB ’µ9Ž›šQđ˘ëIۦ͉t rôî[00`Z®řAş“ŔBžh1ą'¬yş łÝ9F“Qô@űî=-×G'vWL Ly‚Účú`ÜEPc×1c@#vVnLtÜŇŹ…?^NÝ6lNä s¸śílÚ UÁÍ Ä–ĎÍÁ;p7\ĺo§4Č&4đA>äچ”Ç0Ň©'Šó5Óőn™g·ŮŰP|G¸ Ř#JńA IlđA°ÜS·uÎVúsAФ…5đAĺşS8áî\îqB‡z}Y"ą®» |ŃcV§‚¸Â0bí•I8„P/™¨Ŕ ­tË=ľČŤµÉďHtH!ŰÇĹ Űśâ1@ ţĐ\ 6ź­tbű}T‘–żŃ•)OtĂĆ'$DíâÓňb˝)ZfŠ—pĆĚŽ ĎęöČ;Šś jžOÖ™Ŕ†sÁÉÁ!ÝńA®‘°–ÇnÜçŠOö‚áÚ}ó» ©#,äONTĄ=Đtáă’ H9á€AÉ7ëĚŕC9ŕdŕîř ×O!#Š C–ŤB áA^ÜsÜ2 ĺöAŃővżľÂÜžSŠ Ŕ1!Ý,ÔŔ Öܸdvąŕ‚ë'fA;ăö$ôf÷AÎC–ŤB áA^ÜsÜ2 ĺöAŇeý„â‚Ă 2Ď ĐR´ř -ĄFh9.—˝7đöAČąđ@˛` ÓÁk!Ý,ÔA ĆíŔ+#µĎ=děČďńIË3xć¶~<Đk×#—Ů@!ńîčË<+ĹŠäJ€Dí€Ý ÎhăŐA Ž%Ü1±"K9â0w—/‹âl2őAŐ‰ń@ŔÔă˘Çůnd×>A«A;ďŇ“ŠĹź‰A*犨 ‚Ô:(§íĂJĺ0ŰTrjJ ÷ +S2-‡ş ĘŢ( ©AMByÖěŢŚÜ(€T—(ľŽl2ALOŠHŲwi†Ú ł“RPO¸iZ™&´÷A—ĹvTř„ŰĽőâfv®L9,őÂ)׸O5Ľ?0@·ďLŰ1•¶ŞăT@ëĚScâXŢú­×͵vFs1¶ň,üŘ0@ćíăÍѧęôîJÔ¶ÂśŰĎDeń]•>!6ď=`ŕř„ܧfäÄ äł× ¸ť^Îż‚»~W ^Ag“»UEŰĆ‚ŐOć7Vč4łOÔ@ő'9‘j8q˘-Ţ8ÂÄ ×Łv0;ŕŃ̸×ÁTWî. nć +÷Őjż¨ ».¤ÎÎi6x0AŤéžnť?RťÉg‘‡ů?Ž4Łw›h #Şď±†u4#|N`B´páµřĐ[ćýAîFá„·Ch¦`ć‚ßq-»Mż#ąT!îdô·˙·ŕ˘´'vW'(Űs&pŕ`S}ď¨Ú ËpA+ĆďL‰ĂlÉÁÍ6ŻúŰ^`tîĘU†>!„ĺjS‰·ÎZŹ‚ű™7ń×ő~îâS,uMě:M Ü;Îý&óŰ{©>F•8Ńěh!Íć$Ł=˛x6„Ű{nÓoČî  Ý2nźţÁE,'+s6ůËQđdîdßÇ_Őř ŻĘä Lů ę.Ę€ ×7ú} Ś4@—P  Ä0¨@®ěěľű’jŤ¨-SuA;á­šÓ#šň Á5Ŕë›aěâŘf¨[”ŠŻ: pŞ ËT mÍË…±Úţ4AFŁâ3A.áĺf@ř{ @X†3ŐÝ%z—$Ő ÂŤSuE,ĂGQ’’ÁĂ .Ä‘ôć-–ę]S·ŮF5Ńű§čOw!7ę3 ÍV$íĂNŕŁk č"®ôŐű’:3&†•Ç0‚„kWÉń%ť%Đqp9} €K×4 ?ăń8Ž(;K TŘ’.a"Ý[ęvű a… t@˝ĂôĄ»ÁŹÜs¨Ě`aG¦TAÉtÜ\_d őÍͶ98ăę´ [ Đg"źĺŤů†ŇśaQ ” uşfŚůń@ úT ·@ö>«€Đr ®%Í@ĹŻŃ/GĎŠ€$Al3AśŠ|rÍŤů†Ňś(|F(4Á%QÔMz( ä°ÓŃ=[ÇűąkÁ@h%.庣;W@…ý?Ş[Ŕ ź÷\‚ść bŠYEăŁć¦»E(¶ĚP \ą/Ňç‚!ęh3E'pGŰĚłŕţˇ1 €Ě3+ۊΕ˘ bĹ»Źá8–÷APK8Í4`s äkÓÖŤăD«JšśA°ŐmvŠQm A0»r_ĄĎA© 3E-â:2,ř?Ş Č  ÚěsAÉ0×§­ĆV”4 q‘ôŃéD˝*anDZj3śă0ěĚT˝ť ÔaR‚WlZ…˛cng'4ˇmÚCEQvö]áTT #şQ Ý8˝Gq¶ĹxŐéD˝*anÇfÔe9ĆaŮy ¨í¬3íó©ů ťŰVăl6‘ťNh.{{e8>%ű{%†Ç>dTÓ·N@ Q‚˛, s BJ i ÔWgŰY~aŽ"ż4@Żn đsóECĄlÎäZ‘m˘ą„ Đ´őŹ(ĺ«"Ć,ur‚ť8°9ąAşV·8Ť<Ę ß1!0AOµ˛E#ÁĎÍîööŁlí‹KW'4ˇÝĹ)·ú[ŠłfÜĺ0Cł69 ąí¬7ÓÁĎÍďY¶-ó *uACŰYÎ5ŃĎÍűKMHĐăSóAĎ8@\Śpf/¨@»"(ĎÂIÁuý˝ŚXt,nqy”čÂ7&ч ööȤx9@—,[ ijçT­Śˇ»‰Őű[EŔ ę~h9ç “Ž ĹődEâe™ĚĚU G1Ăíń¸Ůł č#vŰ‚ Ţn‰:7Ä S,€bj—Ó0šMľzŃ`ĎDEÁÚ*pAF`$`AÇ =ŚfŮłÜÄŐ˙Ş w Ń”Z´Żn(0j9¦9..MÇ5=$6c$ /ŁËú îÝ Č5k¦a5:·uĺoD ůč.‘˛Y;{ ©Ý'‚6ł źt lŽĄŃúkÁ‹`+ˇA;íŃ™Á›Ý 3€áĄ@Áöô2zŠQé»_î?Š@ ц•)]Ůł@MCŚ(9nŐ¸°zř YP±u@łn™5x í;˘Äđ@yY…Oşw[Łôׂ-€®…]n”Ž Ţ9 č,΄ć#ôć–ŕ=[›Ż‚• çT 6éŐ ^(eç Â™Ô "7ęzu8s -ą\˛n ň¸qD=ĹŔéÓĚ K×g;rÝŞţ(ťĚM§˙`=ÖúĽB Č\”ĺ˦ęŽîă±Ű7BBt9ŐĐ>ŰÎA…3¨@@˝SÓ©ÂŁ$ rѸ +ĘáĹ?^Co§2r짬ř—ÁS­r¦ĎŹ0AŤů€Ý<0ć"wÜą)Vʦ¨Ëě9)ć –îJsŹ-*ás<í?ű~^münŢ(Nä§pbŰŞ2@ýK¸ôťłÜNä¦mČmŞďš×—ř3aW@MŮÔôř: jäÄ®H[Ýą¨í‚!ú׌Š`Š[×e+Rڎ´rďšŰx3Űr1ćŤă˙^? {r˝nrĘŹ©ŞęÝ‹µŞäw zwMł [`q¨-WTÝH 44b˙‚Gs/ţoá»đA0MË’‹’Î \ Čŕx„ 13ş-¬ťţ::×?ůłaĚ n]©épÜH\”gp}MGŃëĚÇřč1Şr镹DĹťś»ć‚Ý{ˇžË‘Ź0@ 뤿Fšn"çrdAäYĂáDeŕÜŽ@·!wa2k';ťĹň3|Šií7ć–Śx*‚7ć‚WHŘs:¨®¨±gD "¤Ç}Âiôń@ĚßW˘żŇ/˙*ˇÜW˙(31ÇČ ćžÓzAąhŢ5j⹪„¸FĆz ÔUś’ă$b 6¨eÄî8ÇoŔ"®7CA‚˘É ći^!@‘b΀P¶ë„Ó((Íőz Nŕhż‡ş “ý­Áf®ˇŮÜe0p-TEwµ*]ĹmJDbŢč:ćH ˙Š©Ů(-ę?ÓěăRÚć‚W˙Š\=ĐDEügÜt|P5’wLśh‚¸€('yşGţf‚ä˙kpA™…k¨AÎ\Üȵx ÎjÔĺbdF(;&H ˙Š$ öŕŠ[Dőn“Ź/˛ b •ö‰řńAlCDP Ôa—Ž9.޸Y…=`â±@·i¬‚ŕ<ń@ŕPdČDµËŽľČ§Ýřh‚W˙ŽU|=Đtâ"5eă˘[÷¦Y…=*Ä Y‚`äÓTq«ľhްy¦ÇAĐAgĆ(%ÜżJ@Ő›Ü “<ń@ŔPdʡl–•ŔCµE[uAřh‚WËBLtŻ ZgM~H)l÷ ŽŚ´±!ü‚*W‹ŰvsĹAäFX Ă‚ÄŽ­ĚŮ©Á’%'4'Üł,Ť=ĐEđ$ÔcĹT(‰ĎŐE=ŹŞY9Af5A;ě LĺPV´Î(0šüBŕ=Y™Ń˝bCů KÄGÄ é#Ëś3¸ gůndy\đAv5AëoJ[p§¸AÎ!â(6Á3?ͨKp f: ©±l6ąó(ő›p„ŤCUÎh-Đ´Ecń(7Ű٤0ń?4éZn@ÁÄv°s@ ‹8ż‹”í»pڤCj€‹6ĂŚ|ĐnŚ#FgÍÝŚ#š0Łcă= @ćš*‹› ¸¨FŘ$×W(!8DÜ“?‚+tŕXDUąn1ڍěŐóAĐm["±ř”ˇjB‘ĂÄ łg©víjśÂ=µŚ_ĹĎÍ_łn6ĺ(ŽjVş ·o1VÝ…=P5‹P”¦áöłWT=˝]ŻÄüĐNý«P¶f#Ě2sŞčXúŚ\čĺŹoh¸fP ]˝Łr`Śn:UÚÉífń9ń@—¬Z…™N6´r6p<ŞP7Ű[.üţh#˛IŚ˘ÍÄ" ­@PŐĽĐ-Űp„ EĄ«˘şmc8·ó@OkŰ»ÜOÍ4ˇvQ¤Y¸„ÂŽ(Ł75tAŐöö>Ł:9A‡meŹ+3óA(Ú¶nÜ â ´W1T.ŢСŢhő›ví“´ĆnNh9ŁĐ⓺d4ćFŞ‚îpÍďł' Łz °˘jć§]@ÖşsĺŻ Ř˝ńý‰…=Đ0sGˇA‰âža®HŚW‚ôl˛@&)µĐu6Df«f‚2c;„⨢d)ZŚŐ 2öäôoUC:‰«šťt@¶ęÝ9ň±ŕ‚­‹Đč/Ř”N÷AĚÓPĺ5ÇD°XÎ:3 ľ!†Y Nć–% fő l°A™«č-/Ý|y}T¶X źw´Ř‘Fő 1 ·Đ$ Á€ýŮí©Ąx" ‹€˙VhçÓ |(¨¦ˇĘ+ ă˘[Ą®ČhĎčq 2Í• ^€`ě-–˘rAÖ»¶§–ĽREŮţ¬ĐO¸ţ)áN("-ß4ß@Ý+ŔŇ F5, ČÎm•8˘ Ý‹ÄŰ㸠I›¦xm® ÔŹý|ÚżŕćF'öŰS»đ@‘•ÉNs…şIś8Ł m÷ť2ćô®·¶'=Ŕć€îşě-ż·\–ŘŚj ŚĄ#9•(ř H"š ÄČáµ(‹™^•Mş~ ŠÂW_řŘ~ PM®NěšÝhńqJ cŐ)‘pen脉†Đ® ‹—Oý|Ú¸A„îźŰmNŕ#;‘”Č·ő3‡d ÷ť2ćőéN{bswÁ㓲ąT ]8Ű®®s•ąĚn%łd7îú±Än„żvS´FĆńwÍîľĹ­0Ěn˘e| ŮÇó…ŮĆĺLJ1ŰGÁ‚ âĺ?kĚJőéĘłâ]ęČ Á‰ńD´E$ýI0¨od?V5Ϣ§™`$Ř ŃŰWÇ$ lµŰ€äÔŕ‚•ÚĎćO¸~„äqĄx Ä§«Pď"žN.L“Z{"ŕă4RĚrâ¬wúsA©µÍt"FŰÓ rÓŮ<Ŕxb‚w); Lt@XŠ= b ą3•= ˙T x‘ L(E~H ]Bí©)ëF>¨.j()’ ÷-Ń“fŢáťţśĐjmsP0Ű·$-Ń0 Ťú[9ó@ˇšč€í¦!vÔťĘVŚ}P\ÔÉű–e·6÷č€âĂDŹó] ±ĺaÁµq@˝ÁĚŞř?Ş"4«ÓDQ<Ą†>ČĐS9R,AŔŕ?Ş ßŰŃ TÓÝ: 8°ŃňȂƌ8 Î"íŔ YÄJŘľ#,Đfs@-˙5Óßdd Ý{yŐđPŞôŃO)aʞy€.LäZśbýP-Í»AŇř?˘]ëŠ źĺ™8†ŻFDŕÄ"’ńxŘcĘ=PZ®ďŹÄŽ˝ĂÚŢ‚#ńE$Çí1ËŐvz„ĂîÓ₝¸cp3W*˘®ENú(©÷5±"üÔP>č€zâCůnŤ+Á@DN B*]Á{GZ{ ŘcĘ=Pjwr¨~Ř4®†cĘçŐW"§ýTűŞŘ™~j?¨AÍÓ·śpĆĄ‹P>ˇŮłĘbqxĹ>¨,;nÜ>č|OÍ_łjÝŁ(Çlă…IĢ4¬Úvo‰Ş(tl†ĺ}jPÚ·;·"ÎÖÇD,ścä\ Kö! 2»óR®udéŰÎ8cRE¨PěŮŚĺ18ĽbĚTűk4,<ĎÍßµn1‘„kLĘű[PyüĐn…‚k”óµ9DTÚ=ĐnĐ%ăń(ČĆ0pCŠ©vö]¶üJöý¸nWÖĄÍ«r»r 8[Y´qF¨ˇrĚł1—ź‹ =&Mµü\ +,ŕ1ŃĘ nÍ©NäYŔfÇ4űkXů‡?4˝bÔmĘQ‹ÍSŞ ôÁ$¨ä€p>ˇ,Ů…Ă! ŕ3x: t-eq©A;ö-ÂÖčĹŔą9 n…’>š ś  $Ň NPFváÖÂoDm·$ ĺŠ+q }ˇ…FHŕ6–ŕ«í¬ă˛™ÔüĐÚٶóeSóA!jŃąplĺ‹0s@z6MvÓG(ĺ›p·)D;3㪠ý˝ŹíŤ|ÍQX˛ í®ŽQ\Ň„EŮŔPĚP€BŁ$P‹P>s»“ŽH3>&¨9äâőĆ y_Ń‘p炸ń“ SŤx Ńz±@ö@{”Ż/ÄmńA;ň=#-~h.îä㒠ωŞ[Ž/M?˘ ąÍx :‚0:*ŽŞPśsQYów‘@¶„z·tkÁ?´?î6e&ÓÝčőâEęĹm®R´ŕb6Šř […âäb¤‡ë’ B*jXÜnÜĐmöDQčÇŃťČ&ĚČWZ…QĘg4–¨)aĚîŽÔNđM©4®µDQßS9mÎÄüPr\$ß™ÁŰŕAěnF`Č*;™ m?ű~1îe•ş~ŻÁFSťŮĘ|(řQĆ7€§Žn(¨K‘»ÓyCls“žŠDË* Ŕ\çÍú‚ ’µ)ňóŁŕúňă®U@.]ąÓ#fÝKšÉÚöücÜË+tý_‚ ;—e(ĹđŁř °éăâk‚b(mĹŃ2şÍłŠ˝•§˙`‚q»(\¸öńÚáđ`‚‚ü€~ž9ľ ‰Ý˝)Ű ĂlÉß= ×KoË ^ĂĄÍú‚ç›AĄG(5×ú+•B !v1sá7\jÚb?0@ۦdÝţĄBŰąpNăAÍ3Qľč˙¦ąŤÁ—§tŮ"vöÄłŔć‚/9a:„R›ÖŃĐ=›“[mîÁĆćdę^ŽŽ? ťůÜé—·¶'74Ô»‡GŽŕş—ŞÖd7™źRdÁmÁü(D¤\íćʨS•wFşş­÷š¶XŹĚ6ű†MĐŻë ĆäĹÉňsS1J(űţŞć7 vW ˘%m†Eƨ+ľü°łçĚvýiĽ7™źRdÁmÁü(D¤\íćʨFRJ,ůş «†+ꂝ¸wiNW: +Ş ß´HĎć}-őD.Ă€ErČťóŇŹč>MMiîąf@áŞáAŠĆş { Ü˙W.+GĂľ$,ĘCĂÝÉ˙,GĹĹžľ9.ąś©@Őŕ€8`=BŁŚĐzKd=QËÓ€Er‡ęÝÓ•ý3äÔŃŢÜ!'Éľ((őë™AždťĆ 9PU鄿KeĆ4cýÁţŽ96H)Ű”ó4§Ş ׂ w¬ÉüqAWza HŤ¨ĂŠ#Žŕ=[„ţVôE˘ľ(N-’0?4ŻP^ą”‰ćA#[—0§˛z`á]¤ Š ¸?Á¤]Ă‚K€őnů[Ń!ę+âf¶NEźŐfĎ"€€A 6T7mSsÁżŞ§u+_ JůkS¸{ VsLg iŠN“ťh[Š#ˇxć yKŽ(Y›<Š€X ŮP{z›ž ńP_šN}PO¸ţ)K*{ ¸,Ç=P`HD—OîĚ Ż‚™h+‚ŕÓĂ; †nÖ‡o q Ç4ş·# ި,@¦Zć€AcQšhvéĎ—ŮOůĐO¸§o?oTmÍ›ćĹÁ'TíŔ2ś]™\9;Ž”îŮ—^: ¬I©vń@Ŕi‚Y±˝q٦~ę4Ää€\qF î S-s@ ±¨Í@{×Oéö@ÇüŽhď-™×oT,í›ć€ÜŘ”“czăGLü/Ôi‰ÉąôÁţ:~ÚČ Ć58TüĐŰŘĂkkR‚3µrpaF…Ú´[ńP,ánD ńDTvö‹Sâ~hŁööđ1âĺúv÷Δ ¶§J "ÍłMµĘĄ\·[&"żŠŹ·´1áSó@˘Ĺś6ůÔ ”íF3śXQáE@6˘j’€J"1g9 ©µn$S4ى,Í»ÇEQ­Y·9\‰"Ě+šŠ¨í{rńů ťű6áfr„kNg:č‚}`€ôŁPh[¶e76ÓT,Z4Ű_2.[·^: ^śb‚QÚ/\ţ.x frŃA>ŕ~ܶÔÓݱcý0đAÉp˝é˝odR uTN`ÂŻ‚¸—Äľ0áŽH%K·żŐ˝ A«aš*WÇíůšÜĸ®A®ß 8ÜaJ: Îô(‰ŢÚm#Z{Ş%ĘÂŽŘ䢶çg,FhФ0ÁĐ[w+DĽň· ő§ş ’ř—Ńś1ɵÉr÷ú·˘"¤¶˘ŁÜŹŮ<=ÂÜĸ®A-˘iŐĂô@wr±@— ĆNkD˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/SquaresDark/images/background.png000066400000000000000000001005731361462701300273760ustar00rootroot00000000000000‰PNG  IHDR·aĆţ pHYs  šś OiCCPPhotoshop ICC profilexÚťSgTSé=÷ŢôBK€”KoR RB‹€‘&*! J!ˇŮQÁEEČ ŽŽ€ŚQ, Š Řä!˘ŽŁŠĘűá{ŁkÖĽ÷ćÍţµ×>ç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹFPLTEFP=CM>FQ=EO>EOEPAISAGQ@FPBJUAHRGNWFLVIP[GMWGNYDJTFMWEMW=ENHP[GOYHOY>FOCJUHOZDKTEKUCJTCKUDLVDKUBHRFNWBJTFNYBISBJSCISELW?GQHPZELV@FQAIR=DM@GP>ENDKV?GPBITBIR?FO?EOAHQHNY@GQDLW?FPCJSAHSAIT@HRELUCKV>DN?EPCKTDLUIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚„„„………†††‡‡‡‰‰‰ŠŠŠ‹‹‹ŚŚŚŤŤŤŽŽŽŹŹŹ‘‘‘’’’“““”””•••–––———™™™ššš›››śśśťťťžžžźźź   ˇˇˇ˘˘˘ŁŁŁ¤¤¤ĄĄĄ¦¦¦§§§¨¨¨©©©ŞŞŞ«««¬¬¬­­­®®®ŻŻŻ°°°±±±˛˛˛łłł´´´µµµ¶¶¶···¸¸¸ąąąşşş»»»ĽĽĽ˝˝˝ľľľżżżŔŔŔÁÁÁÂÂÂĂĂĂÄÄÄĹĹĹĆĆĆÇÇÇČČČÉÉÉĘĘĘËËËĚĚĚÍÍÍÎÎÎĎĎĎĐĐĐŃŃŃŇŇŇÓÓÓÔÔÔŐŐŐÖÖÖ×××ŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÝÝÝŢŢŢßßßŕŕŕáááâââăăăäääĺĺĺćććçççčččéééęęęëëëěěěíííîîîďďďđđđńńńňňňóóóôôôőőőööö÷÷÷řřřůůůúúúűűűüüüýýýţţţ˙˙˙qĹ{ŇsšIDATxÚě˝]wÚČň=ÜBm$H2âMĽeŁůall8ÄÎřd&ůţźč±gO5‰“óĚ\<‹ ´VCKęŐŐU»öVJY–R–U«Ů¶ú븺şşRJţÍź-Ëql[©Z­^WŞVSʲl۶ńż–Ą”RZ˙lĽëkü,˙ď8µšR¶]«9N­Öhçú§çĹű”Â˙Ú¶eáťő:Îá8xߏŁ+Őhŕ pÇ‘ß_])…+Ç=đ˙k5ÜĄÖ˙öĽŹç8ęb33ëzžď{^łéű­–ëúľăA†a¶Űa†AĐéhÝíFQĹq%IEQ·{s†íżŽ0ětÚí0¬×˙×x˝^§†¶†a¦ř†ý~§3¸n«ĺűľ?úľď·Zž§T݆a8ńťíöÍÍxÜýë˘,ëvŁHk~ŞŮô}ĎóýÉDëét2™Íćó<ĎóŮ,ϧSĄÂ0M;ą·4Őz±Ăěäh4|żŮ\.[-ڶ\úľRĽŹ4MS܇RQ„™Y­˘(ˢ(޵vÝVką, ßÇ'ooµÎóé´,óüîŽWóŃx¶}1Čąr]ß÷}×őýfS©N'FŁ ‚0ětÂ0MµŹ‹(ÂIŁh±Č˛űűđ݇áŐŐŻĆ ˙>,‹?őűüéţŢ÷aNë*†ëuâ:Âp˝îtîďÇă(Š˘(ŞŞčŻă·ßZ-Ďó}´ŐZ.˙ď˙´ÎóÉ$˙űLňܲ0Ňh$׾ٜc4Ę2ÇÁŐóµ(|ź×Ś+Áq}]UYĆ+©ŞĹ˘Ş´ćuđ~¶Ű™śšD©4í÷ńhŔ(ëőv{j0 ĂZŤî“ëşžgYĽy´”‚‡ŰŠ˘,[­´. fiŠłÁý}–eYĐ(iа×u—ËVk8ô<ŚXŻ#Ľ0­mGŃbQUQ´Zq; 5Ţ/¦<¶[b:ťLp]ŤW«] rn) nĂv;lĺ”j·GŁőÚÜn6Y†-aUÁyeŮÓ ÁE©ÓQż/Â0MGŁ0¬Ő°¸Ă!őz­›ÍÝ®Ő27†¶ŤÉá°|zBŘ›e {łěúĆŕfÔ÷´Îóů|:Ą9ňĽ,ŻŻe ř(iťeA†tZY†–µŰůţn‡@aątÝÝ®—37sucĐuFÜgQ¸®8ŢĂá·ß$´x|śÍ¦ÓÇÇŹĆSębs36=<\×LpS†Z˙ç?ĽyüÇZó÷ë5‚€ pś˙5Ţza¨Tš®×Üâ÷ćÂĽ\rQÇC!áEż/›ÔĹ"ŠV«,Ăf GQ`noµFŇ$ĎËr:EŇ‚‹:Ýgż†Ç#śUgYŹFY6Y–ëbJĆEQ8M([9YÔă3“$Zsŕě†CYÔá¬>}šĎçóŹĆ«×/97ěvľďş8=SĄÂ°ÓÁ˘†ëušöz 5«ŠŽ˘Ş´f°+‡úĹxĐqÄâiš¦a¸ŮŔM!(X.]·ŮT* űý~?č@ëńXŽzť‚ëúţr‰IN1ÓélÓ(† 4bha¸XŔ Y†Y† .ÓŠ|8Ě;]ŻÓ4 ‡áE’DŃbM*îa¸ĎOźĚM*®ĺűńjµ‹AÎÍ Üľ‹±mN3¦±× ¤+D‹ă$ɲ×W,ĆüŇAšŞ_ކť‚\ {ař4 Ăí–‹ ľęÍf«Ĺ´ “iÚ鼾v», ±—$¶Ýl⬌˘Ŕ$`S8›akX–0\76¤ŘĘć0Ë”2¤­V«Őj1Lĺ' m{µÂś$I’Ŕ8tź­Ör‰ą8`Oźŕ´&“Éd2ůh<Ą.97°<Š‚"KŽ××(Ž˘ɲ$ Ą¶Í’d˝ţ}9ôŤ‡ŃP®µmĄ¤`*ĹŘsŢÓźń{Ľ_JĽ2f˝.ç’Ď;Çh4đĽĎ¶ŻŻĺÎpoRśýççýůx¶}1ČąD’żřę¬×ő:ľRřzዦőုľďűZł¤Ë4ßjeŰŤ‡ŻĽ”|–KĄ¤Dw±ŮČBKǢTYÂÝĚf\µ~x( :'ßoµšM­“¤Ş”'Iu»ŻŻť¶ˇrMŽÓj5›H§Ó=n·Üzâ®#ŕ^Ąt`ŰĽqËJÁĺJ0Ý뽾fY’`©‡;Ź €Łä;?Ďq.9?¤©™ä CĄĚŕl2AN‹ł®«uu»H9á8Ťgn÷N*…đˇćbpÖ ˇqĽ–ŮŚětŞőĂĂp¸\šĺU­Í 8IŞjŻ(Šđ@\ײ˘tE–Źy`0­R€Đ őí-śŤ$iŞĘ˛Ő é”(Z,Ćc­9ŻĄÝ6 hÜj…Ö«ŤŃíâÔʇt:Ś xf­†ß·l· ™ěč÷ÓT©S(čdxŤ@évĹU ]±^ŹFť¨ëuŻ(ŽfŁ XŞŃďă>úý ŇăBO!ŚWŠĐ?y>j„Ďu»„ÁŹÇ»ä\ "ŽÂ˛—'0¸,ó|»}x8…ŘűľÖ€ß3‰–eUeÂld<łĽŠWÇ‘bŹÍF‚Ńź·¬[ ´ţż˙cŠEâVëţžN“Đ ńřţľÓ9meCĄĎ8´´UHk„´K€ťŽRHKšĹŮ««[2îď*•ÖŤńˇ5őźŹw1Č9`M)$*…–+$-ŕľ®Ŕ‡Šbąlµ\)‚,æ.ăăń$­Řj-—Í&ÂŢÓ€ĹBk.Źh‘ät:ĺŐĚçłŮd2ťj=™`4¸żáĐ÷_^˘¨ŰͲ(błŰx|s#V¸Á^O)sc—1`i¶ŘŮ6_.ě€8q3Š€Ŕuëő0l·Ń"Çćľ›n€čvµ67†?ďbó3YľDҶQ,•VfĄŤ«+–eĄ¤j–?y QřŁńäLŽcY××WWµše9Žq-Ëq,ëßť—ĄP”a Ë™Xúýľ\űăwŮv˝~ÚlŤ‚.ŠÎŤ†4K˙űóţŻń.9'é–%ąMB!e˝î÷µ~{+˲śĎٍ,Ëp—ý~ż÷ýý~ż˙üy·űý÷Ýîăń€¶Xŕg^ÜP10F(¸\#w:¸\ÇÝ]'Io6qŚŤÜçj…Ťˇ®×aČtĎ!éw)Ž1uÂĐ„Ťµć$!hŰý>ś‚Ů^C3_,Ćcl>Ó”súóń.9?<ş(Ěů4•0đĺĺím6›ÍĐÔVUIR–Z».LňţľßżżŹľŹŤ×÷ă1E†ř)Ë®ŻĄŽg91EHîă¨×Q^m·;ť~żßg¨,Ë2Šfł˛śÍćó(z}E±Śŕ‚,ŹďďqlňT“·.-5WH Âä"ţMp‚$y ‡ŤŢĂąętÂđţžpB¦rĆă§§Ó¶đźŤ÷rńb32ŇżüďV g4Ç`†ťÎvÇóyYÎçI×U–Zď÷Çc«µßűţń¸ßď÷űýÇăeY·+iv@5¦)\B݆OOřšŠ‘vł,$(y`KŰŰŰ|^UeEóyY–eYn6&Ť7ŽGşś4]Żáô®Żá—K4eÂeŃ-Équ%a{Ż×n#'¬”ήŐ2aO8[Żw<˛yČbŕřU ŢŢîî˘(Ićó(ŞŞ˛„AäđýýŢ÷çŁńâĆŤ‚€pYHąĚ¤ĚT4R,a8u:P¸8˘¨,ŁhłÁ’Ž”9„™ŕ˘zÝ :p¦×W–j™|—Ô ¦3ˇTQđ”°¤ŕ†ťa@Ň01żĽm9?ďbó3çÉWĆu[­˘@łľý~ŢßÇq’Ŕi!Ü,K­é¨ö{ßßíö{×ýxĽĹ‚® Ą˘ŃHÎ!“öô$a C«+6Á †Ö˙ýŻ#ŽË2IL ÜbQUU5?=q’Ó”K»epQáçˇýmłaZ$9aŘď>Št7¸ÂZ ÁFQ á±\‡frv˝Fyöé‰!/’'U5ßÜŚFhâC˘ĺgă5śźA¸EňĽá°Ů$YĚz đ%nh»Ą›"…aď~ďşŘî÷ęĂńP˘•ma–Yć·IÓ0Ľą“+ \¨çதÁĄ„İ·,“Űò LébEa źIˇÓë9›B‘Đs]¦ßĄyC8µŰR€˛mˇĚ ” E(ä˘ő6¨,ß C€˛ägăŐjś›A@mnĆčHp;işŮŚÇ0Ç|^–ÍE˝ŐÂßµÚGăŃ YŁd™eÉWKašŢÜČ…Á4® X í6Ă^ş,„e©őjEŠ$nĆ,Użn\·ŐňĽ×WłWŠ3]^żßéôzŤĆr‰f *Őë1ˇNšî%ŞNP#@.@đńxŽs1Čą„ˇŕýĂ!)‘Ř´ŚŻ˛Ö4HYÎfeY–ł™Öź?ď÷®‹×ý~żßíÔ‡ăɢÎ4#\Án„-A,iŇ $Ăe%ÉÝ]Yb›Çlbşa/'šđM×EzĐďVëé©ßç¤błÚë1,7+¸EA:sMÓk wXRUl ·ś¦¬űhĽZíbs3chDöĽS* 77ooe9›ÁXJ·[ĽÇăn÷ůs«őţ~<^]}4ÚPÖ5[0aß“G’4LŇ|¸Q4źÇńÝ]UÍfóąÖI÷ŔV€ńxłAC'µß”¤KĂ!h8\—S¦gÂ0 ŤÓ€€©:ăfÓ÷‡CĎSŠŰZIÄn6Hqb“ Ň €ö‚EŢźŹ÷w=äbł14ćJ©ÍËřŤăHAŐl{Fᕍ˝R®ýůxü< žŽŁT­v}ÍÖçFEÔ~^´#_]ˇ€Š×SZs˲¬««FĂl©Ćąp–zťżA“2čĹÍbôŐF‘‚¬Ö˙öĽŹgT’/9HS/¶5˝že}ůâyy>zžçyŢ—/ËĄÖ“‰s(Sm·p`\Zٍ,ážMS´«Y–´łqtu…f‡Éd:®,żoŘéőŇT)Ď8îřă¦íŽ@7ŕͦď?<€şOŢ0¸8?…µÎ˛n×l ʲëk¦™:÷{ĄX†ˎ˘ůܲLz&,ć×׼W&¤ý‰ůŞd aŤ„öµÚĹ çf’M§ăŔ Óétúř¸\zžçi=źŕŹ­ůq¬5ËC¸<$MĺćPBJľŮ,?)őř8™ä9^ŮîĚp{˝FÚmŃËĄçEž{žç-—“ ÓŰ oł „/(:±Ńŕůůő <(e1Y NĂS(pQ>Ë2)1Ű6·Ľź?ď÷ź?űľëZB~¦kʲ,•Š˘Ĺ‚€APáüů'îł(Š[\d±čvQă,[,,‹Ťv<9ÎĹ çf¸* Úz˝Z î*Ď‘ . Ŕ7nčv« [žÁ@.ŚÎK)¸*)ÖŽFµRh®‹íĎréű¶Ťć›<źNďîňüÓ§˛Ô@&ß‚`˝VĘóŠ˘(–ËÇǢX.‹Âóęuqźt^ g‚«đ<Ďy1(60Qhľ´m6™Ô‚Ł!ąjËBşÔ÷?–ň4Ó5óyY‚ž ж 0T•éËĂał©*3µ‡Ë$:Tębs3ĹM°¤§)&a:…ŰĘó˘( ¸¬,‹cóö´Ćb^–UĹ”ŠR¤[Ĺ’ľX Ť é<Ăó|ßqň“c:Í󛜑Pçy>>>âY.=OksËĹk‘M%Ę\L§śN‚P\ĐE›rB`v<î÷Ç# ż˙ľß۶ůđŃE ¸‚šXs{űđ őj•$\¬VQÄ"Ă Đm\ rnaú…ÎN'  Ď[.ż|‡Ăɧ֓ -ř‚Ćńń8›•ĺÝ–ö$™ÍćsŰfú0  Ŕ íFs SčÇDzśL¦SHĐéŚFŁżĆJy^žçůr ’ĎűŤĄQ„´IRU¤÷†Ń]×÷ÂćđşXŔ RŠ"¸4ĘBđ“mď÷Çăďż#đőý÷wßWJ–s.îJ1śM:ĐzÝu±¬ăuą„A`¸Î$É2!«ąä< "0H¸ nÄ–KĆó6›É„.‚°f¤Ágł$)K ˘Ŕj,ޤ_bšĄ|´’ˇ™ł,±°O&e™çI‰‰âm{žçM&yŽW¸Ď "8PPfŮźšÄ8­–ďO§› těQ´X€Ś_š/ _^˛, OělŰu]®Š‡ReywEÜ—eY6QÄ´&αZ"şŰ±Őőë×íVšÇYÜEęž0p>€ś›Aú}ˇ¶[ŻĂmĚ(ßŕď<—P3˲lµÂDkť$I’$e9źKŘD‰ă8NÓ,KS‘°0…ZĐ2GÁ•<ĎsˇřŁĺ&nëË6}.‹ĹŹř§´KXÔ%mB7qJŁÜďCh  ę†~•BYúý}żßďř^_›>ARŤËrÍká•xžëZ“NVZĐ K8®Ë¶/97Čĺ4 —5ť"YÓl6“ o>Iţjm¦ń*Ĺ(ŔŇ”.ë2Y«=>N§lż†ëÂ&ĂM›mĂq2mňřC&Ŕ¶OMŮĽŐ Ű1™®zť…Z4 u:$ăÇ‘¦h@µíýţýýóg ŰƦP‚˛´m)¤§ułŮj ‡frńĺEč(eŰŘâN{˝4 Ă««‹AÎÍ pV"͵ŚđĺËtęy_ľ ĺ=›ĹqUUUU-ÝnGŃfSţp`QiLǵ' ŰĄfÓu…hł,™€×šP2Č_„aXVQL&EQE1ť>>‡ 0N$ŃňŚâětúô$ă´5r§Ű1I>+őţ3Ľżűţnw<úľRe  y’0}‚ä"‚L÷jőúz*ąçűŻŻp±ÜBVç÷zć_ rn<5Ę”(5‚[ä·Y”m4ř.ţŻY”ť6Ę‘ŹW«Ů¶ăH4 ݶ­TŁÁ±MâîrŢŹśAqÎ’/Ąľ…ä\)ąGĘ•KˇÍÜ(.ăŽ2łźo6˙öĽŹ÷wá÷b32ą‚Ś5ČÍ/öh¤őńX®+´Ť­J®hŇP'”:ÇׯĎχăPNLŕc„ń÷űü·ŰpR$ʲnpˇ4ņ‚ÉZŹ,GQ8!ł ę¬*¤ßA±‰Ť(RĘäFűśÖI2™Ěç“Éb’őŞrśÓwżoµ”Jn‘L-˲´m3­H÷ÉŤ-’ëiZU(ŞQ’éĎx^«E¸ď___ rn‰c¶d"čË2ŰćvĹ„’ŹB¨Ź–3sQ Ąno‡ůůöíp8l,%Ě? RŁQšAšn·&µ®Ĺ~!$Á‰0Ű.ůá€9Öh4xë»S-Űí|^U2EÚbq}ŤVo#Ľżď÷¸ŹďKÖRJFř@:?č1]Ż__ELŤiH„ôŇž PáĹ çfBňĄiÓť°‘“wEP0Ú‰I§$EČzýpŚÇßľ˝˝™ľ&Y¦I‹‡sŔxŤc„źAŮoiłÓúöá$Ë@0Či0[U› Óâ„BD‘Đ3Iă“Éd‚×Éd2qŃ$–e–¬çs¦N$%‚sm6lŁcŮ©Ş´LľW KHĽ¶Zľuu1Čą¤Ű%%ĐŽ14  ­»˝˝¨néŹ?N›ŽQÜšĎźźźź‡Ăa6Ygµ:mđZ­”ZŻÓô”–\kn̶Ť,‹Ô’NŮnŹG“’î“đ:’úŤFZC&–¤p•řÜnçyEŃl¶ZÍćf3™ĚfXÖ“¤Şh÷÷ăćŔň®•fł˛dSťR,´ÇZŁu”íaXU%=˛ŚÂăJ ‡\Řîz1Čů„M4qŚňe8řŠ čt¶[ʡHęyľ˙ú*ĄPهa­v8oo‡ĂŰŰ|ţü|8ŚÇŽ#EđU\‘¤žŃî,„(n…ˇeî %ć§§ă‘‹ał‰2éÍŤéÔ:ťN§ßy©*¤AeáE¨‰BĆh6·ŰɇR,K˝żłˇŐ˛X”…˝,-Ë”¸Ä\ľĽÚEyÄ1šxĐŔĂŔ—e S:ăŻEýb32ČbÇŘŠ-ŁŃbPSŠŠ$>ůµÂ´ZŻŻB,F‡aŰ_żŢŢľ˝a[XU_żHŔ L›‹:>Đu:Z“€Ą"lRyk$X~z:INŔ¦b­ŰíSąxl q^Sp¦(\áćpOo6q,!ďlF`KŘją.ś–R,7ŔiEŃ|®DźĚŇ“ÖqVŞJkq.ŘFb“ʇ NËóZ­‹AÎĎ f ěĺ`\pŹG.ćhRD¨y*††¶}8L7č;°Űe(Lk‘ŕš©RťťĘ™4Kq¬u·‹e]4Ą‚ĐA«µŮL&XĘů:ź7űýnw<‚0‹{­ÜÝÁ$LżKPÍfÓvË:ÓC0Â!Ç!íůn'Ťäś§A0%˛ĎIŤ@ěČ…´ŐârFĆ4Ťz=Č…ˇR‡‚ŢŰŰ··o߇oß”J’ĹBČ÷˘(I”JÓv;:d˝îő0Ť¸IívG#Ó}„ÁkqÝÝ®ŮÔĆ÷v“ M¤Ň@!C)'“l|łˇĂŠă8žL’dµşşzgůvż'”ôîŽË9”˘¬‹aU…ä"[q¸1”Đ"/QdŰârń°‡śźA‹4EÚ›Ž‚MýHÔ!đ=á˛0âË."%h€Čîë×oßžźĹ,‡ÚľĚÄ r ú 3ěE@ř hĚGrJ¸PčÉhíöz= ̬*¸A$ô]¸­»ÝÉ$IćsI0"ěú©ýţógBIrŔĎ××§ z·»X ”NZŻŃ­ŞÍćÔu"ýÇËůü‹&öb33ČĎJYŁI!íz˝^wśZ ĹY~ĽV(őŻĽ‡ĹĘFĺK4KŁś yoŠf˙»óâ,bĽ««ZÍqP,–"łŚO˛ďëkś ’ÝhqFŃ…ç˙EQţĎÎűóń¤ś{1ČąDľ.üę0af~É6›ŞBšOH•ĹBd†pnyúŐVŠíĹâ”’­’ßÝ. ­–éTP¶µŞŕ‚őZd†’gBd8ÄÝŹ„‰^^_#qÉ&¶,#Yć)Í1Ű Lč§eÁĂ??űöő+ËA@ęľ0ÔZćNţx<O—Ć0¸Ç’‘¦‹…e] rn©´ÝűľmGŃjE:„jZW8¤ËÓ…{¦ b*Ç4É2m{ż˙ýw3|żşZ­’„&ŽÍĆ FIĎ$/”x’Hb„0¦„ÂËĺńHŤl–ť†Öa8°‰§Ýît‚ Ý¦AHg°])„ńoobŇ81ô:I¦x'¸&`Aű„íE–Ą)SW(Č] rna QČ·k54Ŕc«€¤ÖU%­ÓŁQ€’â´}?Š€›Í@0V–eY«ů>(™Žh4ćóÓtĹd˛ŮÁlł @¨R§®łŞş]­ăř{1 4ÉH:ĹóŽG­a 0°q•´ í˛Á{Ć\Żm[ŕÓ«®@©çççg–ÝŞęůůp:YˇěĐš˛®t\|8čOST’¶Ę˛żÖ‹AÎČ ­–çAşž 7Ąŕ€äĎ2ĐhT•9Řzť¦"ÂË"f·‹ćziuCék×U&\&“Éd6“­XĂeívň{žë ćvj±H­«ęTţBżLEx^«u<’H™Ž˘ÝCPÖʂNj…Ö€‘řÍ—§ĺ4ŚJIápx{»˝ýú•Á9ŕĚ__)PË6íăq00…Ĺ}˛äÔŐbˇőĹ çf)\éű¤‚h$nÓM„a»=ÁË‹Ś$jBeĐěV––E’#YŘ%ě•c»Ĺ#LČÉ)eJw»q\U//ýľ™hOÓ @ ŔnLJją<źžHžIAÇNDzˇ0Ă^¦PI'JˇŐ‡g_­˘ČqĆăĂáůy>G‰úp8@'+ź^ŻĂđő•¤°lµ¶[BFŘr†Ži‚n%t”.9OŔiac…Żk’ŕmřy0¨*Ř2Ö•7Ä0śVYÎçqŚDa™Çăűű~ď8XĘ sžÍ&“Ͱś˘ ·ë:Ž@xH 5 ĄXäŤţüÓ”ˇp]ß?·[s!EšĎ˛F#6l‡!Ú·ąŕ’Đ ô"§ÄĚ«Őjĺ8,»!č}~žĎ Óa~ţřC¶Ů€ŢŢn·”Çyz˝^î“đ«0 Ăn÷bs4Č)@Ô÷-ËL Äcn éŘo&@'mŇ€ĘŔUQ`oż§Aľ™$óąÖ§”-­–çť–HśŢläáŕ”ď÷§ms­Öí­° F äŕ\•R´¤Z>†żľ˝}ű6Ă,€ËÖë48ë4e‹6˘® *Zů)ÇiJJ(lV-ëbó3IOą\zž´0č˲×WĐ7őűßAá>ŠDćP_%ĐbL“ć}˝X U5źo·l´gŔčyŤʢ Ńń e5®… .ëŘŚ1ÍĂô"6† ŽBëCn·h‡Ť Ő Ş=>ŠÂá>¤Ĺą˝%étż/¤ËZ#đć"ĐjIǰ±my,`8ţKzőbł2n˝(¸h6OÄHŁh]UO„87’‹ćK Iľ˘¨Ş@—$JQĚ©w,ęH™ Ť 0g­ŃbfŠ}c“ s¬V٤JşAŰn·\ ”ýlµßCĄXdĂCj ąp“ęmxcpśĂáůŰB0@±ŁA”ý»*ŠăQŔŕ0Išb“ +“ôćbs3^k5Űn4H™Ť’$~ Qj45Ł{}Íâď ·Ň*üŃxµÚŤĄý#PŔšeŢz^)ö ýř)Ťşă@ üű¶kţŽĄaŇ–ŁĄ…çZŤ#s \Éż=ďĎÇsś‹AÎÍ Úz=aáRS¤N^_d»…óő‰i”q$ćĆňĹhV ’Hť€®á§Đ˛Âu|ĚözŤ†YDE1ěéi: ˇńréű§î3Š˘h2ŮlÓE//0Üá°Őj6µfó‰PÜٶ$ŢçsĐٶĐÚ“ňȶARŔ /˲ěxÄÖ X¬ëuIîŁŐgµŇú˙ţ^i±3ĄępM“‰Öž÷ř8™˝“ç!]NČîűúZČçó<źNk5ł°Ír˛˙1,€AL‚Ş˛ÔiPˇłÂĂAŞ«< /a˛ćCx1Č9D¤~đ+Ŕ#MBşŐJëĂAH& ¶6‹S˛1¤Ä7éđ ý !o«µß+*= [A–m6”álĄ@ÍgžEk>ŇĆk4cµZ, ­A řĺ f=ĎóÇ”¨¤DŐăcYŢÝÁeťR˘,a‚‹8)YŁŮ-I’Dk¸µŐŠ)źÉ¤^ęvšĆ˛@©Hb„ č÷-ëbó3”V@ôÍÄš´2gŮvűő+EŮ`Ű&)Ť†YžŠ˘»;”pyüţű~ďş®‹´|‡a–˝Ľpe-ÜšŃ l6Ó©™Ţv]ßࢪV+”yŁ(´†ĚĹdâyx…ËâĆ–2’Až—%eeĘ2Ď'fÁEĐ.Käj‚‹:¤hA•‹V7”¶QşŔ+\Ö—/ Ý% ŻX#¬ú[áb336bÄM`‹ŐJ뇸’h».\¤3GrQČT%U7’ďż˙~<î÷0HŠ”J°-ŤWł^÷zŇ0Jxk’ HÜщşîfSUlń$]ŔożAt#ϧÓĺnKhˇFŁŃĺ„——ŮŚ„礭Ľä˙\×÷ c±`Űv–Ůö|.AĚÝ]YÎfÇ#L‘e‹`°0@ =‡0 ‹[¤F‚0¬Ő.9Gś¶nJ*Ëu’Ŕ ß‹Ďs!5·fúťF””Bß “ťIđ˝Ůd@#Ä<âXu¶i·Z¸€?%1Ş5Dž{Ţăăp‰&ܡ×#Ń÷Í ä2ĚĂq|[N}ą„$-·ÓW†J‘ź´I"ׂđ7Ëćs¸Ď˘Čsl §SĎ˝)°ŕüËe] rV1‹ťN|? ÝnUm6‡Ü„ç‹ÜOU­V¶-PëŞ!őăńóg Y–в˛‰ín ±nŰą"¶Ükýđŕş"o„Mę©CMČ$=>.—¦Q ’Ë"­4i]–ź>ĺůÝĚR–ŹŹ¶Mye,껝çŐjňřI˘O%źĘ˛,¤î«ŞŰM’ŞŞŞÉDëéňQx@†Ă<ŻŐ$|ŐaÖëśźALŤ4 CË"Í^UU· řćĂ·˘@şm·űóO;‚DĎL.šRß–ĺşľů9†ż {Q$B SšHŃČ>đ$A"'ŠâřőőůYäńPŽŇú´}E5¦M s±\Âe…aš¶Űë5…]´žNaŠÉäńŻJ1…şŰń'ÇŞ7$iú}Éş,çsĐh`+€€.Ëó–ËÇÇé”éEÇ1]t§3­×µÚĹ çfĤĺKş"8YÔ™Öó<¤X ^Ái°,naŽ( Ţ~<’äFąľ6—t„ż(Ąš˛¨4I–e÷÷x8§cęä´—$HyS@–›1¦Re2´¦¬ HϧÓÉäęJR‹pŽÍ¦eA~\„-\ÄýJşh»­ŞS9˛ÉDkă@@6Ď=ďËË‚D)×@"z1Čąä´ jYRN5‹’ŤĆŐ•)4mŰáF‹3Dą•Ş×µţŮxBŽ&h~‚Ôá××§…Ůr^Ű>ĺfÉ?›Tä×׼Š…łýY©ëëZM¤Ĺ!ĘÍB3ÇÇ˙ń¬˙ďbs3Úu/s]×UŠ›Äv»Ýĺ RĘâ<â8ID˘˘bŰţůxâ‡aŁ!˙f޵ëzŠłĂ!(n”’”üz ŇĺÍf<6Űi˛,Iîďçó٬ŞîîâNóí `k:?\IÍ*›J\Żp!ČV@xĹ(߇486‹žçűWWÇăű{«őů3$-öűý~»•ÖđŮl6+Ë··››đ»#>Ďq.97 ËůLŔu:ý>ŐiŞőţCG„t«ó 1Eęţçă1! ’ŕlłl·űý§'lz^Q učşJ‘"€ÖëIł)ŇH§€¸5I@0†4¸´O0pz&’LůţÍ š°YdS?Ó‡"T ”W^.Ń”şŰ!%´ßţŚW­±M©ďńŘ„’2ÜţhĽżşp/9#0xO«µ\6˝DáN:΀RŞéŠÂ°ÝîőÔ/Ć3žРFŞrŻŻž‡DŇy ŃK3ŹÇfĂD·»Z==IşÇŰčÇaPĶQnBBˇíÍ ›Ţ„& ©Îeőşéě\wąôýZŤbR„ÓŤJeÉ-ŔxĽŮđqâĎŹĆSębs47A»ťçůľm }]×`pÚŕ`[cRĘűăńÚm´‹Âuč[Łű{¦/x^Q8Ž$ŕh†hIłPÂO%(!ER¸"µj6onŕ–G#ˇ„Aز€­ ă€Đź÷<×ő<&N}źBß®‹k-ŽíFĂ~żßÇY>ďbs3Čp%ÎuqEQ«‘&˘Ýî÷Asys3ł4 ·UUOO&5%aüżOŢiŰčLúý0Ül`Ď‹4—–Ĺ7OOă1űL÷‰…\Ň|˙ý/Úť… i˝^ŻŻ®ľźźžL.¸ŁĚE˝(ňŕyhąaCűýń¨5É2çs âXč;L ¨Çłí‹AÎÍ ßC&‹aę)ŮřË 7c,UÂ^id ‚NǶ5*VJ8 ç…ćSČ÷!•jÂř@–Iř@BY6 ™)ip,ęŽr4‚›ŕČŽŰZ9 és`4B9*އˇ ťŞď;ŽďłťŐ\Ô4źĎ“$ŠîîŢŢ MÎДЍ÷W[ôĹ gdśQô ©ŽvMZXHŹÇń8ËŞŠŔ–(Š˘ăŃl»Ä´š"Áߏ'ÂŮizuušHčt:i'Ţí–K\âő56këµ»ŹÝîi)JušU5ź3ě5Ó3˝žeˇ¨Őj±}Î÷źž.€ZÁ‡č;Âiu»şŕÝą.ĘŘRžöýýľŐ:öŠÄ÷|ÇŰ-`äA`n˘?ďbs3Á4BţeŰüúr˘G٧'nĆHo_U÷÷ä×˝Ńřůx0-Ň|’NY—ÍFÚł‘řŰíj5qUlÍżżŹ…|Nôé)Š@W0›Áq!ě]Żűý~żÓi·qŮŚ!=Ş3&ٲÜ†3Ň‹H..— đw­ćű !a/Ŕ QÇłŮlöööň"‰XŢĎGă] r~á­KČV«N'MąŐßlĆc6IsA±Łßw:ý>Ä~6ž88Ć)§Ëň<×Ej›JŔŔMéŚń[S€˝!ÄÇIÇ7‘~ךT˙L†ˇRE¦k¶¬Avc4˘98Y&µ~ć\™A‡R»Ýďżďv¦ŔžÖ pc ׂí ć”ôŤw1Čą„ÇŐÉľńJám)ȲLiYh†(5©łż/üţj<4;×ë,˘ţŠČűźž÷´QÚĽSNüú%ZłĚę8ŽcYµÚŐŐőµe‰Ě8Ď.ĺZţFĘŐ˙ěĽ?ď˙ó^ ň˙ŁAX>„śśëúľăđË‹/|t:Z#ą(BŤÝîÍ ŠĽí6€ÂívÖë˙k<„Ęhľdă ¶o [„Q#5A©a)+ßÜŚÇÝżŽ(ʲn7Š´ć§ ‰íű€o‚h3Ďó|6Ëóé!8äÂ…N ¨ćŃhř~ł‰€€­%l§8·R›ŻV jíş­—ëĺŇ÷ooµÎs´]Łen6ËóŹÇ»äÜ ‚a EsŠRťN`C€©ÖXÔŽ–e÷÷ć–ÇŐŐŻĆ“P˘1¦°1ŇďB6I‘<"©_§sĎ4Ž4¦ţö¨s`ĐVkąüż˙cÓ'ŹÉ$Ď-‹­×rí›Í©1F#¤Úĺ”ňšÍÍđő5$•p%UµXT…$|xŘnóĽ,óí@hżţhĽ‹AÎĎ €I2Ülµ|âófóe>=AĐNF “¨_Ť˘=@)–tYB ‚Áźb˘ Ż^o˝f€äÁ`<6pş¬ÝNšx<Đ Ç…ź?ďbó3„šLW0$€€Ö Ř9ň6AýCP’úŁńDdr‘ŇIŁRZďv”uĺ$(JA–zńľńŘ„űgYŁ ôä8ë|®µ´rb ĘҲř‚Ap/iöцFŔH(aÄzýTţ°"R˛€0Šş]­…twq8l·4Ät:™ŕş>ďbs3HQpFÚFĄÚm:ĘĆpłaó%á›YöôDCť·úĺx(ŐŽFaX«aq‡CęőZ7›»$Hą1´m6Úβßďtžžö˘a ?]_ĂB…ńđ užĎçÓ)Í‘çe ˇĘďv˛ Đji ˛¬ÝÎ÷w; \HÉ@hÉŻ®(ű$ $­™Ü§ă=~űMB‹ÇÇŮl:}|üh<ÇąäÜ r ‹q]3E P€­M0) @|WŻ×é p˙ëńM…27…L«źJgŔeÁŸߗMęb–:lĆXčÁ4ÜŢjŤ¤Iž—ĺtФułőŕx„ł‚řŔh”eŁ‘eTílEQŽCšeˇ4ö?ÎśÝp(‹:śŐ§Oóů|ţŃx¶}1Čąd·đźP´t:B₡&Č· 2Ű\x?Ó@ĄąYĆÝlŕ¦(6çşÍ¦R_˛]0 ńŘ„‘FQŐë|ďÇ$°Ýy:ťÍHnIČljié—°ÁeZńǶ 6V8Ă‹$čSiŤ»'€šîóÓ's“ĘíÓń.9?ś–]×÷m›ÓLpB ]Á$Z'I–˝ľb1–¦^4ˇü|<´Çľa/ ź¦a¸ÝrÄW˝Ůlµva˛#M;ť×WPlĐVU’Ř6!5Ś˘Ŕ$`S8›akX–0\76¤"ĄÇe])3A Ů"†©ü$`O«ć$I 8#›T´µZľ8Ŕ ź>ÁidýŁńţJť\ rF±,Ç‘&e6ó˘qٲęuO›tÚ–Ejiî•Bě˙ODł”˛–6ä~ŢÓźń{Ľ_JŞ2f˝n¶</Y.BâxźmâwĆ"¬”˙éy9ŢĹ gf„ŹĹĄ^ÇW _/|Ń´>đőC‚‚t(é2Í·Z±9çt<|ĺĄäł\žÁ]H›5eŻ‚0¸›ŮŚK˘ÖEAçäű gA,CĎ(ęv__;lCĺš§Ő’Fd¸Çí֤ĤđKŔ˝JéŔ¶¨M·¬\®Ó˝Ţë+Ä8ĹĹŹÇČxŮTńłńjµ‹AÎĎ ť6CW38›L`ĎČRłn)g çŁńĚíÂIÂýj.gO¬0®b6c;ťjýđ€¶ )Żž’ń'IUŤÇgŮňÜď Ůd0Ę{ł@+ÚŹ:$§+‹Ä ëÍtŠ4±BÖś‚IqÇă±Ö˝ç%~5ŢĹ çgÓíűhä8óů|ţé“lőË“`~Ő‹Bk†ž’ ˙xĽ˘€X®ëşx4Ó ăg2…Á´RHy”Ä|®őí-›BięÁ Ş˛ 4ĘHŞŚÇZs4^K»mĐ„ÚÉtjhâĂÚJ’3G›ň‚Ešc%‰D±4I3ýç?$gű_㜉Aľ‡#‡ˇRŹŹÓélFČJžçůożRrACç÷řQTUWWŤ·Űąîr92ˇŤfNYÖŃ\É‹–’W^_›ĄĎét>÷ Rî&Ý~Źźž@JƶÍÔ ä`v»f®˛×0^ż_«a C­×ŁQ»­Îď‡E!%a¦ĐĂđé ŹhSN BRŞýůxµÚĹ çfďĹÖëzÎ ĄF”·[Ä&Ľ4I`ŚĹ"ŠPPú~<Ľßó@şDÚnŇł|zϢ.ťŽe±řĘGđŚc,—ľsĂô7Ă ľ°"քˢ¬¶ďĹn‡÷u:0ĂŢÓ’s¶Űhµ@B]$,ÎÄG dü,ˇ%ÉjŇŤ2â?O©‹AÎÍ &¨‰iË:…«pQŇ Pfě÷H9› Ź'¦Ä©w»z’(˛9D\h0eQG:Ž‚+yţňr{ ‘Xsa¦ë„°BM6űáÚ¦P ţ´ZŘR(%cŐX„I)ŔšĚ¤< '­pŁ ‚ć&’a’ćŹŮĎÇűKĄíb33)”µ^[Jž„ÍçÓ©ÖĎĎ&|¸Ő* ­E–¸ŰũՇă!ťnJîžéÂąÝ"(d˛ŁßOSĄNˇ “ ŕ=4ň} 7ÇăÁ`˝¦$®¤×DTö2cA¨FżŹűč÷!űÍ´ řÂxĄý“i0ŕŁFř\·K@ ühĽż…%/9;ٰ,Ŕĺ .Ë<ßnN!öľŮ<¦ đ5a62žY^Ĺ«ăśJU ą(ÁHśp-ß·@6ŹŤp;÷÷&ŤÂŢű{Ňݰ•! …`MŕĐŇV!­Ň.Rt:J!-ig…A®ýţ RiÝŹZsQ˙ůx†(ŘĹ gc€5Ą¨Z®´€űBş*Šĺ˛Őr]¤˛Ś„fÝ.\ÖŹă™‚Ü Íh4ľoX,´ćň9@N§S^Í|i"­'Ś÷7úţËKpÍnăńÍŤ@Xá{=ĄĚŤ!\Ć`@*Zi±łm.ľ\ŘqâfëÖëaŘnŁEŽÍ}77ÜŃíjmn >žRś›AĚň%ŠhŮ%)¸)3}Ú‚ü}đi«đŹăť¶___]Őj§íÇhSţwçe)eXł‰ZĘËżjŔf“6ÚµÍ÷J[7Dľl˙gçý_ă] rN1Ó!,Kr›„BĘzÝďkýö&ôG ÓÓZč$>ĹÄÇă ŤR1&Ľ4¸ˇb`L!.’ź™päNׂ븻ĄĆfÇŘ‘täĹ®×aČtĎ!é÷SápłŚŔFZMu´m¤™$#HşJľXŚÇŘ|‚Şä×ă] r~x4Y8Yi*aŕËËŰŰl6›ˇ© ňőZÂőďďÇ#čŠ~Ź)’0$y÷őµ´Âń,Ç#e"ĄđTŻŁĽÚnw:$X%­xŽi>Ź˘×W5‘ <ľżÇ}íRÖjĽui©!¸B&I~Ś"®$…X§Ń 1•>ßßNČTÎxüôtÚţłńţę1ĽäŚ ‚ô/˙»ŐŔÍ1ŘÄ„a§łÝĆ1IOI€Şő~<¶Zű˝ďCś{ż˙x<Ši é*S$îëőÂđé ź@S1Ňn”˘Ä8@ooó9Eů@í·Ů4 Ü1űÖk8˝ëk8ĹĺŇ”K2‰ŁH€ a{Ż×n#'¬TD˝MŘÎÖëŹlO’Ĺ˘Ş˛l<Ƶôzëőh†?ďbó3ČGÔ§A€bżh··»;HŔQf‹:ĐĄ~LĄÇ0ĆhDQ{Ę×ńëk6ě0Ť R1ˇp 0Dś/Š6,é”'Ž˘,# ČŐëfĐ3˝ľ˛TkJ!-J… Źhµ@_(Â^€Ě$ ăńˋٖóóń.9?€âšSĐjšőĺč÷Ăđţ>ŽIzŠpł,µ¦ŁÚď}·Űď]÷ăńDöĄ˘ŃHÎ!“öôdh"4¸şbśĐahýß˙Š9â‚Ŕ"°WUU5?= U!—vËŕ˘(†CĐš(Ç%™­Ą Ź"Ý ®°V#y:Ëĺpx*VňěÓC^$OŞj<ľąŤĐćDËĎÇ»äü Â-’ç ‡Í&Éb@°ĘÚné&˘Faػ߻.ɶ?%ZŮf™e Eůh„óćNŽBžçş’—Ă޲L’‹&Śt±"ČZśRčôzŽĂ¦P$ô\—éwižÁĆ$NŘ`sŽPfʆ"rŃúŤ‡CĐŁ¨Ű †eÉĎĆ»äü "js3FGBňăÍf<âS„Ŕć˘NÉźZíŁńLy-¸/Ë’Ż8–Â4˝ą‘ i\°"Úm†˝tY”8Ňzµ2%g’„©łXÖďŰ…Ĺ×mµ<ďőŐ,FÁ•˘ÄL—×ďw:˝^ٱ\˘™AJőzL¨Ó ¦űD‰ŞÓÔ„·?϶/970ôĽ8$%›–ńUÖšˇűl¦őçĎű˝ëâużßďw;őáx˛¨3ÍWDp¦aKÂAB5Ž˘Ť ůÝ%ăÍCLW ěĺăDłľ Iľ˘ô»Őzzę÷EľŹ!ĂňS± 6Hŕan˘iz­á®KŞ*€­á–ÓT€uŹw1Čą„€14"îÚLูy{Ł(SßŰ-Ţăq·űüąŐz?Ż®>Ź í(ëš­°ďÉ#I&i>Ü Ś(šĎăřfłů\kJ1±Ru"ôG5łŐ‡CĐp¸.!§LĎ4¬ü›©:ăfÓ÷‡CČ‹h۬‘â¤$SJş^ŠĽżďbs34ćJ©ÍËřŤăHAŐl{¦Pő©ŕ6Á?ŹźgÁÓq”ŞŐ®ŻŮú úp^Ń?;/Ú‘!¸ŤöbĐË»,˲@ů}*¸ÍłŚ8š”I .Ĺč«+‘$gąúßž÷ăńŚJňĹ gcięŶ¦×ł¬/_<€şOŢ0¸8?…µÎ˛n×l ʲëk¦™:÷{ĄX†ˎ˘ůܲLz&,ć×׼W&¤ý‰ůŞd aŤ„öŤĆĹ çf’M§ăŔ Óétúř¸\zžçi 86Ś%IkÍň.ISą9¦’o6‹ĆOJ=>N&yŽW¶;3Ü^Ż‘öF[ôréyE‘çžçyËĺdÂô6ĂŰ,á ŠNl4x~~}ĹJYLÓ°Á \”ϲLJ̶Í-ďçĎűýçĎľďş–eJrăP*Š A…ó矸Ϣ( lqaŢŰEaR1§Ň8jµ‹AÎÍ pU´őzµÜUž#A]€oÜĐíV¶<\ť—RpUR¬Ťj5¤Đ\ŰźĺŇ÷mÍ7y>ťŢÝĺů§Oe©5€"Ą˝^+ĺyEQËĺăcQ,—Eáyőş¸O:/Đ3ÁUxžçĽ(4_Ú6›‚LjÁŃŹ\µe!]ęűź?Kyš˘|”č+KĐ3áˇ@Ńf€Ş2}y8l6Ue¦vđpŔa™D‡Žs1Čą„â&XŇÓ“0ťÂmĺyQ\V–űy{¦Ě(Ś˘éV±¤/h#Ł[Ń'?9¦Ó<żąÁ 5‘Ďó<ń€,—ž§µąĺâµČ¦e®‡¦SN'A(.č˘Mą !0;÷ű㑆ßßďmŰ|řč˘\Á M¬ą˝}xĐzµJ .V«(bŚaF§†µE_ rFaú…ÎN'  Ď[.ż|‡Ăɧ֓ -ř‚Ćńń8›•ĺÝeFgłůܶ™> CJζÍ)L`˘Ër2™N!M @§3ŤFü+ĺyyžçË%H>žźż}űú•©§ `›Aj-ó‰mđńx<"¨uZÝzfY¦ébńW[ôĹ gdĐĄ DŔ÷m2‰LŢaѬ*¦üLS”R™@zB©8¦)ŘŘcŰűýďż3€Üďßßß߯®V«$™Lâ8ŽišÍFÄ»J*eZ,ťI‚ $ ›ZÓuw»f-9Ç#@|€ŇgŮhÄ’m·;…á`Ŕ„c»ÝéA»Mz—$‹E’(őíŰáđíŰŰ›…ÓѨ×CK[ó–Ką\ h QMSĄ°qŽc1ËĹ çg&ţ¤Q¸VÉv€üăX몒2ďh€ĎśB ˘H)¦§†.˲¬Ő|źĹžÝîxÜíöűFc>ŻŞÉd2‘WŠ#hDđJylşÎŞęvµŽăď‰/Đ“F|Ď;µ†)pÝ0 d2¸y],şÝ0Ľżç{XÜ]Żm[¶z«®@©ççççŮěp8‡Şz~>¤őMŕEZ“‚–Ž‹Ý" c2© 'ú·|÷Ĺ gcVËó@łĎÖĄ(‰‚M ?Ue¶^§©3ÁÖí iylž¤s]´őt6™L&ł$č'“É$Žá˛v;$<Ďua硥uUťR5“”%!ĎkµŽG6}ŇQ´Űaö:YĐăx±ĐTelRBˇČ<+‹[‡ĂׯUőőëáp8Ľ˝ÝŢ~ýJŕp毯$ÓeIůx N$é>‹Ń%ż8ŽăĹB©‹AÎÍ §r§ Ď–öb]L7†íöh//B†ĘË’4 óeiYdĘÂ.aŻŰ- 4ě€úN)“¦ąŰŤăŞzyé÷M2Ś4 ¤+v;>TËĺńřôÄF’Ov:–0śIR«5’ŮúJ!-ÉłŻVQä8ăńáđü<źż˝oo‡Ăá€Ö7ůôz†ŻŻ‘lłŐÚna,^w݆ޅn—’–YV«] ržˇ}«5âëš$x~ ŞJšĘ°¬kM|ĺpQ‡Ó*Ëů<Ž•B° úŤăńý}żw,ĺI2™Ěç“Él6™l6Íf«Ől›…]×qGhÖż˛ô9ýůç©P€ďŹŰ­ąĆ!—!’A˘|ˇHę´‰tµZ­Ë9–őççççůĽŃ0ćçŹ?LqMĎóĽŰŰí–4ć8OŻ×ëÁ}z†aŘíţí˛.9#´Zl9dŮ©đoUe™ą1¤ ŔL0˛/%ݲ,KË‚«"ŕ~OL&“I’ŕu>Ůk˛<ĎÜN°ŮČĂÁ)ßďOSü­Öí­´E§)(Ăbdp(Ú¦©ÖŇ Ń‡RooßľŤÇ0Ë|~8őşH%±­Z¤Ä]s‹¶9Ĺň1R*ŽÓ”đUlVëő‹AÎĎ f+ÍréyHč ]^eŮë+ ¦ý>É\DüJ(ůa€,…üĺPšt€×׋…„ĽóyUÍçŰ-A =ŻŃ@a€ŕh)öâZ`Ź1ą(ij‘V"™Ăp»MÓ @(Čg ËMá;Bŕlűp8ľ}Ü޲ŢďK¨ÖĽEŘXŇ8&ŮŽmËcÄq­v1Čů„tH\4›LżS–böU˘G‰#ąh~ˇ±EUđ~’(E⠤ޱ¨#e2™,XÖ“DkĐű™Ääؤ«¦F6©’î€A(ϸ\ ¤( ‚4ĹŐ+ĹÄ"–ő, C­Amn¶eDMIYÄq‡çgl yŔ hŰŤH˛@ŠB¸«˘8ůŃ%¦)6©ÜʡÔĹ çfiŕ­Ől»Ń`{/ ‹ł†č4ËŻŽůéďĺłOËšŤW«ˇ4jŠg‹Ř·R,hţÓó˘x,ĹP”yÍmÇmů÷%bţ¤ßŇbŤň«ăŘ6ĘĎ&ő9Żäßž÷çăŮöĹ çfm˝€•Xř¤ ©“×W9š˛EŻŻHLŁŚ n AµŚFĄ@żÔ  5?Ą… ®ăű`¶×k4Ě"*ŠaOOÓiQPŇó–ËďʼnŁ(Š&“ÍĆó†ĂÇÇé0˘É¤(@ś©T,ĂťŽÖ|‹Ľkž+Ĺd+CńV«V#° $!’˙…Úl˘(Ž»]ť«*Žgł?ţ( @ަÓ/_@¬ŐĽôďĂ‹AÎĚ ¤)c1ǶIuÄ鎢— îpQyéI ®Şl[ďó9 —¶--ř„gÚöb†ôQśÄzý>ëz]’ű­V<2ˇŰ­–I«‡kšL´öĽÇÇÉD ¨ž‡t9‰Épß××Ň1źçůtúřX«™…m–“…¨a b‚iËeh‚ŔvaąyކAĄD śˇe] r~Z"üęúÚ_F&áp†\ŕ)5«l IGNč>h*$ämµö{Ąű' G@ŔWĘĸ.ĄĐF`ž…âÄ&„ű{ˇäĹb±Đí _ľ Îó<ĎqL:MŇ)ŃQ=>–ĺÝ\ÖiűĘ&(a±ă ’ő|^–hĎĐnmµbĘg2©×ĄÍś¦±,´ŔYĄiôű­/9+HiMÉL¬ Ńi–m·_ż’ ­ZľoŰ&€‰ŤFĂ,OEŃÝJ¸<~˙}żw]×EÚ@š‘Ă0Ë^^D•)sËZ,¸5ŁŘl¦S3˝íşľŔEUAâ>I˘(´%Çdâyx…ËâĆ–”—Až—%)pĘ2Ď'fÁ…|ďT&Ë‚‹:hsŃÖ7›‘n°ŞPşŔ+\Ö—/hdĂ 4ÜŠ¨ĆĹ çh!¤ 0Ý&`±X­´~x€{`ĂŻëbÁE:éq$Ąń PR´#ůţűďÇă~„ˇĐľH\“„¦×Ü_ŕqś$ÁĂwt˘®»ŮTó‘ŠL’ß~AHžO§Ë%Ü–ú;ĚŤ(Ëúň9ľét2a‹ť4ނޒămB8ŽłĚ¶çs bîîĘr6;aŠ,[,E€öŐáp8„iXܢdČ•/9G°ěĦÓ]-I|O”Ď…ÔÜBšéwPR’’˛iđSůŐÍF ;Á ć12\ ©ű!Ë–|IŚj ‘çž÷ř8b˘ wčőŘ”|sjópßÇ–“e Ď…ěpšâĘĂP)’°…¢Ŕ0źĂ}Ežc[8ťzžRë5ÚŔ×kŠiţĺ˛.9+EČN'ľź„n·Ş6›ĂnÂó‰Ŕ‰…š¨ŞV+ۨ5E‰¸¨Źź?“ôȲ¤… .k4:…[‚Xܶ…Z ¦O­\W¨°I=Ąkb¨ J§ÇÇĺ$:J‰řÜÄh¤uY~ú”çww0KY>>Ú6© ±¨ďvžW«Éălh=Ą§˘0(¬şÝ$©ŞŞšL´žNAu…d8ĚóZM—~źŕą‹AÎĎ &a=ä~(+EUŐíľůđ€ĹŤb»Ýź‚ÖâŘL.š´ä–ĺşľŞ<†ż {Q$B “ LT» Č>đ$A"'ŠâřőőůY¨üPŽŇZ t Z3mJŽĺ.+ Ó´Ý^ŻIBŁőt SL&ŹŹxUŠ)ÔÝŽ?9ˇ HŇôű’uYÎçZ3@g\–ç-—ŹŹÓ)Ó‹s’ŮŤÖë‹AÎĎ I+Ę—tEp˛¨3­çyH±€hÓ`Ygť*č'öűă‘’/0Ęőµą¤#üE)Ő¤pĄALJŘ,»żÇĂ!b(4™ÄI¤ĽIvËÍS©2Z“ ÚÓédru%©E8ÇfÓ˛@•.$H.â~%]´ÝVŐ)uÚd˘5H|@v›çž÷ĺ %ń`ŕ1Ľäü rZµ¬ďŲQ”l4®®LRlHNC¤ŻřT˝NůîÇ“ććëk)Ű Ĺ÷őőiaöźś×¶O ÄYňĹĎfŰôő5Ż„ÄćhX®Ő”şľ®Ő„â,4s|üĎúďÎűóń.9? ]‡đ2×u]ó"đl·AÚ„”˛8Ź8NˇSń°_Ź'Z"Hą®çˇ8;BH)IÉS@lłŹÍvš,K’űűů|6«Ş»»8†Ó|{ŘšÎW ”äć¦WŔk\ a1Ę÷AcŽÍ˘çůţŐŐńřţŢj}ţ úŤý~żßnĄ5oo77ß €ÁGăŮöĹ çf!ßc9źˇp§‰í4MS­˙ó$G[­ŘO)R÷?Ź Ń©ˇ~˙é©ŐÂZHş®R¤ŕ„őzŇlŠ4"Ň)ŇK’˛Ľ»K¤ÁĄ}‚‹PEÁŕľďű77"»D@´e1}(dSJQv™’NEˇÔn‡”Đ~˙ů3^µ¦(ÍB2@In<ŢĹ çf¦Cďiµ–ËFŁ×ŁA#ÜI§cÂPJ=ţm·{˝_Ťg“ˇ ©5ŻŻž‡DŇy Ë‚N3ŹÇfĂD·»Z==ťĘč•ĺۤŚ`PĶQnBBˇíÍ ›Ţ„č©Îeőşéě\wąôýZíT6pżßďµFŁĹ-ĘňKBS†s}4ŢĹ çin‚v;,,LľJÖď§ ^0¶5˛†ˇăü|<Č‚XŹIM–˘Â0 ďDHŕyEá8§Ň©0H˘%UĚBşÁ(â-Ž%Y)ć´,µj6onŕ–E@,`¶,`+č8 4 °¬ëz§ľ/2´¸ĐćňáŘnE<ŚÂčŹw1Čąd8Äçş“®ŐHŃn÷űëušŽF77ă1KŁp[Uőô$_q!ţŐxňNŰF@gŇď‡áf#xŢpXËĄëîv–Ĺ7OOă1¨M÷‰…\Ň|˙ý/Úť… i˝^ŻŻ®ľ'Ęźžř`Ц©RŁĚE˝(ň™rĄ@ÂÄĐ~O’8ú“ęÇńŤ‹AÎÍ ßC&‹aŞL€ÜڱTU{Ą‘1:ŰţŐxiĘ0÷TîÎ Í˙B'ëyJ>m:B~¸I­Ş, D¬Ë\Ô ‚ő'Ç!=Ť ˛ă¶VÎ0x–Áh„rTCş iMn|Ç÷ŮÎj.ęšC&ęîîí 4ę ýAűŃxµÚĹ çfśĆTG»Ť&-,¤ÇăxśeUE`KEŃńh¶]Ćňóń„ä;MŻ®N ťN§#íÄ»Ýr‰KĽľĆfm˝&X& ŹÇn÷´%‹:E‰ćs†˝fz¦×ł,µZ-¶ĎůţÓÂJv´Űl•s·›eJ5›Ľ;Č.»®”§}żoµŽG†˝BG>źÇńv y›čÇsś‹AÎÍ Óů—móëˉŤžž¸ĂŇEUu/0H~ÝŤźŹG1mPj‹#âą6iĎFâo·«ŐÄU±5˙ţ~<ň=8ѧ§(]ÁlÇ…°w˝î÷űýN§ÝĆyd3†ô ¨ÎTdËrżŹJĚH/"ą¸\2$Ŕßµšď,„P@„˝7DQĎfłŮŰŰË‹$by?Źw1Čą„·.a [­:ť4ĺVłŹŮ$ÍÄŽ"ŤŇéôű űŮxâŕLř§ś.Ëó\© l*7eîĆclMöβ8° Žn"ý®u§Ă˘0ĎĄTQP ŚdŕŹE˘“eR Â4fi×÷•Úí~˙}·Ł4uP¸±„ŤkÁvsJúŽÇű+ý~1ČEDËÚmĄ®®H˝ý=‰6łkµzť„ٶmۤӆ¤őĎĆCăŻ)mí8µÚ„§V#-ůż;Ż4Y;ŽmŁLZ«)UŻă,¨ţ8şRŤ®ç0IĎQZ…”·”¶m»VĂ]˘`ýoÎűńxßĆĹ gc–›M6§8żĽřÂA§Ł5’‹Hž é}s"o»  p»†őú˙ˇ2š/Ů8íŰ`€ÂaÔHMŔ)ŽFRVľąŹ»Q”e—á§ îű€o‚h3Ďó|6Ëóé!8Ĺ4I§„Tóh4|żŮD @ŔÖ¶§)îC)‚ÍW+µvÝV‹Ëőréű··Zç9Ú®Ń27›ĺůGăŐjś›Ađ!,ˇhNQŞÓ lb0Ő‹şŔѲěţţTä7 ĂđęęWăI(mY§ ¦ß…l4’l沾^w:÷÷LăHcęoż:mµ y„¦O“Iž[[ŻĺÚMéUÂ÷$łעđ}^łąľľ† 9®¤Ş yd.Őľßj=•-r]´1›á7iś„^$RZ‰řqť %#ąOÇ{8üö›„ŹŹłŮtúřřŃxśźANa1®k¦ę°µ &eďęő:î= ©JĄ)ŠýfZýT:.‹°.ĆýľlR!qźeŘŚ±Đi¸˝ŐIČ»"iÁEÝl=€81ÚŐĐ~0YH5ŘÎVEá84ˇYFJi˙ă ŔŮ ‡˛¨ĂY}ú4źĎçŤgŰś›Av;˙ AK§C 4(.j‚|›0 łÍ…řóńD < G€Ü,ăn6pS›sÝfS)€/Ů.ĐxlÂH!ËÍđ~LŰť§ÓŮŚä–„E‘Ö¸{¨é>?}27©lŃ>ďęębs3ČiŃu}ß¶9Í'ŇL˘Ĺq’dŮë+cięEĘĎÇC{<č;öÂđi†Ű-A|Ő›ÍV‹i&;Ň´Óy}ĹhU%‰mRÉ( L6…ł¶†e ČucC*Rz\Ö•2¤-bĘOö´ZaN’‚3˛IEKP«ĺű‡ ňéśHÖ?O©‹AÎÍ ,ʞ1%G4.[ ‘§tÚ–eŰ,IJS0K”˙k<Ś&bÖR05Ĺł˙ůyOĆďń~)ńĘőşŮň,%e!9g34Ęł 8ÇťQě[Úž˙éy9ŢĹ gf„ŹĹĄ^ÇW _/|Ń´>đőC‚‚t(é2Í·Z±9çt<|ĺĄäł\žÁ]H›5eŻ‚0¸›ŮŚK˘ÖEAçäű gA,CĎ(ęv__;lCĺš§Ő’Fd¸Çí֤ĤđKŔ˝JéŔ¶¨M·¬\®Ó˝Ţë+Ä8ĹĹŹÇČxŮTńłń®Ż/9?@tÚ ]Íŕl2A@>#KĚş]¤ś €pśŹĆ3·{' ÷G¨ąX ś=°Â ¸ŠŮŚětŞőĂÚ‚¤ĽzJĆź$U5#śeËsżB€f“Á(CěÍF­h?ętLśr¬,3¬7Ó)ŇÄ Ys &ĹqŹÇZ÷zś— řŐxśźAN·ďŁ‘ăĚçóů§O˛Ő/KL‚ůU/ ­zJ*üăńŠb]HD¸®ëBŕŃLW€ŚźÉÓJ!ĺ!RóąÖ··l Ą©ŞĘ2Đ(#©2kÍŃx-í¶Y@j'Ó©ˇ‰k+IÎmĘ  NhŽ•$ĹŇ$Íôź˙śíŤwuu1Čąä{8r*őř8ťÎf„¬äyž˙öŰá %4t~O€EUuuőŃx»ťë.—Ă!Úhć”eÍ•Ľh)y…áőµYúśNçsqź€P ĺnŇmŕ§ńřé ô ˇdlŰLÍ@f·k6á*{=ăőűµ¶ˇ0Ôz=µŰJáŚ(řţpXRf = źžđĆ1ĺÄ 4 ĄÚźŹw1Čůä{ń†őş^‡łB©ĄÇí1€ /Mc±"”ľď÷<.‘¶›tÄ,źŢßł¨KD§cY,ľňŃĽ#ÂËĄďßÜ0ýÍđ„/l„€5á˛(«íűE±Űá}ť ǰ÷´ä†í6Z-P 3ńQ?KhI˛ZńaŁŚřĎÇSębs3 ŞFbÚ˛Ná*\Ô…4”ű=RÎfćÇă‰)qęÝ®^‡$Šl‘LYÔ‘ŽŁŕJžżĽÜŢB$Ö\é:!lP“Í>A@¸¶)Ô‚?­6¤Ę@ÉE5ÇaR °&3)ĂI+Üh ą‰d¤ůŕcö«ń.9GBYëµeˇäIŮ|>ťjýül‡[­˘ĐZd‰»]śúăńN7%÷@Ďt áÜn2ŮŃď§©R§PĐÉđ ů>†›ăń`°^S’WŇë"* ű™± TŁßÇ}ôűýfÚ | aĽR„ţÉ4đQ#|®Ű% Ä„ ~<ŢĹ çjq–¸<Áe™çŰíĂĂ)ÄŢ÷!›Ç4ľ˘&ĚFĆ3Ë«xuśS© $%‰®ĺű–Čć±ńnçţޤ@Ř{Oş¶2„ˇ¬ ZÚ*¤5BÚ%@ ‚NG)¤%Í⬠ȵßßT*­ă1Bk.ę?ďbs4ŔšRHT -WHZŔ}!]ĹrŮją.RYFBłn.ëÇńLAnf4ß·,ZsyD‹ §Ó)Żf>‡4‘Ö“ Fű}˙ĺ%Š@¸Áf·ńřćF ¬p˝žRćĆ.c0 ­´ŘŮ6_.ě€8q3Š€Ŕuëő0l·Ń"Çćľ›n€čvµ67†?ď/ÉŁ‹AÎČ fůEHl“Ü”™>%!7)Ŕĺ ŐřŹăÉ™Dz®ŻŻ®j5ˢ47Ëż ˙ççe)eXcl9űĎ>gbm»^?m¶FAEg|OĆţOĎűóń !đ‹AÎÄ f:„eIn“PHYŻű}­ßŢ„ţdzZ ťÄçĎ PŽ'4JĹđŇ ŕ†Š1…¸H~f‘;\ ®ăî”›Mc#FŇ ’K@ş^‡!Ó<‡¤ßO…ĂÍ2!j5!ÖaBжAf’Ś é*řb1có Ş’_ŤgYśźA bNVšJřňňö6›Ífhj|˝Ö F…pýűűńş˘ÇcŠ$ IŢ}}-­p<ËńH™H)<Őë(Ż¶Űť VI+E cšĎŁčő•DM$čŹďďqB»†µo]Zj®@„ÉE’Ł+É@!Öi4HL%„Ď÷÷„2•3?=ť¶…˙lĽż‹ś‘Aţĺ·Z8Ł9›0ět¶Ű8&é) PµŢďŹÇVkż÷}sď÷ŹG1-!]eĘÄ}˝^>=áh*FÚŤ˛@”ŕím>§(¨ý6“F„ &qßz §w} §¸\šrI&q $lďőÚm„ŕ„•Š¨· {ÂŮz˝ă‘ÍăI˛XTU–ŤÇ¸–^o˝ŤÂđçăYÖĹ çfʍOĹ~)Đ ooww€ŁĚ(u KýJ5ŽaŚŃ˘ö”Żă××lŘa*)¤bBá`8_m6XŇ)OEYF .Ş×Í gz}e©Ö”$,BZ(”* ŃjľP„˝™# H&Ćă—ł-ççăi}1Čąל‚V«(Ь/Gż†÷÷qLŇS„›e©5Ő~ďű»Ý~ďşęĂńDöĄ˘ŃHÎ!“öôdhĂ&8ˇĂĐúż˙sÄ1E`ŻŞŞj<~zŞB.í–ŔEQ ‡ 5PŽK2[KAEş\a­Fňt$<–ËáđT¬ĺ٧'†ĽHžTŐx|s3ˇ‰‰–źŹw1Čů„[$Ď›M’Ĺ€`•7´ÝŇMDŤÂ°wżw]’m<J´˛-Ě2ËŠňŃćÍ ś…$<Ďu% .%$†˝e™$$ LébEµ8ĄĐéő‡MˇHčą.ÓďŇ<Ť!Hś ±ÁćˇĚ ” E(ä˘ő‡ GQ·; Ę’źŤw1ČůDÔćfŚŽ„äÇ›Íx,ħÍEť’?µÚGă™ňZp_–%_q,…izs#Ó¸.`E*´Ű {é˛(q¤őjeJÎ$ S'f±¬ß•‹®ŰjyŢë«YŚ‚+E‰™.Żßďtz˝FcąD3•ęőP§AM÷‰U§¨ o>že] rnačx˙pHJ$6-㫬5 B1÷ŮLëĎź÷{×Ĺë~żßďvęĂńdQgš®ŕL7 – –4E:™A2\V’ÜÝQ8ŽŮ<ÄtÂ^>N4;ŕ›ä+ @ż[­§§~_äűđ2,?«‘`ć&š¦×î °¤ŞŘn9MX÷ńxś›AC#2čłÍdŽ››·7 ‰2ő˝Ý"ŕ=w»Ďź[­÷÷ăńęęŁńč°Đ~€˛®Ůz€ űž<’¤a’ćĂ­ Ŕ˘ů<ŽďîŞj6›Ďµ¦[ U'B_pX3[­áp8 ‡ërĘôŚHĂĘż™ę 3n6}8„¸6±Í)NJ2Ĺ1 ¤ëu Čűóńlűbs34ćJ©ÍËřŤăHAŐl{¦Pő©ŕ¶m˙|<~žOÇQŞV»ľf%ąŃ`őźźíČÜF{1¸ĺ]–eYWWŤ†ŮRŤsá,"#Ž&eĐ‹›Ĺč«+‘$gąúßž÷ăń”rś‹AÎÍ ŇÔ‹mMŻgY_ľx^ž‡žçyž÷ĺËr©őd"ÁĘTŰ-—Ö(*K¸'€DÓíj–%ílÜ]]ˇŮa2™N„+Ëďvz=ČËtÇ0m'p4‘ĺŢíÖ|xuźĽ`pq~, kťeÝ®Ů@”e××(L31t<î÷J±„ —Eóąe™ôLXĚŻŻyŻL>ťŢÝĺů§Oe©5€"Ą˝^+ĺyEQËĺăcQ,—Eáyőş¸O:/Đ3ÁUxžçĽ(4_Ú6›‚LjÁŃŹ\µe!]ęűź?Kyš˘|”č+KĐ3áˇ@Ńf€Ş2}y8l6Ue¦vđpŔa™D‡–u1Čą„â&XŇÓ“0ťÂmĺyQ\V–űy{¦Ě(Ś˘éV±¤/h#Ł[Ń'?9¦Ó<żąÁ 5‘Ďó<ń€,—ž§µąĺâµČ¦e®‡¦SN'A(.č˘Mą !0;÷ű㑆ßßďmŰ|řč˘\Á M¬ą˝}xĐzµJ .V«(bŚač6.970ýŤBg§†Ť†ç-—_ľ ‡Ăád‚€SëÉ„Ŕ|AăřxśÍĘňîŽ2ŁłŮ|nŰL†!%ç@ŰŤć¦ 0ŃŹŹe9™L§& ÓŤF#~Ť•ňĽ<Ďóĺ$ž7ţöKŁi“¤ŞHď Ł»®ď?< „Íáu±€A¤Eph”„ŕ'ŰŢďŹÇß§Ţű»ď+%Ë9wĄÎ& h˝îşXÖńş\ 0\g’d™ČŐÔjśŁA 7ÁŤŘr ÓxŢf3™ĐEÖŚ4řl–$”áŤ"«±8ž 2˛9­dhć,K,ě“IYć9$®Iâm{žçM&yŽW¸Ď "8PPfŮźšÄ8­–ďO§› těQ´X€Ś_š/ _^˛Ś«59dóV+lÇdşęujŃ$ÔéŚGš˘Ő¶÷ű÷÷Ďźa$Pl›B bĘҶĄdLžÖÍf«5šÉĹ—ˇW x”mcS;… t­v1ČąÎJ¤ą‚ Vľ|™N=ďˤĽgł8®ŞŞŞŞĹ˘ŰŤă(ÚlĘ,ę íiâ¸Văda»Ôlş®m–%đZJů‹0 Ë*ŠÉ¤(Š˘(¦ÓÇÇáĆéä"ZžQśťNźžÄ`ś¶FCîT`;&ÉB`ĄŢßa†÷wßßíŽGßWŞ,4O¦O\Dé^­^_O%÷|˙ááő.–[ČŞŕň^OÂü‹AÎÍ §F™ĄF´çŠü6‹˛ŤßĹ˙5‹’ ÓF9ňăńj5ŰviFáŐ¶•j48¶IÜýOÎűQ3(ÎYňĄÔ·ś+%÷Hąr)4Ł™ĹeśĂqPf–^ňÍćßž÷ăńXżäś bn‡ c 2dó‹=i}<…ë mc«…’+š´Ô ĄĆńőëóóáŕ8”řaüý>˙í6\‡‰˛¬Ű\(M±a„`˛ÖÇ#ËQŽAČl‚:« éwPěAb#Š”2ąŃ>§u’L&óůd˛X€d˝Şç4äÝď[-Ą’…[$S˲,mŰL+Ň}rc‹äzšVŠj”äD:ä3ž×jîűŽs1Čą$ŽŮ’‰ /Ël›ŰJz< ˇ>ZrĚĚE)”ş˝=ćsäŰ·Ăáp°m˛”0 `ü(HŤFiişÝšÔ¸Sř… 'Â>l»äC„ć@ZŁŃŕ­ďvLµl·óyUAČi‹Ĺő5Z˝IŚđţľßă>ľ/YK)áéü Ät˝~}15¦!ŇK{¶çůľe] rn!!_šĆ1Ý 1 pWŁťtJR„¬×1ČxüíŰŰ›)ŕk’eš´x8Ś€×8Fřý–6;­ooN˛ śłUµŮ0-N(D =“4ÎŔ1™L&xťL&ÇMbYfÉz>gęDR"8×fĂ6:–ťŞJk‘Áä{ş„Äë_4±ś™Aş]ŇQ2í8SA“Úú·ŰŰ[şá–ţřă´éĹ­ůüůůůůp8f3ĹqV«ÓŻŐJ©ő:MOiɵćĆŚ`»ŃȲH- é”íöx4))ŕ> Ż#©ßh¤5dbIşW‰ĎívžWÍf«Őln6“Él†e=IŞŠy?a,ďJˇQi6+K6Ő)Ĺ"1A{q¬5ZGŮ>†U5PŇ#Ë(<®ÔpČE€í®śźAŘDÇ(_㏩‚Ng»ĄlФžçűŻŻRZ•}Öj‡Ăáđöv8Ľ˝ÍçĎχĂxě8R” _UÁIęíÎBř‡âVZáRb~z:ą6›(“ŢÜN­Óétúý——ŞBT^„š(”aŚfs»ťüp(ŲÔű;Z- ‰EYŘËҲL‰KĚĺËK ]”Gى < |Y–0Ą3ţÚ^ rFY,â[±Ĺb4Z,jJQ‘äŔÇ#żV‚VëőUĹč0lűë×ŰŰ·7l «ęë×Ă 8isQçÂúŻNGkłT„M*oŤËOOÇ#É ŘT¬u»}*ŹŤ!Îk Î…ë"ÜńéÍ&Ž%äťÍhl [-×…ÓRŠĺ8­(šĎ•‚č“YzŇš@#ÎJUi 1ÎĹŰHlRůPÁiy^«ĄÔĹ çfłŔŹör0.¸Ç#s4)"Ô<ĂCŰ>žź« Ëůlöüüüڰ7Ž „ɲ(˛mN¦ôaŘí˛A¦ÁµHpÍÔ ©ÎNe‹LšĄ8ÖşŰŲ.šRAh€€ ŐÚl&,ĺ|ťĎŤý~·;A‚Ĺ˝VAîî`¦ß%¨fłi»Ťeťé!áŚăö|·“Fň‹AÎÓ ‚Ůç$ŹF väBÚjq9D#cšŽF˝äÂP©ĂAďííŰŰ·o‡Ă·oJ%Éb!ä{Q”$JĄi»ť ˛^÷zAŽFܤv»Ł‘é> Â൸în×ljăű»I€&Ri Ťˇ”“I6ľŮĐaĹqO&I˛Z]]˝żł|»ßżżJzwÇĺ JQÖŰŞBr‘­8ÜJh ‘—(˛mqąx؇ËAÎĎ ‹Eš"íMGÁ¦~$ęřŹpYńe‘4Ŕd÷őë·oĎĎb–Ăm_fâ9ýö˘A Ž| 4ć#ą %\(ôd´v{˝ fVÜ z. ܉ÖÝîd’$óą$ö ýÔ~˙ů3ˇ¤9ŕçëëÓ˝Ű],J'­×€čVŐfsę:‘~‡ăĺ|ţĺ˛.9/üż’Q3…Ä^IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/SquaresDark/images/preview.png000066400000000000000000000112371361462701300267360ustar00rootroot00000000000000‰PNG  IHDRddG nMbPLTEFP=CM>FQ=EO>EOEPAISAGQ@FPBJUAHRGNWFLVIP[GMWGNYDJTFMWEMW=ENHP[GOYHOY>FOCJUHOZDKTEKUCJTCKUDLVDKUBHRFNWBJTFNYBISBJSCISELW?GQHPZELV@FQAIR=DM@GP>ENDKV?GPBITBIR?FO?EOAHQHNY@GQDLW?FPCJSAHSAIT@HRELUCKV>DN?EPCKTDLUIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚„„„………†††‡‡‡‰‰‰ŠŠŠ‹‹‹ŚŚŚŤŤŤŽŽŽŹŹŹ‘‘‘’’’“““”””•••–––———™™™ššš›››śśśťťťžžžźźź   ˇˇˇ˘˘˘ŁŁŁ¤¤¤ĄĄĄ¦¦¦§§§¨¨¨©©©ŞŞŞ«««¬¬¬­­­®®®ŻŻŻ°°°±±±˛˛˛łłł´´´µµµ¶¶¶···¸¸¸ąąąşşş»»»ĽĽĽ˝˝˝ľľľżżżŔŔŔÁÁÁÂÂÂĂĂĂÄÄÄĹĹĹĆĆĆÇÇÇČČČÉÉÉĘĘĘËËËĚĚĚÍÍÍÎÎÎĎĎĎĐĐĐŃŃŃŇŇŇÓÓÓÔÔÔŐŐŐÖÖÖ×××ŘŘŘŮŮŮÚÚÚŰŰŰÜÜÜÝÝÝŢŢŢßßßŕŕŕáááâââăăăäääĺĺĺćććçççčččéééęęęëëëěěěíííîîîďďďđđđńńńňňňóóóôôôőőőööö÷÷÷řřřůůůúúúűűűüüüýýýţţţ˙˙˙qĹ{Ň IDATxÚĽZmWÚJť$„Á¤A €XsŐbńrŐşÚe˙˙/zö>3ŁµÚŹOfi@ÉĚÎś—}^Ą”×ő<%ŁŃh(eŢă ß9ŽĎW·ŮT®‹?=Ďóů3U|0ż%ďěż|U H§v»áÉI·u:]ߏăĆé).qÜ‚Á`8&Ăašâuđé?ăčőú¸4›ź?ę÷{ž‡?2ŐívW«®]\N”ę÷ă<ŹykÁŮY‰Ő‹—˛,>îÉĐKőzŤĆÇó{f8Żő€„a—{í†a'а]ůldoúúu0(ˇ(Š$)'übČD}žOuČĂř>¬ôJ‰@_žÄóâ8ťâ¶Ń(žLÎθ¸l#M‹ű{Řg¦ď€ŕ3ő—ůü<ÇN_¬«ÍăägđşOön ‹7›®D’»ľ÷LhÚ0`ţ˙·ů í¶ÜX ¶c=şj6gËóóĺňż˙ţ[ÁÝűZi™ .©8çšńâíü’ŁřVJX €dÚZŤµ,_ĆL@ľ|!7™I‚ Ŕa˙$ëľťŻŐł"›‰µEŻ6ž `%ß_,X|)[n BZÇrl‚@–GhçŞwó7› âKÁ‡rśźßŘÝüót"! H›Ťč#Ąk®ˇ•FăĎůű}gµÂsíáĄÝ=##tR 8•)¬C$5ٰ¶řąľв“É^Ň5 Ďűsľč.śNŁŠl·‹"« ä5Éáfǡş·üYZĹkîĂŢ!łĂŠGÖ2ţ¦ř7óŤl%Śu÷ÍfQ”‰ú-Ĺé÷Żg»Ĺ&D'łĹâ<no-“ĂÉ`]ëµFŔŽ`bęÝ|d-ćˇĂ¸.ţ_Ô b-ťâZ¤nn(łëë/_˘WXWU•:´TdU«őç|ÄŚó"+Šś ýŃ(3q(¦ÇĎqy …@űApq!îŰÝl@_I‘&©xnF˝›Żó#>Ń NIĹ5ěŢ——¦ç Ą3ű—ôżÝ‰ Ź[—zá·Ě·‹‚ú[­†[Č«§QÁJÇěź ŔŐ8¶Űíb8Ä’ ‚ĂáĐ…»÷ßżďŐ»ůČËIĽś yšÎ^”[S,doRšŚ)Ç·oóů<ˇ5Ui çětóôt8<Ź0Ń?çceTŻ'ŻE«ĹÄąótÚ1~pBqáŽ1ë ĽöŻŻ“dqa}\[ŠëEŘń°z7ż(X<Ž‹BŰł{ÉNB©úşşćŹŻlŘžL.A hĄŽčÄ h¦Ë ňí|ě,Ö úş˛5ă˙$ #[QŽm¤h±Šůü9I€@Im·——Ńb˘‰í‡Žz7V%›çą^Ż.ť%„á;–Âţ!Ö…\őúZüdK?Y¸Äş$@­ř?çcý,Ł—Đ_ Ç1~˘ó=šMť¬!ˇgá—ívggÄŕNc]zŔÄ0hÂoçëĹ9JÁ3Çő€Ŕ“ŕD$Ú"¦Ń ë©/Xźd»ťĎń:‚ÇGČę‘Ć^˝›ou˘éEš±ćž;ü­RŇăÓ'čd.DBb!:?î÷ŹŹŃÓÓ‘‰·óµ§ç9^…úa?˝z@¤_$\®9\R~Ď´©ZŻďűžî\)ß{!sPű‡óő„†_ŐńH Ĺ÷Čq~ü—Ë)ćđÇŹUĚf6Ç"__kŃ aÂyD<ĚDéI’;ŽÎ¶mi4fłóĄşşĘMJÎNďËâççç77+Ľ ‚ĹiĽîH¤iÂż·f $Ë‚1ÂeŔa"ĚWćÖłš@ÄLęŤ\Wdµ ĂÍ?çĂŐ`€ R­ÉÄBh±1~d *ăąë†á^h öçńĽ››í’ 7rYKq–]‘‹Îe3Ë%ĘŮ d=žŇ`A\śůqh˘°Wj¤HĘ2ł)M’—1Q¬D¸Ş/ÍŕµŰa¸úńc:ťÎfˇčd6R! Řń•//E/é|ľđ‘$YĚëŃÁF˛×,KLń/Y} ¦aZ YE6 Ý46ERÜlberöë×RĂ7C—‡j0čId_cřţ©cߌ®Ż/.lȦmţüiŰŤšîÚíĹ⺸»›Ď äűk©ľMÓb­yłÓz@ä‰qi¨2É|ae”sş;2 ěţŢČZá‡ëbĺ‡ü ŁuiDÄlr[–ŐR–‰0BYćŕ8Ąě"úf29§",É?"‚Ä’Ýč“Ď{~ľĽäąz~ľŁâKťĄ%Vń}ŐÁşXNněIOlLX÷âÁFĆűż©Ĺóîîn«J¬kĺu%Éş4熞Çěˇ6Q‹:r¨bVČagYé†Z´?‘s|”ç™<@p™Á)•¦%BŹhNÉőNcč7ëtşŃE Óc9ŚŹGŮIdÎ/BăńýÓSÜ$9Áóó/đ­FşsÝo3#5…i-  P´§Ď1„Ę]˛uÓ÷]°ľáĐ9>y-!ţśďÉH»í훪›Xhq01ĐĄ6öÝ®Ş28&ŹÚ`mńd‚0lâG«eŠ|ÝN€_ p5ă(u>ŹcJV{&#Uó„” Đ Ů=Ąű“b9:‡Ŕ ;18ńˇ¶¶š¸ĽÜzŢáđť}*ާ§§Fc˝NkŃiĺj%´< $Ö±^äđ˛Şlń’Çń)Ď‚‡†› ˇ ]¬¤)0Ř<8ʍń÷{”Ȳt5SQb3ťŽn%Ńcń„ůTV؉%°6Ź6^ő(µX uzśę 8:ŇŻ8µNćő€Ř®rKčFś Ó)1žĂ0‹·ŤÓ<Źż}Ę6®–Věíë! ňÖqtźĘŞĹXW} SéŢGŃTXb*ôŃX:™@\B¸„ ú‹ÚŹŚâ)T‹„â‚UIëřWßFĄ„a_zIŽ“¦/©ňšW ^v»ˇůžŚć(‚,PGŘý8ŽěAnôJ™ŐňŇĄ@ g“3sŽXÜßK;d,˝BűíčĘŞ… CˇQËÎřd:íěO·Zeą0:A]S–oĐčĺ)óBůÁ]ČäHý™xükâĆ4ĎÓ͉ނ)F)ÝŃ“v¨č¤Şf5XľFşŹÔź‡út\ţß&Ő{¦đ[-ÝezCń»ÝÇóń·ăx¦+U n337ĂzXžUr^©ťńţ^N±_NŰîď×ëD$ÓLŤźđ@b[I×Hz‡âڰ®'9ĹŽyT.ÝYéŃ÷h] “˝ŇđŰ7‘‚vE'r:÷ú“Š:™Ű#‰ŞŞ4<˙$Ď+Ë^ń?üŮęđMŮIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/SquaresDark/styles.less000066400000000000000000000033271361462701300255160ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #48525C; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #ddd; @loading-text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); // LOGIN @login-color: #eee; @login-background-color: #2b333d; @login-rgba-background-color: rgba(0,0,0,0.5); @login-box-shadow: 0px 2px 10px rgba(0,0,0,0.5); @login-border: none; @login-border-radius: 7px; @powered-color: #ddd; @languages-color: #ddd; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #48525C; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #fff; @folders-disabled-color: #aaa; @folders-selected-color: #fff; @folders-selected-background-color: #2b333d; @folders-selected-rgba-background-color: rgba(0,0,0,0.5); @folders-focused-color: #fff; @folders-focused-background-color: #2b333d; @folders-focused-rgba-background-color: rgba(0,0,0,0.7); @folders-hover-color: #fff; @folders-hover-background-color: #2b333d; @folders-hover-rgba-background-color: rgba(0,0,0,0.5); @folders-drop-color: #fff; @folders-drop-background-color: #2b333d; @folders-drop-rgba-background-color: rgba(0,0,0,0.5); // SETTINGS @settings-menu-color: #fff; @settings-menu-disabled-color: #aaa; @settings-menu-selected-color: #fff; @settings-menu-selected-background-color: #2b333d; @settings-menu-selected-rgba-background-color: rgba(0,0,0,0.5); @settings-menu-hover-color: #fff; @settings-menu-hover-background-color: #2b333d; @settings-menu-hover-rgba-background-color: rgba(0,0,0,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Stripes/000077500000000000000000000000001361462701300225025ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Stripes/images/000077500000000000000000000000001361462701300237475ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Stripes/images/background.jpg000066400000000000000000001612271361462701300266010ustar00rootroot00000000000000˙Ř˙ŕJFIFHH˙áhExifMM*>F(1NHHPaint.NET v3.5.10˙ŰC    $ &%# #"(-90(*6+"#2D26;=@@@&0FKE>J9?@=˙ŰC  =)#)==================================================˙Ŕ8€"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ńš(˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ZJZ(˘ŠQEQEQE´”´†QE´”´QEQEQEQEQEQERŇRҢŠ(QEQEQEQEQESiÔ”!1(Ą˘ E-”RŃ@ E-”RŃ@ E-””ęm0 (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ZJu%´S”RŃ@ E-”RŃ@ E-”RŃ@ IN¦Đ4QE (˘€ (˘€ (˘€ (˘€ (˘€ JZJB (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ZJZ(˘ŠQEQEQEQEQE´”ę@%´PQKE%´PQKE%´PQKE%:’–€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ZJZ`QE (˘€ (˘€ (˘€ (˘€ (˘€ (§Ph§Q@ ˘ťE6ŠuÚ)ÔPh§Q@ ˘ťE6™RÔt”RŃ@ E-”RŃ@ E-”RŃ@ E-””ęJJ)h ˘–ŠJ)h ˘Š(˘Š(˘Š(¤Ą¤ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( –’– ˘Š\R”QK@Q@´PQKEQE´”´QEQEQEQEQEQES±M§Ň1F)h¤!1F)h ĹĄ˘€b–ŠLQŠZ(1F)h Ĺ6źM¦&%´S”RŃ@ E-”RŃ@ E-”RŃ@ M§Ó(C (˘Q@Q@Q@Q@Q@-%: E-ŔJ)h ˘–ŠJ)h ˘–ŠJ)h ¤§Sq@ĐQF(Ĺ (Ĺ Š1F(˘ŚQŠ(Łb€ (Ĺ ’—”€(˘ŠQEQEQEQEQE´”ęJ)h¤1(Ą˘€ŠZ((Ą˘€ŠZ((Ą˘€–ŠZJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ~)´ę1F(˘€ QŠ( bŠ(ŢŠ1F(˘€ QŠ( ¸¤§S@&(Ĺ-ŔLQŠZ(1F)h ĹĄ˘€b–ŠLQŠZ(1KŠ)ؤ!¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€ŠŠ§ĹC@ E-”RŃ@ E-”RŃ@ E-”RŃ@ E-%QE!…Q@„˘–ŠcŠZ)”RŇP ¤Ą˘ IN¦ĐEPEPEPEPEPEPEPEPEPEPEPEPEPEPNĹ6ťŠbŠZCŚRŃ@Q@˘–‰Š1KE&(Ĺ- Ĺ:“ę E-€J)h ˘–ŠJ)h ˘–ŠJ)h §Óiô€J)h BQKE%´PQKE%´PQKE%2¤¦P„Ģ–Šd‰E-”RŃ@ E-”RŃ@ E-”Ę’ŁĹ40˘ŚQŠ`QŠ1@bŚPEŁQF(ĹQŠ1@;ÜSéˇ11F)h ĹĄ˘€b–ŠLQŠZ(1F)h ĹĄ˘€”ęmAEP0˘Š(˘Š(˘Š(˘Š(˘Š(¤Ĺ-% QŠ( AŠ1EbŚQEŁQ@(ĹPŠ1Eb–’–€ (˘…Q@Q@Q@Q@Q@:›N¤Ŕ(˘ŠC (˘€ (˘€ (˘€ (˘€ (˘€ v)´üSŁ¸ŁŁ¸ŁŁ¸ŁŁ¸ŁŁ¸ŁŁ¸Ł§b“ěS@&(Ĺ.(Ĺ0b—b€b—b€b—b€b—b€b—b€ěRbźHCqF)ÔPqF)ÔPqF)ÔPqF)ÔPqF)ÔPqF)ÔPqPUšŻ@ E-”RŃ@ E-”RŃ@ E-”RŃ@ E-&(˘ŚQŠC CKŠJ(Łb€ (Ĺ))i(˘ŚQ@6ťM¦EPEPEPEPEPEPEPEPEPEPEPEPEPEPO¦Sč (˘ÂŠ( aE-Q@˘€ (Ą bQE-%>›O¤QKE ŠZ((Ą˘€ŠZ((Ą˘€ŠZ()ôÚ“Ú)ŘŁ„6Šv(Ĺ6Šv(Ĺ6Šv(Ĺ6Šv(Ĺ6Šv(Ĺ6™R⢪BaES$(˘Š(˘Š(˘Š(˘Š(˘Š*:’٦†QE0 (˘€ (˘€ (˘€ (˘€ (˘€ }2źŠhL(Łb€ (Ĺ Š1F(˘ŚQŠ(Łb€ (Ĺ ›NĹ6 ˘Š(QEQEQEQEQESiÔ”€J)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJZ)h(Ą˘ E-”RŃ@ E-”RŃ@ E-”úm>€ŠZ) J)h ˘–ŠJ)h ˘–ŠJ)h ©)•%%´S”RŃ@ E-”RŃ@ E-”RŃ@ KE;Đ ˘ťŠ1LŃNĹ ŃNĹ ŃNĹ ŃNĹ ŃNĹ ÓńIŠ~)n(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ â«Ő¬UjJ)h ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJLS©(1F)h¤1´b–Š&(ĄŁ J(˘€Š\Q@„˘–“ŔLSiôĘ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š)ôĘ}AF)h¤PQŠ( aŠ1KE%-P0ĄĹPŠ1E€1O¦T” E-€J)h ˘–ŠJ)h ˘–ŠJ)h ©1L©qďIn(Ĺ;ôcŢ Ĺ§cŢŚ{ĐqF)Ř÷ŁôÜQŠv=čÇ˝7bťŹz1ď@ ŧcŢŚ{ĐqQb§Ç˝EФD†âŚS±F)’7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ĹGŠ› 4Š1EĆŁQ@(ĹPŠ1EbŚQEŁQ@*JŽĄ¦„Ģ–ŠbŠZ((Ą˘€ŠZ((Ą˘€ŠZ()•%GAQ (˘‚‚Š( Š( Š( Š( Š( ›Šu%bbŚRŃ@ Š1KE&(Ĺ-Ł´PbŚRŃ@ Š1KE&)Ô”´QHŠ( Š( Š( Š( Š( źŠeIHbbŚRŃ@ Š1KE&(Ĺ-Ł´PbŚRŃ@ Š1KE&*LS*\PqF)ŘŁn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š~)1NĹR1F)qF)€Ł¸ŁŁ¸ŁŁ¸ŁŁ¸ŁŁ¸Ł§â›Š“ŤĹ§bŚP!¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn*­\ĹT ˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ)h ¦âźMĹ&(Ĺ.(Ĺ!‰F)i1@))h ˘Š(¤ĄŁ˘—””ƒ٦ ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(©*:’‘H(˘–‚‚Š)h)h˘…¸˘ KE-ŚRŃ@ ГƓ Š1KŠ1HBbŚRâŚPbŚRâŚPbŚRâŚPbŚRâŚPbŚRâŚPbĄĹGŠ›,ÜQŠv(Ĺ! ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqPŐŚT8މE;b¨‘´S±F(´S±F(´S±F(´S±F(´S±F(µOЇĐ!(ĄĹ¦1(ĄĹ ˘—b€Š\QŠJ)qF((ĄĹ ©qQ⥪BbbŚRŃLBbŚRŃ@ Š1KE&(Ĺ-Ł´PbŚRŃ@ ŠŹ-GAQb–ŠE‰Š1KE&(Ĺ-Ł´PbŚRŃ@ Š1KE&)´úeaEP ˘Š(˘Š(˘Š(˘Š(˘Š(§SiÔQHŠ( Š( Š( Š( Š( ¤ĹGRŇcBbŚRŃHbbŚRŃ@ Š1KE&(Ĺ-Ł´PbŚRŃ@ Š›MŠÄťŦ!1F)qF(1F)qF(1F)qF(1F)qF(1F)qF(1N¤Ĺ?Đ ˘ťŠ1Th§bŚPh§bŚPh§bŚPh§bŚPh§bŚPjLSqRâ€c1F)řŁ„3bźŠ1@ ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ĹSĹ_ĹQĹ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&)´üSh”b–Š@7RŃ@ E-%”´PRRš((Ĺ-%IQÓQEQEQEQEQEQEQEQEQEQEQEQEQEQET•KI•˘–Š (Ą¤E–…Q@RĐ0ŁQ@IQÔŘ©aa´S±F)Ú)ŘŁÚ)ŘŁÚ)ŘŁÚ)ŘŁÚ)ŘŁÚź*|TČLn(Ĺ;b†âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸¨1VqUńU&&(Ĺ.(ĹQŁ¸ŁŁ¸ŁŁ¸ŁŁ¸ŁŁ¸Ł¨*Ć*˝TF‚Š(¦0˘Š(˘Š(˘Š(˘Š(˘Š(©j*ž©ĆŃN˘¨Ch§Q@ ˘ťE6ŠuÚ)ÔPh§Q@ ¦Tµ"ŕQE"Š( Š( Š( Š( Š( ™O¦P&QE (˘€ (˘€ (˘€ (˘€ (˘€ u6ťI€QE†QEQEQEQEQE.**š“b–ŠCb–ŠLQŠZ(1F)h ĹĄ˘€b–ŠLTř¨jĆ(Š1NĹ CqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜSńIŠ“QŁüQЎ ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1R⛊“0cqF)ŘŁ„7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ĹP­Vv(˘ŚQŠ(Łb€ (Ĺ Š1F(˘ŚQŠ(Łb€ m;”Đ””ęLPQKŠ1@ ˘—PQE ¤Ą˘€Š\RPTU-ELAEPEPEPEPEPEPEPEPEPEPEPEPEPEPRÔU5&TB–Š)RŃ@ŔQE-—RĐ11KŠ)i„˘–Š%MŠŠ¦Ą b–Š‘ Š1KE&(Ĺ-Ł´PbŚRŃ@ Š1KE&*|T5g2Š1OĹ©¸†bŚSńF(¸ ŧâŚQpŠ1OŢŕ3bźŠ1EŔf(Ĺ?b‹€ĚT«XŞŘ«‰ťA1F)qF*ŚÄĹĄĹ ĹĄĹ ĹĄĹ ĹĄĹ ĹĄĹ ĹV«XŞŐQŠZ*€J)h ˘–ŠJ)h ˘–ŠJ)h ©Ş*žŞ"ch§QT!´S¨ ŃN˘€E:Šmę(´S¨ Ôu5EŠpŠ\QŠE‰E.(Ĺ%¸Ł”RâŚPQKŠ1@ E.(Ĺ%2¤Ĺ2”RŃ@„˘–ŠJ)h ˘–ŠJ)h ˘–ŠJu%-&0˘Š)QEQEQEQEQETبjz–4&(Ĺ-†&(Ĺ-Ł´PbŚRŃ@ Š1KE&(Ĺ-«8Şők!1¸ŁěQŠbŠ1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ â¤Ĺ7&*˘qF)ŘŁ@7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ĹKŠf*m´11Łý´m¤!Łý´m bŚSöѶ€Š1OŰFÚf(Ĺ?mhŁý´m błkWme \QŠJ)qF((ĄĹ ˘—b€Š\QŠJ)qF()©1M¤Ć†ŃKE RŇPbŠZ)€Ú -%%´””RŇPT5=ALAEPEPEPEPEPEPEPEPEPEPEPEPEPEPSÔ=&\–Š)-´Ą˘ŠC \QK@ÄĄQ@ŠZ(1S⡩ędbŚRŃRbŚRŃ@ Š1KE&(Ĺ-Ł´PbŚRŃ@ ŠłŠŻV±S"XÜQŠv(Ĺ@†âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸ŞµsR®U: E-fBQKE%´PQKE%´PQKE%U«uV®#BQKEPĢ–ŠJ)h ˘–ŠJ)h ˘–ŠJ±Š‚¬b®"bbŚRâŚU&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&**›&i(Ą˘‘ ”RŃ@ E-”RŃ@ E-”RŃ@ QÔµ&&%´PH”RŃ@ E-”RŃ@ E-”RŃ@ N¤§T±‰E-€J)h ˘–ŠJ)h ˘–ŠJ)h ©ńPÔô™HLQŠZ*F&(Ĺ-Ł´PbŚRŃ@ Š1KE&(Ĺ-«x޵oĐŁ¸ŁLQŠ\QŠLQŠ\QŠLQŠ\QŠLQŠ\QŠLQŠ\QŠLT¦b¦Ĺ\@f(Ĺ?b¬bŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(©ńQâ§Ĺ&KŠ1OŤ!ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(ŁüQŠf+'łŠČ âŚS¨ âŚS¨ âŚS¨ âŚS¨ âŚS¨ âŚS¨ â™RÓ1IŤ ˘śE&)”§b“””ěRb€’–Š`%%.(Ĺ6ŠSE6 «Şô!QLŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¬Uz±I—Ą˘–‘¨QE(¤0Ĺ´P0Ł´PŠ1E-!†(Ĺ- LUŚTgŐ2†âŚS±íF=ŞBĂqF)ŘöŁÔ†âŚS±íF=¨ ŧcÚŚ{PŠ1Nǵö ,7bťŹj1í@Xn*Ţ*¶=ŞŢ*$&†âŚS±F* °ÜQŠv(Ĺa¸ŁěQŠĂqF)ŘŁ†âŚS±F( ŧbŚPŠ§Š˝Š§ŠŇUz ŧbŚUŤĹ§bŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqU1WqTŞâ4ŁQV0ŢŠ1F(˘€ QŠ( bŠ(ŢŠ1VqUŞŐT Ł´ULQŠZ(1F)h ĹĄ˘€b–ŠLQŠZ(1PUŠ™Ą>˘QKŠ1A¨”RâŚPQKŠ1@ E.(Ĺ%¸Ł”RâŚPTu.*:L–%´R”RŃ@ E-”RŃ@ E-”RŃ@ O¦ÓęX E-†%´PQKE%´PQKE%´PUŚTg2Š1NĹ©ÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7sWsĐÜQŠv(Ĺ1 ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqSbŁĹOЏĚQŠ~(ĹX ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1SâŁĹXĹ&K#Ĺ©1F)Źb¤Ĺ ńF*LQŠŹb¤Ĺ ńF*LQŠŹb¤Ĺ ńXŘ­ÜV(1F)qF(1F)qF(1F)qF(1F)qF(1F)qF(1F)qF(1L©1LĹ&4!¤§F)ÚJv( ŇS©1@ ŠLS©(¦’ťŠLS1INĹ&(*µYŞÔ!QLŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¬Š­V…&iL(ĄŁ& )q@ĄĹ–ŚR@ě&)qKŠP) LQŠ\RâŘAF)qKŠn*Î* U¬THŠ1OŨ ŧâŚPŠ1OĹ ,3bźŠ1@Xf(Ĺ?b€°ĚQŠ~(Ĺa«¸Ş¸«»j&KC1F)űhŰP!Łý´m bŚSöѶ€Š1OŰFÚf(Ĺ?mhŁý´m b¨â´vŐ V”Ů…nqF)ŘŁĄĚFâŚS±F(¸ ŧbŚQpŠ1NŢŕ7bťŠ1EŔn(Ĺ;b‹€ÜU*żŠˇW ˘Š+A…Q@Q@Q@Q@Q@ZĹU«•p&CqF)ÔU’7bťE7bťE7bťE7bťE7bťE7*ÍWĹ&kK¨Ł¸ŁŤDĹĄĹ ĹĄĹ ĹĄĹ ĹĄĹ ĹĄĹ ĹESb˘Ĺ&&%¸Ł‰Š\QŠJ)qF((ĄĹ ˘—b€Š\QŠJ’™Š’ĄŚJ)h¤QKE%´PQKE%´PQKE%YĹW«X¨‘QŠ1NĹ©(n(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š˝Š§Š˝Šh–7bťŠ1LCqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜTبńV6Ö(ĹI¶Ťµ âŚT›hŰ@âŚT›hŰ@âŚT›hŰ@âŚT›hŰ@âŚT›hŰ@â­m¨vŐ­µ,LŹmjM´m¤IÚ6Ô›hŰ@íŁmI¶Ť´Ú6Ô›hŰ@íŁmI¶Ť´Ú6Ô›hŰ@í¬WE¶ąüPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7*lTx¤Ć†ŃŠv)*F6ŚRâŚPqIN¤¦RNĹ%4ŇS©(””ęJn*­[Ş”Đ‚Š(¦EPEPEPEPEPEPEPEPEPEPEPEPEPV…U«t™Ą>ˇJ(Ą©6 RŇS€¤; J(˘Ř(´P;-´‡a)h—Âb­b«Uş‰CqF)ÔT ĂqF)ÔPŠ1N˘€°ÜQŠu†âŚS¨ ,7bťEa¸«ŘŞu&Hf(Ĺ?bł¸¬3bźŠ1EÂĂ1F)řŁ\,3bźŠ1EÂĂ1F)řŁ\,3bźŠ1EÂĂ1T+KźŠÖźSžżA´S±F+C´S±F(´S±F(´S±F(´S±F(´S±F(µźZX¬ęŇBQKEhP”RŃ@ E-”RŃ@ E-”RŃ@ W1U*î*ŕL†âŚS±F+BâŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸Şők[,Ú—Q(ĄĹ¤l%¸Ł”RâŚPQKŠ1@ E.(Ĺ%¸Ł•MŠŠ“&BQKE"D˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ“Ę’¦CBbŚRŃRb–ŠÂbŚRŃ@XLQŠZ( Š1KEa1F)h ,&*ŐV«©‘QE?b ˇ”SńF(”SńF(”SńF(”SńF(”SńF(•ˇŠĄŠżŠhLn(Ĺ;b¨› ŧbŚPŠ1NĹ ,7bťŠ1@Xn(Ĺ;b€°ÜQŠv(Ĺa¸«¨qVqZSę1F)řŁ  ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1V¶Ô«{jY2#ŰFÚ“miG¶Ťµ&Ú6Đ{hŰRmŁmG¶Ťµ&Ú6Đ{hŰRmŁmG¶Ťµ&Ú6Đ{kťĹtŰk›Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqQâ¦ĹGŠ–40ŃNŤ1ŁěRb€Š1NĹ&(§Ą!§ILŇS±Hh¦Ó¤ CqU*ĺS¦…QLAEPEPEPEPEPEPEPEPEPEPEPEPEPVęĄ],Ö—PŠ:¤Ů ŠQ@Ą  ĄĹRâ†(Ĺ--!¤&(Ĺ8QŠa)qKŠ\P; Ĺ\ĹUĹ\Ĺg0hn(Ĺ;b ,7bťŠ1@Xn(Ĺ;b€°ÜQŠv(Ĺa¸ŁěQŠĂqF)ŘŁ†â´1TqZ8¬ę2$†bŚSńF+;“aŁüQŠ.Š1OŢáaŁüQŠ.Š1OŢáaŁüQŠ.ŠÎĹjbłqZÓęsâ: ŧbŚV‡0ÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7›Z¬ĽV´ú•˘ŚQŠÔ ˘ŚQŠ(Łb€ (Ĺ Š1F(˘ŚQŠ*őQĹ_ĹiL‰‰E.(Ĺh@”RâŚPQKŠ1@ E.(Ĺ%¸Ł”RâŚPU\UĽU\Tłz=DĹĄĹ©7b—b€b—b€b—b€b—b€b—b€ OІ“&BQKE"D˘–ŠJ)h ˘–ŠJ)h ˘–ŠJ“Ę—27bťŠ1R1¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn*î*¦*î*$TFâŚS±F*JŠ1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ â´qT1ZX¦‰ĚQŠ~(Ĺ1 ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1VvÔ8«8­)őÍ´m§âŚV 3miřŁÍ´m§âŚP6ѶźŠ1@ ŰFÚ~(Ĺ3miřŁ͵smVĹ]Ĺ&LöѶ¤Ĺ©$ŹmjLQŠŹmjLQŠŹmjLQŠŹmjLQŠŹmjLQŠŹms8®«Ëb€b—b€b—b€b—b€b—b€b—b€b—b€*lTx©ĐĚQN Š’†QNĹ&)m&)Ô„Pi :Đi1N¤4”ÓN4† "©UęŁM …QLAEPEPEPEPEPEPEPEPEPEPEPEPEPWER«Â¦FÔş€§ LRŠ“k QKH«Ą RAV RĐ-°KŠ-"¬&)hĄĹ°«¸Şu{śÄĐÜQŠv(ĹgpŠ1NŢŕ7bťŠ1EŔn(Ĺ;b‹€ÜQŠv(ŸŁěQŠ.qZ[k?©ŠÎŁŘ‰íŁmIŠ1Y\’=´m©1F(¸íŁmIŠ1EŔŹmjLQŠ.{hŰRbŚQp#ŰFÚ“b‹ÚËĹlb˛±[R{ś¸ž1F)řŁ©Ě3bźŠ1@ ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ĹeÖľ++­>ĄDměQŠÔˇ´S±F(´S±F(´S±F(´S±F(´S±F(µˇŠŁŠĐĹkO©Š1NĹ­HŠ1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âŞUÜUJ™Đę6Šu'@Ú)ÔPh§Q@ ˘ťE6ŠuÚ)ÔPj±PRdHJ)h©$J)h ˘–ŠJ)h ˘–ŠJ)h ©1L©jdn(Ĺ:ŠŤĹ§Q@ ŧQ@ ŧQ@ ŧQ@ ŧQ@ Ĺ_ĹR«ř¨™qŠ1NŨ(n(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€ŠÓĹgbµ1T‰ĚQŠ~(Ĺ2FbŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(«X¨1VöÖ´ş(ĹI¶Ťµ°âŚT›hŰ@âŚT›hŰ@âŚT›hŰ@âŚT›hŰ@âŚT›hŰ@âŻmŞ»jößz™"=´m©6űѷޤ’=´m©6űŃ·Ţ€#ŰFÚ“o˝}č=´m©6űŃ·Ţ€#ŰFÚ“o˝}č=´m©6űŃ·Ţ€#Ű\ž+°Űď\Ž(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š‹>*TȤ7N¤"¤cqIŠv)1@ ĹS¤" Ĺ!ăHE3§bĐ!¦ÓŤ!¦MP­YôĐQEÄQEQEQEQEQEQEQEQEQEQEQEQEQE| ˇZ¦FÔz€¸˘–¤č°JťH Ĺ(P)Râ––Ř@)q@ęEXLQŠZZa1WńTŞţ+:ťˇ¸ŁěQŠČCqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜV¦ÚÍĹjí¬Şô"HfÚ6ÓöѶ˛ą6¶Ť´ý´m˘áa›hŰOŰFÚ.¶Ť´ý´m˘áa›hŰOŰFÚ.¶Ť´ý´m˘áa›k'ł¶˛1[Ńęrbş ŧbŚVÇ ÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7“ŠŘĹdVÔş•1F)h­Kb–ŠLQŠZ(1F)h ĹĄ˘€b–ŠLVŽ+>´±ZŇęg1¸ŁěQŠŘ¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn*ž*ö*•DŽŚ?Q1F)h©:ĹĄ˘€b–ŠLQŠZ(1F)h ĹĄ˘€*ĹW¤ÉbŚQEIŠ1EbŚQEŁQ@(ĹPŠ1EbĄ¨Şj™ E-ŠZ((Ą˘€ŠZ((Ą˘€ŠZ(+CB´1Q2ŕ&(Ĺ.(ĹfPŁ¸ŁŁ¸ŁŁ¸ŁŁ¸ŁŁ¸Ł­]µ—Š×ĹR&C6ѶźŠ1L‘›hŰOĹ mŁm?b€¶Ť´üQŠfÚ6ÓńF(›hŰOĹ m«›j¶*ćÚÚ—P¶Ť´ý´m­„3miűhŰ@ ŰFÚ~Ú6Đ6Ń¶ź¶Ť´Í´m§íŁm3miűhŰ@ ŰWöŐ=µŁ¶¦DČ‹mj]´m© ‹mj]´m ¶Ń¶ĄŰFÚ‹mj]´m ¶Ń¶ĄŰFÚ‹mj]´m ¶×Ší¶×Šn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âˇĹXĹAS"˘7bťŠB*JE!â)(Ň)§IŠi„SŤ%0E4Šy¤ C¤4ęC@ "łëDÖuR (˘‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ´k:´ELŤčő— QPtˇqJ%8R)¸ RĐ4€ P(Ąаb—RĐU QKHv UüU ŇĹeS 1ŁüQŠĚC1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1F)řŁĚVľÚËĹlb±Şö"d{hŰRbŚVW"Ä{hŰRbŚQp±Ú6ÔŁ\,G¶Ťµ&(Ĺ íŁmIŠ1EÂÄ{hŰRbŚQp±ÚĆĹnâ±+z/s“Đn(Ĺ:ŠÜăŠ1N˘€Š1N˘€Š1N˘€Š1N˘€Š1N˘€ŠĆĹmÖ.+j]JُٱbbŚRâŚPbŚRâŚPbŚRâŚPbŚRâŚPbŚRâŚPbµ6Öf+W­.¦UíŁm;b¶3¶Ť´ěQŠnÚ6Ó±F(»hŰNĹ íŁm;b€¶Ť´ěQŠnÚŁZŞ©‘Ő†ę%¸Ł'H”RâŚPQKŠ1@ E.(Ĺ%¸Ł”RâŚPUzłŠŻRČ”RŃR@”RŃ@ E-”RŃ@ E-”RŃ@ STU6*f4%¸Ł E.(Ĺ%¸Ł”RâŚPQKŠ1@ E.(Ĺ%ibł±Zx¬ć\âŚS±F+2†âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸­ŚVN+gH™ ŧâŚS$f(Ĺ?b€Š1OĹ bŚSńF(ŁüQŠf(Ĺ?b€ŠąŠ­Š»ŠŢŹQâŚTُâŚTŁ(ĹIŠ1@âŚTŁ(ĹIŠ1@âŚTŁ+GoÖ©b´¶ÔH‰‘múŃ·ëRíŁmI[~´múÔ»hŰ@múŃ·ëRíŁmE·ëFß­K¶Ť´ß­~µ.Ú6Đ[~´múÔ»hŰ@mú×]ŢÚá±@ ˘ťŠ1@ ˘ťŠ1@ ˘ťŠ1@ ˘ťŠ1@ ˘ťŠ1@ ˘ťŠ1@ ¨1VqPTȨŤĹ&)Ô• "“ęCLŇq¤ C !óM4ÚCN4† ¤"ťI@†Í­3Y•HL(˘Šb (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ ҬÚÓ2:(uRâ€)@¨:R)ŔRN‘I.)qKŠE¤ĄŠP)b” )@ v(Ĺ.)qH« ŠŇĹgâ´±YUč&†âŚS±F++ŠĂqF)ŘŁ\,7bťŠ1EÂĂqF)ŘŁ\,7bťŠ1EÂĂqF)ŘŁ\,7ł¶˛1[x¬k=š#ŰFÚ“b±ą{hŰRbŚQp#ŰFÚ“b‹Ú6ÔŁ\öѶ¤Ĺ˘ŕG¶Ťµ&(Ĺ=µ‰[ř¬,{Vôç3ěüĆŕQNǵö®‹śCp(Ŕ§cÚŚ{QpF;ÔcÚ‹€Ü 0)ŘöŁÔ\ŕQNǵö˘ŕ7Ś v=¨Çµ¸‰ŠÝǵaVôz•ފذŢŠ1F(˘€ QŠ( bŠ(ŢŠ1Z¸¬Ş×ĹoG©ťNqF)ŘŁ±ÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7CŁŠĎ©‘×…ę&(Ĺ-XŁ´PbŚRŃ@ Š1KE&(Ĺ-Ł´Pb«b­UZ™Ě1F(˘¤€Ĺ˘Š1F(˘€ QŠ( bŠ(ŢŠ1ST5>*&4%¸ŁŠ\QŠJ)qF((ĄĹ ˘—b€Š\QŠJÓĹfâµqYÔ.1F)řŁťÍbŚSńF(¸ ŧâŚQpŠ1OŢŕ3bźŠ1EŔf(Ĺ?b‹€ĚVć+ą·éU$3bź·éFߥ2bŚSöý(Űô bŚSöý(Űô bŚSöý(Űô bŚSöý(Űô bŚSöý(Űô b®íúU]żJ˝ŠčˇÔöý(Űô©1F+p#ŰôŁoҤĹ öý(Űô©1F(=żJ6ý*LQŠŹoŇŤżJ“b€#ŰôŁoҤĹ öý+OoµPĹjíúTČÎd;}¨ŰíSmúQ·éPAßj6űTŰ~”múP;}¨ŰíSmúQ·é@íöŁoµM·éFߥC·ÚŤľŐ6ߥ~”ßj6űTŰ~”múP;}«Ĺzߥyţ(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Šg*$TFbŠ~)©(a„SȤ"€E!ěR@ "ŠyŇ)a”óM4Â)§HE0EeÖ©•T‰aESQEQEQEQEQEQEQEQEQEQEQEQEQEV —Zµ:pýEĄ RÔI KŠ1N¤R@(J"Ň P.() Ĺ(b”R*ÁŠ\QŠQAV Vž+7©ŠĆ«ŘM ŧbŚV7†âŚS±F(¸Xn(Ĺ;b‹…†âŚS±F(¸Xn(Ĺ;b‹…†âŚS±F(¸Xn+s‹ŠŢŰXV{4GŠ1RmŁmas2•…~†ubŚSđ}(Áô¬ ĆbŚSđ}(Áô bŚSđ}(Áô bŚSđ}(Áô bŚSđ}(Áô bŚSđ}(Áô bąüWGé\ö+§ÔŕÇ}źźč7bťŠ1]'ž7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ Ĺs¸®“Î×E¦Š1N˘ş Š1N˘€Š1N˘€Š1N˘€Š1N˘€Š1N˘€ŠÚĹcÖÖ+˘‡S*˝âŚS±F+ Än(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€ŠÍĹjbłqYĚíÂ}ˇ¸ŁěQаn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€ЩлЧS#:‚bŚRŃRf&(Ĺ-Ł´PbŚRŃ@ Š1KE&(Ĺ-«5^¬âł¨RŠ\QŠĚbQKŠ1@ E.(Ĺ%¸Ł”RâŚPQKŠ1@ Zř¬śVľ+*ť )őb—b˛5b—b€b—b€b—b€b—b€b—b€Đb°1]*âg2•­Q39ŚŰFÚ~ 5c6ѶźF 3miř4`Đ6ѶźF 3miř4`Đ6ѶźF 3my¶+Ó0kͱ@ ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1F)řŁĚU|UĽUlTL¨ŚĹ!§‘IŠ‚ĆbŠyŇ(ĚRO"šE0i¦žE! M4ň)¤S„SM<ÓH C cÖѬZ¨’Š(ŞQEQEQEQEQEQEQEQEQEQEQEQEQEVŔ¬zŮ:°ÝEŕ)8VgbBŠP)8R-!@§H)‘iěP(‹HĄĹS©ĄĹ.)qAVŻŠĘ­|Vş ˇ¸ŁěQŠÄVŠ1NĹ ,7bťŠ1@Xn(Ĺ;b€°ÜQŠv(Ĺa¸ŁěQŠĂq]ÓX8®‡ms×{Uč3iŁi§íŁmsÜÄfÓFÓOŰFÚ.6š6š~Ú6Ńp´Ń´ÓöѶ‹€Í¦Ť¦ź¶Ť´\m4m4ý´m˘ŕ3i®sÓm®sŐ†{ž~;ěü˙AŁüQŠę8bŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(®sÓbąŞčĂő.bŚRŃ]‚bŚRŃ@ Š1KE&(Ĺ-Ł´PbŚRŃ@ ŠÜĹbVî+§ÔĆŻA¸ŁěQŠč2Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ â˛ńZŘ¬Ş‰ť¸?µňb–Š´LQŠZ(1F)h ĹĄ˘€b–ŠLQŠZ(1TęíS¨‘ťN‚QKEI”RŃ@ E-”RŃ@ E-”RŃ@ Vj˝YĹgS Đ”RâŚVe E.(Ĺ%¸Ł”RâŚPQKŠ1@ E.(Ĺ%lâ±ń[X¬jô4§Ôn(Ĺ;b˛5°ÜQŠv(Ĺa¸ŁěQŠĂqF)ŘŁ†âŚS±F( ŧbŚPŠé1\î+ĄŰU9ŚĹ§íŁmQ1F)űhŰ@ ŧíŁm3bź¶Ť´ĚQŠ~Ú6Đ1F)űhŰ@ ĹhíŞ;kKŐ†ę&G¶Ťµ&(ĹtŹmjLQŠŹmjLQŠŹmjLQŠŹmjLQŠŹmjLQŠŹmjâł±Z¨™ťAŁüQŠ1ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(ŁüQŠf+Í1^ťŠó˘QKEuš E-”RŃ@ E-”RŃ@ E-•ŃâąÚé1]X^¦ş ŧbŚW]ŚâŚS±F(° ŧbŚQ`Š1NŢŔ7bťŠ1E€n(Ĺ;b‹ÜV6+oŤYTčz8µňýFâŚS¨¬Ď@n(Ĺ:Šn(Ĺ:Šn(Ĺ:Šn(Ĺ:Šn(Ĺ:Šn*ŤhU ‰™Uč%´T™ E-”RŃ@ E-”RŃ@ E-•kZ­â±«Đ¨ŤĹ§bŚVCŠ1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ â·ńXX®Ťn†ÔşŚĹ§âŚV6Š1OŢŕ3bźŠ1EŔf(Ĺ?b‹€ĚQŠ~(ĹŁüQŠ.1]f=«–Ĺux«Ť^qíF=©ŘŁfCqíF=©ŘŁÜ{QŹjv(Ĺ7ÔcÚťŠ1@ ǵö§bŚPqíF=©ŘŁÜ{VŽÚˇŠŇĹuaş’ĆmŁm?bş„3miřŁÍ´m§âŚP6ѶźŠ1@ ŰFÚ~(Ĺ3miřŁ͵§ŠĎĹií©‘śĆbŚSöѶ Łý´m bŚSöѶ€Š1OŰFÚf(Ĺ?mhŁý´m bĽ»ę›k˱@ ŧâŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1F)řŁĚUJ˝Š§YÔč\SH©)¤VeŚ4Ň)äR@ši©¦š`Fi¦¤"E#4ÓRaŔa¦Ó 1šçë˘5ÎŐÄ™QTHQEQEQEQEQEQEQEQEQEQEQEQEQEVř[⳨vŕúŽś)§ ČďC€§H8 FP)ŔRO‘˘)ŔP8 E ś §H´Râ€)ؤR Vć+»\Őú1¸Łę+śĚn(Ĺ:Šn(Ĺ:Šn(Ĺ:Šn(Ĺ:Šn(Ĺ:Šn+¦ĹsuÓâą±zýbŚSńF+šć1F)řŁ\bŚSńF(¸ ŧâŚQpŠ1OŢŕ3bźŠ1EŔf+™Ú+©Ĺs®Ľ+ÜósłóýíměQŠë<á»EE;b€´Q´S±F(»EE;b€´Q´S±F(»EE;b€´WŠě±\v+Ż ÔŇźQ1F)qF+°ÔLQŠ\QŠLQŠ\QŠLQŠ\QŠLQŠ\QŠLQŠ\QŠLWKŠćń]5uázWč7bťEuăqF)ÔPqF)ÔPqF)ÔPqF)ÔPqF)ÔPqX¸­ĘĹĹgSˇée˙kĺúŤĹ§bŚVg˘7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ĹgÖ–+;2«ĐJ)qF* D˘—b€Š\QŠJ)qF((ĄĹ ˘—b€®bŞb®â±«Đ¨ŤĹ§bŚV% ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPq]+Đâ±­ĐÚ—Q¸ŁěQŠŔŘn(Ĺ;b€Š1NĹ âŚS±F(¸ŁěQŠn(Ĺ;b€Šë1\®+­Ĺ\ ktŠ1OĹ­ bŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(­,U VŽ+« ÔLn(Ĺ;bşÄ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ Ĺiâł±Z¨™Š1OŨ3Š1OĹ bŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bĽ¶˝Wĺ ŃNĹ ŃNĹ ŃNĹ ŃNĹ ŃNĹ ŃNĹ Ő,UüU,VU:„RO"ŠĚĐŚŠi&)¤S¦‘O"ŠŚŠa)Â)ŚÓH§šiŔŚÓ©¦@Č®vş2+ś«‰2 (˘¬˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(®€W?]¬ę¸?´8SĹ0SĹdz ŕ)˘ž*Y˘)ŔSE8 Fp§H8R-!E(J) RâJ)Vö+ ·ń\ŘŽ„Tč7bťŠ1\ćcqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜWQŠćq]F+—ö9ëôŠ1NĹ®kśăqF)ŘŁ\âŚS±F(¸ ŧbŚQpŠ1NŢŕ7bťŠ1EŔn+—ĹuX®bşđ˝O70ű??Đf(Ĺ>Šë<ŃŁú(Łú(Łú(Łú(Łú(®6»Zâëł ÔÖźQ(Ą˘» D˘–ŠJ)h ˘–ŠJ)h ˘–ŠJéń\Íu8®Ě/SžżAŁüQŠë9ĆbŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(¬LVö+ ł©ĐôňďµňýDĹĄ˘˛=11F)h ĹĄ˘€b–ŠLQŠZ(1F)h ĹgÖŤgTLĆŻ@˘Š* BŠ( Š( Š( Š( Š( ®b©ŐÜV5z1F)qF+‰Š1KŠ1@ Š1KŠ1@ Š1KŠ1@ Š1KŠ1@ Š1KŠ1@ ŠčëťĹtx¬+ô7ŁÔJ)qF+śŘJ)qF((ĄĹ ˘—b€Š\QŠJ)qF(+¬Ĺr®»­>¦ş ŧâŚV†#1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1F)řŁĚV–*†+KŐ†ę&3bźŠ1]dŚĹ§âŚP1F)řŁĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1Z¬ěV¦*&DĆbŚSńF* ĆbŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(Ż+Ĺzľ+ʱ@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜU,UüU*ʧCH "šEHE6ł,ŚŠi!Ň(2)¤T„SM1‘L"¤4Ó@i!¦LDdS© 4Ó2+š®×3W$QEY!EPEPEPEPEPEPEPEPEPEPEPEPEP]ĎWD+:ťěÚůđ)˘ž+ŃBOS…#D(đ)Ł­# ÜQŠv(ĹrśăqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜW-Šęń\ľ+ł Ôó3łóýbŚSńF+¬óFbŚSńF(ŁüQŠf(Ĺ?b€Š1OĹ bŚSńF(®.»|W]¸N¦´ş‰E-Řj%´PQKE%´PQKE%´PWS\˝uX®Ě'S›ĐměQŠě9ĆŃNĹ ŃNĹ ŃNĹ ŃNĹ ŃNĹ Ö+…YTčz™oÚů~ŁqF)ÔVg¨7bťE7bťE7bťE7bťE7bťE7ťZu›Š‰Vč%¸Ł™”RâŚPQKŠ1@ E.(Ĺ%¸Ł”RâŚPUÚ§Š»ŠĆ·B˘%¸Ł‰BQKŠ1@ E.(Ĺ%¸Ł”RâŚPQKŠ1@ ]%s®—Ď_ˇµŁh§bŚVăh§bŚPh§bŚPh§bŚPh§bŚPh§bŚPkŻĹrX®żĄ>¦ş ŧbŚV¦qF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜV–+?ĄŠęĂuŠ1NĹ®˛FâŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±F(¸­k–®Ľ'SĚĚ~ĎĎôš3M˘»4vhÍ6ŠvhÍ6ŠvhÍ6ŠvhÍ6ŠvhÍ6Švk‡®Ú¸ŠíÁýŁJ}E˘’Ší5ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(k¬ÍrUÖWf©Ďč.hÍ%Řs š3IE.hÍ%ąŁ4”PćŚŇQ@ š3IE.k·«5ťN‡«–}ż—ęQš3Y¨QFhÍQš3@fŚĐEŁ4QFhÍ›ZY¬ĚÔL·Ah¤Í¬Ě˘“4f€ŠLŃšZ)3Fhh¤Í ˘“4f€®ŐŐěÖ5ş˘ŚŃšŔ ˘ŚŃš(Ł4f€ (Í Š3Fh˘ŚŃš+§Ď˝s®—5Ď_ˇµŁłďF}鹣5Îl;>ôgŢ›š3@Ď˝÷¦ćŚĐłďF}鹣4ěűŃźznhÍ;>ôgŢ›š3@Ď˝vĆć» Ö´şVč:ŠnhÍl`:ŠnhÍ:ŠnhÍ:ŠnhÍ:ŠnhÍ:ŠnhÍ:´sY™­,×V¨ąŁ4™Ł5ÖHąŁ4™Ł4ąŁ4™Ł4ąŁ4™Ł4ąŁ4™Ł4ąŁ4™Ł4ą­JĘÍić˘dLuÜŃš1ÔSsFhÔSsFhÔSsFhÔSsFhÔSsFhŐĺ5꙯* ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ)( Ş9«µC5•^†”ŔšBh&šMdh!4ŇiI¦“@i†śM0Ó„Ó )4Ňii¦1§L&€i†śi¤ÓĂ\­u$×-Z@‰QVHQEQEQEQEQEQEQEQEQEQEQEQEQEWF+ś®ŚVu:Ř/µň)â)ŔÖ'˘‡Šx4ÁO‘˘)Â)③)š)‘hxĄĐiŔÔ–‡ p¦ŠPh-®†ąęß®\GB*tE6Šć2E6ŠuÚ(ÔSh QM˘€E6Šuu®Vşś×.'ˇĎ_ ąŁ4™Ł5Ěs‹š3Iš3@ š3Iš3@ š3Iš3@ š3Iš3@ š3Iš3@ šĺë§Írů®Ľ/SĚĚ~ĎĎôŠLŃšě<Ńh¤Í ˘“4f€ŠLŃšZ)3Fhh¤Í ®&»\ךěÂ}ŁZ}E˘“4f»ME˘“4f€ŠLŃšZ)3Fhh¤Í ˘“4f€şĽ×'šęó]N§6# ąŁ4™Ł5Řs š3Iš3@ š3Iš3@ š3Iš3@ š3Iš3@ š3Iš3@ šÁ­ÜÖk*ťW,ű_/ÔZ)3Fk3ÔŠLŃšZ)3Fhh¤Í ˘“4f€ŠLŃšZÍ­ÖmDĚktŠJ+3h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€®Ő˝XÖčTBŠ(¬J (˘€ (˘€ (˘€ (˘€ (˘€ ékš®—5Ď_ˇ˝ˇEŁ5ÎlQš3@fŚĐEŁ4QFhÍQš3@v®?5×fµĄÔ·AŮŁ4ÜŃšÔŔvhÍ74f€š3MÍ fŚÓsFhŮŁ4ÜŃšvhÍ74f€šŃȬĚÖ–kŻ Ô–.E™Ł5Ô!r(ȤÍ ČŁ"“4f€"ŚŠLŃš\Š2)3Fhr(ȤÍ Č­LÖVkN˘dLvhÍ6Š1ŮŁ4Ú(ŮŁ4Ú(ŮŁ4Ú(ŮŁ4Ú(ŮŁ4Ú(ŮŻ+ŻRŻ+Í:ŠnhÍ:ŠnhÍ:ŠnhÍ:ŠnhÍ:ŠnhÍ:ŠnhÍ:¨UÜŐĘŻCJbi4ăŢšMdh!¦N&šM1 &šiĆM4Ó §i¦!†ićM0i†śÔÓLC rŐÔĺęŕD‚Š(«$(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š+ŁÎWD+:ťěÚůńLńY‚)Â)¤Ń p¦ x4ŤáNĐi‘hp§ h§HŃ´ĐiŔŇ)­ü×?[ů®lGB*t4f“4fąŚ…Í¤Í Í¤Í Í¤Í Í¤Í Í¤Í Íu®[5ÓćąqzýfŚÓsFkçš3MÍ fŚÓsFhŮŁ4ÜŃšvhÍ74f€š3MÍ fąŠés\ÎkŻ Ôósłóý˘“4fşĎ4Z)3Fhh¤Í ˘“4f€ŠLŃšZ)3FhkŠ®Ó5ĹWn©­.˘ŃIEv‹E%´RQ@ E%´RQ@ E%µŐW)]UvazśřŽ‚ŃIEuśÂŃIE-”PŃIE-”PŃIE-aVĺaVuS-ű_/ÔZ)(¬ĎLZ)( ˘’ŠZ)( ˘’ŠZ)( ¬ĘҬډŐčQEfbQEQEQEQEQEz¨ŐÚĆ·B˘-”V% E%´RQ@ E%´RQ@ E%µŇfąŞé+žżCj=Eͤ˘°64f’Š\ŃšJ(sFi( Í¤˘€4f’Š\×_šăëŻÍkO©…n‚ćŚŇfŚÖ†ćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐć´sYą­ ×^¨ěŃšnhÍuvhÍ74f€š3MÍ fŚÓsFhŮŁ4ÜŃšvhÍ74f€šÔÍdćµ3Q39ŽÍ¦ćŚÔ;4f›š3@ͦćŚĐłFiąŁ4ěŃšnhÍ;4f›š3@Íy]z–kË3@ E&hÍ-™Ł4´RfŚĐŃIš3@ E&hÍ-™Ł4µDš»š˘k*˝ )i ÖF‚M4¦šii¦šq¦CL4ăL4Ä4Ó 8ša¦!¤Ó 8Ó 0k—®ś×1W$QEY!EPEPEPEPEPEPEPEPEPEPEPEPEP]®vşYÔ;phx§Š`§ŠČôńNÁO&x§ `§ Fx§ `§ LŃęhĄŠC…8SE(¤XęßÍsőżšćÄt"§AsFi3FkĚ\ŃšLŃš\ŃšLŃš\ŃšLŃš\ŃšLŃš\ŃšLŃš\×O\ľk§®lGCžżAh¤˘ąŽqh¤˘€ŠJ(h¤˘€ŠJ(h¤˘€ąś×K\ĆkŻ ÔósłóýfŚÓsFk¬óGfŚÓsFhŮŁ4ÜŃšvhÍ74f€š3MÍ fŚÓsFhŮ®*»<×]N¦´ú…Q]†ˇEPEPEPEPEP]UrµÔ×f©Ď_ ´RQ]g8´RQ@ E%´RQ@ E%´RQ@ XUąXUťN‡§—}Ż—ę-”Vg¦-”PŃIE-”PŃIE-”PÖuhVug3ݢ’Šh¤˘€ŠJ(h¤˘€ŠJ(h¤˘€®ć¨ŐÜÖ5zsFi3Fk…ͤͤͤͤͤ͠͠͠͠͠Ít•ÍfşJçŻĐÚ—Qh¤˘°6ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(k­Ír5Öfµ§Ô·AŮŁ4ÜŃšÔŔvhÍ74f€š3MÍ fŚÓsFhŮŁ4ÜŃšvhÍ74f€šŃÍff´s]Xn˘cłFiąŁ5Ô!ŮŁ4ÜŃšvhÍ74f€š3MÍ fŚÓsFhŮŁ4ÜŃšvkO5•šÓÍDĚć;4f›š3P@ěŃšnhÍ;4f›š3@ͦćŚĐłFiąŁ4ěŃšnhÍ;5ĺ•ę9Ż. Š( Š( Š( Š( Š( Š( ©UÚŁYTčiL 4Ňši¬Í4ÓJM4š!¦q4ÓLša§i CM0ÓŤ0ÓÓL4ăL& 5ĚWLk™«‰ (˘¬˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(®„v®zşYÔ;p}GŠx¦ p¬ŹA p¦ x¤h‡ p¦Šp¤Z)E4S…Ihp§Š`§HŃ´ĐiŔĐR·«·«›ĐŠťŠ(®c0˘Š(˘Š(˘Š(˘Š(˘Š(®ź5ĚWKšćÄt9ëôš3MÍ®cŮŁ4ÜŃšvhÍ74f€š3MÍ fŚÓsFhŮŁ4ÜŃšvk™®“5ÍW^©ććgçú E%ÖyÂŃIE-”PŃIE-”PŃIE-qµŘ×]N¦”ú‹E%Řj-”PŃIE-”PŃIE-”P×Ošĺë§Íuazśőú š3Iš3]fćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐć±+k5‰šÎˇéeßkĺú‹E&hÍfzBŃIš3@ E&hÍ-™Ł4´RfŚĐŃIš3@ YŐˇšĎ¨™Ť^ETQ@Q@Q@Q@Q@\Şur±«Đ¨…QX”QEQEQEQEQEŃ×9]k Ý iuŠLŃšŔŘZ)3Fhh¤Í ˘“4f€ŠLŃšZ)3Fhk­Ír9®ł5­>¦5şÍ¦ćŚÖ†łFiąŁ4ěŃšnhÍ;4f›š3@ͦćŚĐłFiąŁ4ěÖ…fć´s]Xn˘bŃIš3]"ŠLŃšZ)3Fhh¤Í ˘“4f€ŠLŃšZÔÍef´óS#9ŽÍ¦ćŚÔ;4f›š3@ͦćŚĐłFiąŁ4ěŃšnhÍ;4f›š3@ÍyvkÓó^]švhÍ74f€š3MÍ fŚÓsFhŮŁ4ÜŃšvhÍ74f€š3MÍ f¨ŐĚŐ:ʧCHi¦”ÓMfXa§i šiĄ4ŇiCL4ăL4Ŕi¦šq¦4Ôfži††šćkĄ5ÍUÄ™QVHQEQEQEQEQEQEQEQEQEQEQEQEQEW@+ź­ńYÔ;p}GŠx¦ x¬Žô8SĹ0S¤h‡Šp¦ x¤Z)E4S¤h‡ p¦ p¤R)š)E"ĐęÝÍ`ÖîkšżB* š3Iš3\ćbćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐćŚŇfŚĐćşjć3]-sb:őú˘›Es˘›E:Šmę)´P¨¦Ń@˘›E:ą¬×G\Őuázžv?ěü˙AŮŁ4Ú+¬ó‡fŚÓh fŚÓh fŚÓh fŚÓh fŚÓh f¸ęë돮Ľ/SZ}E˘’Šě4ŠJ(h¤˘€ŠJ(h¤˘€ŠJ(k¦ÍsÓW^©…~‚ćŚŇQ]G8ąŁ4”PćŚŇQ@ š3IE.hÍ%ąŁ4”Pć±kf±+:ťK/ű_/ÔuÚ+3ŇE6ŠuÚ(ÔSh QM˘€E6ŠugUúˇQ3˝Š(¨2 (˘€ (˘€ (˘€ (˘€ (˘€ ąTęÝcW â-”V% E%´RQ@ E%´RQ@ E%µŃW9]a[ˇµ.˘ŃIEbj-”PŃIE-”PŃIE-”P×Wšäë«­)ő1«Đ\ŃšJ+CsFi( Í¤˘€4f’Š\ŃšJ(sFi( ÍhćłkC5Ő†ę&;4f›š3]"š3MÍ fŚÓsFhŮŁ4ÜŃšvhÍ74f€š3MÍ f´łYy­<ÔČÎbćŚŇfŚÔ.hÍ&hÍ.hÍ&hÍ.hÍ&hÍ.hÍ&hÍ.hÍ&hÍ.kĚ+Ół^ašZ)3Fhh¤Í ˘“4f€ŠLŃšZ)3Fhh¤Í ŞUs5K5ťN…Ŕ ! ši5‘ iĄ&šiCL4âi¤ĐM4Ň“M&†ša§a¦M4ÓŤ0š4×5]!5ÍŐÄ™QVHQEQEQEQEQEQEQEQEQEQEQEQEQEVř¬ ßł¨va:ŹáLáYčx§ h4ŕi!âś)‚ś #DôgŢ´1š3MĎ˝÷ fŚÓsďF}čŮŁ4ÜűŃźzvhÍ7>ôgŢ€š3MĎ˝÷ f´+7>őŁšęĂuŠLŃšé´RfŚĐŃIš3@ E&hÍ-™Ł4´RfŚĐÖžk/5Ąš™ĚvhÍ74f ŮŁ4ÜŃšvhÍ74f€š3MÍ fŚÓsFhŮŁ4ÜŃšvkĚkÓ3^c@˘›E:Šmę)´P¨¦Ń@˘›E:ŠmęĄVęťgSˇ¤ÓM)¦šČ± !Ą4ÓL4ÓJi¦ 4ÓN4ĂLCM4ÓŤ0Ó¦iĆšhĂ\ĺtfąĘ¸“ ˘Š*É (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ Ţ[Âł¨va:ŹáLáYťčx§ héN%ˇâś)€Ó…#Dk:‡ˇ€ű_/ÔZ)3Fk3ĐŠLŃšZ)3Fhh¤Í ˘“4f€ŠLŃšZˇWłTj$eW QE&AEPEPEPEPEPVęĄZ¬jô*"ŃIEd1h¤˘€ŠJ(h¤˘€ŠJ(h¤˘€·ëź­úĆ·Cj]E˘’ŠÄÔZ)( ˘’ŠZ)( ˘’ŠZ)( ®Ł5ËWQW˝Í¤˘¬Č\ŃšJ(sFi( Í¤˘€4f’Š\ŃšJ(sZ¬ężšęĂőš3MÍ®’GfŚÓsFhŮŁ4ÜŃšvhÍ74f€š3MÍ fŚÓsFhŮ­,Ö^kK52"cłFiąŁ5ͦćŚĐłFiąŁ4ěŃšnhÍ;4f›š3@ͦćŚĐł^i^“šóZZ)( ˘’ŠZ)( ˘’ŠZ)( ˘’ŠZ§š·TóYÔ.M!4SMfXSIĄ4ÓL&šM)¦“@„&šM)¦“L“M&śi† &šiM4Ó¤×=]®~®$Č(˘Š˘BŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ·aÖŕ¬ćuázŹáLáYťČx4áLáHŃáLáH´´*&\BŠ(¨,(˘Š)i( §f : E%-QE­šÉ­j¤L4QEQćŚŇfŚĐćŠLŃš`.h˘Š(˘Š(˘Š*ćjťZÍmK¨Ł4ÜŇćµęJLóKšZ)3Fhh¤Ł4´RfŚĐŠB)sE4ŠżšŁW©‘2ŇR‘HjH4fŠC@ š\Ó( äŃšeěŃšměŃšmě×]}rQE†”´PQEŔ))h BQšZJ3FhŁ4fˇ©Ş ÔȨ…%T!¤Ą4Úb m)¤4”†”ÓM!¤4´ÓL4†–Đ!¦˛ëR˛ęQEÄQEQEQEQEQEQEQEQEQEQEQEQEQEŁYŐŁS#z=GRŠh§ ˇ˘š)h)´‚–‘BŠu4RŇ)Ą¦Ň@Ţ€)@¤Pb´*…_¬ę …QšÎŔQEQš3@Q@.(˘€ Z(¤+…jVeiVU ´f’ŠČsFi( Í¤Ą –’–€ ZJZpĄ¤Ą¤Yu§Y•µ.§6# QE©ĘQE”Qš`¤Í¤Í2nŁ4”P+…Q@eg޵k.µ§Ô¨‰źz3ďKEjP™˘ŠLÓ¤ ŇPIEŔ(Łb€ (Ĺ ´+?ˇZŇęDŠ)kS0Ą¤§ `–Š)€QEQEQEU:ąTéHčˇÔ) -!¨:”QEQ@Q@Q@Q@W«Şő2&BQKIH€˘ŚQŠ@QŠ1@bŚPEŁQE-5CSTLh(˘Š…Q@Q@Q@Q@ )i8R«őFŻTL¸…QPPQEQERŠLŃ@Ą¦N E– Zµ—Z”Ń2 (˘¨˘Š(Ą¤˘€4Rf– Fi)h͢Š3VjµY­©uQE¨ Fi( fŚŠm--”´´RQ@ E%µv¨Őę™ 4ÓKEI#M!§‘M"€Išv)¤Pš3Hi ;4f›Iš~hÍ34f€šäk«Írt´”Q@QHŠ( aEPEPbŚRŃ@ Š=ES!ˇ””â)©(ni .)¦‚’ŠJBi )¤4Ňi -!¦M!4¦Đ! ¬şÓ5™T„Š(¦ ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(­έS#z=EĄ‚”TťpĄ‚”R)Ą¤ś" p€S±HháH)E!qJ))E Wj•\¬ć Z))k2BŠ)hŁb” ApŁRŇQE 1F(˘+JłkFł©Đ™ EY´K@‚Š)E Z( Š( AEPY•§Y•­.§># QE!5©Ě‚i3Išd¶.i ¤¦+…QLAEPEPYu©YuĄ>ĄD)(&šŘ 4†šCNŔŠ( aES˘Š(˘Š(«őBŻŠŇźS9Š(‚ś+T@´QKT ˘Š(˘Š(˘Š(˘Š(Ş•jŞTłzD¤4¦’¤ęH1EP0˘Š(˘Š(˘Š(˘Š(* ž ©‘2Š $Q@Q@Q@Q@(¤˘€Ą¨…MQ!…QPEPEPEPEP)ÔÚQ@ÇUęŁW«9ü(ü(˘¤ ü(ü(˘€Š(ü(˘ŠZQMĄ¤…-0p4Ä:´ë2´ę‘2 (˘™!EPEPKIE.ii´´Ŕ\ŃIš)€µjŞŐśÖ´úZ)3FkPŠLŃšZ3Iš3@ Fi( f–™š\Ш¤Íҵr©UÚL™QRHQE†“ęLP¤5&)Ąh3HiäR@ ÍĄ"šE.k•®˘ąŚPQKE%´PQšZJ(˘Š@”´P1(Í-%¨ŞZЦCBRZ*F4ÓH§‘M M"¤4„S3M4ň)¤P!¦ŇšCLšCJi¦€ÖeišĚŞBaESQEQEQEQEQEQEQEQEQEQEQEQEQE=#iI4ă+@TibHůŘ`3VD>˙ĄD™ÓJ n0S€§˝˙Jp‹ßô©6H` SÄ^˙Ą8EďúPRC§ x‹ýŻŇ”Cţ×éH´ĘZCţ×éJ!˙kô¤4™Ą'“ţ×éJ ˙kô ¤™(©D˙Ą8[äŕţ®;2ąŠŔźĽřü3VŻű_Ąe9!2 Râ¬}“ýżŇ—ěźíţ•ź2_V>Ëţ×éGŮŰý(¸(©ţËţßéGŮŰý)]?ŮŰý(ű/űĄAb *˛˙·úQö_öżJ.‚ÄT˙f˙oôĄą<6 .€ŻŠŃ¦&š[–}ż…]ąţ?Ҳś‘+b—dZ·úRý“ýżŇłćD•±KбöOö˙J>ČżúRş^–§ű/űĄe˙oô˘č(©ţËţßéGŮŰý(ş *˛˙·úQö_ö˙J.€‚’¬}—ýżŇʞ¶?*.€ŻšÍ­I)ŔlźĄQ6¸ţ?Ň·¦rW’v±4ŇjsmţßéIö_ö˙JÖčćąi3Sý—ýżŇʞ˙·úSş?ŮŰý(ű/űĄ@AEOö_ö˙J>ËţßéEĐQSý—ýżŇʞ˙·úQtT˙e˙oôŁěżíţ”]\šĚ&µ&Aňެă?‹ô­©˘˘DM4šĂţ×éG‘ţ×é[Dh©|ŹöżJ<ŹöżJŠŠ—Č˙kôŁČ˙kô ¨©|ŹöżJ<ŹöżJŠŠ—Č˙kôŁČ˙kô ¨©|ŹöżJ<ŹöżJ СŠĚČŘ Ü⯠oöżJÚš3›!ĄĹXżíţ”}—ýżŇ¶3ą?ŮÚý(ű/ű_ĄAEOö_öżJ>Ëţ×é@QSý—ýŻŇʞ˙µúPT˙e˙kôŁěżí~”?ŮÚý(ű/ű_ĄW5LšŃx6©;ş{USoţ×éRÎŞ r˝7Ů˙Úý(ű?ű_Ą#ŞÄ4Tßg˙kôŁě˙í~”‚Ä4Tßg˙kôŁě˙í~”h©ľĎţ×éGŮ˙Úý( ŃS}źýŻŇŹł˙µúP!˘¦ű?ű_Ą'Ů˙Úý( ÔtÁ÷żJŻäµúT˛$CÖŠ—É˙kôŁÉ˙kô¤A/“ţ×éG“ţ×é@QRů?í~”y?í~”/“ţ×éG“ţ×é@QRů?í~”y?í~”/“ţ×éG“ţ×é@ŠšAţ×éR3ü_Ąg!˘:*_ł˙µúRýźýŻŇ˘ă!˘¦ű?ű_Ąg˙kô˘čh©ľĎţ×éGŮ˙Úý(ş*oł˙µúQööżJ.€†Š›ě˙í~”}źýŻŇ‹ !Ą/Ů˙Úý(ű?ű_Ą1W…W˙í~•u-÷€ÁúűVr.$tT˙e˙oôŁěżíţ•(‚Šźěżíţ”}—ýżŇ‹?ŮŰý(ű/űĄ *˛˙·úQö_ö˙J.T˙e˙oôŁěżíţ”\iA©~ËţßéJ-żŰý(¸XŚŇLZ˙·úVŚP‰!đ{ŚU&L‘cěźíţ”żd˙o˙Ş ­EYű'űříd˙o˙  ÔUꞷ˙ŽŃöOö˙ńÚ­EYű'űříd˙o˙  ÔUꞷ˙ŽŃöOö˙ńÚ­KV>Éţßţ;GŮ?Űý)Ü*Îi>ÉţßéS­¶ďăçéZÓb!Ícěźíţ”żc˙oô­€­EYűűĄc˙oô  ÔUź±˙·úQö?ö˙J­EYűűĄc˙oô  ô™«?c˙oôŁěźíţ”_4µ?Ů?Űý(ű'űĄAš»Q Oö˙J˛ă~ŇĄ“!”•cěźíţ”}“ýżŇ¤‚˝cěźíţ”}“ýżŇ€+ŃV>ÉţßéGŮ?Űý(˝cěźíţ”}“ýżŇ€+HEZű!ţ˙éGŮ?Űý(™Ň*ďŘ˙Űý) —űříQ"ąr+˛kLéXsč’F2’o®€2)*ÓZŕX‚=E'ŮŰý(µgěżí~”}—ýŻŇ€+QV~Ëţ×éGŮÚý(µgěżí~”}—ýŻŇ€+QV~Ëţ×éIö_ö˙J­F*×ŮŰý)>Éţßé@Ş,U߲˙µúS ™ş¥˘‘RŚUmŹâý) ·ű_ĄAEcA©Íżű_Ą!·˙kô EsHjsoţ×éH`˙kô  äRS?Úý)¦öżJ`@E4ŠśĂţ×éM0˙µúPr)¦¬Úý)¦öżJb 5™[ ˙éU$Ó Ł†ö}2DÉ„ďÝ<ˇF)ĹJ’GPG4”ُ˘€i 8ŇCE4ÓÍ4ŇÓM4ăM4iĆPićšh_Jc T¦šiX.Bi¦¤e¨Řb•†0ÓM8ÓM6ŇšCLCM4ÓŤ0ĐM0ÓÍ0Ó¦šiĆhĆPÝEDŃá?…Li†+ÔRTćTb#˘śWŇ›ŚPEPKIJ(E(¤ĄŠS…4RĐ1Âś)˘ś)‡ p¦Šp ´8SĹ0S…"ńOÁOE-ĐR- )G·5"Ăý㟥H^śT9r5ŚžĽTČOšAÖž*[ÇŠx¦ x¨)šč©1F*›!»ŤĹ§bŚRÜQŠu âŚS±íF(¸ŁěRâ€)ę)§RÄĹŧbŚTn)Éŕô’L±ńŐ˝T’F“ď=*Ł̧UD–KśqçUÉ$ĺą&—VĘ)lsJn[‰E-ÉŠZ()1N˘€#4Â*B)„UŁ9âŠZ1Tf%¸ĄĹ6€2x˝$’,KąÎóŞ3NÓqŃGAUą j>{­ŮXřĎ«QEn•ŠAES ŃA 5DjV¨Ú­ ŚŃJECŠZ((Ą˘€Śf–­ŰÁ°oaóŇŞ*ânÂA–2~ńý*\S±F+t¬dÝĆâ—¸ŁÄ( ¦O© ‹Š\RâŚU’&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.*)Űjíîió;"{“Řp)´¸ Š“ą++ "jB)¦HŚĹ&)آ‘¨ÜQŠuÜQŠuÜQŠuÜQŠuÜQŠu5¸Sô  ç’i¦śi¬ĚXÚ)qIŠD…bŚPEŁQF(ĹQŠ1@bŚPŠrőĐ)ŔRc&˘Đ})k‰E-†%´PQKE%´PQKE(©¦Šp¤Ć‡bźlp{ 6ŚTŚ»KŠŠÝ÷&ÓŐjjÉčXŁ´PbŚRŃ@ Š1KE&(ĄŁ T‹Mž4&:Š\QLBTĐMĺť­÷OéQQEÁŁC”b«[Í´„o»ŘúUĚU§s6¬3bźŠ1LbŚSńF(ĄĹ;b€ P)@Ą©1F)ŘŁ@7bťŠ1@ ĹHŻŮż:n(Ĺ4ÚŘ ±IŠb±SíR‚Č­Ł$Ä7bźŠ1T1KŠv(Ĺ ŕ)@ĄbťŠ1@ ŧbŚPqF)ŘŁŃr8©RLýďΙŠ1JÂh±Ž=¨Ĺ@¬PńůTęęŢÇŇ•‰h1HGüPE!ž qVśT(ąŃŠy^i6ĐqF)ŰhĹ3bź¶ŚP1IŠ~Ú1@Íoă(>‡żçYÓén™0ťăĐđk_b€9¦R¤†ÔI] ÖŃθ‘÷č:θҝ2a;ǡë@ÔŇ*FR¬Uu`ÓH¤1„SM8ŠCHM4ň)¦€i†žE4Đ 4ÓŤ4Ó†ÔóL4Ł"Ą4ĂJŔFi HE0ŻĄĆa§‘Ša¤ 4ÓŤ0ÓÓM4ăL4ŔCL4ăM4†šiM! ŇSHiJJZC@-%-(Ą‚”PP´´”˘Ç QH)E"áNŃÍH©ëĹ&P˘¤T'cëB€*ARŮIŽHŔëĎÖ¦ZŚT‚łzŤ˘’–‘HQOŃN2Đđ*ALńRĘCĹ8SEOŻjI9lD䣹;˛˘ĺŽ*¬— Ü/Ę?ZŚ–s–$“I޵Ś9'YËD&(Ĺ:’¬ÄLQŠv)(1F)ؤ ĹĄ˘€b–Ša©H¦TŚŮ(Ĺ;b¬¸¨gťaă«cţ4Ë‹ŔąXŽOB݇Ҩ“““’OzŇ4ď«C¤‘ĄmĚri´Q[X Ĺ˘Š1F(˘€ Ph˘€#jcT†ŁaV†2’ťŠ1T1´S±F(´Râ¬Ű[çăĐôâśť›°[ŰăăžÂ¬Ó±F+ˇ+#î6Šv(ĹP ĄĹ.)q@đ)§T‰bŃŠ\QT!1F)h ĹĄ˘€b–Šiă$ôQ»ëSÜ?DőäÔ™ŐB\Ěm§QRtXa¦‘O4ĂA¤FbŠv(Ĺ"ĆŃNĹ ŃNĹ ŃNĹ ŃNĹ Óeá>µ&*)» OaKbHiĆšj Ú)h¤!(Ą˘€ŠZ((Ą˘€ŠZ()h˘€ Z)E&©Ę v)±ô4üVܤ&(Ĺ.(Ĺ b—b€b—b€b—b€b—POĐ)ŕT±‹E-†*>Ç éÖŻFGCҨU›WČ({r*$şŽ$ŘŁěQŠ‚ĆâŚS±F(¸ŁěQŠn)qKŠ1@ < @)ŕSb–ŚSُ٫VÓôGü ŞŘŁÓ°šą§Š1PŰO»ąů»±Š´îfŐ†âŚS±F)€ÜQŠv(Ĺ ŕ)qKФqKŠv(ĹP ŧbŚPqF)ŘŁÜR©*xĄĹ˘ŕH¬ŘúS±Păš•<7çZĆwъñIŠ~ ­@)ŔP8 &(Ĺ?b†bŚSńF(ŁüQŠf(Ĺ?b€Š1N"ŚP’R:ň?Z”Ă äT dr + ˇî*Z—͆ŕúŇ0©"Ĺb9Ł!Ňb€F)űhŰ@âŚTŁ(Ĺ?b€#ŧâŚP1IŠ~("€+Ímë‰P6:ăń¬Ëť%ÓńýÓÁ­˘)„RË:b¬ ‘Ô‚)¦şYíăśbD އ¸ú˹ҝ2жńčx?ť 3 0ÔŽĄ«¬:‚0j3@ 4ĂO4ĂLi§ša a§ša a§ša ¦šZC@†µFŔ}*Bi†0ĹFjSL"•‡r3M4ň)†€i¦”ÓM!¦šq¦šJJZJbŇšC@zZNô˘€P( KH< C3O H)¦ă8§ `§Š‘ˇŕÓÁ¦ x©e"@iâŁZT–‡NŃJ()ńLő¤ĘD‚ž´ÁOZ–Z)â*Dś“RĘC…H “€ 5$vÄňçĂ­ZŤbł”Ň1v¤ňçĐU¤EA… AĹHc)6lpŕ)ç4ń"Jň´§ć†˛î4¦^`măĐőüúVË Ť…s.¬ŚUv#Ł5ŃOs.$PGcß󬻍1—ć…·ŹC×ó  ăL5#«+`Ać˘4ÓL4ăLji¦q¦CM4¦ÓŇi„ÓŤ0ĐM0ÓŤ0ĐM4ÓŤ0ĐH¦)ćšh¦›N4Ó@i)i() -! ”RRŠQNŃN†(§ h§ C)š)ÂÇ x¦ p¤R)â)⥔‡Š‘j!R –R)E4S…"ŕjAQŠ‘'šL´ř‚ˇĹCÜĆ[‰HiÔ†¤1IN˘€E:Šmę(´S¨ ŃN˘€E:ŠJZ1KHĄ‡•>Ƣ©aęEDöIŠ1KŠ1X&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺ&(Ĺ.(Ĺś)§RQKŠ1H˘—b€Š\QŠŇ‚O: O^†¤ĹPµ—Ę”gî·´qXIYšĹÝ Ĺ§bŚTܡ¸  v(ĹS€  pÄ&(Ĺ;P!¸Łę(¸Łę(¸Łę(¸Łę(ŃHиuëÜzÖ¬NłFOÇĄdT°LÖňn^AᇭTebešŘĄĹşĘĐä~+dd7bźŠLUÜQŠv(Ĺ7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv)q@ Ĺ.)@ĄĹ! Š|nSÝi1F)¦ÓşČ!†AÍŞęĹTŐ”păßŇş!QKA Š1OĹ­f(Ĺ?b€Š1OĹP1IŠ~) D,*6; Ť…@G4©ć“(ĹHE!)1Ź­HE4ŠzNGϸ© 2¤íUHˇYĺN)4K‰hŠi‰:· ňźŇžEAi¤T„SH ȦRc C"j‰ŞV¨Ú€!j‰ŞV¨š€"j…Şf¨Z€"j…ŞV¨š€"z…ŞV¨š€ ™A‡P~µBk29ŚçŘő­¨Ú€28`AŤ0Ö¬˛ 0U9lČć3źcÖŠ†iî ś0 űÓ 0ÓM8ÓM4ÓM)¤4ÓM4ăM4ÓHiM! ŇRŇJCKHhĄ”˘€S…4S© QNŃN†(§R ZC)â)ŕf‘BŠzŚž9ĄTő©T0Cc¸©÷ż*™Š`§­CarAO§Šˇâ¤ZŚT‹RĘ%Z‘MDµ*Ô2‘*Ô«P­J¦ˇ”‰WµJµÔŠjDĘjE¨”Ô‹PĆJ´ő¨ÔÔ‹PĘ$Zx¨Ĺ8ş˘ĺÔÔ°ą ¦Kp‘äö­T–ô·p=OZ­śśžI­#KąÍS–‘,Mróq÷WĐT4”µşIhŽIIÉÝ‹J)´´ZZJZpĄ¤Ą¤ŃE€¸áNŃN€QK@˘…˘E Š)Ö4,ä*ޤĐŐ˝D&Rúě>•^ďPi˛‘ecőîŐNş)Ńë"’±bKIä“IIKšč±aKIEšiÔÓL–%QL˘ŠZJZ( Š( Š( Š)UK0U’p Ti* ±éZ–öËn±ęiÖ¶˘Ý9Á‘‡&¦"»)SĺŐîa9ßDGŠ1OĹ&+bâŚS±F(¸ŁěQŠn(Ĺ;b€Š1NĹ âŚS±KŠhŕ)@Ą¨BbŚS±F)€ÜQŠv(8’pVş“d{GVţUG,®e±éÚŁĹfÝĎZ…?g uŠ\QŠFÂQKŠ1@ E.)q@ ¦‘O"“ ˘ťŠ1ACh§bŚPh§bŚPh§bŚPiiqGNhśĽĘß\SiO$źzJČÁ‰IŠv))7bťŠ1@ ŧbŚPqF)ŘŁÜQŠv(Ĺ7bťŠ1@ ŧbŚPb—b—€J|_ë7Ł‚ˇ¤ŐĐ1F)آąKŠ1N˘ ŧQ@ ŧQ@ ĹéÔP1§@ĄĹb—b Š1KŠ1@ Š1KŠ1@ ŠŇ´—Í„~eŕ˙JÎĹIo/“0oáčjd®Š‹ł51F)ßĘŚW9¨ÜQŠv(Ĺ á@ŕ)€ĄĹ.( BbŚRŃ@ Š1KE&(Ĺ-Ł´PbŚRŃ@ZÜwőC÷…kˇWPĘAR2 aâ¬ŮÝwÚÜĆO#Ň´Ś­ąŤő5qF)ă9E­L†bŚSńF)€ĚQŠ~(Ĺ3bźŠ1@ ŧâŚP1F)řŁÜRâ—¸¤b“üRb Ĺ äpiŘŁ4r†á¸>µ.*¦*XĄ+ňľHőô­áW¤‚ÄŘŁń‚2E® Ĺ&)äRb€Š1OĹ!€ŠŤ…LE0Š`BV›Š”Šn)„T¤ĹFE!ň) FE!ň)¤P!„S’fAŽŁĐŇM=čŇȲ”ţTóqŠ‘.1ĂţbĄ˘IH¨ÚźFAȦ5I$mޢj‘Ş&¤2&¨XÔÍP˝Dơj•»Ô-@5DŐ+Ô,hT-RµDÔTMRµDÔŔa¦q¦šŽTW`ŞRÚ‘ĘűşŐPk§}醴CđĂ5VK|r‡đ4XŇsĹ4ĐM4ÓŤ4ĐM!Ą¤4ÓHiM! ¤4´†€ QE˘ťE†(§ (¤1Âśh˘“"§­JĽQECâž(˘ĄŤńE cĹÔ¸˘Šĺ{–ŁQHbŠ(ŢŠ1F(˘€” (¤1h˘Š(˘Š(˘Š(˘ŠŃ°—|F6<§OĄZĹW<Ő¤k‚ŚQEIBâ” ( BŃEQEQEQEQEQŠ( ĹQL ¶7žIČO–zîÖ¶?(­ Ě¦µ QŠ(« 1F(˘€ QŠ( bŠ(ŢŠ1KŠ(¤ ŁQ@(ĹPŠ1EčÜĆxäzU¤eq•üEVôfďa0"ŚQEtLPEP¦0˘ŠaŇ(˘€ŠiQH‘HEP 4Š( ši˘Š0Ó Pd9Sřv©Vu~ůŃE&„ĐÖ5š(¬ĚČÔ/EŔ…ŤDĆŠ(¨šŠ(¨›˝PMQµPfh˘€ŐQEFŐQEDĘ‚3P=1=+7U9V<[/@$-@>0B&3D)6J+8K,=\ ?`.BA)E[,H^0ED2HF4LJ7PN8QN8RP,Lc.Oh/Qj.Rl0Qj0Rl0Tm1Uq4Vr3Xs3Xt4Yu6\z8_6`~8`~}6}:@_@aBiBd Bj!Dj!Fk$Em"Fm$Hn$Fp"Fq$Hq"Hq$Jt#Ju$Lw#Lu&My&Nz(P~&P}(mcskwpzr~u 7a‚9c„:eŠĄcâăŘb‘7áó!#c®öó?}íü?Uţőb¶Ę}Ů9cHćSp’§^ëü7ÁKËrT–-ó¸śPhOE¨éě|˝Kćő®—r1'w™Ç Ă#ŕJt9'b¬ Á`pKžĘňĽŤ±ɰ޶†‚“Ă}}ý2v’MŞ„a#©Ż ˛ŞŻÖŽţţW6‘LĆXI¨g/uÁľ  %›)É8÷̵kÖŔ"ˇK @2 rv3 HŮ#áf/ł Ŕ˘ť4 a®@7dřáĐ%@’†±"ZŁ “¨Ľ;týoJJZaaa¬°U …CL Ľ‹ÉÝ%[ J¦`2ś&QŃBď`¬ŔŐnŚ(-#$ŢoZQa&sđ’ˇ÷®^“ëÚŐ‹ŰĘJ§Ŕŕ(xÓ6±Ő¶8IÓ;)×ŐkËJńđ-J·–MńŞŔp±Ô <`á%ď]ŁčÁc— $^o:&‹hGMš›G")źŠ±"ł1VD 5cý_:™˝qĂFLF6Zsëd-†‡{¶•mSŮn'QŤÖdň~õ]- ż:Še#î)+7Čvl·9'ěĐE`ŹĂdĂEĐł]í¤¬ÜF’ÎFGćş>],Ô8~s-·ëäö‡!ôažŤ°G<'ę‰7†KĎ™ů^V^>ŐŹą~o:“(HťŕY0 |OüJ±á˘ŕ%ä)î)//ß®/p&đV›áÂXîÄż`wâq„đÜčďô7ŢośíX&‘ 6Y'¬•©7'ĹNŇŚ_÷¦ć†Ď7;  şüş_Ůâ·‘ŕg É—:a Á«ţ›sr4t,t}ăŹ4 a®Čű˙Ö~˝ Ćíň÷]Çú=9vd~ŁŕG‹„úžŘţí:|8Ĺ82‘RÁb#a UO:ĆŠ?żxô<ěçW)”¤Ééâď;"\H@+*K˶HUZ W+ËĂ®V(¬‹;č„”tłLőj \Ř…đęn/µDş1U®»đđ-@3cE¬NG ٲu*щqI¤PČI “·1ŘâmlÁd‹’’­~˛¸L-(ÄËl„] Ł•ˇ·đ [d‹Í9a†Â‚"mľ·—0W„–”¨ß¸âö­ފяůĘKávŁ ` n‚HüěvDšqŰÜźŕ #ĐŘÇ$WÎbŞu”â…;--ŘhÖóýôŤ)!ťŘHŕ†QŻ`đůKx3*poĄ2$8R:lË|ťC—CĄCÍôŰÝbűáŔ@±ëu˛D‚ä2 Ľ‚©“Çáü€Up#?s=HŘ|„>'’Ë ÁI`'n®`ČŇ0VDc“*¸ö’ăő2KřőF"sP¬5›N  †/÷ö)˘•Ml¸Řá Õ➉ł)"Â|WoźJďËĹ›řŠ7Ca'z'+bIęőI5ľ V˝lľ rY¶ľÂ[l¦˘®§ č„eGĘX™;†Í|WMM}íÓµúJKţsuІń>"I]mM]­ľě$--+AOtÎ\s›ЉÉÓ]á.XÄęÉʕőŚm›éÁü‡TŘpEč ‡{ĺę ·¬,¶¬¶˝‚ę$™I(x Nś‹€„Ä3†M6cĽ챑¨1‹ž«ďjY±y0`t'·äß %ŁŐÖÖ>cÔ3ç.`.Ç…®–Ľĺ2+aEIWĐH´_üęŔąó]ÇU ŰŁ>u`LĘ_¨>wX H.`0Oçq|ĚŔu¸’““’'}™h?‹pŕ?d+ÇsŤĂçČËÍ]îq%9“\|±Ç“,\‹X˘äÍóo*ś˙CNN.'Ë7 °y„`w{G&[tüă÷*áIr»ÜN®\I0\7c¬¶Ű˘­ă”BÇ©ď§Čů°S!Ž=8›%Ł=nňÄî¶7ţ˘đĆ©jŚ•đ¸0ÚÂĺr~’9đÁź…öD„Ýmí,PťŤ±"Ä#@'t2?JĆęd×wžm?ůŞÂÉęěĄř”ÔbiöýŁY&Ľ€sÂ<…ŚŚyÚλžm§¨Îş—`©[®x§Ë1a>Śĺ™§í0ŮąëĐ|>Îóę~Rň7Fs°Źą"–dÇ7µ¶·Ęś9±[ó|9+‹”8>P˛ăPë…ÖÖýKHFăCežÄ¸›îšs— ßÉŻQ|-c-2ˇFă3x‘ńř¨_„ďÄF˛8s±ěXBýĎ‚xÜIŔKöýs€D ¶Ä9F1 >‡öĹľ' „‚D;F}üł(yňĆŠ$8đxD0$w’Żd`OFsDÇDôŽĎđ’b¬ČjŞ“t2 G)ë"ďTŠ“‚±"Úc•f‘’˝űVű¦Éř¦|Îč¨hěÁŔ;cE´ĘJł“o’ŞŐľ[e|Ó|ľ„بQxřbŁĆΠĐ‹AEĹ^BŁĺ‹‹U±• ¨ř抬Â!‡G/r#ĆŠüĎ’b1—#6věôP3fL×*L*+öTU}WIRĄb{nŔ`‘1YÄę䞊=+˛*•Ŕ—:"É={H )IĄ%šŤä‹@B±*őS+ |~AAK¦O˙/ÔGż’XWVIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Stripes/styles.less000066400000000000000000000033141361462701300247160ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #010101; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #fff; @loading-text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); // LOGIN @login-color: #333; @login-background-color: #eee; @login-rgba-background-color: rgba(255,255,255,0.5); @login-border: none; @login-border-radius: 7px; @powered-color: #ddd; @languages-color: #ddd; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #010101; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #fff; @folders-disabled-color: #999; @folders-selected-color: #fff; @folders-selected-background-color: #7F7F7F; @folders-selected-rgba-background-color: rgba(255,255,255,0.3); @folders-focused-color: #fff; @folders-focused-background-color: #7F7F7F; @folders-focused-rgba-background-color: rgba(255,255,255,0.5); @folders-hover-color: #fff; @folders-hover-background-color: #7F7F7F; @folders-hover-rgba-background-color: rgba(255,255,255,0.3); @folders-drop-color: #fff; @folders-drop-background-color: #7F7F7F; @folders-drop-rgba-background-color: rgba(255,255,255,0.3); // SETTINGS @settings-menu-color: #fff; @settings-menu-disabled-color: #999; @settings-menu-selected-color: #fff; @settings-menu-selected-background-color: #7F7F7F; @settings-menu-selected-rgba-background-color: rgba(255,255,255,0.3); @settings-menu-hover-color: #fff; @settings-menu-hover-background-color: #7F7F7F; @settings-menu-hover-rgba-background-color: rgba(255,255,255,0.3); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf;rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Wood/000077500000000000000000000000001361462701300217615ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Wood/images/000077500000000000000000000000001361462701300232265ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Wood/images/background.jpg000066400000000000000000001146371361462701300260630ustar00rootroot00000000000000˙Ř˙áExifII*˙ěDucky<˙á+http://ns.adobe.com/xap/1.0/ ˙îAdobedŔ˙Ű„       ˙Ŕz–˙ÄŚ!1AQ"aq‘2ˇ±BÁR#Ńá3đńb‚$’C4rŇ%1!AQa2q"B‘˙Ú ?ű< HÄ–weňĽíîW`$ÁřŘ'Î…3 E¨šŁ¤ÄnĎR•;$ŚA–UV¦%Ë#©+;âă! ŔF/»ňv°J_|?‡Ěô¶Şę`;~žç ż˘\˙aÖ–¸ÜâëTAśßÁ*#-ĄËřYđd¤řŚY¶ţĄ.´se–,Tš\ŕČÁ¨k¸}”ŐŔ‰ËçśH jňF}ŔJ†öBąaěž ĆBGI3ňFÂ~ęqůGߍŁ,ű«ćx ]Tč ł‡^CĆ[_“«ŕş[Űe(›Ĺľ«NQTd“Ô+ÓgćŞÄĂ`vĆrâÔW^FürVű®n[Ő[Ë‚­K‰†YŔÍ™ž–˘ÎEÓűG8Ék^7jťUq¤őµx€˘€ş×ť"íŇA‰˘6ÓTH°@#(Sňýô¨Ĺî×JC8í1ÝwŐ]ŇJŹĺĹŕ[©‡Oś·F5c'nJíKi¶´ €b2bÖSÉŇ‹9 Qsűt޸.”á ĆqknvWĘhňuBgÉ?ÉDäĘAţ‹9•·!’‘ÎĘčyXMH˛» ·”żÜÁúťßMçgt´~"%˘ÇšŐ›dĚč‘–Ú#O4ěÁńő\%Ö„O-"4ż‚…§îLŁ–R54DşŮňɇžŰ”®Ăe4K}PfcÜĹĂÄńâśIeŁŹŞ€Tµ=?©űőÁË»5ĹňéÂ[^r,*%m°ś°wj®>—_bFOYE«ÁÖ’3§Fd˙É^Hݦq#Ců*š'“‚Ccţ:+›ť6¦ă±§O$áRb"%2Oą«ä§Ăޱ3-9ž"©Â^ĺę®i5“ cyXëĆ©üP?—ĚŇ2đ:ů &2ĚGíjy…÷ řÚ;XpA(™,ÚĄI%ĽĎšŹ“Q®µHD‘źwŹ8JQĚG»ńŹńJŮ…rNÚ‹şŚ:¨mUňšĐA&Ú¦ ‰0;‰÷iäś$yzrJR,(ç’Îíh¦Ęeç_Ež=\ÓŐq#(Šígđu»"ă(؇‡ş‘Vag‹ř­bkĆ„XK·¸®xÚ€ZŽĎÉ:NÄš1»z(çgtÔÇâ‹UßîŽ(¦ d‰»=<ÂżĄt§ařĄGśsUŹôygŠDVÝVŐ;ě)ây@ 3évY­Đ ÜD5ťĎ "n ¦÷Ă H»x:« Qŕ$g‰ŻŮ>vWJŔďv«D‹9•4‹~©ś4 ŃÍŇňĘ#a¸kkĹ+ĄM°ÄJé™_ĺ™ÍŃGK…ťŃ›’í±éť(˙#›˙eIřŘEߪ^†B$FEÜSháĹ<ÝÉ/ŠťGu<–}ü_!b!´ Ľ ÔüíwfoÇnŃćúUča÷dŁ’ŰżE¬gN0ÝeDla(’řqVYxŘ0bvýW4mOŔ&Čm•ŐÚßDÂsLąA˙µ˝]Ő|‚sZq@;¤Ćš*H"HŐ#2DĐ:˘$ą6Źę™Š@Ă#RŐQňŞ–%Ô\0ĐńHđen˘ś'D>@.5ôOʆÆĽU`ŞIĚË&BEiNYý«yůb9ö±ŤÖ=}\{bL…<EbĘ‚+ÁđĚÂwÎ%Ú5NzUćÂ!÷5O·ÁdŇ¸Ž±8#čf1üŃ$6×ú…ěţÚ™|a®,QÍ(€‘ÉíéÔż‚¸Udä%ş ĄÖŔe”r–‰m§î¦Ş&žđ_ÝŔYgr¨dpâŞA"Ç‚˘Žíš]ÇW´_Ń.v.–Y…žËTdUą¤cĄ?ęŤfŚI6â—J€5c•!7p@Í )"ĎIX©¦FIGXµ|ÂAŰ[[” Ž>I€żA0@OÜ’ń”mWYöľCmRmܬ§ÎÍĦ5,çŐiÁt»ţIVjňZMł§@X:r6$uh®%ăa$cAüy®iś7¦ăĆ LcER`­+Ű$·GhĄ]ôS6uXÄm,V$eŽhÖĽjśżüff–Üd4ó)ô™¶Ĺ¶P3h€"4oŮfË_kžJ7jŁ~Bb'Ž›ťĄĺŕQźŔÂíŘţŃ.vZM$}ˇőştr.ÇńĐŞ'jú V6‘đ%vŽ˘oŁ(ĘŤ€ë­Óçd(±7·$ŕDj#It“…PÇvéNR¤YâÜ|VK¤F?ű0Ă;I÷Ź âĘ/öÂľeč^ęx­™°‚ńćáĎĆ@ë>Řţ´UĘkĚ‹€^‘ŃdÖ˛F ăřë¶?Ý+řXwm ˛€}Ěőł©ç“´®Ţ˘ KóSĎĂŞŚE¤)Ákbe[8Ä®Ł‚ŇłäŃâÉS‰rîAâ}ĹÖv\ Ť„GĘXű[›„Ič·Ă'"Z1,×*îŠ7ł#vQŔmÚ=]JI;ĉ˙ůŹÝi”ł!”C‹ťČ‚h9A­]d¶Dn*"Nä˙6Cű™ÇQŇć‹ŘP ăÍM6±s_č ‰jńAP—”\kg;c¸¨ďȨÝĆŤ}T™ť©Î74ýVś}OJpą%q5D759*‰¦<ÔĽ|dEŕ=˙”>·\óđÚźŚBĂK' ’HŰČtч?äâś¸Ł ‘Ü Őß<)G#“cžŁČ'tS3Ç!/ş«|/˘¨nâŹÚ5@ GůćôfE?jłăxő §…Ň@1q­ÖźP EďJ‰LéÄ08WaG¸5cĹ: HÝú)ČĄ;ĚĹ©ĹMÚ„ä #Ü88˘~Ú_ÝL2R”b jÚ*,<ăČ’TµňXᣠoůÖĎőŠWűŤm”†Ş´¬ŘwoŤ%aä€0AÇ“RýQ.ĂĎŤwé“?%u»éą© tdaŘL·‚oÁO'Ií÷á{őQO9đďÓŘDtŰE¦’ô»˘ÇÊצpĽ±‹NŹjđJśI:™9qJ,˛¸Ř’r— ŔňDŮ{™˙ĐWIť‡ů3_oŘŁŹŁĄ˛”ž\V™FÄťBm ’)äŢš=ŃN8†f÷%`IÝśŮĺľÁGkăEd2Śç&yQ«u?N ą.Ô ŚKŠűŤŻ’gÜw;*ë(—(/·Qz,úTtäb g4˘›iČŢÚB2™Ě›§ËĹW«Çż|Äü6~«OYꏖ›¬|•™&Úy*´¤y¬NLÂŔíńŃc~´ü7·Ą6Ä3tr)&f92Ę{vňSźU…ů·|ŇRŤčµéŕ˘ęĐ^a)@i꣥GMÜ6ş'JEJ¸L&2Üe«ný^Ué¤OoIcˇLŹĹ¶=¸Ł }UËânËĆA‘"śˇť“F˘» 1‹ĘDŇŚŹäH´Í×č¤ĘÇ1)l;o­ÔĘtÍÓqţ“Ł)ś€DqçDJ)3•‹p7U Ä8D Ňsż%”iJˇß‰“¸KKZ,¦˙c˙•Ň=@{--CrĘ"Q#ÚÂtFĆ_Á&;¤[ŞĎ^ ó|+·ťAÁc††nę­´UźH]¸Ú MRć —µ”e†>ŇőăU—71]-„L»‚Ţś–óhř»1p§UĽŰ¶ä‰¦ćú)ę)%áWYamÄ:‹ŕź0QĺqWŠşŢĚmÉÇ]»Ź"Čŕt®ŽŔ3Ü«C2{ (>çŠ>e3ş1&…Ň´äq‡\yşNň1Ţ\P3ŹE«#Ť X]I‹lrJ$ЇdöM„ăU[a»ń>h H€âÂA‚jj¦C¦HA±TLÁ48@ â‚Ţ) Ŕ~‰|18ěö çČŤ˛Ľ‘ŚămĚ •AP@‘ Í‚Ĺe¸=ŕ‰´}ĂÎ4Qźö?‹¦ ‰­Ş '7ÉV­č—WÓŔÜ 2ńfŐM=yřä'{겚iDOX]‘ź@űy˙$_WdsJÄ˝¬wbČ:kN~ >gĺv­Á!ţç_e¬ľłëJłĽ…hߪӭ"qls"‘,ţ©Yq34FśVČČŚŇ‚,çĚ%/ ÉHŔmÚúÜx§ĎđUtt+D“]¬?sţ‰ZácQ¨¶¨řl1, U ÇA^źî€‹ą=ÄăąÍž >Ż«çEľÉN&¬ßT´bĘČŁTş`9K(ę­#{‚?Üä‹T¶ŃÉWwŇšKśőDŠî˛îú¸@’vXłE,dd}Łnť\ÓőUĹŮt˘!ĺ )gńV“Řlđ?˘Ż‰;$€’Ż¤Ç™ 7ä6íXVĂ«˘dIi %»)đÖea’_¶”䮢hР߲˛vF0¬h5tučŽ`A 4ߪŽ7Ą}¶8˙¸±ĂŤÜĎQÖ–ć'h"ľ N´NfśŮ¬˙e=~UJM Đ ¬˛¦łć‘#¨5|ÂGĂfűUu1ť¨/śžźŐý,ÇÔT‹sÔRň3żXţ´E8(ăsAĂš> â7J㋦L;w˝R¦Źş®lŤáŐČ(é|č©ĹĄ&÷RpE٢^BčąŔ0FWĽSÁą-ÝĚ qƉőý‹ť%îw°ýÜę˛ď?Ďň#(L™î)7 ›ÔmÉ>E>¤tżEQ4řqĹÍžśŐÍ$ŕĚK+'•1!<ł'¦;içEĎמµ†€ÇĘáRCŚ<Ë4°tăşyĺ3&€f ŕ«tľ(Ć\3:©SA’R–޶őEĐ›[a´‡tňKw¶,ă…39ôëbÎK3ja$J"7.čf–Ü  ‚îx0UoĄ OS@•^LďŞF—‘†Ň_‚ÎURŔ˙‘ÜôÔâ—ýĹ’$ÁŐ ®äHf„ăí‹ýB:ŮóŁ`D{bÎžŞąŃ]Ľč™Hn1c¬^ÜÖ;h3˝×EW$,QlˇŢ_ąÇ )¤ăŚLŠGÚxşŽdĘ­YÚŔC¸„lK·… ×™ę:ľ*îčCpipŻ©”sŕ2ČHŽ™ńfKŁ‘&P ZVŕ±ëŐĆă®i‘bĚy*ćzWM–V;AęâžF ě€Ę@gÚçÉŐq Ą{c!´Šhd‹¤BtFDR”1n°4‘z&NÜv€ÍÄ$w‘?4Ȭ‹? Y÷2Ó’Ěb'2?&ÝÉ#‚É»x Ę(†HKäéőä«ęf›ÜźćË!VÚúhŽŻ´s¤™8ÍMkÇU—…ĎČÍDČaźĹ L‡äĘ®>¦©ŤIcMB˛9“Źßu81NUˇ˘Ń,Çů2ęziÉafÚŚ>í˛ęoi˛ˇ'‘ŃT*!»qű \¸}»­«2´» ?/§ŞWBmŔĄ ‘˘Ćbµ „8XM­¸y¬˘éĐ˝UB§äŹKÇŠşÖ"7dŔH ‚ô$÷LĹr3ĽĽ”MŞŃăb„B­r$7Ń“ Č@ËŃéÉl晎 B4úĄ?§ąS•`‰ůž?ńQ˙J˙•Ő!…ő[3bLé^*môŕ±íL˛kúř*ćůé]ĽěĺŠa—řÍÝŤV\ç .ü…UńťąbHv˛Sd“”;¨î¤ íđĄV|íwOB—É{_ió i¶uNRĐ€âęî“ $Î"Ĺ›’śdŇ~“äVKi)UT*̆?K }S˘lÎŃĆL‚EźoĐůú]+–Đâ«DWLm‡GO×î–1< <@Ţ·"uC+Ĺ UÍŤÂĎîČů2 ŰôYwşÓ’cĽ-Ŕ7S3ňJćX^ĽD:"OS¸ń˛q,îfa&oěršgq}4Y®L Xą DáNGöµ|Ős6WGbŚbd]Ég?Üě—ŐM6ŮT°=*HxC˝‘jQ˙ř¨¶ëŐo•ě@:µfYz6·đHǶ{`¨ŞąµtVQĄiÝňF,ó­x'wü‘Ü䌅]úąpNMłűŤ¤uńŻ”Çţ•›…ř>IH:µ[s=GGĺ"PxšUő¤ŔN=d©»9QîŹĹţ¸¬rż˘ĆЉÇËÚ85J©ŕ¦ĚôŹŞşŢÖ/ź3žíaćăčęř©Ý˘ęĐé‰ Ş(Ž'˘-âčřPýÁC‹4@ ňH<ţâp92HÓÚţYôŇBLbLˇN«˛šfH€CŐ:ĺă.“ú–w@śĂP-áDw±Î’ĚŽK%ŠvŤŃ—`ĘCkŠkdů™+&/vŕV¨3ä`Ń‹Č~oú'/…ađ$ Ë÷7Ń\J#ňä=-áE–}iŹCč"ăł2g(ÇÓ22 Ľ¨N”¬Pć0‘íÔ´ÎÉ —aÍBlQ¤kt‘&˛väś±g=cFXóőĄ3ŚČ7{'=MX$ŕεĘ(äWŠ'#ÓÍ‚Täk1”¸˛dN3/”:u<(˘mWMĆŽŃG¸D‚™“5‚|Ü•Wů1“Iű"ČĚł%ÔđsűµR¤ŮDl±f/čłłŐM=76˝–ń‘SNy)PÎ1.ÔÇ72«םŽR”Lĺ+Ř5–YiFe-ŕú”ňG@uľ¦éÄÔńŽü‘ÉŰYnĹ˝ "Ć5:ŃË:,äK4?Őh¦Ă“ß".[č•ŮÄą@c/ÇÉgT,r‘É8‘@ŐăDsEčí6U’wc˛Ęşięźcµ ŐiY?i.ĎÍ6"#Ö`-ęŚx*ŽŞTĹ$S$=ÁţBÁĹŃgÖÚB#Ž?$Č˝>Ę1éä{eş0vwŰŻŠx%ľ@ĺ€ţŠěAÎKĐ[Đ)ý“ŃÍń± ÄÉfÓ'óÚ¤··÷KgHätuÉ…ZNĂí4\•: VšÉ#Áľˇe†źeREOí·Ő€cND ·W :"FnEccćŞ6”qLF‚ŤęŞKŹo­é”Hý·iě:cԛŊ1yx žnAÜ<ś,ąkŃŘź¦¬C¸âź)« A-]V¨Ťe´łłřĄ %÷· $'buOŕ„á29d ‹1䣛éÝ ’KłŮ8(á[ÜXůŞ…IÍ9 Ř€¨ę )ęáR 3ÚADˇ6ŮŔíÔ)Ĺ2' sg÷GnţbŠ-őXńę1pO¸-™2ňTŐ GřČ{éÍT‰ËÍŮE#=|–6x×&m;€ú+Ǥ|)0‰´Ý%ÄĂ6ńM×—eśŢWtôp‹Üł®Ď ˝Qü˙E]!w‘ý˘ÇŠ“O”"MËŐe|\iÜfZ§Š˘lŁ˘N4˘t˛îÉĆyÄ{}OÖ–‰µÇđZD3%ȡś%Dq”6ÜLc]¤=ni,šj€¸f—‹?˘Ď­´š.Q‰ŚŞ)¸[ÉM1LÄÉÚÚÝÁ(íČ=Ć6«˝y*çeÖ‰ď2v÷RöKö ČÉ»^Ë;Łv“ůSJYV ŘD˰sĹ•6,r˙ݧ˘ŻĄt<=xHŰVŞ®=…v~8F#höčČVŁÉ9LđÚ±ú±/Ń7 é“2™ý©`ÎÇţjäM2D W`oęťŃ}töF<]‡NɀȂÄiŞÄ\¦Ąžo)n›Žş,ą»kŃřĂJ—6J¤ő5P2"´:…˘p׆m2ڵ/N,‘–I?%lÍÍ+LžýŇ2–éz7¸>Śk˘ŕdŐ  ˇRł?Él]OGÖŠFI‘3–ŚŠił’{‰Ę5vۦ‹.¶®tő€™+y†X “ĽpÔ)QЦ)á÷W^t"~/}V8ńĄŘö—4 ±€ö™=/dD§ÄLĄ«»¬óęëĐÂX,·ĺťou# Q&¤żO>(îů ’Ą ’#ńŁ)±Y&dÄş%ëe tä•X–Úy'Ěô®›”FQŘh5—ÖČľ”ń˝´ŰşĆ%rüč«›čłĹŔIh†HP耴D×ö„®Ž ŘH:¦2ó»˙ěe;ŹK›h±ëu¤ŃS€2ČMDö׋$gÂQŰ74‹ruY#qÇ Í˝*ŢNOSq‚űŮF& v»ÖüýżĚJHă˘ÉG—wŤHUI ěö˙®)óü M$J`\ú*Hń1n€ Óš®tWgă/÷6VU3 ňĄ ?%—ŐĆ1 tňá)E2»ŞĘˇS? ŹŻŞ«˘úéű6żO(ˇµ,*4@n6âôD$¸ΫZôv6+‰ŞäH·Ş `űhTÁC"7™ŹvĄ^h“†dÜ3z¨ęx©°öűţBÝ07ŐčŽJŚx &FÁťÂ¨)Y€–LOaąŇęg &#qęS4’d%ßDS‰»»&C »}–]mRxő$ŕź6u˝dI}ěm˘źŞ0ĆÍN<ŐKá Ť`˘Ë?‹˘1—OŃÁ!é”_Ćč‘4ś3iÇB]LÚě]‚Ák#:ÜÄěBSčˇr!Ŕv&Á”©1Í Â îoĘßEžb°Á8GąÉ"iÓNHć{GĂrČD/⮦˛ÍťĚe4dě€)s}>§‹ˇ”˙pZĺ6r‰buş)GB˘%.Ş˝ŞľÔq‹Â.+WYŮâŰ´¸ Ôž #Ś\ő`Č„ž&?4E„ťÍŮ‚Ďęţ=%ˇzů­ąg]”bŽ1´ĐąâźXÁM‚1‰ŁW‚PęRŰYť–MŠiĽzdŐ~.&ą‡ćŚCp.ËK0™CŮîbôgŻ"—>´ľ0‡OMť«Ĺm°Ĺɧ•R “m vŃŁŽ,{˘Hł±Ş1kľ8Ľd`ňóű¬p=ĆIJ•äłëkç@8 '*´K7‚źüĂÉđů@-* +ĘL†čä‰1r_q{R‰ÉéRűÓÓŤęCąóe?˛i\$$3F˙kţ«,©D@ŘÂĹT…Y¤MG·őO›ŕčđĂ'‡öU6źŤí±ţę‘í>ją.”Äj*Ú«©M"Ů&5§ŮgvżŽ.€dDdţ7O`qĄZuRÁŚ[Ť‚Ż0NŚż9ň<Ń4Vz^Ţ“­ÔáB›ĚÄ<Â/¤‹  ő…—+¦ŐŔ6•ą+%ÓąZÖpł$ydŢ3©y%D*@d`ÂŚTő1őť¸ę/H”r:­$ź·AG` bś ĺ䌣yżĐ#­ś®v»ę”ćDÄ„ĂŔ¶·ôQµh‰mŚç¤[ëUxTzrL9­÷ă8I•¨Q“4Křd­^jćŠí wíf¨Yű…Ä8ĄUž‘‘„bĐÜJBÔŘćOqgÝáJ,ĺ˙eăǡŠăZU‡ ­ąÓ+ł2Kv1-5őUo™)˛Ř\_ŠiěŤ)V ?‹ú=°s»¨ ,®sĽqJD¸ ÜĘ:rHf†ÚJ­®‰Mřvxô«¸"ÜÖĚśjM-b€c‰°«Ĺ*ŕ‚lwkT AÜ˙ždř9äŁ˝Żť'ß.!ťMQŃ.Źč©*;xťň–•ńĽ¦ą¬@&“ÓÉOTůyŁŔGhą/E„ćg sTČH0Śşx5Őˇ¦QÜ#fTąĺMGă;bíŇUËTî’©)%źë&~K;6¸Đuw‹\űnx:şw9°ŐQ¶0.ßŐ9<+¶b$á‰Ô=yŁťAv ›y)ž¦çŹűŞş$¨hGX·7XňÓĄi:•I[2M@¨[Vp DxŰšTňĚ ś–v·…»9˘¤[â* 9ć˘ßë»S-ŇŹ•ŕtíŹ"Ćźd°2tH©°ňWJ‘Ý›oĄ»WÇcbűB\ŠŠÎ=EΦĘ'«ĄĘU‘6˘ŽŽ=7xřĐČ‚ü–v¨Éń’ô7Ő`‘€Đ%Ř›ÄX‹ďx'ô‡‚hjnQś%ó@‹Wě˘mWK°ŽČ^´Zóâ(ŚżŚ;ýÓĎ…ô_y~A.¶p‰ÔłTx¬ę ńŔF3Ѩ«™Ź Đ÷G¶™~ Ő拡6›a˙qŹm"7n7ŇŠdőYńęFf@n N‹lłé\"[˘ X:¤,öÔ"ś«P™ Ě’L+GôY]´„Ëß“mmN iĹ"XŚśJŇf±ŕ¨”öĆ’ĺÍiĘ:w»dD=Őo§şĐĺC´ÝŔüZë.«H7ʦ©1ů$hY‹ŢŠńękśnşŤ©ĂÍ?ňn–Ů“Ý/Ăx…Q5C“ŇŰOÝYČÇň-EťľŞ0¸ Őú˘“ď;ËËR‘Ž;#0#@U}#Č?eio„h-ę”ŃÝ“řčŁáŽDĚF14«B!Ä@ĆhňőYJ»µ89#âă’©´Ý+2&¦ľ+\ˇÍ u7ä€\ÄľBIp˘›ł€Ě˙ „NÓORëG6^~y5]śp˘\ěúĐńHśĄa±ć¨Š06oč¦˙cšv1-áµú%I‰ţŐđć¦iWdJťĆHÓO˛‹µM=8 D˝Věé2ݱȨ°QtŁ śDę«â~¤ĹíXYgĚ]Ü<gҤ"@i@úL ~QŢď 0Q'¸?‹°Iŕ’ ^nb,pŹń=¦ÜŠÖL“˘TB2‚X^ĺEŠŤ˛}¬ă§>rc!ĹťB˘ËzrSő_–Đíř~Őľ3%"H«[D„e%5Ź@´@hëŕ€ĐZ&H»§Ü^zůź[iΉ1©*py?l늤Ő=± 2te|Tô_vbcµŘ óe=čřK™Śäô!–}OU8†"1yp{Ą”íĐ–B"lßev§ 16DÜqtť ŐHVťxĚpoôüIU;ŢĹ™gT Ć8ń±-Ż4Yá´ĆUŃظ‘Ł3}U¤ŢťŇ.C8ધ Ć"4·Ş“¤nŚ€"ăÜłĘĚŤ(Cťs1(q>ć‘®«)¶•Onßî79‹Z‹Nv‹Ą„ôÓŐZŚî/Dˇ×L\˘ś'&óŰČqjóSs˙“›fź—#—ÚÍ0Žv.ťşMS^(b%†§Š®J–ŃŽX1÷?& cÓřČd=$Ť·ĄŇ”X‡ Ś`7>Q4şV\űaZ7˘Ž§Ş—ÇŞdŇđ]ő‰,ěáŽdłC $pöú­>&í Ć.Ýą,Ö=©ŕ‡™mŮëĹSá¦Q /ýM®év!ąsWZóś3˘l$6ÜqçrťŃM·%ŘQËÜG (úˇEŚe'­(‰ôR¦(4E8\[ć7­y%ôţ=9űÄVŐ”dŕ>=˘€[Ő+<9} Á”bO¸˝<‘DlŚ÷D’ń.Á2Ťx̶˘ÉLűŽyD—o¨Q×µSE2“Ú‰(Q“D‰Ďm"ŞűYm„Ř8‹RÎëNj:™sŇI¨ŽľhëB#—ş@uÎlł»h쎣‘ř˙u6i‰!zpV–°łĄŔĨąWĘižń(źLśă2âŚč˘_jÜű˘ňxtl22€&ޔ٠w<ťjFAqéĹOőT¦Ží4ŔęĺťgҡńÚ2B"ÁŰŃ\KĎŔk)ZÜÖ<µŞ±H íÉi.**ÉoĄń‘%‹TđDČŇ}4EŹńÉëoşśx©˛đ|™¤=ŇÚç‹)ă¸|dkI餓fuIşł}şz%vsNŚ_$I°zy &;Łň–wÚÂĘT—$GÍ8 –Ż%ź[TÓŐ©–ći­Ů‘ Ĺšë:¨0GÄŇ.5<ŐJU&š‹©çJ¦0p5Ő2w‚M ‚!Žą„_‹z(›_Ÿ F8ÄxżŞÓť"ěFBD ˛¬xYdŘ—&T­ś±.c“Ćę.Ő(›¦LlÎś¤\âńÝÍC+Fho. ·…Ď)Ý=RD!nČ2ąąŤÇ@pŽ8D,yĄ Ď®ňęú ;ldŕ‡ńL î`#ź#PGoÔ,şŰIIPËČtŤµó ~«áĐ—X«^Š’·µd^ŹőZpŽÝÄK‰:sďGĘ9J@‚#Őű]ajŕ¤b ­5EŔ:Gů%ÚÝ^kJ­ŕi©H†În«’§ŠËŤů+NSć@ř:Ψ3& ŃÜ<Ů“¦(/ŻHC‰‘śˇ ĚŐ˝ŐB8‚"ŕ9ŕ™ş_ Ä9:sKáýOO’rfű(»WĹ‹śmpüťW55:ŁóYF”Â%ľ1”k]Ő·WeŚŔ2/Ą–¶zĘ“1äPu™i1Ĺ*[¶Hy1Qtpś,źÁ‡$¸ŮŮá‘1;>ÖÝĄÓ!ŔJ@b~‰Ě•ĆFc¨?—$±éçÁX‚YÝ“’H>Ih(ŢŠjŇćÝţă#šaÉeÖŐΞ©¤ŹŃt2‰ćH›ęłµpp„vT8ŕź2©cFĺLUęłU<“@‘?‰H'ÎŃ“rĎpłúżŹC"1€×r·ć3µą‹bŮ˙Ş-đM‚S‘--#ýŇČ…e‰ßzčTŮęĄâ%Š{hdÔň)ăÂĎĄä,4©Âp0ČíŰnYťÂžvwOV‘.i ¬™)ŤäĂš20é‚ ?qąňK2@É,O6FĂb$MleůeŘ7Ô(ęzŇh‘Ő)Ž,ńPts‘9"rg«qňN˙%?…}´#» Ű:9ş×Ž‹îÜ|csH»ňSŮň“$ó;Hm—•µ¤‘‡,L~¸Üy¤"ąąxŠ­j OPÇ‚@ě Pz|.«‚§ ă1wţľ Ň\˘wĎVgSU–‚M’Ćq¸ťM4 ÁDßË.N9&_+y&@ŕR†’/)OPZ‹,úµ8Şqu7ą]i>" —P3şĆF”č´¤TűŹ’¸OFdIŽ‹kë(ÁGŐ^O{‹pS€”˘1ÉĎHjóJß=»F{bYGx®‡0«‘M…<8§CŽyQÉo˛&Ďŕp™Jq'܉r*yÍ>MăE?T—.ážq öYŮęćžžčJfQ«Üů-ţ˛&RÝ“hżK;sâ„=”.Şh“D‡fňQ*Ś!ä?p˛˘f3Gˇ°k%#hŹĂÝáJ(˙תĂŇĹ8ÇÁţë~|ŚŻµŮwÜü‘ŃŔM˘ăN)PV]›śUmQŇ8§ŰËqˇm jŤÂöPÎQ& Ü;4éŕ‰O¨ČŮŻš•aęFXäHy­ŁJcnă*›–FOůq00.ţăZ5’Či”w-- y,8d„¬¨á„ąfČý ł›Ř(ęú¸Sĝ£÷% ŮR¤9ĐqM1WlXMôe|§˘ű‰B&=P“ÖÖK©áóQç;śŠ­Ůc׫‚ĘcY[Átă–M«}•ݤ11pc'Yj06ĐňŽŚ&4*°EJr“ĘŔ©V2ićŠ#˘đHr,ŹE÷×O>Ą!żn˘éäBK|3;m[ëŕŁáýdŚÎÖN1IŞw1ňO‹˘é AŰZ7Pş<`Ç% î×Ir™b66đ[˛ OIŕ ŘeY\ů®Îhڤ}Cý:ŽŻžŞm=ň“n‘mZČăbŽďccoáS1‚HN Ŕ9ĽôEžźĆF&2m`˙Őü±ÜĚŁjKťľl®Z-čłëkšz‘;ˇĽ†Ś¬<¨·—,Î˙řĺ'ĄěTS„xŐÓČM-€I%4ÂŔ ę‹ #xĆ ŕţ€¨CůˇJ§(ǧtô1ă‹n±:­ąghfbá…8˘ÓŚÉ•*5ëbž=Ga¨YőµAĺŘ;~ˇŇŞ«ŚŮ{zC×Ĺ##$aÔ5Ł©ŞzäDô+v,aJ”Q8.•ĹĄV@lH#p¨âA—tłe&[ŹKf˘Ęű–oČqš Z>UKř 26ç ©C»F?!6éŰőu|'¦fŽě‰µŐx&Ţučn5\íE–FnA˘-´I…Smä3­Ű8ŕŞGNŔD˘6žšŞä©íş<#¨âŻDz˘ń,Ş!şQ5EŽŃBmŞpS"H‘Ô*ÉŤ Ź$RO ŰĘ'ĂîŁâľ— DŻ{˛šŁűx,Töînjâ+ÎÄ$ răAe”iLG,b)ď蜸W1ĽÔ…˝ü±ä·‰$0 xmËęČ»Is‡†ŇX,şŇůŰ0DK$Á<¸§ÎĹ0v×ÝĹEG\hŞq‘9Ět—´p`Śú:©`‰éT0 ă˙Őg4ŇěŚňŚrÎr, >ş2ŽŻ§"ţÜĚö¸^‡©üjµçQnÍí‹Ü:(a´CA˘äĚ_’…W1Ü߉GĐsm„bözpU¤“šýĎ_ ˘{pŻ‹ŕçpÇ…ő[M3»/=pÄČ1«ĆúĄŢ•ÎÝ0,B)˝™šú¤bĘ";b?aÍ;ˇ6\˙j“„źiÜ(‘˝(ɦŇ7˛Ö3lŮ™¨ť(Âĺ¶Ů9Ž÷°×ĹN=74şx$}Ă˙¸ÉŕßenŻťiŁřĆŠať'=ZqUHŢË˙¶_˙-őWÁtÜő„˘lYŃt\Ľů‡”dtuĎcXdśĽ…Ő_ÉC¶ťĽO˘ş–R5dp—"ĆÉňTŮHüdţ"ţŞň@„I±fS¶t‹FTĘ3„…8ř%0VD€Ü˘nMߍŃD$9qŃOĹT®7’ ΩV 1ÎG ˝~ŠůţS^tÉwé?ŠĘeĄ§GgĎźµŘů†W™ś§ć–@AÚJÚł… H0vŇęa·?Ľ`íÍHĘ@˘Ž•ŰČśŽŐ:ňG;6 gÚ]Ę ¦b#¤Źhu\¦°nů\“rţ™Éü6“[j=*—Á‹VĽÖrxÓęY9–A2âŚ,ţŠ/»SÓŔIĂĚĎŻŠ×ť3 ˙’xCÇîęoqKöyŁá˛śL)Ű\r™™‹ +u3'Fv¸–ÚVŽŚ’’Ť'ĆîžBq1AÚ]_e9öÖ@¬µ@sĘRîř#˛1µÜ˘ú!Y%ŐNŁč¦ěŕň;műž"ĺ®ĺUĐ›*F[Tč§á‘,f@‚ÔáR˝¶ą<oLĚÄľ2Ý\y"QL"1˸ ¤sŃ>ŮN-ŘtľĽUńQÔoqłd¤nĽóÚnü/. že©óČ&ŃWn ˛‰# Č2«üÉ6ţć7ŇčNĂE|˘ŚíQ^Ú@8{â8şsi¬‰!"ĺMĐäČÜů"Xř«î7*Ł•ÝĄś@Ë"Ő,ÇŤÚž§k0{|F"ťNxUoΙő°˙ČÖ}˝X ďăd~ÍÁČ Ľiw«¤e°,Mâűy Ç¸îÜčô°Ů°5&n‹©G¸ĆkąăE7«ââzŇZ®|g€‘§őGZ9·Hőżľ‚ňs敇 oJýSř_H‘nZ¨P ]ř ×c1ŚôŻôZKőDŃ2 %ŠăLh ŃÔ„Â<­ţă!}´äł»\Đ0™fowJSéßĘGĘĂ—˘.ĘhÎÂdĎ,%ÚĺěÎUńKł;–ř¤˛ŹęŽ´9Ú-°śyĂŰ/;¬bÍę=-ćŞúB!ËłHX*» ČŇ-‘ŔdAŤ%pöe\8Žšiui (Íí CˇËRPjŽŽěTZBd^Ě­-¨Ú{ż‚=DDăsSÇš‰<{z}Ţ:§/“g¨ˇ×Â’+8łCdśb}µ`Żdôs@ MN‹^Ł9AܢAh§´ĚE`©cw~TJb_ÝVJŽIFT–FO¤Ä±«É8X.Ż ¦4ˇG‰ąTHq8;« et™‰|ł‰°jń˘‹µM=.ÍżŰÇQZó+~4Ë­“ÝR8'#Ôwî>ŚŁ»Łä2$µ9˘Ó ŕ j‰čiهtd»;˙TJßČA!Üvň;ÜňEţĐKĺ^,Ú­\Äľ2őáę¦Ď@¸îŹ)€Ľ‚=5݇ řjöúŐTŃ}LK–<üeA`X Ě4ĹvőWΑv9;KŤpUHQc_4ţľ2ĺ©#p–-„ä/ŐáfD*‡§Ą)ť‡˙Ł0wŰO0U~˝ŇďCî˘%ˇżŃ/Ů<ĄcÁFéB4–ÝÄX;%Ôú%6B;©W˛»‚aŢ*éz ÂdqČ’ÖűŞçEDfD8¨7n¶"óűă¸6×njzŠŚĘPŚHŐÄ×NqŰô˛?!;ĆÇ–Šr¬$śŹĎ°{‡Ň‹;}V<3¶1ţ ň]‹_D¤UŁio‰i—Ń9='§•̤ŢĐÜÖŐ” #'ăe0ëHlŽ* •}É" PŮMľ„Ŕ1hš87BP2 1÷dAZ+“c±6?T@2GVé~ćo˘PU!Ŕ:«‰Ż?Ŕ=y¬ćšTůşłe€˙µýg×¶ĹM=NÔ‡ßiÝ÷[ń¨Ë˘űâeţÜłľžŠ{ş>A"@`j™—°J"'ŰŞ›2yŚL…-ú٤ ,˙DébRĎ€ uÓ’V{ĺZCÄ}B×BřĚÁ`4ó*s™“Ś86đD>FŢú¬îŐ“¶!ü˝V“Iúź! ŢÚ˛ŚŞş{ĄA ŕ¦mV­Ĺ!˛ PsÁk+;iI˛`xĂöđzôľ¨š+±|Áeˇ”‰ nNh{‰žd–g\,űÚůа/–$SĄŃ'ÁksŮČ5Ć~”GW4¦Žě¤ýĆCĺö*řŮu¦÷ íaGú%އ(á!µŰ`Ťţ«9béł$ŔţádéA ‡˛dø=qD|R"ÔŰꯝŰhnjj€3)19&Ewß”qý”ő3U.E’ůąŤ8…¦Ün9\úrSÖÇ:*$í­B™T—9ţC/qŹ´ZâŞ:ÚŁ'cDíĽŻôK"L×@ÔDŠčś´ŕ,îăČ'ŹCÓÍĽ´·RרʤwTŹ$CŁ”I4°ŐŘńk­ąţôÎýÄűüßč—ěř9*rxŔy˛Táqg€µÜÝL¦>§Ú=úŞ#&ÚŃ›911©ÝöN «#‰KhÝů«©…ćŮ#/hdşľŮS;˘Z ¨čá9 ůˇ!Łý’łÜźĹ@„vÎVÖĹ_ÄýO e TU ÎQý­_4Ťfş@´•łŔQ:PpźńŵvőDľAŹD ܨť ŇĐ5P*¦G>A´Ťľ:,şÚ挄Ł?–b­¶źDö1‡gů6ţČęt>Ě™ćČYý®-ˇOŤ—Mî"6ą¨7Iő<ÔŇ÷€Ň7ű,˙•wPV6>hú(F7pOO¤Ŕ$Ş”69b"bhtU)ałd@ńsÁ:#wj_tf2ÂQ=5§ =ěůY#y; ‰±TŮ$Yĺ&ŰXVŞˇaąˇ9d[ň<‘gĄ4LAÝ„}Ă‹©RlŇŽý¦Źe6Ş@ mÇ(î4pěőu3Fd$ Ž(”X(m9ńĆćµäśŘşzŮâ˘ĹoÓTŽŇnŠd:&"ÔÝnI‚ł‚DK<¶‰uŁä˛z™ęT™¦ăRś*8EȲp“ŕ2śH`-âłçŘľĽSĽ…¤Ż3Ă;Č}Ó¶´˘Ęiˇ"bż%úŕ˘ŮőO[ $—.ë~k*ýĚ0čNęz%Ůňź!!¶‡ŚTÚq‚f1sdKŔŚ%´Góâť„9mq":´@l"wá×ÜéĚřK2ÁüYi~"–QŚNę\EHI•ýˇN2`»PŘů%Ł?Ę8‰/n­•Ďp›ő4˙Ë0 Ě8QEÚŠ$|‚˛ŢtHÖŕaj ¸ňZrŠÓ°©qĹb 6F"Śę‰Ŕ9¦–(Ü#Bv“­Ń ’dŚó ĆŽ9,íő&“ł–OŇ2#¤ĘÚł%NŮHąĚ@ý»|hU~˝Ôőˇd2f%řč„L¦FŃýVuN$H ĹQ(RÝ(ç讑h˝™Ý¦XIf&ăšż…ôÂOÄ ąüyŞř_\ ĚCt=ÄľLŘŘmwĄôYősU %śU3đLŚ’Łnf>AW;Mq '@ăŃ>‡!„cńěÓAőJhTyĄä1ăˇä˘®9|p$Gt¸;)ľCsIö‚ăTńđ6"QÍg DŮ|zŮ*M<Öő”.21iKŁ3뻎,ÁD›»€Ü´­ HŰ DIžş#%Zĺ ôŹîţÉŕxnU3'M„E"ÍB¨ [äŁé}||_ŇvĚÉ…ců~Š0§©Ś›-ă*W|a†R˙ąĎ˘žĎ’‹†>‰\+9/x˛[3)µš‰ü!L’"ďâČĄŽ\|C°óŐep!¸ÝŮi×ÄŔfŮJş]_‘˙đSNQžç˘1č\“Řy1G%A Dä-gŐ+ł?˛‰ÎBîdŰ…¬ +ău=_ "fWˇ÷GŹ Ş$ł“ŕČZ±mĂĚŃeź6‚"ű·6¬ÉCn DäD«ékżŠp¨€‘Ŕh™)¨ĆŻŞż‰,É @±E§‘8±Źĺ<Ń˝á˙»ôKłć“Űáí*>¨}ą1 ŕŢ­˘|ďÖ‡žđzH»*č @"-;‹)˙&“¸¦m±ćy)»TÓ A;[[Ą@YË‘P‘™9ˇ"zC°áE_KăÓÉďqp¶»e! ÁÁ×É(l”‡ČîÇŹ$]‚Ł#´= S4`†Á-˘›oÍL:8Š’Sq-(ČčőU’ ?Ë*Ҝ裩A—Ĺ’_ŤůŃ^‘·źŚKáúýÖsM.ʉ„ś»eśŞÓŃÄc’1Č* íű-¦/¬Ż€˙‘3ŚpízżD~Ę|hę|SbXŐ7ŹdŚDăű†·ä• Čełě˘.É9팯);GËĹkQ žN‰~ŕÎ<ҷòf$ĂܦŰ—şWIP´ËřńŁąćµşG0:p)_`„”÷{c.î§îTܤ—jťDCD‘SÁ^`NcF´ą%ÖÎh¸‰F]\’3±™üNKČiÍ\Î=*ßp1ź´č–B—śbĆ®x-É3˛Aaí eŻ’!Ô{[şĘŽ×ôYÝ«ŕńĐÍ´f Ă­Î9 <ʏň˘,ôŁ{'˙s3ř†sÂ…>6:Ň€%¸Řę©(Ą-¸¤ÁěŢ«/‹“ÖŔŠč™ ŞнĽS‚›†9#Úń'JVޤń7fLđÔóNčM¸Č‚ é›§_}#ü-qąĎ)ý”r\ž“]BŞgnÂR’›?$ů*<Ń Šú§ŃBăřĚ\;}”™bw¦‰X¨‘`;‹K÷QÂPZŕ?– ;z#đpIĆ…lĚÂ4˘d›.B{‰¬YÇYŢżŮRxśÉ»ŚDŇ;©f˘ŹŞřnŇIbŃü§Ă…\ ęÖčřŚ#»FźŃ^=N|Işq12î8¬˛ĐŢâ"]¶@mF<ŐÝ&m.!ŤÂŃýTË«áTŰÓ^ >)év` 8źMÍ/2t[q¨Ë˘űŕ =çׂ]ź)Ä_D®ÔüS ď¸š‹ĹżTr+HĆ1µ ŁÍ`gÓm ăâ™:DG^:‡ńJůÚĚŃ#?qĹĘש¤sI02Ç>§4Ł3UNĺ?Ąě‰ băHşśx§N1ŁŹ$éă¤ÜźÂ'şĺ&!˙č÷łçE^G̤fÇu#0ÇXßěźŇnË6‰Á• ĐăR­!Ú]‘ÔrH|2&’jmoŞ˘yŰăţă)m­¶·z,łţŐ¦<6řĚɨŁ'ś2Ě‚(skřŃ+ł‡ö€•Ë>Öú«ĺ= \4pkŞúŽ[Ž@Ţí%•ËHčÚFÜCu3}ϡ°&!"XÇŤxŞš˘Űż_’e‘F `ŕµŐ9ýKčäÂÄP_Ő;ˇő­‰ĆUŤY=’~îdÜ‘żôSÝҧĐĂńÜxąâ§üť~PřŽ4OWBËţK°? O­Ŕ%Ňg‰žâ ŕśĹ)Í_SÂĺ8޶˛qr§áýMŚF@Lŧćí˘Îz»řz}¤[·Çk÷+ŁŤ2ëeÉ áĄ:·e?µ\đWćŁÉ ‘¨ĚśWh᪯„#y$Ž!·DlăýRZ¤îh1püKr’€˛:nÜA«^\y(úmܸL#n3N|řDwňµ®.ôKĄ@ĹĄ:Ř(K3şĘŻ^Śf±±N“)5­2Ś—5ŃIG¤“mJd€ŤůňѢvôů+;íhn7ĺ/u6§’ˇi×'HÔvnFZ0écĆęůúž†b •DqśŁ#ŇkK¬s–4L‘ 8]‘iqú' ÖĚ‘-ĆáăĐŘîâ4üʨL‘#ăꏇ6K€ś)ąâ,ÉO ěf"nőN3)łŢÜ•u˛…Kl`8ŕ¦ÜŇIJîßeXŚ@yTČP¸ŠÝ?Ý, ČŚÁ.*Ă’?鸾ş­™¸8‘Ą ‚d“ąŹţÄĂí%Ľl]mrř›!™î;r*F÷¸Sw5UÄę’´Ž­™8TMü˘@ÔićŹr>%9Ł(ľ>łűm÷Qź˛0Ď…>ę°Q< L,Ň)C©`˘LS^.˝>هoŽR»«…VüéťŮ?ň‚qžŰˇÔňłYOíš>™Oc “쏕ę§>„ űŤd‰Eľ;N)ä`r/ –g<ĘE#&ylĚŠ!đ;±F^u{‘?Xbńr*5F2y+q2"GtCx(7LÓp‹űkĆč´Că\cţŞţ%/q#.วăăJ¨ëÚľtf?(Ą­č”3$z&,qIÁUjÜV•‘ęÚOVI´Dí ”ÂIîf­öYß쿆‚=Ú&Lrî-˘F>ĆDfÉŚ{KW… UĆËĄŠż2«)BîĚZK)¦†Fľz¦Mv“"Ář\Ń8¶ŇDčęˇ$bÍŽ)`ŕńľÉÄ –NB}(P->ůpr‰~Ę|Ŕ@Ä3Ž – x€ů üĄúůŮ]ž#ähťŻín)ő=.hŻČ{O)äŽBö7µ(˛X㼖†ŁŠ© †1•F×÷ şRŁŚż’'Úî88U’ĂŃ1śf‘ ZĚA÷=†©ÂGśżs’[ś´oź[\Ńź˝í€¬NúŰńQoűEMU@€ý·đuiH áQß ĎŻ$ţ’\$ ĆĹg4şgqÝĽÚŚÔľŞşŃM• sdżM-ĄŻ¤VôŕD[mYÖ˙á‘ň ™aÚwčŁö|W ĺÁ˦«.‰p@7(‚·t¶nŰ^«4” ^(ĄĹɲüDŽĚ‘×˙%¤ţ©úĚŻ,;HˇŃř®Žl0‹Î‡Ę?Ý)=Ůßăýy˘čFÄŽ.hťQŹҲÎ"nJ›NDH‘sŻ’QTS3sí7O”¦d‰8ţéÜࢾĐ^ú«KţAőd}/Ś‹§¤4rsÜĺ˙Çě˘íSN ‰ŢzE˙ĐGů1“dČ}‹ă$qFô)ń˛ďGN[AŁUYÁ!"OÁe1Ôdb[k?4O@¨Â[\ĆÁř¦'Ć!÷\ů%‚2´‘Í_%BaŃŠî˘0bì$Zů*îóţŘAŘk® Ł˝o¤9Śď}Úx¨ěn$¤ë{'Ĺ*<Ä Ye]l¦‹ŚÄ ăU94Ó'wWŞŚţU!-ÄÉ ˛ágÖÉM3˙šUżWpU6_”˘Ňݏh¶Ă,łµ‘¤î@ů¦@`ę}í\é.\ÇÝaśÎŘŤŢ:2Ď«%•rf,Ä z[hî´ŁŤ]ŤęŚáň95ŃTž’lb;(›¬äńwffÚ0d62۸ůwI‰±<˘4Ç‹)ФB€ČP›Ůgţ^Üăh¨wV̉˙”}Ř@·U}ý§Âbŕyčł«t Ŕ2mĎhŰęśüŠa€üŤýUá?],b1ŹL}Ĺěę022˙”C»·ŤUŞ1Ćí¶łČű˝UüMľ¸Ňş.€cďµJ ěŕÄŮh‹ă‡őăT|ćq’žĽ”Ó…Đř$cŚÜ‰ŔßÁ<ýd“c&VáÍ_ *ĆЦk@Lw R6GlÜţĹ"î2Ętöż˘ÎîŻ>ĽĄW!ťfÄíăWAĂ»#ÜHF¦”äUq´őŁ2IâFĄ¨Şß !‘a{•ŤŤ gU†âííüGB –0#˙Ëš›ŕďŞ.„Ú¬â1É#ÁľĘúÚy(ÄHG™HĎĆŰIuP¨á‚@P Đ}ŐAZkŤÁ˝Ç4|$ŘÁ}V|ĹÓ0F[ä…7x§ÉSs‰G!ŰYe]m<† ü4óJC¨óĆG1jcÉEž®“äŰżÝ!ĄÝ+śxn@J]ôE%ŔëČOŕÍÍ_{L.¬X9’3p6CYů'>¦»,GĆ+Ő©ćŞĎ3&&@P%ĎľŠa‘kˇT”řâ‡Ör.›FI^-ľ<\RŞˇ74â2C˝Š:ĆJ ![w´y*~+ęl±"wh‹ř©Ş”¶žÓ(ý˘ŢjgäŮ71%ăĆČ‚‹lđ#ŰWôNl®ž¶Bä8UoÓ(^)€ÜjÁO7`ŚŰőńO#{¸KäĆqĐÉ÷ 8¬dÖÉó“ĎlĆŮJÂöWJa~ ’ĚqĎ _’  hď'R•Ú‡Ž0a˘pŞEöÉŞgJ–-ĐgihTŮáĺčaW«-y¬é=üČ–ąĎ )îé\Â%-°ąkä ŔĎ EesKé›Ö1n!¦l8Ő_Âúd€—¸L›´1"ňjů (Äz@ú«ć¦»('Ďš:Đ›+$dס¸k˛‹Rĺ˛Sş…Š_MG˙D,CWšż‰úžEĢ|B‹śśPşTâĚb_Ň®y­&pŠÓcÁ: Ç/â:żÝ9¤Ý“6`u…ą…7jš7˘í˘¨UG¦Í+ÉEÚ曌ČË,ĄXŤ»JD,Ăů ë§$ú‚ىK6`jz~ĹW;©čY€·4X"9HË'IµÇ%ťĎĆÁţ31îž<É•ŽIËB܍ݭ˘h ÉĎíŃI·äcfqÁ>EnocŔ´ř˙Ő>´ ńž’öNR®0-ŕSŔÉťŻUśU: #ş4ńVšě­,–˙Ëű"ěB¤"1ţśÔc EÜď3‰gĽ¸(é|™°Ä4dĎÉ@XjĂTS Z]ÄöW쉱ńęć 3'¦‚ۦP0ćČ‚Ťô„˙Á"˙‘„$p’:†ćú,żlÓN+IfnđźHÉA;ŞŞ“7bđD§†F1s¸^é`%Ä%`]T*‡ÇAAoU”],ă'‰üż˛›/C™ŚI/*î îáäËi–tźů ´±ď ěnöŕ§ö*â%ĐHŁkćŁ*lŽQ"(}Ç’setá,ęsĺjŁŕ<€"ĆÇO%DábĆč 1mřâ™Őó¤Öd  ë6JĎ=ŘŽjÖĺ8Ě‘+ŃgrŁČ·‘¬ţŞäń?SšHJ3ÔßîˇEŔ#Knđŕ”;cřˇí«xUi4ŠŮ‘şć6ć7? ¨C¸ćśľŮyŞTôq˝»Ëń‘oO‘Rg-ÜHZE¶zUG[TĐ»p Ęâ‡n¨Y Á‡©áD]”Đű(˙>A­>ĹWŇďFwíaI}“ę—)Ç#X¨úł`j¦Ţ,Ź…NĘĂ!_语¦hDĽM´HĹŚĂq±˛|č«3ť°sÍ.Ž –ŇÁ8+AlĄ˘ÂŽ_ÝOŁ'ô‰‘PĄ2®G%ŹöZgÔ•Ł1€SÖŐ4X&QmTĂIšd‘ŤeO˛ÎĎW+2‰GŕvÇBĎŞ4&ÝŚu‰µ¬śŮQ7óă« ¸äźŃńéćŚ^OAJ­ze‹«lŁ[ĄŹl#ŇÔ*ľ’ů @Ă#HCsóe—ěšiÁ„''Č'I¦oµMw çÁ†âŁA÷HŘŰĹ©pyIÚ†ăÉLőTáć1޸šb$jVxQD’75ŇRŢТ6»ôÝ•§ëdwűıLŰ»l-vŞ{Éň^ \j¤ÁŠ,FѸęl—'L–ÉMÚ4§fě°cÁŤAv(đš,Ök¦`‚/Q_şľg‰»t¤đ$ "č$zĽl¦ó@nq_¬8k€@>µU4_S’M ¸pQ•ş/R©`ňłřăŁ=y­"(‹É´gj© |`iZsF<KÍĘ„4u l8,LCă;‡§ÝT*—¸˙q7­ľË>¶ą§b#ng‡M,”ú(ó€fA˛®˝(>ĆOÜ櫞ťľ…WëÚzĐűžÖČďČ|§źĽ“CŞ‹łŤŰRAÁş<eyd2v'ú+ęzPźÄč¤ĹŹnĐeOÝ«'4UÓm‚R.MĺÇ’(‚€;kWNĹÍYĂxsÓÉČÔťĹÁN$ěŃ&ndţ ‹±i3±R¤ąI=Ŕ‘ö‹YőµM۶…Éąk'Ét\%ÇA˘PëLˇFFŐpźźCŇĘ"' EK1ZŘÎ2&T5D˛={nEů¦0‹ţL“Ű‚EGęBËöi|l`‰d• ţ‰ý&ŔJpꋣş&†«˘vä% /čśŘ6‰ 8âĘf˛uD"ä+¨a8DÄČőU‚Î4©ä@rńăeťŞz}« xž¤nsÍoĎĆ]'ďújç©éä§Ş®H3éaH‹(ÍS# ©?VG4`{ĎĹżóÓ>*łćID€,t'ŹRdF[e''FJyNŞ…1n9­f‘vě•.´q“Ú7oŐ!žČČÚM…Ô¨óेš¬xź©MTĺE€IŮg˛“]‚'á‰}ľ«Ng·ŃJ‘.iĹQFîŽÖ4ŕ‹@'Ś AąSaĘv*~Şâj°şÍ-NÚňYŮí«—ĆöńÚr“n–J C–ą$YČmŁ•Q×´á݉˙ŘÉČm~`«ýwÚžô.íăç§Qč—zĄ”›'€¸äłĎ«řăKH´ÇęŚ~v2®rڧ6¬KmýV¶úĎ5Ú őSź Ě,"@ŃW:*ÉŔíđŃĺv'îńË.ă'¨»ž`©î[0®n+¶FSz˘LŚ¸Â Ľ+#ôR L¬]Ď’p™çKštČîܨԪ‰şAŽ@~7Y4ô©’c§5Qévn{hj±ćVÜOu˛;Â@ˇÜĘoĹBĄŽ[cJUŇÁĺŕDéů"AZc:ĺíäRÇéů%Ň'-tú+µ0©‰ăzŢÁMźí•M-ُQ®.´ř†f źËCÍOŰÉ÷Kč*drKĂ2tÁúóUtSiäíKhT(ĆŽR ` Çźt]Ź™W"h¤m—WZL“ŠłYÍ­DÉŃŁńD˛Ď ł}–wkšĚI§M‡~ #/€¸ăD]”Ńť€™Í9° ¸˝¨U~˝—z3ş±ź^Oąŕĺ`“űdĎÉc'‹É„DČ™EÄŻ^ ©\JS#¨ł…Wd źîwIn˙µ¸Öʸ.ŤŕţŠęBłsJ˛ąŁSŠ(€“঄Ä̰}żŞ»´ŠEĚHwđFA@nĸŐDŇ®ŃČľc¸ÔűGŞÎíg`™0Ú˙U\ÔŘŠ%Îů˙¶ę"ëqĚäŰůŘűSȱęf”NB#{Éü8-­e „roaĽ(R‡M&`AŞxôŠ”A-wńŃOňl "CÔ~¨1@ő٨ e€“kú#ť•Ń8ŕL‰‘ař–őJEZ˘;L¸‚¨žk'„OŞĎť/˘2n§ ˘Ś/˘ÎíSOK·qcŹŻ5·,č;čź“ 'súwđsA¸k*ÓŠY2ńąŚkşď+}ŚîS`ڤvÄHĐŞňă›°/FđeőYńč‚vÔy-ă"óîéOâ§˝ŰgC¸—@/)›ţçŇĘiĆäaÚĆU>ŇŢ5Nël©{AČHĘ2 g©É˝~đőe´Ű6ĺ-ÇŠ(.Ŕ€ü@˘M¶}P+˘K;T Ty‰Ö@ÖmÇ•u}\Đ;q!,‘”·Ď‘™ů)çb›0w±ˇĐ'JŮBMš$±;_ꯏĄŐqĂ8»D·*˘Ď)MĽŮHJQ‘ŤbűdöĎśµÂ‰‰±‹±âŻŻSšB/ †muDŽ“‰8ę{ 2üBŕŘ诔ÓHş € ­’‚»,w14d¨!č.•†`!ř+HäAGěźĐ@0-RxńI&`3W«uŁk*.Ő3;|yŚ™6÷pÂŚ«śÁpžăĽŇ‡ęĄVŠüŘŕÔ«H›+§ŁňÔQ–Ő”6Żîdˇ×Lěa¬´ňE™şš¨ěDɉż Ł Ń8MÄg «§6W×F$IŤ‘ °÷ h€‡[…Ó…V|®í4Áů&Z͸ň˘ĘíQéö˘c'«îsfŞčçLúü‰}»Ń÷·&K˝ÁŔ –řɬőA—Jh”1kăĹ!L\ßě‚&_60ý!ţˇLÚ—ÇŞ"R x-c0f”ţ(’6Č˝/Ş]hćŮ”oˇ˛:ô@HĽžAťMüň‚0ţŞşŃM•3č,¤ây@N$§SÓ2,H¸â¶•§tE‚Á©Ĺ“Ń·§vŇ/bh $9ŰýÎFŁíű,úÝ\Ó±’'(–sĺTˇ‹dc-ÍŐűż˛z,źŘžś _ĄţŞůONÍA>°â $8¬)7NÔČkč§Ed ·P˛@ě;Ł8;Şä©“±‘}yŞł3 CÉ(uąi]SĄő ƦĺLH‚*¬›9męNŃ ‰h;yÇű¨šUI˛1™/ÔoÉebň§†( »«ëe§>á2 ŰO»U”­,>#ů@zčy+Ç©z6’N‹ZÎăs;‘·8ëŕQĐäś í ŁĄF`Ýňn<Ď$s±Đ ű„IˇĽ“…GŚ5–…>J°3V7ĽźÁOăaňn´ĄúB¨q1‰3sÍg/Ť*FڞÎCÜĽhłú·©Ű™ 0p­ę¶çL¨?ĺIĂ1R70µŘ%ű~Ćh$´‘`ĘhJSÝŰí/ĆéK“8ś›‡ďäťĄŕ€–ČĆ?ŐŠŚź4/N4QőWOBvt[s¦Aš$XńK¨r‡ "7{"ţ+4„ bă@˘ÜUAĺ‰=° ăÍUžŮoş#QĹ,™‰V”˘šqëP]ťnÉ™m*8%Dq  s5MIK‘‹ÜN¶O‡$ÁÍ”ľí»^Ťp˛·k8ÁŽM í÷F÷R€üŽ$ÚŞĄěŔţ^1Űőu|'§f"X¤úłú˘čMĽßq•ZËźZŽr1‘Ü^\Qh‘LÇYĐpZݢôHSpĽ@/ÉW%Oq·l®mÉZIŚ¶Ç¨ÔjŁź"¶ă-ˇ˘wŔŘ8;oAF ̵J˘ÉY˘yKř%!Ł}ÔgĹ}(ě&&ż—č¦íJp^.®"ĽÜrŚÉ­u”kL˙f´ŞÇ’¬z_®XŃ…ÖŐŚa!pŐ,2€e1vć‹M›h,˛ëKŽíÉů¦ZˇrUÎÇZn=¦;™)ˇGŚ·K§ĘkŞ3ČXÜ<Ĺú—$’¨qGřDEFšÎiĄÚ~âĄ8>Ű9»jŁ©šrŻíĺ˙«„ÄînEk΢.ÝśÉQjÎi L&…uŻ2Ş»¤Í¸kć—Đ83m2s­„F8dů*j|OőuĺOK ŚH-"ő[óůŚívPĐč.EôGZđ@ä-n)t!9`ŕT]śi†î܉OĘ—ŞsC>‚P?ř ňžP÷ą÷3rP§­Č”śiE»Ä.ld±Ďh{ťÜł2V ¶`»™SZ&#Lrm&2s `”˝ĂË<Ţ–ęľś}msDíh»sd¤3¤I¬n,8ŞÚTöÁÄôłx+ĺ=Ü0Ä1ž°}ň¶®ëGÎŃeĘŚ±épy„.X§Đäů€2mý•ݢ4 nŃîý,ř+Ő“ĘFR.c~kzİ$Á»+ś±/gsÉ+łšO–2–*Űű¨ęx©°á‹żNî!Ů d=í şseGŤś' şGů¶úú'v>0’wx;%M$"DbˇDŠ©sW¸ĘŹMy,úÚ¦ž¦0F1چ”_ę]o'ĆtžâDCĄŇC¸şŽľ-ĎĹôŻÝ ‰‡łŽ~ ÝŮyA;OúĄN‰Ą–$Kp®ŇÍĄTółşz›A–ŃB·úÉŇs!§®¨ˇ’ۉŠsäq"&&T~HÎ`@%…OčQea›'ýÍô :ŰI˘b˝Ćś(ŁéŃ™nłŘ§’ÂŢß§y4Ť-yE'»0čbŔľčń¶Ş{W(ňĚ’g(ín±ę®GHd222}Ö‹ 7Š(Ц#¸Ęďu­@DŞěŢ`­ `,.ź%O‹;2¸’ĺ'śőve4ŕdŠ)¶-,ž#őžĐ#ţB8łIĺZŮ“"öŚş™)`H”…Ů–yąZśD b$±;š—ZDןc»pÚĚĆtčGd„¤®|•HOFQ>ÓÍlÍÔf ’™IĽŤýß)Í’ńO<ҳ×Ұó{ň yŮÓ1Ëp)ňTČŘiÁT 6ěŵÇ%6fźŔöô”hĆ´G#˘%ţY mń˘›µ%Ě› gŤŃgÖ×4ôövČîńf[ŘĘ c:ÖEťóߊ0±ÝÓš$°˙Ä)őBŮđTB‰"&áÝ‚±çščŁęľ,ò,zK­9Ň-ôÉÔŞşL®ĎÍ*dć1Ś÷H0 :ľŞ¶Éů7Ń<&vŔtuN‰Ąš"Ż»ÓĹLŮתŰHnÉ’‘­\G‚ ‰ăňH8*Ž˘y& îLc›$mľYu¶“)Jy`µŠGŹ&SÉĺÍ[ÓÁ¨ŻµÇľ_‘oŁ­xéťČ Eť‘ŃňŽrČŕłËö˙uŽjätăÔX׏°%>~ů›JҦÁ CŻ’@ěŢ ¸*lŁ Çd«ĹZI2yHťYB=Ö„w=ęßtŻđŽM]x'(˘‰‘Ë2CÍ®Šˇ]&ŰgđL‹¨ÂíşZ‹j—ĂúśÄoÉWoz¨~0_6«x*‰¨qPVśVSĆ”Ë̬%îfUôŁŃ›JD×ÖP8äH4¦…)N‡# † Jś.RhI…)·Ă„öŃ#$€  ĂĚ%Äő]ý˘ĚśMŁÇ-±CŞr• gíüąpF}?‚o±őD$˛¦I˝ >Ę~­&Yź$FŤő +µs§ŞGY?‘g]lÓä'w質†B°mSĺ5$k´Š ŃLXČ‘<,Á2kŘ»"R±>0NH†rě˘muvŽ;E Ó…VĽßÖĘBA¶’ÝN˙Dî†[–#uG’:ŮB$:Ź }X˘„śÖ”DúT©+buHË€ţhťý‘6śßxඬ¦ť6{‹D#ŽĚôć–ŤŇ”€üŞţ(¦î.2‹,qŽâ` SŹź[ÂĺđNT­+Ĺ/2tp&@—kóO%Uö ¶Mä[hWÂzsřĺX–ÚQŢ„© ë$TQ´YÝ­ą bţßî¦äHq‘`M ¸Ze.©“FĄÜ‚G['Ęi‘ˇ”Ť‹}ŕü“ĐŐQş­4·¨m"ÂîŹňČĘěuKčPĹŘ­R1w¦,€âqţŞŹ†š@ ńe•ńPř¸Ŕ4Ţ‹IĺJ ;4!›ĹcËZ˘÷äčŞOQ•łb+îŃkŇ#"NÓŻ‚ ˇ›ďtcŃ&8äÚ7ÝNáÍ—‚=S‘«3<Ăé/ĆŹ˘ťĂBU¤¦¸ňsÉOý|%×ę]‘Y96‡”ZŹĹMR|§ů§'x†oEź[TÓÓsrđ[ĺžÉ!‡ŐETlacˇˇ×š9ä­M„î—Ń)ULÔpO$3ţ8’+Zs@úF#Śg}řQDľŞévÁ•Ť˝VĽéťha‚8îĎ^nźÁő“•Ń+D'&ŕTUFÄ˙»ŮĽźJ†qZȢR 4(ć¬9)›Uľ=:íŐoźY` {cQ2‘ËëÝ˛%Ŕ•DĂŚ},EÝČü€h=ŢGw֜‰©âTÚKj?ş˘SÚ˛`PQľŞ¸úž‹îÜw•<’ěůK4奨ł»\tÜgágć•Í„diöŃ®*®ĎK. K2ř $h¨FVq“†Ť)Ĺ^S“ĽÔ~T•‡IŰătş8áeBČşFR&ôei7ň%ÜQŁÁUIa„Ő1U>ΞŁďÓÉg…dŘ~;GµöŽ/urĄ7Ý~K)¶•OnAÍ´JŁńo§;EXCEř+Hq“´n.x˘ Ě»d|’ľś&r§Ą>ęm˙UIč{}‡>b=ňÚăČ%Îéu¨ŕz\[DĚě`HFF˘¬UDĐČ’é]Ţ”Jú"bd6Ęľ)C¨ńÎf›Ýî>VQ4şVQź%)JrQÖÎię~G×OEľ=gđ›±!ŃBŚ1|2ĺ÷UŹő0D@fg}TĹŃôşpŰĄéVJASâĺŚ%WwôSőWKđ–Ç=Őu´ľ3­ÚŘ€·T]ˇËî,´K­D·gŞÍPȱkQ‚ąô©}Ŕ˙ÖÉ nßt¨› Î#>8ČR[ů?Uńé@LÄ …ł1äkú"”d€8Ŕˇý >qě ä‚AśËĺ”®K}–]m¤Ń2¤ćY©fu'ĆŃÄ:·y3=x*řJ»oÉü9­9G@ď8âáăZ[P—Zíbóˇyh8¬şŰH/i`dÍÄd4éXŔí'oŽž(ć{Jß ÍŰUV~ PöQ”{Fry‡zq‚9ňźZ] e:{GťÖ˛3´S€r[Š,ş;gŽ2îÁĽQđľłá‡ÉŇę®Ř·‡°yhĹ\Ő“ŔĘë>yȇťŃgÔő|—,ctŔʵšĽTŘr¨Ś¤#ÓŞĽ§`c܇´ż@ŽvWE÷„Ŕ‘Z°ôKöLŕůI(±Ú=ş•šÔDGi )Éń.Ă.)#Ăš®E¶P8ëÉđÎŢ ăiFÂ÷,ŻźfJžÁ2ĽxpVI„¤wËň,ÁgT×!ÍŇwÝ®ćU}#‰‹35xş¬ćÎíśÉ‘LŃ—ßE?`sB‰ă5({sř,ąiGN蝼S%Ó$F·Ô­«8ȵ…’0ä--ÚŁˇ fÇ>ŞŇŐQgŠl™Ô˘\‡'ĂUP…Â&Ô¦‘żÜŔ˝dď,»9 [8H'ÍŚČÎ3ö–éSb˘l›`dOL4/őYßőe1şBš |e”¤Ě˘UPĘŚ­ŻŞ ę(ŇďEę;í§FHĐńĘTg˘ >(Î:’îł›]Ňü!ŁŤ–ÜĎŚč»—8âaî.㟊}hą.dĆŤú©Ş"BB1 ¸ŐĺeŇ™–r4fÜy#śd]tKC÷]ULwm¸÷P"€»Ž4OŤŽ´¸H:Ń ™g&Ĺ’GNšqHÔ GęyÝÁÍ6¬(Ă’Ë«ëHY#|ÚáśńRrâU¨f<9 › Ŕć¨/čŞYiYá}ř ŔľÖw,üýľ`řK!+‚ăö¬–q;lě«IlŚ«R…L‰ń,¬ŚÇ¸b1Ľ˝5O›á]›Ś#}Uŕ© ó”ogYU aËŽiŃ3.,”Qi–°ŐVĘřk¶7jtţÖČ´@vL:˘]qÇ®-ăDBAŰR\µ§Á÷U¦~Oâ´¨Ś‰¦Ą”Xź°eĺ aĘEú~ę:ŐTÜ ‰t“c{ůŮ].%)RČc‹0•B Ę?“ß©˝ż&p>Šbč;‰ óÜhĘ:6gÇ’z·Ô,Ż•SOROąŔv°v[ݲ&UťEźŞĹ´‘oURx_P€đrxĚXڇIjÖ@ ŔhśMMŤ÷žeGŐüzhÂĹmË:.âL6ęlx2}0ˇ SCĹB‰Ę„ZĹÖtăFf@?Šp ,a(ďE]wi'î 6Ťů‚ź;KA‘ŰFw¤C'ŇáčlÄHŔP-ŕŹ»„b$h4Ă0,N©Č4‹>ć~AgÖÚr\ˇ†ćlü’°ňfđ:IÚ8Ý;Köűľl`Ö5sÉ9´Ň{Ţ‘ ˛Ű)>ŇĎftżgĹr›|á­ą,żÂ°~čî˝FŞËÁ¶"‘qćŽGGVY:¬4ä©#Ŕ6aÝ>ť·ÖçÁW+íQ.ZQ‚',€!ťeůhѶ Dš”F@dc~<’Ď č1’Ň&ŽCř¶»?őNč¦Ű0~8ŹÄ»Ž5EŃ22Ł5“4/TBy˝ł“)@ŰBÇ™ë^”bhš+ĺ5P‘jŃôZ!‚–@ ‹LIúËżŠFTšC •Y™M†Ë$eĽÄ¸“SÉŇŕú†Ddá˝§ •śîž0ECĄŃÇ –4R2|ł&†źd]źÄýĂŚóăGŃč˛ęú®tő6ťÄ?ščŚ&F`jleFÄ>5főW4›´/ŚKÓŐeź ă¸qú Çî śMM‰ŁśLĐ×qăJ,¦×tô0°m[Eż ër@GţgÜyŃ>´SlÉÓ#á˘Tâl Ýş…ÂÎĹJč,łqJ1䉱E· E鯊ˇ‘v-ňfoűiČŞăét®2ĺâ­dČÚ\±ÔĄDnĆĆÚ'đ’ŔźĆÇÍ,„ڇީ’áĆY0sGôYő¶“D‘Ć]Q-K)ľŚÇË»óÉaHé̱ĐßEZ/€ďe1&ú»ŘçI7N‹,Ż-őöŤ»rL7:#ѣߺ̯ůI¸bđ!şFŞąŃS±ăŽ^0V˘ŹË>4oE—‹řÖ1Ü"\ŃâŚ`ťĆDŤ!!¸Ń†‰Ę,8H|SP3úŞĎ‰Ç®;H6ŁŔv:ơ‰üS‚Š;I­µ„óűrA‘&Ą¨˛ĺŻGb ›;$ůMX_k­ q˝”žKä$˙Ş$0Ů6ŇSş¬?4©fsÉG;>´(J¤‹¦)äHđU ‘śČçĆAw𢞕4ŃHÚŚ%—t‰‡E6žäÝóć™/íÚ8QŠ‹µM=@ ť̰LH˘šŁbb H5ŕ®&ĽĐŃŽÓ̬nšHÜ XĎXzżş_Ů• Eón‘črYă5_öŮ ‚C>‹^o¨ę60$_Ĺ_SÄ͆mňĚ ?˘›łšE´üd˝MĎ5ŹĹŽ2•d-||íUP¨ć€ŃŐŇŤěÄ#›>1FÚĂ‘(ý`ëâ¸Đ†4V‡@4ţé†0Ž(Ť+Ni|őĚő5DFŇšąL<üâ{ň&!´˛Ë¦’’cNs—Li¸Ý´Sf&h#`ť9Ţîíř¦–wLsV¤DwłçHňc‰ C¬—)±“ő äťŰ™ngÝáÁ>~—JLx–ĺiRf=Ń™Žč]Ľ4Tř{Hć´‰¨Cśą Ä[ę_Z| ąŐ2. HŔućÉC2&R6#O4B<RĄyř«Ôń?]0N F—Ńt&Ä1'ŠaŃtI4ţ(á‹K$]íU—?ZÓp™QęUrš¬wnËD2 ŰS&~IC Ż5˘(«ńL‰ĆOɵ¨o. MŞŠ\ÓÁQŔTn©ŃTţJ/żłnJüŘśJ¨‡Sca~ŠSĺgĘôoĐ(ëjšzLwt×Ím6Čą—)(}#·‘>tüÂ~ĽĽB&Ü[pű,pÚšn†Ę“ ňĘ­y'’G˝Ř‰ G¸ůŠ,göi¨ôˇ?ä<Ţô[ͲŞ3„OuwI…Ëh”ž˘-őSvi`pךËâţ‹„C 7ÝW%[Ë`ębudč‚íH–Yč?˘|ŇëKb^!ÂŃ™@ľ·EѦ0 d/.hv"L€ŕh·$@»Ë‚öű—{iΓĂa'eař•1TĚś^ĽĄŚă)n}S‰wv$sm–ć}ěs¤’ÇšÇ -V°FqBSQŠ®dô­Q$\áEq4ěEăő«Ž*ąŃSńűjźŞŇ!ç-ŮŚKíoXß­`˘_ÄjPLŹË*uQýŹO>7 K[Q2<3¸V—Iľ / ˘č}hĐůĄčpČ' ‰ éŞĘxĐÜBN7ťÇSeRTň"Qrü`c~ŁŞP:[¨ĺŔ°@p )K‹&dĂvűóQ'¦,b?éoŞ9Ń]™‚EP‹Ęšóű$©§F12ĹM0{¨UO,F]Ô±Źl™ÇuźţŰ Ď™z&N73-™•+‚Îu<1'Á©<ËŞÜ$Q$ĹČs§ŠÎ4˘3–ń0?áÁúMĹ#ňDŠ‚˙ăJ˘_E#`Ť=˛â÷QÎŐVŕ"]Ć>waiÎŮŮ✤싆wéżŐiŇay^8äeKn裯!ÄÓ·ť[±’2Ę&¬Ő䫝•Ó˛ UĎńęC»7Ý”5öąőWÉt¬ =‚´ĽA§th1ßť6*qLťP†'D‚ě’tpZś‚ĎşÓHÄÜ…¤ ĘVś6RŰ:‡•_S4îä&hŠ“·ÂÁ.ćiň“0‘”dEy¬úÚ ËČ‘ĂhDíŔÜfm§†Š¸…O„c Ë÷IľŠőSł1ďŕő5Ü>ÉÍTĚ …˘[Ź“)ö¸ä°j8—$B±ű˘·Zr-vŞpQÁ˘v€Ń § ±#v¬ęô–ä cőtuˇÜEfĐ耇şD›ł )µť*…O™˝ ŐĄ»:dÉLľ‰j2' l˘.ŕ~^aDÚ¨±ŐˇD…ZeÖů„óčf@Nhz·˘:ŮÍ4HmT˛Ibű(jĄiâaů ‚Î?ńQ˛żĺx$WŤÂŮ2 0¨*o”ŕ°ĽűY7L‹Vö*ąžŰĎĂü{˛†ŮűśřY–<ß=ig¦“Övz@íĆH“Ő"ő¶‹>aÚWlç¨Ţ*xžĂµoh!đ„;4+nv޴ݏP‹h´ę#f3Ů-$ZŞz8Ź 3J€ŮcfbŕăLł“]›ŃTž—Ă `âž*Éť“ g”GěýRăéô®-1¸j,´‘ť ‰ŚH76E6Áţ6±őŐB´ÉŚbo'nI“>KzJVžwAłä&Ý/.AgÔ_%Klg’Cňjy%ů8)Iş®úY‘h4HäWŠewC˙nc÷3rŠ}˙bçI;’!HÝYwWČö™9rYĘx,·e˝ĹµSć | $—¦ˇVR~6ŮÖ´VšxvP}’ÚÜ‚!U±­VXťĎ(ÔZoú%`Ť‰ţ&:zŁáşR¤KV¨´F‰9±­ą÷ç¨Ţ >¶ľt »§#Sj•%'Oju0@Ć%ä|ŃAąÄ‡s‘˝ŁkŹ0«©éM%ĚŕÄ]gÖ×9#»ŞAśY+üŚ µ)áOT˙_ŇéDHŚäN¬ËDž=€pŞŻ‰:`í,[Ĺ_PŁĚţLżöíú……ŰQ‚atȡş;¤ÎÍŕ–)«Ë\Äj?˘®¶‰ŁśF=E†ŞôNžíŚÔâŠ#ŁPhĂ÷q@tbŇT ’c n ěÁeV’ÜÝQÓÍ0ŞO,eÇ.kT2÷áÍ)CKHő ‡DČÜ×X  Ç,=!š<’úu '^)@ â.ä色wČ {ř§‘†Ä=%WŐ)Ha_iö…dDď<¤üKÚŁţ•ń|:€âµgJ'¸'ńŹ´ůŠĄv ‹|kUsEvóKą ď­)˙$+Bďčťľ‘ťĽÁ1­čŽh±'opcŚú…z¬őYs<™]ľ®Ä@î`ázr[Íłş[ž/÷ N§…äG# ˘›…ü”Ü`âR Ż’ŰŽ’.‚®vTy)ŚmN裻8Ć3Ž­ú§ŔéoP#‡˘“Úd•†¸űMŹ4|Éţ@Ö«Ąv¨! %‹O$—Ľ–Mrß@}/ťĆ2”M-E:đ7h2W ăňŚJ02‘Üt6d{>ťW9 wôm]¦ĽĆ ęŁ­Ş"GwýĚĘ3 ÎŮĦtĄńôşQŚőMčě®&ťş"3î°ňUđŹ$šjŻhyeĄ“$l!·›……ldbH‰óć„ä’a!"+ÎxĄ­.™ü…<ť"2‹6ś&¤kÍ+sŔż$‡ÝŔęMJŻ@V|޵é´P›IŔQ"(tZ%‘2­”QÄtĂ"í"ĚíO$ŕĄÄ* čx©6‰QőK>^í-B0Q‘{€ĎţÄ<špU99Ž+…˙˝ŔĎN ô?ĺ|¤ŔťÖ ©‰nmB]C†×ᡜsU4_^v'Ú Ą]K,¦šV‘Ô¶¨ú‚Gp<äR;f0ÄÁźsŹ%ü:¦EŞő T˝ĺě)âµęłä\Ç&±Ł”¬™äŕ±ĂGB™fjôNlS'*[Ě«©waL™š§ĄĎ"Ž>Ž•É˘VGN,­-Ę k§Jdv ?¸], ˛e˘˘ÓŚi%B>ę9f´7Ř(î/š\şw q¤YńóSţ R!ş5/gLi1aDRXBq…m˘ěŞÂ‰rRQ~•źKŚČeŐ¶ô˘ś.ÝÁ‰¨nźî«ŹU<ŚAĽn´Ş ‚ ¬=ÇÎĘŇdÄܱa¨UJ<×.Q*6ÖćëVâR&bˇ›ý}"dgľdR1g]MÚ—d fľË[´M}U¤¬őĂÖ(oŕTőŁ›™aĚ"ÜNŐ.É„Ău^‡OśÚÜgÄť¨ČÂđ ·Şą—JŽC»k´…ÂÓ)ŔrÉ…/Á* p:rm,őş.Ž8ĆĆ%‰JŔ‹ş‹ćźî,ţŠ;žŻťMňJfĺre6}7n‰‘ ¸Ń<ÁŚemş®č&K#éŃô@Â~ŕ“’ÇŠŽ˙…Fîg«ĄhŔűAŐĸŁýUńôşU„ĘS•Y™\MQSîŞ&™6 ŤUÔĽĘR2“Ňlđňń\íŽĂ)ů+JüŤIô׊Sfݏ“d‘Đ3ú+é1ż,„w@<“ÎD§"j,x'HEȨ§€gŐ0Ai啤ß@łňÚ­G-®zHŇéÁOŚ6áŰuô¸Štԟˇ%ĎžŚiSv€çŐ2 :Ä€öţŞptă-żŐNŚB@d$—Óóé|-:'ô R1‹Ć˛ŃQacńĽšţăöXéĄô ˙ý ʼný"§ţŹţWJ˛-`ĚVµ› „¦í¸ó@qŹ!wł#źˇçĂiYÉ4҉¦C7P˛xş&abk°ľŠ9žť+µoŚp-ę—ę´Ą˛Pxń{j´žĄi+J€dxG ‘¤YĎSN%É! bŤE–vŞC!ovOśJTry(îĚ›ă‰ţ„Ł‹îK.A¶ß«­2€Ěőˇ@k¶7łTf}Ś(MŹş8Y;X›…›şšR%·3ÇČqKĄrş@…)ÁŚ·$Čq ›Ý0 8…jÖ6dýÁ11%Üů,űW.;\]#Ŕ»I›{iú«ŕş[Š™$ŐŤi'¬éđ"ŚśĄM µ+‰Żś}!ąň+ši˝:;AĄ°U!Rb'9J xşťšÇ‘ľ·VśÚh$Â#!©v—D˙Šźđ<őÇ&Ą©Í_Z)±Dk~&Hh’2OÍ–W‰Ű´ňSöŐ|a„#¸»>é}¨–ŤLC@Xęn´šAxŘÇÎęaŃČSiőUŹ„ÝH:ę€ČL" ˛“»îâĚŁ 6żSÚT@FSĄ…ů ("zt)Äך9NbŮdĚ+˘É­.2ď±LPÔ˙ĹGý<_nî+fn2sŐčŠ ŚL‡ä[éURyŔ–±Ł¬ż†µ’:bí:ąĄRţ .Ä?žŘ;ó yžťĐ{PF8sWőGš ä\éÉWŇTrbb­ę´řŚzŮ0ÍÎáJŰT]©äHpi~^ 5¶?îÂü"_JčYç`z•ÚR;|ŃŁŢś‘ÎĹŇČÖ‚×Z ;˘\?WŚe˝ĂúŁŕ/,d1ť˝S:[TşŇĄőÎ.nG–M’z»}”t¸“túMíÉ,ú0aŚ707OŘٍ˛2 Çl€.bĎÍ8w&Oڵk¸}–}Żî›mÜŰ‹»µ”˙ }¤ĚeťĹFĎŐW7eWá'tŤěŢ YYÓăŁUŹÁ8ąnAYaăá'gQ`ąŁjol#¶M‚ŽŮWĐ1%ź)AUn\IśăŚMë÷UΊěyşpÖ­oTu˘›d,ÂŤ˘ ¬ µPÝ›7Ꞌ=ŞšŚšObS#@1‰ŕED bâ Ů,™’×5.ʉĚ‹ €–Éî.ĚĹ/‡KiC *1şŚ€¶‰ĎĘ[>@4?Ń<ú>Â/.>ăäžŠŁ ‰ĚĚÔŕŁíZĄľxž6±˝Ö=}\řő¤¤ŻÁtVQ›zCTĄŹ¸=ńązŞ…^lI í¸óY4¬1‰1ĆÝ!éçT÷ F/ŐZ¨äë;r(µoΩň)ť°y)n1ü™Żŕź7%ŇŚQŽA#I3Gxމ¦eÂ{ôjŞżJ'%®:–r­Ř˘ů7p(ŽvWCÍĘ1-XľŢjěł¶”Źs µwű%ÍôuĄ˝"@HÔŘy-YşQŁ 3ŮŤ˘h9ŁPnł,bq34xsSÔđĺô‰ł‚l~Šj“÷'ůfaî-ô)ułĺ† dqn’úm™€”ŻĹȸf±âš@ßÇŇvž7Ő#OÜg ńb§µňÉ4 Â;šÁŮMk»%\úş® Ą¸ňHţ[_’Ň3¦)5:Dl b )ű¸«„ň0ń·ˇâąąÓjv9#. Ä“F;„ ĎţŠ™? Şń ;y­9E?hDĘŐW4šéÇv6{ž5NĎ×?Eť´H4ÜD{EĘt%óOu‹0äłűWđMŐZ>#ĺத˘íJř)Qó´A4E˘#ŚŢB´Ń,ž;ă J'ÇŹ58đĂ'.?ţ|TäčáYźUB˘ynS€8;äÉ©sŮ%]¤µo˘‹µD9`ČmŰ™ô˛ĘĆ’˝Pű¦IwnKv@€™ ťČޱEĺ㴉݉;㯴đ\óňÚŚŠdđAÄb2D» ý”sł¬í€Ž!mÓ̧ÄÄŔ§víl,«”Óń’#=b[’©ô©™†á .ZŞ©DůŚ€Tj˛µQ‘PÝQüŤ”DŘřlâÍZĘě(Ěű¨ů;ň sý…ŇŔ6€? T2Uv©J† ĆB•!ä`÷|dĘߏ…QÖŽl¦ A§Ď&śe/vG~Jjˇo9f#˘›}ąÉü`m§ČÜo@ĚxpTT‹CiS¦î ~H }§Ť*ُľhd ´e4µ?䌊8WÁt·Îr”Ď Łî´Ş ”Dk"ôV“v9ŤiNiÍÉŔŚ‘aýV¶ŞLbcćŞD¦Ć!,Ů挙éf ?3UđţÔČc"aĄĂ…Uq¤őµźăËi¤WKiŤ đ2!Ĺ-Á)¬ ęMn€VHťń˙ąŰ’š¨Ć•ŕ”ľäËăgsÇšż‰*;§) Ľ6—S=;áŇ$F–guivĐÄŘĘçÉŔˇŇY‹đŐg…)‘őâ´‰¬'P~’21á±öuVFę‰@FYČęÍč˛ëuq-“|bóü«ŕ˛űăG±=¦ŢŐŃX@8˝I}ĂšGôüriGĹŰ’¸O# Iq`[’Â5˘ ™Ć-@őE€Žj9Ü3q{¸šě^Ŕ*¬V<–śé5Oć% şÎ.‡ůĄËě”ŮÝ?j»¤BűOóǟةçűzZ?Éţ¸-ľłş®ĄN—ř˙×u˘ÍţóűĄÖŹť“;Çš›µ%î=ÁMT˙$ą}“»)¦E(lĐĄđ VË˙Š®ľ”řOuţcţ´ ;T${eÉLUwüwů»Źü>Ĺ> ·Ł…kÓű‹iőđą? ňâ´źQÓÇĹţ9ňű®n[Ő˘ňä®!Ë’Ď•S»/đ˙®%WëŃwµ=ż˙žţëY¤Ý·˙«ýqOá8˙‹ýqJ˙QôFÉ„ťĎĺÉgÚ Ž¨3gď—%U%Oü'ýj§áýU–ÁkSř%tŰhăC˘#ŞÎ*›DÁţyrű'ôţ‡üçöU6Ž‘ä˙.N_e•ŰOŹ<{;ŹüSëG­?bčc?ňźő˘WtM)í˙ĆŻőéç¬óťłĎŔ –H3Q5€ ©BŕÇÄĆáä.@ $płd!sý#ř~<<+"ŔľxÓ ŔM›Ŕ0‡˙ęB™\€„Ŕt‘8K€@zŽB¦@F€ť&S `ËcbăP-`'ćÓ€ťř™{[”! ‘ eDh;¬ĎVŠEX0fKÄ9Ř-0IWfH°·ŔÎ ˛ 0Q…){`Č##x„™FňW<ń+®ç*x™˛<ą$9E[-qWW.(ÎI+6aaš@.Ây™24ŕóĚ ‘ŕóýxήÎÎ6޶_-ęż˙"bbăţĺĎ«p@át~Ńţ,/ł€;€mţ˘%îh^  u÷‹f˛@µ éÚWópř~<ß5°j>{‘-¨]cöK'XtŔâ÷ň»oÁÔ(€háĎw˙ď?ýG %€fI’q^D$.TĘł?ÇD *°AôÁ,ŔÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ŔQh†“p.ÂU¸=púažÁ(Ľ AČa!ÚbŠX#Ž™…ř!ÁH‹$ ÉQ"K‘5H1RŠT UHň=r9‡\Fş‘;Č2‚ü†ĽG1”˛Q=Ô µCą¨7„F˘ Đdt1šŹ ›Đr´=Ś6ˇçĐ«hÚŹ>CÇ0Ŕč3Äl0.ĆĂB±8, “c˱"¬ «Ć°V¬»‰őcϱwEŔ 6wB aAHXLXNŘH¨ $4Ú 7 „QÂ'"“¨K´&şůÄb21‡XH,#ÖŹ/{CÄ7$‰C2'ąI±¤TŇŇFŇnR#é,©›4H#“ÉÚdk˛9”, +Č…äťäĂä3ää!ň[ ťb@q¤řSâ(RĘjJĺĺ4ĺe2AUŁšRݨˇT5ŹZB­ˇ¶RŻQ‡¨4uš9ÍIKĄ­˘•Óhh÷iŻčtşÝ•N—ĐWŇËéGč—čôw †Çg(›gwŻL¦Ó‹ÇT071ëç™™oUX*¶*|‘Ę •J•&•*/T©Ş¦ŞŢŞ UóUËTŹ©^S}®FU3Să© Ô–«UŞťPëSSg©;¨‡Şg¨oT?¤~Yý‰YĂLĂOC¤Q ±_ăĽĆ cłx,!k «†u5Ä&±ÍŮ|v*»ý»‹=Ş©ˇ9C3J3WłRó”f?ăqřśtN ç(§—ó~ŠŢď)â)¦4Lą1e\kŞ–—–X«H«Q«Gë˝6®í§ť¦˝E»YűAÇJ'\'GgŹÎťçSŮSݧ §M=:ő®.ŞkĄˇ»Dwżn§îžľ^€žLo§Ţy˝çú}/ýTýmú§őG Xł $Ű Î<Ĺ5qo</ÇŰńQC]Ă@CĄa•a—á„‘ąŃ<ŁŐFŤFŚiĆ\ă$ămĆmĆŁ&&!&KMęMîšRMą¦)¦;L;LÇÍĚ͢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI˛äZ¦Yî¶Ľn…Z9YĄXUZ]łF­ť­%Ö»­»§§ąN“N«žÖgðń¶É¶©·°ĺŘŰ®¶m¶}agbg·Ĺ®Ăî“˝“}ş}Ťý= ‡Ů«Z~s´r:V:ޚΜî?}Ĺô–é/gXĎĎŘ3ă¶Ë)ÄiťS›ÓGggąsó‹‰K‚Ë.—>.›ĆÝČ˝äJtőq]ázŇőť›ł›Âí¨ŰŻî6îiî‡ÜźĚ4ź)žY3sĐĂČCŕQĺŃ? ź•0k߬~OCOgµç#/c/‘W­×°·ĄwŞ÷aď>ö>rźă>ă<7Ţ2ŢY_Ě7Ŕ·Č·ËOĂož_…ßC#˙d˙z˙ѧ€%g‰A[űřz|!żŽ?:Űeö˛ŮíAŚ ąAAŹ‚­‚ĺÁ­!hČě­!÷çΑÎi…P~čÖĐaća‹Ă~ '…‡…W†?ŽpXŃ1—5wŃÜCsßDúD–DŢ›g1O9Ż-J5*>Ş.j<Ú7ş4ş?Ć.fYĚŐXťXIlK9.*®6nlľßüíó‡âťâ ă{/Č]pyˇÎÂô…§©.,:–@LN8”đA*¨Ś%ňw%Ž yÂÂg"/Ń6ŃŘC\*NňH*Mz’쑼5y$Ĺ3Ą,ĺą„'©ĽL LÝ›:žšv m2=:˝1’‘qBŞ!M“¶gęgćfvˬe…˛ţĹn‹·/•Ékł¬Y- ¶B¦čTZ(×*˛geWfżÍ‰Ę9–«ž+ÍíĚłĘŰ7śďź˙íÂá’¶Ą†KW-X潬j9˛‰Š®Ű—Ř(Üxĺ‡oĘż™Ü”´©«ÄądĎfŇféćŢ-ž[–Ş—ć—n ŮÚ´ ßV´íőöEŰ/—Í(Ű»¶CąŁż<¸Ľe§ÉÎÍ;?T¤TôTúT6îŇݵa×řnŃî{Ľö4ěŐŰ[Ľ÷ý>ÉľŰUUMŐfŐeűIűł÷?®‰Şéř–űm]­NmqíÇŇý#¶×ąÔŐŇ=TRŹÖ+ëGÇľţťďw- 6 UŤśĆâ#pDyäé÷ ß÷ :ÚvŚ{¬áÓvg/jBšňšF›Sšű[b[şOĚ>ŃÖęŢzüGŰś499â?rýéü§CĎdĎ&žţ˘ţË®/~řŐë×ÎŃѡ—ň—“żm|ĄýęŔëŻŰĆÂĆľÉx31^ôVűíÁwÜwďŁßOä| (˙hů±őSЧű“““˙óüc3-Ű cHRMz%€ů˙€éu0ę`:o’_ĹF?ăIDATxÚěýÉ–$;š¤ ~xIG›îŕ×=2"»ŞkWçôCö›ő¶–Ýu2+3"Üďd“N˘2đô‚~lŢO`}‹ęŞ",`@?ýDîá˙ő˙đHó €űĸÚ~ŕ€ä€ůř„ő3€ó€÷px tw@â „¶RŚúoŰóëg€4É­€äŕć§GŔŻn€¦Űď ĆHóă&€Ćýíß0Źç|¸v0ť8O$Ŕá€äŕ›ŔţöŔw@łľćĂ†Ż€;ç€yx\ؤ¤i†óđzĺÍ-ŹĎő]śŇ<ć—Áˇź ĆMą~ćđÝ=0żÍő_ľíö8˝|â|p©ĚćĎ5×@śöeO{ŕÍ_˙7 ş©Ü#ç;Ŕ‡řС[ĐÓůŕ&řő Ż@{űHÓxţő˙ xď€vł¦cÚëŔß­€4ĎŔđúcšőŕSĆýG ąú„~›oĂë#°ą˙ ěnÎŔ˙ tý`*ęŚ ŕšř¦¦ó+ŕÜ „fřö Ëűú­pÜ+V=Ŕ8®ż®čăę-?ţ7ŔŻ7@r €ßö€O`ł‹€0Ś›"ŕ YO€ +Ŕ/°FŠ'`<¬ßü0+NLqâ<lîýÜ ŕgM’«÷B{ ťźÔ6e7öW?IĆĐVúőş B4µ ť”V@b,ým:ěěű›‚‚ ˘Řv€Khw7Ŕřô;°şyL§Ż@7Äę8€F81ÖŻ”f2Ť#ŕô÷?ót^ ¤ń„ő u%Ŕy!ńŽO@»ÚixHMýý8s<]÷Ź·ĺ]„é\w¤éţ¦ n[ĎÍŻĎäÇ×iL+ZlĐžÓëW iwÓ  éę×#D`>îßÜqšĘýu¬€ä0=|şëzÂÓ}oÂŞśK|».«KósAa—q—ń=Ł0ş‚hô¤ď×ŕĺő3Đ­Ż'®Š 4•ŻÉíxßVNę|(O_ˇ6ˇ0{v¦ąě-1ŤŔt>—ý<ů[`ŹŔđô°ąű ŕ›U}_±śÇn˘š_J€szÇĐÚNˇéęţ?<ˇ˝]ěxĎŔEŚńđQv_wőĐ®APd>?~óčÚÚiýśž˙úëw@v€ó]Ь€8ś€t8ÝÍBpĂąđ5™ŢsĺąnĚ_ţŕ:!_8`žŹuĂ_¦ë¬ŇJF \mćsŮ]łÚuć§Ź€_mĐmꕝô®đÓđRp«hCÇS,\[rÂt+ Ű\ĎżýŔęţ-.E Öđń¸`¦Ь®ËĐOf?•ŮĐĹŃäĘL z_ůĐx>)­¦ đnS®_wA÷«é>@F´B=â]Ć—Ď@ý7`:<ηeU Űj& ˝¶}AUŢő@L§ň݉xş/>”ÓRŰ4€g $űň°ýPľ :-éżâ…Óă9Ín»Ŕ¤Zć§Âyß•µäúÔ˙ڧŻŔ<®Öćy.śš §ŕwďtx¬ü¸O@íŰÂ&Ďç#ŕzWVfłľ.?Oń Śç× »ŚË¸Śďť îPáĽŇęşś®˝U*ŹĺÜ>N'Ŕy±6›ĹÓ}ĆÓ°ľ˙7  `®{˛xźăĂW Ű…ÜÜkvÓéŕ}4ťŘ¨-t6žŔ©6ák}Šä6¬€1&Ŕ‹HŽ\ĺÉżę*¦@·uŮxňo8 ´µľŁJ›kŔigŽ+Ŕ$ÁíĄÍ OźÉ7퓮鿺śë((i˙ „Ő`ŁZçX1cÔîôRvl1\Ú·Óń¸î=0˝ü_ä lł~ €pî\?Łk{Ŕ‹Ĺč"F ‡G =…łsÉ^l—꛺_qŤ qa­ëĘŽj|GÜđÚô€ý8ÁŕőáX_ßÇ×Ď@»ůĚÓ3Đě~Đ řőâ4”F€ łŁjµ°€ÖŢ<˝–S…÷ő ˇ;hl¦šŽ8•Hq(˙«PIĐĽ5ÇO@ŘĽ/ś¸ž >qűp:—¨E}j*šXoË7NźBCV'Ś U: ú¤ă@c|t*=žö€ßýPĎ%bŽB ĚC,óÄĄž?-ĐV•Om…ŚçcÁņ©kË= m„Í´”uVX|›Rš€Éřh}‹ĹÁĄŠűtb nz ž…íŤűŻäۦ'iĽ °Ë¸ŚËřÎQŘ4$EĎţ߀tőľŕĂY‡`uőoéĐlČJ¨vs_ž”Ň1ąő5ŹR]Ť[W0”&r}-Ć„ö-Ŕôč¶×…_0쮸ľŇ0Ös’ŞĎ:‡ qźŽĺDĎO€[ďoß)WV¸ý¤€‹ç|W ńٕ׿ °Ë¸ŚËřžQXŰöAp~X˝|ř±üRśŢÝzLăŻ@#ľţXŠ­ą%këušMS¬ŹÎ Ě’ ‚P%"-ŞEVÓ4ţK4Úât-ťŃú¶ ¶ůő#€TĽăTvű°˝g`|ů „Ý}yf›ZJ¬‡Ż{…j.ö;:ó‹/›Đt+`JŔŃ•}Ă®t>ăá„Đq:&ĹcÝá]S.ďbůěŞ+Ąń „ÍM™[ă&ćY+ç Ď‘cTŮm8®D\ŁwWŐOő/«EV¶H·?lďYzt?‘5ńóđZĐ“xÄő¨ę#Ą‚6{JĹJ@‚4eŞQÚgŻ·/HDWŇ4-ŕąf'q żŘĄ]¨,Őöíg˝I\X»R:®]¤® «ŞŹˇĚmd·8TZt÷@JmąŹ~}ŻC g}/îË˝â)šľź‚ŞÄZ&ÓĘoČuşDĺă¬Ú8Ď@{őOŻ…qKÂ×±vuę$áŰ·€›†‚wLÇçkŰ´ZµRďELno€¸˙řţú…Ć#jßľĆS*\jjOźzŠ@p´†…Ü…űôYÄ#ĐÜ|’Ř®®©ś˛±u{ Ű^)ÖSE—fpµ» °Ë¸ŚËřÎQXŠ ŐLą#IUŐM\ó§}ŮM -˝•UTečČ˝Ťi8l" ŽąĐz`Ęn©JYDĎň#šľíĚŔĂ•}2Ť€ř;ń)Ó3pŹ€zň}Ĺ_VëȵHŰSUZĹX+óëŕ775úŞřPőĐRđ u6ý{˛XÚźµß5Ŕ|xÚ›€4'¤©=Đęž%Ń×nő ­ď~)ś¬*QW@Ó÷Ŕ<|đ›‚Vʇ,“w>>«7?nh+6Ôüj–LÄUwccB_?!¬°Ţf$żşÚŐ>ĂđlV?&ĹUmSĄ_(łđ;rgj)>Q5Äy±rMͤ c,kÉpĐüTŘĂ,E›ÉőA;th^ý¤óĚ'éă{`ž…  Yď*f@˘BX0ż ľX'‰¤BSĐý< d>íuYiY‰¶_“úa›µâ?ČÚľŽ/ í¶Ŕđô'°ľű‹ŽÝd:x_q˘jýDkO]ś[ť˝ÖäţG#ČĄ.ÔżU'íV€ö>âńüĚî§Ĺąa.Ó¸a$׋Ǘ?€Đ^•O'd' Ăj{M®Ăćˇu"Ĺßş°iv—qß3 ;ź>«Í_TÝ›€y:´µ2Őô;ŕřńď@wóSݱ…ăÂ8=}®Ö÷Ŕ· Zç<—RZpë»ŃßÓĂ˙Ř˝|ę*#&Ě GmŰŇFĄW  ; ó 0Ů.ú…¬)Ď\ůŻeĄ•°*ŘÇ5Đě~5áe×˝Żô>~ڇŻäŽÎ@0´@.¬1ŽűÂbČMÁş&Ť,ŚäZ¤j.«»wuß6ŐĚŐbć ľţ °y[x(PŁćsW™k°zó/Ŕ||*sᩪňŽO@ł»« ‹)¤U•Ž>•ŐtOš¬tĆÓ+Đ_ż%k©U‡k– ě~}ĄI´ęjbüí•ÇŃ$I‰vÖ$ĹĘ“†HâŹvoéő©°{rż(B~Ŕ­~(ĽŹř2Uľ’5Jv@šĹŻ]h ű–ÜYiŤš[ýľ;’«ib|4¦qÖÉkţĚe%«ă84•ď“ň>ůMť‚AÓ Ř?>ýzWf¬ßÜĚĺ…k¬żR¨Ç‘őqĚ‘¬)‹ÓH4}O…‡u‹>V7†˛NO’{NbRÇBřn ř8Ç—=°zóą÷#FL*ë­łz«ÜYćąśŇLť7ľ~÷ÖóăČuv}Ň »ŚË¸Śď…uÝ[JOżhW-pzu@ŽĺL®“műCÁPÓńEMĐ]m f9>ëŰ_€¤ZŰé ç ô•Ăš§'Ŕ9y<n#W¬=Đ©JbN;`˙ĺcůwÓËM¬ĽtäB"bšĽxĄĄĎeßÍ˝ >˙´oţV®_şˇôňJöGs⪞~â®ÂjMî#ˇÚśO/@·ľ‚j¸ć<Ő(`JčľâáTp“íň;/şöH@ö€ďv`őť°{_vÔYśá°ZăţhwR©§ď©2DňP“ŻşWW@|Ť…#SĹP,LvI{)SýzéđR®\ ~g>qµ;UnÉĘŃ•oŐ» űĎdSł[L?‘[ń4´›y[aU9Ą3:.ôŔüň `˝o (vĎęćÄ îě¦đJq¬®!Ö ęĹ.ĹŠ B[¦ÖŞâŰMeŽ4ź¦ĽZ`:yWlfsDuĹÚ˝OeU¬ßü+Ź_ 7$T› ąEwđ2řË6Ô«2‡ŚEýTę?ąž¸ĄŢ4®MŔj}ŚĂOGŔŻÖŔpú;°k~Úí©śÜ’ěűrÖiBOő\Ó7b$÷MÇŘ)$`~‘;ŢrŰ[żĘpAa—q—ńťŁ0=eçIÎJ 0Ű):&+kI$k©Zj«ěŘ–¤o€qr@ß_“]Ť¬Ç]ę­s¸nG©dé$< eşŹľ)řBűç¸˙DîŐŇ“Ű\Ąäv4ÍŔ$WŚóh®ßůjéS¨‡^nz‚űŐ p7:oż’(Öß×mË)Ý2n~Ó"eÇZŐĹď€ĆŻë,IÁ?¨µ˘x~]I;^çÖ\’ôhMŮc㼒vÔfśž?ë7?|š=9ĺ% Ľ3ÍŞ"8ÓF żţźţV×÷Ŕ$oç ~”;in­ş4Ö)X­ü‡xx\×—×ŃŢk´RJ7/7·î-0ś_€îꇂMÜ,U×Ră^ßT„Neµ }¦[Wž«{Lš™Ř“ÄE†mye믜ç6©3©.‚N·báĚ%,#Ô`¸LΡ®^Á>18b{sy-Ô˙ ° gŔËkL«Ô2fro˛ő´šĂŞx+}łv•ʦj íťLűŢ—ůĚ5Sy €p}0ÔŚĐĺ8¨.ą-TzLa(ť?Îűř•âˇ~Oĺ¢ŽÔYgéŐń⪠‹ ‰ýt ;ŮY‡ňąš›źČ.ĘŇ*Ě㤠v—qß; “‡şé¤„ Öwk]Äa kjtÂ÷ŤŞęÔétE®}ČůÓţęöMÁb¶“7k`zř˛Bwx}‚v3µčŹkŕüú߀őŐ/Ŕ<5@XŇđ\¸$ˇ0ŰŤý ¤Aő)íWŐ«Ë”ÍÚ§Öďß&`:˝€utĘŹÜşäŹ`şłf˝â~śľü ¬n>„č[Wvݤľ;‘5čĆľ­ßSúä 5Í…=ńA= CŮW§ń3ŕŮ•źřMEšţú}at§f±oۦęL0KL3ČąiBWöU©ĚÄpąx(÷W•¦8Wź[ÓXYÚ@(8]ꡠJâö ‡G`T]’ű«/Üĺř倻z¦.ĚĘ ŻŔůĺňJIUëźÄsEyŠM@^ĘkdţSşĚsáw|nŐ+ś”QFŇ[iĚ»­) KjW•Ë3ÇÚsĹ8†Z±VITuŻúľZ넝|A¦)ɵxUůPy“XUn,WűMî„uł •-ő[rߥآpý¶ny±ÄúoUHĺ›Ę|¤čĹbWÖ†đ—>u»ľÎ_żIŢ˙ZEÂ{c,W«×Y­Ţ“ÎRúěý ąŁ3W!ĺë«“ÜŔsSÖż Úľ«sęLăą[SvŇÁżĆéÂ…]Će\Ć÷ŽÂlG˛˝k*§Öi|â´)ĎőĽÇ‚Yć9ˇß‘óE”Ľb,C\Óóź€ď7@Ű`”˘ÇzÍĐtë¨*4~ú«_ČýVŮž˝:ŽĎęÄ UĺśF±W-ŕ…€tţ·} îŤĘM™ÎSE ÂÖ9(×˙Ěżtś^ßőd§3ŰUTłSGż? óĺW÷@šż’{˘şŰuÇŢî€x^îŇňcŘű@q[ó\XËfáa]«ęÚ>ưęî Scűí\±‰ćˇńď*󨪫_óńĐíŢ3Ą˛ÍUWůŻńŰź€t–ĘĚ]§ęmEľęťśăčŢţçˇ u;Ćq&×^Ý7Ţmµ7ĂxOwŕ_Č 2ńJň„fÍ·uYËAAüW®5/\|-wj® D. nZżŕžőV6]«Ż©:¦弒l]iö€ó÷@ň#Çębm­ 'v•Y¶` Őţö€k«ój‘Ąa+猡ÜkŻî“Ö˙gŔ·ďËę˛În x\áÍAĎłŕW 0?O›®Ü/sév@ă°?şôS&Ěżq Kó3‚®AŠÂ[€“ĽRnçîČťÂáákďŠ%W¸‘"7p\PŘe\Će|÷(¬úŻ[Őf:MűžŞŻl4čzö%iOk6@Xß’ë}rű–ÎHŻ?©‚9Ş R]ěE±%Ď€ń•Üną;žŞă¨NÚvş^xYŞŁöRa%=żU Ń9\J4uLÚÉu%µšf~öcu"µšV;•z*k k©»ÉdČA4ŕ|uŃPů°éWdG'éÔĄ ź‡ę‰ŢЧľ˛÷R±WŹs©OMa"şŐ]ůěš«áéŔúý˙ťÜĺgšr_/=içgÚţ HĆ mČţśR{ĺOzD«cĘĂóX¦´ţĆ63Ýë—_¶oÉ]–˝ o9y‰ă»4×"cj’j|=XO…€˝î‘~G÷(ť¤Ŕj€x~$×|˝%‡ú˛ÚŤT“k˘`Fľ#oNOý»ĘÍÉĺ­ßé<ÔŚŞŔ§óŻÉ-٦|ĺóŠřÍsy5Ó0ꎜŞN l®/Ü*ünwN¸~(g‘¸dî őy™·­“5_ăxZF`>WEŚí?©ů'îCăć•jf#äž8y±JÝ4Ŕjs ňɰJeSí{âfé†ÄA4[J'¦Tׇ3ŕúr»·lđUŮK-CPÄv}ŚMő/3Ž%+Ŕ÷{ş´ĘúVU4´@ÓI7´Ěa8»Ş¸IśÔQaT† ’ĄúŰż’»ä´Ďc­y †ş¸ Éf¬ęÜ0ÉŃĽČ»¦-;dÖńmČ9óáhď*o¨žĐőö=ąâ9Íűş%–ęőű:Ď.H‘9¦h"0#űýĘK6ž¦r}ŘŢ-8Á© ±QâĄ&WżŞz-›Ő›Â*Ńݨ|\ÄŞ~ůrç©*łI÷]DŮů@N&µ•f(Oü¦VrM µ;¸@ ć¶˘ —·­Üô’˛|bÍr|9ť 7'LdÎhň+žö`žy˛#°{ó/dʰy<“SŻâë0:l•Ůţ’€ĐuŔđđ¸z˙¦Óë-4KĘ»04ş¦óg ŮÔLos0Ö9)ô@׼¦ÓźäÄxaŘőŤśE Fľ °Ë¸ŚËřžQ<ڬrdţ˘rLĽLÎÝ€4Éťň¦ŘŢÉĄ@>Ą‡˛…K,—+)86  µ@?“ŤĄJ Ú-­r§-ď€×·Ő^Ú%á tÜxË·Ćbć}F=ź[M¬ęë‘4Î%T¬Ô.ňŤ őĽĎ‰o“–ĺH5 Oänľtz&÷ńĄnÄgyc6 ¨-(R{ođJRţăTXˇějË?ˇ°^+›Ł$ĘôßĎ=ŮA´i®Éľďć˘.©ňAâéÜj °×}ěËťrĆ[…ĹLRy+y!Ó×#Eář•ś Ş\QőEúIźNţ0Ľ~†ăĐ\oŔý §(ă]µŞµ>ËD®ś†Ő[Ş2žr –(@¦Ž)ŕ…MĂ S¦űhłÝ÷Ŕńů`ĄZł\䦊ćĂ' ]żf]y˙#„űr·†Ý3Ýeuľ¦řČ5/÷Ć 8őÓ‰Ťťt Ö+`|úLVĆŤšĽmHYîorôÓ·Cßz·&{~Z\mö€ßŢ›őĄ‹Łó图t4¬gZ¶©˛ĚŞ;ťşjç˛>—!ú¶†qL“VŽVÚ©°Ăłúy­á‹:˙2.ă2ľw¦}É’«-‚n.üČJ4TRw¸B¸Ú«ąz2ŤĎ•1×đŚĎź€vuŚâ§Ěí«vcŐßSATÍ|4¨ąţ~Žláäć4ŰôYÄyő=źż”µyWM#ßć6‹ÉĚŽ6î3ŕÝ-ąÖÖ÷Ŕđé?·ŮŤj¦V“í¦˝ż˙Ŕ[w~4Ť&#<ę§ł„›Ľ˝–wĎÎýma¤˛|±›+ŔT=Tćc4ë…_R™§šăŠsńe¨ëĐŞHÇÂĘU÷˛ |ĺ§ä…`\}+ë¨ r…Ú7âŹÎäLqţTn˛w }ôá=03“=ű]˙B®ęä|ţ ´»żA®HNň{Lçײ–¦8˝ŐU§Šâ}í‘TÚPF 5ĽŘşđCYăóŻŔęÝż‚uĽf§‡X¨Z ś<=Q˛¬¸)üć<}Úî-ą—ÖPń;~Uz\^Ղ۲ÔÎyÎŹ@×­ »dŮS\ ÷z<Ń=U&iffĎÔŽă-Ő[Bţ¨@âšś6Űoď€ăăż×ë×÷vq´ÉŽc]a훢šró–Ü?뼾+`|ţ8ĺoÚ=’’îXřč~ű pzřŹ »ŚË¸Śď…ŤORĎ_‰0˝»őť‰Q’’X¸I‰5–Yý ćNŐÝüH®™K7r Ý”}[ş§řŞţÁˇě‡®ąÎŻ˙čý=٧ßYÖKĺz¬ ©Š’öŘĂŕ”â']¸Ż™I(ĎYŞ_swĽą_­(ŽĎZ]ýŰ Ęě±ěirë»ŰŠGäá)W5cLd¦Múžśötúş'׌´×IŹŢ´Űî›ęĘÓB5©ŐЬh‡ĺűŮYß›ş/HC¸cEÖTőą*ŁĄ éŻĘ{IG&gQĂ_ҙꪩDŁTZS,3)µ·˛©-ëgrŹ|â¦ýJbąđxë ¶rAľ`0?}.ď%"ČK[×Ď@óć—Š%SUB™§‚ąG ©Ćńß˙M{eůęť*©Ţj]»%gJé űë÷@_ů6-ѱź tBOMa»ć$ÇÚë‚č­îŻU'‡Ňt‚“ĎížśĆdžhAÚ®są/Â׫vŮőˇô «‚ř´żőő× Wň桠žĆ˛/ß›óń´|.«ko®€ĐÎ@°DĄş†őmÍ)âçęgcČ]aéç]ů‰–sL¸úpRŤmoČęß_¸°Ë¸ŚËřŢQňÚ‚˛|ŹŇ…5€§váĎŻż•=6XÍk*{rŁLfeüJĺ1U]r~úľ’˝ŔͱŰzµÔąţ´«·eçÔž†uKĹňD˙˘kNÓ3Đľů _?\˝­~!«Ľ»ćůąrš—§ře\Će|Ç(lőöß ËC[ýě­Ş¨łčę=Ěł*ÔĄóŽNN›g˛‚ů|Rý˘!wBIß,§íeŞť:ç—Żdż|s ůhn•˝(Otęn?‰e»âáP^3X*ń´üî¦î ćAęËîę¦L‡#Đ®¤wS]ić­®úŽü?µsĘĂËaŞ*ŞWQŰńߊóR>MZ0r _SzÚÍ; ž>~ÄŹ’ĎU3Úüµ`Ó7])ó)ŐÝŇ<ÝŮK+Fąąß’;[Í˝séE•Z˛–]nń™!ZUiY3ĄňŚ^}y\Ţż¸-0ÇDz»ŠŁtqćŁR×eĺ/‚fx<‘ťÎvÍ8€•ż\Vzüz[™YíósćýW lßW´eLhCöŰgĺ{w#¨ŢmşĽTřAŽZ3«U™ářô÷ňąBwGNgŃs*ź¸d‡‡máLçÓą3·±~ĎTVµď©•c}… Đú+`’W˝ÖäĘow¤%'?úNL܇zžXu@:?ŢÝ,Ěąś'Ěëeaű z÷üúXŘ:}®y ¶µ^űŚ+`vuťOOŔ­kç†zx›N^„cAU™]­¬™}O-­JŞĂ¶ŔxúLq7SâÁĺ)~—qß1 łž¦.Κ™˘w·Żźf 8UĐ&u˙)ßxúŰ·Ŕx:Ôß‘¬Îęr_X(Śôä–&Ą˝^Óá#Ű}=ÉŐ§\Ďć8Ś€ëŻ aąAD`’3gS+V÷9~śUŮjv´ĺ÷őuO3' NŔ|~üć Đ®îČ˝ q|"{xËSßz$ĺW)ŢÍŠ^â¤Î@Óŕ´˙řÝ=Đóż&WŻX1y`„›ż»Ě¦ăcÁhz}ý¦úÔ¬W.Ufg’o¸)xĐtI‹ %Ĺn1qć…{(ě’1,6?}áČ”k%Í˝C§X‡fżűľüčÖ ¬Ţ»üÄ"ůŘ‘‹fęé·o)=zŇťăĘ}IrmCu+uĹj¶g ěî εL)Ý#u}lnÉŽoÉŇă]™ë1”Gčéí–sĂř+áŐţČú;c‚Ř\ óĽ'»ŕůÝ; >?©ß”÷őöîkŞ˛ęďâ"ˇB=ó|Úő0Ë3ą“Ňí¶ž˘ÚžÜżąąű/oę[i®$VCwe˝9eČ“FEÝ—ŹäšľáÍ÷E7­şĽę;.·[g~v±`RQŽş_ăţWJZ{:ńüčÔdжŔ))ŇŞĆŞ.[™ŮËSü2.ă2ľcć›…#•2~˝|\öÇ,Â6+`~VuRůz=ŮÂşĚ}ÍeÉy-Ş@ťëYw©–ŽI>“ŞW†ť4Ň騣˝dˇę†¸íŔĂ4­¶Qb^ÜP$;µ»ąz˘ŞĂ.4Ýb*”ÓWk‘ľż%gÉ0ď×_Aî$ťkÖ¤ö̰}Cî5›†?€V¸OŔß&bž”ŢÎÓÚ`žâňnŹrÄ˙đť­WŔęîGŕđéѶ§e˝ň\f¸ßüx›Ii\ą×ba¤ďµg ˇK^é±z´ąE/§ĽrǨzZGjm1<ú ĐÜýLĎżóá hŻ>hC×í$»ˇź˙Ö÷ˇ¤(ÝĄžĘŠ(9٦DVĆ9yĚjކ#0«Ži~ůâ¶ęg—Ď]´ĐĄFĘse[0Kcxü řŐ-ŐąL X=0k:=~€VźHĚHs&yĄ¶rˬÝaˇk :0}V2[{r‡fN]”&h"×mu_T'2ÂÄErµÎf€Ó‚ńv¨ŽTVeVBr§Ěę3p><×ď˙Ď@‡îEj€Y>e7±lĘĘR44éăU^tŕ ‘Ů]ž*ł¸PęşĎŻeeĘ#L«Đ7~8”°­şŰ© а’JîŹ_ÉJnőQ¨˙Ô|îU)–gěke*çĂľ 1ż~uS8#ë« =0=ü'Đn~";a/~¨Îş¦Fö…ˇsKđ`'’Ż€ďÉŮď­Ň3ă±`mß*?L~ąŻý-ä^ĺŤZGíŞp”öŤpŐÎű`<üÄu ÷)[Ç®k€ůőc67wý˝2·ŹâRꀴj€ ç†a|u*ßSi×”ś„ó WďČ}Žë·˙kÁˇĘ+RZ»XfťCŻŐŐăřDö(Ľ °Ë¸ŚËřžQX’~jsSÎçR©Ěó'  Ć…Ç–şÉ|Łó|UÓ¨Ş˘*RŞ˛^śZÔ¦_ź Ź ˝ÖŞrŢ˙»4ś>ýć—‚´c«:9*×W=ŚJčó-9ÇŰ“OÓ’ýą•5ÂMeaôIuzWÖ¤:Ý”mn^š‹;ů"™ŇÇ&:W8ŁnÄÁÉiK:őcľj÷€i˙¤«0uµGÓµen“¸łY/Şîż«`‹dO4íźRŔKŰyB\ŐÔ“đú„Ő 9ÁPlŃ|x$;phĎźŚs\TU‰3O´MŢţ™­˙.Ul8í9ľ›ć`N·ŔxÚqÜý›÷ÄBF1›ű ćţÁT"o;cÁ_¦ÎSeíř¸®vzHmŻnJ)ÂfóąźËşjÄî‰Ăć‚/Ô'ŕĺç¶€oä*q. ť_˝’ÓçzSg[ß&e}ť÷@w÷ N/@ď,% ůÇľ)8ZlQî%Hęo1Oc}_Twţ˝ž tMý59Ó@g‹áđ@vUńJ§~bjŻš¸VŽś™×?ÍUśŽŹ@jŠ¨ä—žXßľĆÓ 0śÎ@łZ•UažtKĎ~Ş ±Pdű3%ŤluUř8¬ÇFnŮ6™“‡´ v—qß; óňŔrq]aLšÍß îH"´¦:7HÇ4Ť˛-Ő¦«H/–VSyä™ůz"#ߪ´ĺix´ýĎäÚśŹâş‚}Úöšěl)Ţ!›5„ş©Gueî´~˝+Đ^9ő`µ/÷z)q¤‰7=š/¨Í®AxÄvćZQ2˙ŐT™¸YÚş4­jX›«Š&6 řęČÚ 0™?zÍ6źGéÎFŔďpüúlnîÉŽíő; ťN䞊öę˛KąŮvŹä–!ÇÓµÂć-Ú5ĐoĺŇu*ó _ŤvłÎ/O@łjü)@<=Sôwľşî“ş,_Ë'RőŮć–ą0GŞážź…Á¤”éVJ=TT.T le&űž¬˙RĹŮň6®0tć ë[ 1Ź]~ÍU †‚żâ¬üĐ·@:|%WC+–ęPř©(‡UŢCOîě‹Ň÷‹Ůy} ×ÖsĄ•rU.UŹ-͆zZb|˘xxY˙ăDóGąÎ/«Ű˙R˝…ą5Đ·Íâűű„nxůÇl·…/ë7äţĺŕVŔŞmY®dÇg [öśę”Łł‚:O¤%Ôš1ňş¬^ű¦Č…ĺüpţ 4W?VÚôú¦v¬ žV}6ĐŐ•ßż °Ë¸ŚËř®ą0ń>ŞÖ)‘H®Ű§g`l{Ŕwk NŹ@Óż-XL'm%úFă2tFudg‹Ü=ŻŠa ŚSĹMß ×Óř™Ü_©¬ÉĘX¸’ÜŃ&Erx},glí˝óÔQÝJú3ľF/YÝY•ţ=źäJ–€¶_ÓT«Ą~±ű™»ąş˙u=óÂIgř¦'gČó|:­úű”Qd®^mÁtŻ_˙h¶weĆÄŞ47/źzĺBĹ hW»Â°ŘTůŞÁI®b«Ăv×@?’{ĐÂć=™ŔŹŞwĺS›.u]0Żü{sĹv,lfc^Z§2źrţ´ěQąř·Wd_3iÄT)Î’˛XÝýpó 4Ă}ÁůŠä˙¤®bmëľ0q»Î_˙¬nú‚Ł•2…a)oČŠp)ż-Ó×d#żľ§äś*#¦0T­Ŕşązź.łúxć¨ŢŇmÁqÖEčjçś`Ś4žu¶PnŁr<_ČÎYZ‡›w˙…Ňc SQôĺtěŁ,uw€«~I±Ň–*Ë=Ő÷ZWŇon ëţzr óćTŃ×Ő»ľ#×ýć9Pú%®ot®9­aµćaŃĎë*:¶^ijꀤcv—qß3 ›‡r*/‹Älaś¶ß©śŻŔl¦â wŠđÝ=dµ±=ĹĄäZäŽHíHuËę ±ôĆćl);¨ÚÍg©©:rëóč¶·Ŕ4śČú)ĺ˛ ?Ryö[˛zu™úLW.đúžě˝©ó¶%ĺLÚ+Î@đK\łćó§‚őĚ+]ú#q…ën·¦—_3\ČŢ›^|ÇčŻî ‹d)2–E yŰ X­ďĘ˙ŞýÍśÎbťl'·)i¸ćç2“VÚš?S+›Ň@ËâCÜŞ ,ëžS-X^bNĄ'ZÝ‘]ś©·ä¤V»5†ó#°şú…¬É»Ônv@ÔţŻ‚óç? Ţ÷n óŘčuBuŁ3ßŃx&'98˝Żń\uqk–ú«wueŞr}ü\ĐŤňç•á¤ŐeUŐůH®…™§«4w,rŐ-ŰŢýw©ľNĎĽ3ž±°˘Ń8ÇT™Ç9N˘ąŕwĺnĘLlNäâ¤`SŇ]ݬâIUďVw­p“ęČŞ~*uŞ\ˇmĆ,ź¶™˘ýüP0V!=ôt€u»%;â©ţ¨ Łtü1őŔ,˙öŞđG1.´Şă««ÁŽ!ľ®c™…ˇ”˙ŘUžNNpš'˙»z ú}ým¬ąDâ­[Ă\1(şíoř¶ë¦Ř—k ›5ä¤zyŔČäňżŚË¸Śď………K¤©źÚ0>ý°ůĺ˙A®CéaÝl~Ňů±>ˇĺž.Íę–śúgó›w‡ŞO¶6ÎHNi=»˛s&32Ň©{,űF®4ÉëU5‘L]=ĆčmÇ++¤<>ÆbčBĺněŚ]wŕFúlďÉ~[Ţüi+·˛´Ç·}Ţ×*É2)Úü $ډw–šL–/¨d™ć­Ü€ůáQ¶·˙F®1Ť§WrŚę8ľŤĺßryÓ>/ľŕřő#Đî6@Ó­Ę˝2Š'eeŹ|›†ť|íËË5ĺęóaÝ…ëŰrÍŢŘ´‘Ň!«ű¨DK9ť-d¬6Ŕüúđë+`–łčNYG{r§ÁéřZŤőĘu?BöŐMW/OŻ…Óś•;-ü¨U: f±CGXÔ¦ť'űŁ ßEőđŞ{TugÓ®Ę<_~ÖW˙pZóťĐS“"Ş›ô\ĘÇĘg‚@öÉH»`Ţší[ ©oDů‰ÝUY«řTp––*În^¸.‹3?ĺĂ€UWźe#<’}Y§Ô=ňődŽ' Y÷…Ń{}řo@·©•hů»ĄšŽŇüQbąféšÝ}ĺąŇTîťhşóiÖZŰ:‡CůĆ™6«»łżÂćHĂI¬Š%oKµp1KÝnSv{ů¬I´TW«j)–TÎÔTÇ]ů„ÔÖ«:}üő_ÄźZFNÍÁ6…šŻľ»–Ň$ŤO»¦8su8ţ„ćž\ÍÜěîYŔ``<~Ľ_\iRšµ•Ľşô)d§­y\“˝XżM§§Y˝%”ŃŹ˝ÖR'Ň ©Ö\“7»î8?ýúş¬‡öĺY]ŇĂš•í›RNňą·1•Š4U—x"ť]ü¦¬m3 –›…4!ľńąţ¦eżÓůh6oę\č&H1'D6Şâß“U‡ŤýŻršÓeÝ.é»ě*sík˛™€ézÄÜőęDVć骲ŐŇΰş^—ŐhŘ„r§tŐísAa—q—ń]ٰ…}M_“´żˇí€pW…2{ĹR5r;’ )µ)ϵďŔúěÇq ô‚©ę!ďsU+ܲ&rE΋4ćKnY†GÖ…Éjoßî¨:ćseÚ]ˇ;2ÓUµä4ě8Ô\ńh~¤u‡lÖň› vĐľd«¶üĂ ąţ±° bč˛F©Vô˛żÂPö7—°ľ§vŢiG:´xŢnŻß‡yúÍ 0C\««öŔ|ř Änt›[ŕôđp}­ÖÉ[Â/Č2bÓŻßłęŃtäóŔĘÚŮ>Âđ¬«Ú"]˙y˙w żűŞöĘos’Rż¦8)ĽÂdT?y ëVŔq˙đ¬Ęű6–ż]9Aąz†«÷` ))¶"űş¬›Ri§CĹ×Â_ňźŇ©ÂâNŔtú’—®€Iký*/sú«ű‚Ź ő«‚?íÉJ}ă§ćš…úĺbjĚrSřÓ8źňr¶˙Łú©ů‹řÇjZh(h×´]ŞEŻĺ.ś^€ BŞFďkObö‘¬Ľ˝ŢRtV1€VwAzĘ-WuW;MŰk:QÎl­Y ň >}÷`TÍę}Áő™ä-Íţ2.ă2.ăűEa‚&i±{D9@¦Ďő¬Ë2°ňˇ’Q®§©*¡¤qĽöőĘĎrňň€“¸µiŚb‹â—˙říő\m.% =•su#0?›ëźËŽgš”o´`Ň ŤŔéőh¬Űd*ĆÎŰşNigb @h\Ů=ŇX˙× ç ůÇ cv]a˘Őď<ŕú{`zVJ“vˇËk ť÷F/M Ţdš«{ŠV>iţGŞZG]éźÝ4ť€fÓ$r@/~*,ÚĚ÷"w°č~őaąxŇ‚ďĐżĺ_r*XĎ|8–r íÔÁ·]ËócxfUçG ĆwäY.Šk{Ąčćcš»ź€YH᨜ńVMa<çç »ţ𡖥íĘç™ě]e~j€öćž~hÚ1iĘ„bŇžěŇŃlŻ+ł©őŕ;ŕ|ţ ě®ţśĺ¶ęĐ^˙@vÎ2Ćů¬u%–Pµ~iÇ·ZuXđĎľšU‡ĺ,—H,íXpܨjăJśi=y,]grŹMˇH!JˇÎEoŚCóÔ“áńę äßk©WMY?ĘdŘ?ütë+ rG®5Źć»ż|şÜvWÎv9 ©úĐu2\žâ—q—ń]sacy¶Éł‘i ´á_©?ÇÚsoę ˇ7Ť’śÇײăÉĎ^g~ĄµŤÇĎŃ87–×±ęI¸&·Vý`TĄL.NŞjő@Ŕ<ÔĺF䔺śjWšóBdgm @š@uKvÁź•M©ýgJänÇ ĎrSĄ)őOîbUÖdŐň7ąŮÓĽŞ>%u›÷@ĎÚqaŘns śă˛WÔ´Č2ÇŞór#8|üŐ ťŽ•m1]Ň2m@\U¬¶oÉ7ůÍĎÝhÄ}Ř.ěëLŠťTŐIě’t᮪íô;Ę7ڧ/€őĺi‡W7«vćE©M;°ú¬ţŐÔ\ô^9çKÔ§™»$ô:žÉş°¨Ę©öüľ%»’¦4Sđ÷ďÉ*3uh:"6……TJĽ—…6QÝS=»‚ĺȢ*ž· ˇąŢ0_•Śýę`Ź@#çűt gŹ&Ë:Şîř95ő…¬›Sććéü™Ň,ß.§~•3ŕş«úäPđšőź(eŇ˝–k“OźVĹ4ţ „n Ěó´ŇÄ Ż”¤K5Mľ~’śBDöŞg&ÖüÖÜÝĽĽănń …/ł\TKŢČÖéüTÎFv´Đ*J-Ů#ú‚Â.ă2.ă{Faľ_×˝˝«®đ3{ ąÎ?áúg˛˛6 čtjť} ~ ÄńXx iŽćýoKŐŚÂĄ:1Źóu9o+Y:ľH vř¶­{ľťí9ânV쏩źŠäËöŮ»uÚ))5[U‹]cr4sŐťRĽCZh—“ůŮŞnEöˇŐďŻ×;Č),Ęâ¶ žľ°$ľíń¸/hQYĘzU_ s±ľ0ek6€[żüřĎŐOçkrbX]óI~ĎĂÂÇM:µT=Î]%¦˛ÎË ÝĽ@Öµâ&˙±?އşŐ{`°w,kfF¤> 5×Ü#+[É1BřÎÍ@Ŕ“ú+ćšvnď._qC±f8dC)a|%T˛‰7ß×D˝—\:”V©‹;ËEKrďVźc»-Ot‘oňe˝¨°(3YŐ錗Ź÷€ópV› ľľż/üšK uUmŢLŁôÖW€·âz˛šÜ5syǤ»0‰™zŻűS±ĚyĽ<ĹÚĎ@|ůp»ź€4¨Ú“;†ă#ЬďČťžR Ů\Ů–&?¬TvK©źť*†¶—jżn†z§rkĹ‚§:–łčaFaO!Żn4ćzŇŐUÝŐ ťç2cÖëĎ…7™~ć֛ݿ”}ŢĄ%ĎŇ”u¨î 1,óé„ÝUÁćÝ®L }Fńˇý˘oQ}¦©ć]ęŞćÓ9/Ňő»şşâ OźnwKq¤ďŇŃ Ž®Ě`MN0wëÄLuµ±JO÷ôw l“kë ŕĄTÄvŠéĘ»LĂŐ–Ü\;s­Ě;€ćîG`|ü9Ů+ë—@ŐŔ¦¦ĚIŇ´0ÉÉYę¶qŃă¬+: ĺü$µ—Źw@«'€}µŢŞ˛o0Ëż××Ň…]Će\Ć÷ŚÂŠI%C ë}C3—=Ůܦş'˨»ůĚÖŰ8WNÍ+ ř©"«CÉbŞ|“4»TĎą¶Kä %Őn%9Çq*űŚ[yŔČŐ éέӳ«ŚCÎě©Dćd4źtxŘŢÖý\Uf4Ńý՛•„Ͳü˛×R˝ Żó±«+JUElŽ9Łľ®Ů‘“ĚçcőĂźČ*›Ö|P#B¦sšţ–Ü‘*U·“;nz)čŘÜM°2-ş/R¬ ĚbXÔ˝űęÍsz—«{ŔŹcEŻćš  uŐm ‡Š“b^5,”‡€ZáYKŘŽ•)3˙‰7dׯőÍŹ”4rq‘r%‰ żŮ“:%•Mµ¨g.V2ćá%Gł5Đ\r7柀Výeć~=ÓáhîvŔô:Dc€@˙^dŘXŹ›pźúÝ—˝]J„ž»ňWa} ŚĎ_ËnЬ×@<ś·ZćÎĽ“ćşÓúv$;XYìôě-EíĄ|šń´n¤›ßÁżâ$‡¦#Ůá^c|9•ë1k1çVÉR^ÎĘI–KU6)Rᆬß-Üܬ€y˙Rv-ŐpÍQC5>ÍüËg }{GîL”R<_Éî 4 ąťíÖNŞËűr“3„$Ür »ęä•S*«Ł‚ŇLt"{íŻŞTAw§Ľ¬P\€UsŔ HRę®[ŤŇ—s€<`a‘q%÷8Yµ«Z:LevĎüă¤SűˇÜK™6]ůp @łńŔYµÎA ÇE—¨s‰‘”ĄŻĐĄ\·îiú„]íX4ô*謪¨ŞşŇ—é]:1€»˛>őUéz­‡Łť¬2?%ç )ÂŽ–ľ|#ěšÇ0Ě ë]ÁeĆ€›JGqs“^h€N®pޤĎO@Śŕ|x.l{ýHĂź@č~)¬˘Í­żćřů‚Â.ă2.ă;GaíµÜëOdĹ–şíżČ’‹/ŔüňLÖűÍ–’%§Ę”*MćçĎysĹÝIMö ctWę(<’]źćńâ3ĐĚ÷@&E<”´c±îŔŢ9@жéř'0Ź…0ż$©ĂÍ)Ăçżn}ýÎ)˙®]ăô+Đ6RlWîo<€ ź&í±rěčĄÉýŹęHň!p ÚĹ~ăŞ_®ęeł¸žć@˝Żpűź?e*҆ĺh§3¶?CvĐdR®ßő±–“Řô@”F<Ü€ŐjÍ –…ď˛é Ď[ ]ß‘3•ä8?‘]jUł“˘j© Â^± răőÂmAÄ9a€n­®ÉĘ*ş…7Ľá¦±&uÉ+%wJ mzŕdö"{Ŕ+j7¨/ëĐôôÍmůÔ–‰5‹±­ęH)ěĺÔ’Żd <[Qüs·—ŽRž¬—LÇ#0ŹĎ€SŻ˘T{jă ‹~Éf4Ý®2ˇvTYä!„8=ý ´ë7@Ř^“\",ť V¶Î¨Á–ŞŽ\¶Îú|[˛[ÜÂ5—ăiń‹ľž9¬›xřp&+Úţ-€Ň$­FjµçÂ^PŘe\Će|×\ظVoţ8>~*O;y3©ß­ŢU0ˇWµî„Ő[˛ë–ś¶´źXŽw\¨Ě”ţ˘ôţwŔw·d–vŃ~óEĂmŮ*‹$ĘT«`QŘđů+ŕÖ×@ŻŽv·ĐF«Š'R°˝)ŘĘzĐćĹÎ9ąJĺi'´XžĹ5,MłFâéXPđBŰ×dćÜř€NýŚc=Őç®Ü/"ŐY˙ rM-ÍŔůř t›+ ]î{JÁ‘OŮJ‰DÎŞoň{z_¸a=%7í5ÚPđuj„C' í?®WEU¤ť×ĺî|3=Ö] ŹÓ‰ě"'%‘Z`’j_ë§ą*8EĄµĄuĹ2‹Hw?ĆŠV”ý3^·ëůőđ»űÂŞ9éęŮcŢRâ TW˙ ’ôîŇ?^.ť©™’mE~á°¶đq1˙aa“Qź]JÉ©ÜM«Ĺ«?t8qČNůŽZA^z‡Ř;Ćgq»÷{*Ó-řb%iĄé±ś`’CK™ŇGŃJnČiaMł棰ż*›:©ř‚×D9âŹ/@Ś-0Ż”K°˘ęň+ŢŚVä|{ťŔ±„Zcę‰[˛‹ŚŐ4Ű0=˙®˙ 8CŮ\PŘe\Će|ç(¬»úWŕőÓ˙$çËłśŐ0?˙„›źĘëRšţÎŔúćžľýí{ČLŔtřDN{Ôţú·ĺŮlJh!íňGź"¤3G¤?ÉŢňq5 )ő‡Çú^ŞNŹ€ki}:Ůź&Ŕ­Ş™ą\|Ós/?ű#Öo ~1ç©Ă#9ĹÇ|Á-âiÓú;iýs|&µ¶*˙˘4ăÓ ‡Ď@o=wµoN(ŻŮޤ™íÍ0~üöĎçóŔz%k‹úő-0ľŞăB^3ŕăDvt2‡x±Që»r óëg }÷7ŕüřĄđ€Ć*Z†ă@vI“ÓYÓÝŽÉjµ·?ăÓźĺžĆé3€Űé<¬›ĹöZą•św%ÝsŮ˝•j.eą2Ă3ëęW•Ü5čĘ…t„qÚmąZ©Ţż";Rč„‘ëąňĽmÄNXŕG} Eʤő,ŇŚ„ý›Žś$}™éřçęÜgtî꟏@ ©pŁăa„î¦\§}vuŹĘqL>®®şňő§¤4ązňčş[ žţ ëű ÍÉ;ßÉS÷GĘ;Îł˛JnĚöV\ѶžM; ˝łĄ@ZőYZĽy™`” űcAŢÂŹíp~ýO`µţ_Éúxsㆲ΍ZßNQ Ô†(żéŚ>Ś…_“löŰ đMúÔblÇýď@X­(˙>ădf ÚY°{3YAĆf]ĐÖ4Ő1ńÔŢ\ę†Â ĎuzrÓüE€ŢĂ sĂŞ /UĆU-őęgĐ\©ŰÚżlĄµÝ‡˛SKă°ßśŰ݇żç§Ź@{ő3ąÎ«Žéő‚Â.ă2.ă;Gać4 GŮxşÝđşy&1)Ű÷䢜ĹÜÉ“TňR­v€źUlj…%‰ă řµ ÷ ąĄ·˝o€&Ôt™ĽµŐ·»; ů30=?“=•¦”€ŤKŔdÉ̡<é­¤=EÓÔ]׳ôî¦pjÚ7ôűJ¨”úĚ™š˙¶Ľ$ ÷zy™™+ěP5­łÜeUá˛ÎfqU©ěÉrA˛J®@ęěĘ>ŁęŚ<­¤&›9”=Ü'u\z˛+“łtô#ąS"©â&.ĂT?×@<ü ¸›ę{5ľĽáî ąűµŰ¬ČIéaµ%÷ĚĆp(ó,÷4©±S|,Ľ‰ŞĂr ™¬şşvGî3Ő˝g ą‰eö¦ýg lďËÜ¤Ž «˛-†ŘP_ŢsŮçÍcŢUGÜś%ü.EŇąĽNŰßăÔqOíŞňh-–Ht&WEgyäÇŞŻ´ »ľqÔ.Ôo˛#\]ć­b©©ˇâ\e¶»k şĘÇ%Ë ď¨/a˝Ł:÷*ŻČçtşľršĄ8ĄŞüÚÂzóŕ{ ĚCí‰V!?Ať!NiŢŐ‹ĐrTY—oAîŠŐóáLýX­o€FťŞő+Ăüô@ÖÁ)Á´Ą—§ře\Će|Ç(L^NFń[Ö1@·Z‡O˙Ö7w#¤pótJ·V§~ ř(<€öäĂ Wˇ>w§ŕ“Ň$ű˛s.óźM±e®U®0 ł|)ş]ÁhňP•ç,=ËT=Ń˝ŻNŹJ{K˘”Fĺúő Yßlč¬_č¶Űk˛cj6ţó• § ˝n>¨=Hˇ†ÇŹ@»]޸’¦ě'9ÂńSLO§r˘®G·(¬€Ńw@śЬ”˘$úGJN߼P·Y­*‘]´äűŠÔçý/ä”ďxţZxލ €' !ľÚ ~*şú^­÷Ŕčš‚5ÚĐŁńeKÔ0Ľ,_vÍjŚuĎo®¤=Tz]WAý}b»”5/zWĄNšä °*×™s ›ËŮ–Żz{•#«žQś6ś±şZ]r‘mČ. AüťrĹU!U-RţY¦Ţr•]ҧZxşXʎŐÇĺ·¦&˘ŻĘÉ&}Ó™(tüH®Â'Î@×ő›·Ę5ŕőűbĘĽŢ©Ăá\O]ýÂcVlŐ˝Î(bîş·eÎŐ Wţ¨,(‹r­˝Z-ň K§± `gÎ}őtQjS¸0ťcÂú§ »ŚË¸Śďž Ó®84źËţÖnÄ^Ő'ź°€pm_Y{ť´8妺ą„řy¤FŚOWĐźłHKiĘ?©rłi€.sBó–ěR”l×í Bô} ĚűWjşeeÇěL.•–peł*;%9Étˇ=AI-JBľk™y'Č7µ©‰ŤĆeĚpőĂOŔńóź`zúd^őŐÔ§7é´»]E ©˛-óĽFuĚM×™î ĆG˛KZҵ©?A÷HĚŁvňÇ?pőű=@/ť˝ÜŐOd/yëRLµ«Îz0ÓąĚXRnŔá hnŢ.I3léâŇgŹ{ŔË×D·ZŽőć%ÔąČ-•ż›ÜÂEVú©í=໥”}9UŚ#íUjŢ‚őNÇňšz/uh©Zň©PUˇöňěß„›+Ź©oR§×˛­UŹáqXŇŇ<µ4ŽlÁč™JőďĎŘęQlIŽö]SŽ×-X¶’·¤ ´nJ­=uÔę.,rެ˘*˙ľ°\x®ś¦V—抚<«dŐx”7,g)ËßÖŃKŞ€~ Ě/ż®ż©“'_3ą Ç/@ŠrěxšŐ;˛—™üĘp:|ůĎ »ŚË¸Śď…™˛\e“F®‰kŔµ{`Ő˝űŻő)»ZáúV^Č%·‹ąňT6ßwsŻţ¨ľżâëŔIwvz*;LÎdmš˛‘ćř¸äčćLŻ{ ˝yCv€Ôî:-ÖJcZTj‰&ă#a±iÎ/ŹŔő˙…śdŢR®ŞĎu=ćÉ1WĄţuJç%uŚ[ě®ăq‚ň˘|Ĺ•V#›F`š÷…_ł~_3„ÄFç€ný÷Źe“Îȱ)Żo(i®É«Š$¸Y™Ű5Ď|>?nVź ”ÖňbseçO~"w#*ë[÷˘ą˝)¬Š†ÄČăÉű 5rbąbŞ•ÄĚŠ' ˙„PâyOösţŞr@–0Šůr¸ëZ >@”g–ŘŔô8w V\T…Îş˙śÎĘs0Í˝/sxŢ"÷±xWąąhŐC„Ő-0žůô›·TuŞĚÝ´Ěy¬źz>˝íú¦śoĆÓC=gíĆAg٦¬çéĺ Đ\KŤ¸/ŘÓXfáµ1ł‹@T…|]0b‰śr0jmGWŘä¬_sŔ0Ď@ŰF`>›żN‹Ú˘ŽKU´}˙C™ë•çóx¤ÖmŹ@·ĺ;6W€o7ŔřŞTđÝ…]Će\Ć˙paq,č)Üz`ś[ŕüüóŹR‡í€é¬4Ăľđ¦×8K…¤.¶cá}¬n(…שŞçÝTÝ‘bĂĂ'`u#§Pą¶·@0í• Řp;WŘ1Ç5ĹŃIŽŁ>Ő'´9šÎ€WĺT’ćĺđHÎśί‹ÉńÔjQŞ(˛ż ěń¦EŇǵ­”ÍÎöÇ‚Nu?´¤W ímă1 ҡŰĂ"Ŕw-¦ßúC•äYZQ€ńGł<×)čOüŽşĚTyT&ů´˙$?}[˝á \6ˇ°<Ć^ő·d’C[űůĺXÝü¦Ť’Ëk»ą''06·÷yëÍlNŁë 2|ÚMw[>‘śÝmÍJÝ6Ś@Ó)‡ü ‡Ź@ł{GŃ:)^ŠpU3ĹĄę¶ _ /«–zVOku°0„<°ľ˙ĄĚ!Äy‚݉\ć…oIZ·Ŕt>ľë ÷'D®Ż€éőóâă ÚJ µ]ŁDWËfo·ÚÓĂż¬ŢÁ¤:`:~šn[V{śB9i٨^E*HÇ-±áĺw 5=U^éËjŹĂĐ(iő8ď?%ZZłEÍoî6ď3ő8Ëâôt·€ůtÎÇ=ĐöďÉŮ—RtÚ9LUy`5`ŕ2.ă2.ă;EaęžĂoׇJň$_vѤtśą!ű[ńéÄ$1_NăâA¬daąŠÂJ«şG™•\ W=˝4hÚ?·k Ť@Rż•zĎO[5Ý x9ü€v÷żˇ‘ú n‘øô`˛L¦ŕ”a.€§¤qů%Y6eOuCj“?ý®°ę ”˛?š[nĺ·@żö0ž^®_Oź˙ŘŢţ­l˝Ú©äh6›ţĄęą…˘źřő‘ěk%ůô[/޶sů jN€WĎiŇ»láü Xżů`.Ó&«„§HÇç‚»Ý!wŚNO_É´Á.őŽe'O/@˙ćOŻ•‹Yř*ż*F1­7”ÔKżŔhÖX=?Ě+JÚ´v̇Żu®ÔuبšÜPł¸¶ 7efeĽ/ČZó3˝~šëż †‘Ýń2B« ;·Đëc™^®"_˝ľ*×ÖŢęJ“[żë ¦]çÎř»…÷śxĎŃa}µŕ Ďĺ›´`r?Ö·Ě_vRţ¨MóBöüPmWŚ•ęȬz`ţúĄŹb>W¦L^ý ꎬ ~‘NőĆ0—­Ě¦+§ĄCJ˙V 9B8~‚ş#Ó Ěq×ůĎŹv—qß9 sÍ}Á,Ş_Čç{U‡˛¨_Ŕoßńńđ׹ë=?儹/űĎ29.—<Ĺe×ËJĺXő5óéH~¬,€—Ź‚ÜV[˛oÝ5Đn”V]U`ŞßI…ßh'‘¶čő„ľrpK\`uL“îT7íĆwHŐ%§üçĎäŚBeó´Ý®ĽŻÜ)‘«*#p>?»˙ 8S!Uo‘ŁĽôÓ Ŕ<˝+ÍŚĽö‡ŠĘ_ŃDňsÁęŽŇĄŹ@đďÉ^Mł¦/Íö+Qfß(iÁ•—3€ńëŻ`=ŹůÎŞĆt]8ľ¸poÜLvř°X] ×YďZůIĽUOΑ–ßiłş%űR8K9ڔߗKksXďČľ މ#˝ľu.‚%` »Ie®ü‹ŐŻM;y*LźŇ›’úôšöYކojŽ·u ›G~¬§ż¦ęě\YŰ6'ćŇ5,s>µv˙+1€ˇpaĘâ4g])Ľ¬:©­ţ_ŢÝQj%BĎZŐ»eăX©”Ë5Ăt:ĺTÉ#LHŮŞůÂţˇđĽv’“ťťĆ*¦Vtho€ÓóßţúŔ˝fS°›2Xc3]PŘe\Će|ç(,É•qý ö #t e†§‚PÚÝ ąŮł0HX‘ÓŞ§§+A漮„žŤÜVä:] ŚŞßMŐÓ|87ŇěNŔůřXß©4–˝Bšxyu:cŁ:`šR#ZđęąO ußTVÎŞH'°zŮr¨ú‡ŻäZˇvxé†Ý´. kŮ#0ľ>ÝŐŕôřĐßü$9@ČőüôR/«=™¶k.ěĚ|ü¤ĐÝúš’0h"ą;ˇTińLHżP*Ą“şŻş `¨iŘÍŐŹeŻËYܡÜÁx®g$wç…~KŃŁŤ‰ś~rŁ@y߉&Ótć®á} yÉ«ćÔ¬*Ž2řŠÍŁéćnY}yÁÁV ęłMAÓë#@ŁŠöŞ"ýŻăřv ű`×ýě•iŘ6T™+ŮP1`<ˇ˙@^:Ň‚Y_ç\Óz¬´kîu{ŠŰ­^S}âp…ýÍ«~‘)©9ôXży_ֹХúĺ¬ĹˇnYuGŞKW3ďÚmÁz“𬗚RľuÂŃ Ůź®±Jbő#smĘFóYQÚÖ©đqÁşžŐăńHľörZ»«h]ŻgKŰ®VkřUźc*¨V§±@{Aa—q—ń˝sa»w@| ¶Đť#Ą[`š_€QÎî«{JłŞó4»[0•m\$µŘżĹ˛­Ş»@»ą˘4ëë-ŕ{9ioôŔęú/d}ą)ÂĚ˙~&×5ŽOPĽaŬ©‚#ަ‘Se_°ˇU…äW©~±ř ¤×3ŕď#ࣞúBsŇ=o Ç7_ß^Ót,Ă»5ÂôĘ+žŠÇŮx kľ{imZ€QyyÝŕ±=ŕUŐÚÜ‘=Č­`'›Űáą;ÂjŽrz8śÉIË›Ű ŇśX/ˇ®AXFt”Öď¦0Pę0'ř°ˇT÷˘rÝ…^ĂuA Öµ' §'y±ő‚ŽŞ2ďëď·B Gŕ¸˙ ěn~*ďhű¶–Ű1nłć—Źäî%oúVÝ#doŢ~ÄéHQ^# Q­Mk@qă húpžN$Ń2“Խϯ@XoĘU«ë*±ľOlŕuőćOKoUWçMk,ŞŰ$V—}g¸ř¤iSpŠu)˛č÷0O—·e†çă2ě0_?|MĆtqU%”‡š°ĺ¤TŮz<ł÷Ň÷"Uç őíšż‹ř;ÍCë<ëL•ľŰ>Ąę^L‡g ˝ţHĂ`©ćXýôÂ…]Će\ĆwŹÂTë)»ĺôƇ‚ ă·’Ż>“ĆaÍKmW*?O.ŐýJÜAŞÝaÍꑾuęžČUŻ,±'ć9É‚ńđ8ż>^ĎxĄ^)îÓg ´ď(^Úż”{t>awMI~ÇçŞ_‚RćËšjEFU*íBâ°ś2 •Ŕ(5ö\§»[÷ÔäjmfÇ—ÂŚXÚăć ¬—MIÚ®s@ë0ĘAĽ]SĽ¨®˙n˝ÚASu—Í FMŔ”»żíuĘâ§Âg™ŇMŐj Vß’3@ĄĎ^JwˇQˇů@PůP)ď¬E/\&LmޛۿP=°¤'šĘ…Ëq_ťtęĐ”pęŻëőČ÷MµTyá»kr…ÎúLÇhú5ŮëÍqĄł3™ü ěÉ?âL§IÝ‹[`zůł`ëîÖéGK”®Éׯĺ;%ô'ó˙2żĽ¦ňłň ?ÄÎ#°Rö‚|Â×ă M¬çńNYâr| ÎRżłM¤Î—k±ęת*j%xfrꨳ˙V]Acžzu홢łŃ:ß» leúĘůZ’ą”RqŠmnßN@ă0޵ ,DŚű˛–.(ě2.ă2ľg­˛#§ą,íNMBßn(XçÔB'"—na‡—/˝™Ts—é™=~|űˇ»ÜÓĺŻÔ¬Ż?n¨žSE¬6Ý=v7 N$’ťďÍMAđ¦ÝN:µ Dą/UłziÓR˝~í†Ęţ™÷@hväCë^”ž;UŹSŰKçšÝ`ĘÇÎćjRuÉ‹­fZWąÎ@Ří ë*UWŘî€Óó#°OÇ‚µÓđ „í›Zľ®Ů”ÝkO<—“DöAu@|ů ř+Ą:5Yšşz0-§:C<­őKHó8¦Uül»ýˇś ¬Wľ#–i”Ę*ŇŞ«7…ŹłěĄPłľ-·Áz¤é—˘jU9Ż8‘ó¨BűHîѢć¨z˝“wË+ŕć­˘!˝×tř č×˙đÍ5ąhY®ă© _1¶9×"m7㼂>ťˇćX±•\ücýy·%wŕ:sô@hîČ5čyúĘ·ůU:14ÝuůÖsşäH^Će\ĆwĎ…YOßą0öU˝f%˝Ě ĐnŰrę¶§ ĺ _ăÓGr ČjRç9oY÷4Ë_L*­»˛ł‰Ńh•-& [/^G{Đů™ě__ŔÜVí(-EţÂL;ł9úOŹqŘŢkN•®°fú¤Ţjp3µßP݂낍ÝÓž©ÎPóV ž’ŞËśłôĂ8Ňčw­|ęÉŮ×çý Ű­!»\¶ľě{Jó¤ŐőW¶H<…>Żąç©2MĆWĆę\*Ç7aUĂŞ‰×“Çp(ŕF®łß°K^9ŞŤ@P7Ą2˘–^¦ÉUţEó&äuŢŤ“~ Lç‘ě•óF}™™´^Tî^˛~‘’íý=¤,蛿VH™ ZöĘZ ó"7Ű7@«L€Ó+ş]a© ‘Yëí‰ěxeCéÝ ¦"«÷]ý¶r}Íg…:WfbâËjÉšř‰śVᬇÔU¤ąxM[ůvóşr§ěućHvŽí7?ëzę$ŃżÍRV}ëU9Ičł(µ@ʬóĂ˙l®˙w`šçr3ĺW>¶Ě%W2ë öËÔé>“•çÓĐ_˙$1žńXm͆Íöĺ)~—qß1 Ëý_őż:Ťkożü'Đě”ö¬Z‰śHŐAÉŐŞŹź€®—îIucÝgü2ŮHT•rbôĘâÝ®€ÔNĺ•sě·tL3ŕÖ×Ŕtz)ČBĘ]u2JĄ•«Zˇ°6†‚°¤8˛9@ĽřŁóěI ĚD9[±2Ý•]Č-M0¤6G¤ˇ°–έ~†n4ľž?ý¸ůá0ž]ŮK™…†˛ĎčS·o˙FÖôKk> 'ÎŇôëŻ|aśy]‰ŁĽ%çîÉŰÖŘ@ˇBËੵHŰŐ­Ůż8˝’+Ëí<xÜáćCÁÔşž„Ď€;~P©ÖvfáAUľä´1ŐÓ€ůͦšŕ¬ýˇ"nă[…ÓĺŹ"Ţäę=ŔtŇü DW]=š®ˇäźŞűĎŐľ”á(W¸Ęr*O^+_ľ)>ľ»§Âňę*anô¶ä ůëň;łp«˛äśîţâF…čÜqfTkwShZôd׹Zk}_x[cýÔGˇ¬‰ł&tQˇ^V őM·bc‚U¨×Ţ»ű˙ Śrńí·… KrZv;˛ę0ë «—&sđbÇÔU#Đ 3JO*ŚoŽ#ze%Ą>_PŘe\Će|ç(ĚŰÖ¦ÓŻ’™w@RźÔŐ[Ŕ+ĺEl”ŇÍI]ľÝrÂ\†hRő§ë[çTNÔć pVęG€ř\X ĺúćÔe1hębkË~b ß%Ur§XW~n^E߆–-_ËNn]ĘzQM ŘÂw^:ă0żţ ří Ĺ\Kő#UNg©ů… «¦ÉÓ‚¦y6oΉŞEAüËá#€|ÁC Ś`g`žUťŮŻźţ/ [ߣś§V5a°Ńžć[ î?Ś™–Ü–ą‰LdE^hBa—ś».÷ډ㠡k€Óóˇ˛Jä˘_v”ž(ť˛¸Ťz[~zúpý-ą#OŞ–š7¬Ż,Źţ˙¦rťŞ¤O§Żeo·<„V^Ňs©6]ď¬ Ôóë•»ožm śĄěk˘]›ąěŻ F&u}H/i|+Ő Ăe;1r=Tłˇ{¤dňěµ7—ź„Ý-0G`˙ř ďî€&ŐÜ óç0ĎEZxš€éřZ8Ů\2WEu.ĽsăĺáqŞ×ějW€­ङ&a Lć„| ëéÔi3×ĺěâf˝»0µú[ž€Fz:uVJj)±§ÂđvÍ,Ë`—ëŮďä Ö »ŚË¸Śď…‘˘W­h:ÍNµÎ%lâŻŢQ<łšš6ěţGÎj.ÔWč×Ŕüô;ŕŻŢÎĹőwĺŐ¬ˇÎöŘ]ĺąĚĂ«š›[ ÷€sŇÔôdőPŁ`±rbĘ^?ľħŔoßů:Xwň·Ąý5´Ą˘sÝ{µsŽRŹ€ďcć¶š‡ˇ2}A,†Ľ7ö€# ümů"8ąă´č=T­G,¤‰íÍÇíŕşzŠŞŕÓ_˙L®ç6B:šŰĘü lîęŰTÇKÝŁ¨ůĽĐ®kjA͉ÎO˙ ¬Ż˙Jö–čoްëăşr҆h•x`ť犆|ší»˛ŠĚM_ᶢ+o.3Ą6z; ‘×.µÁčGU´MőŢ—ő¬şj‹9-©úŁu뻊؏' ­'rNRÖ1­©}‹Â°ŕWďĘđiü'Ž)wt,Ö•çú.X|®ëJƬvo©ý5ĺ^ß\U·Ąa4‡{uë3.ň™Ä„ a5ćn¦´-Wpe®§oixŞ\¤«:Kq×9, ă°ľ[DP}٬´†‚H§=”]ŕ«?šz™UÇ#¬őlé˘Z!š˙tAa—q—ń˝Ł0U»ľé׿ô´ź%qz&×ÂĽß^ŔŇ}Ä4ÍÍ 0|y8ľAŃś¨ţâRTWl"yµuŐąş{ë$?ď_Ęž/˛ôśrA<ŃDÎLëű‚ňüjUř%ZF[ßPťNGŔťŐéVŐUŇ.NÔ®(ähÝ”‹ 0˝ľ~˝­űrVڎHd·wőLů%·[íĆňťŹź7Ż·n»Ą#Wp0Ză ‡ŻŔęţ߀8|)u,Jßç—^]§‚ősĺč^0Ŕ8ŤŔG ë×@jşxŚr[—;›ÖŹ/Hĸß;:Ňń@VEÔź¨YJ…łU®*ţŠ ÓOR<Ť@T[Ż“çíˇĚ­)ŕ€óó9‘ŢT—Č™ä†8„\„ú-0٧ŢÓáPĐ}°µZÓ§ćÓhwďĘŚă9µP¶‰äě"!ý=Ü 0żÍzWŻĘčş…Łżľçg€ÝJ&¦u,»_•ůtUżŇZ®RK©ýľ”?5'[ęś«3ÔNEî7 ‰ő›«Ż\cÝĎ@»ú 0ÍŻ€‹uj1%CW°ň%őT±ž“Ľ˘YŽcŞc¦Hî pq[đšÎ‹¦/»<Ĺ/ă2.ă;FaÖ/?R=áÄ ©ç^~ŰYÖENńµ®.©HĚ@ĎË 9NţPń$nHžÝbם'ĚÖŔ$­–_*ă;J…+8rÍ%â€i˙„ŰĘi\nńSŠeŻł®1C%HçŕĹw¨3Á'g ŮţLrŹTOô…:|‘*$J;Učj’Óů$}Ü`€ŐŐ;ŕőőŘnî€óét› ĐICg꼪D““çĚLă™ę»¤ĂčßüĄ`7ÓL-ś§ÄI źę÷µ?Oę¦Ř\óŘ‘Uřˇ[‘{?•˙h ÉßÉŽ–$´ÎôßŐú6ťŔ_Ý”;âçZ3Ę|Ů[ NÇBďŰs­č™÷ŻĐ9ëßĂIľ#9{t}ű0>˙ ¸vGíX¨.™ź},ó¦µ$/Ă2I•ë; ž·ľ!wˇÚš§č¶rUĆ#źë \Ö%WwŔôőwr“Î:Z4ë̇ĎŔ<Ľ@ÎĐś7ËÓŔ\¸¶|üâ¬38ëM§Ë_Mó´ó"őrń·ÖëŇBvU1\ěmßÓţ ąŻfš>Ľ+H_˝"Ń2‡40Ű·[Üܩ̛|›íŻN©ŤgéňCáľuŐŻrAa—q—ń]saâ›Ô§v|^0&ŐWK–*Y†GXě‡ćX ÝŤ0”´]+ Ů$`Ü?nŰT>ËĚzö·“žĐÓ ›·Ŕtx"ë´űqžĘžNĎd˙9 @:`ŽŮ/R”‰Ş“h´˝%]Äy…î®îę‹9‘'‡uxąUE|ÁĂë#ąBŠĘÜŽĂč”s>@§úcđŔxxşë÷?&"0=˙pý 0'˛"l6ÖÉóËgrç©t^ę´NO«-Şöú'ÇWr˙ |_Ąr˛śad›«PfžnáâI<“đ‹vě¦ě؆D4ŰIü—úšĹ*Z Z3ŻzEN·#cI<âě¬Pż·ĺ>8^TëćăSá}2t+Tů;C‚^\Ţh×ď kćT[lţ >‘»5Ś5NuĚ}ÄäôŐ9Öx%ő$$_î¬Ę§áę}a˘)őGJ’ÓúžěÇď×; r†?˙'ĐŢü\o¶äe­"kÚÓ]G´óS"÷#ź” ŞU5ôş¦0žQŮBÍ8żülű_€ĆU&Ëž&†“7‰2ĚŔŕŮR,kŠURż§ü'Ü<´śe[Şă«Hř±ĽÂ…]Će\Ć÷ŚÂćÓ+ŮWÓ2‡ĺ±©3w¤Óää›Eu ăY”o|ÖŰ;`žÖŔůů`}˙sa äiő&W•ëÓAnô×dOsé–‹ůömy˘O‡ÇÂ;´w?óëĹ{ µŔ *dS9 sŐž/´%†BšŰ©(;Ş€Ä||(śĹ2ĄQJbC7íB÷Lú«[ŕtxŐé’: ďůĽ`t=ÚÉĺ~ąt%ÓŘß“kyţzCî5Fcr€Wëp,xĐfO]Ť› ą·Î»+`ž^ çĄĚ>aao©9ŇRŐşXś$ÄĘ€˝'w)Č5_Ů>ÜôjQwSµ(]•»/5żŽHŇm٧ś„•ú«·du~Nę–ÍiqúŤÜ_^Ë)AŽrëWÜI17ť@Š 5˙´*ě[•ŹV†ąľˇ—§ře\Će|Ç(Ln_¦^9€N(Lz1yTwŞ ĘÇJj‘ę‰*樑~D»¨ąŞŞog[Đ„v­xú ´×%ç*ę-ß»­‡ÎŐËoyL‡ro¦Řçăg`ˇŚBX$-ąšOžÓ'Y‹ś„ÇŻ€ďo sˇľ°8~P*’ŻdóebŇ\Ř%ÜÇW˛ţ>{¨Ą˛ŹĹÓŕo~NĎźŐíŹĺŞT-ͬ^$gnËőI5VůgČÍM2»V‰śĘ+ŇÎoÉ€Wä>5U|šľ+ĚÂ<ŽŔ$ůżw@'Ěňđ ¸6Öµ“Ş®&HÎć"ŕ+Ş’ň[«%ŐÚ‹\Ód-íŕ KĘOuSx/Öő¸''?Z^q@«‚e|ŁdCŐ7ĺSÚ×=|’ďŐ¦˛HJ*!čJ”‡´Ş«]ř÷|b€ŕ·@Ű˝Ą¸Îů»‚µ›ë[˛»lđ·Ŕ4ľ!©ëö‘ěÚšŹĘRş)+ĐüZ„°*\ź÷‚Â.ă2.ă{Faz6«FŁ'÷ ĎĎEćđ—mKgyźËסúŁ[®ĎđLÎkqAu–C}7« ‰ĺyKîFÖËŠ˙ 8˝ţôŰ÷MżĄšQ<|_^T˝T뫟É]W¦O‹|˝…FĚzbuű¶ýUpŞţcşĘÜą~]öë-Uur!0Ď'˛{„Tě–˲ľ¦çŹ@łľ.,€F»ş/(˛Ű\©ä…ُąó±0wŚrXmšw`Ú%±!a ćµÚ«˛sŃp~SŕÄ<Ś@Ó‡2ĂŢÉÍU<Ú8ˇu!‚9U&Ńj»Żd}“ÍąTŕŁp„zâä¶ŇńąüގoóD]°B v†Z´´GC©†eÎŐôruzŞËş}ÇÂű÷ĘÖ~RXS’™ć30ÄąÎ<]›ę’Ş{Ú´@ImÁ v…ÎMŻüʬ{Ę~ż 5-Vu˙ę/ĆŇ­×Ŕ|úDeŞËĺM})Ď@¸~[0c<>n­úěPNNęčبD‚ÍŕçUąwŞ8›:¬u€;W¬ŁľóĽť7%…«|ŔČ”IůŢmą›ća›|A©Ęčr÷}yžd?›E×v:R=9j-[ęł »ŚË¸Śď…édŰŠíZÝűěô¤ ˇz·Ça$ű@[™×j7R…„ĄÇĐ`u]~"ô”]´őĽoČ9ĚRËÜ-|/“ťÉŹeO¶z–ř¬~ /' 8蓮ęÓo‘•űX$ĹĂ pOŔćí߀t–›B­ćČ |zyÚ·€t–;’ŻlŽXnENh”iHÍMy3šOé•ő:Á ťąÂJhnçŃ›› p>îÎýÚë,;G=©öşJ”«Ŕ‚‹â5^Ču+ë4ŹľöüąćÓG H[?)Ťi¤°dµBw ¸UÄ××ÂĘIńgű§4kăH^SĐkÁř†ň xU'xsd AĄr°Äčµo+ë*ŹŞ&˛ěźTď‚iµ¦Ż€U祳ؖ`ţrµ}Ł?(Řj¶ÜĆ@Öš‡p][ź”˙ř•¬>ŢT]Ő”SRY§&~v¤Éúš×mť'r”kŻ ęO”’}•óyh$§Žç5 ŽÎÇÂZ€DÉţ¨§‚uF1öĐR†˛r„mÍÍŐţÖóóżýő-YÉĺýŰ‚jóiÉühřÉ’äGŔµĄ’•@ú¶2ˇr%3×6U*·v—qß;¦śçΑóCř 0~ů ů¶ ­¬¸‰€OÔVMG.úÉ©µ«Ě KŞ"í`­’ě^€x|šÝą7]ś”íň°_+˝YĘ]1R @+¦F­uM śŹŐCRŘÇU¶?@®¦IWŐ^ O‡jUr “ÓCżúná§îĹ,>íKă™ěý`ę!9š˛FĄĽĚŞ˙ĘYˇĄ¦F Ŕ$÷Ô¶˘Q'Fl‘tůĘń4^é¸m¤s"g57ë 5±ÖLs`¤+ĹěY°Nb7tUa ś÷ŹŔćŤřxË­ţ´éĄú¬ĺÎŤÖ•ů{á­¶8 §4Ŕ<ŐFíƆj5ĎN9Ř;Đ‚Üĺ¶ň•?ÓTsŕĂ"ŐŞrB÷vÍmĹĽňŞ÷ý™Ł\K©’»zÚ°~s_Ö•vŞŻŽÎ)1ĺkهµń¨ÄźźwuŚŹżŁÄ}L޸ ńÍÎg˛QżČ4ŔyŕôőW ˝úPžÓJ4¸’oŞPĂÄ´ĐËc SüžěĄa´‰CÇŹ…ij·o€4<Ëú¶äťo3p«%I·í¶Ż^ľ©ŽšVýöÔ'm:`ÚĄdóé}:uź‰Ył’'»J¨RćűT~ß•RS¦Ĺnřţž~Âö ¨SuLq iUPp»»)\†)’Ě·Łć˝ňî(ÝâŞ^´’šL Â!b7veĎ—‚_<Qž9ÂP §-!ÇĐëí_Ŕüă˘eDŻ*S3˝ R–yfňóšźĘýwć…%u‰¦űÓ»ßR»& •ÖiŞ©‹Q® ]¤sőŹ]şqŃĄŢŇoHcAOę„=}ý ŘŢ˙ śöżl¨ŢUĺ~…­:jkoC ÄŠk´ćŰ‘ÜÇ˝Ë+_ż~sW)ŻE«ooČÎĂăëW ľ#›Ý{ŕřńżł˛ľ7onu L‡Ď€ën ö”`nL™ ĂnZ9őŇśźËzh•V)ćKŮ`jľ˘7 Č…]Će\Ć÷Î…Y¬µ”Ůră\IľéĘě6dkU©ÚÍßČ’MwŚźws_PILG€±ú°Yir… kV[˛ĘY\Ŕ|řĎĎdť—U âśdÎ4ŔęîGrÍEŻc.fB:»7Ŕôü•ś9”ë}Ó‚ÂZ$YŁäóS¦M,gxţ „ć HćĹ$FOÚ÷Ő5px},ř´mä·©DŮAË>éŇŠ’ľÓµ@°|鉢8K30ĘA_ěôSçg …ĎÚ9۲—Ş&8ž¤˙ľ|Żô—Ź@|ž€f÷Sáód8rV>ĄćG: YĎŔúúmÁŹ~w_ţÖ-Ňh’”ëňęě*’ró3@ŞîZ–9/\üĹ7]żfĂË‹4ďY¶^ňĚZtŞJ§Ţ S+}‘ P¤r®fL> ¨sö0ĽÎĺ\â…©mí5|«ň70×UL‹WýéÔKŕÖ źᲮâéXpźkŐsşí-ĄtSő\5»Đˇ˝#Wü­ĹCWéńŞ*vcÎňOáü tŰ{`ž–ŮE,0졬RéSŔéă˙ćĂ#Ů9F÷}Ŕś„ńoČ3Ş{š_›.wúgħű6o€ů屜c’ß–KKćiüRN?¦ĘĽ<Ĺ/ă2.ă»FaĎ@Ňv/­sTşrCö˛§ ŞTmí©Ěý\bn§tś­ćŁjzÖžfˇ?ž†ęÖdőAőµOę^ɆrG¸.gţNäîł4ÉiSz“Lş¶í–¬ŕ÷÷·ŕTëş´ě©ÉýBÁĎ"†Ĺ`ýîgŔ§®đ,¦Ź·Jĺ”I*6›÷Mâůč®Ţ/źÚͲBJĚÝ0ĽÝ±©ď.gńµXÝĺ˙ °ý@îgȉźB^ÇÂîÉÁTiŞ,áqÄô¦=Ů,M Ď/)ř¬#BŢ›_ÉÝŽë«_Ŕú,]Ć/đ‘*ećţŢUSÜčbĄ™Vh‘`‰‡"L¬ëSŠöUyăାđĂpĘĐ|-L–üQä‚gĘ;% ŞVËC=}:ü ç/…Qćź+–J]·łÔvb-;÷˙ĺ]ćRżtěŠ0)E!©ň.śu˘h3•p*ľLúÁö§ öÇÂčMq¤ó Ŕćžš+«ĐlvädOgőîX>—ľMm[ç?k9•é=—ϵz˙oĘr_)ýÂ!ă«|ô7…“ ?Ůëś+Şęó˘cÄú…µ~ćHlĘFL´e2ČpútAa—q—ńťŁ0çĺűŢŃŐÎGëTŇ)÷¸®>ü ŚĂ¬Î—żh2‡#yÉżP%‰ź€¦­y*i‘rśOĽ‹ŽË>ăł*ˇ'`˝n°ŢńôBőxHeO›SšĐ]ŰĂńDuJ]ĄN=uiťŹëšÚ’ÍĽśŽ_ÉŮKBL 3Ŕşâ Ç.é’V€;IŁj”ř…ş7d5Yż».8EuFí0!mÉ®q~©Ľž÷ŔđřwŔ‡hîĘGOÖ[9·Ů>ă|ćýG żů—Ęë‰?’vI•Í´Č‘’^O~›–ëîËJhVë‚›”بkó¬€_ë^­mŃşYĄR"‘p™Đ˝tç±ü-NÉ‹ŚďI5D©ĆŐÚŞßăP°łń_ÂJ °Ę݉Zg×]jP ×¶ -%oe@ ‡Śua!q›‚ýÓB–¦ú ÜŻ,MŐV‘+8Ô~_U`Cd=Đř©Ě‰X§śÂÝőššę“T7WˇôĘčş*+G˝ÁŐO-S¬_D~Č×ŔřđŕÚ5Ь«‡Ę<Ëźö_>óđđţ'ŔOG 5+`~ůµ˘żŮ“$ä@ë›Xż_ćŕ"šSÝ Ę@’Żß04äLűŮş tBŠšî/äžh9_PŘe\Će|×(,TŇéĺ#ĐܾҹęhŐŻ?ţ gęëCp×,m tĆVŇ\«ž,9ť×쓼SiĎ”['äŘÜż+;°Îó^ĎőŐż>’Ͳ—Ôő®”©şPÉYLlQÖ Ď`ú{űI¨}—ná¤űŰ‚#Śě;€¦ S¤ŁňµŰ´eł1ź‰ů+ŕ›;ŠŁÓ,­Ů E…żđęô–(Ż‹Đ_ý(ţ°\sT޲üš s»ýą0AŐ®´ČlŽ€ç Oź·–‡ŇÚkb r ¬{NüŔ±¨Ö Źô€ń\đ]ö}U:Auh°J«ú ÜÂéĚE ¨&®îK]‰Ý_Ą˝úţ ­ô7 ÂMlKVęYóŇávéËrúBÎXđćć*x?ŤňŇ™ś§˛…1ßşć[źcÚiîHňŕSVÓŽÚ¤0×;kÚŇ©2€¶bSąďˇű‰¬ëĚĎŠţ‚Â.ă2.ă;GaÓţ9o‡4Ű{Š"6SDd7}ço4î·­^©,’ôŚfz^÷LggW˝fGqąT‚ËéPö1q+–íč‡L›řQ»˝ôĐŇŕ¸rţWődVÂÍ"÷0ľ>ał-(LhBNŞą¤Ľĺ{Ŕ4ن.ĄÇé*Ćś@ ŐUBčFTó0Ďhě'»‚AäýoIT§Íśú'7ícrI;’ł”šö Ó ä Á«8˙'pŢ˙ŁŕͶSő굲oşÎfáAîwdżSŠS±€©˙U˝ÖŽľŔ‚௠B´™ˇâSÁQ‘Hă¸úÍ-_żas_>Ż[$cgOW¸<éěĹjÍr”Ď(˝Ň }żhUé @ôMPżG{WШ– ó;“.ßzl#pÚ?ç×G _ÝVŹęue}»J„0ÍZőů›®Řáů8a»âóź@P–{ vž âąl Ě@żşćI ć ŮaMž•řix!»kN ›Ű™©zĄ™ÓŻ€”PóČI ҲÉ1‚F,۱đzö NťË7…×ÎŤš‡ë2“”‰Ýő??U\]“ćŇôä>‡«rđ›(s…©ň‚Â.ă2.ă{Faa{„fáĺd ¬)¬AšžyrË©g>~ˇ¤ iŹ ‹şĎÂź^Oî°yWž÷rč÷ť\˝ŽťHł*ŘJ¤uµćăÍZnô§ÂÚ¸ _Ó0<ý ô›ČőÁě’~.'vńR9[ꥲŽNö®~‰ełKÖú‡Ď•˝j{ĹéHvŞŔ˛Đ•¨}»¦KńźˇťxTŮ%yTYľ·¨5Ą(9`Ň.¤Syxľűß?Ŕ Í‘j‹ľ';âźźź€®_ŤTWć„ 2µ ťđ—Żs•Uéú‰<Č|Ĺw‚mS)Λö¦˛`–đ8×5łHJ7Ç őTt]ůw4ĎR_8&yoĚň*0`Ż~Ă-0¤;—¬¸ŃU— :HÖjĘ č.ËYą\ą+ éĺˇrâá¶oĘ­3ÂjŹj §ö˝ `yáŻ|—Ąkű „Őr•Íě2b"×Ů5M-u’Âţşü˘ôqéđ Ů7ę” ž=Ůăc¬Ş—™Ľd4ÄuÎÇçz2h{ŕřő˙ÚÍŰŠ1­weUISŚ.ץµ RŞCcŔçÚ+jH<ŚĺÉÝn|™aUrÇ—Ď@ŘÜ’{±Ł˛š.Oń˸ŚËřŽQeęó2®o€x +°H;ĂŻśNŃAN grćđ7ędUC†×˛ă99XÉŠjSńś^€ćć`\xNę,mşíëLÔXí,Ąę%^FůćBáÔ9Ř•§ľiľ†Wrj‹Ą ‰7Ů­/ç{Ӆ׾łś@#&e]uĘ=ÍuŔłxUÜ*ްĚÁ¦f‰ŰmXäô«˝Ş3łęŞMy_Ă)«÷ŻeŹš†=đş˙Đ­?Ť2~ä~1OŔjű =řYd řŞZä–ç<ÄŞęšăKÁPęîLf°Z1ŽÖFP›…ä=`ěŚ+Ý-™‘ĄŻéjGv5vIž®>Ť’]­ú©Ň×HË&ŐžŻNˇâmÓ‚!unYßTżäŔy_VµŇ$q›Ž`uS1—–¸:R•¨`.`ę1 NĎHUëVgě€y|$w8jť 率ŹĎF]ˇŘ"Ë=Şý–l0‹S»­¸x˝đL6'ۡ`1%]47?‘+’öݤfŹőý®ľš´ŠŤÖŰ©śŰô­×·Ŕ˛bĹŽąĘ«FW}ٲîŻ)ßĘ>)<çâđ][®ß˛8cMbçâÚz—qß= 3Ł ŐÎäł*źň¶Ƈ_ K?¤đ¦šPápŢ•gyČ.ěÖ+·p…:p˝4){rťNŤq~B#WÉšą˘Ţ(=âŹćú/śŇăéč·?’Ő.Ëj‘ôîVÁl{r aJňÉÜ.CJzý7Č5|qýŘ^ÔV8Eť3 ĐŠÝ“ŰÚö@ľr€pᛉq” ĐR\TŇ&5Óx,ŘS»Q›v…k›•ůFÉq!ĘÝ1˙©á¤ą&»žiń»Ĺ.WQ€i©†ČINKE~ŞC*'×äN ÓÁ ď_ČX5ÇóX]˝†Ă˛[üŇQv>Ľ^řΤ+hWî–fT˙Gsywb- ¬ÉŮăY对Ť@Ű«6}Ća4ryŹb¦ŞŁśqLÝ]Á}Îň“ęZÍ×čj’N9ˇŰž¦'rÚ€_˝¦éĐ6k`Ë©>Á®Ô6’ľT_ž Ł$Ô©Šgsµ+ĽU>‘{„KĄ>“Ő_ż]×±ÉÂ’ę‰ŐÇĹř\eYHaŻ$sË~MeŠ…”˙°9¬©S˘‘ťNirÇ( ˛ć*"Ź?é1ßQN'óë…]Će\Ć÷ŽÂGIĆîď˙Sš›ł“ô\Gr˛‹5ŘőďČ]ăćź%Ż%e´„ NOdµ˝\śa®ˇ Ä _Âę=O¬3e¶zńôűĐnŻĘ9YşUÓĆńh¦Mݧ8ĐÎjőÍúÝ,oé€zĘäx%tWťČM ×ôu÷Vď,Ćař§)–W9|ŞÂ+ţEnń«mÁ>ňP‹J3őłŰ>işXˇ;Ŕ«k/ €ź<ŔÍ{°úZŇl›_kMš1)‘—Ôă©J–µťQ3Ϣ멜 ¨Ř{ZłŁSUä[źĹ.N V¨/č5Ë´gŔ­®ĘN>ŐQ°âáH˝BÚćeao•ű1¨iR®Ő=ť ‹¤>Áöę®|Ňyüđr!î®ů¤4ň@ůFýšśźdw3ž »šýcׇ˛óTq‹%6«2xGÎFhV±ÎłN ©*Ĺ”ďmőn_đęaĐżçó\żq±˛]™ÉZ¸€¨7Sz:ák9ô*CŢt‹=ąÓÖŢXu‘š%ă¦c­8ËźÖo×EzJŤXč¶Ô' /’2‡”;%>Q\§‘uÖ·0?‘óíMł©Ňݎć0Ëő˙ňżŚË¸Śď…©nŇl޶‚ÔöD5©Śąt:]—童LĆ=YKŤx.‹@–›řHçđnńÄ4q±Ň•óňë`Ţ•" śĄÝŚdł(—Ăăčä`!?ɇ/@·{[ögĚ…A‹$Żná”4ż’Ó˱Ćş‹ZżË*ż.ç|Sđkď3µÚM,;>ŁęĽă4«Í-0OG%ĘHíbjiń·`Ş.Ő‹m–ÚK÷eáĐÔČOjx.,U·ý , ŮÜÇÂŞü­Ąpw÷e'wTŽ/NŽ\›ľţ„ŐűG }w¸ľŻ¨íü„yäţ >‡Y8«-źBQť°Ů/,óĂß/-ž«IéÍUőůĐl}s–„0aµćÓ3ŮYLőAó/›t&Ř”ý\XOnkÖy>óń3ŕüMą6[,Ę—8 úzR»ąşâńϲVÍϸWęĎ…OŰOg #ŕűą|ęü d×ŮóËĐ]˙XůVaK;WuoKÖŽ™wk¬‰Ťjš7é(ŐµĘKý¤¦ŢRŻńŐ›śBá‘˝«‰Da} ڇ=5CV>´'°ęĽĄCÄM=˝M§˛ăô $úÂÜ™×[|:%–Ťő÷ÝŇ»pÁr^PŘe\Će|Ď(ĚT~µZąď*óts_çÖmËŞ°ĘŻ%HĆşJëP«TĽłyŇöw÷ÍĂí[ ť>n»&g•eď Îę¶ŕ × ‰Ôo+ŽLyTş[ý÷ĺŮ"O:c‡•‘j¨Ş˘Wbą2ŔB91Řłů™ ®Ľ °Ë¸ŚËřžQa ťBŮ’ŐŇăyÚ>®Ż}pŽ5Ŕ¨ýD}skŠóQZřUŞvÓ_~ŢÄ´s ‘Í |çŮ•łúüň±pҬĺZŔ¤>Ęi.Üś÷ŇÝ®ŰČL]{Ŕ)]Ůžĺ•#űĆÓiˇ–—™ö Cm‹ß̨]đz‹TŐ4U·’KęɉÓęKuŃÇŹ˙¸z˙/Ŕ$„+„Ąw”{8Q:ďôľc-ȵWďČúuű\çÇrmą4ž( { p 4×Ę_…nĚŹO­¸=ĐŢżÖ«ÉN°śZŔßÉŤ l®Éîďć Ű*Cč7 ŤR·í€v} ĽžŹ@Pi´»śŢýř©p‚A.# ¨™ŐjHM9Řć$!2ö¤Věaő8µőcjµšŘÇ4M(ČEŘÇËŘBťşzW@čoxúZq«´ŤćŠ!„uVm4<.%z[k˛r‹Ks[q7uMš›ľ_¸ďŰúą#÷ĆŽR4 çv]Nß$ا–UőÉ枠뀦é×XµrA^ië{`–ÎKn}vĆp…«un¨čI^fę۱oŠ<é¤BťôÄĐĎ·@:ţřđĂ?ńzö„‘‡Ý… »ŚË¸Śď…É UOÖéčx 4ŇűX"t ̧=Ą‚#G'©®TaQUÂzWŔ¬=S>\Ásł« ¬őxÄßj©ZŇ?\¸°Ë¸ŚËřŢQúŞ\çŻ( w:ź~s ¸x$+°,Ďf*:k7€—ÚŞ!mŮc—L“mQľÂíĎŔ|V]Rçę‰\ő7z_aťĎwdµto>őĺŐ×o>ÍŞ#W»’ţöęO‡rUŤĽçĺ‚ eĽúţÜ hî~ tiéS¨Ú¸Čb±“Ľ>śP*R–3łÜčÍËżş&eŐuä[ĺšPžiâе˝+ ‚Ňĺľ$ ˛tkpę˛TĹg®‹ô·•ČUJĚÎ|ľĺ-Ĺ2šÂ~QűSObŁŚĚ/{ nŞç”őT^ýTvWyş+ Gýľ»+w9YÝůąÜ_M„[:hż5ĽÜ”Őe^`ęź5aS g›‹»Śšaĺ *}Ěr×jj­<[ÁÍ@Űn€ý×=ĐŰšNäNFA¨óţ#°Ú˝«HĘ’Ěk/§±“ŇÇ·2‰T´‰o«ź9­úŹr.‘ ±ęŹŢ_§§ŹŔćÍżľqŔéé čĄÚÇ&˙őÜ}Üt®h·í€Ůô2Ą±+Zła(Ű`˘'kë Cu×”śFµÝ–ś"6Yëć‚i–FĎ2jw‹uu]yCUT_ź »gxŮňĆĽŘł*Ó]ŇĽ/ă2.ă{Gaz¦úT÷R)ňĄĂZÝ]ńů´oţ _xRşźÎ˝My"âk ´ňýBYcş°é ą˛Ą Ńî¤ç©kżş-'đ”Ö…Š Çq# TgYôîÇó'€đŕäs tżi‚2­+­fJ&yÉ›XžbrµÎĽ(„×6ŇéÔÄŔot9_ČşvstĐ.d'üą°uĆ\¸ZßQwdV±/wěsŮĎŤ§É*YYmŻîéđ+ _>ýîŁz3Ĺ:‰3Ş] ćŔ)„2Űz);vs}Mîř›Ź3ŕ®k€9s ±*'<rGG1Ď|÷¶Î§ô÷n‘'0~bě€ NSj  o1Vé›űn¬˝–Z Î ×djý‰JQPÎÓúNź€Nţfn §)ĺWűsůލ¬ž9¬E©ńkgrg¨)ďý"3A߸Ty=«-Úĺ»âűő®`I骭guqúęĹ&/Ľ¤óŤN®Ţ_1°Ç‡?€n{L˙;ŕ·?WÂI5ÜX˝Ž§Ăďdő™˝š˛¬Â-ĐĚc]°ęĚ Őo>é»p[ľżK]ű–Q{EĎÇčÖ"bWĺ9#}źKµóá‚Â.ă2.ă»ćÂúZ°ý!ŐdI_x™¬°W—Ůüuá°Î‡ŹŔîÝ_ńř ¸Ř–˝·-Ő~ZhÍ]]*• /ż»ű˙…\7LĘLVŽN¨»™[ř7ÉkLýž™KrőŽŁhÓô,—·ň‡ÍĎ[Hˇľľąć‹áZo+; ddľQB˙_öţkI’$MÖ?Q`ȱHÔŐŐ=ÓCCK{˝ď˙;tÎ4¨®JČĂÝ +™ ţED#Ďľ@,™^$eFz›©Ş©°đĎŔϰ@Kj0N*ö˛ÚhNTY~&łŐ»ĚÔ4—4é”uq=T8Ş«¦âyTR‡”úżĘ¬ŤÔŐZަóh~NűW _HS­Şž×H9uMJ­˛Ď;Ă#ňF×M»B-Ď Ô…BI±ťúϙә+łN_wjM e*ľR>˝rDZŔOâ+×ŔţëG`uuKqDä|PŇÜÔí4îţęöG°™kÁfÇăátË`lűüI-×WwŔń©b=~Y—ócŮm!ssÇĂ X4Ĺ%’ş&|ův(­_Ú+űÉŹ$żDÝă!Í ä…Y'P:óˇüąb[’~Ŕě•}Č÷¤ňcŞő]I‹“˘ 5ď°Ü 7ŰVłć(ĆsSމ˛ŰlĎ4‘Ôd:KÓ°%yTç˝YňŘčaÓx%ýŢaű —Â<˘„ »—ăr|ď(Ěśîzj*Tިáp:Ő˘-Ău@U?ägł˛F'&SmÔ'M6łÝŻć_âÎJ»ý«r\'´ őT‹ńQľř8i–ĘdČ.xҬjšö€·DŤˇŕ;ń_Ç ąU^řž4Ż©ŻHyübŽÔÜ(ąLĐé”9y$•/­ŤôqZ[,eAhh6…Q˘|ĺJS§Ą×VÓŤR3Ë·ĽĘ<š)ŹbüęOrj¦#&Ą4ú9á/9LµĘM]A^Íŕďß”eUuźq˘Ú*•'ˇ$W­ó ,"Zől6$ĺŃó$ Wě_ŔTT±—Ú~(ź—tW÷ńUłž·XÔmľk#ó« N¬7ł„;SŇoó9qÍÄÖRçµůĚ›Ü}üő 2)Ó¤%”˙!µm‡Ě@ĄîT%úöůłSRE`!„;›Ĺ—éqĘiç/19µvÎűĎ-˘úý`q˙3‚걇mF(ş3Ó7®Âń3Ŕâš4×elş9Ă|©Rt~ęͨW7ŔxŘţö-ŽŻŔx:ýpÍ-p><ËŰ29i‰¸R}ź otŢÎy—ç ¤U.´Ü %čö”ĚŘÂ_PŘ帗ă{Fajšł,s!Żîđnâ˛I`ÍŽţtµśw‹ĽźooäÔÓVűś×jő¬XCĄtö~6[śQ@6iŇ)ߢVkwé”NÉZyJ׎eh #ĚĺËlÔÖ>˝äćžśú ݶ”hň¸‰ˇ°YRťąłţüÔ˝šMI ŐĘň¤Ć’ ~Řţ7)ďÜRĚĂ Ő p±ÉÄšű¤,—ŠG=1öÎ-éüHvüď?NÚeS¨9 JBęmÖy/ö Z‘śąĄ–şË¤ś©±LPwďi˙‰4ŤUž‡M`ĹĐŮä±'ĺĐNŰ/Ŕ{ «W¤VËlP»ĎśełL«ďś9·•ć°ł®#ťĄo%ßÂą5ink“ÍĘľQÓOiltëk’cÁĆ®ÖMíHţGťĄŞúłŞKŮ*•Ý3]ޤ¶§BrdîĹ8# ĺŢ]Ď®ÔçŚuŤäp‡#°ą˙ßH©ŞÖz-·ň˘Îč;eůŻóÎ&ŃÎ.3Çíżmw[îчˇ¦8‹Ú#ę-€Úć€ËĚ$¶‹6#>ńČă(=ömňHĽäłj}T§¤EŐ§h6PiîÜm€ÓîŔI·žŔúç™§ÚM]Ř帗ă{GaZ”]©éŻ­I"”;*}Đé+PKÇŻIÁéŮëÔ‹YŘ“&b qĐ*můĄťQĺ”VţÔc$Eµąó×wyŤµä{µO 9!˘!VÓrĄ´ŻeÁ†–riťĆ·…6™­çĘŇý¸ë¨¦.3/j9ęXˇ“ZzáŽiÂ(L×x ©ć}|U†˘ +c¬<ŕMţ©Ć#Ą­OÚź¦ió—ţę 0n_ƕлŚ&,§AxPh´Roó&A:Âöď@5Ýîć 0)Ů=úĚGXăŃŘÓń+XĂă$nBę9Ó[B-6P.…ő0Ľüß@nIą§—ż“đőőűüúJJŚĚ ››˛°Kß`ś©źˇćHn·–«A¸2Ě:%Ç1ť>ieźK|PÉŚĂ ÓŘÜÝ“çÖ5ͬ‘»h¤¦źt®öe0k~•¶Ö–vt;“ŐP8S›]’oąM§ó—ŮÝKfZĄ TÖµ—[ߢZGňH77źĂÔJ!îw™˝jW·$µšMĺ°ßţ¬îv»,ZF¨ęü5ßos%šť1*Ŕ·Iëź:^•˛/¬şČ×´/©ô: ¦¨3î6Î÷ňż—ăr|Ç(,ę g¤E­ŁI–a4M‹ü{˛äX9 Ňľ[zw Të˝Tŕ_€în•ŃÇ7i\š.iţ˘F9eä‡L§O€_ţ×[ÔGi’­!cŤÄݸĽj™ćH­BBRÇfÚĎV°˛>XĂ €¦ZË5)[Ő/đú€’W•Ă1ű]ĘőO“Yu\*őP~yw[8—jć•›«Ř4iŞKă‘ĺ¨ăGÉúŤs,†˝Ň/GRăa·P®ĆDęŕŃůTÚ»ľ|{GNČšµsJ ŚqĺŢjRfż‹ĺ˙ TâÔâUÔ‹›ÂU#Đ­îóý&ĹvÂĹ1^MŠťS—â %ÁUĚŽËçJćňTXUp¤ŚÜ4ő›Ą‰™RI®Reď2úÓW@Ó®IÎĘv}GJ¦qŇÓŹGŇüÝ-ňk Ç9Żnްô‹ŞľĘwW O@nóU÷źF{Łá…Ôź‚Řę–ä ‘ĺ‚Â.Çĺ¸ß3 łmřLíjk‘­6C ĐôŔxţ 4Í?ĺUBkÂ$Żůq °Ü<ë .?qùϨŞ2×ţ"ó\ć3¸¶ĚŢÄ-z&w;©H¤‡Ň<ĄĘ ÔńáFRŽÖˇ˘Vg±ęÔűťÔB¤ÔJ[—¬ađµüŢp 9™ŞŚ\†ý.s Ő$}ó+)=Bó”ńđ+PŻÉéQ®đe–{ŮÖ¤™ťňĚÉŘv@”>®mńüLj]ě6W@+§>Ł1#GRG§©Ăä"đ]ĆÂŇ%ŃRiîI™ś%˝kžË„e,Kh±t§§äŐ2…Ô•˛‹93J¦Ó¦/$ž®7îcH2ޤ óH†2st®ÜEÖňíĺ"ěI(·Ľ&»§ŕ»·Ŕ¨VÄz 4ÖR^Ďx7ăwäl€p8Őú‘ä Ă0˙€>ŞoÖ…S6‘çW¤¨ÉţËľAg>ą#Ιq®y*v€oŻóŮÖů4˝ľđ‘š–Śal2nŐgęW]fô*Ż ŻeŢ}#7·ňĚ;)bJmĚÚĽgWËúę5ÉUŠżíH4ŃŢd†.*ĺ5Îz0őäqęŮ(šAyT•ZÇ—ăr\ŽËńý˘0ăžÎϤä諸Î;gµLZŤ.=ŕőŚlôŐٔݵő!u@đ)‹Â&›R˘ë ݶŔ¤na–íď@sýc^{Ăř“ËĎ]·şĆţLĂ3€¦Bç3ŕmő®(YWYGf«ß¸ź­ŐRĎÍ·´lęvŽ{R?V›źJ›&JJŽHËő¤<oľHÍKr9A‹ćT0Ž}ŠĎ€ŰĽ/ČHÓ™PĄ ’‹†Ľ"uë·ůŐG­Bb蔋pȩ˘xë¤Đ±T,ŰiÔË[ ŚâűZr&şÁµ p‹™ˇZُŹ MŮ'ě“~Ňu¶Gó-,Ęz›H˛SSĺßhŻfás3e“ő Frú…R+Ş’Öëf©^ĆáJ—×tŔ0˝f´l†.|tŞ°ÉźÂ»M”ňWţ:ăS!¦č¤Čó3śRÎĽ±€Ă”˙ܲL[±±1óʦëšr&í~p™3ß…”Ó;Q†š0—!¸#PI+'7‹ć–!şëvŚ–„ŃćOqÚ~ëëĽ+Ş-`ežąRüßtˇ…>ó\6gôĐló—'éňľq•şYC…rw/OńËq9.ÇwŚÂ”™íW7e,ˢf”bsŞIÎL–a ‰Źeë‹J85©QĘŁ_-!ő„·€żú±¬íJťoäÚ{%9ë¶xî}sCšŃ Ç’iúűɧdz›?jň˘Té\΀xőÓ4kRßLJ=›€xÜ“,…ć´¨;ÔUéÝ޵ôqçţ¨ľË%0 B%đÂhÝ»ů"•ńHŐ–<`©a]ĆRŤ[ézť×ęéřđ÷˙Dîd"6ÍýŘ}ůO [˝%§hĹLSAy†qÔPĄvn1;bm,ä­-gŰš4}FÖ#fMrÁ*»íg`!fd±|»"{3ĺyŔ¤Ćň«{ nnâ¨ü&ßEá¸ĎרÖÔďĽĆýIO…ž”,2ÎÜšş˛Ă đË ĐO=ШMGÉnËGRV-ë0íÜíűü‰bµĽź% JG®{f˝Éßó?škŘçź”7vę_HÍOÉ´,tĐŠWšN3ŇĎ•űY™ţřŰw@^I9Ńy`xú5Qy6ä—ŐRHJ9_®ńŔ°˙ ŚL@§Ä`ĄěUđň±*i&`Šn¶r…#3ή(&Ëk3¦Öë_ČrQů™Ăf¸ĺ·\PŘ帗ă{FaB©ć”ŮËZR§ˇš~ă=ĐOŔ°%÷ßTől5ĐĂ×çu&âÂB~ŕŹÓŔwŹC•˙Vjš9eçkiĘĆŚňÔĽ­TłZ—Ó'`8~%9ň-­™&۵yr·ďŔ†+R»¦Ď«źe4 M[¸ Óč4·céÚ©–·ä¬´jIv 'ţśhŢć;'ÄÂËX&z}Í˙Żö ĺLLjĎÔݢ&_ľV&ĘŠd””+#pś+ýU¦éßÜq˙L—¤×l®ŢCż'ÍR18^Ň#¤°·)s,č8ůÔ zšűG`ÚüŐÝ /”&$ÓÁ[űW T«¶\5WÍđHEi9¨ ·Řl2B‰q‘ą-Żé˙Yß ‡Śńϧŕęţ'`PŹW«Ů˘ń2ß1ň±Ú;77î”™5Ýçăëg ®IŰ.uJ¦Ľ˙âń¬)=gc,d—&›ú.î¶á䔿­é»9QćÎ%{V)~–˙lsäűüUS;Şľev9.Çĺř®QZÍŠî#%hćұ)MÚJđb3éP4W˛'}™† ć§;‘’§ä©T¦¸TW,”qZšň<NE٬]±µRʤx<ĺ•­^u@ÝÝev ŞüźŘ%18őý×cń˘ÄËĽľ9őÖŚ»Ľ·4›g5…çýhĄ]YóhÝń5ŕ›XŢľ¦óč_öůěÓî¸R^e5kůn<0ž”;Ú’¦Wô± łŘ‘r85éÓ WM<±Éąţq¦Hš-jćl5ĺ×Ó ŕ;©B^?­ETKR†§íäÇ’8fJe-¬€I+äyOžĂŽ%U5žÎťMęć“˙ľi€jąŞýů25ݍťE“>)Κv śľü=s¶^µ]fŁÖ÷ż›źŽĎ®âIÓş‘śŇqÖ"Řf Űźţ¨×oI˝ßÁ”\Rť3zJÍj 镪Ň,e=:J‘CMÍĎęŃi;Ň\iuý0ĘŻWŻ 'b|GQ®é:+űÉÇŻ¤LÚ”mvLm[Ę“’ćkRb”ĺ˛őeOŕKţ‡¶4ŚĘ%öa T]—o®&ž€“Ř®pGRN… îçhV÷Ŕňę-0ž@+ ŽĂlîVą«Ś/‚ś¶ľhĘ+ÍÓ‡ß2ßTÍňď­Ë‡’ÖŻ´‰* ó€Đ7ĺŰa<ŁĎ,^´Łx'uN›üýJ>ĘPvB¬€8ű¦úß\j‰×ßÝqř,ĄC­BPŻoËßť)¤?y*{¸ô×ůŕۛ̏[G­ćř‹Ű »—ăr|ď(LţoĄ¶NRv(+}‘Y’*v€»~,켊’F77@_ŔBÂLÍT«KY™ŤkRöCŘË}®6fĄ‰ő™Í‰§9߲ö™ë™“4“:·ÝX<üDŇ‘+ßŇžâĂpőM~şOŇ o?Íí †Ňú'Śf‡´ŃÝŽ_ŻĄÓđKĄ/©CPëžZ˙4AűDrY˘–z­—›ĚVhă•{!Ö¬]dÖŔf¬ňf.6@­ßkÉşh¦[RąĄnť•ÚUsź_uĎ(ß]ŮX뎔ĺŻÎmKË:)sBËť‰5ëő+Ŕ«Ë]žÄ°ĎČ.µ%Şa[l`iG·9TUšÖ(‡2Ý„űâ,ŢÍR«„ľutjÝ.Mť¦gŢ5’„ĺŃŇd©żŞ·?˛˝ÂyúĂ °|óW·ËH\9ş–rĽľ†ń”qMJ|i2»ç¤… …źŠłŢuĄř[^‹ż'7xŠ”#bĚWmę¦ó:ř¶1;ÍŞĄw €źqXÖď©<ä±Ď ćtŢőň<ń׼]ýË'`qÓq8u˝Ó4ŇÍË ŞěVł}V”†Pm~Ž$Gd­ť‡[EŽ GK˙(gń¤¦´ęđŐLçH÷ »—ăr|ç(Ě&&¦mŮÍú'`Ü}·Ď@»|ÄÓóóľźňĘ#ÇÖ$ÍÔjőL‡ß€ó§g »äŠÓÍć&3·—qJĐďfýĆ–ŻiÚOO¤éË«ŮŘf^ĚŇG‡W Ů(=]Şź1ŻĄ•q=”ż«eŢ•|iĘŇ‚WŘ)µbkü6ź aęĚâM‡ŕWWĺ,]Öĺr8|š›źţ|šX:˝M™'ŕüü;Đ\=őÝ{`8ő~^żÚ”ëŇ,§Ě C@ł KËşýîŠQÝHmá}Î'€eλ`­ä^WĎ8ÖSćzlvŻ™ť©ñŃä±Ëx­ 3Ý:ĄĺŰv9ĆÜ)Yě5ßięĐvňÝBxŞńšo5n)ĹaÖ0oÎŤYNŚ4zí ¨Ć’U§˝‚€¨)Şzę6ß±ő“ôYŇ!TEőf­ć•öĎżM·,¬\%6p&7µ÷@<Ě;l=LuľÓp÷@T˘ŚĄŚ‰=e”zAa—ăr\Žď…Á čaľiŁY˝!ąđ”č$Oeµy$iÄLďµ^ťó Ĺgť^__gVK¨ŤéTXSl9 Šů’Ąj€ó—_ĹÝOďśw#&ßI˝&˘ňö[°Öß ¬Ą™=ŢrÍĹÁ©ăŇ’'Ö¤IG”ŻpyMJ)Č‹8p>ŤŔňzL§Đ÷g`Y—´‚±ź€z˝.ďGWŮ´űĹ!kYťâI•ĽV '%”gYšµU#-5÷!c iµ™ˇQËĄ ˙AŇÇŰ˙:«IöÖl$%—ÚłµĐý6śÚ&‰]9łĚKS‡ń¸šő]Ů´sJO­¬/[Ů®ĹňÂČÓ´ű™h›J»ňŢÔŞĄÓ#(|:Ś@ŰéťHcµČw¸5ŤjjJpj2-ť­–H!ĽÓżä«oś83ç‰&Ľú–…âŠŃľ¤ńęúžHí«ë÷?R|…ÂÂ$\$ç Ź0źI}漢ˇ\ÓjZu'·lťŃÜ$í›)ě† »—ăr|ď(,.a˙ 4Ý ÖÄ7[äě?Ć´Xć™yĎN_óşęĽŇÔţ֔שÄt¨ F9 `:K•V¦$šÓIÍßÝĽÍëL5@w%UtQ˘[łw­ěíŻ@k.°˙®Ţóôúp %”<iÍ”çi ‘PŐ¬Áp±č€áő ¦SľľĄGT@ô薋ڤ*[§Ś¶Şę†’W9äUČr¸üŠäCĂĆV1o2·Y,pŢžĺFYf]F.ę© MřeéŹŃ%·ÄWWüžsO\ęΙ56éN0Đ2eÖÁc˘¨4•f>ů­ ł©™¬R4bÉ˙Bóĺá8[Ďw$÷…áŁ8‡a úg˛¶®ëv=ąU+óß’Ę/śů4 Ó}¸Ę»ÍŁ­×}–0<ő;˛Rňđ TWŕÂ:˙Ś0Ž\ź±š€Ji±Ë»Ś.Ą"L™®]ćęĹ0ôG [ʉŃQúäŘq}[0ٱśÉ™h-JjĎ”ŃČTžÜMŮ!)ˇĚfŮFĺéYĺ»Ý7-°;}:Ծ͸l>CŇc¶ň(DHjL‡-ŕnŢ“<śJŠßö€çzvž‹ĎşnVŔ4\Ôů—ăr\Žď…)Żňú’ŮĽn€ţëg`ąZ‡ýX*§\O˝IybgÔ5}K‚ăńď$eMs·¦ýײ»I!5¨Ó°.Y–ąŞuc} „­T*Ca¬†ÉůĄ™Ô~řő Éł&Çź› 7dLś±6n¶ć»Ś)4IŮ?ý4r&δÎjövË«ŮĘIÓ·ńůh–bĘ´ň+Si“÷ůšéÄ lĎŮëëóú%0>nˇľî3©uĆşd+’Ö¦˙ř_íĺ” äFµË+`8ý9ŃLÝ—Ą1(ťy4+uöHő&Ě5ë4 L¸ÄâimřŃ’·Árť|ivPF[ÂwŐ — \n€ĐkŤmI.Hs›jč=†Ň™]ź‘`eińpWůś›cbóď¨i:ćt,¸2ÎŇAüâ!Łžş9ăń#Đn~HX¬Hm󶫆ňéŞyC•qÖ´űT›űĽ›Á¦x‘”ą–ZŻV@ĐÔ[˝Ťä0žÔŚ}“żAÁv3¤"pfÝ©Š±`@)ř§ÝW`0®îĆ)ďÉ,]ßg-©őřú@ł|Ě)y{~Öw˙T>~sKöi3Ęź`mžňY—=‡ňËŇOÎßËSür\ŽËńٰp|wĺϤ ĹŰ/€Ĺő»ŚęŐ{ ¸â´ç}}&O-O#YwŁL!¦a îLިšěMW˛Őú=Ŕö+pÚí€nyOJ#°µq¬HŮŹaň€‹Ć3Đ(Q`ś2©,řRjňŇ•­µhŹŔą˝ęşÉëŹőiVŇź2>2 Îp$ÍËB(Úhqyb=úýÇŚĺÜWČ9•ÚŃ] ĘÎďV€o”Ě5fţB¬Ťńćţ=0]˝É<‹µZöÖl‘RłN(G3ô@mYÇ\ŽOźH©§ňÉƱ諌 ©ÁČŠ4ë‰4]rĘPU÷¨x­đʇjŽo¦§·N)uMĹ đÍ˝čO€ţ9ß?±ľĘë˙túpÍ5IO¤iŁBśź~Úő}Ć>i,×ătVµ’~Ď÷jëo€ŕJ[hŚ»‚,yâ¶€Ýó(7ĄÎĽˇĺkÖ©X¶±0qU,ŻňŐ7(ťťPŚÚĽ­ëŔפî0ĽNÉú•š(6äąeĚYěĘ7’Fc<˛•¬*ÝdęÍ=pří˙:?eĚ(ő˘vM]râNűg`uý´‹ 0JO§s}ő\‚±Z“n í!„‹Çč–o F3>®h¤ěó®ĺ‚Â.Çĺ¸ß3 3Îe–ť¨ńZÝ,ďďóľÔ/oIŮŞa˙¨el?!lÉ9MUIŕÎ"–4Ń´*ðڒ€ÚŇö,G{mY‘ň<fD™ÜĘžH,ŹÍt×ŔB‰¬Öá,µÚ&Ż9QµĽ·9“$ÓřáLR‡Kď—k ˛|W%©]ĺŐµľŇěOyg€X»|‚RŇ…ćÚŽż>ţEĐ7˙äĽ÷PX#ŘůYíz,\U»ú§˙$÷*i•›¶€Ď•9Oőj%Esś1Ź–¦0 ^­)şv)§Ôf´ťa˘â©\ńK(‘b:ÜÇ'Ŕ57…†Ź@0ĽĐ’Ú Â°%µ X”F(ůr:2w©ąs˝|Ciµ!spÎÍ&­ő‚$r2E»ĹäŽF`8Ŕ⡆°<EďîÉŠB};4Áh®ÄcŽ™ĎŞZů ůک㽲¶‡[RN\¨*Mžĺ`ÚĎ\.ťf˛ŔO×ŔŘâ¬TěŞtY’OJÄ“÷Pł]ńbĐĚUb_‰Ň1źÖZ¤°;eľ˛é<)™Ł“†T<`(îŰŘ«—4+BRKÖůřµr/ůźâ-Q.ńöŔ¨9¦uhĹ »—ăr|ç(Ě&#UIŃ´|ĄSĹ–ä“ÜžyÍM^!™¶€·äoźŮ®ĘśwĘörŔt~ÜJĚ…&íi« ç ¨Żn_/3ă7×ä,ŠeiýłĆcaĄµŁŕŁ:űÔTXžîŇI[Z“eEx’ßĘ|jĆb8 j")¬1Ë᪚ŮěĚֵ޵Ŕřň Řď˙®ßţ@żý Ôë7Ŕ¸ýp~Üúh– 0ěůś ö5p>쀻Űa8q*óqRR±‡ăg ę~ČčRł6z ?ArÍ Ąę ňÖŤ3Ö¬ ÓéçĹî‰÷´L… I뤥Vsg·Ľ¦A4!¬3iR,Ežo¦qa“ŞĚÍÉ I:{ÍřĄ’y Ö]f=ŹSź±Ű4v@;{oĘŇ ÇO€SîČxjµÇhŻ—Ý[ű÷óhnnó.ˇ^Ýĺ«p>~VWo ĂĄôů ´PöĆ4^gU÷­ëlŇş\P¦[—ůŮPI#ćß.€qwŞEÜň-püú7 [ßgl˘l˛”ř&ŻBQ´űö8<ҲQ<ú§ů4µ{Ë5\Żť 3~J3z ?mÁĚÓË+9Y/$Ae)¸i^/*ęóâřľ”€•ą†äÇ”[óPŐwv9.ÇĺřŢQĐ„˛Ř‡#Ŕ)f~DĘć‰řGÎ3’§ĚRĄN¤~Ëů4¶Ĺĺż«9 WÓź4eő2?q“ Ľtn›Xdq›×[ÓŕďĐśĹ&e#ŕôďR”Hű®¦náÍ¦Ł´ ǡľS!.ÉIÎçĎhk–ˇyôáO@µľV§ź3ú=ś?fˇ÷YwR?Ť$ĺt<ďInG‘b»%Ç‹I©„R'Oj'ô[ĆĎ€Ż€ŻbfÍ”žŞ>­áB”–šëK‡ÍÚô“öߪá˝_gÜšR4P_•NK­‹$Ý_˝ÉXŔfOuYĂ…5˘adµćۡqX: ‘µ1)9.¨?\×ÚU¤‰XcÎÇřëźI­NN÷­U0(7˘\Ó¶iI×K|«fľ–}rNäLŇÇÇ—d3;ĄłťÁf”Ęő5'ŕ\&l«]kń)a¨ăŞßNîEń°ý¨çŻiörM¨íô iŽ©™ď lä.ć׬»ű|'ĂúćŢóŤhĎv †ň‚'őşŽ®ď†O@VAßwµY.c´.ČŮwŞn€j*˙®}“żĹć¨ŐŚŐ_ĺ—» °Ëq9.Ç÷ŤÂ N ç˛Ú{%1VopRéŹ@ŚĎÍ-IťˇŐHúńSN-rZյ˵vni^N}Äđ PÝ~qť×¨II‚Ž/@»Ľ!OŻ(IöŇúŹ{e*)aBO}Mp¦ŚűbňşgíÍA˝M~‡¦CQ’äL˝m.Q_”_ĂöÔë.Żoę框p:JÎĘP==ýń+P·?AüČĚĹfĘu”ĎŮÖ˙3Kh„ö JńĎĄłâ@š2”)r‚® …vĘJ”ßÉŽ±Nł|Ž!Ś@3Îäj6%śÝuǧ˙,oß“TŤăčfWĘĺsPXiu2׍Т˛[ÝjĆ…©)dś«}›”úv9.ÇĺřžQŘ8ö@m{uiµĺ H‰őăy ÔJ[ťÎŔ´ű ÄU4×ęÚy.LSsĐOe…îű,ý·UłKőľÚä5Ó™&[éfĺÜÚ;˝Ťé­ŞtľiwWł¤[*uîDéú.ĚŁł6ň=ä2+˝ÎŚžůÓż%Ĺ“µUigsFu>¨=SótűËBľşs˛ö-ÎŇPäŁěnHę35śv-ŘVgr:çoÍxŢÍő]~~qCRoI÷§.TżjHŮ^ÚŮč;XQşÍ2hąZjňygc'»^“¦ż&§°ÎúáĺsđRŔŰ,µĚúµ˙Ć-©ý¨»^eÄzq‚KŇÄÓU %»UMš}~°SaŐŰ}á:-WNÉ.bŇG˛‹ŮĘ(hÝűO—6ďËq9.Ç÷ŽÂĽX§~ŕŰ®[ 4őSÇŻŰäuĆÚM´WÖ¨™«ĽHT‹ie‹™tg–Kˇąˇ&ŹçĽÖ«źÁ4Ü捒şzÖ m”´/ź×ă®UľŇŽäľLůJn¶fbťů {Ňż´âż@%ÇÜQÉ÷7$ŤOPć·:Šĺţ3ĆGŢş’Ŕ±ľy ŚŻ‡ĚšUĘłk•Q&zĘÚhÝ:`OäÄ…Ş JĺIiÍ´Źç®˙DVč“Z˙fx8É©ŇßeŃóE]a.”‘źúÂJ¤zBá”}ąg(mRFĹÔ‹Ň%TΧĺOu)/_×7(»uˇ+ř6?ÎVxy*Ăů\~f*jľjö–©—Ŕ¤‰¤Rş„tŞűŚ©Ţäw5ś?Ž%ŕ7oHŽ`!ĺvu“ ~Öd4ŇřvŚűW`č'RĆśo”hňBňئ.ërĎbš5TxĄ¤*Wű S2ŽEŠVšq´Ľ6ő'‰ş8·†5K)-N@ÓJˇů·Ś+-V<éů „ţ+PmnČÚ´zÖAIëSօΆ›ŕ¬>„ćŻĺVreö‡YĎ“ˇĽpęmęĎ€_<_PŘ帗ă;Ga–·Ý-xx!uŢŮn|ÜQtĚŹ$w¤»ů§Âą8˝~–w?’ą‚’ěmőžĄ)(oH*3W.çĘĽRĂ$éˇSÂ:ă$GXGĘĚę‘Ë?XŽŇ’”ÂN\ä§»ĺ‘ZfCA460‰Ňľ5 BÄó ŕ7”×kfë¤ĚĄ-(*‹5€9Ý”¸důčq™WÎi,á»ĘśŞ0C3#Ôµ§¶măˇJ˛RŐÖyÍŚçYO»X-©ŐÖoKV‚8 @¬K€ÎĚ<ńĘ·EµgÓ@!wĄŃ‹1.©*+pŰf$fWÓ¦oU&ą,ęk LĎäÝÓą ťVóSń›¦Ă˛=í€ZI' …ÔŽA,[U>»cťŃĄÝO$÷ź_ü”_'ő0ńŮ’›«ô‰Ô€=”ć'ýßÔHŕv)DďgěŢÜ/\îF5´›vOÉYłä;ÍÍÝć˘] ép>Ýş¸Y4ť·fűANŘ)u#F zř‰”¬k ®łŮ¨sW™Ô’ÓVWSY5ŁÎĺč<(đč÷7|SýJĄ©˝PŞŹ@ÜŔ´Ú•żĄ¦ 0Ma˙ ,n~Éßńi/ć]y…‹ »—ăr|÷\X„Łôč+’,_Ok!¦^öٞß’çęŕŤ#°¸~$ů¤i©%éýuĚ'ň†_ó“>)ł”| Y(Ż&%Î8Ď{r¤Éfâ}&`ΤîEi†ý)˙ȸˇ•Şä%‰cŇ|Í´ćć+Đj|—φޏq Rr‰ő¨K–ůTE,ĘźÉz¤bSb˝ş ôˇ5Ąę š;ź(Ý9-ŕcĆ8ÓF‰c˛Í–śŐ!śĄóc|–POqSuöĐĎ@€| ÍźpA°d+qG Úhr żJR«1MÇ/€k–啝˙w™˛f>>ů1+Ą_­€p:fś%FµޱÖĹŃĺijQ'˛zn±ú×Ď1á´hqU»$ĄËť^Ľđ‹U›.Ę9±Tř25žN[`yý6ˇ5ëI°@ĄĎŇt§iŞUW>ËŘgŽIŤD)Ć%f>1©«”łÎH?ČwÜm€¶[‘rz'µsZšľ^çś_ŮKIÝ‘}¦UKr×­Ôô®ź×~Őfd­4”fqťŻ¸ífü ¨Ú*ÓÝÖ—z V.s‚ííma]5w¶É’‹ÖßŢś«ťîgócôv9.ÇĺřÎQž˛AąEĘfZÝĹ-ŕ51tÓŚ˝’źţ#ŕÜP %Ucć°*ká^®2/ ôŃöŞ&µÎŚ%ĘpÜl:Sur„ťJü2]i ´M¦ú]ţxňÁUjIQҡ­$ŻätŤ1äݵ÷şQĄrD{RĄ”2b%4ýŃŞ•zŹý{•φuk[óćq›ľ˙úw r·ŔňúčŐňgZvKţśň§çĎ™IÓ˘žo»5ŰšĎ=«¸ČÁňô[4żłäĚ„łz¶oňy¨BCš˝'XÍ®—1µŕ4%űĚ|z J[O3vŻŃv ß A,•ő$9ľ)ĚsÉ‚¦­Ş]QĘŻÖ~– aVČŻź3S#ZćÇDҬI·ĺÚsĆČĆŮ鎪gŤńĂđë;`śR.®Ý3ćW™"Ć‚ÍSŰ[sB[ö""…¬ˇ5ć«j í ĘkÖůüxݱR„Iű6SŘŮSr˙÷Ľ·p,ňu9î>ÝâšÔ*d“Ĺó‘Ը޻KóÜŁś3Ő¨6Ňß)‘˘ĆŮŮšO.HéÝđ›Â!ŁŞÎŮŇ5©kz|úŤÔШOă8k°˝<Ĺ/Çĺ¸ß1 ÇQ߽Ɨg`xýwűŤń+†˛V{ąk’vŘ•ŐLeäűŇ›íüÚ30XĘ»ş·›Čă¶Ľ¦ă?Â’¤>óý)ă/ůÓo_ŻË>˝…WŔKďkg­3´ď3_ăŰ5IíbéďĘH’ca žRkÎ7EŐ>ă2ŰůËa÷`Yg“®Żßn€čĘLs”¶{ą¦ýˇđb¦ŚSľkTW?ýËß2™Rf·ĽĺOY6@éN7…}Uăî)ŻrúÔÉ= )×ÉT×:Wš ÚśîTÝ5ŕʤYXš9Îf¸QNĎ._Aő'ęÓUłü)fY¬•Ą/Ěâŵ9%‘ĘűQö †b|•q~¦ľyĆí+ŕŻď_ß’XÖsî‹ŇÍüJRžţ čǨ5ĎĄ Dű¤ş¦ĂŁšŐMÁ¤¦ŕ{ř·=^Öl/Ł”Z59(gµš}^1PÚ…LŔ™_˛h˛ŚŁłˇű đ‹Űü­LÓů-°Ľú úĽĂ™ÔK_‹#Ö;roZ@ŞRűŰŹ€[ßžT{Jç©ŘÎj{ň™ç˛;–‡|f¬őUťö×ď&IŰ…ëĽ<Ĺ/Çĺ¸ß1 łąĆA^HŐűjÇ{ÎOD1_ÎŇĐ{ňäbžä9δÂĂ8;`uőHi˙ž€Ú_eÔ“ĽT ÉSYßýHšˇH•ÓoÍë•!ÓjíHę° ănĆg}“őÜIű«6­´b(śtFk’®'NŽ”’îĹć4…—qÝ^ź¤ě!3öąŚ+||Ű‚5 ö‡ęđ )·c<ľdDgO ëqŻ|(GJ†H‡/Tˇő6.†Ň+>őj¨~ Ś}I QŹć\JmuĚű™Ž×ojŇěl 0+Q—`AWV×Ę‘śł†‹5um¦üĘ“2Ńf9B – UÍЇ”n–ĎŐçßh,%é ôůőŤ!ÚÜŐ°Č×TüŕhéuËĚözŮ7ŐĹyú,Ö+ Nek (ÇŹ$…ÚĽ\ą¦6Ŧ"MźO'ńPş—Ćümj®®ńô™¤Rź–%d5%#צoVë ó0ś‡Ě7Yˤ…oÉŻR§“g-P†[őž‡TË:ĘěŻč!寨©Ű2Ë(ďMęĹ2ă/óNŚ}F¬ÓîżJ÷€Ü»±ĆýŻ@}ő®pguß’’N„řä‘ŽŻ€»zÖ]_Í0V¬úňŤžÝ3v9.Çĺř®Q8)qů°`ŚčŹG`Üţ ÔËŽ”ó]ůY®f.B:ZÂęĐ,”z~ uÚBëĹŞĽ6DůÜÖÝý¸Í{ Ş#0÷@ł®óZjZ*% O%áŔ+ĘjÇĚ€L6 B˙š×üó‰WS–‰Rrkő-h¤¨2sĆÁÁěśR?“°qjăÔ·Ô¬ »*¸ěfšŻŞür•ŻŽ>‹!K1“s˘“§ĄĎ˙3şĂkĚÔĚaJ4K3>ćĎŢ.Ţáď‡+q’'kíáĎ@'6ÍićrĚ+LŰ‚›f©[–ş!ţÂôôG ×™»±Ź(M[ej»‘Xsş—ü®üň«3IżféÝ–wę* ďwyµźâlŢ˙0Ľü€ÍLD5JYÖ“tFâcLZëäšś¤ťą‚ćwší*éÁ×Ŕë˙ŘĽů i lĂ(FR:ĹжkÜ>‘Ss…gŐr¨–1¤–"”-쬥ŃŔ“fdRĂÉŞ™ď<©µ–‘bë™oŐRó¸65E!«^_ڎއ-ĐH‘7óÖY¶˝řDúr?ŹÉA!ÍQµ{ŞnIö*ńŞő@Ř~¦Ńq9•¦áL€·¤łŹ™[´~ Ĺ˛ †gÄ^Uşą8Ďk›ů Ô2ö¤vtëKťű…g¸)ĺ[D˛‡ˇi€éĺĐ„Âjé˙Útr‘ń—ö@é+!YÜCxjn2?®;ĘĹ50î~h•>2Íć®0qöómľsBj>ʨM<µđ2Ă PŻŢdޏjŻĘw\;?¦Ľ«łűůňż—ăr|Ç(Ěöí uľÓđLň(Uë{`úürę¦é}Ą ‘bĺ¸îŔIĺËę§9—5Ąuňµ+ÉsĘ ćhü/š{a Mľl·l‰fućh̉¦ŃX’*[źĎůg L‚.ŻEiFS“¦ŠÂhµ˛Cű D3kBÖĚ+(k†PŚŻŃ´(”5SŠ˙ú*ă5”đĄÔ°Ă‘˘w/–$Q‰éę\a<äOÝ,—ŔdĘćŕî‡˙F%˛ ;´@Tަ2§jTSÔËk˛—“·¸ß‘űŐł­)[€jŐÜdYluůůĄŢçB–Şł¤AuĹ3;ćhg¸¬ÎČz:ě€úć>ó’n¦5łó¦^ęĹn•ąŃ±Í<Żrľ¦Ý' ąţ â„óWrĆ)%›×/ëüĘÓt†íčt·HSÉ}ţFXňť‘EpjńéOŔŘźIŠsajKK ΀úę`™y¦ý¨7·6Éź á­¸˛´®Ż€(ź©Ú-v/ů}šÇ@9´ŐĚó«ůľíB©o\9ý–ˇŞ ®«ŇUV‚…ömľcŃëËÁ:Gy6ôm€QY2Uťyşa€^i±MI¦™×Ů9~˝ °Ëq9.ÇwŽÂ”„í–幨„RçVŔpx^EęSńĘ÷‰K€Zů¨’ÎČÁÖ[9żÎ™0ĆÁK‰3ެZ1E@•Öjaď±˙¦#K]/S^Á”TŃŹ'Ŕ-Pű; rçĚÍaSłe^yBMKŤ)v[ %•Ľróţ•‚>¬3f–ÖÚľťĚ5ĺH–ŇőëŃ‡źŠ«ˇšĘ ŁiÚë§˙V?ńĽÍ¸cPf¦ZŁâĄ{nÔčňę—rqK3MÜîÚ’źÜ¦˘~ĘňąĽ˛¨¤ŕ[_ ѲR‡†*TiŃ<ž `żä3Vű˘8ź´žëę˱Ű.€©“Ţíx]#]Ǧ†×€o˘©óÂ,ŹÄş Î@s˙Wrö†~Ëň¶p7Ó8ť¶@»Řz „ŁŰ‡w¤ž¤ Ďěáč®îIÍ•Jż˙řů7Rߢ« {«ű6% ž€úć!Ł6Ëxh—e#´ąĘܨݱÚř˘Ób:=%Ü3on=öŔ°ý4×?®™ M]™Ą‰č{!f(ü8Ë 0>&MŇëő»Ě<WežÇĐ9ľUMZKM9|˝’0ŢaŘŤ<žLŔ4îŻNÉř 8wTË·v9.ÇĺřÎQX˝Z•=ł’ĽôěWw€“t[§Ď@Ł\°1ăůRb—M'ťtC]a©/gžťdůG#)ŃPŚŻäŐ÷Ď—yµř2ăPf‘¦uv  3Żĺ¨6w$‡šő3*yru•ůŻ”˝Q2•L›#ćhŃddaů–pPfCÖl8K4·YX(éNš$NGůCĄrj!őHku:ľŐŐ-P» ?ľ’|ŽĘ}M<Łćbďáó˙LŔÔph5&˘ŇTk|"ĄÚňjć>ÓřNąŁ»|n-ďÉ’WŰĚsĹY~™:ĂëĺšäŤ–¤ŞłwťĎ-n|ł\ňu1ĺ}5k ŠĹËYĎTc–±Ąź'Ŕwoó+Xňťrq•P¦sĺkŕ,—kż#éď-‘¸ÓÝ«,‡ °ľyŚg©·4CżŽ_ţ4›{RöCĹ¨Ű ŕîŐź8ăńh—›|oKuU…:źÝůQýçâ7Đ ýđůW ŰÜĎđŃ”9G늊4¶n ¸ęę.ĹŇů§ë˘vČş˙ Č SŰ\~â[u§}ł”Ů»ŇgQßŇ=0>’˛Ăt­Őü8Uo·¸-|ĄxańˇjBRrż[Ťô›ă´‹{`űÇ˙ş‡_Č™bSIfNď3^PŘ帗ă;Ga–ő®2NDůABuŰľy$%¬Ô•v4*gę+P7jaH śJ>ĚëŻţL“múšY¦¸ćŚzťY>zT ˇ;e´(§ň0˝&A]ÔuśWß~YZü4'v_ß­€zµĆĂ«ŃÔ=6s¬ůV›3?,żl–çĺf:8%—ůĄTHr( Ő.ŻrĆ;ŕH!6\T3îŔS˙5#/KžzŔ-€óöďŔú~ô»3@·†×ż›ű˙Ř=}ÚŐ]f«FýOĎ€—îl–UŐ·;RÇBÔ l9ú‘ětSsű´‚šf «i\”âÉQĎŘĆ)˙-s&NĎŐ#i>k~ Í4ĄuRo€´Ó+I=߸PŻäę•Öěśů;żüÎźÚ7Ŕ ¤@™işP;D˝†Ó OŔtzNŰ=ŕ›Weiýł„µp )ć,ďLjxuwúpŢšŐíźXZÍűä9uĆ+ʬĽ<ŐDö;+Ą^÷“š[}ĚźXŕä‹ň•›UţĐĎ@#Ô#öö¸ÜbCNÎXÜQĽ˝ę<-ßš*đű =šĚü‚”˝g;›ńü t·oÁ<Úß4WY_ )./(ěr\ŽËń=ٰxÜ“’,_)–u/NłÎÇY~–ôľ•4g4§¤üňsm3š ŐLdž85ú Ŕôú¨ÖzŢ/2OˇuŇć/Ň4DSÂD›Ëö?€ęú čŹĎ€ä,6˰µýTmÁJR*ŹůóZ+˘¸$ýĄqX€Ö\}Ö–ŐUëđ€WÂúTÚ‰[›łś řPÖ‚ś}Ęű7-~ś?}šŰw|«;›Ě]XpźënI>Í ôQ)ěőÎk)é@ÓŢĂa´Jwrd¶1†Pk.fsĄ-P™/R§<Á·©r/,Űł®I‰`ęű1V«žCv!Ůş ;iµ•= Ę0T+U »!)¡WKŽž3ۢţłŚ*?«[~hČnAÍť»™Şk8Źż%z0aF±·gyZß‘ÚŃu'/—†¦ŔÉi[irş"Ą§řö:óPúh—NSF^6­ÓŢdůôçO™iUĂ“ú ”!m×4}˘ĺ‹íóϨ{¬Z>a˙ Oż’˧´‹2Üg7bľ")-ůăÇrE4™=235ŤJűŇßm€Qî±â×&€ăöW`s÷px-- ÂŃú.;S)ěf[©Ćüt˛„çĹŻ/v9.ÇĺřŢą°BHŹčp~Üâ ©sXj%sŮzc܇ž .˙Óň$…”vżpy˙l%TäţG©ágIˇą!ĺ[’$Ď;†Â›PćYRôHS®‹ÇÓ+`n,Ń*ĘäöymWij‡ö@ÝÜ.Ćr/Î&­a¦®’cAnÇŞ¬-)ç(đmNYÜ‹ő-0ř‚Ľ¤ Ňy^>¬®îHšrKb0ČXz|+cźĎ’´u^šěĂ+ŕ›7yťWO“µ{Ľşťěô—Ě”¶Ú€MŠ…ľť/I ¦·˛ ^MÇ6łł7g ŰĽ˘Ú~«HľeáVSIš+Xýr\ŽËq9ľW–2łĺA;”ݦř—Óp,IŮ’Úu;§$©ŮĽÉöŐ}fdäxJÎ/­Ą=O@TѤ†uYÁüÄ>®kI–0KňŇ$ËžÇÂPš*†ŽO@÷řŻyť±‰3źšąşôk{ ¶łq̨ÍgŰĎ€ßÜ”•YN­±¶>GĚĘIěź©_’ü¤šÖ•ËL­ś“š´5GűT]aă·× ’Z˝^hńĂodżAŐe¤lŘ˝!ąMǗ߀îćŕ”ŚúMŢÎĽVěÔ·ď _Ó­ éJÎTj‡n3o•®‚4;.#GšMćRëzĽ~ů;Đ]˝Ő‰&ĺÜ⌝3›éÔA] ”„ŘąOvČ<—¦şaÜîL«·>î·î1ŻâšĄęZצ 2#Łż'ooŐÎö–Á =DÉś–I.Č‘¤uňßtkŽ™/3dŢÜÎźHit¦’S6Ö8;‡ÂG–>6äw®nUd‰˝Ş˛@§Ę•obÓ^‘ŇëSŹ”#eŐŤĂčÖnöÝÁRůŚůUĎŔá#P+yŐU$Ç«M?ĄśUVjź4?˛ĎllĐÖŹů®Đłezúpş[*ĺ—|ľ °Ëq9.ÇwŽÂĆó+%˙Ţ‘äQ®ĆvLýs^Ő•Ďe7‹zŔ$îŚ)oŢ’ÄÂXă‹úňÍçµĘś”42ZůĄ‡§Ľň¤Vź÷Ď–{!šKIóő"?ăÓ*4ë|”cńđđWw¤,°Ä‚Ue%×k—ľą!Ď1Ő®©Űtęő›˛v… X¬5 S˛ë!ăő×MśwĘ~Rn‡Üęqvi"p:€Vú8·Ěź×Öüó¨o®¦çÔňKĺgh„* yřgr¬®TÜ D)»­0/)ë­đ_–·eŤ–/…U“5÷îŐ%Ë™TH•Rm÷@łşźńMSąŻfš/±N)ADŮgž”âÔ¬®ž$uDOSľ •şÜŤł›Ý?ÔŔt~ťˇ?iď3ćŰŇŤ`Ý]Öű­SŐS?ÓóËë Ź0ťĘLĐňŤ•¦ćDsćv@Tn]»*ëŔ¤+®»QZKK|‰ů>t”]Kśő˘‹_‹C?»—& śÔŘô XŢüTͦßĘÝF[ýaš/Ű÷QČ7d~Y{ŁÄ€3:«ş+R“€ý-ˇWs)HŰ%}˘ĽŐçŮ7”üÎ+K2T÷ű ŕV™Ç4Ĺňî‚Â.Çĺ¸ß9 ł¬z6äônK•ĐěĂAësĐž¶pIi&Ąý°v¶ĘYúđ·ďpÚÖgŻ”…[R*–z-ÔS«čq´Włů—rĘÔÓ3Ľ’rú-EŰĆ™uţĆÍišăËŢ›ńHn3f™™z…&“-Ć+éw©±Ćű›ĚšŮ n} Ś–áŐu[gĆ×Ěš}(ÓŰ1€Ž v7ćE~:š®°Ť”D‘¤9ŞÄż(S E”j¬ j–yďĽzŹ^¸ý ÔoţO NĄąÚRśTyS-€@™˘NÂ/ţtÝ ô›|t'ČÇ*ţ4.7I™š\ťđĺş|ë2ťó~Ą;9O‹ÚÎÎŞąt»Ě{Şy;ś>UWrÖ-ő×ř2µ.íóµ“Ä/ůZK·emXmy?šŞ‹‹”{4z©ďČÝJL]¨;u›ß­uJ©MÂZ|Bţs›+ťM.EkŘ–‡T)W@<ë´)\X<Íb çSľâ:?–ţ˘$Ţëk vJÖTTş­ŰrĎĚÚČ=łÍů6±Äă¦uWŚJ:yóđĎT†Nľă’ŢŤąŔöLrbhĎ4e¬-G°Mür‘w?©›Şą °Ëq9.ÇwŽÂÔNdŢ´ń×jW_nąšŐ"Ż*Zlň˘5ÓćRńŚŔÔjNń…”ÓPŻŠRYÚ%Ą,DkRŃ~>őćNűŚŹŞúÎ_×\ü%Í®\řUYi•ÇD· Ą›Ë›]“˛gµŻ®š˛&„łŇľ‹BÝ/K^»¸?é’…+ĄĎŇo×+ŚÓ,?SçG˝~ŇYv«şë_€ÉôG{ľŐd™w˛?µiť*R–˛ ) { (ˇa,ď3Qz±°HšŞáđG^cx"ĎŚbaŤROŚ”Jňý‰‘ e&§2#Ă­ţ„•,Cµßus“ %5$ÉCę «˝Rę˛Ct|{CŇĐMă‰Ôoc®ş‚8—0äµ]ÚĂv} ôĎź€Ř”±q˙LŰĺWwůçmO`RCeŢ«÷@źý LĂXÜ<a×ČßZĺýDŚűÂ4…Ňąi9qŢ彎¸T'tß]ĎPŘL§1ăPăć<˙ţŔćÝżćŚi˘Ýç»·]ßűíW ],óg*4‰z]Őc yk5sIHM˝úóX-*ßëŮÎĽ®°Ě•9&ľm®’® ŚbŔ™EU´÷×€ĺK»’tRň帗ăr|ż\X,+ż¦?~ö ĂěßĹVśgLY„á#Ą%äUÚx›$†˛ßÖÚ®éĆé•4ꬥy©´ź÷€ëÔt­FĽ‘Ôěbë¤Mv™ 3]•:ţ¤Č/ ©‡¦ięжF1Ł$·Ľ&%RLÓŕ(ĺNÁkÂ_:4?Ő,I}‹Ń•fŔ é–&­n%’ LĄ˙úŕnÎČ"Ä#€˛şşź€F\[Ě6ôc~ĺ„Řăîŕş»:ž2ţ5Ś)®â.ń´8©óy|ÓĚř)GRE‹+Śzˇš±$őTíŚüł„ŤouNb>3–¦[¬QĘ[ťW{s€6J|m2wNO€ż~“ďĎI“S5źšRo“ďŐfQ8»ćî 0<ĚŚ­ĺÓ‹ŰN…yę7 jľgýóÖţů;ŕř׌€ŕ SÔJÂP*]ś-óĚcN-Żm“´tdÓpČ˙wÎNĂ+©wru§^ËÎŕ–Ĺ/Q©1>´ňčJU3m],×Ëş‹ô©ĹS+ŁÂ’uĹsmĹÍŹůű®‰mŁLşAčóÝ8źäW­ÓEć|ü t·?dnZhKón×Ţ’Ón]ąß,Ąć‚Â.Çĺ¸ß= Ó Ł)Ŕ4–©P-Ä1`N@gSHnE–BÄ_e”aąʇ¨Őź,ýWOŇŘdPŞbËÂ?g~Á+3(ČWÖdSÄś¶_Rîü—/äyÇL1oó,=©5It%ďŃϲR*YŃ ŰJ]GšlJ±âKóPÜ}üőcYÉ{)ďp~ý t×o)€Qőđµö_?u»ęĺ#X^Ąµ[ÚJStp¦t;€îú/Ŕp~ĆńÔµ:ţ”°Ţćł=îÜúG’®š5ëKŻŻ@˝ľ'Í=]w•¸o|á"•Ş^—ěMËđše®¦B!Ç!#>ËY^eöPź7µXM‹s¦a•Íŕ”#2CFˇ˙ řĹ»‚4‡OÁ‰ˇÓ KíĄ~­D€č&Ŕ_˝Âţľü««‚Ś|™šÍý›ýé+Đ,Ţ‘Ó;ş+ Šßţ_·@§3Y…|wĄłqśľBv®ĚĄ§K->ź“5á-čRW0ÖjA=Í6N’6`u nĘWÇć˘Ü˙ňEXŻ…ńYŃ0Í –ń_el¨}O?xĆö,IX÷j3Ë\Ńw¤[?ŤwŔńôhş[WÜ—ýéŘÜĽsÇÂ8_žâ—ăr\Žď…IC-c+|J+˘Ż®€Ş>“:Q˘üîš,ĐÁ Ö™±_˙„JČK˘tĂĄU·¬Űň虳ß?61ě)Úá*ă/­«ŐŐ€R+ŰwĂ–ÔpOŔŻ•‘p¤h ŞŚäRX^ý ô6Y¶"će#ˇ )Î×KľÍ·–ú°”&ÎtŇbÍ7Y:k%mîżáţg°Ľ|­‡6Ż #ąi±[a÷w°Düýç˙şëG’s3ű^ż|p¨3“âĺ]­fę°qęĺŠäyB7OZ‹’Ű: ŠÔ)%š[j«”PýéX_˙ ś‡]FvÖrdŘ­řmmľ©Şńqţ1s©šč9ő9µůo?âf-ĄvŃ”iQ’ÝÇĂhÔŚą{"©ĎÜú.ă,sř*›AťŚßdŔą|őŐvÚµ˛kţţ3@µ-ěžB§WŔ-®IŮ$K’WQ.M-ŤÂšMÇĄcAsöpm żütëŔ/•’rX®€QřE*3嬜Ç|[K‰–zQĄŕëq:mwźńľÉ7ŔđňŔ­nňť#5BĘyŞ¸Ě š2ŤĂöŻ/e€FéµU›Ń´î«®]ă8AŽ”ëónď‚Â.Çĺ¸ß3 KM‚úOő͵¤©„4#z¦zż!eÄá_Âr—ÔaŰĚCY޶ŐŇ÷‹»±&D­™[Hí;¦22Ôl‚Aşů¨´¶l˙IÚ5Q’¨^“´T¦÷U҆ô>ă'ŔUËĽ’[ZY»wťY*aR›żH%\—†{î‹×P-;r@[4b¦`–¦©yO@#˝ňĘ™¬jŔ_=fć°Ň&šâő ™ň äţďVęm)›Rľ{-BuUV­¦ÍŘÇxá)MčšŮÜSźQü…\Ť›7€ j0T3ŁćŃÂׇgťS‡·@·xKžŻQťŞéňęmGřKŘĽ]Q*Ľxś ĺ+KÖ4_Ř=ů:-űż‚4Y¦6Šĺ•ŐE vFŮű3௯Iępĺg3αŞ&AHßrA”Ýâ€QŤ–6™Ugĺ P+Göj–§×4AÓýi tÂkšäŞĂ±ľ'9X¦Ă+P·÷@»ąĎĽçéé@·yW0‘XěĹM~WU8Ń­HéľÍíR‡Ţ|ęőm›÷@•Ró]É&smÔW×Ŕůđl.oh]SÎţř»)Éý]F»†š%.”z.(›Wđ^Ťň`|É»‡ »—ăr|×(ěôpÝŰÂł¸Â v46I9źát1š¤ĽÉĎKéA¤¸Ň\,UĎó“/Żąă!3>B+ÚĎKw®™ć¨iQ»Úű[`|}"'Ců+`:IŃ€ĹűżZůňµe„Ă ŕ7wő,ʎš÷ŤĎAŤ"Ç3ŮQ ć®?nąĆţ4š–[ înóúiëĽX­Óď€ßü™/űíĘş EI'Bg=›ĆĘĹŚs+›đ »•„/Ó¦ŐJĹńţ_IšPĺahwe·íĚ;ś_€z)wÄ:_Íóđtó\]5k5Ő.dqAa—ăr\Žď…©PĎ]Sl+˘.;˙^SŹá™ś`í‹®=…”çkĺÔp÷LҰHńÄX‚Ř,#_Ý×nĂ·úc©]RbwQľÔM„íkf‘ôŹMxyľš50ŞČ7@ł8Ë  –¶xŘćç:Ő9Ű@<‹|ůGMš|Ţ_f.H}j?ă§ž€J+°RŞ häHuËĚűî:ł^˘ Ŕ©Şv ¸f „ó6ŁZ”âN@ŐÖŔxřŤ’”€ŞťĄt(şb/ܽΨĽ©ur ›!AHšľčoČs4WR´lťo—ŔtŘ^zn1–&*ÖI­:ß U§–éEĆ>ář Ô×o€áóŐę–Ô;­é¤Ú×ŐcdÝ UÉ,±öRąGgÉĄľ}ĚhBçÜŰ9t”ţů˘9 ˇÜú†Ô,ĄWó«ëĽGI}ě%g5Ч\Mń†vVŔ«5U­‹ł« vË©Źݸ…ZäX•s%O‚é7O€ď6@U;,ĆÔ;qjyźw†sĺʤ#eśůµ‚[’ň]â«ö^‹Ě‚IĐ=ü3¶[ Ö…ŻŻ˙RP›´cˇčÔ|˝Î÷Źa:)ÚfI3ú»rX„š%íŰ€şÖuĽL$/Çĺ¸ß= “—Pů;+ÍČJ^eTuł|} ¦µÍ~µ˛ÇvRôhGÝç=ąT!©÷’bŘüčJŞśŠ[“é€LǬýđ, 4Äş™€vóLńLŁ<€zµ‰Ô\ݬn2 “â&šŠÇ•fžZĄ Ňţ=[íu®”iď–ĚZ+xt@#×ä2Ö8}ý/ ^ý[>ôĄďGgĂUĺo /Óďóú©•vŘ˙TJ|«ÖeŘ,ŐŇüNÉ_ ‰r‹˛,ŤžĐÄt|jËŹíó{Ăeř«]ýó †R6™Ľ –<%-UŃyÉçh‰l¦#k'Ý_U˛=„| ŻďČ-DľčÚ--kż')ě­91QÁQžů\ Ś/_€ęúRŚBRĹĚőXZŻ2Τˇ_n2ż#תú«d 5ĄÎަ´ć3 ”v‚’ě’| äźÂ3ąŤTďę4k*úćo•&˙€+ßŮqĘEĽ›î˝p~‚2÷; ľQWěUţ[ÓTpwí+ŕG µÄşC>Óî ‡Ŕâ®|»§Pw×@Ą¶Ťó>ď*Ňw§+çAďYîN;K‘ä ±)óč€zs„Ăáż v9.ÇĺřžQvěÚo‡ŁR«›ĽĎgű”Ů.µCje¶őDЎ8äť­Vŕ(Na{ś}Ę´8›V–,®>ä]mVh—ş»ŹŔ4|ŞZŞ4ź±ĎdFľ »¨ä† ČďġԤIbę.VŠĆ,źKąZCQ–§dZĺĐŽeĹŽ$ĺTµĽś5B6Ŕ´ýDŇËŘ$Ĺ•öi}^ą,•g/¤p~ýĐh6j®S^ýŚ[1\,<QSĽčĺďź–ůg /ô[Ŕ7Ę˙| L§-)óÓ\®Ő¬gPm•Sś^ž€ĺÝűL{Š…quQÉŮÝ‚^aUP‰šŰ- ]ÔŤBĺ^ŤźíC^KmxzÍkµđ]¨W™¬8’ŇÍÜő&s=¦4´žž>ߍŇ3j lZĹÍpŢţ'ŕßţ GáG±{§ŚÁălt®ş[Ŕť…÷K#¤ŁúÝg@|!–Ľ Ű댥Ů@-UUşĐżiđ˛‹1o „1§Y/r\«ĂÚOtw…#łvĄ˛eއßý®ŕ8΀W˛ž}§bFdM×᤬˝ —ę@©Ĺ›Ľ ™”ËÚMßíľţXÝüsĆăó)żľđ1Ôm  ^(ńe®#y]„ľ•ŁĂ^Ťbíę‚Â.Çĺ¸ß9 ›ç—›ň^Î,ő]/6ŔxŢçuŢň˛Ízf¬ éŮ)oť˛Šę[R7¸»ű Ďźâ ‡ĎŔy–W?‘|đ¦u’wý–”•MŻ”ĐPňŚô)SŁ{–!ŮĚ;‡CYĆlőP^»ň”ľP&’ânÜjTĎ;˛"Ć7€oJÓ’˛ŰM°ŐD’ę]k Ü¦Ýúç|ć'Q&ňQ¨#ÇôG-^˙¸Ű÷e•VsŹ’ ¤i^^5Ą͢Z’ î_w«łýšĎLwĄćź˙©µ´¶éžT~>ó ŃđNť×yo:ě–ä5…÷˘¸>RrŮŚÎ iJ8ś?“RL µ `8üŘ+őńH­ľÉŻcşKńoŻ|·ÍŔ°ý řş׿ǧ×Ě‹éźJĽă–äpP+Ź÷R®ÖzRĘČ(´hąú^H)¦¤ąýľ°źÍ}F%Öt}>ě·äĆőPŇ€Íu+Ô©™¸¨Í©äݦŚĺY'ąÜ—®ĽŽ)ě”ŢŃÝe͸Ѻ!ů…ó ‹5î·h jÖ<şň@w˙ )oyuóOşÝó;ś4—WűÔ8űMş:ËünŐ+ÎWÎVąS¦ó‰”AfŚçĺ)~9.ÇĺřŽQXRÔ…‡˛qHĚ;pŽĎ$˝Śë:`:|âář«‡üě7üĄ!=)ciźä(ďŐ ‰@Ąé'rßb¨3Öó.gµř.ň*=ĄV×ű,“Ĥ?†oŔŰĂ5Ë™0Í˝˝j ĐŹů%Ä/täUšľ/Î/ąä䀳CÝ-ÂĂ^?›·˙ LĂhÖ?‚e-¤4ńŇ t3 %W«nső@NLS?yŐŐ•rŮ{ [˝#e„ ™‚Y,Ćş0V®tA‰ťdµ*\›tśiß*%^ěIÉ\S˙Ą¬đ”t_kşV{ ő6ËoĐNćř Çů\Îżz›©€V*'WăétoŢŚăŚ[TŞúŕ[ńk ŞWŔéů µI"™u˛1Ýo•˛ęßg5'¬6}á"­c\iĂCɆÔŢĄR˛•O-É eĂŽ¤§S*Ż‹›ÂřX[ĹSŮŮP§Üú!żN’®IÝă–4/m—Ú)\¶ĺ´˙Đ˝*|x~&N™#ö‹’ĚaÉzľšŞOo~yGj˙Lű€!źU5ś«*¨µ¨3 Đ4°×łĄň@˝X‘úŤĂN>çŐÔśżQ-\Ă+Ьނů|.(ěr\ŽËń=Ł0©Ě wé0µ1ůiÚPéŇô¤ş»%kmCi rŐ]ŢG·‡QOY Ť´†4 ­ye3&®ńŔ4T@}ýĎ}fʬgxć’w_żą§Gj™ÎH9 ¦*ŠĄSÚKĽÔ»Őb1–¬¦˘ß±†J ă ą¤Xßv$ĹŤţČ5 °¸ş'ůšîФ~·_'–Ę5€ ĄÇ@ł0o,Câń)ż“fu {is¤ ›HŽ6˝~ŐŽ>kŢü_rÓ1·Ă,?><űŤb^ HtädZ_M¤’Ź_H=@ą ‰Ňf(Ą™ ň§^)a)3ÖÖöI-AÝęçĎfj•aŐ1ăńMŐŘ‹«÷¤$85cÉ×)ÇŻoHłQőiůĹ8ůĐÝţ»€ĺ)FĺÓNÓ ĂtB©ę=jčň=`­ďęLŞ 4E…·BřwĘ»„t˛Î;’żbŠiŘ’śĽj«Ôň}yŠ_ŽËq9ľcVÍô/ZŁL+Żő쀾?ëŰ÷$?˝rĆ×ßÁÔazŕ:ëé Ŕ´Űf<ĺÍc%/d›i[‘şuF@É×éđp«{R.•©H4]˛Ý{śńYĺŃź(ň!vůwéĎS6ěUf¸°jqOçÂ/H g˝ţ ;¨ŐF‰š:=†z”» Öěô Śqȸl’?AÔrYϤ&Aýľ1DRjĄ|¦v…±µnČĽ†X0c+9ÔšY?c'ď¤ičKz˝˛„tó”űd8˙)Ń·]äóS/î`éVKĄŰ"ź1%18iľ—Wů5M»úĂ °~˙ż ÇŚP¦ýG ąyŞX”úÍőOĺgÎÓx\ë(†Kď“wÖ7¤Iú8îĐ/îúźq÷+kéţf^Qµ:H-(Š+=@Jv3Í‘äďc‰lRş },V@|}|÷ŮFMý´+ŞW7…“ ]ĆČćäJ'f5›íÚwAý¤p˝’“•¶6ś O*ÜíŠOCPI­4›·ŔÔďŻů~¬q|¦ý¨Űż’4¤:?ľYuzŰ^a/GjÉMÇĎŔb->wČßS˝ýxŢőÝO¤ěµš^PŘ帗ă{FaöSďŰńp›·¤ŮMTžŞ¬ÔŢ(EŚ„u«Śůyꬓđ›«ü熹”u9)ŰkMňß[R‚ŁÚ’nnŠÍ\4™šŽ™ý±u[ÜY·Î_?ÝĂĎ`‰cyíÔ’„ţ…o(ÉŰčjŠ™éłŚY%19isľćOgɆ2f“ú·ĄseBę®ć¸&KćÎ=ţ‰yTÂjŐ@ÜŹä4¨¶čďbzë™GzR_TźgX¬ś¬‚YĘđ˛ulh~ĆýKfăŚÉR>˝ÍQ‚fŁň!t%ĹĚfOŐ‘ŻˇVq—úWżĆţ…䌳ÔV)5l; ý¨›[`:}šëżćweěł^+7’Ún–W˙Lî0oË˝šJŢćënyâŃ”řęP+×Á&Ŕtz)LĐ)Ďn:.LŔ0o¨ÜěJI›^RCśßń|&Mm•¤–#2ZW XčϤćůäĄŃŔő”ůPC^ň±(!f”˘ŕ1ăî`¬@ý ,ß˙ďŔ´šĄ\ř0ě>eE—Ęewn:S–ď2"Đš¦üIÓÔě&ŔuR]·¤| ·|›‘NťääĘŮ‹ňĄ*Çâ™Ô4+9.ďI‰ Jń3\ďWŔ?ŤĄžéfě€^ŮĹRĚżuSô‰ş?ĺ61¶=€vůŘż´™ÄXĹ-ŘŚŰî*`<žóë7w?Ξł<’ËSür\ŽËńŁ0ÓÜ{i‹4ÎěK˛˛Ç1˙“ÉgŁ۱Çiö”f˝¤zYŽ…&€ßdl˝f !ü˘,ŞÉ’Čş˛†+˱ÝäÝ{ ¤›;óŁ)×T˝D×@»z MU¤4Íăôě×”Ęta}ńŽYę–˛4ĘŐ“Tś IË3őúŽO¤d·şÍëał|$'Ob]Çý3IĄ%ĺ‹ďnIý’ăů ř*fKžPëťŇTÎ! ˘†·Ś-×—O¤†>CcfRÄ6ÍţÄć4›|â5GN;`}őCĆ×S­|±' ľű%3ŞjÖ‰Ý=) ĂšI§8w@µpůP»¨2Ý´şj.fš˛A™ô; :/Čšxu›ă€Q-PŇ -V‡Ú„WM‹°U‹UEI=ѵ^a˙ ě^˙l˙OĄČ/<ßćĘÉÁ2qŞćMą'uΕŢúĚńY‡Ŕyż–î†<Ł.¶ţ„ľ|S¦i’+W¬ńzFŻí2öK[5Jd)_oË–o~݇|˙›ďB¬±+‰#Ę‘’>wzÂLoXśŃşŻÂqTťË8:©öĹ0ęű».;*ąb&ń}çĚę;â+P±\'<řůDű§5´Źv9.ÇĺřÎQÉǢY·§f("W_“uRJzđ5©N}s¦­·NÉ#0m˙Şĺ#ŕ•¦5¤?g>Ĺoţ L»…}‡2ô¤ô.5ú)Oý¬f˝ĺ É+zyşŮŢ)Ë4s‘łĚ-€IýĎRĘ(·>tŔiüt®¤˘4mÔsaŽÄ_TĹĂ ¦/ě_ŕO™§;ŞZÍ4šŢjňĹ©ÝNŮ ±¨˘+ń ĺ‹€ď: ?îz} ×Ôů^(`Ć“2ZĹéŚĎ˙MĘoHłr˙Ď0…:ű=ŕŻŢÓţHň-ši<Ýú>sšU]e.ŁŞoň-c‰]bĺ|F^ŻI­Wň„jF¦ó\kĆÚÍ|¦ŐL٤űdńLz5ázKzžęȉőBCŇÖŮß­3Ęk”d'Ü!|Ôtät6_Ë+}"˝P•ďv5lş™Ą­&ŇT—ˇäµ†ywŞ9ă hÜžä¦0g˘f‹ňşĘöŔ¤Ťë÷€÷cĆ€Á^-0éćpzVĆÉMľKťz?ť ň93ÚJc¶ßîW$ßKÝÖy-•ě¨×ŔtŢăá•ÔO¦]Tóř&ß™ÉýBćÂŻ*­\i˘÷˙ ÔWďH:2ýŢĘ)›d ¸*dNÓľŹ¦Ł ů~ľ °Ëq9.Ç÷ŚÂŞZ»J)ăĄ#—Š}–±5í€ŕßµfˇP1ZÍ’rDJĄ ×÷ďh˝ âA4­ŽŘ˙ D:Ŕ7Ŕ7 s 23oŕ˛%?x‡tšN*‘ő¬\Ç5É'NÇňŢ”fUßáőWRF{[—D„Ş«Sf4đËÂ(łßÇ }ÄúŐM^IT¦4Ťź†ΫŠĺôOh;ś_Ő4~L»çŚUSĹSĚT[b»|Á\6-˝Ŕ(wAşnŚĘo’ĎQX`*ĂK{˙Qm:k`ř*Ż…˛Ŕ6ůQZ‰pźM!5Ś%WŔŘLŤ˘-­D R; ‘7s€ĹÝĎŔéőp®NYk¶kűŘuF©áüh¤řë[%yů·‹ »'°išqFcČ<ŽpetCľ.vC†)Mű30™¶®ĽĽ˝ŁŘCuk«-ôĚ9¨Ţ¬@KĘ/i|ÍÝvźIyĹÉ‘ŞÚĺÍ6”Wńę@“ëő||zçâ7§3°yüvH9}Óá D`uű#0ě?“ćű¦ó:ţ4Ë·¤ŰË’{­Ăt Lcť€ľeĎŤj’ť<ŔAťžËĚŠËŽSx}:˝çfßšźňź›ĘĎ8Đ Ű=°ş˙9ŁEkGł/Q/^PŘ帗ă{Fa¦ŠV“öö•”ť`JkíşŐţ'`TE\“tŰň6Ć™>Ű”S”U.ŮçĹIŤ˘Öĺ0…ÔRµ(-^Řä(5ü9s=ňlZâPň?…*ă5Ô#-fmx@Ý^ľoy—ßIB[ʨđ™9Š®¬{®úó‰3VhžÉ9~˙tÍűüwĹ J¤Dđţő ię',Ąź^ ű,wtt1ĂĽĄµn"u’K3Ą>s”ŠUV0ńwŐ,Cµ?<ěz’/"PtۆÚfÓ­¨J…ŐOĆSÓţ®I~‰ńřŽg ^oHęyů7Íë–2Ń+ ˛„5[tŔřĺ3Đľů™’Ô6eě sÜU ÔËŇĽ)ŹäôüÔç¤k* ş‚^Ż5óâm-ŠD×ýݦîĚčÖ¤ěŠDĺi2X­˘’­®oŔ2é4ççÂ>;ô§°¸} pxž!Ž@ę¸P΄‰í”€úzĆĂpőOŮ/ÔčşÎҸÓZŻöĎźň™śú>ź~óäş‹ŞĎµýŤ”ľgw—†ó±¨˝ôqÉ0śŻé0ízć!e¬Ŕ,”őŞ;~q{Oj·Rňť™w«†”Í uţ帗ă»GaÚ×.ŻT"|¤·"%ŽëNm7b[öü)hĚ'Ď””ő.}ůâ paIŞ/±ż¬<Őó§#Ŕő-)ŮÝü†Â>ĘśT×Qyú¤çš%ĐZF‚± ĺďNj$ŇşĘmFŁ–_n*˙eaŽ´ęŠŃëĚ1Qęˏ۲&km×;T7âŐ#PˇěYu¬ÉéúÉ墜O˝˙QÍ=ʱÔJ.ľ˛&%yÚ§kZ`Řţ'ĐŚoóY˛UTĽäIéţRëŔ’'j´Ę yÝ#ľŢť—!-«Łqb•ĎLT>­uPđŻŘe˙JŰĄ CÓmć„sSSúđËĎÇ‚(Sůx>Kó^ÂŃ0…#ĺx5TZúč9ă5kĄ_Ü“2Eľ|ÜňđË匀ś}ôŰ#É·hŠss&ޤÓfýzíiŚĘ-XĆRĚN€ëů=§6˙©¦®ýunĄ4Q™š‹×V‡Uą"ΰX•™Áş^;~Ľ4’jşhJÍ$żuVť2Oť4kEajúľËSür\ŽËńٰ1L$Ő»%=‰ĺY?`8©µí—ü¤”±-î57täTOKÎn÷đ±W1LdÍş )ÚźÔć2ëvVŞ‘M‚:Ŕu#©Ńr—´€ZŕUYçSOOQ‘h&5ŮJĺ2Ź  ×tzÜŕňÎĽ¶Ö–ŚR Ô …é0n(ä÷jśÇ ťÔ <ĎdŮtę¶+kc€ăńX®ZMŃbO„fťb5_«féµâ§”rŮ,Ţ’3ŞÄZęSé2HĽŚől­«ć<ÔARřF«ýľśZSů»üšÓ8ăF-wLTš36ęsVR•°áQĄÖsň·NťX"PťÓLpČLŤĄĹ޵HoKĘűyľŰ4KÄ5őĽŘ=—ńšúü'ÍÍŹ¤Śë <żőő/$·€5!N¨•X?ă}’»ŁÍL“¦‡•‹ů{$5ż9‹ăđBčćś 7 R´ţÓvřĹ,©BgX3Ęš«Ö@Řëő čĘĂîŇ‘tÖĐ,Ëűéj`|ů¸ĺ;r–uJýžq˝ÝRMÉř5­9 ä؉ăě:^e4==˝ľQCŘ;RO¸;ÓiŞÓČŽ.3§v9.ÇĺřžQVůćÄ#(µ5<ÜziL†-IĄ-­ł–ĆZűpecşX“µa÷…5Í\NE/“ĚłŻ´KÖ|s")eěI¬ţđq–jmtĺďĹviަ59F@9 çíď@wóŕ-ó{Ęk©śý–j0•ćęJŞöŰKă·ř#›Ą‰e°A¦đéú’‹° ĘŞ¸–ß0¬N˙ ¸ű§˙Oáŕ´Î묶wůçM+‹:Oy§^HÓ-ľwWŔ¨l€j–꥞흴×ëÂ÷´ëŮęzÎkŻu8W#i2ĺ…ěÎcÁ×~ÚnťŻ…1•Ć- ĎŞłM—ÎÔms~Py •”_á™Üí¨we:ĄYERžTž 6ňšćŠ­[ Ć=Yµú«:ÝE‡ [eF˛ZŢăöčÄ Ă µ©Ë˛ąâ2d\ă•aü¦îXĺp¨ahEš&§ÍůŢž^…†®3nőm[ÎáLëgWÇ­3Ý轹2‰Žýđ‹Uţľ(WÎZĐ] t‹5př:ăą$•Ţ mI.š*8  pW]Úş0ź“ßYr˛˛˙ôGÔîWšo*»xźY]ÝÉ•1éó׬)ýňż—ăr|Ç(,őĺśg;ę*?)ĺąs ĄíĐ(ť’k`<©GDŚL™ N”4W=}í™­9”TH»?Č}Ĺć:”Îč8Óă–ç±ý)§¤†WÖĄĄ>•˘iÜműPq¦ÓđJŕphÖ·Ŕđô7€Ű_ČÚ±óLűŻ@{˙3ŕ8ÓÓÓŔňţ!C@!é°5uŇGďęô˛®î€>(×ě1s¦J—«N-/6U˘éĐöŔňî ĐďŹy%?=ý čîŢQŚ•éăŐN´Î‡-Đ,–@Ót@O ŞźÓqî¶\!©˘Ĺ Őől ,ťI¦˝Ła-śb”®2J}}úXßüDQŢ%TĘ…¬Ň’†Ë<•äw‹\Ë{R‰%FI%_­ŃÝ€oßFygb¬ĚR˛ŐaĆĘ©óaQî¨ĺ¬źÁ/€ó—h 3#ő¤«óîˇ UţtLu~'–}˘ć*yNŻ@ĐÜą~˘) ©Ą1šędÍšĘěŹ,gâ¨$Ű–”ú'FO<¦’ăĆC4Ë.sšÎZ©\áŕ”|ëޱ€á«ŇÓşĚńYľ°RĐźË/q—™;CôJŮ•×ĹvfEYé¦2Í´4WőQIj;ś)˙»ś<v9.ÇĺřžQXĘ®Ö|§ű»d Š'MÜÉX[ÂÁ‘śĺ$JH‰`Ń'uX]žÇň©ő 6Ißaě‰ŇúĺylVy50€ugÓ¬AZSË*H†Ăč´tIŹłş&ĺaĘő¦Ů$˛pÓp$Mú”h.ďˇ-Ň.ţú!ź0˧µ¨˘ź6ĹJôŔęárĆy4U s.oÜ’ÓĽ‘ŔB˘©ŮX”ŻĐ®Őe-˙é Z˝I•q8‘tŢ•±WÂýˇĄ†ú©2i˛ë–śČ~ľÎűg`óö’§Uí>ć¸ô%Ť>"ĄűG ÔśpDד˝ ő˘ś@ž×ŢăIÖă9ĘŁ'Ľ¦ÜÍ@7@Ą+¨5Ü•Ű(„ˇ¤9Ł!&ăM$ýú>_AëwĐżö@»X’úÄßEay±˝ęú”'Q3eÝ«BLq_ßV-™%.Ąř 8NłoS&«8‚-ůN3Ƕ:1SłćÖÔp¦đ5cCs×ö'J"±†ígŔ­3W8ďűI˝AzeźQżř)őZńMŇĐMĄɲ1D÷ůŘí_É>S©äń¤ńţĂ˙¨´S9«5â 8>n~¸%Ď g]Vň,ë[S߼É'QßÇä“YÍâNO]šáR÷›Xň‹:˙r\ŽËńÝŁ°<mo|›wÝnˇ,ŞpŤ&Źg€ë˘rörKU}yŢÇBďX~…#° ”tFŇýjuGQ`+)|Č+ŞŢť^ßç•°$ÇÜ4ÍBZvĄ/•yJšq”•?ąĎ 壅xęÍ=Pµ’k±Öy2Ç•i©Oj ľş#ů DĹTמÚîÄťĄżßço„ö4úŤ]·N»?Ş{’zľąů™ÜťZužńαϟËY§§’cö@wý8<ýŤ”®,m—ľ®AíVrČö{ 6ĺסšaĂ#ŕ6Úź}ę«÷Yëěrź¦|W[ŘGŁî˘.˙Ě4n3ú®â-¤¶ë ť}F ÄŞoß… »—ăr|ď(LĎ`ż¸‚—ô÷˛ć^2ő@ŻĽ|÷H=ÔR©fËr Bţs5—¨5šářŰźŔšoRîÜREżî`@pĄĹIJ´ű!?­“R)̵–”„uúúhVWů)®ö`ă8,ŮUKÚuA…BsľäRhŽ3©™śŚ‡-PkľŁĽYőfZŰyťŃSă<0™ Ä:©˝\f©¬;ÝŇćó±''Ŕ5wů]…ępQY#°ş~WĐŤ+ť:Łf˛NĚѻ̹¨oQ+7ŽŔÔ^“Hĺ(kWĐR(µz`9źŽ$ő™‹… ę…jęĚd%]ţ¨Ä^éuĄ—7Ö«‹ó7 ’/RN§üţ[’’[-™ŁąMGRĘnJ_PŻÂäU0-äř8%pH«XoŔ˛7”ťçoßŐ$ě0eľń;ćÍ\‹TÎj0’—Ăň]Ô§µÉLkJ7Ńy,Ť>rÎ6‹;`ÔŢ"–®ÉÂŃb§Hr’8^I3Íh&ýązăg®€YkmłřYj<µ´rçĂhÖżä}ˇ¸zkĺúw0ĽĽ~©÷żĎw¸ń}bŐ4HďÖćçŚ~ű4ż"á+@}“YKMŘ«ă ŕŢü¬)í‚Â.Çĺ¸ß5¦ÜqŰ[jFÓä5AÓ !¬ľßÍQÓş€éô÷I™buű>sÖX#NÍz{Ŕ©m¨]@îÎ+ů–s§ŚD2ŘÚ59`´„pjľŃ:vÚ~±vŻżW×˙–‘Ńâę-ž8„W H!%šN­ÝňHľ|Ş»w™“ŇŠ'öa@›łj+ śĎ#Šw˛š)¤FĄ__Ăń @h€±@Ű5“ß\Ă«:űfîHýöYöąúĚŰ5’ťt§)ůĂÖ˙j–{ĺ0?őćimýJ‰O@-ŻĄŢČ©Ľ+uŞ»e ¬ÖŹŔaűhÔM=MŔâöšŇ 3sËÖk`꟬i‰Ěq3 ‰ˇéä Ą8"b}ĘMg©ĄŰ®µ\Séuő{R"¨ą,9ä{RÉbáxÂđđë·ůüOŻ2ÇŞ=Áą×|P¸&dÉ-ä6őů[–2•€2mç€Zëâî!944C?nóá+°¸yGVHŤÂűjŔ:ÓyOjýIo·úŁ>é6GÔ=-cąÎ Z¨”|§\Ľ ÉŹŻćhˇřű¬‡IZvˇ2‡8×mkU¶IÓjëvň-Ą#}ČďP˙ŚB÷ęČ˝P±¸,Íéal‘TţϤ–ióĎ@5őŔńő ˝}$ůRĹ6Z»•ř_ 6·TŢ#śş| moóűŚÎ?›*6mąÔÎÝŐ›‚ď|(ß©v‘w*UěHŽ`V×…M}ľR6_o8[rˇZQ˝ŕđÍ=Ŕęl‚YŻnHŽ›’W5°xó/ůJIßç„-y"oĄX\?çÓ °ąů”îŻyĺňî}ć^+ëumÉ©ss7÷ĺ)~9.ÇĺřŽQłYŐÖf쪒ILť1•'źÜ‚•&kýÓÚî€nŁgç1ó&q(OVM7ägô–š HSÖ7ĎđÖjJ>jDLű}z;ąĺPşŇbÉ´đ›Ě\ČáU×ﵦâBIq š˝KkŃxüJęď©ď63lEćć$*ŽŇÔ(Yż»!µsëuÚʇiÔłů‹yŞ˙Ą˙)”„XKGh\ć_,‘u€NíжÄJńż(÷ĹâßČI¶ľ°f¦Ç '`:ľQÍ7ŇFŮrßäűAŤ2ÁŻĹFľ¶}ARľxoÎ’űâ  YÄZšR ±šďř¨®ŢîępŚŔxÚ±ß,H Ůt[–m_ҬěuhĄťSéÁtš¤«=KT´ţ¸ °Ëq9.ÇwŽÂl•Ý3P­ßÎ dÇżůő”2~ú~ÚEń÷€›Ŕ5šŮ˝äőł{ř+Ŕ°ĎlKę‹.N.×Ţ’fL4K`Ú}Č{éńőIݤU˲.ő:âz,ßB:Ł’Núőą0tDrνć)Ň‚«‘{űXŢ˙Dö¸)W3—ĽáŁÓ±°WĘźôeň˘wU7U!ʦ’ľw_¤˛9nIšěş­ ®‘Fďt 91GÍË„+÷Ď$·šJ†§3I§ć– ’^)9űôî¤ĚMńäŹsÍ4÷hJę¦ÖŢé,nhřnCVŐ É~3ájH­…ęÁ˛†$WÎą©ÍX«O˝ÉŘDÚ·*´¤V-Ëe5†Q^Ýű‚Rżé—Ô?”mßy-4’ôšcęŢS•^aQ§Żżĺ;ĘÍúŐÁŐ;`Ú~*ÚĚę*é7MK >°ążľMÔ×?a˙ô-ř¦‘“8ăXËěULnŐ­IúMëúŽ…˛Žv—Ę{ó¬7Ű<'ÂĽJ†+’†NsO ş+ÜŚ—†Ž’ŕVÍR[89Ŕ5 Q[ź2ĂhŘ3 Qńî °şřŐ}ţľ(ńX=Xě>e\gÚ:q‹ÖxtyŠ_ŽËq9ľc¦Ţŕúę ÉyĄ˛=|ş»wúKôě÷Fá ©ľ•“÷đ*?űg®|*e`ŚÇ¤ĚÓĘ•+´Ľ‡äžS’¤uđ”%żX—őV«„2 ÄnĚާłVÁTĘöZt…sQ––PŐ¬aP«wwý¦° µŃĽ­/MU6@ěź×^ĺŢŮ>Q~ăÜç8–UTÄ‘2ői¦™ńMq·J¶8ä÷l¬Íęh| ó~Lő8µĹč*¨ńĄ˘ŚLuž{Ŕ·oIŮ Ć|EĄ5É˙ TŚă¨×b©ÄĐ)IJgűśWfM™÷ű?€›ć' Dôă@ňQÎc:“;˘l–ŢĄ‹ Ţ ĺ|ňą:îţ+ż‚rŮl†H|wÄÓWrçůî€î´¨ąs“ĎąpA×ţHꨬŐéÄ«’ˇ&ÝüT .©ÍkŢl_Yúń9ß™–nZ€x|b{CJ 1ÎqµN˙č®ß“ÚŃŁ3/¦”}  ŻĘŢBĎZŻu>«!ß«jPZ-OeŘ®ľÉ÷€śĂé P·÷ůŰWŻ”¬ćÍ#pÚ~!·7¨Uă<q(wé7yËjoŔęć*sµięŞ÷/ś8dü®oĄž3±’Ň äż{Aa—ăr\Žď› S{ťžč‘Ôâ3M§ŚËl]µVyM6ź ň?­Ő&U·Ř\wOV„)«˝!5 ĄČńP%ţÜ)­9`ęgl€óëŻŔňá§Ś Ř™ş}¶†”ťŻ¶á9QŁŔ<ú™ÂűŘzĄ•Ä´ZĄUXf%7ůĹ )Ŕz’Ş˛¶¤ţ‚4ëibALAÉ“&Z*ÉčRŘ7ť¸ę.°Śv cj`č@Ő–,%j™;ŐX•)łuąl§ óą5NDjűë‚z¦~¸Őě ů%9uKµß“˛p—Ý-0žK˘\ëä+YŻélśkÎ\›QNŔpŢ‹űźIYrçŻ 7ןż”^–‚8˝ţ'°ľţ8^·ů Ă'RJí¸{SZ©g@ĚŽÍ^Ď_€úú/Ó1łŔrZ†éČŽ™L3†Nx͸§/&&NÉk é(źIť=:·ăˇŚýkĺµjöz~%5x‡Pz9Ł,MČnnő )‡#”&*yÂÔdF2ô%¦2üľ™}+WŔđ¬\Ů:ăÁîć†ÔE`O Sz`ÚŞîÇŚĐűţ9ď$âŘäsh µvAie×Ŕ$08Ŕ×?ăöď@sóľě·.OńËq9.ÇwŚÂ”d ďJKu'%·Zy§Ůó^ůč)™`R˛…ö®R´7jô;AsCíigůqÚ^󦺆—?€zuKňńĄnaÍ>NŔ‹CŔŢŻ5učÖ‘ďEÝŕnő§WRNŻśËÖ(¦˝Qł꫟ xAa—ăr\Žď……ýW€Ĺ4çR&„”2Ý pšËě{ ŞŐ¬§9ťĎ\@šÂOąő ¶0žw@s˙Ŕ9äUK.ßÝćuF鎩@O´Đ¬F“ %ÇÖ ş‚żćĹĘJľ?bę^­iÇ13›®šŚYÚ­gq+Ŕµ-Đż~ŞĹ†4Ą˛dNa"ť1óE6ÖćŮlIŤbŁtFăĚ'Ź„^±]ÓůŚÇW€a %RTSáËě7OšçJ.Lj[ńô'bčÄÍM@ÓÖä®ĎÖÓ×O€[ß3(;¤ĘčU}<çÝo@·Z|­w(^ÜUlóąUĆś|Ăî+)$©‘룫'T"ŚÔJu „1’SÜŚęyT>š&}±¸ś»*¨0ŹDčűŚ•ćj~›Ć )(}×RO;ľí­ôš•T“=ŕ”{uú”9Gă:uĹ…Ĺ{¶ĺś„AĚťŇî¶@¬@wőĽî˙đR®6@<ďH íë‡ú—ůĘ+'čFČÝSTpŚ#ĐJ!č<Đ?˙¬Ţţ©Š¸Ľ´»ršđ®Ëg©ýl›±ŞéhWj·<¦ĚU×’ťÖˇé=PoóËŻ@c6µ[M¤ěłććÇ|¶Ą€Sż··¬].(ěr\ŽËń˝saâöŐľ÷@8tdÇ–”SZ=Jţö™3˛\ÖF®@-dR˘€ş]äç´Ó|áő+OÍú”ëÂŚůú8˙–4ă°g­öŰcI Ő}2ó-¦´&ňţY잦0r vjKb"5îŘľş](Ő{±Ě«h<îű¨´"™R¬ôHV–{µ¦ókĆerصW ’{NÎÖŽ§_ÜenË)lP"x:µé,iĺw%Ĺ_#áJÓ@Ó¸‘Ďj¤#w>y˝ţ·¦»ÎČT)ćQs˝ë7™q;Ľ|şÍĐÖ·€ëŠ—¶S·Sꦜz3_?®ľâŰ®Ćţő7 Yßĺ«6©ŰÜ@Ü˝Őň†äâŚc•‘”5™KŁ?Îť#0Íş¬Ä{J9¨ äR/ť·ÝÂ!cŇhš¬Ůd\>Óó.s ćĐ,Uěáą)LĺiKʡµ I*(''©Z‘RpwÇŹŔâögŇŰ’ţ«ß~‚” ß­2Rb]<ü {Íd—ĺ7jz>‰iUĂÓ>3ÂÚĚ4ËUćˇÔńŢÝýDše[ł×¬ĹBذZĘůx ÄóL‡-I·%ß´Ú9 “Jży–RěDj6JÎLűϤ†Vó“ZG·T˘+`:||óďpÝKútÓéů‚Â.Çĺ¸ß9 S&·žăÍŐ»üÜť†Ď@ÝŢdVĄßi…€ZN«SĆ>© Eyđó^Ő);T+¶R·×oň®¶žčĺ{*ŤÍÖKl]/0 j÷kfČ‹Ě8h&¨ôHËĚ;`®:­Ćę­k3öńbîNĺĎ˝őU@Đ$kű ¸F1&EAc~F«u34›ĽxfřĺyÚ[ÉíU&­† f·°¦eŃý›rĘ•ěs ¨y[ŚŰ騗ďč^ zíűÂI ŰĚBšfíđpíB?ˇWĘŰpăMćIŤ«™łî€¨ÎeĚJť'^¦móëđBX‹efŹ)µQSŘɸ˘¦ŢW?ćµ]ʵńüZn‡ş¨śL'Ü4ÍÚ:K1í_ws„­Z$}żßć{@ßy?Ľf»ăDrÖşËĚŇJý§dĎěĘşŇE4 5wÚë”\0ëĘ 3Ż…é­4 ţ ({Ăąk ś>®»\s“żG677^uŚÖ{ÔgîŇD†j$Ň4ß kEjŇ®»5PwĘ>“&®-ŚçńHę3ŻoďHi4k5HÖebëŚ@.]§vę_H>Ë7–ÇĆĐ«şÄ÷™}ÓHsđzńxAa—ăr\Žď…™ZýzzţI Ű\“f bg5¸źŇýüpí;RöP݆•‡źwhşk’GLŮ@Őň/ă™RmwMŇXąŞp–ޕܫ…pIńĺ‰ţ ×ĚřqT{ťôĘ{ nŢ(±«R_KńÜ›GOĽ†eŠřn™×.±i~ýTÁQü\ˇ°3Őhĺż3ťň»šĎ@»ů ©[ÍŰB4ăî hÔ´äÔł]’Ô“ÎçwhŤ2«7w‘ ŹLçßË;ěyMŰŹ]ń9Ž;éňn2ŻT_=”•Üu€·ˇ®Ë+¤r„Żu¶e ‹*^É:Ąę °xü'r^˛+¤:rř đ›ÔiÔ=ńô;ŕü-0>őĂ_2®βd4/VeČgŰoňšďĄĆÝűĂ߀zq“ą4˝V5á6˙–”ţ>ĺk'5Ö4ڤéóŮ®uCňÚ„”Â[fC,;†oÝÖr’Ä3Đx ľęĺ#…4:^W߲ŰţśĎĄNězů–gÝ,»XŽyE}Ń…©W©[?­jutÍ2űĚËą|}ťąTíH&áÇiĘ»“ţśß§Z¦ă!?[&ů…f-hNliUÚżÔm~Aa—ăr\Žď…1ËŔJ»ÍĽHXŚ5Ł W¤ÄÔ¤¦™f+ö Űţęg’ŠZ ~[Ä[-6|›±9Mewm™A¶Jr”ťą^Á—ľu·EOOúÝ+°|üN8Öłwî2ŇqłµKÜŠfgőÍŰĽŠ*Mżš+ąCĆtÄÂtÄx*á…óŽmߨŤQę6ń)Ă+PŻoQi®Ö68ZŻmř’9#ëÁ–.ćü 8Ă·)š 3^ăóo@ôJď¬ĺŽÜ‘”Đa ţµ´2]—3ŕć= őlE•~M‰iš  _€ ¬‚ăh×o2n•ľoĆMýC×K Š‹Ě*y mjÝ“jLÝ~>Ä:=“»+gŔΡôMBs+`rhÄoZ׺x®X.ŻŢŰřBJUŃ|ÜćÝcQ‡ OéÝF·*(Ňp˝tRHIÂ:{ň$(FózĘ ]ß&őĚOűŹdßy-„s?~qŚÚ?ąYC‚ľj‡]Ţs¸î†”nćĘĎĐ4Ü—w(Ż1=0NKŔţŞ3*GG}uźQŞZµ•%k-vn§üĎÚŢŐâXÜţeŠMčĂ' F3Ó©ĹjÎ|©ůTŠByN]˝¸ °Ëq9.ÇwĎ…EJ ôĄńđ© ąíWzęj9Ëgë°’ÂÄć`ľ0uŢ!<•'k,Ď8…ZôŕŐyĂ,Ö·™3bŚy–Zú,ˇTů(_{›(żxĚďÇÔ=–~éÚĄŻk”Ë®Ľp=Ů ÖLÖŇz’ň^x$Ml”ś©Ećäc˘,z%g9 ľú É‘/ěŁÔđŚŔ2e—Tű‡Ľ˛ĄćľEAC–fQăé™4rÝŐŚz&)ČÚő )ßR1ÄO)9öĽËHÜ-—Ŕ´?‘4Gęm4ü%îIřb–łŞŚ›çZŠoUX°öţ1ŁÂéđŕÖ˙¸ľË1ZIQN)ßB Ž’Wý•TKSaĘl˛|&uá¸púý2ř­ÝI)~&y,ÖÁš.{ Y8`T˘™2ő6Źä&Ívíç_I+ą;“«ä7h2čşđĎcƧS?ś«kçoH Éö–˛żĚ÷¤eŰ{—{ŐÜ^Ş÷ń„׿ţáŻ$˘í¬ÓKŠłĎ@ĺ•’0ĚśŞšŇj.IÔYRÂ}ɡ±Ť´T@/GđcÜMÝ{)çŮdí iRYĹëü_óžŁ^Ţ0#óĎ_PŘ帗ă{Fa¦‡˛«:s"őíOCÄó¨uĆMýéäŚSÚ„ů§Ž"–€85Ŕńü°ZJ˝2ËĂ4Ć-äőY;[ë¶Ńľ˝[q·ĽśúáŘ~úź@·¸ęeA"ú»šúYęS_ÔgÎŻ_÷™ăł‚JʬS~oĘfpUiź´Ů™vŕŇ)Źß—FkMëÎű/G€aťY0x)Cęú IąsÜ>Ą…źzyMń»IąŁtŞň„‹µş¦–ě!ă› Ëo „Řĺ#0ŞjuGîCFĺVđőU^ç }W; ŽË‚ă„§”ŇQi–3FĐŮĆ—¤PKĹŇ«™V»š®öż˙´Ę·j®Ý§˙X_˝‚řA±«iaĺWm&·=Íę©’śßş¦sű·qŻŇ őP›ÄŘV•Ě:‘Ľ{¦cöQ.[źg١R,~Łć¶Çݏ÷°ŮůŐźÔcmŰş0’+6*/OM©çŻ@YĎ8{ÇPšżR6˝Ő Ě—ż»Ńú:‡ĚfĘ÷+ ÜŞŁó”o©JYo¤¬«ý2ü{$µX˛|Ö÷Ş¬Ô Ŕ:_ńŃĆËę{?’3•f)BťaŚç߀jű>łxrć¨íLNFaá¸Á}8a\^>Őö¨Ôőy~.ú6¨˙ćźPaUuő/Ż@{÷Ę­3ăÖ F{xtÔyEa×u]×ő}Ł°ěł‡n=ţŞkĎÉźů…†ó¨ŐąĐFĄ§ń)=Â]sÇď[‘ç!÷p™ö˙<{ę.J ä©–6iM¬r ¤őúĚ!?í[îë ‡gRÂg\o€éxĚĘÔO“ł`¬bćąŠŚŚ4M;`Ç٨Żĺě¬Í@´Q {ń87Î’ ćřoóď`°wqŠ!őÍ0I =áÝ+Ŕ´ć2ň§t:ÍŮ/¨’6É Ât|%eŇďc© JX[“2ő JڞÖŐŹÍG¦vWĚŮÓŠĄMHe¦«żsśžŢďÂY±ěß6d$¸©ą¦Ó–ŽňÔ6ßż=“’ł­«®€Żý óŰâ¶/Hz¨9î2űŁF"±¨Ĺâ®?XÝ9/LÜ˝rJŃSH±ŕˇ‚_/S;ĆEţ˝i¸„Ó¦é ÜäOź¦ŐЬ¶¤ÉµÚ-­ĂTÜe˘±3G6ć¦H%ÍÚÜżŔţËŻ@Q×@]oV¬÷0:Cg6q[ír8“2*şç˙¨Úü™Iî‘1AA˙¬Mş:»ŕ¨vőáżřŮVşY±Zý뿀ćÝźđţ°ţ3@ˇś›•ź!n]= ×ońëş®ëúŽQXRcľ?¤ÔÓ:ł- ž‘gCšúí}žlŰ€ůrńď~}g+æ!JÂTÖ«¶śýżśqł\­ň0óć»®Ú›5+ľ dT(6aî: ¬·ŔĹžŇő^Ö>Ůăţ ŐÖ_!ĄŹ+8ÓÎ?śťô˛ôN´×‘ů¸Đs;ß=R¦XţűXćÔe2­°O/Uť°ŞĄĹ’1‹±-ďËż¶sLjÓ")Ô 1J‹/wv^ôoNGÍd{~ź“U”9ťUsOKn2ĂĹ(¦ŚŻ-[Őzˇ& *gŕr<âŤSóâăĚ‹ó,Çhý,J˘y"MT‹jCjT”:É„…†ăr’ÄĐ_€öţŻŔôň ©Éü•m Śq”ëŤóę[Ď˙(–=’3WPv·$®1»Ďĺ r¬ő~Uk˙ŻQM˝ZÜox_ąizČ~LËă_8…S"^.ęŢNůką-T/=PoŐ<ÔĄĐqĚj5ý.ĺ ‰ű®Ę?6˘ !ÖŐ=€éóóTÝ*ÇM­ Pîî9vútës¤Üš°Â,wł:–΋'ÂÚ/Ż…±ý„{¤˝~‹_×u]×wŚÂĚ)ţ"\žŐÍę]CžiFiŮĺřĄşÚčŃŮŃŇÍÇţŢľă\9hŰťߌKÓI›+ţe¤Hšv)±^ŞĆżhšÖÔŔ$}–2é¤lÉűŚMUl6ťµI­Ô™d0|:gě#7Ąš·Ĺq)}Ô·¬î˘9Ä´+B¦ńĘĚÜI‘{a Lć%lN­‚Ö<8‘š“Ç3ň?±.Ĺ{RvëxRš[Kj®žĄ†Dß™‹EfšśĘŁš{ŞcÓćť_Ş´ËOŮŤ[ßíÍÝ/ggu-BošCÉ”@˝Q·Ó{GdŇâ+ b™ßÜN_˙©ak|{Âzëxż˝ů7`<<’´lĂKÄ[ĄÔźr{Gšlžź?ÍĂOŔtĘ^×áő3w[ Ej>®lRe–¶bĘ@?*÷‹nyZ ͵ç 0(®ĘJşĚ[¦0ÓŻKă.¬§űgČů«–;fMşTşëN¤l2±]VKżŕţ„ÓCý”Íkąiă¦ÖŮ=ë”ÔdłZ;cŐd:Ś@ąÝ,XąĹgGě#pVF¨€8=󤬑ÉMaíG Ýâ\ýó.˝ľR+®(캮뺾gf•‡ač”Ö¸ńo÷)ĚŔôő3©ťeâĐż'ÍDôí+őm°™ÚŮ·“bóŕőW ·Ŕ|Y8ćäl•˙»I fĺRZý<Ăń‰”]9Y“ăo”š_L™÷ša)« Č˝s¦ĺY¨˘¬őoRÁ輆&b–`G3â9±&^¤G ŻŔĺÜm©9f‘w×EÎD2Ěu@AëďŃ8GńqE śźż›?“ş©…ņN 7ÍIMÎőmX°$gGŻé|NľË™/B˝GJÓý f)Ăk9g­}÷’ž(¬¶xż·ćq´ÎËhĎ ň-Î9GAřE~µÚ˝ş2/“#DËŰĐU«ţČą!Ąn Ë+KÖ|&CÖd)é¬ÜŐŔůđ¬oŢ“;u Ţľó3o9ńs „Ť´`‹öOĄňžŐş¨=Zč޸ɱˇxŃYjV/Hk¨JH=’Ăé‰4óMsö|˙ĚËúéŹé2v—.ň~Íołą'ĺč¦ř˛ &©á^Ŕ5ő¸[ť‘WBˇůHę$µIĺE=Ţ;°T©ďś“`ä%ĐÉq¶zŞef]ĺ‘Pv‹t…)Ąů¤ś®©­×u]×ő˝Ł0i…špGJÂś.#Pl2ËŁďeĄ­Wë•sĹÜs±ŠY~÷)űaŘ˙ŰĽ[[yđk}7KµTůŢ;NBNPJ JŚj€b¨HŢs)–Gš¦' Ľů¸Ŕ†JŕřFz3Ö‹×nI9č°Nűë»ÝXĎăB «0©]”ń™ÔßcďBYřJÇŹ(Ĺ—)ÓÂĽ{ňujV»Ě&ăSĺÓ›T|‘»`¨˙{ĺ‘+k*ŐŰüy±)QC™čĘŞ—ËLŻyqFCyăá -ťMw”7?“z’jőt@Ńľ'%…s Žg—ńv˙ĚRTĺ©™p„Ň (î2‚ÓxĐĎ(­ˇ8ť°ű¬ÝǢÔtÎĺŤ]0Ś,úŚ“V^ěíxqÜdłě™?đ†C÷”ÍcŞéňëôą!őT«żGy Ö„8ĽeĄś†7GCš\ŰË©‘HďZg•oóšr˙¦®Čy˙X-ĽŠĺúÔhądĘŠĹ ëťSáâ|ű=P­îť=¤Ţ§ç7«˙ %ý꞉cbů0i«Ůe7Őö'ÇDćFHÂHÜ«Pdż°ŕ®hş·ĹGŹÎ“*×D÷­MQ-«C®ŹÜĂpEa×u]×ő=Ł0űÎS2„tĂë÷$™Ąć[ÇÜ śźľŐďI>űů4EeĹÜľÄőPH?rü LÔ@Q*ůK ě 0Çž”Bˇ„{Ą¶#'`s§MĐw ĆĘF©»Oä:UĐi_jIS6Ą>&ż°Ăݤ¶ÄAIöő-9ů[jőś !´Ľ™1fĎ ńqv¦˘łcsˇÉ¦Ćĺ(ĺRÔ «Čjx›7©Ńv׌żŚ)3Ľpp6A¸L{]śóާä5S{ÉOÚ+~ë;gą˝wcžµö”¶Ť>Rí)m}Ę˝âš(Í‹Đń|Ęőš¤łźú3eqž‹8šňô——Ľ?Ź ×­Nîę.có˝ŘŘ-ž6,Ő˝ď˙ĹŇU:őŔĐý*ZĎÔU‚•0ٰž ~ĆĄâH!®îś:=˙¨ďŢçĎPČžÜÂĚj3čń K|›ť·µÜ÷Ł&ąOŔlÎĘ5©Waî'˙%ÍęÎú¬Ä‘ňĆ‘‹î7KÁŹĘě?eçÓÖ.sݬ?čç•u1^€Íí_ó};ć[Og2ąbjz&ő´Şm ZmXď€ţĺW Řś7.pî%?“Ńw‹{^÷ŔeLş"µŔ_€X˙Lrł^QŘu]×u}×\XX8'Í_”]Q/x¨üí(_•i…ůďŁsĹBż+6E} ÄŐ-žT*Áęĺ÷g”!,Ö?9˛›ÉX@š2kEŽ‹îąíĘĚd ?Nć^Ś~„ÓüJRWV‡$¶KdŇDňâÍ‹žDé‹bMr2[łj7g9[ÇhÚ3Óć. ż’*sĆ%‘Ł%C¨Sţ! k*Ôż}‚°Ţś1µő -R. T껜|Ź•C`ÜÂćŢńÔtzćrEr/XGŽ5TŹ~Čq˝ĆÓű#ž¦Űť€±<;ÚµF"|Ŭv˙ÖňY(Ź˙đw`ěJG‘–ݬ:µť«˙QMę4–Í0*y˘¸8F– ß|¦ň(űĚţQNz…ŇŻ&`xů@Ü|šÝ`T'ąi ÂÂAlXcpś«»×2X¤Ś›z ë_H®ŢtťĄµćJ˝Â4e>zs›Y'”DÖeµ¸ßŠĹŚ»¬Ił×a€˛Űă9} ňěŚSĺ,Ş—VťŢ6@!-ţá„÷fHEPße¤ß€Řlü. ·?…R@”Rç,śPż¦áŮŹ_»Řîśs?ý˙Őćť:ćÓńŠÂ®ëş®ë;GaĘ­&föA¬–˛(MG~qś"eÇ }#t$Źr)¦Ó¤fˇ5^Hú˛©;üb…ü}¦Ĺ/H=Fzf¶,Ij”Ż$2ĺ‹MyŢ”ňZ^i^âLJéRş¦rô5É ůÝzß-7JéíúgŇLD¸u>ÉÓOHSą”śó.'?—ÍXg hZŕüň ©cŃ&w–ąŢăŰ‹ď0–S¦¦BëWďcj¶vq‹Sęů"áľŰáö6ÁÇBÍ©§ŠEżTP‚‚ĄGĺ®CsĹ…äâlŠ{§’JuÂë˝ë]Ż@ąz'ŕJre»_IóĘĐťHÝt@Ḃ´Tá(Ę;?*;=«pÚËn€0•Χń_ŇÁi¦\Ý“}©k€*Ăăßx÷ő Ţn Ţ|¦Ó7?‡M˝.çWçqôY÷_]ŞuÔPä­č(Řş—„†Â ăpüGÜüé˙Śen)OwÔ9©·ÎJ7Óěő‰¤JSnGĄ µÝą1C}JM™•s?ő@őđLB=ł~^‰rk ¨ »HÝNłĺ¦©Çkĺw‚°ŞćřÜí”z­ô7Eľ‡ĺŠť ’“ˇ`Ť'¸Č=zýż®ëş®ď…ť>˙7 Ú}đo>ku^&Ę[ć·Ň©Î@˙ú »wN&(ă|–›©Ěy§Â#– G| âwĄdMłň3L$ĺ´.≔GzŚç=Éq¬yĄ˘:Ç#@ˇgőőé'/üľS/%R,ö:ą8őúÖ`ÜĺťsĚČKťzµXB5Z š§(-ţĆh-ź#;@ŐišmL—Á1QrZ™ďSF'tPS˙̬Ŕf˛Ń˛±vţú©‹’ĆZ 5ńŹĘ1ćNW­—Żŕ6ł`sçĽdµşFĺIĺ¤|ýEźc(ăâ–Ij¦ŮpÚiÇŚDĐ©‰:ţLšW-®*r‹âÎ$…zRUŽmGÝsČOşşjAźł+Sh1ń)qô¬ţDó›3°Ĺ”gµcw†ů–ś€2‘úŤÄ±čZŔ\űL%ÖL7Ú ßţ ÔĺO@Üů6ŔůíhLÁ79Ć/t˙tPč±§7×:rŐPN@ŚąeÂ4žĘř•V^ź÷Jľ‘50˝){CîČłŔ¶s˛ĹbŢ-”gůĂSî¦ű‹łź˘g=Íč)Mj/S ~ŚÝ(ÇäôoŔ4äţ§+ »®ëş®ď…5wź{¸+RFy‘Ć}‚hĆwČ«8˘îĺ”ŽŞ¤Ç‡eöVÎęŇdd”šĽ ţí;…Ľ=IµZ)§ ĺU™ů*ŠěüŇ´«¬"Đu#P´;çőě÷Vjń\S±3QąH)¶`RÎňQÎBZ΄4Ůarěly q Rś éTB¸:)ĘD+Ř”Ŕůé_ľ«§ÔSHę!±{jr uáěMŤ‹•ďĂiš¶8B{Ź­sR6YžąrJ˘™Ř7ĂÔŃąąđ„ň”¤®Ľę ŞXę.@{óŢďĂň$żťÁÚ°í:š©÷'†éüč(E3ôŚĚYqV̇|Útç·N‹saMQJěĘę?›Ŕ¶€óÁ±›±·ő Ďx*Şa™ÓŘR÷ĂĹďŇ%íi™(ă3J±°¬ŕÚMjÍáů«óČŃ”wşjż{ĄÔg‘×wëŠĚ&igÖ@)ł?’ܑꔜ,żˇúTҲ’rĺŘ^Ę-i^Ea×u]×ő=Ł0› őgRľeÜ(GIz«,gbÚĘÝ­ă/Ąhë[©ę\‘-Q™I+qIkÇ–¤Z®€#žĄ=Jűv€é<’•â\fRâĹx~ÂztÇg’~<=UóŃŮXf.`ÔśE*ˇÇo™îjâ:u.;rőJHu‘Rö_ľĄ 3„Iδ&ąęŞf•‘‹´]Ĺ «ú¦n…nF jĺă0Is%iĐ,|łČ.?ťáůř Äí=ą•ň載íý„§¶Ka¤Tڰ%5 ŠRĐd*†ěÓ0fGçP‰©›ť_S%—$„"Xp¦¨=\ěä ş/`*9űQSśçÄ CŻJ%«nHł3aş©ý>O'˙íˇĚ=BvQüi÷ćČş(Äuć¦úbwL§Ď™)“łUgc™Lo“Đěß`ˇ"4¤oé,šŢîÚ’6˛Sę'ťm1Ź6eî ´k$T˛&uM ůNłł"ž˛ÄÂ1çĂĐČŹaJşŃź6äv§h×[ żśýާo@Ř|"ÝôRYĘ)YŻďń®Ň°s¬můzń–”Óť?űgP3îĐčšľőZŢ˙HR´1ŞłR,ö-iv¬\č+ »®ëş®ď…Ie^śf úđ7`x{Ëj~.§ ěný»:íÁF€R„iÇK ”—ě3 ‹ÄÔŐRąˇ×ĽuÂ)7ź|ß6nE Ë32˛ăHň3R®aݧeÉ™J˙ŽŹąźYš)Ńk6aTŠ\–zönÔxü&'ź¬fzúłvłwľŁNçRňÄĺ-g˝ž^÷Ŕfw ôšÖmň$eBXď(ƬPÓÁu§°ŽP*57 ~&-ÎM=ý9Ě@Ľů¸@j3IŮ?dĽiâąf•Pn¤íĘ˝śJMč_ö@µ)X—éd6« –őhEеŠíÍŮ8ÖďfŤDÚu§°`‘2䍫O¤l^Ôeásbr;ßó)•ÝşBÔ<±ó;VËúĄĚaZ8Úť_~!O?ËĚ…jËëo$ýT:Uân.Î/Ď‹)˙jű3€ŽG×%äź ňx*QŢśÂoţ 1ɵ:(qdň«c~Śy1Cúk4Iü ĚuÔÍ' Ň;}ý̡ʶńł1ŹÁ‘o˝˝şËßý3Wďś1÷ż‘üŹÖW` _ëĹťĐ;Ú˝Ö›śéfW—vŃ9»ůřďŔxxŽO˙°ýôď~'Ěť»Łz]×u]×őý˘°éü ő 0îB¸ćF :oŽ2ć©p®ˇ|¸'ąźĘÍ;\sdť’řÓňl ÷ŮĄ(Ő»ÚG$ůúŢąíÉs–Ş´#ÁĄőąËǨŁbk’ňĹX3íáÍš4'Ť±úă Đ<ü÷jµp, ˇ„*»„zšűF+6ÎAĚçIíĄvł#yÓäżë_ćöÁ÷´éUYT÷¸°j€ůőżőúżD ‡jźëaNÉ!#‚ö1MYĚ©­¦«^´I¦ÖČ”mÎŐŇ{ @ąŮ:f1ÄřŤ4ç*Ú0ô/ţj:ĎâŹlş*^éí ¨n?ť’'Şś«|«jý‘”aźĐú…äÄŚĆIur|4©\9 ÝŁź hSĆÂ1Ú<€Hăě¤fÁ6G|ššŕĽŚ§/ź˙'ĐäÜfgÖüTÝo™·ŤY˙e˝\Ă®z‹-Љç˘ús¬n?’Ľä˛(WÎm©Ý*Ä•ł™Âż\N$źŻÁA}EŐë沜2w9g˝Ţ2…Ĺî"wV–·ź€QSČýo$ÍWąĘ=ˇ†¬Ű’gĂZŠĘďó4 ®HľËX$ďóúöG`xů Tj_Á¦ŇášÚz]×u]ß= bRÔÉx—ô+PÝ}Ęű¶Ô.TŔ0]€m]ŠĹO/Žwä8Ó0M' VďđdHííĄ•: NĎţůµĐčvqW÷#0Ĺ·ü~Żßâ×u]×őٰA߬ÝÔŽWżĆ×/¤4z͉,Ĺ1f˙#et¦#MPNĽř¬“7ReĚ5žž¸^töÉ׾Tń(ëJ»ôÍ0+±ű2e»&%ÄËĺ'7V\8Î,†˝őߢŤ&jćĄ#éÔuÜeű#PTYń”ş©#$É–Q™ăłW¶äŐÜ™Ľ^˙Čžvx:Ą a“•/)t~沺ÇĎ@yżuL$ŤŤŇľ4Ąpśđݞám>Ą~Ć(wLŃŢwâJ żI÷”oé«•Ľ ´wxŽľu)áX`ž^€YlT6şą+0'a•Ą®ŕDŇŮÇFďqđ}[Y»ĆIĄ`3G÷łĹ§Čż±%»-V…”Í+$"¤f™´żkŠš€R)ěŐĎŻ@˙˘–L%ý¶JšNÎŇ.µQú…BI¶:Kç‹apJµkü˘8Ľ4ď*ć®Oă—Ĺg…ü” §ĺa¨ŰÉf©úq}Í÷’ʰX}fÎΨÚ5Rţšţ|ÉMR)¦ô±±G Ş‹SźŁóP4?úk*źÖÎv ţ6ŞŐôóĺ+ől–],ľ ”cxĘŻ©¦¨áŤ¤¶»˘°ëş®ëúžQXQś}P·ťůż¶ďń~7eŢŕýŰÝň*5ÇŃN"­ŤY„ĹŠŚS,ĺJ¸©;aó@šaifaj㦊i¦Ű˛l†˘s–$ůóü²F…&ÄŁ‰ˇ+2[z٬ůQYăň íú]“„(P>Äčű°€ÍÇ!ď',1HĆkÂVÚŻćŞ^ü”~´óă)–éŞĘ•cűŻc鼕őu/{bt6„eJµ‰‘T[žo¦fďŚJÔ5Š )JIS‘P@Y/n§ëě…uTĺmćŐ|3*ĺgĽfŚÖ|$9‹ERë<=ŁüwŰ?Aę+´A]OÎG ¤©b”ú˙˛÷ß5ľü§?BX:&b żřUľűĐ ¤tbâź’źš·äV ‹ő•@X˝'iÖĂjç\¤ů †_© Ý_ł‚&› NsęŐëłs$^,T`ĘÚUOŘ4ä)Ľî“ńü”7÷¤¦1Ąw¨=€bGrŃ*OŹÍM ôßäK‘Ú+Çé AOÇ߀RÝŁĘă7´8Ń1 =1X¶‡Ú'Äú} ©ě‰máÔq-W†< łBh€˘Ż(캮뺾s¦E&)É`ÎÚ(›úiĘs9“üSöDކ!Ăh!#2S|ś€B¸Ć6±5©©HŮ­)BÚ“LÇÇĚg‰yŔ\JĽ"ç¸k{čńrÂjCňú…"8»¤ÔVĄŚÍo_IťÉ‰*‰Ü`Vűž¦ESNě§w¤ü&ÍD’_oÔ»x{ýż€¶ůĹ‚‰C™.@}˙gŕňú/ XÝ9W•2é¦óÉĺďÚ’ÓÖ$\%0źť»Ôń+×ßÖ4Ýţ Ř~ú_€ţô⨇…«QMŃł&ł§Ű–¤ůž…4»ö@,•ˇžIĂąFe]üϡÚůݢ)Ől÷’¸Î#Ů[‡?0L@ůî=0źO@Ń®ş‹ß˝E˝ć·G€f '›f©gRłăł#)K(‘ŰwśŞÚtĎE“ńŕś1» › Ë=*•–ŽŮ|Á•ý-0˝ľ8W'˛‚żs,Ă”yçE“·:®Ťq[$ťYÚť29tÇ(ăAÉ·:3V  ć™4uťOżŐę#)1b&7Q‰ĎJŢáěj0nkµÁ'žÖ!_:¦|–ډÎO ş3•…«Őě>Ýń+žo€®ő Ő^ Śç_I- Wv]×u]ß3 KA™Ë$,%XĺD|±'ĺŤšź•š8“dŔʇ4ŤŻľďĄ™><ssKJŃ jNÔÎ)ł8˝c˙Lc”ëŔ|R“PL„ ý©š•´l‹Ś¤)q}KJOe>Őö˙Fă„őn~ö˝ëÜš˘J›S‹¶§Žůř‹;R“pšVřp>‘¦-±|ď˙Öü›Úc:Íz„\¤ąW¸őe´•6ŕśb–TNK†QIw@h&`šßüg ©~´I÷GR®<ĄtŰĎ™é[d]$U×ëő–[‰š[`öU©ŹŞ®3J˘/óLÖÔvĘcĐ/Ýç[‹E#wlßĂńTJßsćš|#–®!†ËR ÔßśŐ2äT9 †5¨ęl@ßýÔ\-żÇTdßČl Cýđ T»?;‚łésąvLš:ib¨<!Mńw6{]m€âRC˙•ôSOŐ\đU)(Cą@Ç|ţ§0ĽÉ…Ň8űlÜč´Ä†úTţDö±(‰ď µrzĹŕ˛˙ hî~r.2ů:”$!nMJĐ3<®włZMvž6™Ă­ZŕíŰ/@ąěĐÓaś3Ç-ĺ]ű#©çôŠÂ®ëş®ë»Fa6_x…”ŃŠ´°[˛4Wů\9ü)5ÁĺĚŻ„rľRŘ| i=”GVL9 Őf@űĎy+§¤VĄČ—9’úŠ… lݰ¬n•O˙ PßB^űé DĄżë9_Ú˘ů Ô6‘ĚÉJ)‡KŹíҡśýťš’KÇ>şsBŘ}˘Ő:ë](Çň&Á2ĂM¦ř7ŽCť•3#j9/ ă`ţÁěľ4gcyŚ}ćwĘâNtpřö°yřŮńµ4z•đٵĹŕÇc|‡rŠśÚîp×ωqUç/Îč1UŔ\|ć±ô3M0µw@µzp9sŻöĎ®J›ólÔRíĎ_rýž53ť‡3ŢýŢw¤Ţ,ăPäÍčĺF؇ý)ŁĘ4‰“ĐJFħý °}˙ÓđďÔ+ů^|ÓŤ.CѨüęż2UŔ“:źúiV¦Ć Î02ćĚŇ8?ĂqLE´ŰO@ß˝-ḭ̂Ŕ8íyRM®w﬙©Ś{±l)EG8t™ŐŐÝRóő››O@ŃëůŁ&×Ě/{*Š|Y$倾qfPŘ­T:®9Ö‹§Ŕ)3Ń6ˇ–XIm_€˘\_QŘu]×u}ç(LĽUl€ţëű–JĘ,q:CTŐĘżS-ŁJs;yVók·Nů {g”Ě©viŽÔ Ł`0˘ůăĆ·ëŢ€ZŢC}7/f:“ĽfňĐÝń‹ł0ňöOßp‚´BŽjCJX× .©«'g[´Íu ĎżŐî'?¶áđŐw0MľŇdŞúÓW *'@OőĹhן€ł2ÚĚ3đJĘĚ,›YfÓń l",ÎČXEKÍ?Ł2f‹h7·Ž¤Ý»ś~Ú©[0kb@z ®"©A**ĚÝBˇČl‹Xž¸~ﻥyßÖŇ8.´×rŰ]ŢüžŃ~>kÖ9-YČčx\Ó®ŘÜ,pÁ„÷´Wą1^J+MĆĹć ctĽl,ŞMŢőüqňw6wŔVşËg \§n2ľĚˇ'ĺ[˘ÝzĹ<Žţ)0öMh @łÚ@JËţNoW@ˇ`.΋çÜ~>ŹťżÎxxb›[ľ«‡źůđ (šŤ3ÂĂńő´Ş|Ěňr'żg„ďúiúóhŔćţ6d–ĎTWÓty!ß-6>˛1”^۬ßÇ—Ď⍹@TÖńOO@u÷0Ůt8{TÂJí_ű+ »®ëş®ď…ŮÓ¬pM٦Ewˇü\—¤Iß{`|{"©đ•pd~«)g6Úľ¤ŢÝ!7cŰtŻ(€Q }1ĺĂĎŔ(t<ÜÝ’€ŞfëčCżWş!ńDýŰ3)ËI}—Je’/r6ŤLĚîr÷ż˛l­ŠîŚwÂď>óéÉ‘”žG“WÖ™C\ř”‡ˇo›„Šż“¬aÖÝ"§¶î¨{`čN@w|Ö»÷@Q¨żýčĽí…]×u]×÷ŚÂÔIcqŚ«÷¤Q“HŮܡHř†,Ń4ćÄÔyZt·ÄŽÚw@T⏴0ł¬Ě,ŐçŁ4ôŐBoz–Ü9,ĄŹ0KTÚçĺhî?…’›–‘ öř®ťóĆw‰ô¶ől?ć#לQűpUýË ŞKĆömíąŁŘŇÇ›şW jsfÖ´˙ s´á0öŐftţśŹJ{×EÜJ Ě•&tŇRŤŽj‘–úx"MiĂvă¨V-ć´vQ…k`´ŕ.MB·¤ě\ËN¨˛=ĺ1T@ł{(ĆSýC Ü}ô}~<ě°ŢŚ/¤¤‡yÁ»YŔ‡8¸·gG1) }$9 ĺa´ń<†[íĆm挬hę¶t6P‰Ö0_·ŽÄ‡×Ϥ /!t]/ië„|5•; ”çDŞz%˛óéhn?“a·…żeY'iWAůÍź‚2W^ĹĎľB1’ěÎ˙ú˙çî´Ű$ýšől–…-»Śţ”zVLŇĐ)ݵrYsŰdŔ­¶k[Ăi˝şă)gĄ( ČýŞ”‘¶%•‘ő/żéň‹¬ň窨üaŁ9uŠÉËüęś©”ýĂóŁóăâĐ[1_ýŢ9Dz×<_QŘu]×u}ç(lŘ˙Ä»qĄ¬ŁyMÎ-kČő.•mąľf1â\ú=Â=©ĎQ(lYcťÔŰSCę= ë€ţäßÖqý‰äňW*ąMŁ3ó t^ö÷Ů˙‘<ćDŇ(&R©üú↔ŤaŢ.ĺL*n]łŃ hőîĹȉ˛â 㪦Zyn—™ľ¦˝*y-µKK Ôö¸ĘÇŁ]qRJĺÇŹY寄©a˙ ’îyXägś:`Ú¨ŰF MŠ­+d#pč ŮÝóř%É”÷çËéh­]°)ĹV~Ńůhin_(Eľ5źŽzdźüř1ßĹQ†ŢµiٔĿű Ä›O¤ężŰ6±’ÖOą ꬊł3§Q˝;ĘŠßśÍ uNßţĐÜýß^ŞśŞ{CóAË›× N .‹¬ÔBéfý ˘,ŕi÷şRrË-¨s(k€zý8«a x›gČ©dšJ/ăŮlük)âRŐ3tĘ˙Y]:çVKQ;‡e“bÍ[Ą Ô'NO%j´Ú›źť]Őç1Z˙Öo¤h<ţw îţŚ+”ÔvzvüečRO<ČçP5WŤę^ZÝ_QŘu]×u}ç(¬ŘÜ“čS ’´6[!”ŞZ¤w˝ł·é,I·…ókÓđ/ ¬>€%@(żÄ<†ó2c„ő-P4B źH™ýĆĚŢ~ 7Kô@ôÉRć]NÓ—Ł (Ďně3'Ąä^K|[0wf×)Jšb‹2ú3DRMćĎő<_üoâĽĘŘ0–@Źzż?âę?ť«ţ o'hvţŰG9‘Ë*óéó=·w@ż˙vEa×u]×őťŁ0}‹łp$Ů<®­€Ńú ň®«)¤4čĘ";łĚŁ?Ií~±˝‹mŐ<b+Žľß†bMňmÍă‰@yű3ž‡©/ôU ŻŹĆ!–r9’§3‹‹YŐKćŠěňOÉVĘ&+ÂňÂkF??çŻ˙VďţěĐď ‹xó±*S–ŻHsĚÉ0Ĺ •#*ŘdÄśô4t_fó'`>Ś$…şTËÉô s~t<+ô¤lĎąXä‘*ďIŮmćNU6CÎö‚ĺÚĎ^Xi'Ď)&…ś†ĹĽädôé,¬­ÉW”sCJ¬[š‚Đ&0}“iÇteĄ˘ Çšy•ĺ”m ęcŻÖ¤Öȱ˙ęV¶×¨^ˡšő )3+M¨#ŻbV»O¦ËW`uógŕôřĎĚén6öŔˇş'§vfÍp»č• W–§›™%ŁĂŚš’Wů´´Ű8żü Tťrô߀árŠv›Ż”őE\H)]҆íÍ Ő g©yşî¨›ŚŽŐ •"– /G ×9ß}ĚOW“fťp9}Ęz“që˙Rׄułöţ©B TęĽÉŮ=ńĹv—ĘyP:ˇrq·ŔxÚ“¦Ř᪠»®ëş®ď…١okeB®Ţ…7ÍŤďrĂţ P47™Ő˛äőÜ´XŚg`®ZçËćAء¦§_Ŕf”Úsbő¬îŐŕÝ“)‚UúG‚Ň.É»Wô9›Lţ2ă§ôşýKţŽ_í|ʞ„{ińâÄ_ôą»đw ňč­47ĚřÎ^YČTľłý3)#ćÔŇC•ĹŤsšjlÔy3ŐŢŘ9—ÚľëŹ˙NꇿśŢśÍ4Ež4‰Ę>Ѭł˝%e~Ťă´±ĘPçÓßÉM—˙Ż)Ő:Jéw/Ö«xrvLçżlV@˝ąwTk:,K‘÷×;ň˛k$ĺÚjíL±1€Â5Ę濼M{çON¦+°DŤ*_—ˇÚÍ™¨®žŐ†#P+ CSű˸<ţŘ~řđöô?őíßü™ŔşÜÇu~5=ŤéŠ«[KÉúˇ­ťÉ öآĽąü|sEa×u]×ő]ٰ)·ďI嬎¶ĄBWxA“‚˙üldµŘĂMśŽ·…ťď!ľ#uź¤YĆĆEB©±rĘ#ßQihżš2“%ŢDBę-Ą\mIS ˝¨”8QzqËÚđvBÓ©+ă4§°Äbâŕ´Ź G??‰*|׊ë{ŕňü ®KVŠiŁDŤ_}*,ůK™ ›ŚÚ,Ô«z˝ŻyrĽ6Ë ˇ®k<Ţü€âąbý8<†Ö‰ ߀rꀦ]ăŮçĆű,®‚e!dt`ůź…E÷“˙Á™4߬ä7¤ęjř˝.ź…Ž<áâă"Ö<ąą‰ZwšÎ§ÍŽc Ś/OŔÄf€eşMšÁ=;5&ëm47˙„Q,Şţ·Ë?iR#šBnIî<Ë×¶ )?ŁzżNF1•¦´;fST!č1#úA×ę Hy*rT› 0ż3ŰőpĐ/aÉšďpKŮ|9ËÇ3üŽ—g [-Ţ6ćĽVeĎM–í1ú7—Îź–”™¬™ďĐ_€öţg`ş<;'¸˙öw ´†ů:ź#]ł"ŮŞ5śv}tqů^ääą~‹_×u]×wŚÂć9wçH!"÷ż…ß•Ja¤Ý^jË·3›†Ň)„Ĺ„r' ´ŃĘWNéď”ôji\duÚ4PŽ|}s_^€˛É®w%ŽőRlŻoÇĽ“Ď‘”Ř©¤í”x™{Č•:ôűîÇĽŹ)łIžĘA%…+ß=Ôµ¤!.[$+4ë?•%čźI}ŃŚŻ$5śÍ_Ę Žv1ÍTłˇ4čň÷)÷Ęk4ł‹ša•-Ą¦ś¦Iřâčűo@Y´@\Ýůő•’K8Ą{űě>ÜýĺĂ ʰ*— Ő®{\  ĄżŐ$§­Í"Y´^ĘaWT~ łŇPÖwůşúO}6Ů!8[xî|ÂUű´©ś¤J۪ϡ¦):fOŐłă#KÇŐ}rzsîµ\ßÁzpÖĚ JÄížü®¦¸ĚĽ•ÝK!PĆ;’CFĎ:ĂJčëŢ~ â»ŕňôO ˝ůźČqÖCÂY=şÓđlŐ…wě÷¤\b!/= cn¶6­Îăd›¬˙))ň×ţś!·‰Í+™€í»?OżüďÓ7ţú´–#0źF n¶ţŰëőO@םQŢţŕOEWv]×u]ß5¦}C{ľň*O_IŽŞiČm’ŚÂVš@)#üâčLŮ­Ö@§ Ą˛áŻ2?9Ű7óBDN¤Sôťv^ä˛Ă áT7wŔ°˙š¶mCjJ4+¦PŢ˙ \ÇtI—0ĽüŰűk09šĹ YlČQJ"Íd‹y †ĚQfLQfĚŘ_ž€v»P"pś©áŁ3DŇŮ+wg…l×.`TĎąNe_fvFX8lZqJ’şTÎAZ9ŰÂ: ,Ił‹&AkŞk ŢĽ_üŢĘQłťŰ"«®X&ŽÍŮż)$rţö/ ąąĎ€Ŕôz ('GÁŐűżăéŐ‘Ł%Ž^”łV;‚Đ}•˛C{żÖÂłbx•`ăĆą<㺯:lj†ńç{ z÷W ś_Ůîmňű˛n¤!Łf±‡1§ě )‹_ꀏŞ›N~ö*ëëěI‰`µX¶ 0^ Z®_\$ ĘkˇY¶ Ěâ9úÓĆ ô˝v1Ż×ÜSŘS-SS DeÎqqö”*ńxöç5cŻ˙ ć˙ 9vR&Ý[fßşhß˙;€<ކâ­€^éÄ“´u3PJ±ţAź] ¨«+ »®ëş®ď…6I€Y‰Qí6?Íj÷­†r0 /XŹK ŚÓ/@ď€Pß‘ňÔͧdăÝ µÚ©ĄYľ9é}k ę›Ux°ďąŔ’ďËw†ý?€îQYWŤÓ+ý*J']Ŕůéź$-ĎŇ´K4űŽ ˛e"‡‰)•I9g˙Ż) Jşá_ż’r©úáě»Üpybő śgĹög’KNó¬°HtX&©™wßqÉ\F1ăéÍŹaZä|HĄ%`X@ó/]‘¦&Ń€ĘSVRBżXĽJi´;˛'±Ě¬a‘™)+ç¶DĄ‰5™Ť2„.HşÖwśßQR(f?Ő ÎľĘ‹?0§ĺîŢů©ÔJUŕŞ75rëd ż‡”ő;e9O-__jňi$5ĄĆ›GX6§sÓ’°ůĄ;ĺFPP•ŽÓĹ[);_‰işé¸˝q´[–™Q’Ş4ŻĚÝőQžÁqŃĄhśµ^EšÚëS9śľqŰdËîAÇ’¤trI_In ułĎ!ýó!ł«ĺťÓĹveĹJ뮓QĺVąc ˙Ł| EŢžţ;0Ů=–Ýjš­{ˇ8żq˝ĘÝĽ4`ârEa×u]×őÝsa¶ĎgNˇ0ĆŞ ůČRTd ęűµ‡DĽÍPąŽR+O]sI+–ěýŰK&‚Ű„>?«›S˛t¦c¬4CQÂ÷P„-(Ë$żˇš†)eŚ~í=©őGiSzb7ÝY»Ć·g`¸Ľ«Ű?“täĘď72G ß%ŠÎŻ@µąóť!l„ąňÜÓŇ;” $¶Ş‹¸ÂśfĹůڧo@Ľ˙(äěł<Ź‹3’c—˙<_Đ„ˇRĘĹÂŮ'$˘9˛°°1Ź˘Á¤·¶”«q‹,Şqz°lŐ50‰ńT&A]ťrÍ̸‘ٱ4Ő}ň_{~üĐě~Ŕ3łBćL5SłÜ‘îä˙5Ťß‡j“¶k4Ë›1Ů÷:űń«EAąŁR䩥QY¦QSĽPŶň÷eGąCf -¬jIŠHݱ–g_4@ąÚĂI~ŘłźKĺ“söü§Ô•€ĐePÝB”ŔK ŠK’&kĽtj¬oéíěOHíĂźHé)©aR&W¨¤CŚ@ű¬Ö1Śj8ňgÖZÓ­aë Ľ!AwHAjáěŹoŔîŻ.—ŻŽřt/mvüÝ]^>«»?‘úFS@ígĎtťűoŔĐŔd,ähwwWv]×u]ß; [|‰IEełu8Š"ó/–ť$%±µ:KŁŻéŇö˙ ĄüĚ×µW÷™éĐoWжÉP†Ľ‹šż?»Őé–DJłĆ—Ď@±}‡gZHą&¦OôqďűŞv¶(•|,€j#mTďűů¨÷¨Ó9O …Č„ŕ”)fS<Űík Ş[ŕôü+ĐHą3O@%”d9î{ ŚŕÔË?pOŇ‹łH­4Gľ9Ýj’Í2$ô{Keđďq”koÎŘVšéă¨înťůJzî|NĚýji ˝#;ëĺŢĽćóčÇĐ6ďHÝ3R矕ܫÖ)Ľĺ@vz ^ßçß«Éć°t§Î~'¨Z~V“öř<?Ő5u߀Ř*óKjŻ#«ě—wŁfxˇ'q|šH–7?’&}â4çőo*˛—ÖÚÄI‘ŻţhíAjY-ářw ď"Đ”~6‚%ô.zŃŢŃíIM?:ć¸}˙ 4«R·8¬XçDĺńĺBmĘxčNţ™âtš»ŹŔpüFR˝Ĺ&ë@MÁ7-¸`5“…ÜL¦ŤĘM‘OąŞČ>Đ (âqJŃy›^č~čČÓíłżŽ}f͵˘$Ź oŢ;ŽVkŮÜ“'ą×u]×u]ß/ 3Dâ"ͤÄLŇ ţ=ÉR(^f•ęS˙9méÉąŐ KţÇWg‘ Ë!¸,žź÷ľń—Ő–äY/‚”–éTrŤmIZycî„PnŢÓń+WďĺYoťvK!Ęn‘-ˇďń}˙(a}3ĂbVđ×޸ľfsŰϤĮ˘ÎZóFí~zGĹšäĘ,‹t‡7`¬î•%Őű˝űŮ9 ¤çžđ¤sq1łĐĺ3>)›+ –ů݉53EUă·_€ű?żúý‘¤Ľ3$nZů‹3–[¬€éí3X6o©T8ÓńčĚ]łĘ©O6·•ŞhĚŠ9妍K¤ ,©]z\x3G!}ĄÜł2-V›ĚŃÔ÷ ¶N:ď€Ćśz5ˇ'áÜţů3no.÷ʤ|·úă_ář•śźu&%¦Úź€Rz¨éĆŔxŮ;;Fq¬ntŤ.¸OŔđoÖýŹbÇbąx Ęť ÂţĘćëö{rĘŢ{żŁt×…˘9(WŃąKőĎKóĹ3:žY°˝Óâ{ csińu×Í—g î>Sq!GŔĺäáşŮ˝R:ş' ÔťÜŤůůfRăýĚť2`„ćÄ'ŞMň©őÝZ&Ő˝PßáýaÝpEa×u]×őťŁ0›RߥybfCÔÍ;uŹÎ§X΄&nEOĘE0gąôbó@ĘWr Ëoý9;ˢütôŔ ®cő†O§’jIüÂţ_$ŐϬ$%pĆí;|žU¨żZÚř.k1 o$…şđ :TĚG©w Čv9Ăĺ(wŽ2LO§ĽĐaŃ  Ěo©Ŕ•őľhŽé%Đąű o<..ÎPß9wÓžŇ2­ wÂŚrbNĘŇĄčY;;©‰gšFĺĆ€Őíźa‘ő.|-n.JQe‰¬d”*®GS3rVířô+ď~¦ó‹˙FőÜD)žřh8=s{OÎçśýÎJ˛¤„Š”Ő%D?×·@hHi"b…ě@Ő†9ib®„ŐčĎo@˝ąú§/Ŕ\éx*’ĂÔÚlÎ{pÔ< +L¬2’*.@>íćo@X´.„Flă0öŹţT!%TÁMĆb!·|˙({sGę /ÎşěÍőÖĎ›±iBy!#}…sĹ«Cŕ0 @]fźă<†ĚB.>ˇĄ%¦é‚(ťâÖďXs5IéŐČy6â˦;?fy<ęőÎź"[ Z·¤4´©˙Őď=5«‡ňÖ?Ye˝ŕĘĎRĄŐWv]×u]ß9 KÓ± ÉY,Ň#-eĽ’Š}Šjé $s4ňôKY2kVŞëř|†ă(Ű’”C0žž€bîô1Ľ0žz÷žä\Seln}g.*ue׾oMXşă¤Ö9±rly:e|¤´Ďnpv ț֋Ť'í˘J2’ö-(a•ÜjŁěö2ŕ˘g~Mj$” ‹>m&ŕđúw`só30äúˇ”j ˙@˝†y$ĺĐÚ¦WŔpţ ÷ĄjŢJľ.…%úçź·îîř0dn®2ü"ĆaÎXŇşAϤ†PMýFeíŻ+ N·ťÚkÇÔ–Ť%&ÎúoÄ“Ţ,°¤ü›Ęˇ˘”âçŞÉ˘nAř®$iÁuŤôÄ.Łă)K”m·Ŕp9ałćsž$Ćö©ŤÁ¸›ö^ž˘–J®ÉŚ8â˛bĄ4«#PßŢýqr|dşżB>©¨ÖÎŻaM]R?ţ˛ü "µćt‡g ¶ĘDË™Éăç˙„!úÎy^ëŽÔdS=•ó Ô»{ ’{?—ąx6Ýž3.{ełx%ÜYSi>ÓË7RëR¬óoWë•<ˇ-śńŚŇÓé;EžÓ寝gT'†MĄő[ş8˙ Üř/ŔŻ(캮뺾w6|űź@|÷3¤&í9§wZw•C©uQŞĄÜ98Or«)©ŞFĄ)Ľ=sPŽUNwšÎĎ‹gűĽWYó—zEJsĹpÇÖ™ľďM;NÖěŘʦźĄďT¦5źß”Ľ*˝ţî$$JoXáiF;\ŻĄôýĘŹazýJJą’X»–Ôó©3|Ě»qCN (ĂšÔŇdąlĹÂ(ěŁs.Íúz ÄA9 }Ćb—PŻ×Ý‹żŽ||X×á×µR–·nMJŚ’â,Ť¦Rž˝ü1ÜS/ŹO/΀¨É|>iN¤tŞ»ŚÜSJ>â醬ŕ3~Gh±PĂŁrĘËłČXMĂĹô-rb-»UŢeuÍŔr:±Ţ‘˛|‘ţHŽĽú4‰ŐW4—¤”wy 5ݶD‡±şË3°™~‚f篎ԬY˘;•2QŚô ¤ô+5˘‹›3>Tɱ!_‘ŞiQ©jJyëÖ@¸ąB»öĎŁnč¤;ËÉşĂëĐź˘|©e ĚÓggëćĹ}8ŮqĘo;ăáaő OÝ0Mb z×Íź€Aßĺ:ßoz…©Ă]Ŕ1wš[@*Ë ĚęN?˝qS«Í; ?ť€iŢ_QŘu]×u}ç(¬Ľý1S*gJYÚ¦8/A:\qVf˝ďJP4?”5ĘŹH©tă»čdÜÖIk3k>X [‰‡ÚS÷†—4Ęť§\ íĂjŃ^*, ܧ˝]©žJ¤ęŤŠćŽÜčď—ză Y X6ą˙f9ĹÎ@Ü=8Sc¨GžűóáW ľůŃ4ĺ%Ĺ©†^ťŰĘçĚź0ťżˇąs&®mÖ™‹™˛.Ěšô®Ĺ(SL~rw"âf ů…4W ’‘)‚_ęŞ!ű µ†íŔ<ĽCwtS}HqóŢŻ‘Ô=va,łôěW­jWľßÎ @&fSne®*«ÎŰań40G ZCORźë~ŔÔv+`ŕčWAj¸yˇrŇäZľÂŘĽƷ߀"ä^.‰şŽJˇ÷Đ<ŚŤó\óE]¨îţ d]Uąş!Í-_“_˝N•¤€źm®ť{T5 ďĹ8Ź‹Îqg}¦âĚÔŔéé7 iZ’z>ť¸É‘oh#ĐTË-SŐ?“5Ő/Ň\őť`©-×ďÉYřµ˙$ĆîI©ÂĺÝ'`´čXy‰=4`)oIśüąmšĎK*ŰC}uăźŮQî‚2+LŻ(캮뺾g¶ô| ďhg@}"Áôµ¨vHsĎ÷©-ú±-_ůčšZr¶P4Ä5P´I:űÂf…8˦„XiާCGj´DÓ…î)„|üłÍP: ®2×`ICzËCfÔzmsśšÔ d=Éňij˛ŁÖ?yă"eLž~ą&ë°Ľ¨ďp%q—9ľľź€uA\U9ăť7j>WfĂ4ýńZ 9Ë|¸t¤Ůśw…Ąě¸SßŇŻ@îHYRî4ĺxŮ#Ą§r:dÜ­ž„ó+X’Z¬k˛’«ĆÓť¬{p&Kç_I'Jˇ‡Á’fÍŹó;P,PŻŢ§·/Ŕ¶z&ëajx"ĄV)K %¬ŞrmFáúţźÓ)pD.Ee˝ZWĐ  ë€…sÓžBňqÚüZI¤jä.ÇřsqrÄaͪʆ«vÎIń§™~Jťóř L—¨nZżgrˇ¨;5’zZC‘“EV»{ň„7·^XĎ9ä3cą \Éq¶hϤĚ=RqÝ\z ŢýŚÝ@WS ží-xęŮś1ďء®IďBŢ’…A&A5Ž'MuWţ¤%v4@±úpEa×u]×őťŁ0=˙›z>Ţř·¦šśMß"ĆŃ˙+ŐPtň yékżôÝ&ío-0^NŽ ¤ő7dOř‹äxë1ŇlNÉŮmKšţXJşv]áG!2=; ¨î€a:m+ż¤üwSfŮĆIóęs› –Ąďź&D5‡:‘:WŇľ!­śü÷ň÷G ”‚Lű°řľbŮ$‡CrźiúYÝÓËg€ő; ź{ ÇFG¸q-Ą»Îd‡›”[ŻÜ]Mą#Q_blzH4ÚÂÔEd-S9˝Ëú·Wď2žÎŔ¤¦HÓÓUI-eT;ą5“®3Ż!mTĄÖŃŇďc_BtçĎ@-ý˝î˝13ˇJ=Q°©ů•BqŮĹN G-%ßmóęŮâ˘9ŻŇýg×U¬®x*VŽÖ żŘ]Ýńđ`„âŕÜ–:ŇÇ0;®45ůÔýńy%LÎm őX†đđĹYEýŰíÍ_ý“e˝zyé"uç OM©Ňĺä`Ýw@ÜíśmT*_(ĺKÉčU7ép|âí'ÚRO]eE?;k6J%óě˛Đ˝Ńç;!!ÖszäHź‚qŃÁZ櫣'Ľ¸Yă ĎuKI+.GÍăĺőŠÂ®ëş®ë;Gaó2ű|Ęß‘ę’/_€áđÔ›$ ČÜeÎHř(ŐĐäśrŞĘwéüFJŕ¶É]˝ĆľĆĂW ŘlńĚ#‚#“§,’'Ó˙ ţä,ýČpzŞ›OŔx:ĺĂ É˦[d•%čËŐĄL‚fCšĽ Ý#Id9â–‘ż…¬săQ1k®ttÄ7ç÷a©˙k%yŠ-s*¬ŇŻ”AwHéKý·'`ş˝ĺJSTĺ÷gaÍ’Jň˛łTă¬č`8ü´÷Ćś_~fÓÍ ~N¬ZĘr&<)7î2ô<+÷­qţ"–97JhĄŞnýÝĄÎHÓIű›nt#öDY ”9@Ú˘B¸~Ń n(cą–Öď›ss„-ÉQ ě5ďoŘg_¬?‘Z‚”oŐ{ ZÝ8–´şZo?ĂůŤ”źÁ(‚ňČŢ€"Čź+ő™ô’­4o­Ö;r›w Ea}ă€ŐZŞ 0žŐ~$źf eäŹÓ 0 Ya/7č8Ľe޶ęH=Lrü»,®ľľ¶E~ű»BáŘGÓTőâsçśÇŻë¸©¤ć_;`í/G Y/|>Ą6ţŰ2fĆ·Ĺ'®ńO\!ľ¸\CčáőůŠÂ®ëş®ë;GaĹjCĘŘ–?ÎîĹÔÄ!=ś¦ xý?šÍ•Ňjg^òĚĺ@ŔTę{zĚŹÚEĺ|™đBĽýY6©™§łókŇě*EC˘”pt^ě'z—ñęUăor쾡”’k“ß…˛’ŞLÚőŽj,_ű;2żôÖÚ9 FÚE…‰´[Ć –đ’ąyşó(7@2¶4ĄUćŕNZ¶JűáµZł5]ÎŻY—őĺ•4٬Ú-Đď˙´›`´‹®ľű°}ř_€·ÇŇʤHR/Aß=“:– RҦn5y ¬I iťc(ÎĎŔX\üĚ#}$Ľ#ü>ź˙¸…°”SF~w°J8`~ÄÎBwWuLý[Ąőż:Ú —3©]ű­30©`{GjŔ®šź€éň߀^÷ąđ~łËśN{ôçoŔéô ¸»yśŐ˛Ş–YXsŘł¦Ě yÉ:,µ^[§*0t_ů}z—ś†v?KI7ż<Ă…y0…V¶âCĹĎŢţ Ż'5!YK¬>YĄ¦®ÝÝżřÓ€&›zFѧ̔b‹Ţ€qş%ňc čţĽ˛ÚýtGÍ‘űŚĹ”U§/Źńč¬nň_Ź™i]¤F[»k»˝˘°ëş®ëúÎQšł9Šül;‚2€žŘŞ›÷@1R檔böóʨďËó/@Ł”ôvĺ+jBQěIöťś˝cözŇ•(qÉzŞĄZęIÓÔ¨|˘ľˇÉ»Ü0\đDł±ĆÓ ¬wľ?W‹çsĄPi*Ęąh—čo\pssŢWYţŤ<€9—B3Äiz%©],ăL;'y§U#dą»sě)Íw%ŹŞ°¦xŇCŐ÷@Á×|ÚŞÚnłůHN…¶ńý­Yýč» P­2Ă5[^Őž”U ä/%©ZN¬éé”a«lµĘŹGgCŮ[ÉŁ·‚2­„Ë–íßŇ—™.Ľŕ÷-܆AôL ŤayORę'±´••ć¤sX4€aěH­EŐz+ĐčÜßxúÉŹiţ>Ą Ůĺ*$rţöź@µU~ ÔęÓjoUYx˘Ó«cvÓj)7˘˝Ël 8MÓÓ i€fóxűúßfűŕč{¶ľ¨źúŤ9·nśżˇxçhŃ~BžćËwÜť÷ŔJŞiѵ^d7tązĽ}ű;PkŽĽÚúÝ+^»ůź@aůe±ż.s±@HsTmíěą^GŚłş&¤ Uk÷ţ×˙ hŢý™47\_sŔę4®(캮뺾k6Ź@y›őŮRo—eôgZe`Ĺö=0žĄŐľĘŐŔĐ}ÁŰG yĐzRôy3ŤŚ2Ěą6“€zP´Cö§ü´ŁăA‘bLŇw|ôťą÷ŔŞ˝O›“=Q[>­'32S„é;^?Sô@±*ĽĚô‡ß8,bČh Í…^µ/ć*r˘C+ Ž™łKÁ¸Ľ NO@ zMZ×7@qÉHp8ýJŇiň%L—z ´=ż9“hÉ‚[Cőěs”*GÇćŢžńtýŰÍ 0ťF Üä /kµ1 ›b s©·Ů\•öńęؤ4ÝÎźZ‡¶YsĺFč3#©ł-Ť[]Ăń7 Ô;€ZŘ-f–­€ÁšŢĹělYN̲¦IÍ•çű/_€şÝĄšĎŐ4z÷#É1j) ĺ Ýpyţ j\ßÝŰ PÖ5¬q*{ZFˤW˛Ţ(ΧDŔŇ<(uţDž´fŚ/ĆÍš™ôÓÔX\rn(ÝżÎLVŚ@%ś[ß±!y?–źa9aźńřĕ֯¤ô4ý^9[¤Ý‹óôgeŔ˝Ëßúđá.űЦěČîÎŹ@uóRWćxBý§g (ný¨®(캮뺾gjĺ7h$ĐóřL!ĺú¸•óٱڒ˛)N˘ö•˛¨?};jţ¨0ýMYĺ§úńččŔ~p>ŬLĄÁą$5ô1u@©oâţHrfIÁ$ĘG;U]n|ʞ‰ÔĎUžř@íĐ…‘¶Ď«'¦ů ¤Š)7TSŽ…Xą9ÄNŚÚm‚z ŔhYő3@»hŤś˛“T{—:Ćo>ü…¤nŁXů±•Ő=Đź>ÓtĘćĘŚ×ÔĆkŐşxqÎ1ě6ĘŰśë:-p®Î„Í€¶€©<&™łĎÂŮOµd›§ŻPú.Q.–Ł+ ZŚ‹xM •«dŰ}Ë î  ”@´–rčBná„vÍçŰý㪛O$Ýb)n(n€¶Ý9^‡ěy<ű hnn ¦U:D»ÇZ Ö°Őűźü'cÖr~©ĺńo@¬´2Q”ľ?ťN¤VsË›{ŰĹöÎďS ZŮ|~¦QĂŔ¬{F9ęEç T»ŹŔ<ĽŁ˛óÍÓ8-jęÎţ›{’W±Ľ{OjűgčRV­&řYnj˝˘šB #ąL<ňtţ ”Ű€ËË Yß±Ľ%©)”0|ĆÓ·+ »®ëş®ď…™sVúő (Ă`”‡ńů[Ţń4©©5ŰËŁśň0 { Č•6ĺ}OÎ&N{`*&ßíŐč§L}íóĄĆÓg ´˙ć;¶voé§ćQiŤrÖ™Głoteö÷ë¬KÓÍĹÔp)VbÎŽ6ëĐ>Vn€a˙¨DĺUŞçܨĽ1c‘y‘Đdę|C"J§Ř•g6`é‰5€`EOzMą Cć¤ÄqČuk <9S&mŃëżţ`űáŻ$ź 1}u•™©áçOĹlo|W—şMş3ÓÁ[s‚ü}gßůĹ…cvM*-ŁÜĽ#)×ÓAäfńü›c.1ž ˇË· ®ęš W–ŤóMQ+Ëž—'¤v6gčľ‘PÄ=qóÁăSš{Gĺ–š;ÍŔ¨†ž•źPމÓ|ڇĎů4Ź+łzËĽŔ—Łß Ą<úŻý%łÝ>Ňî}"%¬X+’=ÇD nÄvMţĚaşö:§•U //`í_Â/qű`ňç-M„mČg˝bCć%5?mv Ýů=9{’vżPł‘śö™ `ů÷,ú™Ň—B~ćS/·Ąw„¨Ş ĹZęsmźĐěNµN€Őý…]×u]×wŽÂR©ŽŇMĎäB“´'_~(Ţ9g‘ęRµG–¨©˝4Ş˙nźźŘí»\;˙łă8Ą;)ˇÜÂRíů5půň¨6·¤”}K×^ŕ&Sîę;ľ®}7H­-f °y_Ň|ođyVsăűCJâ(··ŔÔ5¤@seZ:{~[6og ®·Îk”u <˙ú뛿ĺÝLč¬ ŔtT6żTÎË˙>Ł’ţâXič?Uń.s"Ö`07?ü)ůŢ桋ÉétÚuűčć™ÔŚ©‰¤2¬1su—7ΰ˛•Ş[ ̧WÇ>Ú˙sŞÁ4ć^Č„†Ä¸]HĘď”IꎧýąWX9˛¶%Éc8ť÷¤ą!űő„• &Ě>Çŕ¬VąŢE{ ßţŚĄ’`©“)40•Sżc÷gÎöRŠŻéććŃŃkąŢ§« k(5×88qŻâ 5ä¶u5˝’ňő&ë$×e\ĚâÉÉÉ)w7aUúgÍđć ďGĺGkók1VŇë[2—©k  ·ţ|c9ŔjśRZ\s‡kôBôoOŔ|űs^IѦç•čźYKľ™:ç‹'eĚtťăYű¶Q«“ZÄ/ŰlşĽ˘°ëş®ëúîQ؇7Gă'€őJn¸?;›`@ý.MvŰ›–DóÁáHjQ®ÖďI Fé'Ą¦GsrT2©ąúţ'€8“T]Őj“ą†9ëGĆă30ÇĆçÇá„©ŘÜg|§ Č”™št$gH™ ĽĐÓĺŕčrĘĐTĄi€éő‘”o!śńűó+IU?ΰűůNŹ˙? ěţ ÄJ>ľ·Ś/4DZܮ(•`Éč8Ô20Ë;’jŻYßÝé7RÂÚtţ ÄŐG߯,U`ő-·3“ü/żáý_juORáé|†ŐjµódM÷€¦±“±!ĺn0E`쇌DÄÂTf.Ć —~R”â Oţ3–ă.ŚćtE_9z•vT{ÓÔíî0ęĘžž¸ąűŮDł˝ÎĎb˛žÔő­ă·nÍĐw=ĐÄ{ ”n1,Qů˛{Gęř1u^ČŤăá7RšáŁIřH– 0)ye{ł@ŁşŁ#8ˇŞbĘąfłEµ*˘rľÉîü"?K™»Fݬ)}2Ďźf÷3PŚ,Imň;źâh_&ŢćU®ńů?r÷)cy›űkjyë8]Mšćó­€ä¶ąŃŇZVăČďDĄWv]×u]ß7 ÓÔi} /ĎŔ8Á¦3Q:¤Ąî˛Ţ:$m±Ľ~ÖďbÜĐh,üâ{‚¦*Ăř”j96ôˇśĆRďdqű0ž˙„¸&ůţ,@ŃläGv–PdWŁŇDgő{Ëí(ë v’IŤ„g ®ď€bV6Ó-ąÓXË2 6k ?¨Ź§HdEB@ګ˵ďęč·ď€ĐĽ#途ĐÔ+é\čFĚXȋٛ“%5Ůo˙\t>K!-‹U=‰Ż@ŃܦTăeʲrdú;W©î1 “ř¦ `„ŤĎZ´O Ďć´•/rÂfGĘŇ0|Áă ÄrçgXýORWĹ› Vµ4÷ŮŹÁşŰŹÎ[%žTčéĘÜ >(7­Ý8Ć—2NM]ý^a·Î ›öMľWńł+ťąóböŃiŞ?śC!čQÉwK@Rä¬7ý㢠Ŕ,,lµĄ!ă_{ň8’\¨zżBXł´uçP‰µĎšZ G ľű 0í?ał ©˙6?,0»>ł­óŕc˝Ęş"éă[ą»,°á”źŹćü8˛éŠÂ®ëş®ë;GaRu Oż:“UÝ|&y €”—PWšHiĄgěW ÷Žż¬ĺ[yFRv(7r~†!§SVÍ-ĐÉ—7©źq‚˛…Gšáň)Łő*źŢň.4©W\ó¦30t/@ĂO@Uݦ~r\Î6!RĎŕÁ÷CSN+áHΦ$ŇähbY’’fͲ&˝˛9ËFRĎłµ1Ëc ź1•ĽŢ×–4Ł7śľz†š¶şÓ›ż˛5 ŘHOIą0źţ‰»/ËOä oOJLqđ$¦!{íĚĎPnH4PŞ2H…ĐĹŮUŇ-ąK—SĂSwYKn•AĹ‚»)ýJYó@(ă¤ŮVB"B Ö2~)4«]čŃ51<Ĺ /vBŽĂËWR>ťy'űg „<íÖZ‘„M^IY,–ۡt  –źwĚ.…i™ o˝ ;GdÖÍněŘšÔÂiťa9’Ţ®ŽÜ¬bźËv LÇ@%=ć&?…Ć5Ţ ‘/ŽO!ăŐ7ţí˝ŁÝPí€Óë/@ÓŢÓjTJQžňÄ3%štţÄ6~ű۵?u™R úí ÷eŃÔ` ©ě~žI®a›6Ö-pzü'ĐěŢ‘ś°ĹI épEa×u]×őťŁ0űÓlQĎźňséď•Ŕ)&eŠdMÖ™ä7EŻÔ=łzVŢHŤÇ4'`ę{G@JV57äiň’„CäÍH;áĄ'yúfuš4>,öpmŘ0ŐůŮŰĽT//Ž2Ěź%ħĆ&ýŮâ’ĘĽ˝ŁNC[ňŤ.P»źŢť0šŇčS¦…\ ťďĎ)ëęě{ľžęëű?űî­”qŰ«•ü!d7-˛öm¨vĺoÎČX¦~Ę:źt"Ŕ*˙íó¬nÇśĚ5/2­L+ÄÖ1ťéÎBŹw€—+ÜשźW¶ď=¨é'LŽe–9RL„¤ĘÂWîľ”_ˇu«űĘţţ¤Ć†Ě–ł&4¤F5QěóSĹé„MMn_Á˛ĘöC~ň˘N YÝů]!d¤ł\5+g˝1…]Ô«ŰĚoZRËč‡Kfl©/+-YI¶–BaÚ´(Ä0_€y’îOÜ Iaמ¨ćŮńtEa×u]×őťŁ°Qů«0B±fĺj o@­ŮSYăŰg Ľý )Ą[—×/ŔęţGpĄ•śe R‘„ gµL7™»±Tő÷.a"˝šĺ-źńő|~ö­YÉ*6$Ąľ:lÔâc źšB.Ýgú{Ă_š`Ş5rJőuźźH^0k<¶$¬‹ď!¦5SŽŐśőč1晚RĄĆÓPÖ÷"E€ń˘i˘Ł:`´ąmV±jX$ťţe5Kť„ŚfRď‘X ‹SŤ̾çë*kň[X¶8ť50wJîĎçJđUWP›´ü§v$†Gr kž1MC–÷ĆŢ2ňËŤ0ćĹY4ŮGrŰ€†„/ÎŮiŠ>˙M˝Ć}¦ÂÔś2VŔĄ;‘z×ŰűźÓţŮßÖ7Úˇ~ďXĚ´]Í©s† MA6úÝ"7B´T2µůoí÷€1¶–Ľ–Ż‚ů+Ć7 ’«Dl`9ۇü1YKl˝ř¬]H˝čóiĘw?;† ÖM9UŐdŚcI=0׹5˘?ż«‡Ćă)FÎ Ă’cGj_Ő7FUG {~Ú÷›ĚëŤgu/‡_€ţđ ´·Ć3“uËą‹ŕŠÂ®ëş®ë{FaÚÁ˘çÂ_ĂŢ‘f1q,ďXn”©“ô }Z± !’úĄç*OŽŚSS,zžĺ~ę/¤ěˇ˛üčX)ůÂZ0)Ş´Ë(IjˇĆš-ťµ"u2jŢařEŮę‹F˘”_–sPu&Ă\Â>Rä+żé (Ö·ü!'Ëx¨2óV†ÇDašl^¦\-ąc±Ęě‹!ŢŘ]HíJůŕúĚ>LaÁNţĎfĺÇ+őżińľk)ąĄĆR‡€˛ó-qDÇ}6çiU-nE3K·iô×Q˙`RáŔ¤4ŽŘäD*Ąć ˇXĽRä”ArąR˙§SFsań čŠčë!M{ÍmRć4á1wÓüĹ1űÄ}…Í•kţü Ôď˝Çwɬb˙ ,üţüÖ,妉îîÔŤú@+MÉłÍî ±‡šÓĹÎQ†µÁ w( oXôĎ3Ułö{ĆfĐÖĹ}â­פ)gبO^wÔĘymÍßì$=P†P¬kR†đ,ÝJ"{B©†5PKŐxÚç %OĄˇ­(Ö+ŐčŘS2Ć ܬňç+T@ąÉŤkň]\QŘu]×u}ß\ب¶ŇU‹eÎw(í@š¦yzćéĆąK[誥6–ţhPž”}µsjFf‰ř-I+l¸i”óń@y÷`^K©ĎĹ7™~Ěţőâw_Â3péŢ€ŐÝG`2Z4~Í‚|đzýŢÁ'ਾĄbň×T’mho[©‰Ož~镤~_cs.“'ŤŔáĺ3Đ6wŽŚć1«ś—nÓéHUT–ŔĐĺż×ěO|–˛Ű†×Aęíń¦×w-ΙGß$nB"»`ViĐ“ćŞĆaŮ»SZ\Ě?żÜ˙ŚOÜś_ś?2ŤŹP›\„çőâ‘űţőŢç SŇoVŔ¬î…ŕňö h)Ę©!48+=Š9ŤĐ4üÉŔňţôŔ˘;_Śa2řÓĆtz(Ä{Ć+ »®ëş®ď…•ęš`”âvvŕE7¤Ž˘r÷oółcłíÇúWgŁ´ńĹő+7UOÂzf.ÔdÓý@}$–n® ~͡.¤ řZ<ŃBoUhvFt‡_Iib6s\´ÝLb Ę›jťý{]©aĹ2UŇTÝÔí±şĎ€CxéÔ“Z|4«šăŮy´n즾#eĂŻw?‘š®OO_ÍÝOäÖbÍV”ÝzY\q4sFyKćőîí€îňäh«h•gPĂëgß÷äXśű'á¤ćVŤs‹i˙€I|ÖQ:rőéśěśs´Ý2*űô§_F¸Ě|©J5c¦ÓWH b)ťňÜ™E¦uÎĎżĂŢ~]äŘ€ÖŕQ @íëRă·ą/ )«wꍔôoîZµXZÖLͤ{¸j×xâńęĎ$âÓrkĎęÝQĂů(ĺÓ}!Í[uůË•:ś"ÂÂĄ ©ş˛Ő¸q“fŃ`Fg˛ćŕ'Řdü˘łm wµ?©Sµşű —ß3űaĺ-U瓲gÍ{#Ć@n™ljÉŇłš} ‹Ĺ0ôP7›ĚüJÂ(ělnëNť3ĽvĄćYşŞvĽ˘°ëş®ëúÎQ튚P,’9ĹÎĚ|ËšşG’·K)šaˇŚő 0ögRC(o€BÉëĂLšŕWJÜżsě ýN\«-·eç+Q`—ąµM#I3-ý›v¸‹mý^Ë„&ý€X’Ň÷aS¨PíÚü|.FIż¦ľŞ $•ýbtŹ$E~łţ©MOžÇ0“ʤ&W&zŻFBőNŽ#0^tnWŔ$\¶hŤÄ2•ňtIg¦/¤.¨"dE›8…vŽąRźvÖ¬+*îî|? v&GgÍRňŞşjFROřlóßÂ1Ëk—ŞNzĂ·e×cE@ÚĄ•˛ Íš~tLZ-ž”/ŇOš¦!cÔ˘ŘaÚü‘Ë›Ź¸‰PgÉ€řŮ^KćRníh nh.çń¦tßyqżŤ@\ÝĺKĄVŠbé"ý̨qU}R˘Iɨt\ˇ<ĺĐĆR?©NĚOjŤ€b>50Í`âHžlćëb©*ĹŤc[kś,S`Ë‹¸ëV˙•äöŐkÍ퓟˝ßť™óW|«\"šČë3řµť}FúȧĽ_<»\×u]×u}Ď( GIeµhő,ú 0Ż€ţôÔ· >b"uMÚtCߣe „y—âźqVGžşvŽvkuąÚĘRBŔ ŽéŮw°96‹×_$ ){~ŃWhm+–I»ń'vCd–¦Ôä#”.¬A¤dŃŚtŚ.łÉfnW'8ľÇă?€›í˙ guů|†ýݤ‰ç0ĽŐć0*L;Ţ”A†Í×¶şY\Ő‚+5VďAó#0óâ܇ňE:)§•¤.DsSaÚâŮ›†q (šĹsľFµ+«SZlť Â÷߀°şwvÉş 5mě„—·ľĂ§ĚO]ő1ămöŇ‹/gUşAÔQ$L'E»š.ă »GG¸eۧiꩦĂ?€°ľ#ą-OďbzsĚ؉Ǒ6íöŽ”Îf>Ár ăPĎóSäŽČÂ’~5CϨ„E@Ęz›3†R[‚\“Rüźö@Üľ†nđg ĺ凯@¬—Rxgí<¬^­@ŐŢçý7 ’ďŘ»ŇWęYę(¦µ|-HMźJ9XĹXíŞi€yĐ=\‘Ô|óá ©;]Ú€ĄÄМ΋G›™['^ř‹ruoLÖu»ŠňÚ`t]×u]ß= Óô‡¬ ź”ş)W˝uhŻ€á"őĽ´6łvĄ…˛ß •: Ľýl.oŔpŮ“2ŕ‡ÓW XÓO Śű/@îL_·`‹ Ym‹82SŮôyŹ•WáôÍ÷dxq¤`ڎBů‰ÔA9Y͢ń€ m~dcĎÂŮ@u•Ű÷¤9µáů[ĄĽßÜăái:9źIů·łáŮ»W€ąĆSjm^™Ź-9űĘ|ŢBVę Ç=«•ă&Óv…Ov›łö]úŁ`“ćěÖyÚ÷@ą{6ß´6UÍ^gĺýŢ’´xq©RGęŞ`zű Tj˙TŻ’Ţ[ĚŽÝÄünŽĂĐ*?ÖŇeČ„–ś3卣3ë˘× ‰Ťť*ĄYči@»Z¬´:ÓQN¤!¬ą˙ęß–Cwűł–€âĽBĽ÷g2¬ëkbő lđ|Ea×u]×ő=Ł0í®â/L'%m}ĆÓ#ĐŢ|&5?®[ nŢ“šc¦á«?Ëw&}™ünҝ͖˛5ř“˙2ŁRÉSJ>/o›ě¦B 4A9ńÇĽĂHۢ¬w˝Z€˘ŹŔt~şaęUNCŁ?8—!Ą’^Ă ^âP–1sjĘ0Óĺ駦¦Š’öçĐí&Oľ’Ž˙Ť”Ź>·kRúx ďЬť1‡ "sZGA}éRśÎŔöḜ@ąű™Ôľnîxën–z[ąBŻsOJ=»L3i†ŞtĎ{RŤadË\_eÔV,vűA¬(¤śŰ¸J:Eý@ň ?.bßrâ…RCY Bk,/`ń_Ă(7÷@˙ňw T7~?$‡¦îIű¤\;Űš{¤xzó=żR3f?UŘ:3UĽjB{ë÷đt逸©^-Ůš`6÷~žgKËŇ|Ľ†0“TűĹĽčWíłű2y Äýĺ㡢r\?ázLeÉË3ß“’B4µW?|0ŹAORĎI·Ą.ÓÓĎąSIů‡§_¦ň=),¦v±ŐóýůTr5šő7řuOw‘čëäń^ľĽůŮ*ŔĐ‹§ýřjGrÝZ>Íő[üş®ëşľc¤şŞł×}ő» âJůĎ@¨7äDSąt˙ó Ąˇ>bś§Ď#øZÓčE=(VŞ·Ň™,9Cô”#<^™ç17HšľŻ,€~耦YíćÎy«îüFN@¸ě6÷˙„záo %W[óTŔáń@»ţĚâpő±7Ç´žöŻ(캮뺾s¦/Ăáő™”7$)H˝ąúîÔúŽ$§Î劚ń.–söč…řĚÍ#0©­z‘5ŻGá‚-0^ÎľMÖűůđśźŇĄ7Ńn/ŔÜ-ŇÓ7›Ě/hďR,9oŢRĚÄg[gÇŚçš'R|“đWęÔÉŠžk`8˝ę‡€¨›aŞť(őH»TúÓ0ő<‰yĚÉ–č?žRýçćŚk|Ç“7PŚ%ÍŻď©ĘŐĐKÍW–@·V>}÷–—Í‚ çŕ ÖL0_Żi2(©ő÷™ŇçSŠÔ,57 ůŕÄÔŘ…’ŐŐiL“¸žś&4ןŔz§l*:ě˛ÉĽ­§5<Š?]4Nʸ˙ЬÉ€Á“^9u˙ě(›|]ôţĎßÄS7őö#©…ÝŔń(vw¤ÜwK˛3Ĺn06M*E±QCOĘM•˛ß”SšZÚż:â->ĹÚ?MRFá áâż1X"˸ŔéÓE÷°ţëĹźź’Vë „mN6…šŇÇÔ"jö–¬b“Ęőđ˙úóW˙eB‘ÍÝ_€QŞ7ˤyâíÜ )ćŐ±ôúRŰ)˙VĎaˇÓĽ˘°ëş®ëú®QXq*}K¤ťí’•&Á¸†(´o,ňż”٤ÄtŰ1”ź=*‘BĆEíüÚßÖľ ÉS©çgűAuęi:SmËË’Í•ÁtyúÔíÖźóő<ĎpĘŰ÷d%—˙íŔńć0źĹťÉă–ܧÓ+É/©˝=ő ŕ|ľ«›wŔx>’f‚«í­#µbś€Ëé ´w·Ŕ,^ D`PţÚ|b}ëřÔ2!,éôčg,*Źa\Ľ+#(üĎ*°Ds9ěD-®`ÎŰ‘S1UźsDĂŞt–Jč5±9…ßsźĎˇĄwŤŮwa™˛˘ć4P’Ęi|ó#4ýşćSç=W÷$Ç«¦Ŕb=,őA“Ů(Ĺ" áwW¸'%CâSŻ»%˛ ÎšÓ Ě@Tąr]ëĘ·Ąh•+ ´'´ć"瑊Łöˇ]‘’ăĺśU[ŹÝŐsn‡”—c|ý§Ł*iÜ„…“kĄ#ą;šÍ=đöúÄRÚ±ÚďŰbµó»ÔŤ˛“ę˘ ÝčŮĄôjIüŁîá»…nn”§Ň’Ľr­TMűž4ůú3ĐŹâłrżŞĽŐŁžŘĘ’ä…(vŤß]vĹ« K«¸ŕ@r_ÝŃ?őWv]×u]ß5 S.¸ąĄ™úçĐżőę`ŢH™G– N~vťĆW Pޏv$Ą×ßţŚÇýe Í/„Úâ§?†b1“Ňwyóîg<Ń_ßýR·[Đé0źzß‹Lż#U‘ †ESá ~@)ˇRC˛%UÜ|Fe~o"w^IęŮ–fZZđ¶ ‹ł'Ô6:-˝3.26¤$Z‹ËČ(Ď4\zK˝ôĘÎoOŔFÉkbŞĆ9µĂ/˙ T»w‹XźTË+`čz’şg˝ŰC‘fZ,çbRfóA]ß[5ĹNu̬ś‡Jůôy˙ęťK`ě:@5ˇI<^:~4ćËdf9‚:ëř¬/J¬čz›bXhŽRQiĘlą¦e ĺÓö—ç­*ő–Ëż©¶ÓŐÔŕ9]ţ€CYhCY ®6Žťm"<.@őmŻ ěVägŽţŕŘ3•ŽË)TŤ +@ ÜDTu™ďdKΆ~íř´X \gCŤv ‹OF¶~L1ż3ÚÝŰ?-P(-ąŞsŐó(Ű {{"MöS§Ä󸜿9“Unţ̗ߊUf3ĺVŽ' tWHaşĘvăOą/Wv]×u]ß3 “—ťY{cô‡_Ĺ4ë÷¤ýb÷'<©B3Ű˝oI‰T!ŐőCĄNďŻ$ÇúfL‡rŰł|‹‹ćÄ"Kećrx;TëĚÓÍ$í0ń¶ŕn–ÉMJŚTwÎ^”Tyëü†Čž2ý[Ą\LęŃ‘>ţHRĄOc·ŕ\Îx_¤P ‚r¸FąĆZ˙Wz…°ŔMzweűŢŮŔş¬|ç·ÝIH­ŞćîG`č.@˙ö«ăJ!ŁQĚćđl?ţËŹ.smbč„-@s´&O,óv:ún_ŞmPIgR~UŇ‹­ą8‚)‰”»Ż4Í•Â2ôĂôî‹ OyôLW鿌áĘA­©s~ˇIśD ÂeÚJ`Ö:Ć™OG\MfçGG^:żŁĂîíŘ~řłc±ń<űc ś_ż»Ź%Ą­™ ŻŤ@8 ­3îëŢ€)–@˝ýw€ppÄŞěë¦.2ű`ěŚyßîÝ›ÚýáŐyOk<Ôž^ĺöC1›Ç×_€›‡źËů Í;ÜienŘ\ćčZâ«Ĺą™ťÔxµH|•ĘORÓQZ×÷ä“’ěK`®ňü}>^€ ‡˘Ş:ó­s÷Jr&Äj D5f…śöj˝ńł7,úäÇ´Ô¶ †ś lZ­ţOăóŹ!Ya˘3ż“fyŐ; 7@¨+R"‹0fńó“ČĺŞ"ĂJýĹ Ăh?Ł3yCŞŕ ôÚ›Śwäw®sč<żú]WXÓ¸0^…7Š­oţđucź}ůĘ›ŚŁ –<>ÔęĘ”Šłö'Ăpşz$Żëş®ë{GarK1/G’öá±»8r'eđ͆ÇéIuĘĎđć\řËĄµQęĂôÄć=0 O¤YrІ5®Î4g·ţÄ"MóÎ?;ÂĹíöĐ+EY,Ę}]ËúęüšXŕńń  Ç’jóÉżBŻvńw@Đ4“† Ш_J®;Ö¨)€˛ČŤë–îg9ťŐőéY!f,ŻT ÓQĘ5Ůl˘‘ް'§ž¬ýŻ(캮뺾gVÔ`<˝Áz¤oŔT6ňŮŰäHş!í kß0ü›wp„bŤ{úŽ‚XŔ4kâ ť·´0bÖz`Ü˙7?9› g–úZĘ%5)ĺâĹźś5/“ţŢŽ©ÔoĎ~7©c¤·2ŽO?)çýńŰ; TwŔxŢ“TiSŰA8Bţ8ĺŽ+[J“ÇqúBśČjŰžłŰľ^µdߢ YHS~±ę¸5¤ŮeN$y†ü_55^ßáóJíNŰŹ`i"ÖÔ ‡łr;Ę}a§uBš9N!Ł<ő!Ą\ÓΡcj„Ě­TˇXşr*Ů8Ş9|öółU>Šş ”a=íäWÓ˝´kI3čqňN=§Ś¤t]”GŞlOµInŢ9Ň/¦|ŢB™;´ÍWXµ¤ÎóZ k¨ŚŔxú –Ź2qó.cpů@ć7`·xއr5V|rµ0âIŞj2Ť+R%U9ęăŠăšXjq¶WďČf˛b-…Íc r‰NąďUŮłóŇÝ) >zu_m)@/~]„"ÇóŐK* 0Xľ‹rbëĚ… ůsÍźłX¬ĹUŮ!oż…Ü&6©,󉹳Żęüëş®ëúŢQ=Oj7őĐŕ߲–ÉŞî‘ú !w)Ú”Jě’x´±bý‹7€Kç Ä:Z>ţ¸űŃ÷=í–ˇT/ôŢźđĹnHŤRÖwŔ(çZ]tJÝĘ ÚĺĚXfď›f|r™~:HŤ} é§«ŐÖŹÖŇ/ĎĎλiÖŁÔ3)ţµ3Ä9禅ćqÂł'H˝~ädqkB\}ČüťÎ¤ŘëÜZlłâČB\źfűŁN+ž% $»Č“÷pG€âž” kĽ[ĚMćDksš…VŚťł’!ä)•ŇÓĘÍťă‚eZ*’N} Mľ ‹í*”–őFš3Ë-{ŻŢÉś@-“j¦ŤEŤ$…Z‘Ŕ•ź%kQŇ]4Ź@”“dę# ýج?C‘•_ǶÎý™RÜňÚj?ĂETŽî7`.6őĘQ^ŇZΑiň«ó©¤âA3Ö(¬‡)#Ů””ŻIëďËÔ•?D˝– ‹Ű‹”°ĆN߀°ľő{X*y¤›§6?83nO ˛8P­ZVÉţÖÁ~cąř’ÉźŠĺ_×ŔÔ˙FŇŠśë…vă‚˝Ť»?<ňŚőŠÂ®ëş®ë{Fa’ňZ§ľ@ë µ¬¨ňt©\}ĘۉEIE V-P¬€9 <±š@aÜ„FűjtħG}‘†˘!O‚NBa¶ÍĚ@4´¨´ŘÔ=ÓMY{Âb^©ť*j6Żĺ˘ÇP~˝ö!ď“]çś×Ô˝±}ôŻż’zł5a´Ü«rłus9że-u’Z‹F \˙Lj–NNÔ".ě0žŐ||ŻS‹LwÎ}éÖŁW·Žuä]wšöiÂ[6ňŔ~&s/Jwńë®´{C¶ßN•/’˘8”XfÔłđÁ™â?\ČšŻPĚúWď¬ĚkÉM1¨cˇu¬N Đć9f˛D”$]ŘĐk—ný}‰e3ŮśAlăWVťÍ¦çż4 sć űq ÍmĹĆŠëLý†Ń‘‹ÂŐ§©ó)ýťqµEŚýÍÎ9Ë3™<[frĺ¸ŘbueO{RiŘm=%?Ŕ˛Í»ôĎf±ŕ-q/´@05e„ ´‰ĘYą”TĽ×ą»KÇ`ý ÝÉcŃÔ ¤Śß–iaSiÝ'úÉÎŃşńe¦§Ëš;¦ĘŹyćäü¦T‡áꑼ®ëş®ď…šmiRPT‹ď]5ľ9[4ŹßHSĹXţ Î_€BéR Î$G˝Ţ9°ü1:3 ęg{Âó˛ú@V˘ë€Hâ´)ç‚M&ŇĎť‰¶c[VŚă‹cÓďč·XvBỨˇ3ůéµĂT 0ʉ&§)UýxL§®W6ޤ"©Ć‚µŽ$uu\Ý9čM…‹,ü(¦ÎďşČ*­°ű@Îţ—˘­ôßR)?c<;öśĐ»Ř¤—gz}Ću „ŰxJǬnˇČĂ$öZř=uWŹcÄŽ26…Ôrą^Mh´ŮjB×çý/@U­ňć`<=ĺ3 ŚÖîđä^–÷Ŕ"{ľ(€˛Ţ:ëgš¬pYÜ޶ŃńE°Lwa«7 ÖŔÔĺ$8i!…ăşó+°˝˙ 0püĂ+‹Ł ‹Ś°¨Ł5·cµ`s7XŻ.…ş!ś•źÉtĚy­{ ”j„řćĎ1B1&éÍ–¤…4%šî«1禚“¤,€é çCćU,¦ŢďśÂÔ™{R“Ůşş·'`ýđg`"•ü9óNßH®RË«÷™é>鞀˘ÜExČ(^©'›÷Ŕáó˙4›źŔ<•©ŐaJyc5wľ~‹_×u]×wŚÂ,q·¦ýŢůKk˛o>%4ÜýŰ#P^ ÉšöM^”1ëą˝b#_d•÷aźé•”Ći|ŠyÇZ`:Č;™¬ÝZŠaő™wŻp†…ŞĚ»jÚÓ”ń`yí9]Ó”č—W (u ”µ6L‘Ôí\vJőČyUs™ł™Rň=@?ź€ íN1ăP“˛«)o¦óŮń`y˙‰Ô†iކ˛úľĘwúĂg ®vŔ8‹éŚťÁY»Źq%[`ę?“šăîĎ@h*żF8Ű4ąëşĽP–5°jßs<űN›:ź0źť5 q¬wúó7Ň,FÉhšyíŁrâŐ )w_űˇő$Šń©W«vęqQţAá8ËÎíŞSrĎ‹ü)ńSEĽÉgz¦á(šLÇ' ¶äP§Îż’”t©ť3c)MK¨&Ä7yßAge?toŕţ~źŇ98ó’¤ij<¬Ŕ˝"YW%§Aâpó Y+Őtđ˝:!î‘Ô}­”íá“ú·o>8Š´¦Ký×ó»EĘůa çs…ľS›„J4Ł?%¤`ŕ˙›‘آĂÖŔ|ţ§ż˛î›SB@g \ÝĎ_ţwŕfsKĘĎ’RĚśÂúíqŃ+FFµv~†h×Ćá9źCiB Ä"Ă0:v.ĂÂq,G ĐťőjY›&–j8ťüÎW+ű|zôďŠĐĘE üľqŞŰJŮyUX9ŹÄ— ‹)ĹwČ­ Wv]×u]ß3 3gÎĎĎŇIIç…5ШHz– 0ߪ›ü *NDOĹBĺf„ V$}‡%‚j·Ašă‰ÔÝŔöág ;Ęż™Őđ±É}–M®¤3e˙ÇŤ3,ĆŻI뤽q} Lę¸ÔÔµl€ţřćB]u“ąΑéYýw<ÚÜĄÜy¶‡+W wE­ă¦7'ëŃôŽä›B)«śŘ5ŹjČ-ÁŮ íśĘíÔ¤e-4ŤďTʀ׹7W·¤$řéń(·ď@mŢeţ%lč#ă”bZ ë97…Ő/R{+{ «ÉşŢ·óţhď¦!OŻ,wW))ęßÜhĆ˝¨îĂëg`˝»s ˘>j{u)(›Áöí.ăGˇćúŢ9ÁYGk)]kgc•"oß žW2µŞ#ÍgĄ•KQ[ç·Ż@»}źÁâĽČ¦#éĹ,Ďşłâ_CÎqžzó)żÓ0“u/’Q’9d4ď¸zOň䎝¸×č/g ąyç×njhýŃÄSIjÓI¬™z¶Z >­m5ë;,Z09O‹/Ż· ëŮ·Á˘´ČOQ„2’Ň GeŤ´ąq"­xEa×u]×őťŁ0!¬ňć#©qš˛CŠZÚú"A6汊ćŢ<÷ÍúčO{rZ|ή0v&Č)íÉ*łTcVî@łú‘Ô”3Óç;Ú©„ŕ2÷aYF›|bý09ĹIG«ŁäIÉDĘeËÖż…8J;ůt:A]Ü6ÂÉ{BČ1)Çb\L©Ě—_8ţ˛|Óť/™»Ůşběý·!¦T†]FÇjôŃîŞQiÄEËĚ“żßŘV@÷í`űĂ˙ęÖdFĘ#ÓÎ+©-ŮöI;Łcr/_Ä€ňf Ě—=I'î)Ôďť=™XC§ąą˙)óžĘűU|­ÔÜgHIRcŚs ”ó lî?('ca4±~LKô×yV¶Ä—Ńź ’OvĘőĐťťĹbŮbfý&€Réf6őÓ•ířkös^7mľŁX8ćĹ;ÝAŔŘż±şu6Ťnv]Ć|źLŮ„â]îř°gŽy1«ťŞ|ŁUŮ·(¶÷ňř?°ů™¤ÎŹutÝhŞśaŻN űěŚRŢ9]Ý˙˝ęÜPkÄpüŰ; †ťźű_iúÚÖ9ß~,âňM»¸gňŮËJÂ뺮뺮ď…Y?`1-ö‚ Ă čöŻ@łľ†ĂßBşŰ¶öťĘöUMM ťY•yá\·ďě‘‚ń,Óëâ yČřâö ô_Ő®¨×—›O?ź3]Ç®j±BUAjÁ›•ĹÚ®I™ Ň|Ų¦F:ńg`.Zţ· ©x«şq^/µă,9ĹLs4QŤ;Ňg‘Ű•SŇŇŻÎ}l육Ń"ȘuVęH^H˝Öaűŕ\R1VŽ|-_ĽÝ8Ę®¶ź€‘¬é7Si}‡źÍ˙P8Oa,^‘;‡×P¬×@Xĺąđ¬YR<t“ż‹ůęg ¨vx&ppĐśÍCWv]×u]ß9 +ĚĄřěĚÔ(¦ă2UŁýđ ”럀â4Ĺ*§niOľ\ę­éňâü”Ň KűśqČ•ĆZO¶JÚ4)ăţ3oośż°Ă­łŚî ő ®AŻ”Lź)FóKŘfD)ĺwP~3‹e’ý Äí=@Ő8VLY™­\Mߤť o¦0Ú੡}žN$}“öŢîíh·Î?Z¶Şy$Cćż‚ö·Ć÷|9Ăî=)W6đ{á J«eińçn¦EÇ_,WÇłďxćs|ř@Ęő•žsT÷ÁŮÉ“z l>5j_^¤~Ú«űż‡ç_IŠ$agçxúBňrBÎ/ޤQZ…ĚʸÎéPtJ5´żř_öÉQÁ6všnO=I ĆëR˘ÜŇ[—ý+ô)ĐüQ(ľĘY]vcÖĺézJb qŹ‹3©Yąü «|Źé*oV¤\ŠţůW`.uçË)\;Ţ× ×ÎCwByŚăŻÎ4éďçiŃu ¶í¸#ĄĽ)‰$ډ۳<ˇ±*eĄyő0ę~W3†0TôçŹXÝăňuG2)«ŢŁ=P°ń«¦{Ř&ţă[~öş~‹_×u]×÷ŚÂ¬ĹwEJ§j —.}ůbB ÚóĹ óÇËfLJ›±Éxôoĺ”CżŰ´Ŕ4żĹ ÇâMŢ(ĹI­[L@TŇc©¬ô)ˇô˛n×€îxÚ­ň VC)ńJHJ)©äÄ‹eÖ«ij.Ů©gIäćaË>›ŞĹ–:˙•—q˝&©Ť'ńă X}ü/ÎŕXb„őľD°Y’p–ÚŚu« ° ţ~˙¨¶śů*š;`>|Bů(Š >٬7`™Ă×߀°y é¶Ë»-0wąßp<ö@wř ¬ü€úäÇ©3?wRľ‚remVřÜzŘýé´ u{ßKCP×wíVhk”3A !O˝Í'°8űĘ#-tďÉťZddš ¤K’f0šÇp‘@w>etVJńż†˝O€ćřâ(mzn˝ßó‚ťÔś4’S.˛óW`´ŽHő-ÝćűÇ2WWxĽňăĄVďĺOhť«MrµŐâ·č9CftnTyČJ71Źahařá=@÷ Ő(ĂLR)X&ňé¨7x¦Ëâ Ř']ç\Ď Í^ż€Íôő6Ď@hďńŽŃP˛ř@Ny«ţŔĘéyKgűŠÂ®ëş®ë{FaĆÔhĎź{Pa¶Ď}NéQÝ˙ĹŠÔOgŞ"éY”fˇü©˘†ů(´3t%ąe˛ň-X»öŔÔé-Ąµ20·¤öMôR.Őč›M±`R¦Ëč/oŔęćG Ł?çĎĘ´°üźt tł†”8&–MOÚ¶j ł'5?[bÔ"Á¸MĐ,ťBÜ“ŇčĺJű ´ć…(€i˙«3Mâ2†Ó3)Ýiٱň9âď)¸Dßť/Ŕ(Îńô ¨-ńrďÇźşµ' PóŔî'R÷¸]iÁ…ť§Ś’ęí 0~űTîÁćĹ6Ď ´6ŁßŔô\R®©ź¦P–’V;€>O•&ôťZšgBSćú˛×}ÁiĘź0ŞÍ[ť•ybnŤÜV$Y:ł™bD[˙űţřO ·™Y[LŤKµ„˛1Łuĺ늍5ÍŁŇ_¦ŚçěÄPź¦]µËÉqJ~ö1¦sôç=P+Ź÷ř”»O@›iٶµs‘şÖvśş‡­]\Ǣ#ěý>1:®±˙ Dµgëř‡Ü‹*l%ś;ĚPEő{®‹™łBěXµÁťłM>Ď6·-<Łţ¤nÍiOJ‡¶,űľ(źÝý…]×u]×wŽÂÄ5 Ço@lî3CaOąň÷5ţý7©on–Fi"©´F=KÇü„¬gěb¬ťÝĐ Bą`)ÎRZžg`¦¦Ó ¶Y#\Ł–Ą/ĚcMJżÔkjvSo¶¸§X´­ęʢ2«7Ŕ|>´[~ß—3Íů›>1Yo‹TL+$>ŔRüÇ!U--÷-UBęL–hoübX(|µ!<Â_ďŮR.Ĺ1ÝĹ€jsĚ%n3ű ů¦Zg¬ËçěďnŇŽ­…ą ˛ŰTnVˇěvw tj{îÓ†«Ö…Ó›# Ą «"„.ďaźsâ‚^1#ÖďŤŐŹ€Ĕޠ ľű5sľă‘”lAUSwÎŰ-prVw©ť[yúěĚä,ÖhŢLMHsĘk@“Á`ęźß‘Úé—şKËĹS+ĹřÇöIăé„ěô,r>ě>˛ş¦‹”z·~–¦NŘP= Źä”˝ĘďRÝQ)w·P¸fëf—ZsíGĘť?Ě‹4ÝI¬qůśŚ˝Ö«@I}¦ź—rď9®(캮뺾włIZžB9źýÄí{`Ú?óîSúAkî }t>hŰDt$–„ $?šĄłfGľĺ¸Ëef Őg ¬äÄĽs&nů­Ż‰›pBi·°¤¦źę’ Ő{ ÄÜ]dÖ/łâÍŽbLŤ-˝őÓ(M"0ČaW­!eZ‰Ź:Ro¦śtŇÖ%mô´`pz`*ÎjYµö·*ë¶•Đo@7ŽM4ĎM‰:?Ż™ßTǤnľčhk2 5rA3&ĎÝĆ‘©Q:ó"ŠE˘F˝Kó»‚̧¦=ýŽ4A6fm.ťç2îĆ€î ŚŇńÍąáwP!Áţ”ą$)¤BľÔ:®iWyŞfCjçĽ(ł4@iŢŚ¬žK˘ŔŮŮO›kÇ̉󚋅%•†äycÍ˙ź˝˙Ú’#Ił4ŃOE”s8HDfDfuö¬ž‹s1óţq §Ş»*#€83ŞLô\ě_D±ćp–ÉEu4p7SU3ٲ˙M˘3L ±ë^>ŠÁşOhNą,†-Ąö¸j—ž"a(ë^Đ˝Óô\(I¬îę.=-ňŠQçü)ł¬@ů=|žĎĂ+P¬¤íf•uĚ5Éą†ŮŐ<¤ţ3éIą%ĄÔé󮡵ÜW€+ä¶–ŽżNóŠÂ®ëş®ë{Fa¦-VDŻĽFUÎŞÜz˝ Ij`>fiľ¦M[<Šjć˝ĐOXI鑾ąü4“)¤'RrĽXÖĽ˘ĚŐuŢŁĚÓJh ŰćłâĆ“ŇXćMqĂ6Đűś7 ő–›ŞÄ J˙˘dńÂř5˝UýŻĎ@Ql;©>Ä!|NčFŞźáôq6ZŻŢç˙U^6±!ň–V‹-ͧg ôJˇ:¬V‰‹Uą­Ýţ[­éá5ńDBö-k7ű:*%:=YÝ.đ&yÖ:âŔ/˛˘GN‰űeÂÚęZŹÂrÍţŔ Ś2@*ĺwďÂ%L×LęâÜlv{„î.źżz/đ~NQ7 S—ĘZĐŮXÎ:±{~•›4Őo0éj¨;}ʶJWŘ®* 0XFKΕ·TyZćĹéGšţf—®möä4·ĚĐŮ”PłűóSâd•Ŕ5w§t¶Đ´z:˙‹47Wź®töŻż%Ű>5¦2{7éŤçGbóFtDÎÄd]Lş|8…ËNäŘJŐf–M ć|ÍÎż®ëş®ď… ŹřşĘ»Ň.ásb"ÖëŹŔĐgŢD*)Y˘ľ&ç7xkQ>ÓVŤł0Ť•¦*§ĹŢpy|ŠÍXŐjTBĆ(š%ˇ=żL(Cú©Ń’rŕ¶ĺZB€pÇ6áe •öęůň°ű‘¨ł]bµFµ»đĄŽ§3 ëü›Ĺf9&ŽŔKˇ®ůÝśŐ[ašixIĚZ˙üO ˝űGf¬jđzJ%j….CV5Ę<šŰżç˝k‘hF5-žňVŢ@éŞk ś^Ó}\fźFçMÂYšL…p$úLcäzNŽ“[Ş"©ĂĚݦ÷Ž 1j(Äő”Ŕ8Ę#Q-0Żfmz˝¦ĎӞܴ$µ‘OĚ‹´x…1VyúfÚ˘6ëăş×ÇôĚTë¤F%ëqéI­ť‹ÖŃč‹ …ŮÜ“"ˇ­B}SGVŔ“x%)é.ÇG )ßîʬžça$Nc-3F¸oR6Ě.ź0„1Ç‘4fńÚ¦@śőűŐŰxᙦŔł]ŹçĎ€kĽťHŠ)%W 6¨2-Ňqé·z“NojŤŞşčĘI$š6ÎľMxěĘúŻéľOóţŠÂ®ëş®ë{Gaጽľ07€ëärËNŮnîř•čF´ýGű¶ËHÇ©Y§tŔtŢľşOg~ËZ”kNg_łęţéO@U@%×»vQéŞőä­3 S~ÎŢ˝^lćJˇsÍň› RwdáI ô.w ›Ú«˝#v Ç$íĎX¤żo9]N%3ő9sężuóčž^Őí`:ínšÂ¨…ĺ|Đ 4 Ţý•¨< ęgj¤ Ş-Wâ}Îé·—w7D•śܤ—ďµd·[)oJ5Ćd‘éć `Ľh*Tćż)ŹułgO˘Íř¤Ă^䯲hEr,8źÓ#X$ÓYÚ­ĎŻD¸iâ•@/Öą±\ŽB©|˝"ćL̆7éiúS–™ĺ:Řďݧ`ĘqSÓŇ4Ť‰Ź3žT˙Ŕ_Ňs%LgO8‹‰¤žaµ¸Ź0 áęŁÄW=Ő…r¸|BÁŚ>±H…RŐôéÓÖ§ć˘|Ž7él$‹ü¶®––˝ÜÜĂé đŇčĎ30ž÷@UŐ€wmú™âŻ}­)ęDRgb;·˛g‚‹ý¨„j‹&ńÔ–üeÜÖO])9jô]NŻór1 ż»0MĘäŽuĽ˘°ëş®ëúÎQXˇąE_ńěęüß‹ös– ŻÜ;ň¤rž>Ĺ­'j‚•ÜäÔí¬IĄÍStľ iŹŇÎiŤ‡á tç' Ů|&5*YßŔd Śy˝ţ0f ?¶0>?ĺć6aËĎ2^/ď˙ÎŘş)q=óB$–¤˝Ůłv~"öô(ŰŕtRn}CĚë÷_Ňć×tĘňP—;R6ĽPŚÇń™čOÚ™ŔŰ$îř‚°—ÇłJűí¤]´”Vë̡߮[RZËç”mÖYꀥ›iʶM»úy˙O`uóŔ·ÓĄb‘2fNŹ ŻE™®OlAPŻĄXHuü,/±<Ęăź.Ż™łÖnĺŁĺIY1__mß´d}Njź¦W ÜÜg6tŔ4húv“đ”ćąňcř:÷ůeshżěHÍ,mü_•޶Ë\¤+33uyÍXŇTQ_3h¬RçôąłŽ.9:.ů3ĐäźoS‘O –:s:Íć-Đ‹)6NV©3#ąc¬HŻÓXEő˘;\>ý;P5+°¶J1›Óä€Őć&ť¤X”ŔPd©©ń˘§bˇŕ7T®ţS_g<+®Ť2aáQm\ua×u]×őýŁ03e wŇ[+E«\Ą=P Meűžčv´Ý@;çî–” oţbEŇvkŕp8ŮƣrÁO@éę´KűőG ę' &`śŽ@łąËČ«8&îŕňôP)MÜşjF`VűŽř;ĄąÚ>•ÓĐçoúµN‹}Ě'Öf:˘SL)Kóĺ’öjÖ·iÇ C¬őjŤ7)“Ĺ9'‚KbR¦‡6&®ŮĄýÍžš0śŹńźš‹S’21âŚrFŐfĆA3GWÜî¦Ć—_żů˙ŽyŮä^čó“˘Qˇ/ŐîmşnćN=|Üć>1ŹJ•ľż\ŐÄyeězË©kľP-±+«uÂAÖ?°čš¶”%W˛HȰô.{ײcq€h|P^›=ŇĐß'gű< ¬wŔ¨§ETÝu]×u]×÷‰ÂĆÓ+Pk˙´=rĚÓ'bŰř›SXO\Eęą[ö–súU;žľrĄź*îŔćőÝŔťö@8ďR9PJkđP6 PĘ/¶ş%%(Y¬VÚűż¤s»3QŁ©QîߡÖ˘¬ÓźhĄ`‚pÚţîŕäzÓűšGŔ gÍyňőM‹¸©Ěµ…ĺŽb±iA™™ő1…ŞÝ­Iýb”Ád˝A3PČŰЬ€Ń®p %˝ôĐ4ŔŘťrS§˙VĘXąR˘¦.–vĽ&]á©{ĘÝű&ťZ/ /›`řüP©Ą±n‰©pb:¤;מ?ő1­¦Ď‰iÚnµśĺÜS†!÷ľńĐ)ovBééUBÇÂ,çç_€ćć§ÄNZ¶Šś¤ĺŇ‹IÉmąÁÂh9çK¸5âë5ť™VľO@OÚđú ÔoßdVη`SÂČîiJ›óÝ–®^ý´0e¦uRîľó@űćG`śzŔŻŢŁx=©ůĄ˛” ",|#:ě(9YTä"öşżfť¨Ş†ŘY©:ÄĚ•G`V?CłI§a´ÓáS:+ří 0ěźţň Tú´†°@¸Yá ďŤ%îëĆˡYmî…ˇSoÖ;bŞ Ĺ9ďI‰~\ó®뺮ë»çÂ4ĂňŇ+Wű`®ŞĚ.iҤ}LC*pŰ·›Ě(iźŃąW}Îţ&źÉ{őÜMŔtÚw»‚¨­U ůÔt$js&q>ĎFÝ"çëüô Đx ĘS­–i™9»5†·şŚ’Ź@7\?Ý'N*‚şŠ¨ćW[xőđ•éŠ'ˇ†ŞF5c+Ń̲à é}üLś@E.;ţĄ¶7ËĄx„AS‹öfyWĺ×SK€öv5‡›kuZ䔚ăpŃ,Mv,ÄvÎ2ýý W5ťf«X9\BŁcb^LeľŢáx‚]yíç焿,ÖĐëÝeëK'] kĚR×ÎÜőßK}Y©ß˘üRä Q{ĐVź¸'KC“ŢMhK“ÜşXšťˇs÷ Ě•ňr†°x:=Ďňf•_  € ¶jżÉ¸R÷Ô®¶¦Ď]âd‹…?$ö-mńůbź]ĄžY—OöŇD}Ůśx7Ó»50˝~&vDNĂLś꾌ö^2U ž1†óÂëB4Ő§=0^€ńôo~ÎřHłEaްŕ:żŃ÷“îÝl3ë‘Ř™´¨ Ťg/MşĺÍpý…]×u]×wŽÂtľ•ë]>8§Ľüé%íäĘ«tu„ýP pJß ńçLé»\N÷/îóÎfíŤ.1“úZ¬ĺĺBLRŐ*ä‚,ň·mL×Îé őŞ\qźö˘Ř·śÓÜŁÍűZL‡Ňî€U»#úřśĺť ['x„ó‘űaĆ6 ĺŽI5ŁýG»z°Ä+µäÉf‘Aý#)Őĺwˇś‰ţ||Ů“’ą¬ťHzĄcş&şŞÁ0ž8— đć.ÔŽ*fłKXĚ’¶äa~ş}OT Í–śńç4tëdě_7ŻľS׎:şŐN8_ľnóg9(şÄ’ز\Vq:ubľŚ+4Îč%ý|_K[ݍ/&Ŕ±]ZÂDĆVŇ=ąRąB÷ ‡¦=ApkW艪ń6˝S)Ë­!<„tß­ĺ«\Ą˙5ÚlôLj˝ggŠŽ/ŔÜnW+G„>)â"˝Ą}x`|ýT7`3MeÉła¬˝#fĎ[ĎCQCČ˝ šÎĹ"˝ąU¶]žŔŞÝ˝XđbşÎÍÍß׬ď ][s_,üąSč3ď)UÝćŽÔZŻWbĚű%1ą–˝QŢ%D¬„¸+ »®ëş®ďš łS«OčŁV‹o"ůňÔ}î×ÔĂ”wcű"._ÝÝóż'¬QŢ˙%±!6ý±&»/€żů(¦mfŠh7?“0uî˝$4a eˇĽŇ…¨óţ_@{w—÷Ű"ź·í>ćîBŰŰÉ;ĽŠIŮFRôX¶jĚý+XĂ ‹$#Ăžú÷M ź~Juk—ú˝Jýß%Qg~!Öáň¬n˙ś^żíť:´5uÄÔPÍUµËí8÷żE»%e]ś•d°J,‰7ĄuÎśŇ,Őú=›ěTkĆwęŐOź2škĄŚ©[HÉ›´ÇšłOŘY®:ˇµ” ‰wN|˘pźiâ|ĔÓčÄ.é˙V® ąµČ%ôާ.„"3¶Eör†ń™,Í»g jţ Ôú;J%[LHŤČŇ«Ä7  éŕČŢŔ±ËŽNń¤QCżx0ĹĐÍ9ĂŢ·Ű*ą<'€®Č=Xş_Î:ÄĺÄĄÔÚÄy>ç_9«m^Ý©ŇÇeý€)ţôéć?±“…9:”+óx  Ćr]}űű-±{tîËôË…]ąćň9ᯥ'őc–Y#!Üçů}!´Wv]×u]ß9 3ĺ}-ÝůšXTdÍĚĆbü„úLĚĚ Jž°N †°Ş·ŔPßĂĺw˘7¨—[˛jóy=óęQʨ|XłŘ±ŐCÚ‹»˙¤…Qůt|а†ző^żíĹšĘyµ:“YąeÓ’í®Ę{š€B©g%vݧßkťá†ĽfâÄ6î ‹ŚSˇZmŠóđő`ŘĽT]jś6>îMbjőWçÄM&˛[ć€B©łÂ2šlję§^(‰˙őúďßsŔtgÓ´O,’0¦4ôÚň˝&ÔEN†Ý(Ú:1’Ę&ťű`ö7@©i —®çˇíÔ¤ßËÂŻ'.ĂşmbEâ ĹsN¬-Ě·{"¦×ÓI9qęň™ŐаMĐŮđ˛P˙ÔgGIvÇŕĹőč ŃÜ“ŘI«ch3j­Âcâ­¤~ňJ!VĂôš^ł[0ż–Ö`îĹP+•!SMĺLł&ĹÓ”¨şNm§®!Î+um-»Ĺz^çďóđ§ź/Â& ńčöŔ©»S“AËÂŐ"wt[ú…÷_€ŮőŔ(Í&˙BşĆ×ç„@Ű«·ůć¬oƲŕŰ·d N•šÍ­µĄ'{÷şĂ ੶Ž?ʇč f<™xhÎĽ†®yó^1íóˇ+§|ÎSâ× )”3_3ϲĐërŘIŠç·Ŕ4ü‘X!á—0|N\†%©.˛˝ c K ”íâćwDŹžptôľ ÄäOĄ›HU®r?CX¦•JŤr|OÄŮtaÉý]ÂPÖA­¦E¤+Ľ#NuçAŤŤ!!…pÖ$Qyp‹ćy壵·‰4¬.@ăvŔřyîżsńBLÔ0ź€+Ň©Â<ŹnŃAĄdTM‡=P(™Ă¨N9-q^iúő…ct Ů…*tŮ4Žäü5a *ŞŚ«’ÚÎX§Ec¦Î"Ęŕµçü’ąQý‰pßÓýH=Ýţ7`óö'`(ÜâůoAŽݶp;ĺ‚('v•ŘO,»U-´kbđ^Š&î¬6;Žç~ĆĽ]QŘu]×u}Ď(Ě&P:c+csńýmýĂ:»Ž=0{ťís¶EîąSZąóĘ8ÓyÜj•vřodşÚĂŚĂ (×5€úQԽޝsź•ľ6‹±ďř ŕ‹:í¦Mł0E‘v<›•rVę˙×ĺć0i”ţhKn÷+HšŁ9ó/jŇë©7wŔéđ+P—jK~ÚÝ;ŕüř°ą©Ëń ¨} Ôë»´űÍsnš)o~¦ń•W5öÇ„ -»j÷@ĘhS:ŐB1/:M˘H ýă/€ď&–ÇĺkRHףůݦ{Ý pŰ6áéw”1kn‡!w˙Ů|YÓ´BÍŢ—„VĚ©jĽä"“ÎÔI{€ŞI([3YŠĆeĺ·pиü˝jJßŢĂëżH {=3Ňý‘[ éçĘł§ĄÂř ŕšĚ˝Ę±knM˝ćťŹ†ő,í7®2Ň—ĐK^ÔÇßŔZ •b¦¤]Ő öéă§—°ţđo€{`ě¬âüçč†Ř]ýécďl*]ő†ĺö.1€ćZŐÜ_H\÷q<ĄÓŐČ ŚóLôÄo}@O‰™U¦žľI„•(kpÝ&ˇ7‰5¶W¨ž-µĐšŇ“c}u…ĎWv]×u]ß9 3fDB®7%@îżłR·M ŁąŚśĹąÔę‡0ęŰ·őŔřUSł:qU3—ô7™4“÷1}ďćb_Ar–‘NÎÁg˙—ö e`Ĺ'”ęÄ,ňI[)¬BjĐ›öš 5ťżňú;9 t•Đĺ2ÓťEΤ«·é:Lç30Ż6@Óľf l”ů=ÍfĚŢM»JěIl>W&Ô`jŕNJž¸iHş0§™N t_Ú7J}ʉ¬–L;-0r±N;s©D35T%DÍ× ˝ý’.ĽrJ¬í\ř·Z˙é’Ř… Ë–luĆΚo*«Öű?ŃŞzť6LŐ5_8+X´ŰĽŚŚ>Fˇ•"Ł9qCçÇ_j˝IüfĚËÚýčqéĆŠš«Ş0ž>4Áć‰Ö™(lŰ©=h•,uVşb›ž˘\ş53»$ß‚żűŚú¬Éłz`<źęîťî0IĎ8ť2ŁjCßĚĂFÝeH ¦RItş˛¤ý%ż":L‹…ŹŘfŻQľE[eĄ˝—ŕ2ĄĽă+P–ďÁŻz’•˛§ď ł‡.< šPeîxŐ9C‰xˇ7FIy9—ĐĽ´ÖÖzŐ…]×u]×wĎ…iĎÔś…1ˇ›·ë ú6ÝţLT·‡p&öńY^»é¤j`|ů=í~µĆÇn÷sśkŇäęĚOi¶h©ŚY˙]Ýľćó!ńaśÓ÷÷wă/!=˝fg šséw § PRţjY§k2ľ$,6\~6÷˙70ŕ=Xa‘¬Ó‰%šá‰>SýM9şW9L\zçůHôZÄŹGyEa×u]×őťŁ0Kěž5cĘßÁšLÍcAjŇîO€Żó9ßH!eĂkÚHźÎ˝–Żö˝Ý»´ ‰˙š»ß·ů «x䜸›ąČŮÓësÚ1l<5eł4»MuGÔs[ŁĄćAńą}Ň23ÎÇ„#ä:´‰’´3Ó"Ť¨Rţę „—?·ąܢą(…+Ë´»Ęuç}ŢQ凢ף^ĺnÚ?WŰĚ®6iOÖ5,+?ý ¨W·Ŕp|\ŰýkĄđ—ĐĐů(¤¨Ď™÷”+CY sn×+´;ĐÜü5óGĄ._ľÍÍÇ„Ęgš„ĹÄm Ă”ćlu‰Ĺ§3)Ǣą#ö3ÎÖłý Óßúpµë ”Â(gŮÖö`ú{úpŤiÍ ©ĹŽM 3ڬЗ@Ż,Y=[«(¦’Ô­»0ć ~Q­ILş|zXô™“ŢEöuŘÔŻ{Üę&qOeáĺđhę{bçňc"* ëEĹ™rŮÔÝ='ţÎ’–‡Ăxµ‹+żDxÍć—t_BŃ'&q™pçBn­«[`˛Ö×|Ě0ęű„µMwvsź°żMŘ•móPeŔ)!ŁK×ÍšŘí]QŘu]×u}ď(,¦,(  MßčE1ăţ Ŕö-P5Ú%^˘ş!ę;~.DW-Ô ”´řć¶Îga©lÎź«%ĘÉk¦Ţ@íşš§\4GkÓ.ÚâÂZ‚nŇĎźÍt–öɢÝOÓĄŐ†őníâ펨˛äĚvˇč_żů0ťE6-7/nN f7¦÷˘šŞ©€×/ż·?arDm}BÚµ2Š™L_?µ°­¤”I/Ą››řvţĺĚ)qNŻ*úŕÎţ†lľ(ěüłďůđ›{`RÉj ŻżŐ퇄2b–†ĽŇŮŽOµ˛dżĚPŢţ0ŚÂ)…“®•MőLZâţ@t„â”í`8ü–\ eşVňŰŞ Ň’j-lµG!qy†Ç€¦YŁő^Ű$fÍ:Ě׉d‹ťöą &Ż™çU†TNjE8ÉcčBěŞfÄ«]FĘe lţÎODťťrb‹i‘2bihBĐŽ&ţşXĚv…:ýź˛čW_NoŤë¬ŰôCŘ•kA>©ĎäŐµÎő*x`ö}üµÖWë뛄żěü§q¨îlYłUä·µ6ĚY\§ÜĘ?a|˝˘°ëş®ëúÎQ%j-X-ă\ş3P˝ý迍ąá¸¦ČÁpzÖw€Đ€IM‹Ő;âdÓĚŇv‰vó; ¸Gb· t˝ópüćŃ«Š0ËEu|&*} ú¸.á/ăk–ßÎáĚnKN¤Ę9ĺj‚ˇÝs×/0]›0¦ś€¨WYĽŹR¨|ĆÚ‹ě=VYA„R“ŔXy`ýî=0Ťbgr·ąpśéŃgeŘ;`xúđ»·ÄŠ"ľyrâeÎ/3<…úžÓNë•đqyÎü”xŠ…B*şí”…ĐiĺŤ/Ó#S­ ć ĺµKQ9eĘĎZ˝%ćĺ{—;™ć‹´ ¦ě<-ě9i·çżdvÉŘ"]ů%Ąą÷ź€ňöŻ@6ĉł=“zÔëôŰ-¤µ¨W Đ˝d•–<„E»µ»IĚŽN qć+ĽćÓO!§łůň6±KćuY łÔDÎňń-ZŇżN*:ß„Đ{Xd±’ =0ťG˛Ă!¤÷>/NRÉÇX=±.s‹q6{E•›:pxü€űżý_@9Ťž·K<µRRŠEÓx{ŔJ¬qé^ŰÄźš8…oÄŢö‡tĺťż‚ř\ĺŽ]żĹŻëş®ë;Fa¦ĺŐśHYď:s _\Ž@­¬¨1wD[z}QÓĺ”Nď6’ĘLî9‰‡ÇĚ5(mJ‰BÎ jÜ»c¬« p9ꀶ ęY˙°M›5QO/_žň-m‚iś‚šµ§Ýűé ąŘN>ň˙6ď“Z] †1ÍBX™×°«±Hs¶sŽ GLÚi•n¦Ů–ćh¦ĂR~FNËđő.1ľŃőWN“|U•« â;¤Ş›Š>ýĆČ»bnj̧/#&,éý6ˇąÂpĘ?YűąŘE¶:î91A1_L{oÜT“iÇł¬ËvK_UťµuÓé”›-pyÝíz—¸ĺôjvě7o3ö±ĆpˇBx$eQ­ßdŽFýŇŻżn÷‘Řý™Ň30…ćTbBĺ…{ (ŻŞ®wlŮö (ßeŕŰ^"ÍÚ„/4ŤŤ‰Ä‹ôÖbÎĎaŇ)Ýź"#ť•¨Ł]ÂhËT ťZěł`)ő»Äy™´n€îëďŔfőßIľćů̱PĎâÄ_j~ë.¨=ĐÜ˙Ň'Ú ©ťö@©”CĘ©oÔořvNŞď=iEýLÇG iďĐí‰ 1ŇńYšľe2_'’×u]×ő˝Ł0ťEőÝf:!¬¸iatŔ¤„¦ŐčřĽ)‡ŢrݬÝo±[;“żţ.‡ÄhÔŤO8˘Ţ˝ĎHjÎ)]¶ĂhW2uďôc¬ĹG¸NŹ€W_ńř(ĹĘ….a+M‚ÔHäŰuÂ_–R`˝9}\{ť¦Eą¦Q×­]üMi¦GŔk/GÖ÷@(N@jbNÖlI•ş<0Ž€«>sÇmB*VH;¤°ŇĽP…ßDGgNµ7ŹGőî¸îŃtVÂŞĽRŽ‹Ú'Y4 ŤG \˙PëS/D)UŐĂ"›LřW]a®€Ę?¸-0‘?/™.z6>–ĺlTľ ‰'ŔY W›ĐĄ=Űx`ě_Ş~OJú3{ýż®ëş®ď™  p «śĹó$Ŕ$7Ü|Ęđlřa‰‹fâ¦ě$?e,ŁŤP}Hílz2^^p–¦é9^ŠvqX…fF9Çu!í˛Ť¶ż|JĄ° IűŰäy“+ŰôĽřš‰ĐL@8ĽîÍ€ńś÷jË٤ÝŘTBÁ%L§f—Y¬Y•Ó8ŁňN]Đ =_ #U}OĚ„*´Ę*ޤ0CČĘţůř™Ę4N ]őů Ó¨Ô˛Ł^e‰¦É}KÚ'Ëő 0÷Ę;ż%j٬IS˘,Rý3X¤Ă4}!)}Š!ŁxKĺmÓŐł4:/_dć×Ěép~ýŘŢţC%ĐϢŞÎ/€ß˝'Í·oó±k8$ŢP4SŐ‰‡rmCL°ś~%‰-Uâľ°ŹtůőÝ ±Ţôzë˘ZÍ|»—)ŃĚřX7Ň͉‹´ŔeđZÜ&qg–*QҤuĽu#$®ĎWćsM©oů®Nóľ"a4×ć–xµ‘— -1íÖţWë'—OĂĄ±uŃÄ”×±;ÓÓŚźŞ}:¬¶D_¤ń_© "M}ۨ?|”Vt¸cwV7îř „*w)nîú-~]×u]ß3 ;|ÜúŻ@P;®ˇ*e®>UBÖĽÚ”®NüËř˘]ńŕ¤N*›Ä‘…Fš¬1}O/{ jĄ9ˇ›°€ Ăt—×_€ŐýO¤D ň·¸Îü«Ű÷Ŕĺ墪XŞ.Íé,wTŠ^źöĆŘ˝tJ{x±‡%]U‘0 řťy’[ |ý–ŘĹRÚ)fŞ'&Rv‡Ż@˝{ ĎżÍíŹ@SťFGŚuknë: ¸51ccöú˝šcN‰)pő; đCâ”kęÖ5PŹub99[µ\•ŔxŘ'®!tâ8V™­˛I÷Ë®@źP•Ą)H14¬3ú9圯ľßÍú.Ýń}E™ťĘĽ÷Ő Xíţš˙\~:«˘ ‰7”šĚoße~JM<[Ń´‰C´dMf M Ýź¸°˘ÝăëW`ŰŢgSxMDí•üŞĂY =g˘FĚ:+ű3i§+¦§«˝IáăÎČ˝¨6A6ĄŢŞKÁXˇ†qb&g™Ć7)żó|¸UCL‘™‹ĄĎQ·ĺL}ĽWó|IĘ‚(ýňG“ŽzÍŇlŠÖ‹.+šľ9gü»ŠôY6vOG_ťĹc÷%ť”ć*>4ú„ôŻ(캮뺾gV´ 3w°Ś›@)ďÁ…ÄéŚ/G ĽQţç—=Pj˙śdwU•°•yĘ”^4@ĄôtµéI鮦9}Ł—5Đlß§ł±+o_ĘŐř’żăĄŢšż^ ťu#K/V$”ł4I¸Ă7>˝ ٦r„WÜŃ™辴Ü}íš<*Śă¤ Ź5ŘĽ©ÚܦżßěŢÝhj` Ź@ąţ P'ŞGĎĺ.)Ë|ó6±cżÚí:ďçjë+ÖiW·Yä˘{YąľĐ|í@ź§˝b‚4˝-67ä<a®†Ô4śŔ´lG€óřöę…Rj‚µs{ $«ůĂś“i É®ĄKhČrSÜűçôŻĘö.íĎšgÉ}©d´éđLÚ”-yĹ“iŐ÷śž«–o;Ţ-©*bćÇČ4ë`xý QÔeÎÄš;RŠé돀kŔ«‹`Î:A ýć᝼˘_Ą{çÔH$D&6pńjĄ’ëż~V?ś^ţůjőůę.ˇ­b‘ş,ß Ő(•Ŕ”|I,›ĄÎ¨EI 5ۇ¬Ô3Ő[8 ¬Ă´ÉwS*9M«-ÓeaC9Ň5Q\/ômůúLŤ€w!=?!hö}ÍÎż®ëş®ďž Ášď”'†9ťĎ­űZóľs¸u™¤łx– ŕô][,ťţ °Zç3°ťŔ*y±WEfOŚ…ą€ňţŔüŞl&éeôŰË„†üś3$†ÓđÍš”@¤ů—Ë;©Ť6ëĦEµŘ Č;†éšĚ5”Ë&źĐSµÚĺ?_oł\Ąí0ŹÄţ.hšŹŔË˙lîţˇ[lööŮű‘¨/Ug ť^[ťöjÓI}Â8Ć"Ť±¨ŔIë¤ÄÝb ăg`őţoý#)ˇ‰¬Ë‡/éîÔo˙-Ý÷ńĺ ¬ąŇ¦u7ď§\MaöŮmłÂĺĚ‹ö@ăI5˝˛ä)%”ęI»Ü$†qĽ4—łä…tĘćOšŰ†ôlŘ]eĄ!SłW憡¨öVŢ©ĽŤ!=™ĺF{Ä6-9 ľĄŽ¬‰ś\b~‹Şź2Ň/7é ź­ËgˇÓ,rÂjł®"4± iń ‰[Rkź9îňm⛊y(1M–śĽpLG—q{$|äZ ^ř”'őř_/>ť‡–J€y'¦la]°Ń’{_€RŻ˙üî/é,RŘ]Řś†+ »®ëş®ď…IékÎ8͆VĂ€ńô–Ďíšź€ŐñÍĐXbqŇž.éŰ}¶¸JiÇ3nŠnL{ľv yčÇý+ĐŢޤÝÉÎŘÚĆ#ßvŘč¬Ţ¬˙» 9c¨ÎKgxó嫏ňDĚ•çĎ@Qof‰|Pßd®[V§ą·Ôˇ˝‹DŠů Ş"űÔ”ťŻ™ć$VĹ—@w Ŕj÷žÔY=ç[˙]µ÷Ŕ¤L%rň” oď€ńńEă"°>$!ËŇŻŐ6çŇnfUż¦—?nJq[Ú9&q­RŘ0]^`ąyCL€’gSţM˝#=U»ĆË™čôTB‰ő3“»J…ÇăżÚpá.ÝëÂ0ő˘OŢú …¬O€óo€iúDĘÓ9@|śWSô´`pôVjR&„u>Ťą´÷¤ä2©®š6áwS>ZICvhťÓůC9ş®,¨Aú,ą»ÄŰÚ˙¦$ţjćŰ4‹bP7W{Ŕ·-P4 ±3TÉ·Ą´f!ó›–©Ű_€q,€vÓŰćÍ'«¤?u¨ ҲĎ2Ň/_€©;ľ}¦óc<^ËΓenšş)Ěy2Ě@੉nkŐ3UÍkOÎG©‰*HůťĹ?^QŘu]×u}Ď(Ěb®Ą;—K±ËéWÍö8fĄ&^e®ŞIE{㢓Yů>Ď_I.0ł®é›¸Nا8ĺ¦b}ńj˛ľGěîVAłX­é2%6J\Éx<šŤxć9'-÷4íZb^¬ G¬Šöö˛.űŻŔÍÇFŰ˝‡´/Y׎Ąiç_eŽŁJł*ŤkľI–ŮćÝ»tü© QFý«I:ťcÚs`AÁ•ŹBXmÂ_Ö=Ł©&’®ĽÔprĚ•%0 pÍ`V®Ŕö/D—Ü4=‹@JĽ‰öRé}Ę»éřpëűt§šÝ}b»lĘ<ŽŔpzę·şçߢ]§żcˇsĆÎ( ö=Q»oxYęö^ů«ĚÔ8)ňËŚŻ§'’+PľÎĘóYys9YdźÂÝ'żV‹±µp8HÇ4ĺ+_ŕňřOâ”9r—uľwrŞ›U‰ă QÇ»|.é‰ Ż/‰á˛ßbEÓŰśßM_˘wJîł„7ů´aI$=PŢĽ'i ¤˝*sŠż]C%……6ýw +jóľü/ŤdfP^Q™%—?€fĄ?qé¬`ď×Gr“fˇľ%ň¬Y:~ýäfµ†ýo€«ď¶ŤÔ\ITAĚęś˝~‹_×u]×wŚÂlĘ`ş•¨VĐp鞀RŠÍµá‰ŮQ¤’*ÔÇŁ}ŁĘ%Kűě^‰*'ĺ ™‹PJkżNŤZpÂđ%ńË–IS3Í ÜéűŰvŹrřş ĺ=¬”[¤“üBÇ,ÎhŇI»ŮÝ%ü5‡ś»oËŘ´EĘľÍCbĘbzń`Öž3śjUç/OÄbcť”ńPmzG1{33eę7płĽ–_‰=ŰćG[ä"XcŤiŽšĽß Ĺśţ ęĹç♨>ë1 SX{MnŤ}‘%PC$^iŚĎ/@)DlŽQµ)ŮmLo(*ő•Žßđ§f)!}µľ éÝ oçÄÄYŇC«dÚîŽ[ď€p>E--—_¸y—q“Ď$a™&n•Ľ±]şSJńoä?1|6îšqšQn>: jßćżhŠü2}j¬®~Ě‰Ż¦zS‡>Asřj›–µ[z]“/@‘?t÷Őľîr‹=Ťd†ÎKcĄöxµ‚۬ĐŁMuuŰ„ËĹÝ™Új<ŕ·oMŻłć¶ćÉ ‰m4'éţ_@ŃHQx€čE]Ý…ŇGć0‰±mßăá‰č‘ôí;ŕôőż®(ěş®ëşţ˙ Ó´ĄlßÜEy†§°ş˝×f‘ö+írq®Täďok*rÄłóÉ{čĄć‰Ó7íŤú+J=÷…|mŇ Ď‹ý!$,0uź$>ÂZÔˇÝ/šWy¤†Ôę†81d'uXu›x7á5+ń“ŇşÚL@¦l¦)«~Üj „ó)łQšÂřŘ˙ţ+PmV™é0+€Zd& ĚĎÄ–ćËá¨Ű6_JbÎjĺ· &QĽPäsţëĘłH źO@Ѩô(/,Ń<a˙+ÉŤŕÍŇęÁ¶Î¬ěWÓ•tvÂŹuł†Ó+q¶ĺ‹Âý°Şú:ŤE­V@üŤč©4  î %…”Ä–©e;§• P牭č˝-„†  žŔ/ĽŠÖ}- 8ű„DÂx çX,Ě…~*\žęîGâÄńŞŇ˛ rŢÉ‚*Ü(K ×g$˛nŃôe,:L˝Őóĺ(Jť?4UĽÉS%©p?””…_|r ęÓ13ąb±őN]n7‡fĺň)mĚiqÎoĐż¦ĎٰˇkަO·ž˘ů˘üd]µľ>ÎߦgĆxPVĘXżýë…]×u]×wŽÂÔk{‚üSÜýĺ¬ß|†á4B …š7@|Ö›÷™!ZhÄěË\ĚHUÓčĺ°sĆÔhBtI;žR”ůŤµ Vi˙Ô T «ăë+P´oάŞj€Ńş^ň$Ń2І”ˇ^ßZť·Ěýgú{ˇÂîpŤšř^óëÉC?ë1R~Ľ˛˘ U-X’bćî}ⳬóĆz óî+ĹĽ4\Ţ2Ľ˛ÇP?R)`cč‰Účţ°śMúJbű”ą\Á·D‹Ł&Mcg!Ç/€ż}\óč÷żíýßón_• OŮ~n^ąEAQŁđ‚X90(7M‰©ň>ń>JMZf3*ĚUÚ±^}*ęřť˙Ľ ……ć–[’íü0ž± XíęELłP†ćˇŮéiŁ'ő6o2˛Đöđ¸vCrŘĎĄšŤôÚćŚçg \ÝĄťAÉ–Â#ň$UĆ#‚jľľ'şíbúkI˝Ĺ˘5µO –Šđ~ŃN8Ź€g 8L. Ď@wzšíGb‹u¸|ÜęG`.^rěŽ/@uűßR°łťřĚőňźľyÂń(7ęg\sqIě•M$]ť0Ć{®˛‰ęí^ičňBH“˝Öt27<—ۇŞĘŹ•łěI=oÉ™ŐUę‰őY;WvüĹ˙;%LGUM˝N p螀výžŘf'Ľž8O˛1€ş!Ş–l.ËúÁżě‚Ű5»üŢcKS·pĄ¦Ď5QoĄ©_±ŕ…cÄ‚ÁĽ‰ýˇ†ËÂ(u*ęůSižÜvÁv éOf{%Ź€Żß-#PW˙LB˛s“YÎbÁTŽűÄŚÇ#›°Ő()€Ăůč_ŹŔęă0ż|Üî/@Pć­~˛[]QŘu]×u}ç(Ě×·Ŕůé5ÇröůöŻż޲Ě=0ŮD©ĽMR&`x~LŚĎ¨l© l)骥`>˛L1í_^*’Žčę:?˙´Őš‹ ér¸'1ĹLôÜýLuęčw™ŇmÁhkSćQYťQ7oŤíŢ#iĘ9)Ý˙-‰//€_Ý- —˛Ň/Ŕ,ĺ×t¦Ë#PŢýR-›AP-™%0^N@řDtD2~ěpŢlîÖ×@íëÄQZ? ć83@łĘW;L_€ŮTHĐ:0ĺzĄÔsí۰ň-ĚëĹCR±´S“Ó©޵8”ěe sVŰ©ÁSřhT>đÝG Ľ<ýR±‹·*ĆšÝfŚ›u ué©35Ľ±Ku挤k|š3‹ÎŹ€[°fĹ̟ޝ0ť)qŔ8ěşýĚ/aZ?ĂPâ(+ţ¬7,> bp,-˙ÍŘéÉm¤“Ťçśáˇ]í~ú×_‰>Mď<0Lˇ"Yt†ZbŞZ;uw8eĆPٰ‹s†]±é”¬Áňc ˛›â®j5ôOŔ0y.€ŞşIKŞ@)4é7Ŕ¨ľ4Đ)ă¤Ţc¸ęí[ {ů/ ˙ă?ÍĂ_îňLěB·CZ±ą˘°ëş®ëúÎQXż˙`óîďŔůů3°ąű¸ţ“Ř3 hŢ'ÖCçç˛QV”Ű; Řiíü–®amęůĹĆ,‡ś»;s˛ő{+OO‚”\šŐö=Pn€BżQĐ"ű[Çî (J=‡0 bZ·d#I~Eł9O.é<4»-Yů%Ľ9]Ąc÷”Č쀾{&ĄčŰŘ&ÎÔ©?¬˙ ¨„鬑ľM×ŮNŇNĘ­Ů˝7W§ë¬ÄšŮ˛[+ U»[ŁNZ‡?€âćçĚŰJłyýż®ëş®ď™ «¶Ŕĺë/€/•wzb{ŤZ+˛kĚ­7¤9×Ý[3šô‰ŹĐřćžŘH\„đŰܦ§™BĎ@wúhëż§onMpäę˛D|e6j÷ľyŚç?€îxVoß‘R¤ż7o ¦ý V·‰;°ä†1{ľćE Â7r¬ĄÎË2ą”}^&6MéľrŔĐÉ·!Ů(Côű?€öá'˛‹M9ĄzsšF-P§±!%ШűĎ5ŔŔD’Ö+m­t€*!)q„ž^?~ý&íŘĄ“"ď ŘĄ«QĚ}F bĺÔ|.`˝nąű’ÜĽ¸<…˝˘czÍ^×pÔ,u ú:Ĺ[Mj śóU]fçĆ?ŃWġĄŹŇ7Â%Y;¶Hß5~§%5r»Śš…ÂĚłiÉVMú§Sż|©^źľ Ž#Éę˙=/Ř4HłiË8Í=Ś:©Č˘ľëK YÇ=•ąé'Şó[âlw:?fĐPš„ëíY-ďŇw ĆÍ^xđétŇ÷ŔĽŞRS)%]HWŇX<ĹÓiĆZí×zbZ˛]sµŮÔUźµŠ¨Sţ°ň«:kÄ`žŽDeBUeçfyŁ|ăţŰŰ{Ea×u]×ő]ٰAűóö0Ky?ßcp@esźŕw7€ëňYÝľCÎ2đë˘*gî˛ŇD]§ýP5őbo,ŇÝS:W•\rsNµĽVĺjvĘÔżĘŐ´`¦`$wŘTőĂOŔđúHL=+W+`–&h©;—Ž\LŮäH9q‡Î»î0h:ių̋ĘÜo5ý P­× ŚéŇľ­FĄrŐţé'ĄôYÝ‚żČŘ]o­Ç„ŠÍ{ ě` Ëe?KĘ ńh÷`=ęzŻÓëWR+O9ôŕÜ6ń_ć:4ŤO·ŔPľĽ|SÝăŕÚ7ŔxŢÓ,¤ň}i7ë Ô›^hýÂôLT9ÍÖ?X—Ă3ĐŢlŇO^:mz¨Ľ¶ľ#ά…k4Eí ŁTĹ(”Ú/,˛Ćů*Ë÷đőGA_˘ÇñJh}:źőý{ ërBDt9űÄ|µJ‘[F|Ącő¨nW@YŔ¤lM“‹*1z¦XŔ4žŢgo>„9ŁĽ©ÚÝÇ„’¦ĂW Ú<—aT–Ľ˘+™ąÝâ˙ĹÝ™ąËyX8…Ů‚öŚé{Ă÷Ĺ=q¶®´ŹRj„é €˙)ŁTa:ݦ¨/Wv]×u]ß;fn)YVŔ$G~1ÓX=‰bCć…ËoŢóXdć˘ČŮswć&wđŽĘÉÖĚBó/éP€¤DSj¸Ň÷…G‚Ú_ćôÝ•5jŢ–é’ömĂ&N¬Aί¤ěVőŤ÷}F^—3±7[©ˇĘhµ|Ąą¦pLŚŚ´Nv­Çł&¦n óRľk¸$¤Phľ=kŐ®M{µTŮÜCß;71ĹYn·9T‘{’µóŹÓoŔ| ÄÄTÓC-H$u<ŕw÷ť8PqŽ39m-$†Ĺmő$ ™ő0¸č˙ô`Í65;SŘe%”75V1O]쌰¶pŤ’j‰ ó:®˝;Ý”…)ˇć„‹‹y 8K¸;@Ěł/ź/éYŇLŮ’Î6ĽzN™­®úôľ\Să ¦HPűŚađ%|¦çäBLÄ×>ľŐî(ÄT^0×9ŮŘRd”j{*‹T·ą»ďö@ۨˇĽµ=UŔT8 dEŇÁYßĺ8¸ZčU(ĎRĆČř×f‘g€Űů|úĂW˘LYÎ)/÷8\Ŕńő`űöoŔ4<瓇Z8Ş1=iWv]×u]ß3 ‹˛¸Aą ;`?uۤS¨1¶Ąô/wn3·"f'ä´xWďHÂö].}­Xʢ|ɰ@Mőźłşc†O(Iľ¶ąąŘ$Ô&Ő˛el›łĚ/xĄ­r>jë]bŻ4ىF5Í’Đ}ý ´w?áô)^*=ŹRĘ原WH˙­&ç `!b 4V‹ŚŞĐey!g±“Ji»ÎĎ€ßţßKÝĹe <ŤÔ[㙜Ξ}©†Ý,˛AÜM·ŕĘꌪ¤ýąI§šźZ~Ö”®€Ą}Í™:`ÚfiÄÍüYĂéÔJíŽiŹŐ+Q—bí¶@ßť‰’őöď •q›‰Ç6·F~ÓTä`’†QJq{/0ž{ lr:›AôLŁ:ľľÉiľ}›îŃe˙ÔŰ;’O3äöŁI™ Dl™EÎŚ“/Ő<ËäTá©y˙@-w1ýÜŐ )[Κ嵪cL|ô ěíÍGŔT“ý(ď†ç_€éů™€ć4Ë^řj|連R%(ĎŚ'µjzáµűŚ+…ÍÇ(7÷Ŕtú pĄŘ.Í+`«Ó>ů*1}:Ť•éZ]QŘu]×u}Ď(Ě-Ęc§Žf")ăôtJŘAy‰¦Ż BVű-#ޤߙNŹ™ŹfDN:ýËkź“á¨tĐÜęĽÜQM_T€[U@!.@Ä”wÎr} „Ë#ŕ4˙Ş z`:_·Ů€éé‹ć!íKĆ&ä™&b†ňż\s›( BŽBĄ} Ütk °ü,S÷śÓ®b}íś–cą‚Đč2ŃÔ´@ź/év?Ms&„źfű!ˇž`ť’úż«| Cx8ť•$µČ“N­V'ů>a.K:™sRîˇ?©mčx·ćŰŚ­°ČV¨5l©c1ä [±Kß´1ÔR{Kۨ.%{_jÝ$>Ný@ˇj‰©XÍý˘v|:˝®Ů$Ś)Tάä¬u:gÄ)gnü.\î.ż¬ä8űP„30M9#ś.é˝řz™'\uXδňEâ7íSݱbGĚ qšăkV8;ŇTZ*Ĺ‹ŠzÎť°†ÜSiźËťIJ©‰Ë:ńnŰMß'Łťş\b˝Éf›˘Ú{ˇ¸˘°ëş®ëúžQ©«ÔŮ+˝x»<[ —¤ĆšEň·[43*uÓM˘ĎβƧ=qţ"EľśŹĂůź`sÓYZÖŁ’W{ ˝˙–§:嵊#S6™:€éń_Ŕp˙đUfp kŤÜ$XÎÇÄÓ©ŰƲ7”Ő%Ĺ–56€9¬]ÓJť·Ěú`*€ Yç1 ő|>M“ ĘúOż“ÔĎý¨nßÝé1í3Ć}Ě‹ŢiöBdęţźv€ů2¤Ý[Ó1XÓĺ(ěBܤ=p> Í ŔĽŇYĺkë2łi9Ú«­;'I)çłpŮ….źGžD›JHsdš´Ó.˝™1ŰK]3GLdVH\ˇ2K5,¤´p;µĘÁŇsČTg&·nňż^SŠżŇâőLŞ#]¸CŮĽşnsťxşb˝ÍGąWă”°ˇiĺ•SÚܦ§K­ăa>-ž˙¬ĹSężî{č÷ÄĆoĺľuŹ˙IlŰň껞ň©HĽł©ÉĚI"L˙÷žŘdsv»10Žż^ÚĚş&6E_ăţ3Ń\”±wUO¦×üZ-Cf‹…±¬j`˙úq**ݍzEm +/dČ'*KyU@Š]$ĺ V@~ą˘°ëş®ëúÎQX±P˛őN Ó~üPV ŕ«|{ţ˝~-ŐKýşóbÇłvúN3,)wNŔě;Ią‚0‹™=ĺ6źge?ŕÚ´j2eib+t7nZ—ý3Ń'hÝŃzGĄđť¸ż"íŘEsJřk´=ť‰sĚ8AËÝ<›Ő{ źËKőśKČw\d·*Yaéě+ŚZŻa3_P®ßs×'&Ĺö^Á1Y>7 j"|9ľŤţĽm‰ŢŘŘ^.<·Č2ďđú·Ň‰9Քʯ˘} ŚMiuMî2Şť—ěUźP}g= 3Đť>őîMb[̧QnÓ«2®Vě¤ćtý%avs›h-ěńPß|\9,¸9—ů©î…ذĹX~uI°X(&"2e˘îÓăă67$š-dŻB7<ŰÝ_ÎÜ EBRBѧŃ~˝":ä`QžpŐ´€“z‹1Ł<Ý‘Đ%Ž)†®é=*µ"ëřM·ĄëfŔ—÷é•ŰܶހSJßóâćI:őBÖ'RoĂŇ{±©č˘Ů^Ę{ÓÄ‘ő}.Öy ÖH+ô˛öÓ´˘ô€wŐ…]×u]×wŽÂŚó·|k8%^é/Íü9‡>*5Z˘v| Y»4(eTmŔMNă˛6 Mç¬˙&;|·ý9ˇ3›î•50žźośT—P[˝zOJ Ő>©ÖÂĺ+'š«€ŐÍ›ÄFMJF•–m\dÉV ŕ”‹oľĹ!łxu“ţ-ý PŢü@tn† Ś)Gg8=Uiꂞ­í±#jyb”Ó pĹĘíRĐůXí~ z$búŇHRâ¨EQ;Ř<eąMĚ…H¶ŠőŻ´+ZTúś˙m}Śâb¨,dĆPĆÝŘIgź3HuÍĄB* ·řw0ô#Pţ%ńˇE}řF.iÖ<şczŢ Ăúő!:`|ú•pg®ĆQÍđ‡ôt•7÷ÄuyicÇč0˛ŻďŻäŢâ /Ź@ąľ'Îő†ËžJ!ÄtCL Óß'+˙FÓĽ†AłTźžůéőw€z“ř¬˘mÝÎËE¨‰đb~­|Wk]čŇ“/t›4ł“łő 4÷wŔĺ铨)˘KɱĘ1jPXLÎ éĽÔá¸P# ©®4nĄţ`Oě “ŠĐúR‹2!»v}“ľgŚ»´Ěľh·`<=ˇx8^€˛}OtؤU—D™w×ońëş®ëú®ą°:ł’1Qa…,`čŹŔ´?ŐÝCÚ÷¤-MŻ}Xţ2MŽj’ň~šŞşcOĆÄjYŹ‹•OjŘ»L'uy"éS4ŰŇfđü ćŘľů7Ŕ—â¦Lqh/˛4+ůćô]ŹŕĄ©±ić ôRZ7›ĚŚĽpÄ  k+€VٶŮW`]âÖ))…K‘ĄYůPŇőyne PÚĎŐ†i|ßh¶ď~ś€ZűgŻ~őž8AVęyŃ(SÜýé(4_3ő˙”±ŔR‹żhâQłdy÷,ťBE˝GrŽ—'Ŕ­ vŇ,´ěaxĘö6qšĆĽho/]b`5מ5K~Š‹8 g ďďWm†ť¦Szęä·5ŤűJ}ě#PLJ ůBĘŇr«ÄžŘßY$,Äi)Ä™¦ňiUäU6Á4tşkĄ8,ˇězşó#©µŔťňȶ™iŐ¤µĚYűˇ^%žËü•JűŇ”_mŘJhĐBé`Ró9y=I˘7ge™ü6Ę’S.ëp9]Çî(ÖoIpěŐĽhŰň-0íż;ĂLŰX*›÷4µËČNM—ÖC–Ś÷ĺIőé W*ŮrˤĄˇH 9řS×§úW·Wv]×u]ß; c},-Ëăń_ŔüćcBUóîpÍ0wĎ@éWé;[™D®˝ŠľĽrŁ$Ő}Út˙6á`NßÄ‘ÜPše‘v¤˛Í˝ćpśFb čÔźW—Â/‰ÚüţTHłS¤ýÜpź7jSr• –`ľś€rUĹŞJ×MÓŐ˛nŇŐF&hž8ś€BŤÇ'MUN‰S‹*jżz¸z _ţW„hÔw˙B÷ p‰ŽůÚÔa® µĹÄwôŻ' Ú®IYQJ%±,y$şÄĆ&OÔýGDąŕĽÄžČÉ Ś#ľFÓ(kÝc/]nĎśÍ?{„ă#0[·€˛1~$ŞŢk=işŹć“ŐŢ«”ŕž”BUćI÷tÚî¦MO‘Ż9ěäâ´79'tc=§ÂĺĐU‰ł†-»99Nç|ú¬v˙p^\ä9óVăťu2X'fFĺ¡ÖÚ¬IŠż†ŚŽCNˇ°÷®ćŞ"'Ái~mü—Ţ©_Sa´\ů¨„ţ”Ç_ݦĎÝtŢĆ<†O@Ńî€ń|ĘUx{Y/Ŕ\Ľ'·ÇćŮčěęĹg6gÉZóĆöM<Žž.§ÄŽ]^ĎŔj×DČeîaĆ ,ŮÓUv]×u]ß; Sʨ0Ža–áT·i÷MK-Čň;qzČšK¤€diĘ*z!f`:Cm'°ćä"¬©űb:ĄľŹ»ŕ7ąŻŰöŔ)3†_ę¨\„‹°Xî[–ŢZ¬Ai ‰âĹ\zť»¦ŤóRb”Ď™qßöqŘŢ2%®JiBâl‚Y&HᥓRofVĐM;Šš+w?® ¤ä©1ŐVąărň—KHŮfI˝©÷ŔęÝ_€ ­Ó7i±ŇÝT‰% †Ąă«8%#YËËźÔbµÜFŠpŇ)$2iftţ(„"O é#Çßú&ÝMßÜăëoD÷ÂŘŹŔfµ:C0]~ś›p–9mĄňS+{N×dt äXÝăé Pȡˇ‰°đéÜ•ÚĽŹż©ö­;]XLýŹR&ž nîy:űC p„.?Q†@±{T ĘbUjë$D|ú8Ą_EŐŹsĐő{`Um"É45~ ĚÖ›•çĆňƸú]âÔĚ…Úw t™§ö®]'.O´Ă€J­]ćŇ˝¤çĽ‘ »ĹmKlĆ2ÎKţŮo2ŃÔ ¶Î¬ź}˛6€ÓÔ»;M[ćWĄ‘g+¤ŻG<¤3ä…]×u]×÷ŚÂäĂ –š ”îUÂ;Íęč/ź‰î6Ą#)űÜTłaJ—űň"fq`Zůâđ”Í čbfć4} ÓpIßT…2 䢱#-xŮfl2· ŹĚdËf1j9jŢô§Śm‹ĘęseTMs”[%1HťźçV¦ŞŐ9¤=PşüixŠZ™ĚM×x˙pë-ö'`ł®Ý:1…×”'% ¤Đ{oŇ{ núÓ!1ÎĺôKRŐµZĚn”ě.W´cĂđ¸b“qźzb¤‰sXžGśä’®2HGőcË9+Ď4}ş_Ö $EuµŔdÔą–™Ŕ’°†/˙ITŘcťCź˛ŽZ'é¶· e„aźđ—94Sł$•)ŁxĄ} .ú ĄíZݧ–J@łË Y§>žzý Ô¦űîý=±‘H­é–×R.RŤ*B´g^®ŇE¶Škîó“l=F+`ľMuÔBđ)"źia‰ľ]ÂqšqËĂX¸śĺ§OsŘLä1©UK'­9źTl‚Y€sElçnăSź0šî×Ô]€Ş}Gě—tĂÂeě=0ô/@Ą™¦ ‹ÖN;€ťÎéŔ,n}Ea×u]×őťŁ0/_¤Ať¬XŃŢ5H­ÉŽ5Öč”i“°|‹u>ëZ˙ö˛b°’*DX/sR†q,ˇLç•hę+e'µ™Ű’RßřŁ ĂôÇg`ýöçtşV2dq9&LgÓĆĹ+/˛´ŰvÎńő+P5«Ä‘–µ¤„ŐÜ\ó]O3 Äe(ÁR7=0ž¦sT«MFšEľ>Ę×??˙1ÍRţÍyˇ©Ń>w9żŤq›O'bşą~ä¬^‚ę(Ü †sş2jE Ă'©ǫ)죜:ÝAËűŻ7‰§+š»„éd20 ”˛v‡ś˙Ą©˘2c•— 6¬QXŇĽŤ ±RĚ‘öęŇ7ŔrˇáAĺ˛9%ß/´xÓ˘#ÝdŽčö˙ÚŰŹ …•ҲĄ•Š“şMŐ éë,b tJ•¸!z-•„áŞEŇď3H]¨Ď…–9ţ\Aô±”Jš-2Î5îUi C—®ĽîÝ<ç^Î$‰Ô«jóçËR˙V ć±]đMŇ”}!éżBF—±ëľĚg_ń• [ŻŠ1c¨ŞŐsţÔëé“nÜ+>ó΢4Ç ŕ··ÄÔe]s3JÚµ˝#z!ŃdsZś˘\ML0Ľ˘°ëş®ëúžQ¸›Ł©Fůĺí Q?ŇróÔŮ#ĆÄRŤÔ­"ľĆsŻśĆ3©ý(8` Y™â6mYĽ鿪b^í .ł ˆçy”±h× ĆWsĆv›ą†"G|ş™`îŔďnÓÎ3žžßa|Í7ĹŢSf:lźě*”;,ž"¨µiďJ¬bHxm’‡QÔY€Í›źł{3…LűÄ×ěţ Ö«7ŔůrŞ›wD/Şé› q1 ĹĽtĹĹřŚL§“şľ€jő.]¶K_^j}KěÍVŐ“ Üřú)c"5ň 8Ă/`ö Ĺxĺń ÁMR í‰>ľfýĐÔ-p‘—s”žNű®&żRiMÄ\6›‚…|’hîď§4´˘‡·Ôôň'ND€5 YŇ1ˇ¶pz$NÓŚ‘Q.›üłĹ%ˇÚŮô_G`žÍBRľNŻYlNĐëú°&Ş*1­řŕY ¶˘†ăKbÍ:µÄßý[˘‚Mm_Tů3bxŮ…;aCĺ”ÝV—Ĺ27˘ČNŘîü Ôr†şM:ČLĂ+]˙.QjÓů pÍMâ¬ígVk`z}”ĄQÖ?ŢG˘ËÜ‹†ĺs„Ś˝®(캮뺾gÔ®¨ý0äT†ńôźRĐZ<…TËë´cč”;óň'Ó)í ĚĚ—'ĺ‘»’¨EEΫT.eŕ Ý@łţ)a˝eř0Ľ^M‘Ň=0Čsg J›üŰŐNx’/L˝uufµä2»<ĺö=P(sÁCY"Ąş˛Ĺ8ŘČm1aáÚ»çŠJ;3Q;^¶÷@8~¦ť¦śÇW ¬<‚\oň±6j˝.€fu—Đ™Ż·D]µg'gk÷;P™GoN;ę8žWŢ8…żćó30ů莯Ŕúá/‰c˛Ö¨ţřRóÄ!ń>Ú:Ąą·«Đ}˙4ʇÔĎ| NĐĘí`ň‰×ú ĐÜĽĆÓ%nŰÖ~€Üscî4ŢŢ"!JkuşyHX2\Ôyę˙XČŰŰŹ‰*Ý&á&c‡1ă2M5Ý..ÄY¤)Ĺ˝a˙&q|ľÜĺż/żÁýOŔ|ŮgdLĘZś×8Ţő€s›Äó&_ízŚÝg Úľ'öxÇ~#ť6ÎŔ0˛Č~É©?AIĹGĄ€¬€éü𫏠Ď^†X7[`­®)aĆ©Lç éň˝yçüĚ4wÄÄ`ëš ĘůŘ_ěý¶+bÎ0BdŤšX}ş2¶¦ÜĘzEa×u]×ő]saĆiš“uŢŢżFĂ>:ĄŻÓ·l_WޤoÜ`Ö8ťásv4ĺ:ńV›`|ţś8šQ­0冔ßXT@Ýćü/µ…GGˇ¦9jşN?Öń•ÍűłÉ¬Ę"[ Ι!˛ţA6éŽ`q€rsGś™u)Vkb2úĽčĐ,•Ť5>ΩĂFęę[˘ćHjxeĚ))TRĘÚőn J”^Éí˘eâLĄf˛ţçÚň{źśN‘ŘI%XŇ˙tNčĚć§réÚ´×%ŽŐ2ť¬źŃ“|‹bH{ąY߮չd‘P2Ó'Ĺ,”@¸üřőŹÄVpĂeşŐĘáb L/ż%Đüżt™SżÎż¦ţHî×olśZH˙Şl~H\žŢ]č^_ľKĚułľ'ç÷€_˙ §ßÓ“f×_éűˇ†Ó +P5ŚěŐ:ĺ™éůůQIŻÎŮ`šaI5„»ÄĘÍ\g­Ďăĺé?ŐĂ˙¬MM×V,ó´PđŹŕŞ÷ŔÔ]4_QŘu]×u}ç(Ě´`¶ć3ąĐPÔ%;@C€př(ęěnŻŐgÚ®Ü'%K”{@·"'v+ "kÄĂefi˛ôw úÔégjżă¦Ě©i1LPI7¤]E}Ë»; °=e-Miß6&N_ćR!‘y鼴 –tľĐ…Ť™=Q6–˛ŔÄ>TNMHJěXŁŁĹŔ†ÍśáV%gŤÜpţ#±Ď¦ŢÜÝëcb=l˙$ç|ČÓ{†r“öí€cLŚ@ÓlÓŻWňgs÷/űÄřD±¶^íx%vL.cś)kâ”řnmáÍ»g`zú'Pí>€µ4šrĘşFC’±1ŰžZŻpĚ7-Ň“)7˘y¦Ë™¤ój¶é®É2źžCń‰ćK—7L€_m€áů+ŕÖ÷@8|É(OąRxÝ˙ ôŻ/@)e˝¦ó‰¨†×SÖŰs—)bë*ߤ{TµY»on™đJTAŞÁ şűLĎżCôŔřm:™ÚQ¨GóMu_Ę!^^TeíŰ]0ĚXĹÝ=Î/Ŕéĺ XßűÄ »U™°Ş0ŕTäfx}˘ťőQAL˰ó†#ĐŢ|ÂĺŔ­ß界ż¦{gŻąWw@%Fo8\QŘu]×u}ç(Ěfę™2’ îBt„ŮÁ_çá›Áf4óB9=/Úßbb˝~EźqŤů s>·“iśŇÎŕ”·ŮK…$µ}nî bO*í˘>ˇŹZł Ă2&Q‡¨H>~Ë´ź˘Ľ°AťŐ†@=0—Y¦|®rý(ÔqÝwéL^¬ZŔ©Qi:ăń+P´›„.MFf˘¸$áŻ%Ëtťťň*kbň—|pćĘ/ŔéÓ˙kw‹ Ňř&-Ř+Đť~Zˇ™/Dů¸Ě}(]:r5`KáĄü5żÍŠ–ô÷–ÖŻôzµ<†±KŻJ‰#ăÓ?‰îZvĘ{P?cv¶ŞÍłŮi˛Öýy¬os'ů<˝…Ű.Ře6LŔ|řšë dÚö0żľŇÝW¶GĄ8XwD®ŤÖ\Ň… ѶШŃZ© EVTY§ôĺ T«uşŞâÔĚ”;ťţ˛ľ…×' ĽÉéǦ\&SÖ‹ ‹|}íÓS= Ŕ9éŞjb˘VÜëű‡tť#ÚÍ= aZ´MÂ5ăYCÔ5˙Š•¦É÷Ĺ>qÎéžÓU%¸h.<>Es“ąceBHch·q’nźD›W’pŻ×@°ĚŻ5Î:gś_~›A·÷¦î+ŕŞűüI4ůŮ%=·rĽ ý…qĚgu†¶é¤báxzNôśKq)ÖU9}şgú ®ÖÄükáÔÔ^j;2ş4Ľ¬«-u§Tuş/zmrőtâ_KxEa×u]×ő=Ł°Ë—ę·ćs°ÎčC:ďéř+Ŕć' Ô>3çĆ@ńAÚÍ Éu%u»—éHĚť-É[Ť&†oŇÎl:ě˛ĆçßňćMţ]ĘRęi÷¸Ű÷@ˇ„/¨j ¶Ƨ<Ż‘ľÜv‰aLß÷ľ©Ó7˝tçĚŇÖüÂŞ±§˛(¶ÄĚuăąD«TžĎD· U/ĽŠŁ¦uňŤî?ťýÎ-桮Ő;`îůŽöŻ€Ó+ʤFqŰ˝sŰ€1+]KÓś‘¨Sw7B śťŻß¸J|DlÔviOžfµpKC/ćâ xńq®IŻ|6ť‘ťą&X\aő–5Ď­ďҵť…R‹7@8ý–Đ„®€”e^N’bqůÄŤ07eěÁVciH?ß&ŚŁ¬)ýťÂω+ôŇčí~Hí˝ňEާg`6}Ľăۤ6{ą!'‘jçzTĘą-kŔ×7@¸ĘÁrű——t= ˝NëĘ 5ÓěŔRŢËJą`sÂ&ă×ŐŰżĄWh“µJů Çô®eŇő†ćDźÄa=·MfgÜ ôĂXßüîi÷ú hßý7 ś÷}čܰůKâ†bóFĺÓw Úl®Ř¦Źp_ź‰Y¬6GÖTN-Ö.góK ¦ç¤Ž@]·$@± 9eq}ćé,Ý7·ŤĆünŇ™I«Y­§™řë' , `÷D•Ľ|‹1Ůg䨇Eź2kí:Ął]X©3Ţ“”SIę:^Ϩ”´ŐýOŔĺřźWv]×u]ß9 ›´_Ó”€¤ľťtÚ,ďČ.§ĆW ;žÍý; ¬nŇną  Ľy—ÎŇëí0uCBć§Ó·u÷¸RZ—vűA*U—‚đ‘ÔÉR„ű /°şy tÉŘĆěWň¦uig_b„#şôšc •vEí%±ąÇZŽŠEš«ő6wDwdcÜkÚŐÇqN|˘ŤgŠś«)V": t¤ĎžŇo7Ą˛°›fj–Ń* ݆8á_ţ\ő&íŐbÜfé}ĚšóřăřjŠj8Ę8Î|‘KeźÜvĘŃő”¨$¦ÎŠ NWőŽôHYsř˘h®©{úó`}ób¦ľMčÔ”Ţ_^“j/Hݧfĺ[ RíWédPş<݋̋҉ĎéÚŠôMľGÖ%şMx_ďşşů %äśÝ¦źI~$ÍGjBžsB)“ŞŐ-0Ľ|Î<”öLů•(PdFĂfŽ6éëi*QsŇ@[ć"ű?¦k@ŃmÚquąâ=Xެ5Ľ°gćPäÇ´vqq.—s –iĄÔ3u&”Űôľ„ť˝Pí± 1;4(uó.ż;ˇ¶A¸{"ş¤Ň.×k)Čˬł×lm@JĹ:jŢҬjxýO€ęaÝňŐ™ĂnŃ›ąLˇR¦‚PŞŘ%ýŰîÔë€5«JűŢ&Ľ¬„5ůÚ·OŚ’ů^»—Ë™ń”:7 q•Y fîHÍŁ}n×ÔOźSküä)ÎłEwľŐú!Ý‹čŁ0›ebZ-Ńż;~ý&Ý =j{TŠßt9Ą{ŽĎ@wڥ쀫s2ŤľCôŞJů7d®^W0KażĘő*˝Ż0é€főĘ7ŔŘ˙‘Ď áLěBg8R Żßâ×u]×őŁ0ÓIŮî$…”&q»Ĺ÷ë(k}gkv©ÍeHß !Ô@ąş¦ÓKÚC¦Ë¤ýq¨ä&“"Ć÷ UŮ%n+,’饋!;ő„âÎV…iŁ ŕ˘ţ!ť±ŤÉÝÂÖÓ7ŞEü&’l–üEµ#U}·5X†úΉˇS «·ß¸Đ¸Ő 0*§A§zĺ"ÍDMŮ”Q›Í@Ĺ ť@ąÚ 0v(KőWgü&MÁä7(·Ę}Ké(ĄŹk¦čź˙ X˝˙?ÁRv}Uăĺś.ŇȢî<ë)Ő*=PL‹)]ŰB°'bv®~1µz NBűÓP5ĐÔćBŮ@'U}ÎŞ«2±6Ůśós[­~$éű¤ŠZ×@¸Čź['Q¶7$ýť%ß_”AâsŰGş/˙Ô՚ؓčwď€YÉîe ´o˙Ě]—®¶r¸ćKGš©13řLű® ťžänHĎę<ç9˛[4®NŇŻąŚ‹x H¸ŇđŻië[€KźŢŻ82Ă§ćź é§nĘĂ×˙ 4·?’rÄ”@»™¶(‰ŮgE]çăőýpřú_ŔćĂ?6TŁĹĽh¨(8ĄN]JıvˇNĺ‘t@?~!fđɇ Nöüň°ľ˙đýUv]×u]ß; c‰n´ë–-0ź€Ú©Ă†„>LC¦1ľŇÓů9í˙L-Q¤ÜÎĘŔ ®exK÷äłÖY.öáĺ7ŔY‚«”ÓÚů'âĽi8~!iÓÄvIů]ߤďňČť D*ÎMyCÎ Őv–Ývf:ÔÎ,Ç™¦?U„óDLÍwć>ËÚ+e´šĚXšďđĚ…ÚŞ‡„.5 ®o5ß̸FYţň0J§SW9,„(ëĚĹŢ©(Ë5pşüh·oҵjßţčXŚČzŃ·¨űn10(+ms›ą?í˙!G7ó›ąS’×ම Gä€ÍŰżťq–' ć7PňşÍg`žôż*sę3ŕŐNh‰b‹ÄŮUU‹¸Ř.]Có!.ňřÝL“ű(˝\˘B užN˘×ĺď–Sxź;‹'.`Feů‹«rj<’›eśÓ3f­ž·3±ű*T Ú~HĽgAćą”Äu| 0»ĚsÜ&NYČW*ÎRéÁ!Íîŕ¬C»ŠęĚjźXżfkjţfŢ—áźü9cLçşąę=©‹VďZ?yŁ>­”Blů±.qÄň)Żw%0I·XpEa×u]×őÝŁ0ű3kĎ ¬îÓ~¨Óu$?rŹ/BÚĄĄ2vÄür)JĘ»)cŁöF+Ą|¸ýŚÇ3ŕĺYSŰsutű˙ Ül?“ůŕ˘O˝¨¶gŮ _sŐŘěĘ ¨.Kí¨´@ŮĚÄ„ř×äOÜSĂ•O_®Ö@8€ľ;­\~”iG˛„·"fT„á9aśP”ÍĚ´iŁć†a±“+âpj‡Öź‹cZhť˝ó O ÓůMMĚŇ4Ť¸îsDĹŇż6†Ďüw śb­V§Uşk±I %7Šk»#u…*qX}żć±h¤±ąú/żĹî-ŕ…ĽT?'`¸,Ňńíeęşů„^ĹŐF…”KHGĚ‘/!2ą,şë#PTJZt\ řܶi>b a ¶s:ýą‚\•ý«j)#ůOf»fą~ť8P)ă,ŤN-JvUY¬svĽ*Ć+M_ŮyjĄâGR2íÍC>'I]`çŞ ŚŹé®‰Ĺ¶ĆŁZJ@źp¨*Ş9ó‰Bý–KBÖҵŤó=Đ4ď¶ľNťŤ,źî&±ZÂ_az$úvuÖ™‹' ÜüśŻ9ć|–Ňy¨čaľ˘°ëş®ëúŢQ\ć“ćJjš1Ťx°ĆăśŃŞĆĆ ^I ÷o~›>„IZmOJąě^ň%ßâxĘűż»—«JĄOśWpg Ú~$ćťęű8tO@0‹×&¶«PŔiđ#Ŕň+Äuţ Lg¸¶%fZó5ćY’)ąĎ—´O¶oNďÂśˇş`öŽŔÜŹ ZËäůX‚•Ú«ÝŰôŞtÝL‡¤ǧk~B7“oáđ¬Ţţ%˝w5îDâN=™!˛éç,§ę/€[)“^-˘‡Żgk?’ň[ꞙܦS“uůEŻĆÇÇŔ×-±ŤÁrÁÔKtÎmęH?eţÖ}$ô¨V»„â—Y RuÍÝ31Í)IMłą9÷E[ź“r&ć1ST­‘–§* 0T™Ý—–˛ Ä: G¸Ě.™­„¬éłěŞĚ§–)ű^§Ó+ŕ¶7™y,ÚôT(őw”Ň˝Ů$l>ÍyŢgÉŔRđ+ŁĹz*Ô5ąMřËî¸03g4äX%&k™e‚ëIY5d?ě /ĘÍ_>Ü4ßIjjĘś/_mő?Kr\D`,\nł’í<0w ôjŘS÷”ŰI}ćčűę7˘ćôŠÂ®ëş®ë{FaRy/Ł~rę©Ň-]H{Żvʱĺ0r+ú>=Uą§W`u÷1÷’Ë)íQ…¦cĆćŚ@ˇLzËi0ó*¤ťĽÚľÎüPŞPÓ˝IŞtuP{`n¶‰Ź[*ŚlĎ\ß“©i&`>}ÜŰżĺ¸8sYî€YZęŻ˙Ű·ůuę5á-0ľ~jźÓ)5ß™¦pćŮÔžUBĂkzm…iµŐ8}—0]8˝íÍűÄÚžGT+gĘ/]7!žčŚ›ű=ĐJÇ7*`EL»UKsµ˝…ŘLc>iĺöéęiwµD“ő-ŕôŚoIżSÁ©Ť¦®×ŔËă?_ożŇS¤' 쿦×fËĐ–KÜ1¶6-ý Ě«EŻ˘žäj›žaą5 {,9cÇB”EÖ—›nˇ›·´Ź0-N'zrŞfńËgĎŘ=r{“Rç5TWDEˇPŤśů}›{bĘ^|µY%ż\Óů°^ę(}şşÓů’Î…Ą› amzUţG1ft9vgbSd¸Ŕ•ůs:N˘kŐI˝ĐKŰ•OrJď0¨ő‡­‰IMäCŃýËż€ňćmBvľz—ž˙+ »®ëş®ď…őý -Nűä Vm)•­<©f \ľţ Ô·?ĺę.} Wýëh6%ЬH]&Rc5·€ÓiÜÚž+Ŕ—·@°Ćě;`~ú Üľ×–šy™qV7ŢJń—CÓ#§śR/_U!ź˝p„é¶fľťč©Sý‰b4ś’?wMÚ[äˇcł#*†ópMEşÎM»KčRH°ąýLG)bęĚqXΗO»–Mµ„/H*'q:j$´>ÄŐ2˝~H×ŮZľ'áŻ]ľţúÚ[`ŇĽµ;˘t^¤‰™PGs&Łĺľ 6éë‰=…ů^łűĎŘ1±~b9+Ôۇtďl ĆŻ€Ż>’R “JĆ )ÁB3>!ĘcÖĐ‹c’ĎÔK¬/€YůäÓFĚJmÓ{śÔ\9­‰Us’ÚÓ5§{çKÝqťŠt÷ÍSˇľY®R“&SwNŮR7žkďóIHs˙ó×˙jMŤ§<#¶v"ËÎ*2}ÇâÓኜÍ~†s>“Q•î+ÍÝE._^ý[óÔíOD—Ëpöm –ç!<:á5Śę0ÓŚX鯚íšđjfŞľ‚·$Ϧ÷é{@Í[Wv]×u]ß3 kÚ÷éÎ|H;ŞďV`sFexŤŇC=üDt–™#Oč¦ÚŰ·Ä^gíÁJJPç`nßUnŞH^‰ýŐóů+ŕ·ďIsL©xCÎçŇyľ°śx150LŹ@Ż®iµřTo‰±L2^°?˘«"¤¦vnăw”[ë˛:)Xnę`8ý”Ť®¤^ –p"őK‹‹Öޱ^Ą8Ů=pyĘ•jT:Ĺ.a1·ů ŕśúĆż&îF“Vă_ÄcN3pŮ˙´oÂX'dg>»y*ˇŞ);ěÄYWŤ_^-BÇĎ€kď ¨ä1ě_uűQýdS?çęłAéošĺ-"ç~ vĽ3şŹ&  .°#©ę§ś–1ťż\"RTÍY‘dłéËď€ßý°@CB”z”G˛ŔďV…8dmj.qgć4°™~Y•bťtu.©nňgÄ"ŕ=X>w2F.Śô޶ŰŔţëżU˝!:OW÷?$†QÎâ9¨/b&ş>,QĆ:Č­ĽN·fDZż2·ŻJÖŢ~‚ZµtRs{Ż„¸÷@»»I,ęňžFĆ<¤ß>«a‘ĎçŰ!ńăšTÚÝ7Î.ź®(캮뺾sfť4 VĽ]“TZą·>Ţ?ˇ—2kLčĚ´ČJŕTÄĺ%ťöĺ¸,¦ś: Ř„,öÁöRSşçöCťź Ë3šňÎ&íoUłrń+56Ţ­ŇÓ%Öš;`:<lßŰV4BË#¶ËÚ‰'yýo» –!ă>eęË×)W©›î"Ib,ž…yĚłQăą,ď,$ÖiĺGëŇżŞ•Ą”(S--’ĽBîÔF¶,Ů ×Ţ&ÝŰýćhV·Äd…y>đ1_ó°čŹq·@čŹ`˛±jó(” *t©kĄ§ą†Ë30ń#;˘»ÖřÝLőxšâeLşPÝýL˝ýŰÄÇŬ‘ŚXĄĄ’FĎž%Kµ»%fŐ/ď ôŹ^ydöŽé TŻ’Íĺu>P[‚x˝¦¨×ÄŮÜ$}9ąçÔć}ú@XXź–ť!ę6Ý)S)ÚąAy¤b*b&˝ć†1ç6cßu“30jCFËWĄ’ Ąf]¤!]C©W5źš»„wŚă¦Ďç-rňťť ( jv€źg`Ôu{¸ě'µ„Á¬úś/§ôîć…Űár|ęÍnńe•}ÖBPŻŻ(캮뺾s6 ]Ú 5´N·é7>}Uę×ëĎ Ýý(ÔR§N=9Ë•ŮŢář•o](ÜiĘłSWY‡bşkü.Ďł¬!YŻďüśöCżyŚĘ-P’Ä8ÓyřŰ[’~a˝+ćś·as%źµÝÚł”˘a9úeEśp‰Y(Šđ"Nôş| T«p>~*í·¶?·Dm´aC)_4gTžş^˙kU>˙»ˇ6 …¦\ý†ĆËTk`zŔ%Ž˝ŞĘ.6NGďÚŔôúT÷RBź€q˙%!SN‰3•&K”¦3 @Qf=˝Đ\Ś~^<§z OiĆÍĺÁ%ýq<ű„§î m€Ňv`ĺOŐäśańD XGá‰HkÍÚŚÔšó3Do@ˇěS1tšŢf S·´’{Ěsťĺ4|ś»[ cM'ĹĄÎ ^“kŽ?µť‰ŽgíńEş’ĘÂö_÷†Ř2.=Ńłá”yŰáň%¤ąůbµ صc–,´%…×ć…Wbú›¦~ŘěX|Ńy:í ą#KGě’ŽĚî…%¬˘FLŚŢřň‰Řk1/Ú tćPżí4NÄ\›ŤŠw;bsÂ…]×u]×÷ŚÂJ}łZ‡Đ ˝ĘúGb‡ťőzTë{bŰťWţŃ3$‡Ó#P¶÷yźT†·ß¤ďďq>őĽM?yşH]ĺiřBśŻő:ßČă®™ÚřMֱȟ2Š×ľůĽHP*3Ž›‹<—´ěYííS”•ú»´wŤŻ/€_ßóđ ęôöąďZHVîĹşiË}v—×G n” °đ˛Yęinş¶ľhí]b ©¤¦Ë—Żs‘¶6_BţiJQ2Yç­žÆÓ ź§Nť Đż~Öo˙-a+›©WAn5©ś\Ţ­%»,Ňç+ŕ‹ěÄ,›:_auh[ƬʰD_1ł/@ąąč:°¤ëŻZ˘M˘ĄR§ N©Ľ¶ĎÄ–Fë…Q¦D›6ćľCä”4aaµ@F“đô D-kE8%ôm™u•ţ[3ý˛^áň`µ!NҫݏéšOšuVEFÜęIŘĽ'v\«Ë"¦wäs†şĚ­ao`&6ř¶ŠfL/ź·Ů,Nuë†ëëć>±şöIÜ˝OxÓ®žŢăź7a@sÜÜs/OčmÂć±ëŔĄ'\S]×wŔ¬L@†ŚÔtMs8ç"§‰)§ż”߬۴çŘܰn€Âv¶Üßcm1ŇÍß˙>ýO X­3Ë ěŕňÔŐ9é°ź€PI»×'ÎQچôÖB˛ň¦‰ÎG`őö0M–ţfŃÜs•SO4,WoĘVÔ…¦şnĄ^Î č÷OÄ9—ž·ţpę7˙GâąBČMćŢú®V‰%;3^ŽDĄ^Ô”ĎéyŔ/4›ł/ů.ňĚTÉ®®iâň–,¦îBĎ6áÇáµOL™L_n¸Íö™á[éÇô7…ħ˞Ř…djfčȰPľ=ÉU€eYµň˝Č{[´·éuÎ˙r:k÷@án--ľ%ŽÍyzŃYNŽ›+Śý˙|ő†¨čěĎ{R»¨ĺâ*‡&'ĺYŇśĎýđR&Śű×Äb{á>źôŁg N¨­^]=’×u]×őÝsa6)Ňézoă.UÓ¦Ŕv{%­¤xš€I Ň tŃ€ş%ĺé·…ŚS¦ă—tÚ§X›ď´—JĄ­éŚŻ+r݉\rCÚs¬NpŇ«•ť$˝»tŐÚt•Gf(Ň-Ú řę.ăJy ¤'˘¨ç„ŚR›Ó’:ś×yÇôz6™)Súř”÷ŔesŹôâ rxµĹÜçkRż!ć@•7k`Ţ?ĺć 0쿀%UH‰S [)Źi<$Ô|:ś€·o‚unę}• ˇH=UrPµ{`zůp«· uę9±„)ó» ˇďI»şŐú,4z®Bł&6Ů(±#ěĘ݇ĚčÍÝńXݞľßÔŰ–Ý>§Ćc8¦çPOšćYAs±r›™PŞî`Qăá¬ôňň hVĘ_]h¬B|ąM°°ô˝śäe3ÄąşÇ«»źók¶T‰ĹąÇ7 oă: \˝Kź#Sqöę ĎůŢÚ*»üąžsf†ók`:˙AśE:;µĚńq3¬í·ďÉA.ĹU•žIuŞOC¬oާ§Ď@Sţ1Łyŕ·Ę&ű Qžvťl6@u˙Žč•Žh±Fu&y}.ÎŔ¬Ć)!¸ë·řu]×u}żë˙7„K]Ť?ʇ‹IEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Wood/images/preview.png000066400000000000000000000256431361462701300254270ustar00rootroot00000000000000‰PNG  IHDRddG G7{PLTEđĘ”ôŇźöÖ˘řŘŞîČŤîÉ÷ŘĄřÚ­÷بôĐśúÜ®öÖ§üŕ´ňΖîĆŚňÎóĐ–öÔ¤řÖ¦óŃśôΖíĹ…řÚ¨ôĐřÖ¨úÚ¬řÖ¤ňĚ”ňĚ–đĘöÔžđĘ’đĆ‹öŇžúܬřŐ˘óĐšőÓ ôŇšôÎóΔňĚ’ňĐóΚúްöÖ©öÓ ôÔžôĐžúÚŞđĚ”ůÜŞúܱöÖ đČŠđĘŽîČŠřÜŻőÔ ôĎšďČđĚ–ňĚöŇśđĚ‘řܬřجěÂ…üޱřؤůÚ®éľ}đČŽű޲ýâ¸őÔ˘öÓ˘ňĘ’óÎśńĚŽîĆîĆŠöÔ¦đČŚňĚů۰íÂúÚ®îË•ůÚ¦íÂóÎ’ôÔśôŇóÍ’ňĎśúŢ®đĚňĘŹđČ“đĘ‹ôŇŁöآęÁ…öÔśîÄ‹öҤúۨîćňËŽôŐĄîÇđĚđĎ™ěĉěĆŠńÍ–ěĂ‹řÔŁůÜŻňÓ öĐśűŢ´ňĚ›íÄ‚öŇšöĐžőŃ úŘŞ÷ÖžűݲďȆúبôÖ˘řآ÷Ů«řÓśňҚ꾀ńË—÷Ő¦öĐšüÝŻęŔ‚ńΚňĘ‹ěĆđΕńÉŽőÖˇüß´ů٬őÔśüŕ¸úÝ­řŘ®ęĂöĐňΑńË‹đĆŹńÉ‘ůÝ®ůÚ§őŐ¦őÖŁőÔĄňČŚóÍ™óÍ—ďĚ–ďË“ůÚŞřبůÚ«řŮ©ůŮŞř٨řاřŘ©öÔˇ÷ÖĄů۬őŇť÷ÖŁöÔ řئöŐŁ÷Ő¤őŇś÷Ő˘ôŃ›öŐˇöŐ˘ôĐš÷צ÷ף÷Őˇů٨öÔ˘őŃ›őÓžôĐ›ůبřÚŞř٧ôŃšöÖ¤ôŇśůŘ©öŐ řÚ«ôŇťőÓśöÔŁőŃ™÷Ô˘÷ÔˇůŰŞř٦őĐšöŐĄůاů٧÷Ô öפ÷Ô¤ôÓśřŰŞů٦÷Ő öצőĐśôÓžř۬ůئńÍ“řÚĄůݲ÷ÓŁúß±őĎ›ůץőÓšú٨úÚĄóÍëćńÍ‘ů×§őŐž÷מöŃźďŇůްěƌ⺥% IDATxÚ™‹_םöG„I–„Ćb4‘%,YęßŔ«Qm6Npm’mĽÁYŰIăĆÄ›TzÉ»ěÚ»K·čĄ7bąl·Ť Ma‘4#‰™HBŔ  á"._°;´Ć¸o6˘¸}Ů˙ŕśó{~ßçy>Đv“{}ô86N8˝4S ;‰6ä"m/ ,#W^\táĹ«•/Dí;xz2Ůܢ,+BäŠPsfx?í›Lr]Iş›O¶›n. ‰F‰s2Č)]¶c]=\ď’~´$fĚ^ĆŞ}·}Ó™l.ťÚ ¦ó(Z±e%ĂQřâŤ+ŻÉn$äBŻwäo…wń ô sGF<ĚQx-7Kz’<ř=GL-ü¶Ĺł–ÔŇ\˝ó ]—I‹ö˙h-CěIĎZ™ćÚ̡ߍ†9IĹ=^Ż»”9TMgĐ9g±ĘńÚ©¦ě×Đ1y4$ˇ~PžtŻň|ý&l¤Č5ßZOŘ7z}/ŚFcđAeUä%ťt9“Lť%˝Ż7Ŕń“šŰ-&A˝ćßvŃVľžŠ”zűą¬¬ß 8ŞżUŃd(®lúMqö #ˇŢ_B)/38Rlb'/ ţ>gŇÉî$č_X8 Ó0Ľ—ŮrkŇ&éí7-cCá©’ŇdĘ&%óŢę Wú Ĺ‘r×ĺ—Ęě˛ă :sONMż<5560&ć” •Ľ¸Ma" ´űŰO# Ňěč|_̇E+ŐÉúL%-ő€NŻKëěwŠmbńµúôí±ý裬T°ŕ/}ä§…ů3çǧ(T¨Cś\ˇjçËŮČy€PŔŞ^ߤ6‹”m3źQµ=_,ŰňQë´‚xff’r˘ďŮ×G‹§@qn –@f0ć޸fbkÉ”číÖ˙–)±µH¨F¦Tó^CÚJjĐĐ.'Ŕce ŕJĺ óo.ęf(­Y(ÍJ6ś=eSqâidťÉ”’ÂÇűĄe+<ÎÎń\ă¦ä(ĎÂ+o{ľ_!ćĂ>*C$÷‰,‘2t›©f˝ĎQYtiŃLßú@Â+_e› DńC‘wůeđĂÜS!b;óáH axś[ówď&ĐxśĄ}É<ĘĂEś ðý[úx‰¸Ä“Ü~ź•ČĆcµnďö('ŻócÔ ™C‡ŢOµs#ÇučkW^=űńž·ďc~şşĘťÔĹ;á6ŰŽi äK‚äHGăQeK`óä·áIŤ«ZŔ¸%‡‚Á8Ďóq€św­ů®ŹůÝ I1›ÂÚŁkÓ9¦wHżwĘŚľÜt9p‘u@¶i.i]% (aFŤ„€ŃŇ +¸>F’Ł>/ŠÇÄĺayfĐKş–§%x!0PJCĐę€nźOŻçZőRăI2ű,č·e MöSňŢ«Ž˘ĘÂÓ5•…ĂH[ĎLĐ#˝Ě¤ÁÇ ˛ 1ŻđIR>Ý÷€şnD ¬ĘŻ$­ĚuôR 9‡°%É{z:#©,A_KąŐ(Îb;·ĐşŁ¬ěB.¤űTťLŮŃ+•¨©¨Ň,R܏獌ąĘKsÍh"ÁZ„ î}/ÄH+$–ôŤ.ć*vĐÜţ^m@ĘQc®Ţüđţ±Qŕ­îWś/¸nŐ3ĺÎȑͫę÷Öú™ě’qç ĐŁú˛Â˘Âěóç?N]QÇä5M“k ńö&!f 9ßVżç˙ťô§ÍĎ DĽĘ…ŔÝŁ%ÔS°k‚îKş[¸ Űľ € S•őŠńčG?:€ČYGß–ÂSE^ţ¬ňçfLLi:Ç­×ŃXl8† „ZŐGSx°%J·©*¨lË„â&he’d©‡¦’LO[ëN?M˛Űs~ čÇ4O\źĎ—JÝ>=Ň첿'Ü(áčĎ-ľňBvňËÂĂŻ`‰ 8/Ä”KĎ#QlŮňĘ“"JŢž)Ť°Ś–{ĨËęĐ—dĎu˙`ÄËřXůRDYň/>|lŚ?rü >Ýió”đŇR—®ŁňŤKMě—Ź¸ÂÂÂg·›Ż¤®ç«VĎźŽp(2÷ě„âăjmIńÜ-ˇĹŇăh?s>ĘßéÝ­đř&ŚŔî=ä÷®Ĺµq€c´×—8«~°µW˘ßgqçĘríH/ÔúEáĘ‹çżjŞ”M$†ó ĽK[>†¨ń Ř´‡…‰Aš3Rkěšżă­ÍEa!XAŔ©ĽúĂëIâ1˛|/éBv:w›m, ‚w&)rS–2ŕÜŠÜ®h㸕˘ó5H!zľp#fš€C™·~0†d(TpńÁčl”§­RVÓëdPd®):ŹŞ˘Ő°P˙Ăe«d’@Ó&uĚ&öţŤM˘YĎôrw(Ô}Ët:j]ZĆÚÝů’3XjßáŢůĆ­–(+ÜZK\«TŽ>Ŕ0Ýz†ĘBíPG{b^f×T#M¨’ç+RśA0Ůtż+¦ŽÖŔBĹ‚Źëűz"ľ;Zô¤H5¦”ę}C9źrZ¨)~;Fú†|1´X&}Ьµ†|`ăŢyŹáS@sEĐłÄîóÉÜ+5 ¸ěězľîE[ßëI5‘kŔaą ľIńü|4”ě”#ÆX„ô„2×ćřSµk y¨V‹ß­¬ÔĽGOʵĐ˝ţsjÄťćľ`·ł*µBúŇ«W O"ŽWS ĺ6ŐJ~8™ލcDĚŰśş±7P{IÁ] ]rdĺüŚIEµ4Sü|‹ÓI…f4$î.kü´Č S€Ő; ¦¸íó<A­ýŞp}jsúľ˘ě˘‹żé?ů"ŹÉĎ—†?+OB ‰řš ?*™ô‡(ZĚ,ô,čŐHĹŚ<üG*RÂ0ĄśŔäˇ_WJ?ůóoŢߣÖE€,í[`©MćÔ¶~ţÖ^°ÍľŇ ż†oEÇŇ·U^<ż˘řM±Đ˙*µkK•\„{‡fź«gč.ÖË(oN“>žgÚ›˘÷›†µ5…Ń`\„Âj&šq»É0\ť ÎsÖM*Z»[w7ᛵ„˝ýE ăđZ=ŕ>_XxŠ0;&véLů/ý-[2fź Ä!ł±w3zëÚÚdNć_Š·aőÂU2ůş§Ęş+·ÇŔ®˛‡Ó>‚BqŚiŠl ˙nŐÓ걦4ęřo -Ż]n)yęůĂĽcĹüxú÷ŽćzZj” ę|ŠćŕBr]Şąţz(˘ťVuÇ=¤zĘÚ2€Ť /dň+đ<׹Đ}ŁEŞšdĹy@2#L†lŁŇQÎÓť.ű‡hjaŰ ^˝Uu:[vâĽBQX6ťÎ<–náXŘ€§XâP‹űZ2>çPóĽ ˘x4ţëČ?3 §u çkçů0ß]âúî¶qFt1»yÎĂđ))ő“Ŕű…ŽG<–ŃŮZ]‰V^Q(^Űc»·_Jg<‚Đuč+DŤĆđd•ó«™ô@ÎęĉxÜ ďÍj]Ň;Zl^fî>\÷JÂČ‹ăŔ‘VĐËůHÍíđÉîU¦Ý é:Â(Ϩ7_,Ě.TĂç›vî‚'Kµ.ćqX°ĺ›Ř±“¬ZS–r\R©ôTŁě4ľĘř|L-Ăż¶˙ô.źă9ňÓťš8u'Ĺ:HŃú›5|ł¶ĺ§eŕ–łS3Ř>×Űż|¸P!W°Á|ZеňŐlWWĆ#"Ńvý”Ä ÷qܲ‹p,d))9ÖÝOµÝŐď썲˝Ű}Ą$&tqŻĹ4×{®M‰'CÍŤşÜv´Eaě—»#Đ•l“#•ő r‚ÍdZôŇŚüŮ<¬+ş?„ßČi4Ž_Î0<ör»Ş&?t•ąd¬·;‡¸˘‰Ú)řÝʵ3>…y÷/é÷v“ľ$sÔRLËM›Xi/P±ŁÖ÷âăm y5än“C±dŔ÷ŤĐ®ĺGĹŢCY…§?č› GŔŃ좨!ŃąŹ!¦ń˝žČÔµÓ‰ZÉĂMwí"Â|°/+@6—xžD‘˝6ĺťÎŽčp"‚ú ÄŤšN›äŃM%9)z_îĹňá8ŚĺµńVVÜŐŰ2ôi“*O*·‚”ÇW˘Ľëß_T‰CrÁĘŞźć‘ |gdwł•×Ěó 7¸—IQ PÚĄv\˝jĚzěn/Df `çz†=WÂ8*’ďÂŞc˝ˇ›»)Đ8„IčĺmrąI1°é,`s)ŽŞúkqcßŘóLřűCŠ® cĽ¤ąY2ÖHkvOę›˝:tĄLDŠUĚ ŻÜV]Łţcg’zm黦Ľé]3oâă±ě ”÷ٰ][’fŐcŕnóŔJ…ĽžžýŇ8;â\yÂT”wcócŚF26ËĹp^=x@ĘĐ2ŃLĚUŢR'‡*ĎżZ–ńv˘™‰n­Ú{×Öĺ˘ü|vŽëŁ\ÍţŹ7m‰™××_D!µJmZůH0Âü¨É‘žÂ• 3|\˘€ąZGÇŵĄ‡dš-Űt{P¤kJíÉ!jNś'TQ… ˝ä< µ`uĆŢ ç%ăĚâ  ĄÝŕMmNg}XŰ\ň’޸EÜŃD{K–/lqéă…É O\“J÷î݇”tţó8Ýôě»úEäŹďÇŐł[o›.fŕMly|ŕ*SŃ'MVË}ý6LŠSă qŔ-óJk3śź“›­{t:·%ב€˙ĚěU¨ůtáŮuůýťrég&‹„şřR"Š“Đ:8É„+LâČšűaQt—_î¦jźřS69` iÚo®Ź%]‰üŔp‰´x’-µ´ÔWbMňgI¸ˇ3$]»:rݰé7đ1Ăý|9ÜŢśl™-x—ʤVRT`"AÚ=Ü•Ňp^Nśb©—0VëŘšż”ŻQÔ áî±"/´ĘĄŁľ{Ű­ÜřĂř3í˛K‡W`NÉj4ž3AĐŻc,Áůô“Ŕ ‰GYŃcc~ß-zÜI“©#JÓ-čŠ)XýVpŇjťĎé‘<üRť2â»řßµ/JÄ#`Ü„–ÔÓ˝krďQGŞýív7qwuÜŠĽZi6gyÓś/­gV}qŚű¬ĂD'cgĆr|’ťÉźűäiČ-¬ZÁł :“â3BŮBţ‡QŰ Iű޶řôŤŁOZ\>jłľÜn+ÎEŇ>@Ž#˙Öř:›Pęßü>&šM¨`&›Ąá»ť×ş¦óqĆ[Ç4·p|ŐűĐlĽď¶©iX…öeî0ÖŐ;®>đ3D)·…î2 Ťc°N`ţŘňV`p/ćD¤BÔ=´=CęyÉr˛8őŠş(Ö§ä 7I^ĎÜŢŐ+$»fţ9UĘ•ho|i=âMĐ6Ç?e-xą×ű«—#DßxČĎŔ4Żx$(°Ţ˙V¤Ąů®Ü=Öl=¨Ë•A KłšĎś«Ľ(űyĄĘŘo±Ä—ÇzY,N®Ý´ődŘŁőqĽ^t^‘˙[đř‡• ¬Şźę‘†ŰM!ˇŹćĄSSů„k‚ŹJµÝô¤ŢźÂ,äL÷r¨\W9]â?˛« Ż ËůаqÓŁ)đô•÷T¤÷x)eHi1Âó¨E;rŔí÷ôŤŤÜČ ş¬DrşKŢ,­$Đ·ęŮĚóÍ”_¤4SG h0°0+ťPěĚ®ą[ó.lȇ ÜóŔ[Ú3ŢLśŇ°ôéĚ‘qzw7boH-6›–—±~žĂ+ó^…S6ę¸PůG‹A|fpŚűú~±ą¸ˇ †ĚŽşô´=‰ÂżźťČ'8î÷ąĘsňśRŁ(rCZň°Ĺ? i20[qţź2ĐKSÁeđzŇÇěĆCťŠW'ľŮ—ŕ˙7Hŕ­t\÷SAç±Gšž5.¨u Űt@^<G%éeM â"dS8,;Ł)ăš›ş7d nňR—ôîćr˙5»ÓH'ĚMç>;ú'FOUyz(îlQ†sz*Ô'f’b.8㦞㭠߬_µ°1hGVÜ;K–ă_–ä?QZ]“­Ŕúaxçú~/CI¦đ{tSúĄJ¦qź€+‰¸zB¬GË-Žmd°ś™ ţNm&8Húë݇'÷Ktv•˛2âÝ ´[Ü ŢůéW¬(7PúßëmŮ…M'k„ÍĆ+7µKR¨_bϵ|HÜ­ŤĐĄ ă§Cy6Nď]BăGW{ČFćHŽäć›&őĽĐ‡M‘ĄQagö¬VĎ€ Úz˙·x’ßÍ8€{lŕ~ pf1ÁöóŻAŐgź±ůńáü8çmŢ÷sňÜŔúh-6Î'×üĆł_>żÖĽă54ăŤé,0"ŮDÎőŔD?…-NíĎźÎu;R žYŐR Wňy¨Ůă±ęPy~ś8Ěň§,6m3Ă5H8 Şűˇd+Ew:˝¨“ß«ßÔŃőĺ)±=f—ÝŻár-5ôöe_'Mo˛Ź»)çĹ\itY *M6Rˇq řĹĽÇç„év˛ ľ,˛‚(n*žUG{q–8k¤Ěu8‡™ç"Ćő1/ŐŘXsÝßöë_¸"M¨cĄ8ď*éő:«ŔĽ!±Éq3F6J¦ÄďiäO3-»ÁîčgţÁëŢ~ŹľŁi86Ü„ź!ʶfľzĺ„z&ÁÂH\ŢŽůź0­‡(FKq<–CK/_&1pęâ‹ÖÖ7DleŸł%e9\‘oxĆ ‘^›ŘeŻ 'Ó‘±úđ‡‘dwŽ”šŠ>4#v˘É¬ůô/?.¬†ÍńŢł,ÇŢŮ|L‰”j Ńü@ Xu• „6›[€Ü]Ţ6Ľň“c`ć8­L§ňŚ8q\Ô)lÜĺ{ë»z"ˇýó.kiÎ-Ťpž$3Ú ű® ›  ÔŕľčČvÔýfن•]Ďý_ă¬7ź^Gň3RŘR?ěCˇâOEŔ…Žv»‘Ůšä&S8ŻS$vłő„Tźhâ7¶˛%m€Şddż–ä’”ŢKµüw{»Ăh4XěŇ,mfńWekz<«Ţő=ť‚űO†Śđd …?Ś|˘ý$Čc¤ń|e»n©ěÂĎ˙ńD"]$ GHi0śYńĘłP̶Ŕ†˙)÷yŇÄ87X˛¬Îm…E őĘ5&8ń’RR—ć| Ţó0˛ŹP^EóK8Z„\Ó¨_rŰG‚]Dtwí7Ů‚Ľ.îń'$ęč yPŔđ-o•K´ĺßůÇ‘-úş¶O@*ŮńŁYѦšBH~JݲMÁpŘĺYŘ>)-mž‹cť/EôĺÜźyŁ÷ń•öG3'+eme oçTýd0Rlş îVpč±üM޸’d&§}Ż›ó_ËúßhULôKQ} 5Ë‹Q‹ 쀥ž×ŕd2Yk3ł‘ńđd2čĂśKŠ´“łŃeĹeÂG}ƤoTI‹ĄŹ‰şčłžńˇ<›(R®‰˝ăÜë Oq`őHvšÝťü­{­űĄ–-4#ĐĎ®¨TЍ)çř¤VÉëÎl3Âú-éšvD|/VÓQYtăŤĂHńEŃ/oĎá$Řs+X6Ĺ…č°ŔŢîŻ0†®§şí䦏ĐűJÖř÷÷Ď7˘˛ÜöC1l?sôęţW&ÂpşÇ6ŃŻ0™¸” żO±<.Đ)›ůŹŹ×ĄVÚOŮě2ł9µá˛S™w»qŢ;ىڒwCÚĆůGĚe#1‡!†:(ŻŚĄç870a»"Ů˙{u,™|€˝·ą>tÖť9 ľ{uČgL殹.¦ÜÍÝđŠĄ"ŹjşAp1cHÖ”áp±ŁíĂé¬÷0ănëŢ‘Ş K°Ć.ĂNţÜśĘQćČFgI„ŘnőčőĚCw v@ůŘ Ű V+_V! µŁëÚŚÚ‘`ľSa·ŁđŚ 6T»µ^»%¶YSk^4˝!Ë^)8ś‘µ Ěä=ž}Ú)Ó…ĘaŇF´č4ű:ńa 8Ř|‡żV  _·üh—hŤe1[‰łąŽKÍD§í>±áaçüFă-?k†Ĺ^:š˘#Dve‘*OÚ/<»ĽŤÜ™T>pQ¦~a(°%đ-yŃ•‡}€„Ć“;ŽŤzú¬U : #ç¦CŐńř(óXq …*…‘°)&¤OnHµsČ5Al”‚)á­=đą#Š•†âBŮO ®®mÔ>f­ľęľb=NěŹ~ůx§ßśÉyqg„Ηϓž‡ă«I€§…6Ri˘#­Ë;ţm{aRžÁ&™3(4-jÜď¸ĹÉp@?ţ¶°˝@÷ălčxŠ~ýĺWŮq1]JĄÔJM,VßďnÁ꼩ąđŔ’˛ĆŃQÉĺÍ˛ć ‚µŮô4ľÔ®€TWąxĹmiź5Ő &Ć8ĂF6s„; u]»Ę÷*ÚÖ‡—-ąŻ­Čłs;ěVůůŢődބ܂""Ţ%Ƹ(´1s3řW94Ţ›ßěö>ç<-i©g+—Â=ae¢!žĂćic|盬€‚Ć&ÄŘ’ÔFol߀‹evôŻß~Łř¶ęČ<–G’c_{i‡âŘͰŤYmh©GŐ»tčĐ(/MŢőŐ§üyxłöŠŽ‚·vě@$ß1»‹€ĺ‰ö Ę+ę\rŃ5rÔŔÇ_ÇÖcäÜ…Ôö7d¨ě'÷Ź’S«j¸Ľ.¨äđ=ZR¶ŰDNĐY +`ŇZzëZO ĺk:Çů˙"‡ŠDGéđr{5 Ă5ЂӰśoË‘:“ă—ď¦:rS<«ńŇ·‘ŽÔÜsĘ.|÷ b•ʉ¤ÔjëůÎľű,ľ’Dá¸úÍ(¸¸˙]śRňwܤ7É‘ŢH@册‚6G*q•¶EŁđ©üŮł †ÓŕR(BľÍqřŻ÷şÔ^o]~ÖÓý§ÜĂö?ůŐ§ŠżýSë`Ř) S[41-ďś~Ó6Śo˙jxűü WvŮpŁ?äýµš{ÚĹ<—RYé=p{Ě<ű_ćęuy´§Ť)źÇÎtéáT6C¤Ţy=ĹČĆ—x÷aŔ.;w 8óˇĺH7ĹÍ)#OýËcKŤüÚ“ĐÝŞĐ::´Ż×Ç4L–rdŮgÇ:€¬yçpâ†gMn‹Â °…7žŇ…Ąü–ŚŢPśŞ X^d =lϲO /´j•=ďřčQŃ…±¶Ř3ŤřÍ]ę7;Źq›Ë¸ćyáéîůÍdë_%e:Ä-Ąe€hi‘Ć'®´Ă_•±„ö&7*RŢďËa¤îöX~Ěâä0Ś]Žďůđ{řçMPĺqĐĘâµÍŇu‚íë…Ú8ß/°íް¸ŕo†ŚĽ¸!c«tÁóţ’?˝ţŻv 2l,’§*Žú3űî‹ ‹Ô+ŰîĎÄ[^ݍhµă.ąb&0{ăą—.Ů+QŮ;?l;"‘Š/ÓďJ2»Ôİ0!ÜŞ¬^ÁzŔŕ‚čPÜÖÄĄw1὾'i2‡ĂłŁ†°Ëłxc~Ľ@vĘdîŘi‚ p`(lÄťgJ]{ µĄ§w"0Oëţ÷ßHv"íoß0®ćp˝OÓ׼3˘pżˇw‘ĺ7­­ÁĆ;€bb›íMî_“oűĄA­Č?Ź6Ĺ a•ĽÎ:ŕÂ|Ř MCŃźPQ‡—‘Ŕ¦Ĺě˛Ţź牛7”mŽ>Ő~2•Rňáô®§u¬qéĚëÂzöÉ{ZŢľXK/:[4RďĐxł 0îŹFPŮňQźFb36©Ź:ý‰ŰśS…u´ďmRD1Ěčă*hN”vu©'›R§ł‘ŻôźŽ„»Dx§żŕ‹Ô˝žge÷ŹĹöď Ó=#$CkŞ.”#J[±ĺŇňŃÖŇwžośš­6˘!w©T´Ń–¦ÔúQx2Ĺ©Ň<ÔĄčpŁö†ÂmhÇE<Ë×=Ç”ŽČwÉ9ű»ĄµÎl~ăĐ`ÜĎO5uQ>íŹPá í5Ę ţĘň•‘3EłřŮ+H»c3~MĽ2/Ů—ŽVË ĽzĎMďťÜ•˛l7z@VPş[ăłD·Ěq[{\č…{SÓ‡˘őX6`ů§»ŘÓ3k ĎăĄ#-K2Č‚ÜX«Î@W»}÷ÂYč®®l†PĂPEç's4č-$`T]އqQ/~0M–š[¤CÝ'âÖnNZ›|–oŚł€ôst G ©…ßNegó¶´©é*©÷räŕ“´Ž~ÎťAŇ€ňÖČúζÄ3č×rľcü‘%’Ä3kőţ´Žő“-‹*6”wüB‡Č}h¸k#oýfíě, CĆ9š/ˇ-jÁ×°ŕ"ă„(}tÔ#çĄv…AçôËŰdÂ\j`ÂĽrć °˘zŇ›9™ů>UĺÝDîgĺÔŢ?őtۉłě^űTţW93Ž,eő-&wBŘěRÁ’!3–Sźú2‘Ŕú |V’î Ía»ú‡ŔÚ‚ ±kŽŢů›p“Éě tiŹWt*1ŽWÔ9ńĆ'©:QumŤĂQś”ĺvT"mçţŃTkąÚžC˝W>5ÔŽýÝĆűř—Đô üWŔ×mbbQäń4´·ËS§DÇwüC KYďD 2ÝĘ)ó}ĽRŻrŢb±:;±˘č‡Eµsm±»qťid–ť/Ú9>F ž†„ł©ăŞD^—rĐÉ•÷†?ť2´őźÉÔě˝ő'iLůGFî®ďÉ-Ž?RjŤhł§ű_sž‹í–,—ŞDţQµÉ™3‹=vË.9ŇdŔ‡ĂI=Ě‘Ż/Đ<Ĺß©Yšc?ůňgŠVĂËŔ?ú—ĺmĘ1†kÓ0ú­©K‰ŮuŔPą‹“@«„BeŮ=‡3űąµÎŰäŤ[+ĐN˛u«ÉđŠĆ/ąÄ”ýJĄÇüőľU0}ł‹}>ľ3Żúôs: ćÄT”őoŹĐâ´uËá\ұĹá<2Jf"µ>a[Ç7‹ÓK8-Áq—Oő«ĐąR~ö;Ő8€ @ńž¦ĘD Öĺej÷Č{Ż*;ňB#,SR-„’° 0~ŰTK˝•ńňt¦ç·©Îd!ZýˇLÂMTżkęŹNĹ ëőubɢ1…TĄ,[Á”熸čwîYZŞąmOŮ4¸–îe6SñʏąYqŢz7‹iâŞ7yÁ‹u¬bš$Ąýt€ô—–@ZG]˝ĘąŚąiÄłhtÇŢ„E⌊{ϰ%pH–šF ×I©…ĽĽ©é7.mľUqŮWč6‚áFą`9ao«ü‰MŔ˘4ř_!Y)Á/ý+çE×–ś32ÎÍże“Y`U^Ś€ěÜQ®J”íh7™ÔxJřu”6 x»1:/ ëtrC¤^`‡ŕTf7tś+€U ŽI[ňM?Ď=Ž âśµŽŁiŽ;2€Ýi6%D)šŢńcÜĎr!ŁaZ€‰O[ł$őCH.‘Ż€ă1cƬđMa6C×I%w€gÚ›”I“z"úĐ.“ĄŘv®#µM*aćÉ«š!kÚ.Üí]§CĽúđFNň©Ŕ”AÁť.żź Ţ0Î Č`Ś™ .µńÔ®#:$cŽŰ¦u !ˇĺş®dsjĂ„mÇ"ă&˘śéÇż2]°źü‰L~Éâ…_$/ąĆo_„®^éŇ'a|—\ů.Ŕ:ÚĹH©ÔDZÉQĐů˘Še´Y–Ó€«ďIăM?Ü ±Šh<~ß Z»eĚ ¶:•Eemíu˛6jĚ넯üOZšMýúą7ŤĘ€·”±¬(^~‘Ś%C4/Á~–ěşô˙z#t˙`rÄÉIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Wood/styles.less000066400000000000000000000033071361462701300241770ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #F4D59F; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #000; @loading-text-shadow: none; // LOGIN @login-color: #333; @login-background-color: #eee; @login-rgba-background-color: rgba(255,255,255,0.7); @login-border: none; @login-border-radius: 7px; @spinner-background: rgba(255,255,255,.4); @spinner-color: #666; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #F4D59F; @dropdown-menu-hover-color: #333; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #333; @folders-disabled-color: #999; @folders-selected-color: #333; @folders-selected-background-color: #FAEBD2; @folders-selected-rgba-background-color: rgba(255,255,255,0.5); @folders-focused-color: #333; @folders-focused-background-color: #FAEBD2; @folders-focused-rgba-background-color: rgba(255,255,255,0.7); @folders-hover-color: #333; @folders-hover-background-color: #FAEBD2; @folders-hover-rgba-background-color: rgba(255,255,255,0.5); @folders-drop-color: #333; @folders-drop-background-color: #FAEBD2; @folders-drop-rgba-background-color: rgba(255,255,255,0.5); // SETTINGS @settings-menu-color: #333; @settings-menu-disabled-color: #999; @settings-menu-selected-color: #333; @settings-menu-selected-background-color: #FAEBD2; @settings-menu-selected-rgba-background-color: rgba(255,255,255,0.5); @settings-menu-hover-color: #333; @settings-menu-hover-background-color: #FAEBD2; @settings-menu-hover-rgba-background-color: rgba(255,255,255,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Xv/000077500000000000000000000000001361462701300214465ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Xv/images/000077500000000000000000000000001361462701300227135ustar00rootroot00000000000000rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Xv/images/background.jpg000066400000000000000000000205541361462701300255420ustar00rootroot00000000000000˙Ř˙áExifII*˙ěDucky<˙á+http://ns.adobe.com/xap/1.0/ ˙îAdobedŔ˙Ű„       ˙Ŕë&˙Äq!1AQaq‘ˇ"đ±ÁáŃń2BRb‚r’˘#3˙Ú ?ôŹjµ5 '}:ŐÁON(, ĐÎ}2ő@¬3©`1 :Ţ•8}ľč"÷ę-~č$ p}PiÚf§Ä D“gŰNč3śÉÄ u«€KôäÚjŔeŁŞ<>čUkB°Ó DŰ8ľ&bďŹ4 Ă»ą9ýĐ8`Xąő(?g@3‚K@P€\鄨 ń€_cł l-@ŤŞ"ľ$l1«ç<  ‰Śü,âK“†AnDy ěLŽgtFl0; b}|‹dżĆ1ď,,vś ňÝ`DżÍ0‚ÜP:_¦ĐăŞlH©%ŕ Tî‹1FĹ€|ëÉŢávw/ş k?łcTÝ @ČŚe ‚I|e®D ÚŹ‚Gg»€0XĘř!Ϧš ±Bě6°ŢHă6b|Ą^c.‚zAf<dŇÝMťĆP>™1ťGݢ^Jp|‚ =˛ 5‘·4 LÉĐ  ’ÎăÁ[Ř9.ő.8ĘÚĚÍĎöA&¤ ú„…›-GÝ __ü·@ąů ±`Ý&O ;–gĆä~nŮx« ?7lCČÔ;„¶qÔ@€î`Ä€sâžÝ˛ąĂ8ú –C: ŁXs¬0~í©˙!%÷*‹ ‚<ĐW䄇¨Ú)Ô0ÔJŰĹÜKaËśř Îť92tâQÓC[î1đČ(w{@Éi—(Zݱ@ܱ›îPędj{ź$Ńx X9Ž?d h`”u[hô@Řx ,«hdB Č8bâc_$™xl˙éß?Ş 9':ż3â‚{‚ N˙xA#©Ý ?ŞŇ,«;|Đ/są¬ť qČ’rrpÄ ˛ ¬áĽ> ŻŮ/°A3‚ŕyx C.ÎÁťžět؇#/ôA§rݶ2űD±A‡Mz™ĚKK Öť6w9ťOMໍ[Í.KáňA`#\nJtVłg}~ ÷-{T! ‘ş I88!$—¨„AcčÜoŰíаâí„,uĺđ±-fgÉ(€ňYç‚€`†ČÓŃvóá˛Ć0úňt ¤°aÉŽ}Řm7“ xAďŔ_ě‚CŚ€ so ;9ËŔ(4-Ňăę‚nHĆĽvćP@$sŃU«­bPV@-‰`÷ěkíqóôAČ:śpźşíSV-㢠»}ަę ă::{‡«¦ˇÉÉIěőÔ‹^ýP;WµF}ů“Ĺ[şN6F°‚:ŹN¨7·zµ‚ä˙Žľ2#rűkmtA›9ęýX°‡iA@‡bę|ćPhÔ¨ę¬tÉÉ;Ő'¦Á‰ŃĐGwٍt“ÄA@«KŮ8%˝żőéF¶lČ4Ăěřý Ó^XPÎś¸ sÎ@>‘şf¤çć‚ x„6/śDüĐÉË L €°6 b4d—r§(ňŰ*¦u}YZK··D Ă€!Wlű›‚€ÖÄ7´ů ‹V¶łď”íÖAv;vj5%Ś Íş®n“$da•ît÷:zGA0ůAĄěŐŢŁÁ9żTŰ9ú @¸Ý•ݶĉ†ÝA9~R˛ÁÉĂh´H6%‡’ ·n 9tĐjCÉĂđA]ş–.¨0< ‘[unrČ4§aýÄřnpď·Ńxŕs‡[ݧÚÝG#őAďŘîQެ÷n¤ČB ĄşýĐ9 hč%8} Ö«ü IÓŠHÇŠ‹NŁš`k A—E€ÝťÉAUË/(' 2‘¶X:8ţH*ý$`ŤĎę>©g $»gP‚mµ&N¨&ŻÖâHg(5ü#ňąéâ1(ń±°¬ôę[P1ÚąBł˛ Źěs‘TřűÝ]=G«ÓôA¸ÜrĆ Wid8ĐÎP:lŃÁA͉Ó( Ůś ‹1ťP!b§‘·˘ŠË;Ę c·&w”AçĹgó’F•˛9¤›s¨3îeú¶A ÷R ÔŠŚ˛´ă¸Ŕç ‡A˝Ź±ôČ„NçX}ލ/'ó@=gM¸ Hâ z {P™ţ°ć#Áxrd †–9}Kúó@Źp ‰Óš&÷3ť °Śę°; }»^X8ÚP+‚IĐ€Ă@űaÚŘżT‹>®ŮĹ çŐězrPą´’9ńřŕ€ę3 (’!ô”ĹÉq3±éł; pÂÖ7Ő$€82 iÚÖĂjv.K9Đ Z±‡0€Ň Ź– ę$×áĐA­żŽűüĐM{] C0Ř~¦§¤Î|e^ßr ÷,c€tA}Ć=’AÔK Ë´[¸6ß\:‡ű‚€Ž©2č Éśů ,uÓCÁŇüĘP?h-˛ ĂI~\ś×ć2IsęÓĹKa])Đ_¨ŮÔ2 ˇ©˙,ťiVhű Ďđ˙ň90Úá ŮăňA Y˘ Ě đP fs¦üĐS0Ë“žzřeĽPŔFüNč \[(9{€ćfypAlĆ®t“» ˛ŔׂJÍe´| bő%‰qżć&Č’>“ó@ÇS8đń@p8| Ă J˝o&¤¶ h1Ţ˝ł€5@u‚ÇTž v¨÷ęlH,oĘOpVĽŁl Żh’#: ł  Ríňô@1f̸ů «;Ěň@‡Ká´@41Ńă‚,[žś!ŢíX‡ĂeU7ťČŐvČ`—A­mZYi€|P2 «Źş ť`´ ›ŮĐ6w/‰,‡Î>HRb€‰Ű čW;ńŞçúĺµîĂ>PE°q®¨3kj1 ŰDvMőküBňÓ©ŞçBÜMźúí4ŔËA(*ŔZxrääd»HR€xaŤG$Ĺrc\ř(#ąÚ­ŹT.Č2 X°÷~cDÓ¤P%ő8A—lŽ·´îvtąGË’€îŮ; cŽ€vb7ň@Á=…Ň­śŚ@ě͇”0Ř: L5šť}0Aúţ'h;d2´í—ý2ÚŚ Ăż{=ńů pdä䔿/Ĺ…ŤC8? ÎC>OC#–ž.‡¨™ŰÉAbx nźUú\6=Pö-ó@ä±hů ĺ b|‚ í÷ IŘÉćPUéW­·05” ˇÜavCŘ‚fgŸ’gO’ «8úz Ł_|`ë» (H35ĺâ‚ęĚ>h‡Ź0Č&Ćf @{g_^%c«Łę› ŐŔƦ5Ź4Ú/ÔL·íŞ ť–„őÚZ_Dµđî!w$D bĹ›ĄŘg÷@ęM‹éä“"3()ĚĎŔŤaŢ ü:Ű' u IŚłrA}·bęZń/ú-8.>!×b\Ç‹@ŹTbň@łô—ĎJ `ÝXt A;äŹAźwµÖvśPc`Â`ńđABÖ45¶Đj*ÔäÇĆŠ §r„šÔ=ĽP]Ş ú (͢p ł[ †›“ń(*¶z—đ(Űű´@ÝA¬®čĄKi‡ŠQÓ#l| `číçÁť˝žěŢÓ᪠ě hÎľ(ź/$Äü2Čăń¸AbŁ\32 / Ü[,€mwŢP!đPMÄť^ŔoţH4¨éaVTˇ¬Amą =Xţč&Ő î€5¸c÷A|ôϤ†Ť9 :ü›Ş‰ÓňÂZs®x ö@ş\oŁ ‹öŞDŮŤęjěFŘ }şÖ ú ]DŘ—·”PôËyBnc]OOHrÎ6”<چx?öÉAv Ĺ^aô”÷Af$¨,€ěÜĐô“A]ęű€ÜîF}d(I–c—™(4 é©ÔĘ GEŁ#$ F ±me-©vÔěPP –náp’ Ç‚6%öŰa» ]GÝ9.ÂBöµťÜżŠ +Ięf8é;ť!6!Ţş\g:Ä · ű  @‰–8ůę¸:ż4 «‡ÉĹž@Yő1†ýPMűbŰ>AýPs“j9sVw5Żű6Ő"#üĹN °@Č ±ŤöH1|9Ć9ęNÍŤOM­OęrtL0``ů n; A°ü[tÍ2ç@<Đc?Ö5äX˝‰Öú ŠŰÝ:äcâPhŁ_D8b<ţÁ˘Ŕ€vŔ?$šŠű‰ś 35 PCóńŞQÔ ddpAS<ţ P»1ťiZ“«D ˘"3č-É‚—‰dW:řŚ ŁVdń@1$6ą@fw· lA-Đ'öéě€Đ6]é:‡ű´6 NĹÚ˝AÎwú Ŕ‹H2IŽ(lîĐ–o˘~–¶KęJ9!ťÎ­Ş ü—2qdâ@ÓMQrDNP!ó—@°=X<#`ŕČ1APŔ9ÝÝ´A] mî|ľ,Áńä€C†:B ­›‘ŚjÜ’ÎčôA"‚@ś ™y<3S—`<č5©yËy ‡4$äjüŮ –â“K Č„KŰmĄĘن€ ·$ ®ĽĐh 8fß4 Č„†g9@ ľŁ” m¤ BYĺô@@m\c,‚Tľîň0X>ÜĐłř%=l`“!źŹšÔÖŔ‰ä_É^Ľ`ŕéşÚŘ—aWó@wťÁ!Ć<9 ţ ç(5 w:HÎd }ÓÓŹäů@»]Ű[ަutÝ _§enYƸŃöű=gţ'ćg¨d Ďąß˙ źČpÄţ{–2‚ŞX]ő@ŤŤťůÁ8ńAN@äj€ëÚ“®ĺŁHgú éŁâ8 ‡’s†A`‘ĎgADĆ‘>Ť±˛Ş]áĺđí(}]jXËť·('¦ŮËřGí’<ů‚‚oí’ }§FąA'żBÁĐ“ň@jmŐÉ@t‡ĚO$ ÔŚćX”ŢßX@†cöôALĹÁŤP0X“c:j‚™Ć\Ś´DĹ‹Ć4Ł6€ş $ěŔ &F…‚ ®íńŃ{6FÚ ŮÓ; Cí89@ńŞĚÓDĺ€Q“„÷h›#‡Ůď†ÝWé‰c gŃ•Ąż±bqŕŘŰ$;@”Eĺ je¦~h+·Ýčˇ ňúÁAtŻm>ëqŔđ(4¨$íÂs÷(([ú[#ĂŠ¬Ao¨äZw:©ţZhú żĆ,ĺ¦0%‘z—~ˇ‰ĎŞ˝Ť‰Ôhmlb€fP­¬X ä ÚŁÜ&Nč.â Úć‚K‡wÂE‡R‚ŞŔ01Ş é©‰'D@«#a "3ĆAĆČ@P2C‰ŕČŽ’]Ę µŘ€5A'¨’^ $éxgvËKP‘śnç'Ű1śč3Űĺ˝4‚Aµo¦`ź˛ ·rÖÄ< Z˛pCp}P+“bj0ň4@ś»ź“ľč˙'|˝±(WpÄŕ tîŘ5\ôŹDÜ׸!ş‡ńĐľY{ťńBWláőAŃŰîuŃÝËž5A±6v$í(&äő g`Ú ׷ݸi©ţĚPÄÍČ:@Ä€p%ąîřPM„—Đ€˙˘ŃôtµÄś’‚ GŽ4ň@č a:h.\śjçDż×á—Ë p\9 PŘ2LÉÁä‚-ÜŤň*“kbJwµ$ů Ö˝5~«csó@ZÔţ#Ć<)vÔě€' žŘöČŕ‚?pßö.˘‡˛[Ü@×töşK‹Úuş éŰĄqä~…nÝldYÁvt۱göŮŰTřo°s<U{/ŕ9x żĹS^–mAŢH'˙Ď9ŕ‚©Ůé"`ĂZ8%ą ćoqx/ĹiŘ·¸; 6AvŽŐ5´“î©ÁAľ@cRs‚Çv˝ĘNF$ rŘą@Á8ŇY€>x@1b]źT·Óć@úeĄĐ0FHgř('PY¦|9 ÷âž®H_Š–¸çËőA‡p‘\xjŢ( Í`°Űä‚M.şxǢ ĄMŹI¨Î2۵Pěäa"ń· Ů›h@ŻAj± #ذ´F>¨+´ăŮhŮţş ç±÷.‹ ě­XtÎ 8čü;3eÎľH™äó@›Iăä»4ĐoĹPD>čq2猠@0Ëkć€čŻä&MŚpćäéąŕ/ö-ěé3ąÝüťłYůRĹëNHł»l€& > cŇDy Ň• ül€xw<[TŘŹN%^¬ť2ÔśËk™–Ý=ÁëlqÔ Ž×ý}PIµ­bdčôŽAĆ…ÇKčĂFô@?$,Yń0M*‘Ý@Nf đAn*Ty ¶:cNh"Ö8¶\J ČgoN–¬ möA•Ë×|8(+·QJDť8 }6·=Jřôpeaľg0ń‘ö@ôMűÔ#žśg@nHČ`áĐ!b0X“'ěţ;ŘQôA­;v®9zá–›ÇĂ Ö8%§‚Ö>ć $„ ăăŠ3ťN  /k°Ť*ő3äm($™}gćÔ9.j?D/ÉĐe`ž"x  íÔ_ăT Ü3H8@uc¸AAł:‘'A˘1ţ-§î‚„žYßč€NwÜ0Ş ˙ر×^5qaĺVř(/¤ÚĚ#kaÜ ÓđÔ{\őZçtöhA°°u92íó@Ă#L ‹’Î[ ć€÷ކ@‰$ĽŚ2Ř §ŔŐFÄŘ“¤z ŘZ·í±0sÁµŃÚ˘”łÔ Jv€'˘×3Čź)A#şmˇmO·«Ź  ĆŃĆiů Ľ˙uA%ś~n‚X±Ť ĺѸc”'AđAU˝‰2PK 892C‚¬t ‚vٸ˛µ$»0ijňŘʧńŠüĐ# ľüĐÚt@b[—š›č&#‚Ŕ1pďŃ]‘`ç¦?‹ Şű{†ŁűţWéö0‚;xÓ:}n‡Ó `ľÓ¶x }ĚKdóÉŮmśkś|řiť3â‚{ŘńĆPfp9ŽH.¸őä^çňíżŻŮÜ˙ë?Ë:c(9ŹńôĆB ícLkśźDQ }­sđQţ:` ›·PĎ®č3«><ĐVź×ę€Ű™ůü:ŽźőäŐřcFęýk]7A•ż‘ŢY݆G,ęŤ9řx żě1źíś c:Ő_§Ëä€9ę1 ńw@[#8ŃÔł|sAÍĺŤPiVz}«Á_×áň˙Ůrainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Xv/images/background.png000066400000000000000000001106761361462701300255530ustar00rootroot00000000000000‰PNG  IHDR&ëá®dŘtEXtSoftwareAdobe ImageReadyqÉe<çiTXtXML:com.adobe.xmp ňŔ’ ŤmIDATÁÝÚ%ÉÍÖ™Yűí‘äëôc‹äpúwČĎľYźŰvďŞLáµü˙ůňĺÇßż}ýó|űŻ/żůţĎ~ţúď˙úúçŹ?żţűź?ţřúíű—Żßż}ůăë?ţý·˙úöőë·˙ëţřß|ůăŹ?~˙ÇŹżű?ţńďŻ?ľ|ůńăóçŻ_˙öÇýńýŹ?ľüăóďßľüăó—ż}ţüÇ?ľüăŹď|ůţĺó·Ď~ůÇ—ßţőíË·/˙÷?żü×·Ď_~|ţňůËŹß~üűoż˙ůĺË÷/źżýóëź˙ţöĺó~űÇďßľ|űŻż}ýüůó÷/_?ůüçźűúĺ_˙úďŻßľ˙üőŰ÷ţëŹo_|ýńőŹďż˙ţď˙üńÇ_ż~ýýó—?~|˙ţůÇ·ďßż}ţóÇçďß?˙ן_~|˙ţďĎß˙ůŻď_ż~˙ňŻ?ż|˙ńĺĎo˙üńýżľýůăóŹ}ţóÇď˙úňÇďżűçç˙ű÷?żýűŰď˙óű˙üüăď˙§mGŮ:ÓŘů‘9˘PÉ$‰ŚuhÇSůşÇÜě%#uťQ‹ű7˙Ĺmłţs™uç™°Ů=r@†W)Ţ®†(÷đ3“#+îvűei'žÇ.c+é±ýFg¨h\ď˝h`ęđc=dY]˝-<벌ęgŽi(o ­Í§×QżZ^,A„ „lúń€ˇ O÷ôj»‡Ě¬ś=J ňEÍ.˝ü3.&:_Ďřu Ť˘Ú<ôŚŽöH„Ťˇ'u¬î˛úďw©÷Zď€d7ĺq?á!ňÉcĺٱŢél1\v:`~xĆc#)ô˛+ŤÍÂ’›ß/čBÖȵŰÎ§Ăś× őlŕ’ÝŻgśëYR¬ ­÷dýtŤd5!µÝĹD«{›ëőÔPÍ$IŰŢű*Ź:-La%üDWÁż)ňÚ<^‘6fÖ žifµŻ3úY˛ý1Ň:ÍđLyß }%ř×č14Ţ+:%ľ#zi{ćŘWŤĹĆÄ k•—…Ź :ť§0ŰôĽ¨B/‡śďŘú­7»¸z7; :ä¨%ÖŻ×٦±=pQl›‚ć´ăˇcĘÂk(mRĹÎY.uSfĺ`ڔΠy˘*Ł“î°ęJ˛óöóhKŁ®±’Ćx6žŚÖŤU>ÚĎ´łśu{÷¤•ť›r/k …Îl{_´śÖŚ‘uFryÂ;óElüń‘í3şíŐ­ŢČĐ= Ńx±‚fĎş·‰CťÔđG”E«&Ĺ 3˛<gaÔŹ»Śę¸%·xlL%-6¤¶ŇĘAŔ˝"?°+p&˛\őËĚŽ(Ś>Ű*ŕţ+kż=ŕnĘÁíź—ż»1jŕCńaw4*¨‘CvŚÜf˘xŽNË­ęĆžč !ĘöČMEŹwśg”PyŤ˛žŠYĺh>x oř_Se.ďTlBŢĽýČÉ\d4-Ę^<íh­=»Ü¦µĘŘŐ¶ngCłfiÝÖehn˘ 4óšJ6Ž{—áĘ®Šhwl^€ćmŻ[>ÍFŞiűľ´ĹňŹB  ţ{‡9ôŽÓăjÚ™­Ł :ŰĽŰäws/!źkÓýńü€ňęiíohÉÝ}ÁĽüÄąîZF7úĂiĐń]µ9QżĐ”]Ç-Ô€#˘ŃôŇ´š KáÇ<+Ík!h-Ť¬Ý>ěT;‚Ř#ČgăŚÍ_ršc“}®.»iJ˝6r¦ÇaŘ^jăs©mÇçé3»·ŰśűUÝĂ<ęfĂ‹ţNc`şSĺ5QS«ŘŻô¦9ý§M‹źBkÇ4”äv<‘ł‡*…•ŇÓ'ŢĂeŤ‚Ý—{tż{Ę+6Ă5ş5ŰÚűÓ¶hÁEĹŐŹ ^Ćdó8ńö\§?}[˝W–Ő1O¶Fuôě¶!˝—ĂŹg‚Ó`§>şŤ­Ńž~áŔ{Ź4ČčM^É ď!®Ť‹‚űgŤśŻĂî«]çę{°0űzlŹ@ŚţH§ą˛°p—WM¸=á'üT2'4Ţׯ™b÷°+Gö™"˘V•ˇ‡Îő^` ) YXˇQc´† 7 é°F mxOÇH°F!¨ He Y+ßK–ýqL>r´ĆföeÂ:Ő,ši·°#ë8•×äꙸ ™Ć›,ű5nŻnAţµ­ˇŘ#˝*¬9,Ő5ô¤ő€:­ů.–?:Ż˘>úÝžłž9$ť ݧ¬FS~Fţ7QË~6ćˇ4ŽC¨Ës[›I’¦žéÂŰÎkî>Ć64˝=Ťş‡{yÇ3p˛.NŕDÖ8đC‡FzŮ.ŚŽ<ńľhĘ ĹŻWáUĂ;Ř{ˇč˝­'žÎ6µ,Í*×ASśy(‡'č˙vš(Á»F7.°8˘Mg<1ŢÓz=şc‚o둵˛†i<†Ç‡ş˝lU¤dł"'{vb~RÖĐTĐ[ŁCGŤqOë„G…‰˛‚řŞ9PéąŮ›GFŃű UŽŚáĺď5PĆÄŠłç°ÂTX'ž´÷”]Ť’‡YZ†)uÇŐ®čĆ”R4r~ĂŃtÜ·§oL”ýOŢ˝¨uű8ŢVŢŘĺ7 ŚG,° Â?5ŇŰŕ^Óä ¨Ľ3«h8ĆĂqřp(j Ű–¨i,F™¦ę@ŢeÓŰĄ”9,h!¶śµęJL’ŁdĆQ5™—ěEŰC˛{zědvT¤Ą4–?•y”5‹b$+4Ć–.-ŰŃě1Ţ“"'db{ž¶>ÓŢ1îÁžH˙zęˇ9ÓęŐ®-Č8ޱ!ÚĂżB]^&3 Ą ¶•¦őžćµË qÓ2ô1Ä1n¸=«(¶¦- ĽřÂŇc9ŠĽČ>á6Ž›J˛Ş™rt·#_ž`ř‰’§Ť­şWNÖÔĘçq >ćÍ^Eoůx¦^o7䮹˝g : Ň8~½Îh‘{žRFÄńŽ8ëÁŐÇ5ćńźö>¦ ÷Řł”–Ź”sÚv§µ{ŕ0ŔŃE f©â—ŤFjá&×v«3ćů°Y, ©Ş^s’éeŁ}‰ýč^ďÓšĹâ ˛l•â ö\Ťž'ŁÍ3 öěčŞ ů6,;[Ż“n¨Y ˙‚Ž ĐńP:ÓĚäŰ:Lć­ôwÇć=’ęym“ál;ÔŻj)€p ÷ 3ö0{FFkNö)ÖÖŠZ9H¤AÎj G´ŮĂ#)’€ŃşüUÉͨ¤ÜŘ©ß~jĽeŰłŰM:Ńůń×PXvż6TjtxĹOKď¨'jš‹J#üaąjťµr´ú!ÍZÝŰwĽĎĘŰw™Su ¦çýAŇşŐV.?©ý*VŤŠÇ‰žmńŽ9›ć7m>YăC…]9ŐâÍU^}Y‘ć:Vvܧس+ äµwČLŢ5ÂęŮľ_6FK°±çi űµťÉ {XTX]ʆ^i2}ľ-Ůđ.żgúfűŽĆ|'8]2Ic(΂AîmŤ{j.ľ_g6Űßę6®ŻgDŰ62ý3Žn“Ľ=˘<ĹWÍWŽ\·XŮžń°¦íy¦;Ţ `5˙ăŻSs0ęU& —Ęń•Ô:ÓóĚ{ě8ĐÜ<=ŐQqk´ěR_vʶRĎŠp`ËŹątÝő±±;ž!Ú;ĆŻŘ“ŁÚů ™=:W˛E‚¬y˘Á6š«SE˛LÇ]ťS®AT ‹Ç´Ô× ô Ëíţ•óĽ ŠeŔI? )bâC´#Ţ=O¤őĄą75U#Ľł1kţĹ‘!–l–îŘĐęh6`3±Żă¦éBp\0~ĚĆĂŽ W˛r*×YÇmZ6ńÄŻAôDÁĘF÷đč:QâPY©ĺmÝcKźĺ}\=ŚĂęYaĄ6Ă-sqŹn ×±¸ýô¨pČÜSm °VK‰8^ą&ýo±úí6÷í~‹Áň.)Í]ą‰>LëŐ݆ax§F›a¸¬m¨W;‡…¬›+ĘŇ÷iCBă¬űu˛xÚeĺ>wH 6f ©étłŞĹqT\´Š'8β6GŐ±ţ”Lp† ŰÎŁÇĘTűáÓ+ĂXŤ1Ź×ăIÔUőz\Î{Rޱĺgb,Š‚b<ăMÓ•%?ó€můç=ܸ\ó„8 pď:GňňÉô<śXé,ÖÝf}eÂÇ)6Ć`\ÖtśČâ°s ß®U’úLćňxÓ9Ú8ĘšB{Y qĂy,5eIţľféšMĄGKSŰpĐí1çĎO}vСú(jČ—ŇŇ:şł¦nżÜfě°eQ=Đvć–ńö(Z>0ůŐˇ÷`ůx† ”ťš°´’—»»ŤŠ,†łwdˇGOŁH5‚µž‰2ďÁg–Ó`żzÜiŃą*B`†˘et<¶ÚşDĐŕYp=˙z=ąˇŠ8Łs Ń5ŞĂ÷ĄÖçDGěŕgřm±YË‘Ł1öŃg©üTO|:~PcĄzĘËĚm¶="'Ţë9)·śŇÂÝôiyŃ34ň±R<|M˙ű«ŻĘK`ôŘébgźŔu—»rUS&Hś ÷tÄ96cÚüu {§ß¦&X?ZÝÖ‡•íi§ť¶ÝĚF%0ŹF‡dŁ}ÉCNŔsIW ÎÎ4›©µŤ!#OýŹ=Ęz¦Í3Śáź2śĐ‘»ďŕâöś xŠłµ+G˝´Cćűżç҆teŻŤRľL2ÚáŤx”ŁňWůg)ÝÎ1~Ů6+/ ™†q˘ć_«_ÖŽąĹÍëŽÄXŹ"•3Űâx5ď­ŕ€jśdŢD´^BůŤ ͬÔhÓ”ţ—üŤĺÝf†G˛ĘqƱ”ĽÉçő0î™Ô°Ůfľ_ă9Včh‰}=&sËöí9ÎńÔH“Ń)ŤĆ´î‰áŃłç5Ęą]`ę]ÁDŮýQĽH«›Ý…âYőQŐŻöŻmÇőńŻýKE¶[‡â?×ÓĹ×ö_1?ĺ…Ţ=Y^%Á¦Đn ĄĎ“@†CĚ˙Ŕ‚ÂđÁK^ţ`{”ónö«fńŚÎ"Gě ‚zĚGîëôl™ĆŽńmq |K)+ť¨•1¶LŔŽ#Xe słŔ`ĚbŮF]·U `áťţ<˛ż,ţłňČhOXçőAź­šO^eŻňgr%>ůţxb^^ţ9UŹźČ˝ç+|"Z:ť‘u5ý™“ö?íÚ†«'›S8p®w™DŽżŁKtł± šůH]ć…Ä˙–iGÍO˝ýá%;¸‚(D»ćLcpGO»?6nsŤó¦“Űq§LçÄ–MŔTĆqsmc|(g9˝:ěŕŻ´Ž®©°›ű]ź2vĎ6w†tÎX@Ő„hÓ^p:‘PŢ ˙{ÔÇKöI÷xvďŇ{)8Ź×wđXĽ—ÎŚ3at¶?Ťxç‹«ć¶‚űč™{µ«.ű9ôÚózLą=b¤€»;â [ˇsEw !ˇhËúcPÇ‘mţDPšősT„Ň5í)>6”‚ ‡{öKΰPP ?5ť,éň¬=†TcZV^-Z éó†d9:C­şµĆâ™Ő®ÎZ[VôďuŤň€b/MŐ2»'(fĽ'+Ç˝|Ę9Kătg†kßĆŚĂ#+ü`źA/ÂśľA˘–Đ4¸ăý’;2ŕ˛jŐ©ń¦Ńq»+z”©k§ĚÖż ŃČ”çQVVśK^.í¨QĺôŰ+WHšłÚ{ň"Ş{s<änďŐvä»g`ű`TÎQaŔ,G˘óÚt 2*Â\÷<7Cě™ŃĺĹjč™%µ˘Ď`§ŽńšĄá{¬ńÄţűšż¦ű^E˙rŤ¨&Ą•Kçő°×cŻ,JÁÚ4ç6/Śßž :¬‘pÔ°ó˛Í•R»4ő©çxĂtÁt7Âçűŕd5Vąö$‡=-r Sđ¨qű•×îŠgÁ>•[c»O>Q—eZs<ýˇçá(%dú±iC©Ď CcÇCĎ˙·Máż Ăě°H|ô‰GĚIDë!ÓüÝĂp>–Z{dYéyˇÓ˙¤`Ú\Vv®3Ş”kŻŰĘ̆ĆGsţ˝×/Ŕ>šmuíˇŘ ëÉmËe ó1Mygśm0Ö`)ťŹ8{ů{ą{·F &˙-­Ç3sdŰPŁĚř—ćL]ÉóŞi5áčĚUáÖëRG&ˇ(ď™×35U&áU‡eu5p4ŕsµ>¤6ˇ¦čźVWĐŞjĆĆókŘ{Hłë(˙ zsób‘Ţóm˝ ^łGÁ¬‘Ľ~ćÉ€:愡BŐÔ Ę¶–ślˇÚÝ, AÍd‹X¬ů¶<%»‰ć«—ŇÁ…YĄ~"ÎÂc—E˛‘)TQťaTĎF{ů´DXQ˝ŠţëfąhpĚSÓ̲ ¶ŽöUPĎŤľvĎvóíu–űËđ`ž˝ĐŽě·…ÂnCŹçSâ“˙ŮCíŢ‘’7;Ěw ‹ sőj¤=qř\1ë^*zs•ç–Đ©Ü=Âcşä6spP…•†B‹ d;U«)ć¨ŐôH‹I(YÓęęeGő:„Őž»ëÓÖU>ťÝ şyÜű*Ďxäe~ĺ1¶[˝ě—5+ť3t,­Ă+FzŰÍż8ä+Ńp]ĚęUöxE â=Ť‰˝üŹ$fnPĘ(`×Íy_©ĆŐtŻŠŔÚGó ٶČŃ;Ô6~1Övç/.ZXLNy4Ř5Fů±ě\°® 3A´đ=kjÔ/”žyŢF ˇ bËAŻ;şymAł2 Šő¬Ły&Úě­ŕđQŠ|Öą:;ö|lĐFÇzć8…qś{ő1;FŮěá†lPÚ·{š§8$Jż˙ŠícÜdő 1ĂVW<+Eň¬(&ÉH.˝ÖîňĐşGěWĂr…foĘË_Y(ÚÚÚîľŔö±-XěB g´ăŔ·gÄѧm |:noř†GKŹÓŔ3’‹ĄfhÉł(oKńL¨°š9Wt‹ŤźÓ#ćY©Çl “9n¨†`~Ňĺ&5sŔą×Xţ'óX ¬Űó׿ŁyŐŮźňÓéY·˘ŰÍCËńűi匑=Ě|żOÇÝCkX[1ÚËŞ˝Ĺń~Ľ&ş®v•Ř=űJŇ`ä€1gië¬ît1Ňž%X°me'(E?ë}uÔŚ·Ę‡—V¦Ł§ž€wZ™»;ÉS®|ěÄsĆŽˇ8s3îmó5·úWSěOéoă±mÁ4ßłüq ÎÇ˙ŰßOVď2»u_C–«g!J(úŚwm2­KĹÚɤu­n׊¨÷lÚ6*«Ř~Vś `ű]˝P×G®|8î‹oř3+˘#ݑևí˛ňÇ­€JzâäIWŹ´¦ń|Â[~¸­/…sš-—çT¦Üx\ł¤Er<”6fU˙„ŹęWc&Á­DĎű‘YZdőŇOş3Ż3-üG]ç`ăe% {x:Ň×Éٔӷ.ô•Ş>ú€l3®‘G°8čésN+’:dęÖě Pm4ÇTăę"Xmň™#ĘĎB*[„ś3?zŔ+WÇÁ"rŐr»îë, †µG˘âQ»¶›čî­™EV‡ŰĎ‘ˇł =XbÚ,*ŚÎňGďČąGügXäŰiVëąÚźC}RT…FŕřżńŢ#ZuFY}Şëń>ł=z»Ý3€˘Uc(ͱŘ™d7Ĺpš5ÝKO´Ëâ!°ŤŘYéľ…8ms¦ęR…?Ĺ%ť až;MŻôŐă8¤č«Ýf•@4,?ĺz„‹§Ž%VÁtFŰi‹öݶ]' Ćq¤q»†qśKiq–ŞąŕŤ± Ťzfw6O Î~Â:*ĆĆ<‹:c®§ů )*ŻÓ2îÁ™%®«ő ĂŐÂ{?Ľ¬¦ĄÁęxÖžąĆ}ž‡ţO­¶.âŽ*ŠŤ2çÚQ/rTHt*~˝¦Ĺö4+ͦŻě´wٶ=0µ’É 7µµř0Ż*ď = o„VFҸç-ąFŚşÝ`ŚôqĆcűşG$Sö8HV“ííŞ¦×ězÚ ˛!N×~‡c[đŇ6{Tí°h/G{MŃĐé×ߌqwk=Ž|ŇDŰ5×/3ůqzüC ±_RŹĎłŮŢ{;Â"ŞńÝ#4ăéąő±ó5Ň„âő8'm_žĂŠĂ¨Ů^:ŘWżsołĚe’Ę´ŃJjc;}ô:(_jvďp_Ź`MCG?FvŽŚ{­z„zs0im,ÔJo‹ŇJźŃ\ôN÷´YŃö|Tă„5LPäÇ8šaüoŢ1ňĂů©•3ĺ·™‰ě1—ťŃäoˇ9ŤMÝe\»a'P=@ß^Á ˇlO]¨ĺxkßwNđ&™ŁIÍ3»‚â”!çúy%Śj­€úÂŰjőŘ+ˇ ’v¬/ŞCÍśłěö ź]ńˢ‹µäáÎ!4Ič SÜäe:Ţ^ĺ¬c絪˛…µ‰ô±OŘ9ËG&&/ą©”ă*Č\5ď1p®:EăĐ$ąÖń˘őŇşq|ťâ*çč>eLµčĂpWŤ÷q¨űCŞ™Ů!ŔĐ \U…żÚšY–Çâؕ뜱§UüçeÍ=XóŤ ÄÉ^jÓ|ŠsUă•|ĂvĎÁŽśDÇŘ”UEâ:č)ď¶ZčŹÔ=LBČ»ĚŃî}PµÚ7g?ŠÓŔkćŤ8ň«ÉX•Łu·®yějk ?U–ťU\şžľŕ_ČRłŐnT:­Żw\čf™5싯ŽĐ“Ó9óó?¶™»ĺLMŮűuZcńéűś­›Ż4\ĺ5Ôfeiă ď¨6őáV2˛`”Ě›˛ÇNĚŤő`ĎRÁÚę•)wZ=ÖW«‚%Ú©N÷vŕa;¦ĚđVÖUžü0SšĚ÷8ŚjH3Ő1ÂÚŢ=-đLÔ­¬[ÖpNáěAŔ˙­ÍđŇđrÉÁ=ĘÚeQm83yÖ“5ç}0÷°-ÂŚmŁä7¬† ôć.ëa~Öúş7U#TiíČ…ÖuŹ"xôbDv™§ĐŰ­Ň˝aÉz‘sž‹C’Ľ˝ýXń™(-“śu¬rt·Űčż Zať"dmBńX·g¸/—•·Ąo\m]°V™=Ó×Íęő„Zé?žr ŁjĄKÁD´™¦j4 t§G¤¦¸Ć9qšŤ×áˇiŤś&yúďk·i†^SÝÜVhówTřÜ^Öşëe@wć™ëXŘW[7?ÄŘpB}• g°Ô-úÎrY•Ľć(ČmÜ8ÖËLQ¸ ‘Ţ~ŞçĹçţŘŕŃÜÁ6A5±;‡Łx»^ňć,y…Ćü˙ld©||<ţO»6Oµ¦·]ł‹Çš(k#áůa‰Şˇ’|fĎ ńÄŻNĎŢA'¬éĎŠźł{Ą.đmâ)?îŐ§VDZ(Gś3â ż_{YQüf÷´Z¤őGy f›ĺĂDEŚ~Űgďyđ*4Ň7V7Ű˝ŇLóäR•űżN^4Wç@5“)óo//3śyĂÎu‡¦ič`€ŔGMD#Ż1W' 8—ŹQŃÁŐŹÁń⼆ő4řĎÖ°3Ím÷§.÷ÇĂÇ3/QmŮŐáö˙'Ř–,IrUmđűň\+˘»ŞKćéŞĚánfJ‘,‹: GŃqů×˝sŘQDsIă o{yŻ7 ˛yĄ:f¤űY˶ľÇ_źŚ_nęÁĽÖż8q0`g mäĄůnĘ×Ŕ|÷Ś˙= ·+Úž~ 7đí ę¦Ě:šM=v•ŞÄ_”UnB2<çóş×zŚ#g”ąŰÂpŹ‘{ŮM8¤<ÉňÔXź‚ŽlfzµkĚ‘Ů&ňŞqÔbßÔ¬ń~<Źź(ÂHÍ­űĚfžű«űYŹ“ý=gŃĆĎÜjŢÜ}~ą—q˙úíTÎݱÝýd-Xű\˛÷ŁĄMÎěkl*H÷ż›8Xg–żĆC‹=á‡lďW­µT‹¤Á!âöZ€Ć¸Ş-ă +‹cćšĘ—²×ę¶ąjŘŢ}|)wâ{e =€^1(sŤ‚÷ÉŮ#‰#ß4›čx®Hť±űűSWŞ tIcĘ˝–ť„Óßő+ěÁ?ęNOŃČ~—-Ű{Ѥ,F–™d|:6ýßeÖOşĄO j7÷é-¶ć˛8=żh%ł6îŹř®;ąC9‰÷ň/|׆ż§Ďé1Unü™żP!äŞíŔ‚3{É˙Ů1ŕŕ~sÂ`iëŮĘ|PĚik9ä˘Î‚džĚ`»[Ĺ7÷ćD›Ľ6šâFLÜďQw¬Ăě‘Ů věhâOŚ÷ k+[cĹÖRë¤ ;pUŽ˙gÁ*1˛qĽŽôv“µ˙ XČzůń7Ç*ŰyĆňó•LC Ö†YâBč͉óĺµ›^L žL7śJď~Éňa¨c©Ç•oŻŔ[›ô3&ş…ůČ~*ZÔ íűj‡.MŠqĚ µű3®Ž6&ôR’—ő_BĺPö.bŰ®Yę,v°=hK^W_|ß“ëüT>q\ąZţŢtś°öWË˙‡‘Ŕ„ds‚W+kßÓťď5Űßbq’1Ýtżměj§7d|±zA×™ŁŰE}¨ĚíĂŃ^:¸ÜúuÄ?ţr{&#¦óKC<±ĚáË^4łnÄ{śé” 9p»žuh!6rü‹;¶ßŤsŮcł/7hʉ\±nĽŹ~ˇcwGŰŐ±/-=˙Ťyd|ŻíÇ÷zlʏà µöU|‡ĘqÁ˙5|cĚç’GůęF·ňĂĺů™ÜďÓ +żl‡fĘdTŚŻµp=fkʎ˘š '‹qÓ[üÚęx~ÝÎ?đ<đ2;÷ĂudŻu>9ČpÚ¤@!Č*ôŞř®ö(RbMĂôZě°i¬¦đ,x7 ěŘFj  Ít î6WĂöjGűM+Ňž°JÝűšçž#Łüő˛őQB{5ËO”˙[Ż–iAńš:ÇΊŁάçR‰‰ÍÁć˙jsřľ#&ŤÇń*Ż<ă1¶žµ–CŻ„ę:Í€F®úT^—W[µEZÍý®p…ÉgěO>n&°+)CcßZz|Ôé ^»Ĺ¨ţ€ś6„> Ą¸&l§ůťcýţŐšüł´iĽßÍK¨˛üŁ•j*^żÂN?†{`ˇcß áxŇ˙ťłB,Ć×Đě†pbľÉô2’˘ţ+€Ѕ_ۢ‹&±ý4ľcéOx\qĚĆPi¦qşĚŢÂ|˙ޱ¶“#4o¶ęÂţüţëIŚĆʢ)Q´ űmDPytR\OĽÝďŽIsK{ä;:qđ ë·Ń†4”™ŮŐضÜ+šě@ł:­ZEô±ű1D“Ňiůż„›˛ÝwŔ€ËaŢ1>ŤŘ -ô xUÎmŚŞÎg–BÄî¤ŮxÔ'gâHb»Y™ťî``_uŮz-b¬ĆXÎ7Oo[c‹¸ íń~ŞýŢż¸‰‘•7m`VűĂĺbA6V†ˇ÷”‰hÂ^ţfůŰE_Żźčµyi|‡ÂKÖč}¸d3ĐöĄ‡ˇá…á–y‘ ]đżŁ2őóć*‚•ŰŽ]ÖfTĽťŰŃÓnp5‡:ŘÔ‘qĚşŁ†eLťkVOzőÚ[oXËŢşě+ą·ů}#i=öhŠyÄ^iô¤˛Üí\わ’jVą‚ĹP]öČ+f "€źŇáŐPó·{±ó a>>7ęĚtÖpNô¸Ł˙Ł…Ç/D_-ˇ<Ł1˝ÚŁüßÜ'].dÇů ľĂ宇ĆĎď;ż†ąµLmťoX«/0ck,jíĄXаdG5×&mě€ yŰ´Ą­ď7çČ{Kp¶Ž©ĄąŽoS("Ö‰ôëëy\×/»{˝?Ź aO*ý€ĂĹŔĺhšňx<Ţţ›3s΢,Eńĺ ŇL⇠-Ťbîq|ŮŮĐgP,č•űżĐëĚD_…'Xźö´ŇöŽwV»ť©{c¬­Ă‡űšvV¶ě8dGÓˇśŰĘv ­ÇÁ5®ŐŚ#ÜTcüŚÔWµ[5»˝Ń?f•>G«ć|GĽ0ÎzO“ťŰ@””‘ToäkłťĂÁł8­“Šú("‡vŻĂšéqęUYoZvÎş^ K—L/L›mí_u~Y_cłýš^cHr“ŽÇŮ•7Á_ńş›ŇěxßěÜmAŚ Ąꂬ×ń¸ Ďšľ9”´l`už¶ČiYc Żf…# ݰşÚŐ´7Ú§3Ës:í~˛Ąió(ş{˝A§ĺŕť pć˙űČŞýö=ďhmAŰBÝă÷cŚ=ćź‘ußqŚ®ŽÉwŃP>Wý*‘±ˎ÷đů™ůxÓGżýę8kđ×TN|g‘3»)ߎŽSš¶ň¦˝H¶Y"tAŤ±űs‰QfÖ9¶éÄţhŐY6@L ń„fůjŹ«OĂ…ł#¸ŐÜ' ý z÷ÖNî0Â˙µ|ăzWĂw1ÇôŢ}„{cą®ď-ŃĽę~ Á1Ž×öO-(h›ůfÚYB‡]±bP˘u^-Cçv‡’'ÇçhŰßśś´‡µň˝şič_ßŕńş|˙U’“‡8ëĐx­7ńŤqa–Ѷă~pbEşµfş‚Ęr”BË HĘ&lÖ?–źôE‚ř©±ö ^r¸Ár¤IšŽ·–żn'oézÉ•š»CfägčPĘxpýĂńó$NüÉ1ßËýŘäŐgw@Î^áĹAÝíŁlP OKý™Ąíé”OqbhôöV °=¦\í#s׳†Č}Mu˘ŽËs}­śŔľŇÍß„ćŢ~ĽŢĐÄöš1Öáľę˛ď{Ć*tźć8§‹^ÓýW©Ű˙ĆW~Ádݝۋ˝Dş+‹•c8/Su˘ŻłD 8ŻS 5Ę0>ÖNÉ ť‡FŐu®NŮS1×*)ňĎ\Ö‡x٬Ď.:˝©© ŢîŰúř(J±ĂaĺŐn‡ćb¨ˇś¬ź9”o‹s¬~w›7ÍüÄV/şáÄú#ť2Fł`R¶ť%Ž«bśl`¸#ľŮëµ™ëĐ^Š2°ŰNÜţďĎ ĺ,Ó1ĺPß0bGÓ üHňăA3 đ3:ľęzÜ˙Óë3rŹůŕ l´vđx~SÂjô]ř™5K{I b7ěĚÍ ĘÎ}Ňćxĺ1lcžŹě¬A‡Ň9ö|ÇđŃQý‰ÍaľXv:/“k™ĺĆ»čî.‰VÖaŰĘú5ßŢ-áâŐ<ć×ouL×ÎčkŹ}‰^íó×{3Đ“€[(ç•îýk_j›Ő˛ý)»N;¬ű<˙í fĽes™5*÷żOMŔŹu€f°fZm+rßĎeks¸_g·ŁţiŁ bŐh|ÍđŮšîŇŽs^bŐ&mîS|Żsť¶Pł8¶ńý€fVHß Ůsm˘g‹×u>0®&I››MF;ÖvXĆsvĽëRě_sżW2•ŮňŮ~U–éźp»Źőéä\Ůőkę\â5>ůşŁÖoN3Č éŤ7m»}›żÚ˙ďd(Ę2Ś3xákÎľęď»E;JÄŘ9M‘h·÷¨4Zö}—MÝ-ŽËó•©Á±€ŹY˘Mß#‰ĺä¶[ĎŐţšW—چUY#N% kű±ÜGî(Űđç2Ö¬RĽÉţő;üö}¶ő }áßĂŤÔµdZfhxyOśí1ł`×aďTY‹2µiP†FîŐÚ˙»LÍ…Ü~˛_ă>źo”µ­".&ďöžĚbŰOýꊚ2ůö&Hi#ţE×/ cž`ÇÔq&ĎD¤ĆOSŮ×éX»Ă*Ö]R­-Á'żĂU”27>ţţz4Ř 'uTô÷g.ÂŻ)ß\ʆłčo`^„\rĐĂüow1l”Gţz¦:N2ŁŐŮěOó÷'µTNtĺËTŘFľâ§en6檕ż Ćř‰/ą-4PŹŠZ25é„`ŽiŻĆeĎhb2·Q$Ć_ďłŢçćĆé«—¬ĆÉŠłĆ§ň·ÉĺRĂÚ5ş˙tóňłÚaą}.őP^lHÚ =4Ň€8F\ˇ‹ă-3)ËÄ˙W ăk¬l÷™·Ý×W-?âty'fV~g_łĆéDÁľfľvŮŚŕ=ÉN7sŁt ëŻgÁýĎpĘ#[ Çńń©2k˙}UqT6ĂŐmŢŁqŇÂ7ÚÖ¤ĘMM Ť 1ä…^Ń/|Ř«Ü`ăád~‘<öÎ I5źoÍr[Áľ*wĚUŤö‰íŇV“ŚřL­Wkň|l´˙=Ěe˛®źť"só{)“SţÄA˙ĂMv}^Űżžx}ŕuťŘnuÄ“…°~¤˝‹ĺ«űp¶…ÄšcµL…ŰÚ˝TѧőŰ ňÄţ}Ă! Ü9«@P†ňF2uLh1m$ŁŁĺseŻZś!ÎĹ>7ÜzŹÁžĐ*ÚŕüANšŮ7_ŢĐńŔĆ\ŰF,bVßëŢ°ŠµLëČđÚÄ„Óţ7űšż¨q䎣ŻíÖn›;#qr.ŽXażëC”™Ž[Ç_ď¨4‡’>łĆ·QČ&|îKž§ů˝†“géÍ.yžW ,.ăô„‚ ÍśĽGÝŔPłm‰ŘAş”ÇŚ8ňź’?¶iŨËiŹYw;ÁŽP3÷dĽYăďm˛> ň Et¨R¶ŠÔBč÷-™gyŻŕţŻčŹBÉ1GĄĂŽíAÝgTŮŽe<Ű­dLé“ç§„Ď':!Śď|G-v7ݲٜrĂ ;'f.ďńźWcÍ|óÜ.źű« ?áA;<éÓv‰^ăçÚJwI˝ěËTmQŔš1i˝÷¦*`°Nęţzl]:  iÇa ĂńşbGůîőčż˙1łćřbh_xłę¬“!†é±,°—Ń˙ź!«ÜQ°q °ÖVÎäÉĂBPZ]ŤŞîńŞe­r' ~faí«óś{ś¸ŢűŇôç1 (Ű„&Ţr™úţĆÍy…ş¬ú…on«Uő±@}‰zŃ@űĘŹl…÷xŕ5[čźÉřp4 ď VßŇ ű˝˛Ü,4’`ďŇ›3ð>°Í˶gXWŚcyýÓL~~Ć@ć2U»ŃϬKCplżn62ąĽŔ™ßC“ýąÜĹT ~ňuł(Ľyř"â°Á>ö¬jóëcąĂjĂ?áţ&–u+ÎXźŰGű¶tąĆűîkŰ2L˙I1b[+Ţ űçec„íáµo…čĽÍěä\­qĂBűi8-­rů0Ë1ď ZMąQŇ4ôëąĺĺCóAvŮ;ó'M?ÇZ„”đNx5s ÇgDŐĐěhiٵ‡›SčR—ńIËâ",tY©sXňsŹóMůȨőÇ3ř\Ć»:Đ1>eçł!í}çŞP(ç¬÷†UőmO>÷ü˙ĎÓ:üIńöڶ'J«ißa3ď*źá‰:ć÷^+Ľ0u빦ݩmÇ—!OÄ8Đp“I~†Ř†îąú’ŁşÎř7áüÇŻ˙¸Ŕ!¤Ň“¸Tş†ěĆąA”Ě9¦~ţ%n+F-ăČĂ›ő”Ú+_ÖŤýůZ“żcµŕgc×ýÚÁ%ë,úś3čţŕ¸Ç5—†RűüzÚdkCf;üţšÉ™Ďq‚O>w™źąăćҢ˙^ŢX Ż`ůs}?ÜźŁýŃ\0YŹÉ+‰c¦ŕńmÖ)k„«cápÇ?vĎm!ÄĘçk×učŽBDYô`w Ž9¤łöu[Wäˇä}š‡~MlÂxq.­ ńâóřč®++aşĆyWý|׬ÂGšűžbe.춆ŕ虌(±˝můăţęÜc°wą ĐŚ-'&l^‹ő(Ú&~Ç`µ#1±˙ëňC:ćbĄk>Óć9s¬Őiĺ5LmĆaÔ±2™[¶ĺźeoŻąM›ŹŻŤ5ö˝¦ĄXí ŹićÄÁX|ŢŘźĘĂSU.\utąÖcC %×&ěĐ5ÖřńČos®POůűóÇGĄô lŇPźŻÖź%WŁ)ĽOdž<Ł€Ú`sîń˙Ń8)c őÁzVͶ-ůř̨üöóöJ=Ý<Ě\tS“ë…ň»Vm‡ ŕ€ąd X»0§nú0‘ <&r¦´ĚÄă~•!8ˇ7›ůdó~uŹË«WäŽýÓöZöí¦¬ťÍ0#w;w±Üßń°¦&yd‡Ü;VßÓ·„;+ ¤ŇŹ÷Čp.,ČÝ4şL‘@­I€ö|´VÁŕ˙f–:Ç îNĚýšW(+4†R^úFźE°4ăŮáŃfÝ]~tÖĐÇć§SMś=6Íp¨×unÓ:<8–Ă‚-”áţÍĐđ ’˝ú|sľůůş€łĆ§sň‹ľľ¸ŕýe5Ö™Üp ¸ö˘ t( ĂÂ÷c‡ąťµľF3ďzÜÎŘŚaŰŔ4śh4 o”µëµµăřÄëţwŔÚŢuí1ř¬¶7já±#ŰżqĆŚĄŐÖJÁ9kÁˇ_†ůµÇkV¨5«ěęůýiśţl˙# çßOĄ÷Ď÷b7ÝŮvöOŐ|FúaąźŮI“…o+>ĺj2´Żfą=i̢·éř¤ooKźŐT+,/c{ó!`ĎU¸O~/ů˝‘Âńń¶ő<łŔÖ8XÝß—ęâ™éi»I[SZ–§r˝~¨ą0;·%÷A~x99űęX/VÇƶblßzŇź»Íżçsüý<íŻńpśšJD¸ďvŤŰlgËłĚ}®eűLëŚs,z˛ź ¦Ů®Ć­cl–÷LÉÜʦoGeßĂcŚ?–Îé‰yĚWçţĽ„Úţč:—ł&ü_™'łŢřŃf–ÝŘüŐY{-OÚVpťTßř­łí ćUń0ĺ›}ŐÉQÝW7Ú­sŐăżČ]#WťÂ)ú»Ó÷ÂŐÝZ;vă˝çÄÚ˛hÓd™ÁĆŞ6đÝ”Ië rť@4˝śPŻto"űxăŢK¦ĐÉíď =„yąőpÎĎŮbŻ~ăř€ľW±/Ö/›^…^1ľąđę»I˙͇ĂĆŻ­lŮFö Ză÷ý…/?Ń6Z¦ŤÖ[I‚ţpĽCÓF lYŹwş¶|¤j^ŰŢ ]o ˘éŹď ë]łô‡‹÷xlăÜ5ťc/©ĆĹç×YŠň G×G™˙źŐŻC‡)×ĺě´YłěJÎ[¦¶1Z’q§˙#ë üą_~[ý§-ôţ܆•Ç…ÉŽé¤.U„điy!ŹĹtŽy9łF«säŐp›łÔŮ3iG§Íě c{yWôŽ/ͦ#P…ŐvM”»łá¦7 Ż•L5÷9ĺ˛ňż[ÂÜ0“ě–ĽCVŢżöň%GR1¨h–Ţ_çń±v†?a'ťŃĆ˝ŠĂni@¶{úı ŘĄ\“})Ş]Gôć á¨Ëy«|{’ď\4XČŇš”­Zś¬‰j:÷t܇ď•Ö Î5ÂčłŔÖ´kĂ|f `"äZ#–·¶™ Ďg86ôń?`` üßň\zŇ·i®ľ”¤‰Š5Fv#_ȶDŻőčŐ‘ČŻKĽÍR0mĆüĹ·#’är?|.?*FČß{bC;Đ Mľü ÇŁOnźh–:´¤ ×ţÔą ŤFöueyM– RŔ‘ى u´Hś5ă“rµëŹÜ(wŘO¶É=¦¨ Ą©éĂ6^ľď'7şFEĹÎqë ďEšť”n ö.«ó …yěpäHVQH]Ůy°N딫‡`Ęj 9ćogʆeob¸Ý;!ĽIĆ:°Öđšú™ŕ,_óŰž°vßđµ{n3ŮŃ[ nUDĄJţź3Ŕ¬y_N6ă˝ÓYłLîîTúΓ­i·á^¸‘;şm2AöZĚĺďtsŘţ1^;¨%Ż}&ěŇčŻmŞ_uÓ‚c“8ŮÔőű(*ĽŰF®ů‚MĎG.®ö>ľÜ;iśř“Ńë\^—;Cş}ť•ţ˝¦Ă ůŢÔEÔN,R#›ÎÚĽŘ=¦öŮ"ĹąŽĹaBĆPůĚ÷etĆkÝť-€ćÝaÜţu#l/đőK–$ ±—·˝˙ŚŔ6&ëEHé“đóhĘzć2VÚý§×k ÜńŰŻsmďřųYŻŕ•u! ZÁfí|ýzŐĽ=\Y#3ýµÁá{ˇ~úŔđEĆÉíuĂ9FLĚ]ÇĆ6ƉDĚo!ů"+˘Sަ¨Ýf!řpč!‹¦hţąGtú 8ßÂ*´ÜĘűó˛-ipošüĹ•śűŚý«Zubä8T˝Ń&Ó—wŹő^Š eĽăřvë3z)›`”ď8Ó«ć3:A‰Łóř—tzĚ;s5Zë€RäÁ,ĐM<±ĂJËtĚĄŃOŞKŚ3gĽn‘k—ú ĺ˛]c„Ťµű±uF5qrp‹«5X.×®ńĆě–±ă“C†€BRŞ*üź¨>ůUŢĂqňńť¨ú¬OD^4Ť¶ Ďç*[ńNó=€ľęŢÝľçűÎÚ3Eę5fw€†:îĹđÇ ŕ7ň†%Ś•!Ř´ßsď‹oXihnôȦͮŮ$˝m˛© ł4\éK,ú&ą$(9f»Ü ;~gh|m#˘ž˘É×Ę pVO˛|QaGĐÚ7– Ł#đXÝţů.Ź˙ëĐ;ş3,OĺwĽ@fĂ Q:[?óE-|Čұěę©ńVRQ<0«>vQłT̵Ý*XŚęfçĚßXVĎ(Ěźő,˙©ë>vý÷B^?ᢹůžţŽ L/|•Őý…wUű®MZŰH“«zdyÖči'Rˇîôz§Ő|ĺ0aöŽnF?ű-Â,ÜŇÇ3´ň¬¦•I7GÖ<Á6˙'Í o( 5žE÷Ü.«ň¬ą+˙Đ—`ź‹}1[Ííc+‡ł!Ö¨4ąy­:ŠBŘs[YĚźě«őŽhO_ŢÄöëđŮk÷Úh‘ČĘŔt™Ahďł6ˬ'Í\Ąayť#™?Îí]!inË(ŤŞe¦Ůe=­†oéí{48ĹO@Ĺďa}BŕQđŕ˙~ýˇ¤Ů/m©®úFő@[ŔÁšđá¨x/Ú^˛ĚŃ÷Îî_YŁŤÇŢÖóśÁç™×;Ő+ďRWďu”!ŁËIJ89~Ćf z̦üąć1“^´—uWÇńôń~ŃFW=†:B<_LpĎĆäź“Ŕëś|kzZÝ;Ľ1 Fęsˇ‹Ć.BOŇ롬{Ž:Î8éŤ8c\Ť}'K‘2ţ˙~eÔÂ2ŚůDZđçpŐ‰bĚ!ÁŞdóušÄV!ÎgLjĎŃ;,JJŁëř,·ôqĆišłläʶű=#%:]f7C |î×űD”ł|‘D…AçR÷ű+ĺďĎb_ł8ßŐ´É$ĚNĚ?GFűxv •kô<;ŽgÍăŢ´¶­U±]6޵N<áVl ‰Ď¨%/MůżŰ‡ôĄP[ňBźévT†2•Ďńň˘h´•WĎŽ´Żw˛‰µÇOđĄ\–îÍČ@«VFŤ"|cÇQă¸qĚvW¤i¤]˝ÍOĽsł„róß— ҬčřXůłŇ—FžÁě(?Ţ.q™k˝ă]˛µ#ŘAe iőH¬CµfËR1şčHăt§j‡ťo(ú\ZŹ…˙kOdu 2ý÷ĎŻĚ3,ş=3MٵŁyF;F+–›5¶8Ż'ji7vĚĎWS˛: [™v÷z5ú¬˛Ę"sžn˝­±‡F›ŽÇůŚ×Qłä^îĹËž¶+-ĺÜ#GNTšÄ×÷(Xz·µć-±äM0zě^BŃÄ©«C29˝bÖ ä°×BäxîÍybî»ĂS)qURčůŚöH˙ŰŐ´ňqâ ĹK+Ůď¬^6jż®Ź`óCAĽ?sM<ółđö<Łçó‰(Zg ¦ňۨ=jť‰Š¨xîJtÔ.D毯#‡L‰S˝¨Ń5ÎČ!«v8˛ˇ:ŃťzÉ™ů¨MηFyzš*bŽR¬Ç S2ş¦żŔűëĐš4YĆé§,JW»†żSĚJl#‰Őted]í{¤·˙S„ťŢ^ćé:®+~ұ~©>WđĄ—B¦ 0mf.Ěv]’ŹîĹŞÖ}<=äé'¬±IÄ™)·™ĺ3šĆ'šľ‡áň:'$ 32ZţŞ~&¸ślČŻĎ-o;ʡ̀Ŕ€đŢ=N›Mdäet¤u=č&®FőeźYÜľššç…R8NJGë:ś÷KnČj|ÚýﱍćDČŤŚMŘńâx`QŽ>¬}yÁ`4ˇ {Ą, ˛}U¤ńDµśţ\mţű»‘¸÷8mŁÎÚi˛03?×ńíÄVÓí<Żß}0×îYA+uÜň’B¶\ţXTłóÚwSÓ TŢ?·ôóU?h[Öž*ëŽî• ”’‰@Ó˘{\ł,aŞUćÔŕž"3ôłÜ¶ďľ»$;ë 2黜ÉrŰ’©— ·U ŮVI«L!ńV k¶!Ű&%ěé^ÍÇÚĎ˝˝çcsS/»ë×Hz:”Tş™č'6:’dEŻŽ­^>} ÚŤxW©AÎ*ÚÁ4~8lżš Ě×-*üăŧĄ@{±mÜ7Ň‹ŐFč3´É©ţ%Úľ•ĽÉf}ň®xŻ\lóąxŻţ=_ĹvcĽ†Áýëx¶łü%¬á˝›kÓ´ĘĚ:>:CřN±ŕż-Ç@Ä1(tB–=tÉ»Ý+~›¸>‘÷_ŕv{a>¬~@1m–ŁGSB ŐÄk©Y\nbwśáqr`–w[ ¤WĆ®‘Łi/Î1ůp‹˛CÖ­g–3G™áŢŢéQ,öľŐ0‡ĆáZÁҢ řz—¬ŕłâˇeŰÎübYKjŐ1©L ]0Đ˙nmí8—ľŮă™ĹL5'Zň|Żę¬Nú¨8«ŮDĎ?˝Ía>˘9l”ZĚąr•í%xvÂäNxá‚ëxr1«gúŘsĎÓ+ăÇ<äDz7C´áuqđ„cTĂ0:¶˝µm[ĎăfßP#‡ÂÇvž˘‘=çJEë´ŞĎ°Źťjň–¤ép¸·đĆ Ň|8:JŘŽ6ýećg†ď é˙ůÎ öý„J˛Y{Â~CO/mwë+žoŹfŻ[iţ6Ś& ÖöBĎ&Ëď—l§5ô0¤}µáS'X덢é 'EĚ6k›Ž‘qä/(%ćŮlČOY%ć{é˛çî}·©La0ť(7&|ßgŮ1o€uČá/üTQB™|ćľi3gŠÜss§çŠ#dO-)Ăý?ÝŕS‡°xŻŔĎH–č¦%u™I†{|Śz®ău˝ňâ›° 'ì4e/Ś\ŻyĂzvSÜw—pD1rČśę}ßHYZ; Äo^(7v*¤śVCĺiŢZeNđô’ Ç“ŃýŘčÔ^ë÷ő„uÍâľ> úőCú8vŇđČmŽ©Pŵq*ęJ«ő¨š˛/ť…Ł.°8—3¶EYŮ(˙—zx–ímź}ňxŘ\bňĘ­Z?płv“OśQ*_ó0ľ“ŰˢęÁ,€^Łgşf»:Ăw g»Ě;a‰(Óđfg 0G;©3_Ťµ'Źkâ ´9]ł±ÄđŚ®ß/wwŢ™<+Gěq¦ş%˘™×iőH7ˇöÇżICÓ€ń„“ĆL‹ęłlîcŐmçŰ&ß°ä˙‹a{mŕ¬>Ý6yî2đKú Źm5 “–ÝÔĹ†Š“ëe E…Ńz]»ËlzŚ´3š­i۸HčČT Ě’€<řŁxÖëá+mGÇ`<ľ×ÉŃ#-¬Ĺ€ýލíĘ…’zîžŢRÎ’çâs˝!]rł8ćWÚ‹…(¸ĘÇ3Cáúk## K1¦{`”ĚŹ®#Ă\űj±–:ăţ?ËßamÚ·kăčÉčĽK"ŚĄ (°…С¬OÔ(ŘzľëӿޡnÍ"ô,†±E‘#i-cF÷UŘőTSĂSş}—®¶Šűxą_É…¶3=ł\’ťŻ]sńpҀ㷧D<Űk_‰ŽYĚҋݨQ\iM;&\"€ÜĐ<°ŐŇ™™Śá[ÖďŻ7ž!_GfJ|ţOĘ!Ý’w¤a;gĹkśŢn;ĆvPÓ¨žć2ăŘćĐ™:Zť—p|šČax5®"˘Z×ÁĄ8­“˝>ѦcÇ?Św¶VĚ_ H*¬jşÓ—đ]$Ú¬‹R‡S9dź~ę™…bňN¶BmÝéäíf€,ĄŰŽĎ(—BŔŃíf»˘…ń® ş«ďÓ7{ř)y˛uě&ý_‚ŕŁvjŞ;V;¤łjeäCÉeň9‡c>SL‡ú\|¤Y.8őóu¤ŮyĘiçĚŽŇjí‘D)L0ń7s ¦…éŤ3’Ćéc3ż™¦şßóóżi?#ýńóqjÂ(9Vz:á"=ŽtˇĆ×päř+»ç®‘Ňą?Ő*0gkÔ,űŮ L»¬ÜF×üP­yXŃĎdâw0ŁÂî‡Ő8Űć;ęąžĄDÇŹúNŻ´H”Ú:OţB>Ä"0‚m}Š×<<ŃăŤ~hPvřŐłĽđ©ň ,ÄVµ'í`‚Ď®HËtöřyl,ió˝Ţń{Äů#ű|}G9zĽĆq˛kęL“ÂÚƆ•ťµĹÎx‡óËž /´WšLČTú5¶ĎŤŤ33uÚmß•,° Ő€¬iÖ‹)˛ŞŁác şeCˇŞ8·q¤ ĎŮĂrXMťĄ„űúĚž;DżţżoŃE.·ĎČďůŁÝŐ}Ů”ąŃÔrYϺ޹2”—©Ç!Dć´Ă˝ÔáYoácŇ>«7ĘLîͰdD7°tĐo´şËśţ¬>sđs1ĺć9ČG°Íß„>V˝ăąŇĆľĚ=»D+[O`’Ć*ʏ¬F›·ĺh¦E÷z'ęj˙‡ ?°U~˝ěu>ďŢß5Qb5Ź×ýŞg÷śľ‰«ŹE;^ZUmĺšôěˇŢ,ól/3/3«“IŰnrgĽŮă‡c_Ź]©á3—%U!¦šCهÓsdĺl ö·łßŘ^şçnú ď€Đ;ü\ůěNÓHSLµâ”ĎŤ©µ÷‹(o4ËŢűő„Ç a)ŻŽóŻ ob´oĎ(u{Ż<ţ÷5÷2řáŮFú¤mŘLůµ§Zm×;_öşw˝“ö^żm <Ü#ßŰŹí†nÖˇµ…{ăXs(×<ĆcÍUÁÎňö7¦Í‚u/4…ŘňŹ íÇ(ÄNš—(^Q9žQÉÓŁ»u°QÍŃŃíQ°hx÷,ÍĎܦ(š LtŚF޶)ÇÜÍOT9O€%'{¤Ń™hş˙ͶWd^ŮÓ:›PĺTŤ3Ű ĂöÚž÷©«†€"Ü\óC4–6‡YŘë}Ü-m<$ÜÓVÓUćöL')ř¤nEŐµů—Ż'Ör™ă-Ó*öU€’Ö<ăő@ŁFăáž˙čŤaĂĚ˝gş—BÁă%KžŤ*¶AŢŽ¨AoG &ëkG(­ě>a}AćŢ=HŁľ3ÁU>wĐ˙F“—Mť8ĘĐNxń3Ła'Ř0ů™"Ń»ü#y7ŇZĹž^ó™Úš…®ů–=VăwüzĎÜN8Q†sŐýŰ›÷…t™ýţf·Jmé9*00LŰ‚¦¨¸5üµEýĘÚ“pťu:gŰeL˝a‘®h†‹ö^M/]=p¨sT=G»űiëß®uTmŃc3'"˝ű4x˘ć ­ězý_Cňr#Ţ`dž람2…–ńLôeE–}.úqó¸>ť&ǡ"cůW¦f…@ŔU!úSˇV0&ÜĎ6î]ą5ďÎâ«2žÂ^˝4ü8¨|ÇąĂŘ(ŹŤ‰Ž~íŢTÓű5ę\eňrxQ±uˇąYě—á*?QrÇ[#x®ŞPÝĎwš‰TŽxPM—IťNÓŐJ¦5ýż Yźę1 ń LxsO©–l4d¦ż5>0· ë!lL î”UÍß#9şW{ɦvťé”HBĽş'ÖFśHŻ~ŐĹ„,â5ŘÖ˸üÄĂźqŻ9bĎQ±˝’ŁG™·Ôččľ>ŁŇîRť=áÝ nĐ™Ť1ş¸ó‘;"e˘lÔ÷.i>óťešUńAŃGŃH‚»üFąÍś«h]hÇ*a¦6*m©l‡"ëöţ˝čđřÁ<ú0d. 9rĎüŢfgťŻa•Ȝލc٬§˝őW´ Şěús˛*ZÍVGĹPQ'j8€®\E~ş+‘§Ż3ßpˇlą›Lű?ŢsŮŰ0,fs÷čˇáaűĘO[÷ČnŞZ#Ë•ţxÍ8ŢžvŇÚyfÍfB˝Ű2z_9ő—„ťhoo¦± íš9EµŐÔ±éVđćĎ\f,˙Çő//ĹK#ënűÜŻÄČůŰ„/bµŮ»VąŃ‘ó±ľx€ő,ôjômg|<Š>~Ű»Z2:ŁĘŁ´ź7/Ío¶ÓÍ ďazĽ>†n®?c*{{ĎśL´ăŔˇÖ‹<Ş„\ĐöÁÚXuSćQíHąa4©Šč|gMdH"%Ćév7[GěYs_9č=şokÚ™^,žöňµp¤Sfâ‹\u|–”đfÚüËĽŹëÜgĺÚ`Eă EWäÜa’řÎFu8Ľ#‹ącD¦§˛ßĂqő8Ü3v||x=RK4T®·Üî4lO{§Ő–hpŇwYwś™gp¶ÜÓÚń3Ú´Ź6vŻgž‘á»çixÇŰ8ÎUń’c4ĎFÔđb6ďýń—2Ł ÖĚ"›í*sk¸˙űG’ ć‹ň˛°ĚëˇŮHöt˘O¬Ô(9śďDZôlţ´ˇŹwY.@5ĄĂŰ_Ëx˘ąĎÝÖS06čńÇŚ6Ä ÎW“ věqwČÓČeë¶}śA—Ösđę™Úq⼋ţŐhĘ„)ŔčdeůëŃ —š€ý\k˛čęšÇO^@˘Ě¶,Ŕ šU39¨ŹčdâĄf ‘H ˙< ĆTŽÍ«žéiÂĺ¶Ű†ôB>…8ľ*ěąqľ:Uż`©ű4öÚ9ëÄY*΀ż(qj4wŻţ˛*Ą^Y¸ŰýF Ą7ĽhŘn#šdťn0ŻŽ#Ž5˝°"ŢĺgíEî@íÎżF‹mąÍ‡˘lŁ_áŻ1Î<ł©ŕ‰b1˝Ť6¬ĚÜŤ5-q•ÁÔ쥖Mq6 ˙?0*âmř{(’(Ç3–Ć#x¤ęĚmŽ˝äh5( í™ń6ť·†•»ŻłN_ďĘ8ĚŞÍÚ…Oq}ŁÍ{ŇmťůßC5e xyź%^'ŤŠ8:föźŞ±Ö±á:ÜMÎ×Çfኼ$ŇŻŃe‡µĘ7Ż ýŚťÇŤ]óDě«ä`Ř,LT !DF¬eîU´î¶Íáeîď,śîZ¬üĺŁäůU¬+7ae3s…LźyśuŻFę2gěr÷ş»ÄLĎ}ÍźűÝŔtY0OüąüŠD=_Grš~Öĺ§ uY?Ó:d–ˇ[c˝ŢmŻX^7 JŰlű8#WŮ‘(;v9ŮyţŁ­ś­’uřAwĽ÷|¨^”ć<č +ůŽ‚•'3ŢaSţ:ubS”3­ü…ĽfÂÄj6ýß9¬=L+íîş|Ołh#Q“©[{ňॴJIšŮ±[«©f]ß§âx#Ęű9ýą2Č3§EF›V¦ň\q®„Ăźá¨iŤ¬&Í•w˝7wôôÇüýţ}5{‡µŰfjŚcf9Í ‘š§ľvšhŐĎť˛ÍäG*‡T̡î>ĘÖ; ‚ÉsŹQǡqŇË˙9s´ą9\7Ř÷xÚ´ˇö"3e°öqŇNĺpUŮň#3Pă+¬pmÖ¸Űĺ#oąůsVE6çůPĎř‰ă…ÚwŹčń\ŻŤ¤®ň<y&;ŻŃ¬Ś:Î&¦iTĽnńţŽŃÖľrľ ÄŽÔcß™†§«Żµlś(›ÍDźąRM;6”=^9:ąö±íćjzzqć(m:8E7¦CĘVúý…yüť/±łŕĄž‘V0azLć¬Ęű śˇ4d8b«j¶Ĺ›| Qp¬$Ďl@ŤŃ>ÎŔŽŠ”V“p{cW‚9zKă%< ürˇżö¬‚Ű’9ÔŃ6Žhçî_~Ľ©k7Gš`=ZşŽĎxähąuyG•zřéááą”Őꯒ+X±—J+˝ŠŁÎ|Ýüo«†Ń`^ΤDĘ“¬|¨ăĚ'‘N÷ÓľWypś_ą:$ÚÉqż2SH×®ó奚ÝÁÔGĽbcđÇĆŔ!Tó”á« b ë3šîűŹÄő¤˙žŹ=ŇŠ9úµé˛á_şÂÚŕ·fT!ś:ľ í8KFĂo/˝Să5şăHF5ĆěI=xo´uk§á`OÓęsąý á|™©ăéeuqÇÔ ·Î9;^´)µWÂĎŐÖ!ąźżî`Ľ2<<řúÄYđÎM^_Ď€1ç3˙ęIYdănyUůpŤŠVm˘9ĽÇ!Í…fŽżÖ¶ˇŹóq©ËÜ6ÓÁăšţ7łĂ¤;Űq<ôîď:ć.E.}€BzЬ¦Yż×uěgˇ‡Băťź¤}Ę’žIĺ6~˝ŚŞÖpÓ1łö‚qlo–ËëëgG¦đʤ~Ťň„óŤž§‰ČĎű°&ökćgő:‹đv¶[Íi ď3­Q¬9­Ő5T9÷ ÜOG˝¦čjFĆϢťŤŃîv4ÚŤM„.Ľc kČÍ˙·bĺŰ˝UU^žŮ‹/źl7 üÜçř˝v “,ެôZuĆgj¶[ßŢn{4exüAÖŇqĐËĚ“Ž9ޱ!·qÓäŔ±'aŘ67 ÉÇ)Ě ĺęC{㙍»ăj˙čµŢń–0gľNcł-uË®Qi¸~ü|˝őť@\j¨ľĄ6¶ŽkT5kŘO»ěL6ńŇxęÜ=Ú˙Qé&GĎG˘›jşägj`›Ww5USG}b¶ąöäüXĆşKď?;ćďXÚĎ Żľ|¸Qk·\ŐžĹN;a;Ú|=#żŢ}CŠ‘&»fÜŤ¶É@KNwů°Ę)ŽZMKÝ©ÔřďeűĺŐî' «˝ÜĘĚ’^€Đ’¶}ő|˘¬č^ÚMŹ+«×î•n®Ľ8†i!±q\‰Řa6읊•ŕë_m9ö`yBp™L5ČÇ-Ö—ÍźĽŐç˘ufOđ ĹčđĚ÷ŇlóvF–7OĽcĹËŻ?ë÷ä±Z{\ů:T««Mž„»îOďxĽűkF}Ľaő§ŕiŢţ®—çuř:Çă|żDxZ`굞ÖC{öěL'<-ŢŻ˝ÚöRăBű™íµ=^Ž„Ť4÷ż&łĐŽ´®9xf+ú·';^Ă˙ąµŚ§šgnG…*Nhv®6ҵ—˘kč«ÚÂ\mŻű?Ü“Żo·6ŰZipy?­·­mÇ'y&L8lŮzý±Ę@E†őđ6ÁŠ őř Ír›„áŚÝ>·×`Űď5¨wuÎ=°žŽPM˙żni'PĂČhY­wś–z”zLý\g´uë:DśŮÔ`3`µiţRBxÖ— ­Hä’nfĽpÚUÝßőĚrz¤ÔA˛?ôĎ u®í‚ĎŚˇ‡dăŐ‘ŰĚ G—˙ă×6zP<˝Gd_ßĆZ«˘52×ËĎ%h˛‰€ÄÔ€ŠŐ"ŠŽÁ\Źĺ§‘"G|;w Űě'bf ŰÔçBff ťAŕ·łŚ0G;Yß`Ę`@Ťö0ÚĎDG™ŐÜËŤ'’±;ŽF§ŤŇąýŚÚăy^ÚccU{ ÓĘ• ëÖ™y·k‡ŠgÖ4Śa;Z/ÚĂ˙ń—łÄ ă,G'm«ňç?ô .€¶:y zč sż+­†Üú,ŞVGíĎ:C Ű4˙;©¸Žu‹„pĽËG‡–Ůń®´kíóÍ·ż§ĚFłŁq5Ĺ—â‡ű 637N ůIď”0Á}őď°í۱i¶9Űńć7çkná#)ę„'z\†6Úa´Ř˘¦Ţ :çŐ_š‰Q«-é/ÍľÎXC[„űY5JH;^:W }ĽFę\̡ůcĚWČĽÂĂzq¤—'s†ÚŢĄc]ćŤôśl‹Ió¶îö<Ĺh0ʱW˙ź•=ß`ZÁŘRáQyUŤ‘†Ô(‡KÍÂ:AP9żŻ2Ŕµ4Úđ3Ţuguá«dŰé»ýuľćôd1ÜźqŁ®Ć–ÝŠákÎY«f´Éô6mk3[ţ.ĹľźÉK´w$Nź<ęâuâąŰçXFN6@ î۱·oíđă`—‚ĽˇÝę1‚ŘłüŘW}ía´%#ěŔ˙ł™čÔŁÚÂN,ëý=öĽĆn;Ŕq“ŇEĐIÚë·ĺ)pÂr±›ž€ĐZV팼¦Ăntɸgçp»|[ýÇň_v ô¦ő%°®ç[MŰk–¨¨»Äś{~ţxÜ_Ĺuť®Á:;XżÇq°˘$kÂUémb¤L ;ôݵ4uÚdvm8$1^1F4_C ·ow+î‹d¶o8ŽűßŕízÁfÇDśŞ<ď˙Ř-EËwWďhÉÜěô@zě)hXîy€ô(ca]ł##Ż1Űz` aŇ5M(,ĚáuoŁżm˛ž†8ŘľÔĂÍ{dkľąŠŚĂ¨E˙˙ ‚łE ’%9¨f>Dć>UÝ‚EéÁ/‹[uvf„»k±˘aÝ?űÍT˝ -—6Ö.»ŕIPäľ*$áăá:ńÄ1"Ćj… *ł†-aě×ůi+d"NĚ@˝Ž™¶'ú0 ÖŐˇŚk{ł_0lçľ`ťßŻUYÝçďe¤Nvľ›ŽKݱĘÔľŤc”Ç){±jňž2·3—x¦óS M/áşN¬Ž,ť<–ľ0_ÓÄřżŁW> ‡ź ÷{«ćÎvß»qâi›VvňDĚĹ]]× OIŃcľç~ ďs™4d•~Ěa9PgkžOŁCXíq0g&r4=NezÁB­ÄÂeťµ Ňčůüzú8üµÓ&` !éâ.‡—0`™h&Ĺ0ŠL ý1÷Ý4UăßwÝé˙ÉĄI:¦×ę_Ëľč1đe%…[gĐÚsĽ­˛ş0ÓëĄËĚÚî’âO€Çęšs>˝^ż¬’›ë̬ď¨4«]ôo‡+żWVNŞqţ¨NśşÚm>¸pl„Ë_ůď?íĎ2ą2ÄwÉZ5eëm9ăgž|ć6lË´Zon¸ůŰ‹g5Y şűŹN+¦‚ÇýbŸϦ ĚĂOXş9¬1+Ź?ô˙÷Ě“˝9·Ĺ—(çĚ™d1®y¨­öĽ&~F·N†:jŁť;”Ó©Ƶ1¸öĎ"Ź“fÇÝ®=Ďv$€Ž‹2XłSĚ6ő…M¶Íϱ«łřćm[† Č)Č`eA˝ZflŤm°´­h0ţŻŔpěr»ŢŐ=GÓ+ËđŢ#śŠZ–etť!î·r„^[Ů'„ç măDâŞwĹáâIK%ŢëµčEo¶“1Đs5źxíĐíÚC­ś2:Iz/)\6LJŮ0ȤsüÜă7ľ«—f˛ŮcSq’ýą¶ď€ż6¤~ŻPAwĆe?q¦ó¸4„qüČXwÍ3„OÍd ü?k˙łfőš†ei†ŃYvÇh3/I=A?덶AlC”bžŹf5„ęň÷ł­|ŕ‘¤ ,+†©;‘ŕqµ=ĂĄdČ9ÜÉv‚şŮćĐ'ݦ.tzđ™xćäfČč¦OâYďĺş;Ďą°ÔŽz}Ő 3É÷S7]ňŠ^łyůĄÉî–ŕĺ\˛¶–Ö©aťß+2ý_l1OrDÁ3ĺ9}©×řĆÝ?ĺ-Ň|Îen\Çßuü\Ř ¤Éňyn×mÉĺEZLčuPĐ{Ő5”Ç—ěð¤ě\‚sŃľ÷ °^0FĹńÝ6eé/Ăz(ZQ9cÇú1ŰióAĐܦGczűřŃ$»Š- ç#NŹ»W:§?[F*_`irtŹpBŢŻŐX]–Śce†ę?>ţ–˙{¨ÇÎięĹ:˝¶Đé[Žî_7I‰ť@űëš9ÖCD+ĹsO»/ú:é ĚNưTź3źTą°ÓVLpfh:®!Ô‹$Ř?§ h|´ĆĂ-ĎÖjËýSnĐŔ„ÖŠç>¦©ëÉ_őŘ7qmµ» ü©đéić§ĚÄşÚšLZFĹ|VÓ;ŽŇÍr 9k^«|–‹˘®±‰^=yüÜumá8_ř;«˛ÔN›őŹ…rf0ÇLÓů%Ż‘ńîT_& CGć?aN26~3ěűá݆¶8Üŕö^OčŹuF+ŠKß4§î:fč°ÉRâ¤ý!ó oůVÜăןżG¶f9˝Űwb_ُ$đ¬˘açăUÎNôŃ€śÔšÍŘwC %÷%úÄ«˛a}¨ŐĆv|ý˙Qţ=9ĘoĂQůץ™śŠˇą8Ďą*–lqŘćÚVř@O ÔUuéÉq3ŻC중%zÝí§îóbµÉGF“­ÇŐ6EJí=đÍ×b`Ńë]<CŞdP]Űv"9@e»¦ď9VFźă™"* źrŰÉΆ;äm( mšXD+o:‡˝N:ú§üd9ßź˝'t®Ćę«‚¦ĂÔž;{–˙G5Űh“Ť<k÷ěd™öc–/­®řĆ—číî;’ŕ’aü”ÜĹ“XóA–řrb†ÉoĆúFD˙^^ô9l"Kć4Ż(@=\ç2Rg:`šĆ ád‘é>¶ĘfUžÉşG2 Ó†d°ż>EĽ\Rý|Ý(¶(ľđ^ ß”› ®ˇśnžşckźÜ¸ýĚŇŁotÔhHţĆýyÎČ˙/E?>aQ/jcÖĐňhşRlř!ožŘ©Y'*\Ţ~ć…żú9ŮgÉŹ8ë˝_ŹłäZ¤ ÷çá#,Ĺ*ŢęiŽżËsM(ÇÍfÚ˝ç\ǡÎăíB“®q–su[Żďň^’‰9vs•ŃĎ1sn×ÉŇÄĹ­ăš±ÓPöřMéąNÚĂ“VĽżł|vŃ×;« ĹűgůŽUĐŠm珊±äÔ1ˇT4˝b|$éC”ł~tˇ×ˇĂˇ2ťŔÜE0S×{ńkR\)ßnŞślRrçšÉó®ü.CnąV±:\{"&6bŕ’űů>ÎúŮSç®ć¸ ţ¦‚RÄ‘Ďum¦6TŰÚ¸ ţˇ.„ÎŘÁ`aPöÇjó%ä$ú•am™[‹čË^Ëş yćţGę>ăŹů˙˝÷‡gr{Ś7ŔoŁfÁ1Ä®Ž{Źm˝0¬¸84%šŮ{fr4Zîřó»C¸RŐBýśAO–ó„îło:)Óľ~ľĐçŚ^^@ę[6ş$`f¤“…8{™r…ďµÁG0¨ń±+1ńQNNv'66–K¸Ś(X3y í“g†ÎÁOÎ|3Ľzx®í/Ĺ7|{rŢ ţßS°‰:?ʱăRÖ@Ś–o§ń”6Čąaş^í¨^ôŞ…N äÄ<ł§ź Ż´o »šěŔt äŹ9ßą&¦Řţ†qőĄü[÷y>pA¤,ÍîĂŚß…‰)k6>/•˝3AřŚźűÁ•=‘Ś °Ŕi„{äY,Ó&jUîH©vŻľ;ÖaÁ™ç^=?1téűAćŚ˙÷řĆńĘ;˝łŁâÜcăć뫣ŤU¨Y8éZsýý‡ă=¬ăčO”ĺ ŽKę™vű9Öĺ µ5ű\E«ą  8÷GĂŻ·ą\f{ČŽýý3ZĎ}µüڶź¬çzë:öŗ6–dÖĎʦzŐŐĽďą6)íL+E„ŁY']V+ˇşşý†v啤ĂÄ&ńŔwL}+Maü?Ý=9?Ý< 5çbÚĎ m€}O·Űź&Ćý5ˇAĘ;ysŚÖŰ+TsŐÇN°u~Pźüâie·őĎžë Ľ+¶É€Ż“©ďx>śńĹă±Cy–±†‡¬Kuş\n=Vľ#Ä´­ĐĆĺć±Gň×°”Ö×ű±Ó¦Áë5Ď=E˙^ÇżáĄUgő‡®ĂÇĹé™U°…ş'Î ĆŁm^v~˛ćÇ˙6PŰŇÚ¸Ô”ŻÝË4ĺí„ĎěŔgś}—q˛Śr_ďxC9>mëŐ+Ęi/Ňúůs•»ľ«jŤY_{^3†ĘŻQŮ}fVygŮý Ŕ°ó5łł*UGÝßĚ"鱿ĄçĂ„¶X6NÓOCj¸iÜşţŰÉAxVËüŃĎš< »Oj˛ú„ݰÇĺMůoä±^Ë4–ë»o·˙ď7|ÉÔ‹4xڞĚ}‘wĺٲúŁ8*¦=‘em]0lĹ\rÇL#(ţ9“ÂN,ŕs® î•_ăXŮTZi_ěAÖ5¶ÝzײeŐi®NdŤŤÓu|ýJúö©–Ü* gÖŇÁ4rˇ /cĽfVčWntz[‘sźŞŐ”3ţ#Ž<ż*b*«×ÜO?Ď˙nďôřż eú©$ Ő ËÍ}K™‡fűć;kd_»:'Ŕ(a:VŃńóî,XQwa`{ą×^Úč±/Ă;˝Ţ…/¸ş+hĂěń‰‡9n{(~d:ă^ËknŤË!VFÜ—A¬(Í„{öUrŢĺökD‚†ŔŐ"e‹Ş8ÜY’wEůoĘGĄgNvâ¤Ńóąą:;zÔ–_űˇqĆńšůżHcäëĂŠĆőxႡg(äßő,řŇsa˛ˇnG2‹˛čÂF˘ż .)çfÝkÎ9×;€Ěâńô'ť6ćonŰ+fhí«]Űv} ‰‰ěťhBăףË!ß Ł8V9ł·s†l`ŰzÍe'łq=Ľx#­í»&wÜđ]`ś—ÖŰ64ďÄ4ç%rdß@ýAo{{Ë˝Ě˙Ź}^äĽôeÓß ŮCyg%aŃŤ8Ű#R“ +Ąź Eą˝îÓ@–·Ţ¸3hkQóçÓk˙9¸ŽŔĆŔëµ—hŰcńúŤşż\{Í˝KuQóş§rÖtĐ­ľ%•Gt4_„â\jEĎ*÷‡m>ţ­®Ą‡Ő°p˙Zr[,Žb~ÚíŁ9 ¬“íţŤtš˝ţ#4ł3ŘŔÚ×ă|\¶ď®űéň˙zo,t-ó׏Ü‹ičTů1w“­8f•ľŮUL<6ˇÜQ¦‡ř¨'K··Ůs[• R ô˝†µĆ GÖű§ĂË”–)LýQM«mćvVń#„)@wVű{—OýŮä€G ҇ććsŤťÉCßXS ˝hk;ć—ťq–Ă:ś±bŮlZ·ů´°9}ü„źćµ•ô˙iCEŻvůű)_K;"Í|­¨đ ˛ÁńX>SáS1V´cĄh×É®ŰŢ1÷%$ÇP}ŮÎ#iíŽvÁÖÎ}Ăźë=ŮóÁv˙~d’lR’ş¬l^MáÄěű›ďŠ>›.7˰ăv/˙86QmIK{ÝŇňą„Fúžëą¶+DczÍćâKÚ8ú*Ą˘ÉśžqšÂ0yď¦Uű˙Ý źůPÖk†×^ůp|š†-Ťí•đ¬¦BÉŘyŐvqD«ë\&9ĆGř™ëŮË'˝+fŻŘŃŔ cŇdĆyV r«h ű5çt{¦)ŚF¶qÚĚ7Ui!úÚ0ăľĆŢçĎżD’&ĚjŹł¶wqś'ŹY–<ç$|,ü`üŢpąc±eĺÇĆç› ŤűÄą›mČľý_ä'Ü€< /ăë^ʇ7µďÓ2®ĂYŻ1çq|ľň,r>›*čMă(,]1 ›ń×1b ŐѢĚÇŹ…4ăś´ńÓ6÷oᆝ71e°ms˛ŻYmFľ×ŘX¶Ó¶Ś)Ż5M»žËŠVéŃ;fIštMŚ×=(;·ŹI|Ż`«Ľ]7¬ąş”nuÄÄľf}Ü©h˙Źţ®óѸÖ3˘Č5oîĎ+ąsű0Ź–&Čß…ä°Â•{'ěXl›ĆĎQ*Gůç9°5Ć’ő]ćlYů?]ýAÍ0Ľ˛Rn>'c®ÔŮ‹…I——ŐM†Îíu˝žhŔĘóď?x íľFŤ}u ‹b÷úmŔ{ˇÍh0ł;«mÉ(^ŕ&úDq‚›čč±®´°ZůšĎő»×,/ ý_ćRŻNt‹ě{>ĎšăCĐä*wM4şł%»zj:@Ďü!Ŕ%SeŤpâôĎC>ńćźď‚Y”íÜX˝6íŔJP6"tîÓ@ËĘ’z[ň&š¶1ČlÜ™µŢU<áQámŻI&S4ŢĄű×uXĆSĐ”¬ďwš>‹Ŕß7¬RĘłM˝ĐĘ^§c [1…ÂŐ~.[ ×\;Ç˙s¶®^ŽçFĎj+›Ą˛kä6ĂaJ´OÓB=r'/śž>Í·xďxáţbrTÇfŰŕÄ > aQÓđŞ”#9w›x—Xv˘ ȢňDŮLNOČ]-ąŔbľk›&ź´YB;Ńn\żć¶łPźŁÔvĎ+Ü:Žx1—µťOm ™ąÂ'üŔ=ˇV i*ÇăoÂU>ţoTúßŢ­»%ŹW‘Żî‡»ó»@Í\č |˘Ť•Nn÷&ĎŚżů"ŻŔă—újÉÂ&ČŘ~* =N]Ç=±‘Ĺ@M¶V·čS«Nś6{ au.“_zżÔ^Ýŕßü/Ů ˇđ7ŃmÇÍßË)“Ił™ bĚfäô'ţ†'ŕ2ąÔpşüU@ĆĎTx>Ţěýiü”}ŰÓ˙Ožp?aČ®^•Śl°ž»çĆUçKNŮďrĚKčç1ďó ?íËźŘey}Ż>^·ž°wťűĄęú^HÁŁ15Ń6Ůó˛92Ř~†ce«\çę©n´ N“™µüü€˝`Ь—Ćĺ°ť¨1ĆĚ:BŚk˙iáęóÍ1ś,IÓ61ŐŰsÔϱ?ˇ›aÇ˙ì=qµťŘ€Q^Ńlďŕkox{›^VÝZ3”5¸Ó*cęřű†żŮ®e‡ĺŞ?z‚´šĂ>K«éöÇ;Z˘˝´÷’[ůŕ¬13/ł=6hWç\˝M?ŻC€Ă­ăVd˘µ—ŐeÖ  ‘‹çţýĚ®iÇ*Dgb{Kv’¬ć8ßťŹEçró*ЬĚÇbÓaGŮůäw±Ű'§ŰU.˙«př±¬őőAŘ;W󤛤×b‡CSq»„寅m;?ŁźóL®Ň îcµNNa 3LËť=˝©^Ń:Žă°6uŘ­cOt†<Í~/“ĄvXL-iéÚ…`Ĺŕ…l»~Íž^;\ë¬y?ŇřěţřžČbĆ0§Wăą¶ă>?µĆ\xWD?wžŕőőą»±CËŮ)\ODůţ›AđzĆuÁ®Öů9í•ţźuqó󋙆͹9 #ű®śp‚ŰAś¦Ľí"Ź#ţúĽ·ÔľÜ îĹă Ą|ü׾yîß8ă\2D]Ö×8ćę%~;Ę.u¨bdra7–UäWüÓ6U׸ăřËćÚć/‚ožű<Ď|óęą˙ňß…^ŹÇąÎŐýyĄ°&`´š•ŤÁěu›|‚ŻÖxo‡ą‰Ü_o7;ű‡5čw+˙—kŐ…×1W:fIcQQV¬ÎÎöÎĹ!+Śü6Ă»Qzüď3S_´ýŻŹŻ/ŮÖ=;MŃeő8˘Ď?= žĺÍżňČ5i'®J?ô –9꬇®8®ş:±Óî‰éóŮSÔ’p7˙éĐŽŤk(ąśŞLšü÷ &ÇŤ•C#`F34g·cVĺŞ\#·ďĄ‰c—Ďđfôö‰ŠČłNś«fčţ?ëŔ„ś˛Bř9ëäY†Č×1=ű„h'úd^ß4Üev:A ›^ń·*?ňö›ˇßŠŃóĎŤ«Ŕń‘|†YľőŐµpîjpţ8}ľÖś”p5Ź®a ďĎóćIřIź°›ôiĹń7ëBąëąň¸qŘü†™c „SÁ±C€ďu±[tŕý)«öwz<çµ6—¬/ď”˙çŞpëŁpÚ1żŐ E°{â·YsrÇqÜ Kçäa´µşĹwąn!č˛ô=Ç‹řüă'ß?·˝íLĂŘÓ¶z®ořőh.Üęéźńă¬!W/@G±pŚ9÷÷š8aŠüŨü7mfúäĐ*$q6-̡ä†5ŰÚÝ€[ł*ęMď XłŁî±}ýţѵäOLvÇŠ3öÔeY••ţŻ¸ÉścHj¨h—^coÔ˝#E­‚Cźňâj7ţf#Ë®—Zç>şßµÚ˙6/? Űěőâť<Îł`2EÂęâ$öJZß*;¬ Ř˝ZdŕÄ-ß×`ĆĹÜÚůŤp•Ăź5Ľ1Ľf]µşpÍU÷đü·ĆĎnkú{żëŕbFţ ”Í«ú5·çÚ>'Näč÷Ş/í¤műüŤń˙K—gĂt‚¬h/tě7Ř´ý<6ÂŔöšk(Ód±ľ?]Ř7ô9¶ţ˛’cqu§bśż¬Ď9Y±#NßaŔ,4Š:k.á ]Čw‰ľÝ’ú.ľ&ʬçK©Ç¤@Ŕďµ%Úé5–!}kIWýńć’/ÁÁč¤ý®kŹęąĆ5™Ź™› x8‰˝mŞ",wP«Ń·ĆOúżX×€_›‰}U’ÄoRúPr'˘“fٶ/ť§]5'%-ô´{wřÎm.ŔĚ*ĂEóŃŘDÉ9ŐŃŽĘôÎ2äăaNČ϶ŽvçjĽ‹4/3 cđíş=šţ˝˙śŹň b#y2ŔčťXĺ*ír†áŤކ>ĽŹßŻâą e«.Đá{Řt0hoň]ĽNÇζô˙ú»ŕţ s[š°IÁ&í9ĆŔď›~×D€ŻĄ)Ľ6\{MŕgÜYSÖxÁ—ÚäËÔD­|~LýĎ2Beť řă¸Ů¤AĆśh‚ôÁ¨¤¦Ĺ(Nîx—üÖ3Né*ű łrbĆ1 ę{ÖöŐ†'F“·+*\2mPW kĚwH–ĽZ˝¬[ń¬×ńż>Őr?rŘőÄě?úB°–üVěŰédžyî÷§Ż6A7†#‚YĆ–ť¬ëěx ®s]ö$`ďš·ÍĆŻ8­ĎÉC·~ó{K›wöĐŰęęw:˙®öă°ź'ĺo“›‰ţGÎ(QhÖMѨĹ8¤yĆ{údŘ)Ă dťŃžőŠ:źN‘ŻdÎúěᚎńs®=ńú„ ͋ޞoČ_\Ç(ë›@o_·ľýp»7íVĹ× }ýă°ĽóúšÁň]K›rÎ8gŮ6­ Łę ą¶?T &ěsľSÄŃm×ÎZÎM;j}-źłf”:öwöMS$Ŕ™±¶űKo f-+†Ď»XV6¨7x˘× {íő±®9ć˙Ë˙ËH»ÎÉ›Ď ň¬mŃ«vÔšĄ Ŕ|źöžŹ›µWř/{L°‘÷§ŢKc‹sëcąó\÷‰ž; =6ĚvĹü4çĎ|† °i6ŃŽ™űq?PGç|ČżăĚěí×c±Ftűâ€čÄíR¸×D˘uř»Nş="†>ŇĐÉAľň…™USíŕ -+üuÂ*ŕ˝Ë«˙ćnÄ:küߎ9ˇY=ĐxÖ´}ĘČŕřG›‰8˙Ađ‚cËŽ0“¤¤ŞÓă­ăżŻzđćö©’H¦#4:ščĽĐ˛çţËo˙Â"^ćJ«RŽż9^ĂězńŽâšV?­ë5 s¸¤\őxřé‡;4’˘ÁÍfH Ë-×÷çQ™źĎźąÝă‰(ŕX *é] ;,-Uěȵá%Ă&*âŤQ‰}ň§°ĐaöuLÎsu{Đw0—w˛źź:8Ł9ŚĄźlEq1Ů)Š(}yů»ÂŠŘŰ˙ŢFĂĘĄY"­K.Ô˛žŚ‡Í–9ż]X}ß"űÄŃ/<şî®%UšÖ¶†>˝ĘůCmjîůŤŘŤôKv/'Í'»]ččFŁFT€ĺŁ ×đ·ěČ…t?9­Ľ‘4ðL«cžC2Ş[÷Ú töre(´ýÓö"ň˝÷,®żl€9ě4¤ ŻjÜŻŹ-÷'›x‡˙çĺY­ˇrÄiZŕŤLxôŽ·HąÇµfYťńm[ăAÜj(2ôNÉ}ďŞEşŽ›˘Ě›egŞ·YůଇĆŃőXś±Ý«słŹ/Šđîx#=ŰŃéN§d9\˝:öl1Ńäöěc‡<’ă|ŠÝWÁ*‚9äGڶćĹŁ°˘·u˛VÁjMűă*hB–w9ůÔl¶`T÷Ä ú5č·g…§Ü5úXŔ"ʱkÖč©'¶ őáżlŽYgőžU«Ivń C0÷ÚQ6Ç3[G2i8«ýźC+o##$X÷ÄŔuüţ’‚ŮBrĄ r§ýţüš•A+Ăw¨ă łŻH§&ÁŻĚýžčňv鄎ŕ¶]sMp"Î=ş ŐͤĆĹVYÍ3*®,ŹAGŰd"â/ööß÷ń´ä^â´îv׹ÉáűSÓXç˝ä)ł|Ď'tµ•%+¬sŠÝâţŘEÇŁrĚ®Žvš é ę–Q UŘË´6n®žćyěž5żC9sĚ–<$:žY´h˘ÎÄ lťE´čg67ń€ťš›Á/fôęvąjú0G®„Eë†Đö‚ż6ľËN݆‘čY€g#Z†e{Ő°v=“5Ú%Ň˝ŇxýŤ=ŐĄĂ믥®şZrŰ=©(Ł/Âąă‘s¤ÁçwFű›ç޶úl4=P©„–b_p¦´ĐŁÍĘ‹Ę[n{ć/?¬ţóëűőż#íö…•ë٧UAvNů7J|Żj–4L'y;Ôv(˘b}#L´—%•h©‹ěv×(;I¬MŽĂ đ@1rô|Ł,¶ąěĚŁ!î(ďݱëdÉjú/GëbÓĘQc>ľX·ćŘq4V–÷Ŕ|1Ű4%·ô8َ×–É ĘÜ7CvüÍ(cÁŘý¬AÂ3R)ë ákîúDśË˙w`[|%랣űty¨ˇ%s"'{8»fďCűeő|ÜĆq–'ł˝­ar{†źóö¦şÇ?Ť}jĽ([…2~—ůëŁúóŚč˛Š¶ Aő«XęX*ö2ČýŘýާ8®śŐUÜăú5ó öxXĘŮÄqV۲Ůîç„p>şÚ2FA`×Ü+žşÓŽ9‚ÇrÇŰŇ0¤<ü[8ŢÎŤ1îçćů›üß^¬ĂKĹ­u]ž>\©Úŕ¬ďš8FŠúG°łjĺůŰ·B—• ˇčydĹSdĽŻá1Ę´W~žQHĚúF4ĺÇbGńü®Gôî ÍëzkDä4–16PKĐőgZtY›Ĺ3ÔíŢ3ŠÝqŽäóä2A ÔĚsŢ&…U–ô-řę”;LßĘBö”ýs°Î CúżŽT±:F-YĐÚíżCTHQjlĎ´…ľÜXvĘ*˘ÖŮáQ>˝ĐąmqŁú|wŚ×ţDęţ=»Íáf¬Y3ƨ^ö^™>Ęíkg¦20ŃăëŤ>­Śu¬ĺ|sŤü†ya<0SK#Ň«ÂS4Źîú.ť˛¸Î8Q‡€K„˝A´%Ťz/qť°nÁ; Ŕ¦mżvł|›řó˘»Ý˙ďŘ„y~Ŕüä†ÍY¶»WŇśăą D¡%Ě÷r!Ý`Ç’ʆžž?LŔh´ѵ’“Ťv˛ş]ŠďO™Łŕż÷™«6Ů|‡śîYËL‘ëűŁŃď,č€Öbzi0Ín¶źŮËĹ8c;›WAt’ě\«¦&S=”ö˙sŮQş'ÇIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Xv/images/preview.png000066400000000000000000000141151361462701300251040ustar00rootroot00000000000000‰PNG  IHDRddG nţĆ”0PLTEćććôôôäääâââđđđďďďńńńîîîíííňňňěěěëëëęęęéééóóóčččHú¤+…IDATxÚ,š bÜ8 ©1ďCü˙oS%›l{Äh4€RZ;í5ËÎçĚ”zť÷ŢtZ­ľO9Wľ~G+µe~Ťúäš[-u<ąĽ˝ń/ľ÷Ľ9?µżąľă©<Öű*˝”9Kk)ýNş3­3WÚ)ť“řuYuŚšK«5ç^r/˙bqľŰó(…ßěňňíň°k}[{óČěýđÁQÇ(kőÎ|Ytłt.|u×ü±ÓŕDµć*«˛$Gdź§–uX‚ď´ěźZŮ|ä÷áÂy4>ćî;­–×Üť›üÝ„ťRŽ ďáWăČśµňGç,e´ű;˝żś¶§Ĺö/éł Ö›Ü ű™Â9řvăľµ˝đ”˝g®a§~±ŮÚ}îłąKÁ¶™bäáőťřaţţ¸ń|ë: űy­ú”¬©đYoł×Âɞҟڴ„Î,mµŮJÂä“ăĎąJ›w·Î‡0·(Ż®`Śńr}vß·íěżőW{XW˛ ÇÁV+?O÷|%üT×^=v;÷ž RjěŔ8)WćÁ—łrćÖqň‹mSűž´Y…¬7°&F4ÓŔRřśżsĆ—CO ź–ňl÷Ü9r:ť «Pe‡Ú0.őÇéÜÖŔzş•­0ęć~ěŔÉk`Ť'Ęű„CfgűR [UŤŰRÁřý–śĂÂ%Mdđ¬ĆÓ7\1AřN‚8s㸠7ĽíşüfŁ>ŞîQ4ęÓçxAn9é, –ÚN?˘±y0—›°ŢýěRzoe/cč´ÜďćĐśeŢIô€h0@€<˝ć)řY¤Ť¬ˇă7+­ß5řŸň˘8Ź›ňA1ľ9I› §‚OFćxCyiy@cÁ^ël@Ó±©eLŚąp Q˛Sű€;żPćöŘaĽóďw˝Ő!üpy„«h}ž"´YP(4=e<ó·;âEśŤS1_ßűŚN «Öşóá˙DĺÜ@„Ǹ#<Ëŕ~ódtp4śćq'ĘĹëeď%ŽąDé·çŤ[’~ĺÓś Ä1đ Ń%#iĂ* .±»ű ŞŹ|ę»TĆąNX‘ŰË›r '¬pžÓ=›Ö†Gx[0˘«˛®Ę„_JÜt˙Λîó>ó\6ĆÜŕÁ™AtaçjX·UŔš˝Ý6: “ęv‚čzäy#žźäX°üĆ+ŇŠi,K*đĹ'˙#Úóp‡B|Ą)ÁŕŽŮžXrx·Ú{ţĘ(€hs@ż¤Wč;ťiÔÎWĘ|4)K•¦ŕ ­_ 1Ö0÷\ݸK^ĹŰŤ)L­Ů0őHĆ+´TpćƞиŃal°1@Č‹<řš¨N5N čŃ,˛×2 ™Ç‡Ě"l= ĆÁoX‚ĽB`-NĚW˘ŁžlâŻcŠ–pB´ň@;{“!¸†·í“„‡Yä&vęĂl÷ÖĐž«dCŠ0$‘ŘŠ`N‹łôśÇQ‚żĚŐr=Ď‘‚ ×;ořž”‘´[Ş€ąM‡¸iÔ•‡D$“-Śj€_Łžđ0Δ‘Đ8ąź˝păo đ×Đ…(‘uúˇČvm÷ň"ŕ5ţÇś¶¬›źV‘Âřń'A&ÜA“VPĄ75„Z…›Ě‘şî#č3ĄĽ[˝ž·†ă{¦2h?ż$oCú•Ą}‘ä#±T bŇşËä¸]r$ŢŕÖţÝÇ0lĆI¦á?ůđ*$m˛ †ţWGhu×qło“H}/O¤4ł¬şëtDËä"oE?šŰëh ­'J_oÝ<°–ö.$O¶šÁ[sâFł$pÂ+ •w ć]ö0E*b"ŐřĆęĘĽ×*[ !ÜŢw¦zRjuó2á)îGŤřxEd…ÄÉŚdÇmĘßk˙.y§mnŔĹj×D§đ5ůeÄFyÄCthňš˛ÉI›«LčFAˇXáĂ`D°ą aĂżĄý.XćŁíL”Únpr.čŽçi~ͧYî„×ČXÄ??wÁ®{B”Řŕµ+ďH8đétéî ˇçU» °’KIÄ#Ň6> RQ퀿·ŤŢ–äBîÇ»·ăÇ5'„?ňńń†ĆLŮ#čŹ*DĐZ›˘Ą)ߍۢXĹr$„=»Ŕ?ĆJÄ}ž*ĐeăĎ$ˇX÷M-–^EŰ‚„~*ž%~ˇb(‡Ś"ee‰Ls¨‹ŞAĽ,Vď–˝¬~­/l4C Ŕć…ssm7Âţţ±2›€1P8Éćq’8ţ u¬˘Ég_A,đcg§ ×5,ľĹ[%±!}§vŕ'‹o$EŔšÍŰhçµÂ2ťü¸S`€3Śä6ćŐL €UĐ ®)k¸+2ĐŐZ!ë:j-?$ßنÄn ĺš3<ÎSr7«cÎǶµřé…†íÄcîB9D:Ę/=g:<>!”3싺ă7üdF‚íäĹçŚňbne P„WIáuň -ž‚$¨Żşba~95=BZO3ˇä+öµ1źŇExol4LĘ0Ő¶.ŕň­ny•óă•|ÂÔĹÜ©-4°\ “ě6Łf¬^—HR`ˇĄ+ĚtȆѼ‘;._Ĺź€#f)ÇX@Y Ť îĎeV°Ń4ř;Ŕ„ÝáÚX‰źm¬®°5™®IčlŇŚYŃJRâÝň RáXNeőĽ†§Ô0^~Tł3âíµ=$ľŹkYŘdăh ‡r’ňˇ»zŕ©BáXËL d˘B˘n. qÂĐ”)´ËÁ‚´áG‚%şéŁ( 6–k¤Vf\Ö”…űd!UQÝŞ÷lNáÉŚÍŕ—|fcžPřó°ĺZ'}ŠWt<\ý8ˇzř™S»a¦1·Ż 9q%”ż«!±¬ÄžE<ŚŤ±  N¨Š’¤KyÂmřšşŞăD´í Ě_ ń‰zC ş0ÍćSW‡mMś¬OAA” ‹î™u 1ÖHś—m%0Iâýi8ňąe•v,¤¬ŘB­„˛ţźáŠ›¤z ý̊ܧ3y5ň=„7ŤĐQĄzAcrýńo’ŐÔ?$G˛Őc/D(“]Óď'aO°);Löč¨#™zLşĚ)Mö!ćdó‰=¤oQóí&ă­©(~}¸Ů kĺGí‡ß6şäm¶&ü“ŕRĽo“‡Čś2ĄZ`·{š &sŞv Ąe=h®âęÖóś:©=¦FBŁÚ{ôđĹťÔQŘbŁF€µ=Dď™E¤łě–&C¨KÄ?J`(TŮn ąFgŐJĽ_Ó8®÷ýşD¸µSúߊĽQ®¦Düx®·†Žj.nľ}r®T=í^E<’ČŘ)©˛ÚXí" 9˘-BČ…DŃŁ•ÚóKŞ&c¶—§:xÁ®M/ÁY&*Ë(ű^jjvćJ˘l:V±Ń‘ \\|ÝáŘääd5ĎZ¬ń"NúǦÉĚHč˙mµ|‹(á.< WăŠÓ(÷“yŹŚţőT‘DĐp;5ŠąŮ^ęËTçł$aóßĺ()úĺö¨HCŁ.XČë{ŘĐÜ8Z ´~îî±Rô=ŃJŹŇ‚íN;âvKŁ–áćŰ q jzÓ 3ą¦i=" ľS´˘˙ć%ŃĚę8Łc}řee;jsţ .Ú­ĚŁ¦ŞR×é[Kęĺb3WqĐ…tTÇđZ±ĂÎ ąąĽAÄţ6ą üŢ'z×GÚÝH[ŰŹé§4Ú°‚‰}Žíu›oó×_¶÷'ödä}Ý”ěs—•Őż("ŇGŽb8“Ý kţ3.É:=Ě·á˝ôŮď(Těáńťßú<51Ç«ü/O7Ő'ľaŔŤ'ërhřGĆĆ 3Âry.ę*ň˝ÇÄ+Üŕ]‰"[ ‚[±6[M3BtÁ | ˘nĂѨËŃ´§´ÖŽŠó3Ŕ°×4$ …tÝöW~lm·RÎJ7ş–¸žĘf“iř±Ö]JVTč&ťźUź+U\5`iÁ辔иdhű®ö«Ňß›řůQNtů·ĆŇŔÍ’ľÚćĎhĘdŰTš&ÁÄ—đ ÍY—'÷ą%Č“ę%Ů÷ď3á0Ü ‘%|đ4pu9U#‹äŕK8Ńś`ŁSą‰†ą¦ 3”›KAd¶`YcEŘľ>ÉĎ„Ń\Ý\đ`un‚šşQŚą’íź.oŰ´ g†ŰÚ"Ë>ö@`ĂÂ6-ő#NÚŚ˘đö˛íä(²Ë\‡µ0vđç’fk"d^Ď.éü¤Ô(Őô}5Ď)ÂnâWvS.A¬ňĹGѢ¤ÎĂQ«*S¨±`*/äT ý ™śĆů雟ưĽźľfśßz^µCU,+¸® ×G˛Ą1ůÉ> :vÝšs#\ 6žXžSă\ó-ÇѢőŮoÇŘëbÂÖQZőŇ–NÄ}‡©ě ˙„:Žŕ1Π=‰l`=kěôEvo2X"Ř3@Ó®ĄĐ°ĎEI¨”r¶kíB]7r»)ü‰ŠÚů’í—h¶oŔ&©ÂěČEďíS^‹’ˇF˙4Gô™¬1ńcÍÎŰ+ ®.ĆMqpW—őQâ-&ş*:”ޱ šásĐvZ8-ő!÷ĘF•š!J´ÝF*‚S쏊 xI(ČćhË ŔFî­u[vߨq‚ŐČFDôú/öů‹(ÝÎŤXťâ8ó…Fůi%‘V'¸[f€÷}ž —懬a?Ěęg™GÚÂŮYźĘ°q6s‚ý$d:«S{}„őÄäł’j·ăčp—Ž4îm}b±9˛1·šz°ŽZb‡úqď+>eĂ ĹIđĺűÓÝąěő¦ÎŹPhě`“8A÷ŁśŻ8¨ëS®'FšâĘ›ű»|[µ T UăÚúôRdËí™×îhô ťgIźm,>le­c¦tŽe»ç^˙%J\ČÖ•^Q?™™bô D@6 ‰%µÖĂ&üj˙[-fhJŞ·éîm‹5},řŕ,G‹d±ż°Ö:Á§¬ůDCvÉ<1g…Ú#m&'HđËŰĘHy­FÇr;Q‰«˛}‰NĂtúťŁđ¤f˝_ź6˘sj Ц¤Ę4ů5Ë»Z–=ÔSµÖĐ„¤ůEÁޢ—d=VqźŘZ|mRx—ŻĎśť”Űts¸FFwؤˇ ŽôßWőŁĽ듇Ş"WE´¤†‹Ůݦ»Łé?˝1»sFę€ř;„ňXé9˝m˙©–@©ß€Ôľ ˇ€•·]j IöŘh¬ůĄĽÖN‘ń­Höl]d +uGJ#ý6]acłÓŹR©¸ ¬[räsôˇ3ldqFŘQ7¤|űaý˘ęśĽ9ł±Iă<©(VłŤ6g=†ż1\)ΚŤĘŞęş?9Ô6ZxŔj$~T“ĹOó®[*Ř|âŤ<rPŤ°¬ůFŻ™Ô“ůú ˘ţa×ö)»-đnł†@nďţÂ>Ş#učŤALŤł:cÚńvmC®&(Ţ:łűźÁfÖŢ “Z+[06)Đ:Ě߲ś…B˝€đfBvBćűÎIZ´ żib4öśI™śŰˇ¶utLťť'˝g…cą®Ő<—VYźšľ“ÄNf˙{j\"űZDڧťˇ×8ůyśýďFÄzóńžVď-F­É7šťIJ#†sF‹čŹ>€VĽl˛T:Ĺ÷âE“Íěn„ľO1ş•DŃ·c‘ç~żˇV–Vě…Lk% Ő–0Ś6Ěc›2Äçx›4±«SMUÂ&5fbŐ=¸˝ü·žďT8:µ©ďÔ>aFś¸|_&Ű;)[ KQÄ' <âţZ<ŕ^®é„7Ţ̱Ĺd#fš˛EWź=lp«3ŢžśńŮmvl@ľ+–·~)ME»Î(1Ť{LBžOC·ť”h‰/lÔ(ë»p–hŠŠĆî;1ŢU g{¦1–~WLWečvć¸Së ¶-Ţ…Pä9łŽwV^ßD°Ö+±`Ś"6?*|»ľ”…v Ą˝ěô/ÚűHŐ:α©”l Z 8Ąö= GÝqďo\čEĚG°ň‡ý1’Čjőˇ Ń"T"€żyđpŹÜŻScéŃÎŚ}ŔŻs<†}\ĆYtýFęÔĄĎóĄ»"®hkĆ·¬Ŕü‹ÁT6‹;Öź¦ÓpŰž \ [ŕŻó.ś8îC¨;ú||‡ŔtíxÜţŮ’L –Ą ŃwýkO<$»EšÜw[†/AášeřVg>!adĂWd¤NjS”§‘UľłĹ˙úřńxŞo‰9ÔőŐŽî8Ě âťě欫ŘQy§s)đ!µd'[Íć‹:"Ţ.âĹßt.÷8Gˇl$©]ťî;K 9řń¤:Ą÷ -„5sxŮŇ…^\Ü) š%žĆăťáë:Ż``űĐHŘçM s@]˛Đ,•eÍbü˝˝bDK_1ďU_Qú'Ŕ2#Źˇä€śIEND®B`‚rainloop-webmail-1.14.0/rainloop/v/0.0.0/themes/Xv/styles.less000066400000000000000000000031301361462701300236560ustar00rootroot00000000000000 // MAIN @main-color: #333; @main-background-color: #eee; @main-background-image: "images/background.jpg"; // LOADING @loading-color: #000; // LOGIN @login-color: #eee; @login-background-color: #757575; @login-rgba-background-color: rgba(0,0,0,0.5); @login-box-shadow: none; @login-border: none; @login-border-radius: 7px; // MENU @dropdown-menu-color: #333; @dropdown-menu-background-color: #fff; @dropdown-menu-hover-background-color: #757575; @dropdown-menu-hover-color: #eee; @dropdown-menu-disable-color: #999; // FOLDERS @folders-color: #333; @folders-disabled-color: #999; @folders-selected-color: #eee; @folders-selected-background-color: #757575; @folders-selected-rgba-background-color: rgba(0,0,0,0.5); @folders-focused-color: #eee; @folders-focused-background-color: #757575; @folders-focused-rgba-background-color: rgba(0,0,0,0.7); @folders-hover-color: #eee; @folders-hover-background-color: #757575; @folders-hover-rgba-background-color: rgba(0,0,0,0.5); @folders-drop-color: #eee; @folders-drop-background-color: #757575; @folders-drop-rgba-background-color: rgba(0,0,0,0.5); // SETTINGS @settings-menu-color: #333; @settings-menu-disabled-color: #999; @settings-menu-selected-color: #eee; @settings-menu-selected-background-color: #757575; @settings-menu-selected-rgba-background-color: rgba(0,0,0,0.5); @settings-menu-hover-color: #eee; @settings-menu-hover-background-color: #757575; @settings-menu-hover-rgba-background-color: rgba(0,0,0,0.5); // MESSAGE LIST @message-list-toolbar-background-color: #eee; @message-list-toolbar-gradient-start: #f4f4f4; @message-list-toolbar-gradient-end: #dfdfdf; rainloop-webmail-1.14.0/tasks/000077500000000000000000000000001361462701300161665ustar00rootroot00000000000000rainloop-webmail-1.14.0/tasks/assets.js000066400000000000000000000004241361462701300200260ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const gulp = require('gulp'); const { config } = require('./config'); const assetsCopy = () => gulp.src(config.paths.assets.src).pipe(gulp.dest(config.paths.static)); exports.assets = gulp.series(assetsCopy); rainloop-webmail-1.14.0/tasks/common.js000066400000000000000000000012741361462701300200200ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const gulp = require('gulp'); const rimraf = require('gulp-rimraf'); const fs = require('node-fs'); const { config } = require('./config'); exports.del = (dir) => gulp.src(dir, { read: false, allowEmpty: true }).pipe(rimraf()); exports.copy = (sFile, sNewFile, done) => { fs.writeFileSync(sNewFile, fs.readFileSync(sFile)); done(); }; exports.zip = (srcDir, destDir, fileName) => gulp .src(srcDir + '**/*') .pipe(require('gulp-zip')(fileName)) .pipe(gulp.dest(destDir)); exports.getHead = () => (!config.community ? config.head.rainloop : config.head.agpl); exports.cleanStatic = () => exports.del(config.paths.static); rainloop-webmail-1.14.0/tasks/config.js000066400000000000000000000101061361462701300177670ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const path = require('path'); const { argv } = require('yargs'); const config = { head: { rainloop: '/* RainLoop Webmail (c) RainLoop Team | Licensed under RainLoop Software License */', agpl: '/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL v3 */' }, devVersion: '0.0.0', releasesPath: 'build/dist/releases', community: !argv.pro, source: !!argv.source, watch: false, watchInterval: 1000, googleCompile: false, rainloopBuilded: false, destPath: '', cleanPath: '', zipSrcPath: '', zipFile: '', zipFileShort: '', paths: {} }; config.paths.globjs = 'dev/**/*.js'; config.paths.static = 'rainloop/v/' + config.devVersion + '/static/'; config.paths.staticJS = 'rainloop/v/' + config.devVersion + '/static/js/'; config.paths.staticMinJS = 'rainloop/v/' + config.devVersion + '/static/js/min/'; config.paths.staticCSS = 'rainloop/v/' + config.devVersion + '/static/css/'; config.paths.momentLocales = 'rainloop/v/' + config.devVersion + '/app/localization/moment/'; config.paths.assets = { src: 'assets/**/*.*' }; config.paths.less = { main: { src: 'dev/Styles/@Main.less', watch: ['dev/Styles/*.less'], options: { paths: [path.join(__dirname, 'dev', 'Styles'), path.join(__dirname, 'vendors', 'bootstrap', 'less')] } } }; config.paths.css = { main: { name: 'app.css', src: [ 'node_modules/normalize.css/normalize.css', 'vendors/jquery-ui/css/smoothness/jquery-ui-1.10.3.custom.css', 'vendors/fontastic/styles.css', 'vendors/jquery-nanoscroller/nanoscroller.css', 'vendors/jquery-letterfx/jquery-letterfx.min.css', 'vendors/inputosaurus/inputosaurus.css', 'vendors/flags/flags-fixed.css', 'node_modules/opentip/css/opentip.css', 'node_modules/pikaday/css/pikaday.css', 'vendors/lightgallery/dist/css/lightgallery.min.css', 'vendors/lightgallery/dist/css/lg-transitions.min.css', 'vendors/Progress.js/minified/progressjs.min.css', 'dev/Styles/_progressjs.css' ] }, social: { name: 'social.css', src: ['vendors/fontastic/styles.css', 'dev/Styles/_social.css'] } }; config.paths.js = { moment: { locales: ['node_modules/moment/locale/*.js'] }, libs: { name: 'libs.js', src: [ 'node_modules/jquery/dist/jquery.min.js', 'node_modules/jquery-migrate/dist/jquery-migrate.min.js', 'node_modules/jquery-mousewheel/jquery.mousewheel.js', 'node_modules/jquery-scrollstop/jquery.scrollstop.js', 'node_modules/jquery-backstretch/jquery.backstretch.min.js', 'vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js', // custom 'vendors/jquery-nanoscroller/jquery.nanoscroller.js', // custom (modified) 'vendors/jquery-wakeup/jquery.wakeup.js', // no-npm 'vendors/jquery-letterfx/jquery-letterfx.min.js', // no-npm 'vendors/inputosaurus/inputosaurus.js', // custom (modified) 'vendors/routes/signals.min.js', // fixed 'vendors/routes/hasher.min.js', // fixed 'vendors/routes/crossroads.min.js', // fixed 'vendors/jua/jua.min.js', // custom 'vendors/keymaster/keymaster.js', // custom (modified) 'vendors/qr.js/qr.min.js', // fixed (license) 'vendors/bootstrap/js/bootstrap.min.js', // fixed 'node_modules/underscore/underscore-min.js', 'node_modules/moment/min/moment.min.js', 'node_modules/knockout/build/output/knockout-latest.js', 'node_modules/knockout-sortable/build/knockout-sortable.min.js ', 'node_modules/matchmedia-polyfill/matchMedia.js', 'node_modules/matchmedia-polyfill/matchMedia.addListener.js', 'node_modules/simplestatemanager/dist/ssm.min.js', 'node_modules/autolinker/dist/Autolinker.min.js', 'node_modules/opentip/lib/opentip.js', 'node_modules/opentip/lib/adapter-jquery.js', 'vendors/lightgallery/dist/js/lightgallery.min.js', // license 'vendors/lightgallery/dist/js/lg-fullscreen.min.js', 'vendors/lightgallery/dist/js/lg-thumbnail.min.js', 'vendors/lightgallery/dist/js/lg-zoom.min.js', 'vendors/lightgallery/dist/js/lg-autoplay.min.js', 'node_modules/ifvisible.js/src/ifvisible.min.js' ] }, app: { name: 'app.js' }, admin: { name: 'admin.js' } }; exports.config = config; rainloop-webmail-1.14.0/tasks/css.js000066400000000000000000000050761361462701300173240ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const gulp = require('gulp'); const concat = require('gulp-concat-util'); const rename = require('gulp-rename'); const replace = require('gulp-replace'); const plumber = require('gulp-plumber'); const gulpif = require('gulp-if'); const eol = require('gulp-eol'); const livereload = require('gulp-livereload'); const filter = require('gulp-filter'); const expect = require('gulp-expect-file'); const { config } = require('./config'); const { del } = require('./common'); const cssClean = () => del(config.paths.staticCSS + '/*.css'); const cssMainBuild = () => { const autoprefixer = require('gulp-autoprefixer'), less = require('gulp-less'), lessFilter = filter('**/*.less', { restore: true }), src = config.paths.css.main.src.concat([config.paths.less.main.src]); return gulp .src(src) .pipe(expect.real({ errorOnFailure: true }, src)) .pipe(lessFilter) .pipe(gulpif(config.watch, plumber())) .pipe( less({ 'paths': config.paths.less.main.options.paths }) ) .pipe(lessFilter.restore) .pipe(concat(config.paths.css.main.name)) .pipe(autoprefixer()) .pipe(replace(/\.\.\/(img|images|fonts|svg)\//g, '$1/')) .pipe(eol('\n', true)) .pipe(gulp.dest(config.paths.staticCSS)) .pipe(livereload()); }; const cssSocialBuild = () => { const autoprefixer = require('gulp-autoprefixer'), src = config.paths.css.social.src; return gulp .src(src) .pipe(expect.real({ errorOnFailure: true }, src)) .pipe(concat(config.paths.css.social.name)) .pipe(autoprefixer()) .pipe(replace(/\.\.\/(img|images|fonts|svg)\//g, '$1/')) .pipe(eol('\n', true)) .pipe(gulp.dest(config.paths.staticCSS)); }; const cssMainMin = () => { const cleanCss = require('gulp-clean-css'); return gulp .src(config.paths.staticCSS + config.paths.css.main.name) .pipe(cleanCss()) .pipe(rename({ suffix: '.min' })) .pipe(eol('\n', true)) .pipe(gulp.dest(config.paths.staticCSS)); }; const cssSocialMin = () => { const cleanCss = require('gulp-clean-css'); return gulp .src(config.paths.staticCSS + config.paths.css.social.name) .pipe(cleanCss()) .pipe(rename({ suffix: '.min' })) .pipe(eol('\n', true)) .pipe(gulp.dest(config.paths.staticCSS)); }; const cssBuild = gulp.parallel(cssMainBuild, cssSocialBuild); const cssMin = gulp.parallel(cssMainMin, cssSocialMin); const cssLint = (done) => done(); const cssState1 = gulp.series(cssLint); const cssState2 = gulp.series(cssClean, cssBuild, cssMin); exports.cssLint = cssLint; exports.cssBuild = cssBuild; exports.css = gulp.parallel(cssState1, cssState2); rainloop-webmail-1.14.0/tasks/js.js000066400000000000000000000051211361462701300171370ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const gulp = require('gulp'); const concat = require('gulp-concat-util'), header = require('gulp-header'), rename = require('gulp-rename'), replace = require('gulp-replace'), uglify = require('gulp-uglify'), plumber = require('gulp-plumber'), gulpif = require('gulp-if'), eol = require('gulp-eol'), eslint = require('gulp-eslint'), cache = require('gulp-cached'), expect = require('gulp-expect-file'), size = require('gulp-size'), sourcemaps = require('gulp-sourcemaps'), gutil = require('gulp-util'); const { config } = require('./config'); const { del, getHead } = require('./common'); const { webpack } = require('./webpack'); const jsClean = () => del(config.paths.staticJS + '/**/*.{js,map}'); // libs const jsLibs = () => { const src = config.paths.js.libs.src; return gulp .src(src) .pipe(expect.real({ errorOnFailure: true }, src)) .pipe(concat(config.paths.js.libs.name, { separator: '\n\n' })) .pipe(eol('\n', true)) .pipe(replace(/sourceMappingURL=[a-z0-9.\-_]{1,20}\.map/gi, '')) .pipe(gulp.dest(config.paths.staticJS)); }; // app const jsApp = () => gulp .src(config.paths.staticJS + config.paths.js.app.name) .pipe(header(getHead() + '\n')) .pipe(eol('\n', true)) .pipe(gulp.dest(config.paths.staticJS)) .on('error', gutil.log); const jsAdmin = () => gulp .src(config.paths.staticJS + config.paths.js.admin.name) .pipe(header(getHead() + '\n')) .pipe(eol('\n', true)) .pipe(gulp.dest(config.paths.staticJS)) .on('error', gutil.log); const jsMin = () => gulp .src(config.paths.staticJS + '*.js') .pipe( size({ showFiles: true, showTotal: false }) ) .pipe(gulpif(config.source, sourcemaps.init({ loadMaps: true }))) .pipe(replace(/"rainloop\/v\/([^/]+)\/static\/js\/"/g, '"rainloop/v/$1/static/js/min/"')) .pipe(rename({ suffix: '.min' })) .pipe( uglify({ mangle: true, compress: true, ie8: false }) ) .pipe(eol('\n', true)) .pipe(gulpif(config.source, sourcemaps.write('./'))) .pipe( size({ showFiles: true, showTotal: false }) ) .pipe(gulp.dest(config.paths.staticMinJS)) .on('error', gutil.log); const jsLint = () => gulp .src(config.paths.globjs) .pipe(cache('eslint')) .pipe(eslint()) .pipe(gulpif(config.watch, plumber())) .pipe(eslint.format()) .pipe(eslint.failAfterError()); const jsState1 = gulp.series(jsLint); const jsState3 = gulp.parallel(jsLibs, jsApp, jsAdmin); const jsState2 = gulp.series(jsClean, webpack, jsState3, jsMin); exports.jsLint = jsLint; exports.js = gulp.parallel(jsState1, jsState2); rainloop-webmail-1.14.0/tasks/owncloud.js000066400000000000000000000052441361462701300203630ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ /* eslint-disable consistent-return */ const gulp = require('gulp'); const fs = require('node-fs'); const pkg = require('../package.json'); const { config } = require('./config'); const { copy, zip, del } = require('./common'); const { rainloopBuild } = require('./rainloop'); const owncloudCopy = () => { const versionFull = pkg.ownCloudVersion, dist = config.releasesPath + '/owncloud/' + versionFull + '/src/'; fs.mkdirSync(dist, '0777', true); fs.mkdirSync(dist + 'rainloop', '0777', true); return gulp .src('build/owncloud/rainloop-app/**/*', { base: 'build/owncloud/rainloop-app/' }) .pipe(gulp.dest(dist + 'rainloop')); }; const owncloudCopyRainLoop = () => { const versionFull = pkg.ownCloudVersion, dist = config.releasesPath + '/owncloud/' + versionFull + '/src/rainloop/'; if (config.rainloopBuilded && config.destPath) { return gulp.src(config.destPath + '/src/**/*', { base: config.destPath + '/src/' }).pipe(gulp.dest(dist + 'app/')); } return true; }; const owncloudCopyRainLoopClean = (done) => { if (config.cleanPath) { return del(config.cleanPath); } done(); }; const owncloudSetup = (done) => { const versionFull = pkg.ownCloudVersion, dist = config.releasesPath + '/owncloud/' + versionFull + '/src/'; fs.writeFileSync( dist + 'rainloop/appinfo/info.xml', fs .readFileSync(dist + 'rainloop/appinfo/info.xml', 'utf8') .replace('0.0', '' + versionFull + '') .replace( '', '' + (config.community ? 'AGPLv3' : 'RainLoop Software License') + '' ) ); fs.writeFileSync(dist + 'rainloop/appinfo/version', versionFull); fs.writeFileSync(dist + 'rainloop/VERSION', versionFull); config.destPath = config.releasesPath + '/owncloud/' + versionFull + '/'; config.cleanPath = dist; config.zipSrcPath = dist; config.zipFile = 'rainloop-owncloud-app-' + (config.community ? '' : 'standard-') + versionFull + '.zip'; config.zipFileShort = 'rainloop' + (config.community ? '' : '-standard') + '.zip'; done(); }; const owncloudZip = (done) => { if (config.destPath && config.zipSrcPath && config.zipFile) { return zip(config.zipSrcPath, config.destPath, config.zipFile); } done(); }; const owncloudClean = (done) => { if (config.cleanPath) { return del(config.cleanPath); } done(); }; const owncloudShortname = (done) => { copy(config.destPath + config.zipFile, config.destPath + config.zipFileShort, done); }; exports.owncloud = gulp.series( owncloudCopy, rainloopBuild, owncloudCopyRainLoop, owncloudCopyRainLoopClean, owncloudSetup, owncloudZip, owncloudClean, owncloudShortname ); rainloop-webmail-1.14.0/tasks/rainloop.js000066400000000000000000000047421361462701300203560ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ /* eslint-disable consistent-return */ const gulp = require('gulp'); const fs = require('node-fs'); const chmod = require('gulp-chmod'); const pkg = require('../package.json'); const { config } = require('./config'); const { copy, zip, del } = require('./common'); const rainloopCopy = () => { const versionFull = pkg.version, dist = config.releasesPath + '/webmail/' + versionFull + '/src/'; fs.mkdirSync(dist, '0777', true); fs.mkdirSync(dist + 'data'); fs.mkdirSync(dist + 'rainloop/v/' + versionFull, '0777', true); return gulp .src('rainloop/v/' + config.devVersion + '/**/*', { base: 'rainloop/v/' + config.devVersion }) .pipe(chmod(0o644, 0o755)) .pipe(gulp.dest(dist + 'rainloop/v/' + versionFull)); }; const rainloopSetup = (done) => { const versionFull = pkg.version, dist = config.releasesPath + '/webmail/' + versionFull + '/src/'; fs.writeFileSync(dist + 'data/VERSION', versionFull); fs.writeFileSync(dist + 'data/EMPTY', versionFull); fs.writeFileSync( dist + 'index.php', fs .readFileSync('index.php', 'utf8') .replace("'APP_VERSION', '0.0.0'", "'APP_VERSION', '" + versionFull + "'") .replace( "'APP_VERSION_TYPE', 'source'", "'APP_VERSION_TYPE', '" + (config.community ? 'community' : 'standard') + "'" ) ); fs.writeFileSync(dist + 'rainloop/v/' + versionFull + '/index.php.root', fs.readFileSync(dist + 'index.php')); if (config.community) { require('rimraf').sync(dist + 'rainloop/v/' + versionFull + '/app/libraries/RainLoop/Providers/Prem.php'); } config.destPath = config.releasesPath + '/webmail/' + versionFull + '/'; config.cleanPath = dist; config.zipSrcPath = dist; config.zipFile = 'rainloop-' + (config.community ? 'community-' : '') + versionFull + '.zip'; config.zipFileShort = 'rainloop-' + (config.community ? 'community-' : '') + 'latest.zip'; config.rainloopBuilded = true; done(); }; const rainloopZip = (done) => { if (config.destPath && config.zipSrcPath && config.zipFile) { return zip(config.zipSrcPath, config.destPath, config.zipFile); } done(); }; const rainloopClean = (done) => { if (config.cleanPath) { return del(config.cleanPath); } done(); }; const rainloopShortName = (done) => copy(config.destPath + config.zipFile, config.destPath + config.zipFileShort, done); exports.rainloopBuild = gulp.series(rainloopCopy, rainloopSetup); exports.rainloop = gulp.series(exports.rainloopBuild, rainloopZip, rainloopClean, rainloopShortName); rainloop-webmail-1.14.0/tasks/vendors.js000066400000000000000000000043041361462701300202050ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const gulp = require('gulp'); const header = require('gulp-header'); const stripbom = require('gulp-stripbom'); const { config } = require('./config'); const { del } = require('./common'); // moment const momentLocalesClear = () => del('rainloop/v/' + config.devVersion + '/app/localization/moment/*.js'); const momentLocales = () => gulp.src(config.paths.js.moment.locales).pipe(gulp.dest(config.paths.momentLocales)); const moment = gulp.series(momentLocalesClear, momentLocales); // lightgallery const lightgalleryFontsClear = () => del('rainloop/v/' + config.devVersion + '/static/css/fonts/lg.*'); const lightgalleryFontsCopy = () => gulp .src('vendors/lightgallery/dist/fonts/lg.*') .pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/css/fonts')); const lightgallery = gulp.series(lightgalleryFontsClear, lightgalleryFontsCopy); // fontastic const fontasticFontsClear = () => del('rainloop/v/' + config.devVersion + '/static/css/fonts/rainloop.*'); const fontasticFontsCopy = () => gulp .src('vendors/fontastic/fonts/rainloop.*') .pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/css/fonts')); const fontastic = gulp.series(fontasticFontsClear, fontasticFontsCopy); // ckeditor const ckeditorClear = () => del('rainloop/v/' + config.devVersion + '/static/ckeditor'); const ckeditorCopy = () => gulp .src([ 'vendors/ckeditor/**/*', '!vendors/ckeditor/samples{,/**}', '!vendors/ckeditor/adapters{,/**}', '!vendors/ckeditor/*.md' ]) .pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/ckeditor')); const ckeditorCopyPlugins = () => gulp .src('vendors/ckeditor-plugins/**/*') .pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/ckeditor/plugins')); const ckeditorSetup = () => gulp .src('rainloop/v/' + config.devVersion + '/static/ckeditor/*.js') .pipe(stripbom()) // eslint-disable-next-line quotes .pipe(header('\uFEFF')) // BOM .pipe(gulp.dest('rainloop/v/' + config.devVersion + '/static/ckeditor')); const ckeditor = gulp.series(ckeditorClear, ckeditorCopy, ckeditorCopyPlugins, ckeditorSetup); exports.vendors = gulp.parallel(moment, ckeditor, fontastic, lightgallery); rainloop-webmail-1.14.0/tasks/watch.js000066400000000000000000000005431361462701300176340ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const gulp = require('gulp'); const { config } = require('./config'); const { cssBuild } = require('./css'); const watchCss = gulp.series(cssBuild, (cb) => { gulp.watch(config.paths.less.main.watch, { interval: config.watchInterval }, cssBuild); cb(); }); exports.watchCss = watchCss; rainloop-webmail-1.14.0/tasks/webpack.js000066400000000000000000000020501361462701300201350ustar00rootroot00000000000000/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ const webpack = require('webpack'); const gutil = require('gulp-util'); const { config } = require('./config'); const webpackCfgBuilder = require('../webpack.config.builder.js'); const webpackError = (err) => { if (err) { gutil.log('[webpack]', '---'); gutil.log('[webpack]', err.error ? err.error.toString() : ''); gutil.log('[webpack]', err.message || ''); gutil.log('[webpack]', '---'); } }; const webpackCallback = (done) => (err, stats) => { if (err) { if (config.watch) { webpackError(err); } else { throw new gutil.PluginError('webpack', err); } } else if (stats && stats.compilation && stats.compilation.errors && stats.compilation.errors[0]) { if (config.watch) { stats.compilation.errors.forEach(webpackError); } else { throw new gutil.PluginError('webpack', stats.compilation.errors[0]); } } done(); }; exports.webpack = (done) => { webpack(webpackCfgBuilder(config.paths.staticJS, !config.community, 'production'), webpackCallback(done)); }; rainloop-webmail-1.14.0/vendors/000077500000000000000000000000001361462701300165215ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/Progress.js/000077500000000000000000000000001361462701300207405ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/Progress.js/LICENSE000066400000000000000000000021221361462701300217420ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 Afshin Mehrabani (afshin.meh@gmail.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rainloop-webmail-1.14.0/vendors/Progress.js/Makefile000066400000000000000000000000721361462701300223770ustar00rootroot00000000000000BASE = . build: cd build && node build.js .PHONY: buildrainloop-webmail-1.14.0/vendors/Progress.js/README.md000066400000000000000000000047171361462701300222300ustar00rootroot00000000000000# ProgressJS > ProgressJs is a JavaScript and CSS3 library which help developers to create and manage progress bar for every objects on the page. ## How To Use 1) Include `progress.js` and `progressjs.css` in the page (use minified version from `minified` folder for production) 2) Execute following JavaScript code in the page: ```javascript //to set progress-bar for whole page progressJs().start(); //or for specific element progressJs("#targetElement").start(); ``` Use other methods to increase, decrease or set a auto-increase function for your progress-bar. Furthermore, you can change the template using `setOption` method. ## API Check the API and method usage with example here: https://github.com/usablica/progress.js/wiki/API ## Build First you should install `nodejs` and `npm`, then first run this command: `npm install` to install all dependencies. Now you can run this command to minify all static resources: make build ## Roadmap - Add `example` folder and provide examples - More browser compatibility + mobile/tablet device support - Add more templates ## Release History * **v0.1.0** - 2014-02-14 - First version - Increase, decrease and auto-increase functions - Ability to design and add templates ## Author **Afshin Mehrabani** - [Twitter](https://twitter.com/afshinmeh) - [Github](https://github.com/afshinm) - [Personal page](http://afshinm.name/) ## License > Copyright (C) 2012 Afshin Mehrabani (afshin.meh@gmail.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.rainloop-webmail-1.14.0/vendors/Progress.js/bower.json000066400000000000000000000004551361462701300227550ustar00rootroot00000000000000{ "name": "Progress.js", "version": "0.1.0", "description": "Themeable HTML5 progress bar library", "keywords": ["progress", "progressbar", "loading"], "homepage": "http://usablica.github.io/progress.js/", "author": "Afshin Mehrabani", "main": ["src/progress.js","src/progressjs.css"] } rainloop-webmail-1.14.0/vendors/Progress.js/minified/000077500000000000000000000000001361462701300225245ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/Progress.js/minified/progress.min.js000066400000000000000000000122301361462701300255060ustar00rootroot00000000000000(function(l,e){"object"===typeof exports?e(exports):"function"===typeof define&&define.amd?define(["exports"],e):e(l)})(this,function(l){function e(a){this._targetElement="undefined"!=typeof a.length?a:[a];"undefined"===typeof window._progressjsId&&(window._progressjsId=1);"undefined"===typeof window._progressjsIntervals&&(window._progressjsIntervals={});this._options={theme:"blue",overlayMode:!1,considerTransition:!0}}function m(a,c){var d=this;100<=c&&(c=100);a.hasAttribute("data-progressjs")&& setTimeout(function(){"undefined"!=typeof d._onProgressCallback&&d._onProgressCallback.call(d,a,c);var b=h(a);b.style.width=parseInt(c)+"%";var b=b.querySelector(".progressjs-percent"),g=parseInt(b.innerHTML.replace("%","")),e=parseInt(c),j=function(a,b,c){var d=Math.abs(b-c);3>d?k=30:20>d?k=20:intervanIn=1;0!=b-c&&(a.innerHTML=(f?++b:--b)+"%",setTimeout(function(){j(a,b,c)},k))},f=!0;g>e&&(f=!1);var k=10;j(b,g,e)},50)}function h(a){a=parseInt(a.getAttribute("data-progressjs"));return document.querySelector('.progressjs-container > .progressjs-progress[data-progressjs="'+ a+'"] > .progressjs-inner')}function p(a){for(var c=0,d=this._targetElement.length;cparseInt(e.style.width.replace("%",""))&&(m.call(this,b,100),l=500);(function(a,b){setTimeout(function(){a.parentNode.className+=" progressjs-end";setTimeout(function(){a.parentNode.parentNode.removeChild(a.parentNode);b.removeAttribute("data-progressjs")},1E3)},l)})(e,b)}if(window._progressjsIntervals[a])try{clearInterval(window._progressjsIntervals[a]),window._progressjsIntervals[a]=null,delete window._progressjsIntervals[a]}catch(j){}}return this}, onbeforeend:function(a){if("function"===typeof a)this._onBeforeEndCallback=a;else throw Error("Provided callback for onbeforeend was not a function");return this},onbeforestart:function(a){if("function"===typeof a)this._onBeforeStartCallback=a;else throw Error("Provided callback for onbeforestart was not a function");return this},onprogress:function(a){if("function"===typeof a)this._onProgressCallback=a;else throw Error("Provided callback for onprogress was not a function");return this}};return l.progressJs= n}); rainloop-webmail-1.14.0/vendors/Progress.js/minified/progressjs.min.css000066400000000000000000000100221361462701300262140ustar00rootroot00000000000000.progressjs-inner{width:0}.progressjs-progress{z-index:9999999}.progressjs-theme-blue .progressjs-inner{height:2px;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blue.progressjs-end{-webkit-transition:opacity .2s ease-out;-moz-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blue .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:white;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlay{background-color:white;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.progressjs-theme-blueOverlay .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db}.progressjs-theme-blueOverlay.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlay .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadius{background-color:white;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadius .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadius.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadius .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusHalfOpacity{background-color:white;opacity:.5;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusHalfOpacity.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-percent{display:none}.progressjs-theme-blueOverlayRadiusWithPercentBar{background-color:white;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-inner{height:100%;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out;background-color:#3498db;border-radius:5px}.progressjs-theme-blueOverlayRadiusWithPercentBar.progressjs-end{opacity:0!important}.progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-percent{width:70px;text-align:center;height:40px;position:absolute;right:50%;margin-right:-35px;top:50%;margin-top:-20px;font-size:30px;opacity:.5}.progressjs-theme-blackRadiusInputs{height:10px;border-radius:10px;overflow:hidden}.progressjs-theme-blackRadiusInputs .progressjs-inner{height:2px;-webkit-transition:all 1s ease-out;-moz-transition:all 1s ease-out;-o-transition:all 1s ease-out;transition:all 1s ease-out;background-color:#34495e}.progressjs-theme-blackRadiusInputs.progressjs-end{-webkit-transition:opacity .2s ease-out;-moz-transition:opacity .2s ease-out;-o-transition:opacity .2s ease-out;transition:opacity .2s ease-out;opacity:0}.progressjs-theme-blackRadiusInputs .progressjs-percent{display:none}rainloop-webmail-1.14.0/vendors/Progress.js/package.json000066400000000000000000000006351361462701300232320ustar00rootroot00000000000000{ "name": "Progress.js", "description": "Themeable HTML5 progress bar library", "version": "0.1.0", "author": "Afshin Mehrabani ", "repository": { "type": "git", "url": "https://github.com/usablica/progress.js" }, "devDependencies": { "node-minify": "*" }, "engine": [ "node >=0.1.90" ], "main": "src/progress.js" }rainloop-webmail-1.14.0/vendors/Progress.js/src/000077500000000000000000000000001361462701300215275ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/Progress.js/src/progress.js000066400000000000000000000370061361462701300237370ustar00rootroot00000000000000/** * Progress.js v0.1.0 * https://github.com/usablica/progress.js * MIT licensed * * Copyright (C) 2013 usabli.ca - Afshin Mehrabani (@afshinmeh) */ (function (root, factory) { if (typeof exports === 'object') { // CommonJS factory(exports); } else if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['exports'], factory); } else { // Browser globals factory(root); } } (this, function (exports) { //Default config/variables var VERSION = '0.1.0'; /** * ProgressJs main class * * @class ProgressJs */ function ProgressJs(obj) { if (typeof obj.length != 'undefined') { this._targetElement = obj; } else { this._targetElement = [obj]; } if (typeof window._progressjsId === 'undefined') window._progressjsId = 1; if (typeof window._progressjsIntervals === 'undefined') window._progressjsIntervals = {}; this._options = { //progress bar theme theme: 'blue', //overlay mode makes an overlay layer in the target element overlayMode: false, //to consider CSS3 transitions in events considerTransition: true }; } /** * Start progress for specific element(s) * * @api private * @method _createContainer */ function _startProgress() { //call onBeforeStart callback if (typeof this._onBeforeStartCallback != 'undefined') { this._onBeforeStartCallback.call(this); } //create the container for progress bar _createContainer.call(this); for (var i = 0, elmsLength = this._targetElement.length; i < elmsLength; i++) { _setProgress.call(this, this._targetElement[i]); } } /** * Set progress bar for specific element * * @api private * @method _setProgress * @param {Object} targetElement */ function _setProgress(targetElement) { //if the target element already as `data-progressjs`, ignore the init if (targetElement.hasAttribute("data-progressjs")) return; //get target element position var targetElementOffset = _getOffset.call(this, targetElement); targetElement.setAttribute("data-progressjs", window._progressjsId); var progressElementContainer = document.createElement('div'); progressElementContainer.className = 'progressjs-progress progressjs-theme-' + this._options.theme; //set the position percent elements, it depends on targetElement tag if (targetElement.tagName.toLowerCase() === 'body') { progressElementContainer.style.position = 'fixed'; } else { progressElementContainer.style.position = 'absolute'; } progressElementContainer.setAttribute("data-progressjs", window._progressjsId); var progressElement = document.createElement("div"); progressElement.className = "progressjs-inner"; //create an element for current percent of progress bar var progressPercentElement = document.createElement('div'); progressPercentElement.className = "progressjs-percent"; progressPercentElement.innerHTML = "1%"; progressElement.appendChild(progressPercentElement); if (this._options.overlayMode && targetElement.tagName.toLowerCase() === 'body') { //if we have `body` for target element and also overlay mode is enable, we should use a different //position for progress bar container element progressElementContainer.style.left = 0; progressElementContainer.style.right = 0; progressElementContainer.style.top = 0; progressElementContainer.style.bottom = 0; } else { //set progress bar container size and offset progressElementContainer.style.left = targetElementOffset.left + 'px'; progressElementContainer.style.top = targetElementOffset.top + 'px'; progressElementContainer.style.width = targetElementOffset.width + 'px'; if (this._options.overlayMode) { progressElementContainer.style.height = targetElementOffset.height + 'px'; } } progressElementContainer.appendChild(progressElement); //append the element to container var container = document.querySelector('.progressjs-container'); container.appendChild(progressElementContainer); _setPercentFor(targetElement, 1); //and increase the progressId ++window._progressjsId; } /** * Set percent for all elements * * @api private * @method _setPercent * @param {Number} percent */ function _setPercent(percent) { for (var i = 0, elmsLength = this._targetElement.length; i < elmsLength; i++) { _setPercentFor.call(this, this._targetElement[i], percent); } } /** * Set percent for specific element * * @api private * @method _setPercentFor * @param {Object} targetElement * @param {Number} percent */ function _setPercentFor(targetElement, percent) { var self = this; //prevent overflow! if (percent >= 100) percent = 100; if (targetElement.hasAttribute("data-progressjs")) { //setTimeout for better CSS3 animation applying in some cases setTimeout(function() { //call the onprogress callback if (typeof self._onProgressCallback != 'undefined') { self._onProgressCallback.call(self, targetElement, percent); } var percentElement = _getPercentElement(targetElement); percentElement.style.width = parseInt(percent) + '%'; var percentElement = percentElement.querySelector(".progressjs-percent"); var existingPercent = parseInt(percentElement.innerHTML.replace('%', '')); //start increase/decrease the percent element with animation (function(percentElement, existingPercent, currentPercent) { var increasement = true; if (existingPercent > currentPercent) { increasement = false; } var intervalIn = 10; function changePercentTimer(percentElement, existingPercent, currentPercent) { //calculate the distance between two percents var distance = Math.abs(existingPercent - currentPercent); if (distance < 3) { intervalIn = 30; } else if (distance < 20) { intervalIn = 20; } else { intervanIn = 1; } if ((existingPercent - currentPercent) != 0) { //set the percent percentElement.innerHTML = (increasement ? (++existingPercent) : (--existingPercent)) + '%'; setTimeout(function() { changePercentTimer(percentElement, existingPercent, currentPercent); }, intervalIn); } } changePercentTimer(percentElement, existingPercent, currentPercent); })(percentElement, existingPercent, parseInt(percent)); }, 50); } } /** * Get the progress bar element * * @api private * @method _getPercentElement * @param {Object} targetElement */ function _getPercentElement(targetElement) { var progressjsId = parseInt(targetElement.getAttribute('data-progressjs')); return document.querySelector('.progressjs-container > .progressjs-progress[data-progressjs="' + progressjsId + '"] > .progressjs-inner'); } /** * Auto increase the progress bar every X milliseconds * * @api private * @method _autoIncrease * @param {Number} size * @param {Number} millisecond */ function _autoIncrease(size, millisecond) { var self = this; var progressjsId = parseInt(this._targetElement[0].getAttribute('data-progressjs')); if (typeof window._progressjsIntervals[progressjsId] != 'undefined') { clearInterval(window._progressjsIntervals[progressjsId]); } window._progressjsIntervals[progressjsId] = setInterval(function() { _increasePercent.call(self, size); }, millisecond); } /** * Increase the size of progress bar * * @api private * @method _increasePercent * @param {Number} size */ function _increasePercent(size) { for (var i = 0, elmsLength = this._targetElement.length; i < elmsLength; i++) { var currentElement = this._targetElement[i]; if (currentElement.hasAttribute('data-progressjs')) { var percentElement = _getPercentElement(currentElement); var existingPercent = parseInt(percentElement.style.width.replace('%', '')); if (existingPercent) { _setPercentFor.call(this, currentElement, existingPercent + (size || 1)); } } } } /** * Close and remove progress bar * * @api private * @method _end */ function _end() { //call onBeforeEnd callback if (typeof this._onBeforeEndCallback != 'undefined') { if (this._options.considerTransition === true) { //we can safety assume that all layers would be the same, so `this._targetElement[0]` is the same as `this._targetElement[1]` _getPercentElement(this._targetElement[0]).addEventListener(whichTransitionEvent(), this._onBeforeEndCallback, false); } else { this._onBeforeEndCallback.call(this); } } var progressjsId = parseInt(this._targetElement[0].getAttribute('data-progressjs')); for (var i = 0, elmsLength = this._targetElement.length; i < elmsLength; i++) { var currentElement = this._targetElement[i]; var percentElement = _getPercentElement(currentElement); if (!percentElement) return; var existingPercent = parseInt(percentElement.style.width.replace('%', '')); var timeoutSec = 1; if (existingPercent < 100) { _setPercentFor.call(this, currentElement, 100); timeoutSec = 500; } //I believe I should handle this situation with eventListener and `transitionend` event but I'm not sure //about compatibility with IEs. Should be fixed in further versions. (function(percentElement, currentElement) { setTimeout(function() { percentElement.parentNode.className += " progressjs-end"; setTimeout(function() { //remove the percent element from page percentElement.parentNode.parentNode.removeChild(percentElement.parentNode); //and remove the attribute currentElement.removeAttribute("data-progressjs"); }, 1000); }, timeoutSec); })(percentElement, currentElement); } //clean the setInterval for autoIncrease function if (window._progressjsIntervals[progressjsId]) { //`delete` keyword has some problems in IE try { clearInterval(window._progressjsIntervals[progressjsId]); window._progressjsIntervals[progressjsId] = null; delete window._progressjsIntervals[progressjsId]; } catch(ex) { } } } /** * Create the progress bar container * * @api private * @method _createContainer */ function _createContainer() { //first check if we have an container already, we don't need to create it again if (!document.querySelector(".progressjs-container")) { var containerElement = document.createElement("div"); containerElement.className = "progressjs-container"; document.body.appendChild(containerElement); } } /** * Get an element position on the page * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966 * * @api private * @method _getOffset * @param {Object} element * @returns Element's position info */ function _getOffset(element) { var elementPosition = {}; if (element.tagName.toLowerCase() === 'body') { //set width elementPosition.width = element.clientWidth; //set height elementPosition.height = element.clientHeight; } else { //set width elementPosition.width = element.offsetWidth; //set height elementPosition.height = element.offsetHeight; } //calculate element top and left var _x = 0; var _y = 0; while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) { _x += element.offsetLeft; _y += element.offsetTop; element = element.offsetParent; } //set top elementPosition.top = _y; //set left elementPosition.left = _x; return elementPosition; } /** * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1 * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically * * @param obj1 * @param obj2 * @returns obj3 a new object based on obj1 and obj2 */ function _mergeOptions(obj1, obj2) { var obj3 = {}; for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; } for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; } return obj3; } var progressJs = function (targetElm) { if (typeof (targetElm) === 'object') { //Ok, create a new instance return new ProgressJs(targetElm); } else if (typeof (targetElm) === 'string') { //select the target element with query selector var targetElement = document.querySelectorAll(targetElm); if (targetElement) { return new ProgressJs(targetElement); } else { throw new Error('There is no element with given selector.'); } } else { return new ProgressJs(document.body); } }; /** * Get correct transition callback * Thanks @webinista: http://stackoverflow.com/a/9090128/375966 * * @returns transition name */ function whichTransitionEvent() { var t; var el = document.createElement('fakeelement'); var transitions = { 'transition': 'transitionend', 'OTransition': 'oTransitionEnd', 'MozTransition': 'transitionend', 'WebkitTransition': 'webkitTransitionEnd' } for (t in transitions) { if (el.style[t] !== undefined) { return transitions[t]; } } } /** * Current ProgressJs version * * @property version * @type String */ progressJs.version = VERSION; //Prototype progressJs.fn = ProgressJs.prototype = { clone: function () { return new ProgressJs(this); }, setOption: function(option, value) { this._options[option] = value; return this; }, setOptions: function(options) { this._options = _mergeOptions(this._options, options); return this; }, start: function() { _startProgress.call(this); return this; }, set: function(percent) { _setPercent.call(this, percent); return this; }, increase: function(size) { _increasePercent.call(this, size); return this; }, autoIncrease: function(size, millisecond) { _autoIncrease.call(this, size, millisecond); return this; }, end: function() { _end.call(this); return this; }, onbeforeend: function(providedCallback) { if (typeof (providedCallback) === 'function') { this._onBeforeEndCallback = providedCallback; } else { throw new Error('Provided callback for onbeforeend was not a function'); } return this; }, onbeforestart: function(providedCallback) { if (typeof (providedCallback) === 'function') { this._onBeforeStartCallback = providedCallback; } else { throw new Error('Provided callback for onbeforestart was not a function'); } return this; }, onprogress: function(providedCallback) { if (typeof (providedCallback) === 'function') { this._onProgressCallback = providedCallback; } else { throw new Error('Provided callback for onprogress was not a function'); } return this; } }; exports.progressJs = progressJs; return progressJs; })); rainloop-webmail-1.14.0/vendors/Progress.js/src/progressjs.css000066400000000000000000000122321361462701300244420ustar00rootroot00000000000000.progressjs-inner { width: 0; } .progressjs-progress { z-index: 9999999; } /* blue theme, like iOS 7 progress bar */ .progressjs-theme-blue .progressjs-inner { height: 2px; -webkit-transition: all 0.3s ease-out; -moz-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; transition: all 0.3s ease-out; background-color: #3498db; } .progressjs-theme-blue.progressjs-end { -webkit-transition: opacity 0.2s ease-out; -moz-transition: opacity 0.2s ease-out; -o-transition: opacity 0.2s ease-out; transition: opacity 0.2s ease-out; opacity: 0; } .progressjs-theme-blue .progressjs-percent { display: none; } /* blue theme with overlay layer, no percent bar */ .progressjs-theme-blueOverlay { background-color: white; -webkit-transition: all 0.2s ease-out; -moz-transition: all 0.2s ease-out; -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; } .progressjs-theme-blueOverlay .progressjs-inner { height: 100%; -webkit-transition: all 0.3s ease-out; -moz-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; transition: all 0.3s ease-out; background-color: #3498db; } .progressjs-theme-blueOverlay.progressjs-end { opacity: 0 !important; } .progressjs-theme-blueOverlay .progressjs-percent { display: none; } /* blue theme with overlay layer, no percent bar */ .progressjs-theme-blueOverlay { background-color: white; -webkit-transition: all 0.2s ease-out; -moz-transition: all 0.2s ease-out; -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; } .progressjs-theme-blueOverlay .progressjs-inner { height: 100%; -webkit-transition: all 0.3s ease-out; -moz-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; transition: all 0.3s ease-out; background-color: #3498db; } .progressjs-theme-blueOverlay.progressjs-end { opacity: 0 !important; } .progressjs-theme-blueOverlay .progressjs-percent { display: none; } /* Blue theme with border radius and overlay layer */ .progressjs-theme-blueOverlayRadius { background-color: white; -webkit-transition: all 0.2s ease-out; -moz-transition: all 0.2s ease-out; -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; border-radius: 5px; } .progressjs-theme-blueOverlayRadius .progressjs-inner { height: 100%; -webkit-transition: all 0.3s ease-out; -moz-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; transition: all 0.3s ease-out; background-color: #3498db; border-radius: 5px; } .progressjs-theme-blueOverlayRadius.progressjs-end { opacity: 0 !important; } .progressjs-theme-blueOverlayRadius .progressjs-percent { display: none; } /* Blue theme with border radius and overlay layer */ .progressjs-theme-blueOverlayRadiusHalfOpacity { background-color: white; opacity: 0.5; -webkit-transition: all 0.2s ease-out; -moz-transition: all 0.2s ease-out; -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; border-radius: 5px; } .progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-inner { height: 100%; -webkit-transition: all 0.3s ease-out; -moz-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; transition: all 0.3s ease-out; background-color: #3498db; border-radius: 5px; } .progressjs-theme-blueOverlayRadiusHalfOpacity.progressjs-end { opacity: 0 !important; } .progressjs-theme-blueOverlayRadiusHalfOpacity .progressjs-percent { display: none; } /* Blue theme with border radius, overlay layer and percent bar */ .progressjs-theme-blueOverlayRadiusWithPercentBar { background-color: white; -webkit-transition: all 0.2s ease-out; -moz-transition: all 0.2s ease-out; -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; border-radius: 5px; } .progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-inner { height: 100%; -webkit-transition: all 0.3s ease-out; -moz-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; transition: all 0.3s ease-out; background-color: #3498db; border-radius: 5px; } .progressjs-theme-blueOverlayRadiusWithPercentBar.progressjs-end { opacity: 0 !important; } .progressjs-theme-blueOverlayRadiusWithPercentBar .progressjs-percent { width: 70px; text-align: center; height: 40px; position: absolute; right: 50%; margin-right: -35px; top: 50%; margin-top: -20px; font-size: 30px; opacity: .5; } .progressjs-theme-blackRadiusInputs { height: 10px; border-radius: 10px; overflow: hidden; } .progressjs-theme-blackRadiusInputs .progressjs-inner { height: 2px; -webkit-transition: all 1s ease-out; -moz-transition: all 1s ease-out; -o-transition: all 1s ease-out; transition: all 1s ease-out; background-color: #34495e; } .progressjs-theme-blackRadiusInputs.progressjs-end { -webkit-transition: opacity 0.2s ease-out; -moz-transition: opacity 0.2s ease-out; -o-transition: opacity 0.2s ease-out; transition: opacity 0.2s ease-out; opacity: 0; } .progressjs-theme-blackRadiusInputs .progressjs-percent { display: none; }rainloop-webmail-1.14.0/vendors/bootstrap/000077500000000000000000000000001361462701300205365ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/bootstrap/.code-changed000066400000000000000000000000001361462701300230260ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/bootstrap/LICENSE000066400000000000000000000236741361462701300215570ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONSrainloop-webmail-1.14.0/vendors/bootstrap/img/000077500000000000000000000000001361462701300213125ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/bootstrap/img/glyphicons-halflings-white.png000066400000000000000000000211111361462701300272560ustar00rootroot00000000000000‰PNG  IHDRŐźÓł{ŮPLTE˙˙˙ůůů˙˙˙˙˙˙ýýýmmm˙˙˙˙˙˙˙˙˙˙˙˙đđđţţţöööüüü˙˙˙˙˙˙ÚÚÚÂÂÂôôô˙˙˙˙˙˙ôôô÷÷÷˙˙˙łłłýýýâââ°°°˙˙˙˙˙˙űűűçççţţţ˙˙˙íííĎĎĎýýýöööíííűűűçççúúúááá’’’ţţţţţţÁÁÁtttáááĐĐĐóóó»»»ˇˇˇ€€€ýýýÔÔÔbbb˙˙˙ŐŐŐřřřÜÜÜúúúűűűéééűűűýýýýýýŃŃŃňňňüüüřřřëëëüüü¶¶¶ĆĆĆĺĺĺîîîőőőýýýeeegggđđđ¶¶¶ŕŕŕ÷÷÷úúúéééĺĺĺúúúřřřËËË˙˙˙„„„ńńńxxx÷÷÷ÝÝÝůůůČČČŇŇŇěěěúúúŢŢŢâââćććóóó›››¨¨¨ĄĄĄÜÜÜîîî˙˙˙ńńńÉÉÉđđđ˙˙˙˙˙˙ŢŢŢĆĆĆĽĽĽëëëÖÖÖĐĐĐâââůůůôôôâââěěěőőő´´´˙˙˙ýýýűűűüüüúúúćććäääüüü÷÷÷°°°™™™ýýýěěěüüüÁÁÁééé˙˙˙ÚÚÚđđđđđđőőőńńńţţţřřřţţţŽŽŽâââűűűůůůÜÜÜ˙˙˙ňňňúúúźźźííí÷÷÷öööčččóóóúúúőőőőőő¦¦¦ËËËúúúřřřÓÓÓëëëúúúëë몪Şóóóííí˘˘˘ĎĎĎÚÚÚÖÖÖ˘˘˘ëëëâââůůůUUUÍÍÍ˙˙˙ÖÖÖăăăáááęęęüüü˙˙˙öööűűűóóóôôôĚĚĚ˙˙˙˙˙˙ůůůőőő˙˙˙ňňňýýýŮŮŮüüüűűűüüüéééżżżűűűęęęéééţţţ˙˙˙řrOćňtRNSÔĎń#ďź_ /©đĆâżoS·ß?†ĹCá kDŹŻÂŤŔOS_ Ąš˛ŚÓ6Đŕ>4!~a §@1Ń_'oÄn˘Ň‹‘€M†ˇ“3±BQj™¶p&%!lµĂ"Xqr;€— A[‚<`‰am}4…3/0I¨PCM!6(*gK&YQ¦GDP,ĺ`’{VP¤-ęxÁ)hÝ7‡e1]ôßWżł$—‡1bÄzSÜ•cOŮÍ]ŹŔŠ–U;Zié»'yÜ"€âĐĐ‘ŤÝ؆‰K 64ÖYś*.vč@˛¸îŽc.};‡ďźtN%¨DIŞĘĐ !Z¶ĐŹ5LńHŁ2Ú6 ŚÉŻŽÖ"Š Ô-b±E,,)ĘŹŔ BŚ·¦>mąŞĂăúnřö6pmźRöO wm@°ÝĚVÝ#?É'C…Č‘Z#©Žqž‡ěŔbŇÓ|$˝:Ü)‰Â/Eľ%÷ânRąq—CŕhnµÉ%őiÓĚ“­ş¶¶ß}lm ?i˙dâdĂ"€,Ř­Ç`¬Hń"r.zˇĽ‹ŽÁ~ýěü(bđQÜU&ę˝—)–5őęX#•§ ňé™EMŞćÜR<Í*p[€[%.©OÉĚŁĄk7“lIo°ý¨ý“¶ßJ°F  ĄlV!̡ÄuH‚`ĆĽ™€—›ç‚&˘,Çz´ÉRk$¤ň¨|$ölŠ»ĽXbü˘âéÇjߪČdU±ű?ÎŁ$Hµî¸©W±ľ$Uű'…ĆĹHÜE3*Ő­ş€µµU\}ę­ý†(Ň ¤zhVk}gÇu«Rk$¤ň%¨|‰T¨|Úęck¦獳"ăžä±Dç”ý«_W+‹®”Ę.QňŇĹ)Ő@«ý“Ć˝€H˘Ŕ›Íbµs¸ÔlžŽT´©·D˙ô­RÄ2XmŁ#a Ýęş3lYĂÎzĚjąŽťÔă’š#!Ţ 4ţJ´Ä8Ń(Śňcµv™‰ľt]­a·T™Çŕř Ň÷ŹD Î…ŕĽáQ?^-‹Ő_^$:\˙ěŢV  $«•N|ě=(vZ'qŹ6ąZđ׆‡×üB5VěĚî!y†´Ľ3äßKś˙㱿bŕv4ŚńxđëęŁâR]al—í!ÔţIŰo‡P‰@ĹtĄäVy”şîŕLď˙ŮŞmlµÚżI¨Ub|[*°¶lke'*ľWdîŔÝdŕłđďD·Óť}\W›_Wßť´ů¶¤rĐNÚ?™řŰvŢ«Á۲X%§Ž0u‡öoui*„üJV·€Ć¦‡b%†}ôăi5IĄYlNźE-wĐĎ‚űf_W3mţIĺŕ…Äý“…—-Śmʬ˛Q)“S µÖk´«TC7ęím¤<"ÄôÜŚ‡b‹T|ěĆ'¦Ő$µŇźŁóóÖR&>ĄęO pśőşšľů…ę6ݬŇöçú˝t±¨îĄS­ŽN\©×ŻLŚîmŐř\ČÎŃĘÄr@¦3žuŤT b7úÓt.5.q©ôČ3˛r0ü=™8TÂżŞi­J©\ëČ6uF ”˛R¸32^÷íń'ĹŞŠóŔí±xâI« ďŇF„8O{%8­žkJšÓMSČ´dâBEdćŃč ďWť‚CYĂ÷O:/OŚN/—I‹ę_=˝€xFE”Ń! Í=Ąći:oÁ~’ˇ· yţ?¶š'·š'·š[Í“[Í“[Í“[Í“[Í­–č».ąU>±$÷P–ƦŠc%†] Ű\c©´:é| ý,eŻSśZ,‘ošżXríäÎËXş!ëRć”ÇĆň@áZřv‚ ‡0Ôç>?Á*ç® Ô<đţŐ|ř«ĽN6ţ0úą;{Żaždłę2Ôév+Däó^tŕŕúŃ[q!ňŰžV}Čřf«śŰ¨ĎŹŽÎ×Y˙ęeॗ€Ë)Vyťl|" f÷UDzqť@ëÇĽ4Y-łYýÍ-!¶6a“žŠB:o%ńJ¤ŰI±´—UQ|ŁUĆK¨O `˘®=\ ý´­ň:ë0ľ°Ŕx …±Paó‰Ěu@ś»!ç»K†âPĎdŐxhw1>×$jÎŤł“vöZdŕč™xń«ŐSšUAĹ&[URßd•ý7đøťÂz·ký«/śđr˘U^¬Žä Łó—w:I.ŕVÇ®ëô˙c>qí.!·zSŰr&«łŐ2…)Wgů ľ…R -ÎiăQ 8żçŘűPa\Đž×U%•iݡ¦ţUď_=ŕĂpĘř ›Lu ę(îžNą?†ź 0?Æ:]˝Î¬ä†ÔĎt¬B%“U|™úů˛ˇNsorN˙ąf¶ú ř,»P !­v" Y¬6ĽhLď_­@@…bé·sŻc¶¬Łqgv4|ťÂ|0lĎźĐëÔ$SŚő9ŤŽîňbʱšŃj#ŽźŁ~žÁŇĎ?o˛÷}‘‘đ}7sAPm:IVą=n•÷Ż !ôţŐ{±›{ÍÝhĽÎEࢪŁ8¤sču€ÍoL®ëČTđ$ń„ő;VÝúą­sőöcqěD¦3đř¸ń üŰ༂3.D«B«éý«łB4Ě&ěV'ŘÜ TĹ `őŕ˝Dď6˙™žšĎ·óqýyůjű8Vť‰Őć*ëÖíX%ýł›@s«\ŢjrNµ$ŕ|ö=5ţΆ 'ěmU«iý«KýŹi€%C™ÉIđ:ssaĆ…`*`óµ=úl˝÷)>ČuŐMeuSš›·¨Iň_ÎO÷LüŁ_©}o&©íŔjz˙ęÝpťčşţ{¨¤ÖáÜlu:OńÁ®«ĆĚ)«s¤%Q@ăÍ$Ţ<]f› € xO%…÷PCbhr2ŁŐôţŐĽźčýPK·Ęëpžf5˝NĂ«3^o«ů©úĽ]ęe˛JĘęÁ¤iĐBś464†€^tuٲţUÖŚ:G4'żŹň22YępÎëĚu¦G'/PyŮ4?ˇţč.ŐćSB„P_>‘ŃëšI 1t3Γ÷BäÉ­ćÉ­ćÉ­ćÉ­ćVóäVóäVóäVóäVs«ćĂ]îł!×67(ŞÇg ݤĄ‹Šy°@†” 4>QÚň ßŐV«F­}^XׇěÚĽ’ŐjŤµ¦e÷26 LžłĐ%žňY´Gâh űłšl‰C­}­)Óâ< !ÚE ôđÇE˝PçZWZ™˝ŚV+ţ@†ĎR 5{@ou—Ɇ4˛‚˛&…„´H…Ѭ6÷eµy V‹Ý€VĹĄÖÁ¬ľácqZ„Ţ’©rěÓJĆçyBęćyžÓFzŃőFN˘$˘ŹHbČČŐł*+ťjŐŹqňŃŤÎŔ Ú«kÝżUŕX„Żlşe·ěÄöľÄ1“ŐĘÚdŕ0d^ő-‘B%‰ť}ę śř¸{Yőˇ™%rÇ*Ňj5Ak5¦u«ł"Ě,·:~éҸáYľÜ~ h™÷űÄSAť~ż­6ě ĽfuÁlŐ‡fµŠ{ȵQtATHĐZkŔŞŠĆ­/_°¸ŐSźîĽnáűą ±u']bů]|m`«B…ńÄÁĎŔˇJ,O$íÁdu]·Zs® ŔFLß:©Äůúú›aőř‹Ŕ‹Ç™ŐÂĚT4Ďoŕ~by?wpÇj滥ÖAś…Ř(€xů]„†¦ú…ŞfŐí¶~anÖ§/ž©¸ż^ČdŐÚ˛öcŘÚúŐ‡,!ÄĐ1©ři&–xi_VK@ip«Í9ŻĐŢVi%a; ŐŻL?‰0J“*ą’šĹŞ5ܶ¸UŃ·Š“'Á¬şx^î˛6âV[Ą^ ŕ{öeU™ČŇ|—:0ř=0‡»ČdŰ«o‡¨ç*J“q%•[­ĆőYĂN¸.sQ„L‹udš[2×đ9ţIýó:WÁn—ÔČ˙ĐŮŽĘm™XlĄÚľ6×!lŹNl‡ŮVŮŐ§KUĽ¤¤jVă\J%©UߊťßB°ŽLcKfáb×ö>a“=Ňb›~ąR]aG%[ťú÷×js@«/9đMŘ·ÝU×>yɲXÇ@}ł ” ëëF˘´tÜg^‚ŰvO\°žÓ¸wv‚p•ĎŻz3›K5i¤!$P>”ÄĹ€ą'Ň”VĆ›¬”˘Lž2r´ú@¤UMĂÉKĂúZŻő‰ąĺ6Ö×ŔtwŚë§źÂ¦bä„mß1âh|ô|É]}~ą0řŔMjA˘Ŕ´Ň(JâŠÝÁ­JP68ĚC&yrČĚ׉e}­jŽ_cËJ˝?ęI0¬ŻkęŰ>š«W™‹ář Ćű‹™Żé|ˇBľŢťá."TEXdŹ Ô8”Ä!cwµ*E(ÎJ)ĘĺÉ!Î[W"­j_ÔĂáТeX_×ĐXB;¤÷Żo°†O0~?¬:P˝Că (.˛í¶±[·Ž‘‘ň!WqŁ%ßÔ*leĂŔY)E™<^KĺZąT•60Ö.đő#«µřA\ý¤Á5;RmĆtkdÂ/8§)5~‚ż ¬^0Ú #ĺCkg–¦¶eÍĚy)Ť˛—±Í¶ż‘ԺҰ6ÄĄŞ<€(?Ć×&ÉőőuîA„áVź’őm0^hť.—tĚxR*ô×aô©'ö:,ĄH§|čĹŤ–ŞĎ l5z„;8+e¦#b'#|ű}2Ćw(|Kc–J˝ Čl6 뀶ľ®wů‹^‚ŐŹŚo×—iúś3HÓ ęR –ŽĚ”9Š,Y“gP«Ö°:N ś[5SĂöű‰R‡ť!˘§ä[)•ç]€úśi}`úúşm¬’¸N±4ĐĄą˛ăvŃ`|;f¬(®´Fďlt©„˘LÔ8”ÄĂ·Z#˝Aď–¤O%ŐŔY)NąU®5YęŃeśĽd–JÎEŤ3dZذ’ţÇ<Čx·ÇńťŘÉťńä¶e •@ůPÚ§ĎţÎFúTR ś•2SˇÂ·ßüΦ/uZ°~đšCć3ŤÇÔXĘzĽÍÓU¨žâxő\2Ťs«ńä¶e •DůD.çŤÉĺfBO&enÝ'iČĺR%Ź™?Fy¸VsS~$u®mŤśw()Á´r”şoł0*DíŐi!3˝:On[Bµ!sʇBäp>ÝŁHTŮ1ňč ;ö8M×jnĘŹ¤‘Ó¤ďĽäqpŢ 1hň^<ąŐ<ąŐ<ąŐÜjžÜjžÜjžÜjžÜjnŐÜßű–qŐ(qpőOkŞ’Ô}¸ßřI?TY8H«®mhŹyK¸Ěťu5ŹÍĎÂÎIśt÷eŐnQBŢ—`µRÄÂ`Ż·EŔPË ­Ú¦ö˝ąxű™«ž˝>ą>€â‘ˇytľ{?|ś×'j)”ÉĆ€µ}YUŰĎäUůŰÜ{ç@Vĺ‡/€J1ěF+€¬ż7䀉[OW«O[ćů řą‘‰yŤłÇUY«ŤŞ•ő!?BôČD%ťD™WjĽ>-Ai6xŁz)»ŐÎU R˝ůޱ’7 dőŮŠ@µg‡ëď•\†soŘ)śaĎ4ßzfŚ[«W+•±>ą¸« ś˙PŤô>ä |•ŰqLăŃG8Źvâ¸âęČŁ„l´j©µ2ZíĆtÜß+ĺŚVĄÔA¬6g<„/ŽćQ ‚H­çSrÎŁ“ŃçÖd}ŘůYŹqŕÔg]€sY]ç;]FëCŞ@5ĽYŤÓŐ–Ť5ÎC©3ĺ8oŮ)kš1'űüd6«>T *Ëʆ’§Uz(Ąm)űâ®CD `‡ÖHe/ľ.ń:ç—zNĄČ9pgo &NťC¦×ŚŢ‡Ľ>¶WÓřŐ°_’ńHj ń)¤Xe6F„ 7p’mľ-č`'Öc†»Ü.Ő«‹ÂAZ=Ťłţ^Ée8÷ÂF×;<ťËűÄJ1{óăŠ+8'€ÉŞ'„Ö‡\Aµ*żŇřŹ[˛ ‹ńR$UăŹY)Vą óAyÉŚw)ŽEc#<ŐT‡”»\vW•{R­®«ÉëÉýştŰn(–ĎzĎ!S×7o ×ď€×Ie®Žî™wő3]ÔçbÜ—üäÇ8ą5|Ći·ťĎ ćęRŰÚJkʱZ‘RO+ę8ŁU&µ:]•Z‰ieR‰’¬˘‰(üóJËMŠŢ—7—ł«ŇZ@ڞ5Ýa^äş\Gz™ŻsŞľéĎU‚Ň*ĄrMĎełzT¬^Ę:ɬ‚őͦX=>Ü$ bi>łU&X¬QoybbąGÄřkřÍ8Ż – ĹŇóŤý˙n).ŐŤ¤ňśŮđoă ĄŔ^MmádłZĘóië$s«Şo–oŢę*{»4ěěŃeLb¤LŮł"Ť"mx: `:mÉkž[ŘgeTчެ)ťÁ„'0*T›Bá€{!úîIŢ ‘'·š'·š'·š'·š[Í“[Í“[Í“[Í“[]ZÜj QŠ.eŤ '/¸®y÷vQ¤71ř(Z&†óŇX‘ő?(_śšZ”śÇş”){tÄÚ€mZí˙ŔWŃĎŹ)­«-C“ŠÓň´¶ jqání,Ě‹ź"áIv‹¦˝ULŘ!h˘™Ů꛿îń©ŻÝsçk’óAcrN‚ôţ佚ф€…VE4ö0úyXÜŇ~ĺ4zʸVăł°%·ń,éąßű)fřĂŔqtĂpu¦~ă  ŢřŤ©ŽŃ*ý“©^ćÖ0:ĺýĎéܲö3˙3…ĂĎJÎâOô(¦·öŁ›ZB?K™^ Ŕv]’un źlçú˙ôWţŔ‚¶i0´p6­[ě°©ŕC_5Xý#ú[żöwX3ábńÎ廫ÄR˝{ůÎâ˘NKđAîĎ˙Śée S«čÓeŞ|Ýăąwń˘ÇxâşĘŢsôńo>ÖP\ĺ„”Ô•6Ň;nVŰmŻfëI$ŕř‰ÇűVÍ“J-ŰJ%ÖŚĽŽ0ŻóUwűYĐŽÉSőóó×n‘u˙Ňm˙č—®Ćů«xzµŇË—VźĆ«ÚIµvnôW˙Ú_˙qLťZŘÇňé"_—X®z‡Ă÷Ć 8Ç]Ap—‰Í?†¶CÍ‹Ž‘ž5Č4·3ńŽzw(Ü{7e˛*Ȳ`۰¬!AÔQ“:ńKUnő•żÂ˙zë]ú1y†V„ř›Ga°úC˙ęm0îPY ŮšUx6TT&·hVď9V§ ţîßÓ¬žzĂ‘  1[÷X®z‡ZśËŐî„Đ9Şe˘r›qóJ¸ł¸NDß/ů¬ąg·ţX¦ë*9o—đíN6«DĂĂ` Ë{ŕ÷ŞIď%ËM´z9—ăTűQŽźŕ–ţţ7fö\"jţĂ_3ŮţÖç~xBá'€źůÜ·Yť›]*KĐŚăî“«%"úÔç5«"đČqxq~ü’Ć•=ť·‘¨jĽ´şSá>j¤Vç·&~]2 xzŔFʏŐíź1X•§_yŢůDŔÎ<#N’ŐîďRB÷Ô}KôĎ˙Ĺ/ťŤói‰Šy†ůżőË !V^˘ńËże˛Jꉇ}/FkďńAßú7źű· âëS©Č×+.–(ecŤ—J:zđŞóW“ZšŠ°ëŞ–wďŇŮQ™ţáđĹž~aŰŇę„ŘÍ„öpç6,e5íŻ,¬+˘–”Á,ýű˙đ­óń÷˙t±vő%O^OřüO}ăן -Oüú7>e˛ÚkC¦6Łwaô_ţëCť ˘‹|˝â›9‘‘×*•šÎ‡ŘWĆń¸AŞ)×U¶Jgę8<ýZ€´šx^?„˙ľ2˛u¶­Yýíłőč*^?űŰÚ‡KC­Z¤[‚˙©˙ů0.’–ŕCµŻ@mľçÓçß$-ßÄ/~ž|ŹYĄĺ[eţweQýźŮ×¶&cëĘOž4s|‰śc’§JĺűźwsďűXÍ8/ńšĽÎ6Ď/ ÚĽ;ç'FŻLN^ť8]ŰeadëZ 1'®Ü°ž÷^†Úü™űĽ‡Lł‘sBdü%Ó+M˘·`ÝăSKöŤ8פ˛÷«ěş*Ş)gl#Ž3"Ä’gŃŠS Ç㋎©qtcxxš|H>–¬Ćř=đŚ:łĹçýÎmĘjŐĺ¬ß˙ěŐUßňÁóvŁqěyŤŹs©Ü’žLglţC6+[FÍSWg…ö“9őwV3Ľ1µA ë ŹN”ßDľ<Íű«ËÂ$5e˙(s„úŤˇ ˙[Đ ۨbú—ł‡žaF.”¨]±KˇîÇIEND®B`‚rainloop-webmail-1.14.0/vendors/bootstrap/img/glyphicons-halflings.png000066400000000000000000000307771361462701300261620ustar00rootroot00000000000000‰PNG  IHDRŐź‹ÂtEXtSoftwareAdobe ImageReadyqÉe<1ˇIDATxÚí}ml\Eş¦W˛´^Éş¶D$|nw'ţ ;vŃŽÇ8Ťm0ůk¬QĽż®·îźýSűľ§şúśnźSőV§;1K˝G‰ŰösęÔ©ó>Uo˝ÇőTU•1cĆ–ťYuÖĽĹěcŢůa&÷ŁÂ#C,pؚĸ>kÚş ź¶ú–ULW -sĆnÇ3VťqĽë~NšţŁďoÖücčÇřI»~LĹŁ{˙ŕ- ĆúńH8%_čďťM˛ÂŁwöBżâ˛6EW˛Ő,Ģp†Ľ‚¬ťĹYţ2+­(Yłë°đ@ ď±&áóA»/š¶¤޵3kXăhŕߍŘ-aŤďŞł×AŔÔč<>Př•Ś'\ÁŁ›JË;(ř}†#›Qz„–˙”€‡:4Ăý%m?nf˘ntK*ŔݞćlË9JÉŘÚ+ˇDŢîI§ýYu1Y‘¨¬Z^ś (]YYE­ľf@ěťŔâĐž®lXáîz]‡U×tĄ ¨Źuą ľ&á5-Pš¤íW€}ţ@tđ‘|Ý#LőY’=ű´sđźČÜ‚¬Ćů,w#+ľRń”+?‘Ć‹aÖxŃ˙ Xé0ř"ea)ťtýGÝ*ÔˇwV®wëV^ŞÂrf%xB(qÖĽĽ4>šüWŐG¶#ÝńŽlWU<ĐĚřŃ»XJVѶ·“l÷‹¬ÁľRýÄî$kýDVrÓIŻ®Łé¤7:đX<Źs>%Xŕ1ťľN˛ŽEzůşw–Ч;yŇî9ďzŔ9řOÔ%~–ă—~Ąáu©ĘÉ—*ú=±ŞŞÄçIŃx‘cáy}®öY(ţŁëoÖ•u ±N$«^¬jźţ î®»˙e\ő‰iXíńťś¬]Ůă;Y-Ąr‡ö×ă¬ѲŠ&ľ>ş!ĄzlYÉaVHVNÔ°Ď9=‡‹]Š=‡ýŤ°ÇmRŻĚMŢýŽd»ŻOUC ©JUiT}rńWľ¨W'źÚąu޸)ʢ„é÷ËF"YUţ#đüPă׾ź„çę&Ü‘íĐ…ĎčĚRĺOŔŞ‹ŘwyzŰém$«Ş»O˛Ńßţs? +^FTŰÁęÝßIEáq÷%ąó&™›¬‚¨~ç >îMŐÁÇ}]±áÔ–â»wî»A†ď™? [Ëú÷Nteexnî(ĺ措•ź«BşdťĎMTŮŞpĘĄšnq˙qîSé?šřŘbW–űĽčXmW6ńŤÎx*{V_ă»řű©!VĂjΧđsă»VL^jď‘Â… XkĎQj©Uô˙®Đ6ś×ësk”őĚ©n~ý[üqňǸţ-˙¦` ŘO‘ É:G¦ôČë”Ý7â‡ßlµ"k¸™ýÇăísRůeŠ2Ş®vňQŐ=ÎQĆĽJĎU­X`ˇgžQy~ ÄŹîK·Č°Ü°E°]Ôţ#đüPă»ç:—t¦ťŮd¶\T˝/uÇń÷›Úřťăç;ţŘłů:¨JËc-%'¦ eçŤ˙ q“Ő ?jĽ"/yh†…¬4ެ8˘ZišńżÂůÔŇ1ň|JU˙§ďuđ>˘ľ_Ä˙ÍNëĚÝ;hxwżNU ÓJ˛QU7\éąjó©„Ě®bT˘:ŁŻłĘBá?6ńţŁëo˝J°Â1Ί%óI UY-IďŮi4{„=źrǤ7Ş@)HKçJ+†f4ĎXţ8C×dĂ?'jŘ1ôĹü ’•NŃň×<› 3Ú9üź’ŐE<Św߬†€VŤ‡÷z—E}ŕý^_e檴 pĄçŞtë¶ľ3úŠ9«,ăŞë?şř±g’lÍY÷OÖŔ¸<öŚÎxŞxŐ|†ş’aŘŽůŞUe—…ŞđFő˛Óë‡ ó1Ú;“{ EFÓ0`˙ĆăDĹR‘¦ü+’UÖYiDĺŮßŃ4ë?ŠY`|B‡ľs2ČÜyip›I˙qă»>WŐoý §VśąáTůüGŰßzg#ř %–‹ĎD0#Ü 3žŞ[t¦i™Ř˘ş( U×,Ä]Î125Ů|îřNĹĚ­fwŘ7wł ćšíĆ řżu+ľÂŠŮÂ]¨Dµb]ßÂK¦ śŮxbWę Ő›7|ă•Đ’ú‡Xă•›•®ü{UÝÖljců™G•ĎôńX‡k¬ţ|‹(˙h)IUĚa)˙lp 3ůlúîÔuPUü]D’đ—)©/7~4W‰¸t5ĺĽJ}±űVżéů Xő0«§†zć ËVM©ĂĆ;>ľGÔ™Ő^č Ż|ř¸gF:ÎäŁjaZé»ö^)74C#jîwr,еSőlőüGŹuŘ;1éĚvĎm><Ń)ż}Şň«<˝ëđVZ ueŰ Dçź+jŐy‡–믫J6V{j ý±’K­>´†Z÷ŐáQŐ–ďý·&ţmZ:ž–ľ1ďUˇMBĺ~˘ĺň ĆaíŔ:ä/áś—:K˙WžWOŇ &…­źŞşY´Ş®2fěůŹń7cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3f̱ĺgĄČ*3fěF5ÝLb´‘ĄNŽÁ2#Tf=Cé`!–üZGŻUe꣇‡e‚Ĺ2VĂ©Ď<ś1mkS¤ÉĺĹ4iĎ—*.š{Nü8X™aj~ŽéďÚ€ânAšx,˙—×%fE:Ă|éYDV÷j žë¬Â˘Úlg6Â(:«k~ŚĄ÷MöMâ×5?¦4 ]WO·>şř诋WĄČŁ—Z”iGü|QËGüJe´çK[YcŐµąpmjE\f/ľÇŽ8&ĽOQ˙3Í ‹âśöý.3tąęt2'˝-Vŕ8ßůá…pXµS°rÇY#J!«űńQđ¸ę "¤,ub×@F­łúKß:ľuÜ^íůiy©Ş[]<.CwŻ‹ťŻ+W\Ť)żďbĽŞť kŻr-ˇĺî.M˘t¤Ú€ÔM¨‘qĆĘ„őŹŔ˛ţÓ۰§·Ť¦#$ť^X$žŃ"śŤ§‰˝»ńV`•TŠ4™máŇ~÷w%Pµp1·š|…+&UxÔY‰Š8«Ĺ*Âr˛8:Łěć¬ôŕk7QĐŇ€TŞşëâ“Ęú¸đ“Ö$ŰĐŽőÎĆ™ż S>~§Sü®őµ„jĚsá­:5Ţq.w°&_Z.ôX=•މü:Ţbwë`”ÁŇ _ŕkd‚{'˘Ę0Ű:ŘdÇÜsÔţ#đ«q«Ťľi!224Óö•ünq‰\’9„-‘ŞKUTäsSU˝ěuVo•@;ĽU®łzŰ>^úˇ=Ľ—N˛Űö•ŹŞîúpĽĽ>oő…PÁżO…ÇÚ  @Iűęú@ŕŁ×'G“j5©oŻ*U®>îä^«*‘e›w‹ä>ͫʧ‡×á« Q°†”5 Í„ŻĘç†<$ç#ž5¶JŇŮ»ń¨jŇö6eî)đŰ_ ýîůűd]±Ó2‚°–B:Ŕ‡Ş^ň(*˛:8JĘÁŃYŐS鬆®ňŇďKÝ—“č ]U4_Ćrj¤{Üőá5’ׇăaÇ‘/íyó—Vť˙?“ěGżt˙äGż¬Ôő‰b@xPUźä7O3§|ŞéŤŞ ˙I°ňQ5ÎÝQüłGwÄ *(;łw˘f·0*×PđUUŹ<Y¤Ć”˙ń¶v†˛ĽţbˇÎtÂö5{2!ë,}©Š˝ěҦ–Ź”:)·Îj2Ok™ÎŞ’' ÖŠ0I.q\(Ä%ojQ˦âÄ–Ő‡ăa<ę¶ëÔŤ‹”exÜAgt‹ű'Ł[d;׸Űů«Şú`rČcd»ěž¦–j ŠPąFUÝ$”UeJ˝I6ŮTüłÉ&Z}ŞŞîzżŢő(•z÷ vfu¨zĎ ż›{}ŰżßťŃĺÝžlx“ÎUőZď謊Ç.×Y岟bĚÎç%»†Ž—¨nwŔ·@×Ç©ż¸S9ŢÖ|Ĺşs%Ú>Ë_őo#§üž9Ř\¤EU~˙/ÝÚ÷t(rť[˝QµŞZu™űOo;°źËčŰ!MrU»]ŰÎ0TÓęcpDĹ‘Ő?.¬őÚcÎęPuí±Íç¬F€˛€™ű˛;śĽŞŠL_ą©Ş«łŠůSŢÓb}¸R/ŚJ_Ëç+ßÔhĄ2$őaµŁi ­UŐÇ©ż¸S9>żŤĐ„}7Ş6rĘ©µzuůŢíůŕ~ĺ›˝4­ýoĨ 1Jś­€Ń µŚ^±ĚăŔ~ŁŁiC޸5Ŕ˙5G׹]úg…ţőwöĽsůn zTuO=Š?/“ÓŰýzƲc>ÚţÎźb¶#7Ö»cg’ćkżţŢ›TťU—j÷©*-T=]Ýúčăuu}ŻŁ>ݨÚNĐ­ Ůřť[ ]â”:%/_› ®ëS÷z]6D.Ôm®‡¬ÄěD7UĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cćúŁě´>ŢJ4hëPP…®+«§A›;'ťG_®XKˇÚmL«…5I.},wFFu§Ţm$S–-ĄEŤ-;Ă• C3I-`ĎBëßRťŐx1ľŇ“T±JÝ•;hΊś8Ł DęYřŞJŤ‚o;´çŔţŢŮYš5ŚM˛ÍçäK·¬É°Mťµ;šŞľ%Pş”Žd9Kîh”ř€nç´D[zŻĹgVhč,®Ą'Cş p!^MÖ(łWK2ŞXĄ>UQ‚Ä%âö°^›p8 Ë˝Ö^#Ζ؄+.@—ÔńgęCęz%É”-Pr –‚¸KżX˙ Ľ…‚¦nÓÁ·>˝»×=‹Ő”ŢѨđĹeSvR—ף’L—zŞň˝Ö5%9UQS ˘ˇ\ŚW‘Ő«ŮĘKŐö'Üh™p)Ă´ J·”rhˇß žîťM0ĘF ˘Î(f_¤R5ń/É//§Gďä+óŞ‹őţٱ¶x 1"čżţł¨eSđú 5… ­Ö:Tőöfľđ=+Š7ÉQɧ§\Ś—“µ˛TE˘ˇ §sü༬ďrĆßŢY®s8ú•&†kíěůű¶˙­Ş#pSŐŠ5ťMŕłTŞb«ŞDÜŠ[Ngˇ5QŇ\sÇí5PB@[ń8ɨ‘V1ŞŞ˘¤Ż¬&ö¦4Wsy[šÇľ źwŇU€˝ń2˛V–޶îě7ÁÂ7”€jďÄÔĐÔĐމd^~Yf·íC©«_‚Ŕh;a.ĚÇę&†M® iť §ÂU–ŞşşŞWpzs`>÷/Ö"¤Ô'OňIťöáÚ۲ç‹y‰Š›€¬:ĎBzdőĂű“µňTŤôźqÂŁďť=ĐąŠ­b:…‚°"ü˝şům«/ľŃ-/PÜ÷WÁDQóÇ´Íâ˙5Éîţ7źŞşúŞúmĺ`ôHýĄ%AťÚóVµŇ!ÉHĽÔ›×żĄµ÷@"QٶzăĹŢ‹|ëß’TÖżţ-ďł*OUý^şűҦ6üş©­ű!Čî‹Cw„kŃ|h˘&Hd5ŽLEYŕy‘Ž'ŮĆŁ7źŞ%˝*Ó{čü=)­°ĆZŻ%Ůťż§P »Śú*GŐćÜ]ëŔ•Č/—¸8LÔÍwş$?8üńMą)\ÄŻ«äٵ/#Ş7U‡fd7'6´\h1ď vI’f”EIrÇ=˝1řwöÜ\ňWKÖžVZÄHKüśgţZ‰Íˇť$m¤äx·‹ÉŇ %śË Ý`j}ÔTuTöQJZŻč*H>*QÝxkLFTżŔďŢy†“UŐš-†)‘Ă´bľ®iA¨Ůó|q`ÁżF­'ÁźÔ+ áç4^Q¶y ´x‹ÎH)’î#Ät^­•?@]^`AŐRęSŠŞq¨jgžB:ĹrK÷Ű·l<2ď-4żYŠçKâhgQ°®öLÓÄxśV§wŢP¶ě~ŃÉM őΦľŹ‘¸0l 3šĆ…ÖaĹŠITČ€hwJ¬mĽ¨¬čÁ¨­™xIM¤ŐąĄ¸|ť«U7xˆS˝ł~2ťß•?ŠkW1kĄü˝C3]Ůă;Y­•nSŢ—şŇ‘AíeşXĘYzř8,'‚x‰< k7Kx‘ťŢÂ]Öů$łĄxľ$Žvë´gT#wű“;ođÉýňÂ@ Čzˇ_VĐÚ÷mán|˘HÖµďËhĺŘZg-^TAn«Ż-‡ )ŕ–Ż@4ť[*Ô9xKăĹĆ‹çÖÁ˛˛j>Ĺ!,¬VtË:eů°Ô—Âqn8%oh˛ĘéS„(2č\Q‡Ë^éaigéáńí¸F—¸3€łvłTUDV¸l’QČę…§¬WĄcÝí%’UŕĺŞeŽq©4źŇťÂş/íľUľ Ą$†_ćźQ!Âä´>ĽµřÉŐt×|é ×,Č›G<tßC÷ĄÁ[ÔxTXmf|ě·<©ÄOÚˇŻMTŮ|(w:ĚÜă_XÚ¤Óţj7w°´łtńĽĺ » AXßͦŞpŮ$‰^xZ«R±îö¤‘ŐÁëj¬x”îćÖ`đ3=â^±ńll±+Ë—e»QâŮ8g8V ‡‘+ţ9MËďë/ŁŞŔžŹ–oč14snťb› ˇëtXŮÜŤŰsŠýÉü×vEŔl+@\Ś’e¸,ĺ,·cŃ®â<§(†ÂiőHVYŞr—ĄQĂ O7ŁaÝíI©‘>Q%dŐ#jUŐ†ł|; HŻŘ[bČÂÁîąÎ¬Ç#ĘĘĆᡫó,Wés7NT1~ÝÔém&Ç»˛{' \­–ăźľ· ’bíBKJľo8ĺ%·!…€$•ŞQ—›¨Ďj:©‡/¦RX)$SyŞŢł 䍧ëR°…DUg_Dű軦ĆJĎ\Ńý굪jßN®¨Ö–SU;~·?¶÷O‰ĽhssýdáőĆŁ}“6Î(T <ÍŐ_ž4ÉďÜb5řőÔÖ Ł^N ŞöřNŚ%8QejFĽ7toç¤îMyŰÓ©ę`)gť[§‡/¦ŇĐĚÇ÷Ü|ŞşďÁ?ňĆÓ©JÁćĺuÜG§şýăLďĺť•ŽŢ/=ŁCTÜ hdĘifHşÔřcÇžůćŮâG4öŚ,Ľîřóáőޞ`’DŐžĂ{'xýŁĘG_p/5řâ‰@m +×$jVÔH¨ĽŠ3Őa"…*Ĺ©,ĺ,ˇűHżJҵŻȸ…T^QyŞ˘o&IÉžJUVwW§ýĂLçeM¸ř~Źń×3t˘˘˝“ʞ»A©ă6ôÎÚÁrĚÝwɤĘ6śŤ˛Őżíż Đňť\0HŔL%LŞX5ę’c¨ˇĆç“@ HHĂZ‹ş|NVÜË+7WM«Ă{ü­¦¨cigéâ…ŕ*ĽÎę¤Č¸UšŞÜ7iÉž«Đ±zŠúdő *Ě ?ŻgtäÇXő‘í8îőĚťO©°XÍî°:ďô]2üÉŤ]Ůp^°¸++ňÇ>Ář¸A”čŰVÚ›Eí{âćá “´DB.Č&¨/ĹŇÎŇĂă56ź©AărxY#Ü•÷yá)ôŁcKQtČŞó˛¦ŕ~­Îđ¶˙­ęőŚÇĹ! ě™;¶C}ĘîťČtf{ć6ź$N§üVsj ţąwupZ)zĹý|ú-”wěg+nŢMVjĆ/d+UŹ˝°”łĘ~ÍŻÄŰęŲiŤ—ó:_ixšŁ wµęhqźr>©é§-Íx«ëĽ¬)şßÝ·ÚyĐĆR=! ě–ÓČì:řŠJ/lĚĘIk‡ÔĂV@ąnĺÝ7ď475ăç8«ZőŘ KŃJć(ţśUxšzńŤ1wť)^ę \źÔŁžözȪ󲦨c‚¨©2fĚŘŤčvŞ+‡6fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3f̱2›®Nď÷ oźC–ť\žőݏ F1ťÖ´Ř ¨UZ÷JVĚš\®4ÍéôĆM§÷ű†gq1z{&łťYťúT Ł,đHX~D­ uÁ\Áťgô÷}xţ>˝+Y±ŔčdNŢĚ®†ďo‘l ¸Z´X+FĄÓ[ž/jĂ˙+S~2/jVîňą8óJ»r^­ŰďčłÔ‰]J}JĹďť é*ŰŹ<Łí2Ô°&ŁJÝŁëĄjOµöM@âŃŻ#0ŕŕĄOß[‰úS‰Ę÷·°‡†XÓB^ uzůe…\§×Á»ť]…ďťýd®ßüd.°Ą—/„ ÔxXE ˘f'vŃëO»_´¦“‹HŠ${č%;•kçtŹ7ŢßmĽĹ‘|ňúťd{aˇŢе^ŁÔ…Ç›˘ÚŽE§†5Ę‹¦ŃBr]W·ú¬=¨_ąšŃĂSAĽ»†f(ř0 …ŮoU×5Çq ,ë_\×l˙uzťËŞuzĽű㻲¸ö×oâš=Yiĺ÷Î~|§ 0+¬=VŚŐňµö”ň…¨J—ŘŞ łÝ/˛›ŢŤ˝ÔzMÖĐ\÷zCĺLĂ˙±Ă[Uő:|k*^8"¶\WŮš\ .¨ďXTjX5 ÎSk˝F‹u\”1ç ­ž—q'ŽömżÄŁ/ńQżť”UŘ•Ł*«AÉ˝DNZ×®?_¨[#Ś ËŤ4ţ:˝^j|Â5ťLĘGů­ ||©­ÂøÂBW{6[uQF©ż¸µ.1Š´$qFČí9´Ç‡IHg)\÷ŐÍŕž5°ę>CĂ#ÇĂuöXÜZˇé$ź#*<Čß«sRÉvą1Tj>J¸şm>*§«ăĆ#‰˘(®é Éé[F¦hÄsשő5őŐ*jQĘĽ–&š†č&×ý&Pęă»çŠ›L®Ó[ŢQ”áŞ1*üÔ«‡ Żš;¤ź´ŹX}ÓI•ΰŔ[Q„?Ţq¨Q˝Z Hčóűä÷Ý™•ŐńÖžV¶ŠEsB’ĽCÔZ9ľéJTK¶Ë «˘—ŰtuťŠpˇ«Ë·şę /©Oďě±´,.kˇUd‰sOHMg4=-)ď+Řżčý“h2ÁąNŻw÷/r|WÖQn=·GIUů;“'ŞŹ„j,¬ÔvđîfńÇłţĎí™pżeʬ¨ú$őŕşÇV GTYńsBZÄO‡1pçj:ü›¨rü±Ž"n©TUSCgśśr Çve§†¤Aě۱™ÂFčC+Ő–#‹[J–¸ňTeý'v9-Ô3 Dîm¨Ó»ÔuýuzĽűă¶?ÎÝ0»• ”oË˙÷ ˘ŇęăhŐxđ«u‰YőĐ &“·î§‹»_”54×=fµĐŔ07‡˙kלUŐđ0‡·]D:Ôřć‚ä‡Ďj±dwĐ/+žÚP¨ˇGUVóäSŽç<ů”\2¨u¦»at´cŐ^zYÜR˛Ä…mCÔ+ÔŇ7´ĽţĽ#‹ă,|ú:˝Ĺi™NŻw÷ş*|^sŕÜmĺ|”X>î–’ĐŞŹ^ýÝ1\—#ÁÓÍą” &¤Ź%§{,2Ŕ¸UŞ>ÝŽ.c0Ź5zŘ#Ş oëg…öNŕŁ×O+©©QĘě“­’ď ‚®•˘óĹ,ÎĚË—Ĺ-%K\ů´Ňî[S_`ýyŠ«+›úb÷­ą_9Šë4ťŢŇđ"ŁU©ň+‡çÎŽap’}˛I­¸čč[óM,BŞŹ.ŢNtńśŕÇwŞH—Űj”漬…ü¬E‰ şďśú…žLŇÍ߀ 0DX(©kŹÚµ§¶¸” …NoU§÷{†gquz RčwkŐ§Rx'ÖuZŕ[šóŮŢ3'źĄzÝyy˛¸×“%®űsź˝¦˙ Ć•úŕü3jYF\ŮÚs¸â÷=m1Ş&ÔúŚVŮ•ÂAÉĽ?k\+]Ć6yďďľ“ľ»1ŠĂęgtÝOIW7öaďl|1«ě­É č©őÎĆ>$]e ť7ČÚŘťżWŻIĽe?ަŃL#•ŕ˙>|Ç˙˝ó íŹŇ­±´]ÚŇ p±M5M­UŤdIú˛ 61íýÔ űeÇĽY˝Gđđţî»híO n‡Ô3çŐ­R:^×k_'Yuuq#ěáçpő# âJż‡ź‹¨2ÖxĄ™ńël>×˙OjŞ®ŮĚőŘcYť˛é¦¬ť!•Úˇ+đsZ/üíěŢ× D‘}Ďá2ž AY m™”®p®c#Ć<'x»ĎSKx–ź`ĺ¦*W[,e|‘Ź6â·B˙H)㶤kj•ČŮp™»DľU(2qzx‡¨9éŐŇÉ*tqa™/,ę Z[żŻ 0Ď>ýěÓ¨§ÖśóŚ…xN)fďÄűĂ@qŐ¨‡ÍŃţFUŐťż—w(·¸a;Ë‹đ>Ň|T†c|Ôw2 Ć÷µeiT]*ć!_\•WG{ Ź §č]¬^Đ۝݅ßÉZ5ĚÔí¸t|‘Ź6ÎoYHČÎČëßa齿¬ŰţţO@ż=í«„¸Ä my^akäżş¸ńEü.ľ¨ŇĹuô‹îzŕ®]#ŮĄą hWvü(ëî:Ô,•ă6ÉőA“ë߉JçÂŤďFaśâŢ\ â‚w©řW×ô¦ex>vˇ<çë?|ý‡¶Ô&i_ľq†zë Ďđ”É] e˛R_Ä7©|& c*ŹkÖ€4fÔńČ,J «U—řÜ_Äh“ř\1A¤„îîčů•żůµĄ÷şu\·ý-‰L\Ďś^çę~ÔPąhrĂÉ*tqa0ŻfTęâ:ßMUůĹ;qÔ>µet‹uąMŮĎYĂÖA>†Ž€á«ţ).,ů ;ɦďCÚbwŰjE)řÔW°âľĹĎ …ĆFÓ«@ţs4Ť˘e˘6^äµQ9oI}4Čx<ű“Ő.ŐB?˘–BŐÂß«ë#š$‘ĺHxě.x9,•Ěa!®RTčpgd5ş˙‰Ą÷úxB·ýeŠŽŹü˛.L7@Ą*ďž AsduttŹSëâVUaŕ‹RU|–ŹI xG¶ß$T®üĂëýń­ź¬›Âëť#_śůIF÷MÂŚö_Xő@főo÷ŮÂQ°IDÍúI˛ľI?|÷%Žż÷Ą$ŰręŹ Ąžą{śź‰ôĚEÔŰNĸÜwŢ•ó˛qqé?ŐíéâDťŘ˝}­}o•/`ÓŁŞCT±i ť¬ńČ/§ywăOş §rD 9©ď—YUD]ęŕ ΉĂú¤˘@sĘĺč]ŮÁż+'UaL}Űű hšrĚU±Ýßç'7ş:şşsU|k)Hú€@§ôáńhßNľqž#č›ĎµÁ8Śďy­Ë­ŕX˛ÇĎű#ö¶wýŮ ´1!•흉ĆR'7âçfČuăד»˛0ŠůľżÝp¤!WşĂ–W+NmŮp¶\ŁŞ š-‡ioD$ĎŁăňgúŮ Ë…%ť%ďĽĂřmĘíV€]”̱ś™ráw*˛ĘZŢ}żůy›+L» Nľäoçu©jÚ}Îxt‡ô•“˘)lSźďtuqő¨Úx±űŇém NyKĚUŞ OnDbhf}ëkĽ>Î6ŢťuŔfTď%ţřĂŔ{‡ö¦ <ń®¸’úŰmjĽ¤FÍcÂmUľĂŻ«ěˇůcßň;°wŠí8ž‚@dGąFUAµü&Ź©‚ ÉçęŃË=nđqŐ5]iPĽů}§zę:ąk⼶‘Ý-ĽÄĘ“» Κl*'U›Źzăax«W…µÔFÖdZş¸zTíľNR“s+’#«ůř wÎŔzgi:·°MB„ŔqřżžtŤúMĐ ül#¨^Ö'G™ßŁŚ*^ÚtŰ{ŤśŘŐ=§rEýąęR“şnťQů$adJlÄ02%ź®TÚŠ^Š„ÔÝ<Ó~g§?ÖOóf*U×^óĆ?üś:¬˝N˘Šž”®+›o¶[ŕPľUŇs’|çQ“»R']çVó-L)H ťKżäž mYËŐnµ\±ż4}Y©ëVÓD˝ ÎhÉÍřRđ©şę;g˘Ő-©ű'…3aסćM¨ D­hŁ}´1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚ3fĚ1cĆŚý˙k¸*Čš4í`Lć$bŮ ŞňśÖUęě˛ë4\dtś×Ö'ž˙®>…HČ„|Ő.–Ü+Y+/‡GťçyšÎó2ĹOCWvţÓňą3v,«'kiaĺĎĘŘČ ­ôĄWłż‰Ś O6߯Eô=Hv $L°ląxIľ躍/†}Š^]čÚřŃÓxŚ™\3Ôč ćÉ®5Żç °¤˙QŃT&Gç9AÔy^Žř¶Żú˙iä•}OÜó[5ޱĆwqĄ4,s JJ×ÖI.myEÔ^ë%Í–'VńB~˝dׯ‰Î}ă*ţj÷­*‡ ~™ČuÁŹTĺ®k†őˇ\f†KЬĚ*¶®Y]›ŔóťŮ_v'IŮÖ˨ćşáëöé‘©6ŇXš—o˙ç'źj&uÍěɧn˙gúčT]ťoíň„ÚŚţĆ9”«©ó\*ľwVHÓ–ż|Ě Ĺ>Śţ:ň5EFř'J ż‰ËýÉť`î¶Ä©!ëňA¦ŻŘĂę® É ÄŮçe~ŔÇ_;ŞĚđ5çױϊ©űŚŕ¸é•‹m_&ţO÷żĆ«ViÚĹÝë<}"«éťŤşđ°hW9ÖX±6öĐKPĆŁ G…"ëĆ­Ł?ąó/Á÷”ĺOŻ^Ř÷ëhC¦HáŘĐLű¬cß«¬iÂĚPĄŞjßă˙)}űűĐQťQŐ¦Ť‰#tM§ťgľ°9˙ ĆÔxGw—‚ďĘŮ~d;_ĺJ+ßRỲ¸<üőë;¶e˘ŚŰ ŢÂ5/QsĄ/5ş˛N[ňÉ!´a+„N‰PĎb+üŃş’éIĆ}´űŇŕ-·t_âq“U=–MKÜĘžŮYÇÜţ5nožá*ĘÇÚîv—Ţv·bŽĘŠ{]¸â¤|” ~ ZŤ¨{-č˙Źúľ¸ë‡^ý›˙FVviϵ3™YaŤŮŇüô«=6nŚ­řdS;ś-źÍ´^;°uꪪ^ ţ|đż=úó_Čw+°ú"‹ŽřĘŕiÝ&4ˇól“#´w‚“iíűr|W–ô‡ś3Uř$Űý"Jě~‘ŠçO@]~tÎâRJVł©MHżw:̦“ĽěŐ@?˙ţ>ëOĄËé?čvdrş˛tS§*$í&~1>‰ÚŔ¨«äÖÝZ}^ůnÍL(ôĆ]Âf*Ş&ž*čQž’aßIĘÇđĐęť„|”Ś3Ô*°—‹÷OŤ˘ę?ŤŞ¬úç‘Á˙r˙?¶*ń¶ł4Gyz[äk/täk—‚Q–ĎĎ–µĎöWCżCŮKşk/Ýúx§Ľ5×|ůäSÎ*`’ĎϹγQ±ÜÂâ¦Eľw”›śy’ o ‘ŘK«YqTřbŞúăß$ŮÎóĎ-/PtŞsZNî›KÎŰQľą*>§‰Ý˘ě‰ÝĺU™@»ĐŹ"JQ;˘ÄĎÂą&Ľ ŠLxŇ;+Tă /+żôÚOÝ赟ĘĂ>č» (T˛›ţ?Ä·D^N*©'Âpöď·öŤţ$I¤¶őWÖőÔW~Ó =üćJ|ĐÔ_‰óUTeÁÄ7Ö°P`˙;CYjkŕ=ßsßU[«ĺmß™-ĽúĆ;°};ł2|÷ĄŤw¶€o«1p‘0‚Ć~>†đ0Űßőm·ő @JďrÇźócŮ·4˘ÍśŘâ?qĹ÷\ŐUUéIV?2…ĺŹL©‚/Ć+Шꄾ< ˝Ü‡^TőŰŰ Ą?t©j\ĐJrُÜҀܧB*ÁłţŽ=k˙mü¨ żţXď,n}ażŢ©¬Ő’ąIaůˇděp×·öălńl{\ďú6v8”¤RµŞę…źş·­˛Ň˛™äąfĄ1ąÝF|ŐŹÂ;äeó=\DÂß ,DĄ:ĎŹ˘rńxQTâ—Ž’*|{n¶‰S 9~ŕ=ü}Ó•ľÉG~%jű:D…©j­<Óáž«:ŁŞjO%Śţđ ď$T8!j˙ěÓŰvmŰĺ|'O¤‰Đ—‡ÁÂąâž±z\vsIv`˙Č”¨Ę¨jŤµ-ˇ^›$-€Î^¬ čG ŹQݎ{ŰmźĄľ`ŤŇTűš#Űc‹Öž­ă¸ťź|nâ.ߪNŽ$Ţ÷O ÇÖÄűÉ«šJUVżáěĘĽ›t,ßéŹÝýâjĆg¶-÷…ţűmď­đNV¶Łó „ťzĚţ:ĎźŔ—(ÓΙ*|1UŐx=ŹY±Ök*üűůt« ÎMłţĎ÷NČĺNÝDUĎhK™«ň ŘžX(ĺ„Rvń!±#B_—«cżxRť§·ŤĹą‰ŚŞo¶ŤE5Dg>?úf›¤©XQ‡¨QéË”|@‹"ÓŐˇM‘—ŁěČveC×>ôŇm×O$HăŢ#]Y”µ ®I=ÜÁŽ)_Ŕëë`©‡kř©¦* ’:aŘ>!XłçË!›ŞWÖ^Ýô†wŇ’ś¶l'č<;řvwgIŔÓt¤_Ű?Jh”ź`Ź#E:fdx=˘–6Wu<†ŇŇöĚŰÓ‹âd2¦diľ×źË‚Śc#h¬c4íßűÔ?<´çĐHş¤ŕ»FYo´űVpżNńž;„Ý·J\űŔ ö¶‰Ď˙>„` (Šét¸3{Ű>⦊Áă;;q†şF±‰‡xÝ4Yc«ă‰µSż$wż. ˝……—dÝĐa*kŁ«ó|ŁđQŐ,żí+xń’ąýs^ʍKß«ŇćŞüP^Üéîn€OÖ®L5m­IŰwl?-.ʲÓŰŇ÷J8 §FÔĂę…Ő ýB.-:2…ŔČ”Ý!ĐÎęĚ/AĘ#bŐŰ_m%ĚIÄ(ś”â$|ĽPZ[Ż÷Ą 1˝G¬{^ç#µ®ňňÄo>×3×őmčw?'Çcx¬Ł·[ü^•:W•k/—`'=˙°Đ~ÖĄĆęúWŇ(őgQʶŞbfŹv7UŽzÉčMţ3µ‘©Ć+ŘŤ‘Kç:ĎŃ4|GńCtŞůAË+Kô˙ʨú{@©ĘĐĆ– ±[0ř5íđý±˙E›|yn4MIEND®B`‚rainloop-webmail-1.14.0/vendors/bootstrap/js/000077500000000000000000000000001361462701300211525ustar00rootroot00000000000000rainloop-webmail-1.14.0/vendors/bootstrap/js/bootstrap.js000066400000000000000000001706751361462701300235450ustar00rootroot00000000000000/* =================================================== * bootstrap-transition.js v2.3.2 * http://getbootstrap.com/2.3.2/javascript.html#transitions * =================================================== * Copyright 2013 Twitter, Inc. * * 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. * ========================================================== */ !function ($) { "use strict"; // jshint ;_; /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) * ======================================================= */ $(function () { $.support.transition = (function () { var transitionEnd = (function () { var el = document.createElement('bootstrap') , transEndEventNames = { 'WebkitTransition' : 'webkitTransitionEnd' , 'MozTransition' : 'transitionend' , 'OTransition' : 'oTransitionEnd otransitionend' , 'transition' : 'transitionend' } , name for (name in transEndEventNames){ if (el.style[name] !== undefined) { return transEndEventNames[name] } } }()) return transitionEnd && { end: transitionEnd } })() }) }(window.jQuery);/* ========================================================== * bootstrap-alert.js v2.3.2 * http://getbootstrap.com/2.3.2/javascript.html#alerts * ========================================================== * Copyright 2013 Twitter, Inc. * * 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. * ========================================================== */ !function ($) { "use strict"; // jshint ;_; /* ALERT CLASS DEFINITION * ====================== */ var dismiss = '[data-dismiss="alert"]' , Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.prototype.close = function (e) { var $this = $(this) , selector = $this.attr('data-target') , $parent if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 } $parent = $(selector) e && e.preventDefault() $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) $parent.trigger(e = $.Event('close')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { $parent .trigger('closed') .remove() } $.support.transition && $parent.hasClass('fade') ? $parent.on($.support.transition.end, removeElement) : removeElement() } /* ALERT PLUGIN DEFINITION * ======================= */ var old = $.fn.alert $.fn.alert = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('alert') if (!data) $this.data('alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.alert.Constructor = Alert /* ALERT NO CONFLICT * ================= */ $.fn.alert.noConflict = function () { $.fn.alert = old return this } /* ALERT DATA-API * ============== */ $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) }(window.jQuery);/* ============================================================ * bootstrap-button.js v2.3.2 * http://getbootstrap.com/2.3.2/javascript.html#buttons * ============================================================ * Copyright 2013 Twitter, Inc. * * 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. * ============================================================ */ !function ($) { "use strict"; // jshint ;_; /* BUTTON PUBLIC CLASS DEFINITION * ============================== */ var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, $.fn.button.defaults, options) } Button.prototype.setState = function (state) { var d = 'disabled' , $el = this.$element , data = $el.data() , val = $el.is('input') ? 'val' : 'html' state = state + 'Text' data.resetText || $el.data('resetText', $el[val]()) $el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit setTimeout(function () { state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d) }, 0) } Button.prototype.toggle = function () { var $parent = this.$element.closest('[data-toggle="buttons-radio"]') $parent && $parent .find('.active') .removeClass('active') this.$element.toggleClass('active') } /* BUTTON PLUGIN DEFINITION * ======================== */ var old = $.fn.button $.fn.button = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('button') , options = typeof option == 'object' && option if (!data) $this.data('button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } $.fn.button.defaults = { loadingText: 'loading...' } $.fn.button.Constructor = Button /* BUTTON NO CONFLICT * ================== */ $.fn.button.noConflict = function () { $.fn.button = old return this } /* BUTTON DATA-API * =============== */ $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { var $btn = $(e.target) if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') $btn.button('toggle') }) }(window.jQuery);/* ========================================================== * bootstrap-carousel.js v2.3.2 * http://getbootstrap.com/2.3.2/javascript.html#carousel * ========================================================== * Copyright 2013 Twitter, Inc. * * 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. * ========================================================== */ !function ($) { "use strict"; // jshint ;_; /* CAROUSEL CLASS DEFINITION * ========================= */ var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.options.pause == 'hover' && this.$element .on('mouseenter', $.proxy(this.pause, this)) .on('mouseleave', $.proxy(this.cycle, this)) } Carousel.prototype = { cycle: function (e) { if (!e) this.paused = false if (this.interval) clearInterval(this.interval); this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } , getActiveIndex: function () { this.$active = this.$element.find('.item.active') this.$items = this.$active.parent().children() return this.$items.index(this.$active) } , to: function (pos) { var activeIndex = this.getActiveIndex() , that = this if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) { return this.$element.one('slid', function () { that.to(pos) }) } if (activeIndex == pos) { return this.pause().cycle() } return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) } , pause: function (e) { if (!e) this.paused = true if (this.$element.find('.next, .prev').length && $.support.transition.end) { this.$element.trigger($.support.transition.end) this.cycle(true) } clearInterval(this.interval) this.interval = null return this } , next: function () { if (this.sliding) return return this.slide('next') } , prev: function () { if (this.sliding) return return this.slide('prev') } , slide: function (type, next) { var $active = this.$element.find('.item.active') , $next = next || $active[type]() , isCycling = this.interval , direction = type == 'next' ? 'left' : 'right' , fallback = type == 'next' ? 'first' : 'last' , that = this , e this.sliding = true isCycling && this.pause() $next = $next.length ? $next : this.$element.find('.item')[fallback]() e = $.Event('slide', { relatedTarget: $next[0] , direction: direction }) if ($next.hasClass('active')) return if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') this.$element.one('slid', function () { var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) $nextIndicator && $nextIndicator.addClass('active') }) } if ($.support.transition && this.$element.hasClass('slide')) { this.$element.trigger(e) if (e.isDefaultPrevented()) return $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) this.$element.one($.support.transition.end, function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger('slid') }, 0) }) } else { this.$element.trigger(e) if (e.isDefaultPrevented()) return $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger('slid') } isCycling && this.cycle() return this } } /* CAROUSEL PLUGIN DEFINITION * ========================== */ var old = $.fn.carousel $.fn.carousel = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('carousel') , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) , action = typeof option == 'string' ? option : options.slide if (!data) $this.data('carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } $.fn.carousel.defaults = { interval: 5000 , pause: 'hover' } $.fn.carousel.Constructor = Carousel /* CAROUSEL NO CONFLICT * ==================== */ $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } /* CAROUSEL DATA-API * ================= */ $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { var $this = $(this), href , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 , options = $.extend({}, $target.data(), $this.data()) , slideIndex $target.carousel(options) if (slideIndex = $this.attr('data-slide-to')) { $target.data('carousel').pause().to(slideIndex).cycle() } e.preventDefault() }) }(window.jQuery);/* ============================================================= * bootstrap-collapse.js v2.3.2 * http://getbootstrap.com/2.3.2/javascript.html#collapse * ============================================================= * Copyright 2013 Twitter, Inc. * * 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. * ============================================================ */ !function ($) { "use strict"; // jshint ;_; /* COLLAPSE PUBLIC CLASS DEFINITION * ================================ */ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, $.fn.collapse.defaults, options) if (this.options.parent) { this.$parent = $(this.options.parent) } this.options.toggle && this.toggle() } Collapse.prototype = { constructor: Collapse , dimension: function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } , show: function () { var dimension , scroll , actives , hasData if (this.transitioning || this.$element.hasClass('in')) return dimension = this.dimension() scroll = $.camelCase(['scroll', dimension].join('-')) actives = this.$parent && this.$parent.find('> .accordion-group > .in') if (actives && actives.length) { hasData = actives.data('collapse') if (hasData && hasData.transitioning) return actives.collapse('hide') hasData || actives.data('collapse', null) } this.$element[dimension](0) this.transition('addClass', $.Event('show'), 'shown') $.support.transition && this.$element[dimension](this.$element[0][scroll]) } , hide: function () { var dimension if (this.transitioning || !this.$element.hasClass('in')) return dimension = this.dimension() this.reset(this.$element[dimension]()) this.transition('removeClass', $.Event('hide'), 'hidden') this.$element[dimension](0) } , reset: function (size) { var dimension = this.dimension() this.$element .removeClass('collapse') [dimension](size || 'auto') [0].offsetWidth this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') return this } , transition: function (method, startEvent, completeEvent) { var that = this , complete = function () { if (startEvent.type == 'show') that.reset() that.transitioning = 0 that.$element.trigger(completeEvent) } this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return this.transitioning = 1 this.$element[method]('in') $.support.transition && this.$element.hasClass('collapse') ? this.$element.one($.support.transition.end, complete) : complete() } , toggle: function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } } /* COLLAPSE PLUGIN DEFINITION * ========================== */ var old = $.fn.collapse $.fn.collapse = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('collapse') , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) if (!data) $this.data('collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.collapse.defaults = { toggle: true } $.fn.collapse.Constructor = Collapse /* COLLAPSE NO CONFLICT * ==================== */ $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } /* COLLAPSE DATA-API * ================= */ $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { var $this = $(this), href , target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 , option = $(target).data('collapse') ? 'toggle' : $this.data() $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') $(target).collapse(option) }) }(window.jQuery);/* ============================================================ * bootstrap-dropdown.js v2.3.2 * http://getbootstrap.com/2.3.2/javascript.html#dropdowns * ============================================================ * Copyright 2013 Twitter, Inc. * * 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. * ============================================================ */ !function ($) { "use strict"; // jshint ;_; /* DROPDOWN CLASS DEFINITION * ========================= */ var toggle = '[data-toggle=dropdown]' , Dropdown = function (element) { var $el = $(element).on('click.dropdown.data-api', this.toggle) $('html').on('click.dropdown.data-api', function () { $el.parent().removeClass('open') }) } Dropdown.prototype = { constructor: Dropdown , toggle: function (e) { var $this = $(this) , $parent , isActive if ($this.is('.disabled, :disabled')) return $parent = getParent($this) isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement) { // if mobile we we use a backdrop because click events don't delegate $('